/** @file
  Java class SpdProtocolDecls is GUI for create library definition elements of spd file.
 
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
package org.tianocore.frameworkwizard.packaging.ui;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import org.tianocore.PackageSurfaceAreaDocument;
import org.tianocore.frameworkwizard.common.Identifications.OpeningPackageType;
import org.tianocore.frameworkwizard.platform.ui.ListEditor;

/**
GUI for create library definition elements of spd file.
 
@since PackageEditor 1.0
**/
public class SpdPpiDecls extends SpdGuidDecls {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private SpdFileContents sfc = null;
    private OpeningPackageType docConsole = null;
//    private JFrame topFrame = null;
    
    public SpdPpiDecls(JFrame frame) {
        super(frame);
        // TODO Auto-generated constructor stub
    }

    public SpdPpiDecls(PackageSurfaceAreaDocument.PackageSurfaceArea inPsa, JFrame frame) {
        this(frame);
        sfc = new SpdFileContents(inPsa);
        init(sfc);
    }
    
    public SpdPpiDecls(OpeningPackageType opt, JFrame frame) {
        this(opt.getXmlSpd(), frame);
        docConsole = opt;
        if (sfc.getSpdPkgDefsRdOnly().equals("true")) {
            JOptionPane.showMessageDialog(this, "This is a read-only package. You will not be able to edit contents in table.");
        }
        initFrame();
    }
    
    protected void initFrame() {
        super.initFrame();
        this.setTitle("PPI Declarations");
        starLabel.setVisible(false);
        ((ListEditor)getJTable().getColumnModel().getColumn(6).getCellEditor()).setCanNotBeEmpty(false);
    }
    
    protected void init(SpdFileContents sfc){
        //
        // initialize table using SpdFileContents object
        //
        DefaultTableModel model = getModel();
        if (sfc.getSpdPpiDeclarationCount() == 0) {
            return ;
        }
        saa = new String[sfc.getSpdPpiDeclarationCount()][7];
        sfc.getSpdPpiDeclarations(saa);
        int i = 0;
        while (i < saa.length) {
            model.addRow(saa[i]);
            i++;
        }
        
    }
    
    protected void updateRow(int row, int column, TableModel m){
        String[] sa = new String[7];
        sfc.getSpdPpiDeclaration(sa, row);
        Object cellData = m.getValueAt(row, column);
        if (cellData == null) {
            cellData = "";
        }
        if (cellData.equals(sa[column])) {
            return;
        }
        if (cellData.toString().length() == 0 && sa[column] == null) {
            return;
        }
        
        String name = m.getValueAt(row, 0) + "";
        String cName = m.getValueAt(row, 1) + "";
        String guid = m.getValueAt(row, 2) + "";
        String help = m.getValueAt(row, 3) + "";
        String archList = null;
        if (m.getValueAt(row, 4) != null) {
            archList = m.getValueAt(row, 4).toString();
        }
        String modTypeList = null;
        if (m.getValueAt(row, 5) != null) {
            modTypeList = m.getValueAt(row, 5).toString();
        }
        String guidTypeList = null;
        if (m.getValueAt(row, 6) != null) {
            guidTypeList = m.getValueAt(row, 6).toString();
        }
        String[] rowData = {name, cName, guid, help};
        if (!dataValidation(rowData)){
            return;
        }
        docConsole.setSaved(false);
        sfc.updateSpdPpiDecl(row, name, cName, guid, help, archList, modTypeList, guidTypeList);
    }
    
    protected int addRow(String[] row) {
        
        if (!dataValidation(row)){
            return -1;
        }
        docConsole.setSaved(false);
        sfc.genSpdPpiDeclarations(row[0], row[1], row[2], row[3], stringToVector(row[4]), stringToVector(row[5]), stringToVector(row[6]));
        return 0;
    }
    
    protected void removeRow(int i){
        sfc.removeSpdPpiDeclaration(i);
        docConsole.setSaved(false);
    }
    
    protected void clearAllRow(){
        sfc.removeSpdPpiDeclaration();
        docConsole.setSaved(false);
    }
    
    /**
     * @return Returns the sfc.
     */
    protected SpdFileContents getSfc() {
        return sfc;
    }
}
