/** @file
 
 The file is used to let user choose to create module in an existing package
 or to create a new package first.
 
 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;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.Vector;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.tianocore.ModuleTypeDef;
import org.tianocore.MsaHeaderDocument;
import org.tianocore.SpdHeaderDocument;
import org.tianocore.ModuleSurfaceAreaDocument.ModuleSurfaceArea;
import org.tianocore.PackageSurfaceAreaDocument.PackageSurfaceArea;
import org.tianocore.PlatformHeaderDocument.PlatformHeader;
import org.tianocore.PlatformSurfaceAreaDocument.PlatformSurfaceArea;
import org.tianocore.frameworkwizard.common.DataType;
import org.tianocore.frameworkwizard.common.DataValidation;
import org.tianocore.frameworkwizard.common.GlobalData;
import org.tianocore.frameworkwizard.common.IFileFilter;
import org.tianocore.frameworkwizard.common.Log;
import org.tianocore.frameworkwizard.common.SaveFile;
import org.tianocore.frameworkwizard.common.Tools;
import org.tianocore.frameworkwizard.common.ui.IDialog;
import org.tianocore.frameworkwizard.common.ui.IFrame;
import org.tianocore.frameworkwizard.common.ui.StarLabel;
import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification;
import org.tianocore.frameworkwizard.packaging.PackageIdentification;
import org.tianocore.frameworkwizard.platform.PlatformIdentification;
import org.tianocore.frameworkwizard.workspace.Workspace;
import org.tianocore.frameworkwizard.workspace.WorkspaceTools;
import javax.swing.JRadioButton;

public class SelectModuleBelong extends IDialog {

    /**
     Define class members
     
     **/
    private static final long serialVersionUID = 4171355136991448972L;

    private JPanel jContentPane = null;

    private JComboBox jComboBoxExistingPackage = null;

    private JButton jButtonOk = null;

    private JButton jButtonCancel = null;

    private Vector<PackageIdentification> packages = null;

    private JLabel jLabelPackage = null;

    private JLabel jLabelFilePath = null;

    private JTextField jTextFieldFilePath = null;

    private JButton jButtonBrowse = null;

    private JLabel jLabelName = null;

    private JTextField jTextFieldName = null;

    private JLabel jLabelGuid = null;

    private JTextField jTextFieldGuid = null;

    private JButton jButtonGen = null;

    private JLabel jLabelVersion = null;

    private JTextField jTextFieldVersion = null;

    private StarLabel jStarLabel1 = null;

    private StarLabel jStarLabel2 = null;

    private StarLabel jStarLabel3 = null;

    private StarLabel jStarLabel4 = null;

    private StarLabel jStarLabel5 = null;

    private ButtonGroup bg = new ButtonGroup();

    private WorkspaceTools wt = new WorkspaceTools();

    private ModuleIdentification mid = null;

    private PackageIdentification pid = null;

    private PlatformIdentification fid = null;
    
    private ModuleSurfaceArea msa = null;
    
    private PackageSurfaceArea spd = null;
    
    private PlatformSurfaceArea fpd = null;

    private int mode = -1;

    private JLabel jLabelIsLibrary = null;

    private JRadioButton jRadioButtonYes = null;

    private JRadioButton jRadioButtonNo = null;

    /**
     * This method initializes jComboBoxExistingPackage	
     * 	
     * @return javax.swing.JComboBox	
     */
    private JComboBox getJComboBoxExistingPackage() {
        if (jComboBoxExistingPackage == null) {
            jComboBoxExistingPackage = new JComboBox();
            jComboBoxExistingPackage.setBounds(new java.awt.Rectangle(140, 10, 340, 20));
        }
        return jComboBoxExistingPackage;
    }

    /**
     * This method initializes jButtonNext	
     * 	
     * @return javax.swing.JButton	
     */
    private JButton getJButtonOk() {
        if (jButtonOk == null) {
            jButtonOk = new JButton();
            jButtonOk.setBounds(new java.awt.Rectangle(310, 165, 80, 20));
            jButtonOk.setText("Ok");
            jButtonOk.addActionListener(this);
        }
        return jButtonOk;
    }

    /**
     * This method initializes jButtonCancel	
     * 	
     * @return javax.swing.JButton	
     */
    private JButton getJButtonCancel() {
        if (jButtonCancel == null) {
            jButtonCancel = new JButton();
            jButtonCancel.setBounds(new java.awt.Rectangle(395, 165, 80, 20));
            jButtonCancel.setText("Cancel");
            jButtonCancel.addActionListener(this);
        }
        return jButtonCancel;
    }

    /**
     * This method initializes jTextFieldFilePath	
     * 	
     * @return javax.swing.JTextField	
     */
    private JTextField getJTextFieldFilePath() {
        if (jTextFieldFilePath == null) {
            jTextFieldFilePath = new JTextField();
            jTextFieldFilePath.setBounds(new java.awt.Rectangle(140, 60, 250, 20));
        }
        return jTextFieldFilePath;
    }

    /**
     * This method initializes jButtonBrowse	
     * 	
     * @return javax.swing.JButton	
     */
    private JButton getJButtonBrowse() {
        if (jButtonBrowse == null) {
            jButtonBrowse = new JButton();
            jButtonBrowse.setBounds(new java.awt.Rectangle(395, 60, 85, 20));
            jButtonBrowse.setText("Browse");
            jButtonBrowse.addActionListener(this);
        }
        return jButtonBrowse;
    }

    /**
     * This method initializes jTextFieldModuleName	
     * 	
     * @return javax.swing.JTextField	
     */
    private JTextField getJTextFieldName() {
        if (jTextFieldName == null) {
            jTextFieldName = new JTextField();
            jTextFieldName.setBounds(new java.awt.Rectangle(140, 85, 340, 20));
        }
        return jTextFieldName;
    }

    /**
     * This method initializes jTextFieldGuid	
     * 	
     * @return javax.swing.JTextField	
     */
    private JTextField getJTextFieldGuid() {
        if (jTextFieldGuid == null) {
            jTextFieldGuid = new JTextField();
            jTextFieldGuid.setBounds(new java.awt.Rectangle(140, 110, 250, 20));
        }
        return jTextFieldGuid;
    }

    /**
     * This method initializes jButtonGen	
     * 	
     * @return javax.swing.JButton	
     */
    private JButton getJButtonGen() {
        if (jButtonGen == null) {
            jButtonGen = new JButton();
            jButtonGen.setBounds(new java.awt.Rectangle(395, 110, 85, 20));
            jButtonGen.setText("GEN");
            jButtonGen.addActionListener(this);
        }
        return jButtonGen;
    }

    /**
     * This method initializes jTextFieldVersion	
     * 	
     * @return javax.swing.JTextField	
     */
    private JTextField getJTextFieldVersion() {
        if (jTextFieldVersion == null) {
            jTextFieldVersion = new JTextField();
            jTextFieldVersion.setBounds(new java.awt.Rectangle(140, 135, 340, 20));
        }
        return jTextFieldVersion;
    }

    /**
     * This method initializes jRadioButtonYes	
     * 	
     * @return javax.swing.JRadioButton	
     */
    private JRadioButton getJRadioButtonYes() {
        if (jRadioButtonYes == null) {
            jRadioButtonYes = new JRadioButton();
            jRadioButtonYes.setBounds(new java.awt.Rectangle(140, 35, 100, 20));
            jRadioButtonYes.setSelected(false);
            jRadioButtonYes.setText("Yes");
        }
        return jRadioButtonYes;
    }

    /**
     * This method initializes jRadioButtonNo	
     * 	
     * @return javax.swing.JRadioButton	
     */
    private JRadioButton getJRadioButtonNo() {
        if (jRadioButtonNo == null) {
            jRadioButtonNo = new JRadioButton();
            jRadioButtonNo.setBounds(new java.awt.Rectangle(300, 35, 110, 20));
            jRadioButtonNo.setSelected(true);
            jRadioButtonNo.setText("No");
        }
        return jRadioButtonNo;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SelectModuleBelong smb = new SelectModuleBelong();
        smb.setVisible(true);
    }

    /**
     * This is the default constructor
     */
    public SelectModuleBelong() {
        super();
        init();
    }

    /**
     * This is the default constructor
     */
    public SelectModuleBelong(IFrame parentFrame, boolean modal, int fileType) {
        super(parentFrame, modal);
        this.mode = fileType;
        init();
        initExistingPackage();
        if (mode != DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {
            this.jStarLabel1.setVisible(false);
            this.jLabelPackage.setVisible(false);
            this.jComboBoxExistingPackage.setVisible(false);
            this.jLabelIsLibrary.setVisible(false);
            this.jRadioButtonYes.setVisible(false);
            this.jRadioButtonNo.setVisible(false);
            upLocation(this.jStarLabel2, 50);
            upLocation(this.jStarLabel3, 50);
            upLocation(this.jStarLabel4, 50);
            upLocation(this.jStarLabel5, 50);
            upLocation(this.jLabelFilePath, 50);
            upLocation(this.jLabelName, 50);
            upLocation(this.jLabelGuid, 50);
            upLocation(this.jLabelVersion, 50);
            upLocation(this.jTextFieldFilePath, 50);
            upLocation(this.jTextFieldName, 50);
            upLocation(this.jTextFieldGuid, 50);
            upLocation(this.jTextFieldVersion, 50);
            upLocation(this.jButtonBrowse, 50);
            upLocation(this.jButtonGen, 50);
        }
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void init() {
        this.setSize(500, 230);
        this.setContentPane(getJContentPane());
        this.setTitle("New");
        this.centerWindow();
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jLabelIsLibrary = new JLabel();
            jLabelIsLibrary.setBounds(new java.awt.Rectangle(15, 35, 120, 20));
            jLabelIsLibrary.setText("Is this a Library");
            jLabelVersion = new JLabel();
            jLabelVersion.setBounds(new java.awt.Rectangle(15, 135, 120, 20));
            jLabelVersion.setText("Version");
            jLabelGuid = new JLabel();
            jLabelGuid.setBounds(new java.awt.Rectangle(15, 110, 120, 20));
            jLabelGuid.setText("Guid");
            jLabelName = new JLabel();
            jLabelName.setBounds(new java.awt.Rectangle(15, 85, 120, 20));
            jLabelName.setText("Module Name");
            jLabelFilePath = new JLabel();
            jLabelFilePath.setBounds(new java.awt.Rectangle(15, 60, 120, 20));
            jLabelFilePath.setText("File Path");
            jLabelPackage = new JLabel();
            jLabelPackage.setBounds(new java.awt.Rectangle(15, 10, 120, 20));
            jLabelPackage.setText("Choose a Package");
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.setSize(new java.awt.Dimension(490, 198));
            jContentPane.add(getJComboBoxExistingPackage(), null);
            jContentPane.add(getJButtonOk(), null);
            jContentPane.add(getJButtonCancel(), null);
            jContentPane.add(jLabelPackage, null);
            jContentPane.add(jLabelFilePath, null);
            jContentPane.add(getJTextFieldFilePath(), null);
            jContentPane.add(getJButtonBrowse(), null);
            jContentPane.add(jLabelName, null);
            jContentPane.add(getJTextFieldName(), null);
            jContentPane.add(jLabelGuid, null);
            jContentPane.add(getJTextFieldGuid(), null);
            jContentPane.add(getJButtonGen(), null);
            jContentPane.add(jLabelVersion, null);
            jContentPane.add(getJTextFieldVersion(), null);

            jStarLabel1 = new StarLabel();
            jStarLabel1.setLocation(new java.awt.Point(0, 10));
            jStarLabel2 = new StarLabel();
            jStarLabel2.setLocation(new java.awt.Point(0, 60));
            jStarLabel3 = new StarLabel();
            jStarLabel3.setLocation(new java.awt.Point(0, 85));
            jStarLabel4 = new StarLabel();
            jStarLabel4.setLocation(new java.awt.Point(0, 110));
            jStarLabel5 = new StarLabel();
            jStarLabel5.setLocation(new java.awt.Point(0, 135));
            jContentPane.add(jStarLabel1, null);
            jContentPane.add(jStarLabel2, null);
            jContentPane.add(jStarLabel3, null);
            jContentPane.add(jStarLabel4, null);
            jContentPane.add(jStarLabel5, null);
            jContentPane.add(jLabelIsLibrary, null);
            jContentPane.add(getJRadioButtonYes(), null);
            jContentPane.add(getJRadioButtonNo(), null);
            bg.add(getJRadioButtonNo());
            bg.add(getJRadioButtonYes());
        }
        return jContentPane;
    }

    /**
     Query all existing packages and fill them into combox
     
     **/
    private void initExistingPackage() {
        packages = wt.getAllPackages();
        for (int index = 0; index < packages.size(); index++) {
            this.jComboBoxExistingPackage.addItem(packages.elementAt(index).getName());
        }
    }

    /* (non-Javadoc)
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     * 
     * Override actionPerformed to listen all actions
     */
    public void actionPerformed(ActionEvent arg0) {
        if (arg0.getSource() == jButtonCancel) {
            this.setVisible(false);
            this.returnType = DataType.RETURN_TYPE_CANCEL;
        }

        if (arg0.getSource() == jButtonOk) {
            if (this.check()) {
                this.save();
            } else {
                return;
            }
            this.setVisible(false);
            this.returnType = DataType.RETURN_TYPE_OK;
        }

        if (arg0.getSource() == this.jButtonGen) {
            this.jTextFieldGuid.setText(Tools.generateUuidString());
        }

        if (arg0.getSource() == this.jButtonBrowse) {
            JFileChooser fc = new JFileChooser();
            fc.setAcceptAllFileFilterUsed(false);

            if (mode == DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {
                fc.setCurrentDirectory(new File(packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex())
                                                        .getPath()));
                fc.addChoosableFileFilter(new IFileFilter(DataType.MODULE_SURFACE_AREA_EXT));
            }
            if (mode == DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA) {
                fc.setCurrentDirectory(new File(Workspace.getCurrentWorkspace()));
                fc.addChoosableFileFilter(new IFileFilter(DataType.PACKAGE_SURFACE_AREA_EXT));
            }
            if (mode == DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA) {
                fc.setCurrentDirectory(new File(Workspace.getCurrentWorkspace()));
                fc.addChoosableFileFilter(new IFileFilter(DataType.PLATFORM_SURFACE_AREA_EXT));
            }
            int result = fc.showSaveDialog(new JPanel());
            if (result == JFileChooser.APPROVE_OPTION) {
                this.jTextFieldFilePath.setText(Tools.addPathExt(fc.getSelectedFile().getPath(), mode));
            }
        }
    }

    /**
     Data validation for all fields
     
     @retval true - All datas are valid
     @retval false - At least one data is invalid
     
     **/
    public boolean check() {
        String path = this.jTextFieldFilePath.getText();
        path = Tools.addPathExt(path, mode);
        String guid = this.jTextFieldGuid.getText();
        String version = this.jTextFieldVersion.getText();
        
        //
        // Check if all required fields are not empty
        //
        if (isEmpty(path)) {
            Log.wrn("New File", "A File Path must be entered!");
            return false;
        }
        if (isEmpty(this.jTextFieldName.getText())) {
            Log.wrn("New File", "A Name must be entered");
            return false;
        }
        if (isEmpty(guid)) {
            Log.wrn("New File", "The Guid must be entered!");
            return false;
        }
        if (isEmpty(version)) {
            Log.wrn("New File", "A Version number must be entered!");
            return false;
        }

        //
        // Check if all fields have correct data types 
        //
        if (!DataValidation.isBaseName(this.jTextFieldName.getText())) {
            Log.wrn("New File", "Incorrect data type for the Name!");
            return false;
        }
        if (!DataValidation.isGuid((guid))) {
            Log.wrn("New File", "Incorrect data type for Guid, which must be in registry format! (8-4-4-4-12)");
            return false;
        }
        
        //
        // Check if path is valid
        //
        File f = new File(path);
        if (!f.isAbsolute()) {
            Log.wrn("New File", "Please type a complete file path!");
            return false;
        }
        f = null;

        if (mode == DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {
            //
            // Check if the module is already existed in current package
            //
            String packagePath = packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex()).getPath();
            String modulePath = Tools.convertPathToCurrentOsType(path);
            Vector<String> msaFile = wt.getAllModulesOfPackage(packagePath);

            for (int index = 0; index < msaFile.size(); index++) {
                if (msaFile.elementAt(index).equals(modulePath)) {
                    Log.wrn("New File", "This module is already exists in the selected package!");
                    return false;
                }
            }
            
            //
            // Check if the module is in selected package
            //
            if (Tools.getFilePathOnly(modulePath).indexOf(Tools.getFilePathOnly(packagePath)) < 0) {
                Log.wrn("New File", "This module should be in the directory of selected package!");
                return false;
            }
                      
            //
            // Check if Guid+Version is unique
            //
            String packageGuid = packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex()).getGuid();
            String packageVersion = packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex()).getVersion();
            if (GlobalData.findModuleId(guid, version, packageGuid, packageVersion) != null) {
                Log.wrn("New File", "A module with same Guid and same Version already exists, please selece a new Guid or Version!");
                return false;
            }
        }

        if (mode == DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA) {
            //
            // Check if the package is already existed in database
            //
            path = Tools.convertPathToCurrentOsType(path);
            Vector<PackageIdentification> vPackageList = wt.getAllPackages();
            if (vPackageList != null && vPackageList.size() > 0) {
                for (int index = 0; index < vPackageList.size(); index++) {
                    if (vPackageList.get(index).getPath().equals(path)) {
                        Log.wrn("New File", "This package is already exists in this workspace!");
                        return false;
                    }
                }
            }
            
            //
            // Check if path already exists
            //
            if (GlobalData.isDuplicateRelativePath(Tools.getFilePathOnly(path), mode)) {
                Log.wrn("New File", "There already exists a same directory with a package");
                return false;
            }
            
            //
            // Check if Guid+Version is unique
            //
            if (GlobalData.findPackageId(guid, version) != null) {
                Log.wrn("New File", "A package with same Guid and same Version already exists, please selece a new Guid or Version!");
                return false;
            }
        }

        if (mode == DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA) {
            //
            // Check if the platform is already existed in database
            //
            path = Tools.convertPathToCurrentOsType(path);
            Vector<PlatformIdentification> vPlatfromList = wt.getAllPlatforms();
            if (vPlatfromList != null && vPlatfromList.size() > 0) {
                for (int index = 0; index < vPlatfromList.size(); index++) {
                    if (vPlatfromList.get(index).getPath().equals(path)) {
                        Log.wrn("New File", "This platform is already exists in this workspace!");
                        return false;
                    }
                }
            }
            
            //
            // Check if path already exists
            //
            if (GlobalData.isDuplicateRelativePath(Tools.getFilePathOnly(path), mode)) {
                Log.wrn("New File", "There already exists a same directory with a platform");
                return false;
            }
            
            //
            // Check if Guid+Version is unique
            //
            if (GlobalData.findPlatformId(guid, version) != null) {
                Log.wrn("New File", "A platform with same Guid and same Version already exists, please selece a new Guid or Version!");
                return false;
            }
        }

        return true;
    }

    /**
     Save file
     
     **/
    public void save() {
        if (mode == DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {
            this.saveModule();
        }
        if (mode == DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA) {
            this.savePackage();
        }
        if (mode == DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA) {
            this.savePlatform();
        }
    }

    /**
     Save all components of Msa Header
     
     **/
    private void saveModule() {
        msa = null;
        String path = Tools.convertPathToCurrentOsType(this.jTextFieldFilePath.getText());

        //
        // Save to memory
        //
        try {
            MsaHeaderDocument.MsaHeader msaHeader = null;

            msa = ModuleSurfaceArea.Factory.newInstance();
            msaHeader = MsaHeaderDocument.MsaHeader.Factory.newInstance();

            msaHeader.setModuleName(this.jTextFieldName.getText());
            msaHeader.setGuidValue(this.jTextFieldGuid.getText());
            msaHeader.setVersion(this.jTextFieldVersion.getText());
            msaHeader.setModuleType(ModuleTypeDef.BASE);

            msa.setMsaHeader(msaHeader);
        } catch (Exception e) {
            Log.err("Save ModuleSurfaceArea Document", e.getMessage());
            return;
        }

        //
        // Save to real file
        //
        try {
            SaveFile.saveMsaFile(path, msa);
        } catch (Exception e) {
            Log.wrn("Save Module to file system", e.getMessage());
            Log.err("Save Module to file system", e.getMessage());
            return;
        }

        //
        // Save to identification
        //
        mid = new ModuleIdentification(this.jTextFieldName.getText(), this.jTextFieldGuid.getText(),
                                       this.jTextFieldVersion.getText(), path, jRadioButtonYes.isSelected());
        mid.setPackageId(packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex()));
    }

    /**
     Save all components of Spd Header
     
     **/
    private void savePackage() {
        spd = null;
        String path = Tools.convertPathToCurrentOsType(this.jTextFieldFilePath.getText());

        //
        // Save to memory
        //
        try {
            SpdHeaderDocument.SpdHeader spdHeader = null;

            spd = PackageSurfaceArea.Factory.newInstance();
            spdHeader = SpdHeaderDocument.SpdHeader.Factory.newInstance();

            spdHeader.setPackageName(this.jTextFieldName.getText());
            spdHeader.setGuidValue(this.jTextFieldGuid.getText());
            spdHeader.setVersion(this.jTextFieldVersion.getText());

            spd.setSpdHeader(spdHeader);
        } catch (Exception e) {
            Log.wrn("Save Package Surface Area Description Document", e.getMessage());
            return;
        }

        //
        // Save to real file
        //
        try {
            SaveFile.saveSpdFile(path, spd);

        } catch (Exception e) {
            Log.wrn("Save Package to file system", e.getMessage());
            Log.err("Save Package to file system", e.getMessage());
            return;
        }

        //
        // Save to identification
        //
        pid = new PackageIdentification(this.jTextFieldName.getText(), this.jTextFieldGuid.getText(),
                                        this.jTextFieldVersion.getText(), path);
    }

    /**
     Save all components of Fpd Header
     
     **/
    private void savePlatform() {
        fpd = null;
        String path = Tools.convertPathToCurrentOsType(this.jTextFieldFilePath.getText());

        //
        // Save to memory
        //
        try {
            PlatformHeader fpdHeader = null;

            fpd = PlatformSurfaceArea.Factory.newInstance();
            fpdHeader = PlatformHeader.Factory.newInstance();

            fpdHeader.setPlatformName(this.jTextFieldName.getText());
            fpdHeader.setGuidValue(this.jTextFieldGuid.getText());
            fpdHeader.setVersion(this.jTextFieldVersion.getText());

            fpd.setPlatformHeader(fpdHeader);
        } catch (Exception e) {
            Log.wrn("Save Framework Platform Description Document", e.getMessage());
            return;
        }

        //
        // Save to real file
        //
        try {
            SaveFile.saveFpdFile(path, fpd);

        } catch (Exception e) {
            Log.wrn("Save Platform to file system", e.getMessage());
            Log.err("Save Platform to file system", e.getMessage());
            return;
        }

        //
        // Save to identification
        //
        fid = new PlatformIdentification(this.jTextFieldName.getText(), this.jTextFieldGuid.getText(),
                                         this.jTextFieldVersion.getText(), path);
    }

    public ModuleIdentification getMid() {
        return mid;
    }

    public PlatformIdentification getFid() {
        return fid;
    }

    public PackageIdentification getPid() {
        return pid;
    }

    private void upLocation(Component c, int size) {
        c.setLocation(c.getLocation().x, c.getLocation().y - size);
    }

    public PlatformSurfaceArea getFpd() {
        return fpd;
    }

    public ModuleSurfaceArea getMsa() {
        return msa;
    }

    public PackageSurfaceArea getSpd() {
        return spd;
    }
}
