]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdFlash.java
Fix row out of order problem for Module order In FV editor.
[mirror_edk2.git] / Tools / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / platform / ui / FpdFlash.java
index a326f5e2caf62b959c4fad211a61c2c7ac445f58..869b3b608531dfbd73d5cbd224b34d817fc78db9 100644 (file)
@@ -16,8 +16,6 @@ import java.awt.BorderLayout;
 import javax.swing.JPanel;\r
 \r
 import javax.swing.AbstractAction;\r
-import javax.swing.DefaultCellEditor;\r
-import javax.swing.JComponent;\r
 import javax.swing.JFileChooser;\r
 import javax.swing.JFrame;\r
 import javax.swing.JOptionPane;\r
@@ -26,10 +24,13 @@ import javax.swing.JButton;
 import javax.swing.ListSelectionModel;\r
 \r
 import org.tianocore.PlatformSurfaceAreaDocument;\r
+import org.tianocore.frameworkwizard.common.DataValidation;\r
+import org.tianocore.frameworkwizard.common.IDefaultTableModel;\r
 import org.tianocore.frameworkwizard.common.Identifications.OpeningPlatformType;\r
 import org.tianocore.frameworkwizard.common.ui.IInternalFrame;\r
 import org.tianocore.frameworkwizard.common.ui.StarLabel;\r
-\r
+import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification;\r
+import org.tianocore.frameworkwizard.platform.ui.global.WorkspaceProfile;\r
 \r
 import java.awt.FlowLayout;\r
 import java.awt.event.ActionEvent;\r
@@ -37,9 +38,12 @@ import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;\r
 import java.awt.event.ItemEvent;\r
 import java.awt.event.ItemListener;\r
+import java.awt.event.MouseAdapter;\r
+import java.awt.event.MouseEvent;\r
 import java.io.BufferedReader;\r
 import java.io.File;\r
 import java.io.FileReader;\r
+import java.util.HashMap;\r
 import java.util.Iterator;\r
 import java.util.LinkedHashMap;\r
 import java.util.Map;\r
@@ -59,7 +63,6 @@ import javax.swing.event.ListSelectionListener;
 import javax.swing.event.TableModelEvent;\r
 import javax.swing.event.TableModelListener;\r
 import javax.swing.table.DefaultTableModel;\r
-import javax.swing.table.TableColumn;\r
 import javax.swing.table.TableModel;\r
 import javax.swing.JComboBox;\r
 import java.awt.Dimension;\r
@@ -71,6 +74,7 @@ public class FpdFlash extends IInternalFrame {
      * \r
      */\r
     private static final long serialVersionUID = 1L;\r
+    private final int startIndexOfDynamicTab = 2;\r
     static JFrame frame;\r
     private JPanel jContentPane = null;\r
     private JPanel jPanelContentEast = null;\r
@@ -96,22 +100,20 @@ public class FpdFlash extends IInternalFrame {
     private ImageParaTableModel fvImageParaTableModel = null;\r
     private DefaultTableModel fvOptionTableModel = null;\r
     private JPanel jPanelFvImageC = null;\r
-    private JCheckBox jCheckBoxFvImagePara = null;\r
     private JLabel jLabelFvParaType = null;\r
     private JComboBox jComboBoxFvParaType = null;\r
     private JLabel jLabelFvImageNames = null;\r
     private JLabel jLabelFvParaName = null;\r
     private JTextField jTextFieldFvParaName = null;\r
-    private JButton jButtonFvParaAdd = null;\r
+    private JButton jButtonFvNameAdd = null;\r
     private JScrollPane jScrollPaneFvImageNames = null;\r
     private JTable jTableFvImageNames = null;\r
-    private JButton jButtonFvParaDel = null;\r
+    private JButton jButtonFvNameDel = null;\r
     private JPanel jPanelFvImageOpts = null;\r
     private JButton jButtonAddFvImage = null;\r
     private JScrollPane jScrollPaneFvInfo = null;\r
     private JTable jTableFvInfo = null;\r
     private JButton jButtonDelFvImage = null;\r
-    private JCheckBox jCheckBoxFvImageOpts = null;\r
     private JPanel jPanelFvImagePara = null;\r
     private OpeningPlatformType docConsole = null;\r
     private FpdFileContents ffc = null;\r
@@ -129,7 +131,6 @@ public class FpdFlash extends IInternalFrame {
     private JScrollPane jScrollPane = null;\r
     private JTable jTableFvImageOpts = null;\r
     private JButton jButtonUpdateFvImage = null;\r
-    private JButton jButtonTest = null;\r
     private JPanel jPanelFdfN = null;\r
     private JPanel jPanelFdfS = null;\r
     private JSplitPane jSplitPaneFdfC = null;\r
@@ -144,268 +145,30 @@ public class FpdFlash extends IInternalFrame {
     private JLabel jLabelFvAdditional = null;\r
     private JScrollPane jScrollPaneFvInFdf = null;\r
     private JTable jTableFvInFdf = null;\r
-    private NonEditableTableModel fvInFdfTableModel = null;  //  @jve:decl-index=0:visual-constraint=""\r
+    private IDefaultTableModel fvInFdfTableModel = null;  //  @jve:decl-index=0:visual-constraint=""\r
     private JButton jButtonFvInFdfOptions = null;\r
     private JScrollPane jScrollPaneFvAdditional = null;\r
     private JTable jTableFvAdditional = null;\r
-    private DefaultTableModel fvAddtionalTableModel = null;  //  @jve:decl-index=0:visual-constraint=""\r
+    private DefaultTableModel fvAdditionalTableModel = null;  //  @jve:decl-index=0:visual-constraint=""\r
     private JButton jButtonAddFv = null;\r
     private JButton jButtonDelFv = null;\r
     private JButton jButtonAddFvOptions = null;\r
-    \r
-    private NonEditableTableModel nonEditableTableModel = null;  //  @jve:decl-index=0:visual-constraint=""\r
-    \r
-    private JPanel jPanelModOrder = null;\r
-    private JPanel jPanelModOrderN = null;\r
-    private JPanel jPanelModOrderS = null;\r
-    private JPanel jPanelModOrderC = null;\r
-    private JScrollPane jScrollPaneModInFv = null;\r
-    private JTable jTableModInFv = null;\r
-    private JPanel jPanelController = null;\r
-    private JScrollPane jScrollPaneFpdModules = null;\r
-    private JTable jTableFpdModules = null;\r
-    private JButton jButtonUp = null;\r
-    private JButton jButtonInsert = null;\r
-    private JButton jButtonRemove = null;\r
-    private JButton jButtonDown = null;\r
-    private JButton jButtonOk = null;\r
-    private JButton jButtonCancel = null;\r
-    \r
-    /**\r
-     * This method initializes jPanelModOrder   \r
-     *  \r
-     * @return javax.swing.JPanel   \r
-     */\r
-    private JPanel getJPanelModOrder() {\r
-//        if (jPanelModOrder == null) {\r
-            jPanelModOrder = new JPanel();\r
-            jPanelModOrder.setLayout(new BorderLayout());\r
-            jPanelModOrder.add(getJPanelModOrderN(), java.awt.BorderLayout.NORTH);\r
-            jPanelModOrder.add(getJPanelModOrderS(), java.awt.BorderLayout.SOUTH);\r
-            jPanelModOrder.add(getJPanelModOrderC(), java.awt.BorderLayout.CENTER);\r
-            jPanelModOrder.addComponentListener(new java.awt.event.ComponentAdapter() {\r
-                public void componentShown(java.awt.event.ComponentEvent e) {\r
-                    System.out.println("componentShown()" + jTabbedPane.getTitleAt(jTabbedPane.getSelectedIndex())); // TODO Auto-generated Event stub componentShown()\r
-                }\r
-            });\r
-//        }\r
-        return jPanelModOrder;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jPanelModOrderN  \r
-     *  \r
-     * @return javax.swing.JPanel   \r
-     */\r
-    private JPanel getJPanelModOrderN() {\r
-//        if (jPanelModOrderN == null) {\r
-            jPanelModOrderN = new JPanel();\r
-//        }\r
-        return jPanelModOrderN;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jPanelModOrderS  \r
-     *  \r
-     * @return javax.swing.JPanel   \r
-     */\r
-    private JPanel getJPanelModOrderS() {\r
-//        if (jPanelModOrderS == null) {\r
-            FlowLayout flowLayout6 = new FlowLayout();\r
-            flowLayout6.setAlignment(java.awt.FlowLayout.RIGHT);\r
-            jPanelModOrderS = new JPanel();\r
-            jPanelModOrderS.setLayout(flowLayout6);\r
-            jPanelModOrderS.add(getJButtonOk(), null);\r
-            jPanelModOrderS.add(getJButtonCancel(), null);\r
-//        }\r
-        return jPanelModOrderS;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jPanelModOrderC  \r
-     *  \r
-     * @return javax.swing.JPanel   \r
-     */\r
-    private JPanel getJPanelModOrderC() {\r
-//        if (jPanelModOrderC == null) {\r
-            jPanelModOrderC = new JPanel();\r
-            jPanelModOrderC.add(getJScrollPaneModInFv(), null);\r
-            jPanelModOrderC.add(getJPanelController(), null);\r
-            jPanelModOrderC.add(getJScrollPaneFpdModules(), null);\r
-//        }\r
-        return jPanelModOrderC;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jScrollPaneModInFv   \r
-     *  \r
-     * @return javax.swing.JScrollPane  \r
-     */\r
-    private JScrollPane getJScrollPaneModInFv() {\r
-//        if (jScrollPaneModInFv == null) {\r
-            jScrollPaneModInFv = new JScrollPane();\r
-            jScrollPaneModInFv.setPreferredSize(new java.awt.Dimension(150,500));\r
-            jScrollPaneModInFv.setViewportView(getJTableModInFv());\r
-//        }\r
-        return jScrollPaneModInFv;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jTableModInFv    \r
-     *  \r
-     * @return javax.swing.JTable   \r
-     */\r
-    private JTable getJTableModInFv() {\r
-//        if (jTableModInFv == null) {\r
-            NonEditableTableModel modInFvTableModel = new NonEditableTableModel();\r
-            modInFvTableModel.addColumn("Module Orders in FV");\r
-            jTableModInFv = new JTable(modInFvTableModel);\r
-            jTableModInFv.setRowHeight(20);\r
-//        }\r
-        return jTableModInFv;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jPanelController \r
-     *  \r
-     * @return javax.swing.JPanel   \r
-     */\r
-    private JPanel getJPanelController() {\r
-//        if (jPanelController == null) {\r
-            FlowLayout flowLayout5 = new FlowLayout();\r
-            flowLayout5.setVgap(50);\r
-            flowLayout5.setHgap(50);\r
-            jPanelController = new JPanel();\r
-            jPanelController.setLayout(flowLayout5);\r
-            jPanelController.setPreferredSize(new java.awt.Dimension(150,500));\r
-            jPanelController.add(getJButtonUp(), null);\r
-            jPanelController.add(getJButtonInsert(), null);\r
-            jPanelController.add(getJButtonRemove(), null);\r
-            jPanelController.add(getJButtonDown(), null);\r
-//        }\r
-        return jPanelController;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jScrollPaneFpdModules    \r
-     *  \r
-     * @return javax.swing.JScrollPane  \r
-     */\r
-    private JScrollPane getJScrollPaneFpdModules() {\r
-//        if (jScrollPaneFpdModules == null) {\r
-            jScrollPaneFpdModules = new JScrollPane();\r
-            jScrollPaneFpdModules.setPreferredSize(new java.awt.Dimension(150,500));\r
-            jScrollPaneFpdModules.setViewportView(getJTableFpdModules());\r
-//        }\r
-        return jScrollPaneFpdModules;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jTableFpdModules \r
-     *  \r
-     * @return javax.swing.JTable   \r
-     */\r
-    private JTable getJTableFpdModules() {\r
-//        if (jTableFpdModules == null) {\r
-            NonEditableTableModel fpdModTableModel = new NonEditableTableModel();\r
-            fpdModTableModel.addColumn("Modules in Platform");\r
-            jTableFpdModules = new JTable(fpdModTableModel);\r
-            jTableFpdModules.setRowHeight(20);\r
-//        }\r
-        return jTableFpdModules;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jButtonUp    \r
-     *  \r
-     * @return javax.swing.JButton  \r
-     */\r
-    private JButton getJButtonUp() {\r
-//        if (jButtonUp == null) {\r
-            jButtonUp = new JButton();\r
-            jButtonUp.setPreferredSize(new java.awt.Dimension(60,20));\r
-            jButtonUp.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 14));\r
-            jButtonUp.setText("^");\r
-//        }\r
-        return jButtonUp;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jButtonInsert    \r
-     *  \r
-     * @return javax.swing.JButton  \r
-     */\r
-    private JButton getJButtonInsert() {\r
-//        if (jButtonInsert == null) {\r
-            jButtonInsert = new JButton();\r
-            jButtonInsert.setText("<<");\r
-            jButtonInsert.setPreferredSize(new java.awt.Dimension(60,20));\r
-//        }\r
-        return jButtonInsert;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jButtonRemove    \r
-     *  \r
-     * @return javax.swing.JButton  \r
-     */\r
-    private JButton getJButtonRemove() {\r
-//        if (jButtonRemove == null) {\r
-            jButtonRemove = new JButton();\r
-            jButtonRemove.setPreferredSize(new java.awt.Dimension(60,20));\r
-            jButtonRemove.setText(">>");\r
-//        }\r
-        return jButtonRemove;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jButtonDown  \r
-     *  \r
-     * @return javax.swing.JButton  \r
-     */\r
-    private JButton getJButtonDown() {\r
-//        if (jButtonDown == null) {\r
-            jButtonDown = new JButton();\r
-            jButtonDown.setPreferredSize(new java.awt.Dimension(60,20));\r
-            jButtonDown.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));\r
-            jButtonDown.setText("v");\r
-//        }\r
-        return jButtonDown;\r
-    }\r
-    \r
-    /**\r
-     * This method initializes jButtonOk    \r
-     *  \r
-     * @return javax.swing.JButton  \r
-     */\r
-    private JButton getJButtonOk() {\r
-//        if (jButtonOk == null) {\r
-            jButtonOk = new JButton();\r
-            jButtonOk.setPreferredSize(new java.awt.Dimension(80,20));\r
-            jButtonOk.setText("Ok");\r
-//        }\r
-        return jButtonOk;\r
-    }\r
-\r
-    /**\r
-     * This method initializes jButtonCancel    \r
-     *  \r
-     * @return javax.swing.JButton  \r
-     */\r
-    private JButton getJButtonCancel() {\r
-//        if (jButtonCancel == null) {\r
-            jButtonCancel = new JButton();\r
-            jButtonCancel.setPreferredSize(new java.awt.Dimension(80,20));\r
-            jButtonCancel.setText("Cancel");\r
-            jButtonCancel.addActionListener(new java.awt.event.ActionListener() {\r
-                public void actionPerformed(java.awt.event.ActionEvent e) {\r
-                    getJTabbedPane().setSelectedIndex(0);\r
-                }\r
-            });\r
-//        }\r
-        return jButtonCancel;\r
-    }\r
-\r
+    private int tabIndexForFv = -1;\r
+    private int selectedRowInFvAdditionalTable = -1;\r
+    private String oldFvName = null;\r
+    private Vector<String> vBlockSize = new Vector<String>();\r
+    private String determinedFvBlockSize = null;\r
+    private final String defaultBlkSize = "0x10000";\r
+    private String erasePolarity = "";\r
+    boolean memModified = false;\r
+    private FvOptsTableModel fvInFdfOptTableModel = null;\r
+    private FvOptsTableModel fvAdditionalOptTableModel = null;\r
+    private boolean sizeFromOptionDlg = false;\r
+    private boolean fileFromOptionDlg = false;\r
+    private JLabel jLabelOptions = null;\r
+    private JPanel jPanelBgFvName = null;\r
+    private JPanel jPanelBgFvImage = null;\r
+    private JPanel jPanelW = null;\r
     \r
     public FpdFlash() {\r
         super();\r
@@ -425,6 +188,11 @@ public class FpdFlash extends IInternalFrame {
     public FpdFlash(OpeningPlatformType opt) {\r
         this(opt.getXmlFpd());\r
         docConsole = opt;\r
+        if (memModified) {\r
+            docConsole.setSaved(false);\r
+            JOptionPane.showMessageDialog(frame, "Platform Synced with FDF file.");\r
+            memModified = false;\r
+        }\r
     }\r
     \r
     /**\r
@@ -434,7 +202,10 @@ public class FpdFlash extends IInternalFrame {
      */\r
     private JPanel getJPanelContentEast() {\r
         if (jPanelContentEast == null) {\r
+            FlowLayout flowLayout7 = new FlowLayout();\r
+            flowLayout7.setVgap(50);\r
             jPanelContentEast = new JPanel();\r
+            jPanelContentEast.setLayout(flowLayout7);\r
         }\r
         return jPanelContentEast;\r
     }\r
@@ -489,7 +260,7 @@ public class FpdFlash extends IInternalFrame {
         if (jTabbedPane == null) {\r
             jTabbedPane = new JTabbedPane();\r
             jTabbedPane.addTab("General", null, getJPanelFdf(), null);\r
-            jTabbedPane.addTab("FV Parameters", null, getJPanelFvImages(), null);\r
+            jTabbedPane.addTab("Advanced", null, getJPanelFvImages(), null);\r
             \r
         }\r
         return jTabbedPane;\r
@@ -504,10 +275,18 @@ public class FpdFlash extends IInternalFrame {
         if (jPanelFvImages == null) {\r
             jPanelFvImages = new JPanel();\r
             jPanelFvImages.setLayout(new BorderLayout());\r
-            jPanelFvImages.add(getJPanelFvImageN(), java.awt.BorderLayout.NORTH);\r
-//            jPanelFvImages.add(getJPanelFvImageW(), java.awt.BorderLayout.WEST);\r
-            jPanelFvImages.add(getJPanelFvImageS(), java.awt.BorderLayout.SOUTH);\r
+            jPanelFvImages.add(getJPanelFvImageS(), java.awt.BorderLayout.NORTH);\r
+            jPanelFvImages.add(getJPanelFvImageN(), java.awt.BorderLayout.SOUTH);\r
             jPanelFvImages.add(getJPanelFvImageC(), java.awt.BorderLayout.CENTER);\r
+            jPanelFvImages.add(getJPanelW(), java.awt.BorderLayout.EAST);\r
+            jPanelFvImages.addComponentListener(new java.awt.event.ComponentAdapter() {\r
+                public void componentShown(java.awt.event.ComponentEvent e) {\r
+//                    fvImageParaTableModel.setRowCount(0);\r
+//                    fvPropertyTableModel.setRowCount(0);\r
+                    \r
+                    \r
+                }\r
+            });\r
             \r
         }\r
         return jPanelFvImages;\r
@@ -530,9 +309,9 @@ public class FpdFlash extends IInternalFrame {
             jLabelFvPropName.setPreferredSize(new java.awt.Dimension(38,20));\r
             FlowLayout flowLayout2 = new FlowLayout();\r
             flowLayout2.setAlignment(java.awt.FlowLayout.LEFT);\r
-            flowLayout2.setHgap(15);\r
+            flowLayout2.setHgap(5);\r
             jPanelFvImageN = new JPanel();\r
-            jPanelFvImageN.setPreferredSize(new java.awt.Dimension(576,100));\r
+            jPanelFvImageN.setPreferredSize(new java.awt.Dimension(576,130));\r
             jPanelFvImageN.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));\r
             jPanelFvImageN.setLayout(flowLayout2);\r
             jPanelFvImageN.add(getJCheckBoxFvProperty(), null);\r
@@ -556,7 +335,7 @@ public class FpdFlash extends IInternalFrame {
             GridLayout gridLayout2 = new GridLayout();\r
             gridLayout2.setRows(1);\r
             jPanelFvImageS = new JPanel();\r
-            jPanelFvImageS.setPreferredSize(new java.awt.Dimension(480,190));\r
+            jPanelFvImageS.setPreferredSize(new java.awt.Dimension(480,150));\r
             jPanelFvImageS.setLayout(gridLayout2);\r
             jPanelFvImageS.add(getJScrollPaneFvInfo(), null);\r
         }\r
@@ -665,7 +444,7 @@ public class FpdFlash extends IInternalFrame {
     private JScrollPane getJScrollPaneFvProp() {\r
         if (jScrollPaneFvProp == null) {\r
             jScrollPaneFvProp = new JScrollPane();\r
-            jScrollPaneFvProp.setPreferredSize(new java.awt.Dimension(350,55));\r
+            jScrollPaneFvProp.setPreferredSize(new java.awt.Dimension(350,100));\r
             jScrollPaneFvProp.setViewportView(getJTableFvProp());\r
         }\r
         return jScrollPaneFvProp;\r
@@ -777,15 +556,12 @@ public class FpdFlash extends IInternalFrame {
         if (jPanelFvImageC == null) {\r
             jLabelFvParaName = new JLabel();\r
             jLabelFvParaName.setPreferredSize(new Dimension(38, 20));\r
-            jLabelFvParaName.setEnabled(false);\r
             jLabelFvParaName.setText("Name");\r
             jLabelFvImageNames = new JLabel();\r
             jLabelFvImageNames.setText("FV Image Names");\r
-            jLabelFvImageNames.setEnabled(false);\r
             jLabelFvImageNames.setPreferredSize(new java.awt.Dimension(150,20));\r
             jLabelFvParaType = new JLabel();\r
             jLabelFvParaType.setText("Type");\r
-            jLabelFvParaType.setEnabled(false);\r
             jLabelFvParaType.setPreferredSize(new java.awt.Dimension(70,20));\r
             FlowLayout flowLayout3 = new FlowLayout();\r
             flowLayout3.setAlignment(java.awt.FlowLayout.LEFT);\r
@@ -801,41 +577,6 @@ public class FpdFlash extends IInternalFrame {
     }\r
 \r
 \r
-    /**\r
-     * This method initializes jCheckBox2      \r
-     *         \r
-     * @return javax.swing.JCheckBox   \r
-     */\r
-    private JCheckBox getJCheckBoxFvImagePara() {\r
-        if (jCheckBoxFvImagePara == null) {\r
-            jCheckBoxFvImagePara = new JCheckBox();\r
-            jCheckBoxFvImagePara.setText("FV Image Parameters");\r
-            jCheckBoxFvImagePara.setPreferredSize(new java.awt.Dimension(200,20));\r
-            jCheckBoxFvImagePara.addItemListener(new ItemListener(){\r
-\r
-                public void itemStateChanged(ItemEvent arg0) {\r
-                    // TODO Auto-generated method stub\r
-                    boolean seleted = jCheckBoxFvImagePara.isSelected();\r
-                    \r
-                        jLabelFvParaType.setEnabled(seleted);\r
-                        jLabelFvImageNames.setEnabled(seleted);\r
-                        jLabelFvParaName.setEnabled(seleted);\r
-                        jComboBoxFvParaType.setEnabled(seleted);\r
-                        jTextFieldFvParaName.setEnabled(seleted);\r
-                        \r
-                        jTableFvImageNames.setEnabled(seleted);\r
-                        jButtonFvParaAdd.setEnabled(seleted);\r
-                        jButtonFvParaDel.setEnabled(seleted);\r
-                    \r
-                   \r
-                }\r
-                \r
-            });\r
-        }\r
-        return jCheckBoxFvImagePara;\r
-    }\r
-\r
-\r
     /**\r
      * This method initializes jComboBox       \r
      *         \r
@@ -844,17 +585,29 @@ public class FpdFlash extends IInternalFrame {
     private JComboBox getJComboBoxFvParaType() {\r
         if (jComboBoxFvParaType == null) {\r
             jComboBoxFvParaType = new JComboBox();\r
-            jComboBoxFvParaType.addItem("ImageName");\r
             jComboBoxFvParaType.addItem("Attributes");\r
-            jComboBoxFvParaType.addItem("Options");\r
             jComboBoxFvParaType.addItem("Components");\r
+            jComboBoxFvParaType.setSelectedIndex(0);\r
             jComboBoxFvParaType.setPreferredSize(new java.awt.Dimension(180,20));\r
-            jComboBoxFvParaType.setEnabled(false);\r
             jComboBoxFvParaType.addItemListener(new ItemListener() {\r
 \r
                 public void itemStateChanged(ItemEvent arg0) {\r
                     // TODO disable attribute settings when ValidImageNames selected.\r
+                    int selectedRow = jTableFvInfo.getSelectedRow();\r
+                    if (selectedRow < 0) {\r
+                        return;\r
+                    }\r
+                    String fvNameList = jTableFvInfo.getValueAt(selectedRow, 0)+"";\r
+                    String oldType = jTableFvInfo.getValueAt(selectedRow, 1)+"";\r
+                    int fvImagePos = ffc.getFvImagePosInFvImages(fvNameList, oldType);\r
+                    if (fvImagePos < 0) {\r
+                        return;\r
+                    }\r
                     \r
+                    String type = jComboBoxFvParaType.getSelectedItem()+"";\r
+                    ffc.updateFvImagesFvImageType(fvImagePos, type);\r
+                    jTableFvInfo.setValueAt(type, selectedRow, 1);\r
+                    docConsole.setSaved(false);\r
                 }\r
                 \r
             });\r
@@ -872,7 +625,6 @@ public class FpdFlash extends IInternalFrame {
         if (jTextFieldFvParaName == null) {\r
             jTextFieldFvParaName = new JTextField();\r
             jTextFieldFvParaName.setPreferredSize(new java.awt.Dimension(140,20));\r
-            jTextFieldFvParaName.setEnabled(false);\r
         }\r
         return jTextFieldFvParaName;\r
     }\r
@@ -883,13 +635,13 @@ public class FpdFlash extends IInternalFrame {
      *         \r
      * @return javax.swing.JButton     \r
      */\r
-    private JButton getJButtonFvParaAdd() {\r
-        if (jButtonFvParaAdd == null) {\r
-            jButtonFvParaAdd = new JButton();\r
-            jButtonFvParaAdd.setPreferredSize(new Dimension(80, 20));\r
-            jButtonFvParaAdd.setEnabled(false);\r
-            jButtonFvParaAdd.setText("Add");\r
-            jButtonFvParaAdd.addActionListener(new AbstractAction() {\r
+    private JButton getJButtonFvNameAdd() {\r
+        if (jButtonFvNameAdd == null) {\r
+            jButtonFvNameAdd = new JButton();\r
+            jButtonFvNameAdd.setPreferredSize(new Dimension(80, 20));\r
+            jButtonFvNameAdd.setEnabled(true);\r
+            jButtonFvNameAdd.setText("Add");\r
+            jButtonFvNameAdd.addActionListener(new AbstractAction() {\r
                 /**\r
                  * \r
                  */\r
@@ -898,12 +650,34 @@ public class FpdFlash extends IInternalFrame {
                 public void actionPerformed(java.awt.event.ActionEvent e) {\r
                     if (jTextFieldFvParaName.getText().length() > 0){\r
                         String[] row = {jTextFieldFvParaName.getText()};                        \r
+                        int selectedRow = jTableFvInfo.getSelectedRow();\r
+                        if (selectedRow < 0) {\r
+                            return;\r
+                        }\r
+                        \r
+                        String fvNameList = jTableFvInfo.getValueAt(selectedRow, 0)+"";\r
+                        String type = jTableFvInfo.getValueAt(selectedRow, 1)+"";\r
+                        int fvImagePos = ffc.getFvImagePosInFvImages(fvNameList, type);\r
+                        \r
+                        if (fvImagePos < 0) {\r
+                          // new FvImage.\r
+                            ffc.genFvImagesFvImage(row, jComboBoxFvParaType.getSelectedItem()+"", null);  \r
+                        }\r
+                        else {\r
+                          //append Fv name.\r
+                          ffc.addFvImageNamesInFvImage(fvImagePos, row);  \r
+                        }\r
+                        docConsole.setSaved(false);\r
                         fvImageNameTableModel.addRow(row);\r
+                        fvNameList += " ";\r
+                        fvNameList += row[0];\r
+                        jTableFvInfo.setValueAt(fvNameList.trim(), selectedRow, 0);\r
+                        jTableFvImageNames.changeSelection(jTableFvImageNames.getRowCount() - 1, 0, false, false);\r
                     }\r
                 }\r
             });\r
         }\r
-        return jButtonFvParaAdd;\r
+        return jButtonFvNameAdd;\r
     }\r
 \r
 \r
@@ -915,7 +689,7 @@ public class FpdFlash extends IInternalFrame {
     private JScrollPane getJScrollPaneFvImageNames() {\r
         if (jScrollPaneFvImageNames == null) {\r
             jScrollPaneFvImageNames = new JScrollPane();\r
-            jScrollPaneFvImageNames.setPreferredSize(new java.awt.Dimension(350,50));\r
+            jScrollPaneFvImageNames.setPreferredSize(new java.awt.Dimension(350,80));\r
             jScrollPaneFvImageNames.setViewportView(getJTableFvImageNames());\r
         }\r
         return jScrollPaneFvImageNames;\r
@@ -929,10 +703,11 @@ public class FpdFlash extends IInternalFrame {
      */\r
     private JTable getJTableFvImageNames() {\r
         if (jTableFvImageNames == null) {\r
-            fvImageNameTableModel = new DefaultTableModel();\r
+            fvImageNameTableModel = new IDefaultTableModel();\r
             jTableFvImageNames = new JTable(fvImageNameTableModel);\r
-            jTableFvImageNames.setEnabled(false);\r
+            jTableFvImageNames.setRowHeight(20);\r
             fvImageNameTableModel.addColumn("FV Image Name");\r
+            \r
         }\r
         return jTableFvImageNames;\r
     }\r
@@ -943,13 +718,13 @@ public class FpdFlash extends IInternalFrame {
      *         \r
      * @return javax.swing.JButton     \r
      */\r
-    private JButton getJButtonFvParaDel() {\r
-        if (jButtonFvParaDel == null) {\r
-            jButtonFvParaDel = new JButton();\r
-            jButtonFvParaDel.setPreferredSize(new Dimension(80, 20));\r
-            jButtonFvParaDel.setEnabled(false);\r
-            jButtonFvParaDel.setText("Delete");\r
-            jButtonFvParaDel.addActionListener(new AbstractAction() {\r
+    private JButton getJButtonFvNameDel() {\r
+        if (jButtonFvNameDel == null) {\r
+            jButtonFvNameDel = new JButton();\r
+            jButtonFvNameDel.setPreferredSize(new Dimension(80, 20));\r
+            jButtonFvNameDel.setEnabled(true);\r
+            jButtonFvNameDel.setText("Delete");\r
+            jButtonFvNameDel.addActionListener(new AbstractAction() {\r
                 /**\r
                  * \r
                  */\r
@@ -957,16 +732,58 @@ public class FpdFlash extends IInternalFrame {
 \r
                 public void actionPerformed(java.awt.event.ActionEvent e) {\r
                     if (jTableFvImageNames.getSelectedRow() >= 0){\r
-                                   \r
+                        int selectedRow = jTableFvInfo.getSelectedRow();\r
+                        if (selectedRow < 0) {\r
+                            return;\r
+                        }\r
+                        \r
+                        String selectedFvName = jTableFvImageNames.getValueAt(jTableFvImageNames.getSelectedRow(), 0)+"";\r
+                        String fvNameList = jTableFvInfo.getValueAt(selectedRow, 0)+"";\r
+                        String type = jTableFvInfo.getValueAt(selectedRow, 1)+"";\r
+                        int fvImagePos = ffc.getFvImagePosInFvImages(fvNameList, type);\r
+                        \r
+                        if (fvImagePos < 0) {\r
+                            return;  \r
+                        }\r
+                        else {\r
+                          //delete Fv name.\r
+                            ffc.updateFvImageNamesInFvImage(fvImagePos, selectedFvName, null);\r
+                        }\r
+                        docConsole.setSaved(false);\r
+                        String newList = removeFvNameFromList(fvNameList, selectedFvName);\r
+                        jTableFvInfo.setValueAt(newList, selectedRow, 0);           \r
                         fvImageNameTableModel.removeRow(jTableFvImageNames.getSelectedRow());\r
                     }\r
                 }\r
             });\r
         }\r
-        return jButtonFvParaDel;\r
-    }\r
-\r
-\r
+        return jButtonFvNameDel;\r
+    }\r
+\r
+  private String removeFvNameFromList (String list, String name) {\r
+      String[] nameArray = list.split(" ");\r
+      int occursAt = -1;\r
+      for (int i = 0; i < nameArray.length; ++i) {\r
+          if (nameArray[i].equals(name)) {\r
+              occursAt = i;\r
+              break;\r
+          }\r
+      }\r
+      \r
+      if (occursAt == -1) {\r
+          return list;\r
+      }\r
+      \r
+      String newList = " ";\r
+      for (int j = 0; j < nameArray.length; ++j) {\r
+          if (j != occursAt) {\r
+              newList += nameArray[j];\r
+              newList += " ";\r
+          }\r
+      }\r
+      \r
+      return newList.trim();\r
+  }\r
 \r
                        \r
   private JPanel getJPanelFvImageOpts() {\r
@@ -974,6 +791,10 @@ public class FpdFlash extends IInternalFrame {
 \r
  if (jPanelFvImageOpts == null) {\r
      //ToDo add ButtonGroup for RadioButtons\r
+            FlowLayout flowLayout5 = new FlowLayout();\r
+            flowLayout5.setAlignment(java.awt.FlowLayout.LEFT);\r
+            jLabelOptions = new JLabel();\r
+            jLabelOptions.setText("Attribute");\r
             jLabelFvImageOptValue = new JLabel();\r
             jLabelFvImageOptValue.setEnabled(true);\r
             jLabelFvImageOptValue.setText("Value");\r
@@ -983,21 +804,18 @@ public class FpdFlash extends IInternalFrame {
             jLabelFvImageOptName.setText("Name");\r
             jLabelFvImageOptName.setPreferredSize(new Dimension(38, 20));\r
             jPanelFvImageOpts = new JPanel();\r
-            jPanelFvImageOpts.setPreferredSize(new java.awt.Dimension(480,150));\r
+            jPanelFvImageOpts.setLayout(flowLayout5);\r
+            jPanelFvImageOpts.setPreferredSize(new java.awt.Dimension(450,130));\r
             \r
-            jPanelFvImageOpts.setLayout(new FlowLayout());\r
             \r
                        jPanelFvImageOpts.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.LOWERED));\r
-                       jPanelFvImageOpts.add(getJCheckBoxFvImageOpts(), null);\r
+                       jPanelFvImageOpts.add(jLabelOptions, null);\r
                        jPanelFvImageOpts.add(jLabelFvImageOptName, null);\r
                        jPanelFvImageOpts.add(getJTextFieldFvImageOptName(), null);\r
                        jPanelFvImageOpts.add(jLabelFvImageOptValue, null);\r
                        jPanelFvImageOpts.add(getJTextFieldFvImageOptValue(), null);\r
                        jPanelFvImageOpts.add(getJScrollPane(), null);\r
                        jPanelFvImageOpts.add(getJPanelFvImageOptsButtonGroup(), null);\r
-                       jPanelFvImageOpts.add(getJButtonAddFvImage(), null);\r
-                       jPanelFvImageOpts.add(getJButtonDelFvImage(), null);\r
-                       jPanelFvImageOpts.add(getJButtonUpdateFvImage(), null);\r
             \r
             \r
                                \r
@@ -1016,9 +834,8 @@ public class FpdFlash extends IInternalFrame {
     private JButton getJButtonAddFvImage() {\r
         if (jButtonAddFvImage == null) {\r
             jButtonAddFvImage = new JButton();\r
-            jButtonAddFvImage.setPreferredSize(new java.awt.Dimension(120,20));\r
-//            jButton4.setEnabled(false);\r
-            jButtonAddFvImage.setText("Add FV Image");\r
+            jButtonAddFvImage.setPreferredSize(new java.awt.Dimension(150,20));\r
+            jButtonAddFvImage.setText("New FV Attributes");\r
             jButtonAddFvImage.addActionListener(new AbstractAction() {\r
                 /**\r
                  * \r
@@ -1026,36 +843,24 @@ public class FpdFlash extends IInternalFrame {
                 private static final long serialVersionUID = 1L;\r
 \r
                 public void actionPerformed(java.awt.event.ActionEvent e) {\r
-                    if (jTableFvInfo.isEditing()) {\r
-                        jTableFvInfo.getCellEditor().stopCellEditing();\r
-                    }\r
-                    if (jTableFvImageOpts.isEditing()) {\r
-                        jTableFvImageOpts.getCellEditor().stopCellEditing();\r
-                    }\r
-                    if (jTableFvImageNames.getRowCount()== 0){\r
-                        return;\r
-                    }\r
-                    String imageName = " ";\r
-                    for (int i = 0; i < jTableFvImageNames.getRowCount(); ++i){\r
-                        imageName += (String)jTableFvImageNames.getValueAt(i, 0);\r
-                        imageName += " ";\r
-                    }\r
-                    imageName = imageName.trim();\r
                     \r
-                    if (!jCheckBoxFvImageOpts.isSelected() && jComboBoxFvParaType.getSelectedIndex() != 0){\r
-                        return;\r
-                      \r
-                    }\r
+//                    String imageName = " ";\r
+//                    for (int i = 0; i < jTableFvImageNames.getRowCount(); ++i){\r
+//                        imageName += (String)jTableFvImageNames.getValueAt(i, 0);\r
+//                        imageName += " ";\r
+//                    }\r
+//                    imageName = imageName.trim();\r
                     \r
-                    LinkedHashMap<String, String> m = null;\r
-                    if (jCheckBoxFvImageOpts.isSelected()) {\r
-                        m = new LinkedHashMap<String, String>();\r
-                        getOptionNameValue(m);\r
-                    }\r
-                    ffc.genFvImagesFvImage(imageName.split(" "), jComboBoxFvParaType.getSelectedItem()+"", m);\r
-                    docConsole.setSaved(false);\r
-                    Object[] row = {imageName, jComboBoxFvParaType.getSelectedItem()};\r
-                    fvImageParaTableModel.addRow(row); \r
+//                    LinkedHashMap<String, String> m = null;\r
+//                    m = new LinkedHashMap<String, String>();\r
+//                    getOptionNameValue(m);\r
+//                    ffc.genFvImagesFvImage(imageName.split(" "), jComboBoxFvParaType.getSelectedItem()+"", m);\r
+//                    docConsole.setSaved(false);\r
+                    fvImageNameTableModel.setRowCount(0);\r
+                    fvOptionTableModel.setRowCount(0);\r
+                    Object[] row = {"", jComboBoxFvParaType.getSelectedItem()};\r
+                    fvImageParaTableModel.addRow(row);\r
+                    jTableFvInfo.changeSelection(jTableFvInfo.getRowCount() - 1, 0, false, false);\r
                 }\r
             });\r
         }\r
@@ -1090,16 +895,8 @@ public class FpdFlash extends IInternalFrame {
             fvImageParaTableModel.addColumn("FvImageNames");\r
             fvImageParaTableModel.addColumn("Type");\r
             \r
-            \r
-            TableColumn typeCol = jTableFvInfo.getColumnModel().getColumn(1);\r
-            JComboBox cb = new JComboBox();\r
-            cb.addItem("ValidImageNames");\r
-            cb.addItem("Attributes");\r
-            cb.addItem("Options");\r
-            cb.addItem("Components");\r
-            typeCol.setCellEditor(new DefaultCellEditor(cb));\r
-            \r
             jTableFvInfo.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
+            jTableFvInfo.setRowHeight(20);\r
             jTableFvInfo.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
                 public void valueChanged(ListSelectionEvent e) {\r
                     if (e.getValueIsAdjusting()){\r
@@ -1111,21 +908,34 @@ public class FpdFlash extends IInternalFrame {
                     }\r
                     else{\r
                         int selectedRow = lsm.getMinSelectionIndex();\r
+                        String fvNameList = fvImageParaTableModel.getValueAt(selectedRow, 0)+"";\r
+                        String type = fvImageParaTableModel.getValueAt(selectedRow, 1)+"";\r
+                        jComboBoxFvParaType.setSelectedItem(type);\r
+                        String[] fvNames = fvNameList.split(" ");\r
+                        fvImageNameTableModel.setRowCount(0);\r
+                        fvOptionTableModel.setRowCount(0);\r
+                        for (int i = 0; i < fvNames.length; ++i) {\r
+                            String[] row = { fvNames[i] };\r
+                            if (row[0].length() > 0) {\r
+                                fvImageNameTableModel.addRow(row);\r
+                            }\r
+                        }\r
+                        \r
+                        int fvImagePos = ffc.getFvImagePosInFvImages(fvNameList, type);\r
+                        if (fvImagePos < 0) {\r
+                            return;\r
+                        }\r
                         LinkedHashMap<String, String> optionMap = new LinkedHashMap<String, String>();\r
-                        ffc.getFvImagesFvImageOptions(selectedRow, optionMap);\r
+                        ffc.getFvImagesFvImageOptions(fvImagePos, optionMap);\r
                         if (optionMap.size() > 0){\r
-                            fvOptionTableModel.setRowCount(0);\r
                             Set<String> key = optionMap.keySet();\r
                             Iterator<String> i = key.iterator();\r
                             while (i.hasNext()) {\r
-                                \r
                                 String k = (String)i.next();\r
                                 String[] row = {k, optionMap.get(k)};\r
-                                \r
                                 fvOptionTableModel.addRow(row);\r
                             }\r
                         }\r
-                        \r
                     }\r
                 }\r
             });\r
@@ -1144,9 +954,8 @@ public class FpdFlash extends IInternalFrame {
     private JButton getJButtonDelFvImage() {\r
         if (jButtonDelFvImage == null) {\r
             jButtonDelFvImage = new JButton();\r
-            jButtonDelFvImage.setPreferredSize(new java.awt.Dimension(120,20));\r
-//            jButton6.setEnabled(false);\r
-            jButtonDelFvImage.setText("Delete Row");\r
+            jButtonDelFvImage.setPreferredSize(new java.awt.Dimension(150,20));\r
+            jButtonDelFvImage.setText("Delete FV Attributes");\r
             jButtonDelFvImage.addActionListener(new AbstractAction() {\r
                 /**\r
                  * \r
@@ -1156,9 +965,15 @@ public class FpdFlash extends IInternalFrame {
                 public void actionPerformed(ActionEvent arg0) {\r
                     // TODO Auto-generated method stub\r
                     if (jTableFvInfo.getSelectedRow() >= 0 ) {\r
-                        ffc.removeFvImagesFvImage(jTableFvInfo.getSelectedRow());\r
+                        String fvNameList = fvImageParaTableModel.getValueAt(jTableFvInfo.getSelectedRow(), 0)+"";\r
+                        int fvImagePos = ffc.getFvImagePosInFvImages(fvNameList, jComboBoxFvParaType.getSelectedItem()+"");\r
+                        \r
+                        ffc.removeFvImagesFvImage(fvImagePos);\r
                         fvImageParaTableModel.removeRow(jTableFvInfo.getSelectedRow());\r
                         docConsole.setSaved(false);\r
+                        \r
+                        fvImageNameTableModel.setRowCount(0);\r
+                        fvOptionTableModel.setRowCount(0);\r
                     }\r
                 }\r
                 \r
@@ -1168,40 +983,6 @@ public class FpdFlash extends IInternalFrame {
     }\r
 \r
 \r
-    /**\r
-     * This method initializes jCheckBox3      \r
-     *         \r
-     * @return javax.swing.JCheckBox   \r
-     */\r
-    private JCheckBox getJCheckBoxFvImageOpts() {\r
-        if (jCheckBoxFvImageOpts == null) {\r
-            jCheckBoxFvImageOpts = new JCheckBox();\r
-            jCheckBoxFvImageOpts.setText("FV Image Options");\r
-            jCheckBoxFvImageOpts.addItemListener(new ItemListener(){\r
-\r
-                public void itemStateChanged(ItemEvent arg0) {\r
-                    // TODO Auto-generated method stub\r
-//                    boolean selected = jCheckBox3.isSelected();\r
-                    \r
-                        if (!jCheckBoxFvImagePara.isSelected() || jComboBoxFvParaType.getSelectedIndex() == 0) {\r
-                            return;\r
-                        }\r
-                        \r
-//                        jLabel5.setEnabled(selected);\r
-//                        jTextField4.setEnabled(selected);\r
-//                        jLabel6.setEnabled(selected);\r
-//                        jTextField5.setEnabled(selected);\r
-//                        jButton7.setEnabled(selected);\r
-//                        jButton8.setEnabled(selected);\r
-\r
-                }\r
-                \r
-            });\r
-        }\r
-        return jCheckBoxFvImageOpts;\r
-    }\r
-\r
-\r
     /**\r
      * This method initializes jPanel6 \r
      *         \r
@@ -1209,21 +990,22 @@ public class FpdFlash extends IInternalFrame {
      */\r
     private JPanel getJPanelFvImagePara() {\r
         if (jPanelFvImagePara == null) {\r
+            FlowLayout flowLayout6 = new FlowLayout();\r
+            flowLayout6.setAlignment(java.awt.FlowLayout.LEFT);\r
             StarLabel starLabel = new StarLabel();\r
             starLabel.setVisible(false);\r
             jPanelFvImagePara = new JPanel();\r
-            jPanelFvImagePara.setPreferredSize(new java.awt.Dimension(480,120));\r
+            jPanelFvImagePara.setLayout(flowLayout6);\r
+            jPanelFvImagePara.setPreferredSize(new java.awt.Dimension(450,140));\r
             jPanelFvImagePara.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));\r
-            jPanelFvImagePara.add(getJCheckBoxFvImagePara(), null);\r
-            jPanelFvImagePara.add(jLabelFvParaType, null);\r
-            jPanelFvImagePara.add(getJComboBoxFvParaType(), null);\r
             jPanelFvImagePara.add(new StarLabel(), null);\r
             jPanelFvImagePara.add(jLabelFvImageNames, null);\r
             jPanelFvImagePara.add(jLabelFvParaName, null);\r
             jPanelFvImagePara.add(getJTextFieldFvParaName(), null);\r
-            jPanelFvImagePara.add(getJButtonFvParaAdd(), null);\r
             jPanelFvImagePara.add(getJScrollPaneFvImageNames(), null);\r
-            jPanelFvImagePara.add(getJButtonFvParaDel(), null);\r
+            jPanelFvImagePara.add(getJPanelBgFvName(), null);\r
+            jPanelFvImagePara.add(jLabelFvParaType, null);\r
+            jPanelFvImagePara.add(getJComboBoxFvParaType(), null);\r
         }\r
         return jPanelFvImagePara;\r
     }\r
@@ -1241,18 +1023,20 @@ public class FpdFlash extends IInternalFrame {
             jPanelFdf.add(getJPanelFdfN(), java.awt.BorderLayout.NORTH);\r
             jPanelFdf.add(getJPanelFdfS(), java.awt.BorderLayout.SOUTH);\r
             jPanelFdf.add(getJSplitPaneFdfC(), java.awt.BorderLayout.CENTER);\r
-//            jPanelFdf.addComponentListener(new ComponentAdapter(){\r
-//                public void componentShown(ComponentEvent e) {\r
+            jPanelFdf.addComponentListener(new ComponentAdapter(){\r
+                public void componentShown(ComponentEvent e) {\r
 //                    if (ffc.getFlashDefinitionFile() != null) {\r
 //                        jTextFieldFdf.setText(ffc.getFlashDefinitionFile());\r
+//                        initFvInFdfTable(System.getenv("WORKSPACE") + File.separator + jTextFieldFdf.getText());\r
+//    \r
 //                    }\r
-//                }\r
-//                public void componentHidden(ComponentEvent e) {\r
-//                    if (jCheckBoxFdf.isSelected()) {\r
-//                        ffc.genFlashDefinitionFile(jTextFieldFdf.getText());\r
-//                    }\r
-//                }\r
-//            });\r
+                }\r
+                public void componentHidden(ComponentEvent e) {\r
+                    if (jCheckBoxFdf.isSelected()) {\r
+                        ffc.genFlashDefinitionFile(jTextFieldFdf.getText());\r
+                    }\r
+                }\r
+            });\r
         }\r
         return jPanelFdf;\r
     }\r
@@ -1294,6 +1078,7 @@ public class FpdFlash extends IInternalFrame {
         if (jTextFieldFdf == null) {\r
             jTextFieldFdf = new JTextField();\r
             jTextFieldFdf.setEnabled(false);\r
+            jTextFieldFdf.setEditable(false);\r
             jTextFieldFdf.setPreferredSize(new Dimension(300, 20));\r
             jTextFieldFdf.addFocusListener(new java.awt.event.FocusAdapter() {\r
                 public void focusLost(java.awt.event.FocusEvent e) {\r
@@ -1339,14 +1124,7 @@ public class FpdFlash extends IInternalFrame {
                         jTextFieldFdf.setText(filePath.substring(wsDir.length() + 1).replace('\\', '/'));\r
                         ffc.genFlashDefinitionFile(jTextFieldFdf.getText());\r
                         docConsole.setSaved(false);\r
-                        Vector<FvInfoFromFdf> vFvInfo = new Vector<FvInfoFromFdf>();\r
-                        getFvInfoFromFdf(filePath, vFvInfo);\r
-                        getFvInFdfTableModel().setRowCount(0);\r
-                        for (int j = 0; j < vFvInfo.size(); ++j) {\r
-                            FvInfoFromFdf fvInfo = vFvInfo.get(j);\r
-                            String[] row = {fvInfo.getFvName(), fvInfo.getSize(), fvInfo.getEfiFileName()};\r
-                            getFvInFdfTableModel().addRow(row);\r
-                        }\r
+                        initFvInFdfTable(filePath);\r
                     }\r
                 }\r
                 \r
@@ -1354,7 +1132,134 @@ public class FpdFlash extends IInternalFrame {
         }\r
         return jButtonFdfBrowse;\r
     }\r
+    \r
+    private void initFvAttributes () {\r
+        if (ffc.getFvImagesFvImageCount("Attributes") == 0 && ffc.getFvImagesFvImageCount("Components") == 0) {\r
+            return;\r
+        }\r
+        String[][] saa = new String[ffc.getFvImagesFvImageCount("Attributes")][2];\r
+        ffc.getFvImagesFvImages(saa, "Attributes");\r
+        \r
+        int i = 0;\r
+        while (i < saa.length) {\r
+            fvImageParaTableModel.addRow(saa[i]);\r
+            ++i;\r
+        }\r
+        \r
+        saa = new String[ffc.getFvImagesFvImageCount("Components")][2];\r
+        ffc.getFvImagesFvImages(saa, "Components");\r
+        i = 0;\r
+        while (i < saa.length) {\r
+            fvImageParaTableModel.addRow(saa[i]);\r
+            ++i;\r
+        }\r
+        \r
+        saa = new String[ffc.getFvImagesNameValueCount()][2];\r
+        ffc.getFvImagesNameValues(saa);\r
+        for (int m = 0; m < saa.length; ++m) {\r
+            fvPropertyTableModel.addRow(saa[m]);\r
+        }\r
+    }\r
+    \r
+    private void initFvAdditionalTable() {\r
+        Vector<String> vFvNames = new Vector<String>();\r
+        ffc.getFvImagesFvImageFvImageNames(vFvNames);\r
+        for (int i = 0; i < vFvNames.size(); ++i) {\r
+            String fvName = vFvNames.get(i);\r
+            if (fvNameExists(fvName)) {\r
+                continue;\r
+            }\r
+            fvAdditionalTableModel.addRow(getBasicFvInfo(fvName));\r
+            addTabForFv(new FvInfoFromFdf(fvName, "", ""));\r
+        }\r
+    }\r
+\r
+    private void initFvInFdfTable(String fdfPath){\r
+        Vector<FvInfoFromFdf> vFvInfo = new Vector<FvInfoFromFdf>();\r
+        getFvInfoFromFdf(fdfPath, vFvInfo);\r
+        getFlashInfoFromFdf (fdfPath);\r
+        if (!erasePolarity.equals("1") && !erasePolarity.equals("0")) {\r
+            JOptionPane.showMessageDialog(frame, "FDF file does NOT contain valid Erase Polarity.");\r
+        }\r
+        else {\r
+            ffc.setTypedFvImageNameValue("Attributes", "EFI_ERASE_POLARITY", erasePolarity);\r
+        }\r
+        \r
+        // BugBug: assume all blocks have same size;\r
+        \r
+        String blkSize = defaultBlkSize;\r
+        if (vBlockSize.size() > 0) {\r
+            blkSize = vBlockSize.get(0);\r
+            if (!DataValidation.isInt(blkSize) && !DataValidation.isHexDoubleWordDataType(blkSize)) {\r
+                JOptionPane.showMessageDialog(frame, "FDF file does NOT contain valid FV block size. Default size 0x10000 will be used.");\r
+                blkSize = defaultBlkSize;\r
+            }\r
+        }\r
+        determinedFvBlockSize = blkSize;\r
+        \r
+        getFvInFdfTableModel().setRowCount(0);\r
+        for (int j = 0; j < vFvInfo.size(); ++j) {\r
+            FvInfoFromFdf fvInfo = vFvInfo.get(j);\r
+            String[] row = {fvInfo.getFvName(), fvInfo.getSize(), fvInfo.getEfiFileName()};\r
+            // if FV addtional table contains the same FV from fdf file, remove that row.\r
+            for (int k = 0; k < jTableFvAdditional.getRowCount(); ++k) {\r
+                if (fvAdditionalTableModel.getValueAt(k, 0).equals(row[0])) {\r
+                    fvAdditionalTableModel.removeRow(k);\r
+                }\r
+            }\r
+            getFvInFdfTableModel().addRow(row);\r
+            try {\r
+                int blockSize = Integer.decode(blkSize);\r
+                int fvSize = Integer.decode(row[1]);\r
+                int numBlocks = fvSize/blockSize;\r
+                HashMap<String, String> mOptions = new HashMap<String, String>();\r
+                // if no options for this FV before, generate a new options entry for this FV.\r
+                if (ffc.getFvImagesFvImageWithName(row[0], "Options") == null) {\r
+                    \r
+                    mOptions.put("EFI_BLOCK_SIZE", blkSize);\r
+                    mOptions.put("EFI_NUM_BLOCKS", numBlocks+"");\r
+                    mOptions.put("EFI_FILE_NAME", row[2]);\r
+                    ffc.genFvImagesFvImage(new String[]{row[0]}, "Options", mOptions);\r
+                    memModified = true;\r
+                }\r
+                else {\r
+                    ffc.getFvImagesFvImageOptions(row[0], mOptions);\r
+                    if (mOptions.get("EFI_BLOCK_SIZE") == null || !mOptions.get("EFI_BLOCK_SIZE").equalsIgnoreCase(blkSize)) {\r
+                        ffc.setTypedNamedFvImageNameValue(row[0], "Options", "EFI_BLOCK_SIZE", blkSize);\r
+                        memModified = true;\r
+                    }\r
+                    if (mOptions.get("EFI_NUM_BLOCKS") == null || Integer.decode(mOptions.get("EFI_NUM_BLOCKS")) != numBlocks) {\r
+                        ffc.setTypedNamedFvImageNameValue(row[0], "Options", "EFI_NUM_BLOCKS", numBlocks + "");\r
+                        memModified = true;\r
+                    }\r
+                    if (mOptions.get("EFI_FILE_NAME") == null || !mOptions.get("EFI_FILE_NAME").equals(row[2])) {\r
+                        ffc.setTypedNamedFvImageNameValue(row[0], "Options", "EFI_FILE_NAME", row[2]);\r
+                        memModified = true;\r
+                    }\r
+                    \r
+                }\r
+            }\r
+            catch (NumberFormatException e){\r
+                JOptionPane.showMessageDialog(frame, e.getMessage());\r
+            }\r
+        }\r
 \r
+        for (int k = 0; k < vFvInfo.size(); ++k) {\r
+            FvInfoFromFdf fvInfo = vFvInfo.get(k);\r
+            addTabForFv(fvInfo);\r
+        }\r
+        \r
+    }\r
+    \r
+    private void addTabForFv (FvInfoFromFdf fvInfo) {\r
+        String fvName = fvInfo.getFvName();\r
+        String outputFile = fvInfo.getEfiFileName();\r
+        int index = jTabbedPane.indexOfTab(fvName);\r
+        if (index >= startIndexOfDynamicTab) {\r
+            return;\r
+        }\r
+        jTabbedPane.addTab(fvName, null, new ModuleOrderPane(fvName, outputFile), null);\r
+    }\r
     /**\r
      * This method initializes jTextField4     \r
      *         \r
@@ -1417,10 +1322,28 @@ public class FpdFlash extends IInternalFrame {
 \r
                 public void actionPerformed(ActionEvent e) {\r
                     if (jTextFieldFvImageOptName.getText().length() > 0 && jTextFieldFvImageOptValue.getText().length() > 0){\r
-                        String[] row = {jTextFieldFvImageOptName.getText(), jTextFieldFvImageOptValue.getText()};                        \r
-                        fvOptionTableModel.addRow(row);\r
-                    }\r
-                }\r
+                        int selectedRow = jTableFvInfo.getSelectedRow();\r
+                        if (selectedRow < 0) {\r
+                            return;\r
+                        }\r
+                        \r
+                        String fvNameList = jTableFvInfo.getValueAt(selectedRow, 0)+"";\r
+                        String type = jTableFvInfo.getValueAt(selectedRow, 1)+"";\r
+                        int fvImagePos = ffc.getFvImagePosInFvImages(fvNameList, type);\r
+                        String[] row = {jTextFieldFvImageOptName.getText(), jTextFieldFvImageOptValue.getText()};\r
+                        \r
+                        if (fvImagePos < 0) {\r
+                            return;\r
+                        }\r
+                        else {\r
+                            //append options to FvImage.\r
+                            ffc.setFvImagesFvImageNameValue(fvImagePos, row[0], row[1]);\r
+                        }\r
+                        docConsole.setSaved(false);\r
+                        fvOptionTableModel.addRow(row);\r
+                        jTableFvImageOpts.changeSelection(jTableFvImageOpts.getRowCount() - 1, 0, false, false);\r
+                    }\r
+                }\r
             });\r
         }\r
         return jButtonFvImageOptAdd;\r
@@ -1445,7 +1368,22 @@ public class FpdFlash extends IInternalFrame {
 \r
                 public void actionPerformed(ActionEvent e) {\r
                     if (jTableFvImageOpts.getSelectedRow() >= 0){\r
-                        fvOptionTableModel.removeRow(jTableFvProp.getSelectedRow());\r
+                        int selectedRow = jTableFvInfo.getSelectedRow();\r
+                        if (selectedRow < 0) {\r
+                            return;\r
+                        }\r
+                        \r
+                        String fvNameList = jTableFvInfo.getValueAt(selectedRow, 0)+"";\r
+                        String type = jTableFvInfo.getValueAt(selectedRow, 1)+"";\r
+                        int fvImagePos = ffc.getFvImagePosInFvImages(fvNameList, type);\r
+                        if (fvImagePos < 0) {\r
+                            return;\r
+                        }\r
+                        \r
+                        String optName = fvOptionTableModel.getValueAt(jTableFvImageOpts.getSelectedRow(), 0)+"";\r
+                        ffc.removeFvImageNameValue(fvImagePos, optName);\r
+                        docConsole.setSaved(false);\r
+                        fvOptionTableModel.removeRow(jTableFvImageOpts.getSelectedRow());\r
                     }\r
                 }\r
             });\r
@@ -1461,7 +1399,7 @@ public class FpdFlash extends IInternalFrame {
     private JScrollPane getJScrollPane() {\r
         if (jScrollPane == null) {\r
             jScrollPane = new JScrollPane();\r
-            jScrollPane.setPreferredSize(new java.awt.Dimension(350,80));\r
+            jScrollPane.setPreferredSize(new java.awt.Dimension(350,100));\r
             jScrollPane.setViewportView(getJTableFvImageOpts());\r
         }\r
         return jScrollPane;\r
@@ -1474,7 +1412,7 @@ public class FpdFlash extends IInternalFrame {
      */\r
     private JTable getJTableFvImageOpts() {\r
         if (jTableFvImageOpts == null) {\r
-            fvOptionTableModel = new DefaultTableModel();\r
+            fvOptionTableModel = new IDefaultTableModel();\r
             fvOptionTableModel.addColumn("Name");\r
             fvOptionTableModel.addColumn("Value");\r
             jTableFvImageOpts = new JTable(fvOptionTableModel);\r
@@ -1494,9 +1432,10 @@ public class FpdFlash extends IInternalFrame {
     private JButton getJButtonUpdateFvImage() {\r
         if (jButtonUpdateFvImage == null) {\r
             jButtonUpdateFvImage = new JButton();\r
-            jButtonUpdateFvImage.setPreferredSize(new Dimension(120, 20));\r
+            jButtonUpdateFvImage.setPreferredSize(new java.awt.Dimension(150,20));\r
             jButtonUpdateFvImage.setActionCommand("Update");\r
-            jButtonUpdateFvImage.setText("Update FV");\r
+            jButtonUpdateFvImage.setText("Update FV Attributes");\r
+            jButtonUpdateFvImage.setVisible(false);\r
             jButtonUpdateFvImage.addActionListener(new java.awt.event.ActionListener() {\r
                 public void actionPerformed(java.awt.event.ActionEvent e) {\r
                     int row = jTableFvInfo.getSelectedRow();\r
@@ -1523,30 +1462,6 @@ public class FpdFlash extends IInternalFrame {
         return jButtonUpdateFvImage;\r
     }\r
 \r
-    /**\r
-     * This method initializes jButtonTest     \r
-     *         \r
-     * @return javax.swing.JButton     \r
-     */\r
-//    private JButton getJButtonTest() {\r
-//        if (jButtonTest == null) {\r
-//            jButtonTest = new JButton();\r
-//            jButtonTest.addActionListener(new java.awt.event.ActionListener() {\r
-//                public void actionPerformed(java.awt.event.ActionEvent e) {\r
-//                    docConsole.setSaved(false);\r
-//                    String[][] includeModules = {{"1", "a"}, {"2", "b"}};\r
-//                    ffc.genBuildOptionsUserExtensions("FV_RECOVERY", "FvRecovery.inf", null, includeModules);\r
-//                    int i = ffc.getUserExtsIncModCount("FV_RECOVERY");\r
-//                    String[][] saa = new String[i][2];\r
-//                    ffc.getUserExtsIncMods("FV_RECOVERY", saa);\r
-//                    jTextFieldFdf.setText(saa[0][0] + saa[0][1] + saa[1][0] + saa[1][1]);\r
-//                    \r
-//                }\r
-//            });\r
-//        }\r
-//        return jButtonTest;\r
-//    }\r
-\r
     /**\r
      * This method initializes jPanelFdfN      \r
      *         \r
@@ -1734,9 +1649,9 @@ public class FpdFlash extends IInternalFrame {
      *         \r
      * @return org.tianocore.frameworkwizard.platform.ui.NonEditableTableModel \r
      */\r
-    private NonEditableTableModel getFvInFdfTableModel() {\r
+    private IDefaultTableModel getFvInFdfTableModel() {\r
         if (fvInFdfTableModel == null) {\r
-            fvInFdfTableModel = new NonEditableTableModel();\r
+            fvInFdfTableModel = new IDefaultTableModel();\r
             fvInFdfTableModel.addColumn("FV Name");\r
             fvInFdfTableModel.addColumn("Size");\r
             fvInFdfTableModel.addColumn("Corresponding File Name");\r
@@ -1753,20 +1668,54 @@ public class FpdFlash extends IInternalFrame {
         if (jButtonFvInFdfOptions == null) {\r
             jButtonFvInFdfOptions = new JButton();\r
             jButtonFvInFdfOptions.setPreferredSize(new java.awt.Dimension(80,20));\r
+            jButtonFvInFdfOptions.setEnabled(true);\r
             jButtonFvInFdfOptions.setText("Options");\r
             jButtonFvInFdfOptions.addActionListener(new java.awt.event.ActionListener() {\r
                 public void actionPerformed(java.awt.event.ActionEvent e) {\r
                     int selectedRow = jTableFvInFdf.getSelectedRow();\r
-                    if (selectedRow <= 0) {\r
+                    if (selectedRow < 0) {\r
+                        return;\r
+                    }\r
+                    String fvName = jTableFvInFdf.getValueAt(selectedRow, 0)+"";\r
+                    if (fvName.length() == 0) {\r
                         return;\r
                     }\r
-                    fvInFdfTableModel.moveRow(selectedRow, selectedRow, selectedRow - 1);\r
-                    jTableFvInFdf.changeSelection(selectedRow - 1, 0, false, false);\r
+                    DefaultTableModel dtm = getFvInFdfOptTableModel();\r
+                    new FpdFvOptions(fvName, dtm, ffc, docConsole);\r
                 }\r
             });\r
         }\r
         return jButtonFvInFdfOptions;\r
     }\r
+    \r
+    private DefaultTableModel getFvInFdfOptTableModel() {\r
+        if (fvInFdfOptTableModel == null) {\r
+            fvInFdfOptTableModel = new FvOptsTableModel();\r
+            fvInFdfOptTableModel.addColumn("Name");\r
+            fvInFdfOptTableModel.addColumn("Value");\r
+            Vector<Object> v = new Vector<Object>();\r
+            v.add("EFI_BLOCK_SIZE");\r
+            v.add("EFI_NUM_BLOCKS");\r
+            v.add("EFI_FILE_NAME");\r
+            fvInFdfOptTableModel.setVKeyWords(v);\r
+            fvInFdfOptTableModel.setVNonEditableName(v);\r
+        }\r
+        return fvInFdfOptTableModel;\r
+    }\r
+    \r
+    private DefaultTableModel getFvAdditionalOptTableModel() {\r
+        if (fvAdditionalOptTableModel == null) {\r
+            fvAdditionalOptTableModel = new FvOptsTableModel();\r
+            fvAdditionalOptTableModel.addColumn("Name");\r
+            fvAdditionalOptTableModel.addColumn("Value");\r
+            Vector<Object> v = new Vector<Object>();\r
+            v.add("EFI_BLOCK_SIZE");\r
+            v.add("EFI_NUM_BLOCKS");\r
+            v.add("EFI_FILE_NAME");\r
+            fvAdditionalOptTableModel.setVNonEditableName(v);\r
+        }\r
+        return fvAdditionalOptTableModel;\r
+    }\r
 \r
     /**\r
      * This method initializes jScrollPaneFvAdditional \r
@@ -1792,24 +1741,155 @@ public class FpdFlash extends IInternalFrame {
             jTableFvAdditional = new JTable();\r
             jTableFvAdditional.setRowHeight(20);\r
             jTableFvAdditional.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);\r
-            jTableFvAdditional.setModel(getFvAddtionalTableModel());\r
+            jTableFvAdditional.setModel(getFvAdditionalTableModel());\r
+            \r
+            jTableFvAdditional.getSelectionModel().addListSelectionListener(new ListSelectionListener() {\r
+                public void valueChanged(ListSelectionEvent e) {\r
+                    if (e.getValueIsAdjusting()) {\r
+                        return;\r
+                    }\r
+                    ListSelectionModel lsm = (ListSelectionModel) e.getSource();\r
+                    if (lsm.isSelectionEmpty()) {\r
+                        return;\r
+                    } else {\r
+                        selectedRowInFvAdditionalTable = lsm.getMinSelectionIndex();\r
+                        oldFvName = jTableFvAdditional.getValueAt(selectedRowInFvAdditionalTable, 0)+"";\r
+                    }\r
+                }\r
+            });\r
+            \r
+            jTableFvAdditional.getModel().addTableModelListener(new TableModelListener() {\r
+                public void tableChanged(TableModelEvent arg0) {\r
+                    // TODO Auto-generated method stub\r
+                    int row = arg0.getFirstRow();\r
+                    int col = arg0.getColumn();\r
+                    TableModel m = (TableModel) arg0.getSource();\r
+                    \r
+                    if (arg0.getType() == TableModelEvent.UPDATE) {\r
+                        if (col == 0) {\r
+                            String newFvName = m.getValueAt(row, 0) + "";\r
+                            if (newFvName.equals(oldFvName)) {\r
+                                return;\r
+                            }\r
+                            if (fvNameExists(newFvName)) {\r
+                                JOptionPane.showMessageDialog(frame, "This FV already exists. Please choose another FV name.");\r
+                                m.setValueAt(oldFvName, row, 0);\r
+                                return;\r
+                            }\r
+                            \r
+                            tabIndexForFv = jTabbedPane.indexOfTab(oldFvName);\r
+                            if (tabIndexForFv >= startIndexOfDynamicTab) {\r
+                                jTabbedPane.setTitleAt(tabIndexForFv, newFvName);\r
+                                // change FvName in UserExtensions\r
+                                ffc.updateBuildOptionsUserExtensions(oldFvName, newFvName);\r
+                                // change FvBinding in ModuleSA\r
+                                ffc.appendFvBindingFor(oldFvName, newFvName);\r
+                                ffc.removeFvBindingAll(oldFvName);\r
+                                // change FvImageNames in Flash\r
+                                ffc.updateFvImageNameAll(oldFvName, newFvName);\r
+                                \r
+                            } else {\r
+                                jTabbedPane.addTab(newFvName, new ModuleOrderPane(newFvName, ""));\r
+                                // Add FvImageNames in Flash\r
+                                String[] fvNames = {newFvName};\r
+                                ffc.addFvImageFvImageNames(fvNames);\r
+                            }\r
+                            docConsole.setSaved(false);\r
+                            oldFvName = newFvName;\r
+                        }\r
+                        \r
+                        if (col == 1 && !sizeFromOptionDlg) {\r
+                            String fvSize = m.getValueAt(row, col) + "";\r
+                            if (!DataValidation.isInt(fvSize) && !DataValidation.isHexDoubleWordDataType(fvSize)) {\r
+                                JOptionPane.showMessageDialog(frame, "FV size should be Integer or Hex format.");\r
+                                return;\r
+                            }\r
+                            HashMap<String, String> mFvOpts = new HashMap<String, String>();\r
+                            ffc.getFvImagesFvImageOptions(oldFvName, mFvOpts);\r
+                            String blkSize = mFvOpts.get("EFI_BLOCK_SIZE");\r
+                            if (blkSize == null) {\r
+                                if (determinedFvBlockSize != null) {\r
+                                    blkSize = determinedFvBlockSize;\r
+                                }\r
+                                else {\r
+                                    blkSize = defaultBlkSize;\r
+                                }\r
+                                ffc.setTypedNamedFvImageNameValue(oldFvName, "Options", "EFI_BLOCK_SIZE", blkSize);\r
+                                int fs = Integer.decode(fvSize);\r
+                                int bs = Integer.decode(blkSize);\r
+                                ffc.setTypedNamedFvImageNameValue(oldFvName, "Options", "EFI_NUM_BLOCKS", (fs/bs)+"");\r
+                                docConsole.setSaved(false);\r
+                            }\r
+                            else {\r
+                                if (!DataValidation.isInt(blkSize) && !DataValidation.isHexDoubleWordDataType(blkSize)) {\r
+                                    int retVal = JOptionPane.showConfirmDialog(frame, "Confirm", "FPD file contains error block size format. Would you like to replace it with a default value?", JOptionPane.YES_NO_OPTION);\r
+                                    if (retVal == JOptionPane.YES_OPTION) {\r
+                                        ffc.setTypedNamedFvImageNameValue(oldFvName, "Options", "EFI_BLOCK_SIZE", defaultBlkSize);\r
+                                        int fs = Integer.decode(fvSize);\r
+                                        int bs = Integer.decode(defaultBlkSize);\r
+                                        ffc.setTypedNamedFvImageNameValue(oldFvName, "Options", "EFI_NUM_BLOCKS", (fs/bs)+"");\r
+                                        docConsole.setSaved(false);\r
+                                        return;\r
+                                    }\r
+                                    else {\r
+                                        return;\r
+                                    }\r
+                                    \r
+                                }\r
+                                int fs = Integer.decode(fvSize);\r
+                                int bs = Integer.decode(blkSize);\r
+                                ffc.setTypedNamedFvImageNameValue(oldFvName, "Options", "EFI_NUM_BLOCKS", (fs/bs)+"");\r
+                                docConsole.setSaved(false);\r
+                            }\r
+                        }\r
+                        \r
+                        if (col == 2 && !fileFromOptionDlg) {\r
+                            ffc.setTypedNamedFvImageNameValue(oldFvName, "Options", "EFI_FILE_NAME", m.getValueAt(row, col)+"");\r
+                            docConsole.setSaved(false);\r
+                        }\r
+                        \r
+                    }\r
+                }\r
+            });\r
         }\r
         return jTableFvAdditional;\r
     }\r
+    \r
+    private boolean fvNameExistsInFvInFdfTable (String fvName) {\r
+        for (int i = 0; i < jTableFvInFdf.getRowCount(); ++i) {\r
+            if (fvInFdfTableModel.getValueAt(i, 0).equals(fvName)) {\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+    \r
+    private boolean fvNameExists (String fvName) {\r
+        if (fvNameExistsInFvInFdfTable(fvName)) {\r
+            return true;\r
+        }\r
+        \r
+        for (int j = 0; j < jTableFvAdditional.getRowCount(); ++j) {\r
+            if (fvAdditionalTableModel.getValueAt(j, 0).equals(fvName) && j != selectedRowInFvAdditionalTable) {\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
 \r
     /**\r
-     * This method initializes fvAddtionalTableModel   \r
+     * This method initializes fvAdditionalTableModel  \r
      *         \r
      * @return javax.swing.table.DefaultTableModel     \r
      */\r
-    private DefaultTableModel getFvAddtionalTableModel() {\r
-        if (fvAddtionalTableModel == null) {\r
-            fvAddtionalTableModel = new DefaultTableModel();\r
-            fvAddtionalTableModel.addColumn("FV Name");\r
-            fvAddtionalTableModel.addColumn("Size");\r
-            fvAddtionalTableModel.addColumn("Corresponding File Name");\r
+    private DefaultTableModel getFvAdditionalTableModel() {\r
+        if (fvAdditionalTableModel == null) {\r
+            fvAdditionalTableModel = new DefaultTableModel();\r
+            fvAdditionalTableModel.addColumn("FV Name");\r
+            fvAdditionalTableModel.addColumn("Size");\r
+            fvAdditionalTableModel.addColumn("Corresponding File Name");\r
         }\r
-        return fvAddtionalTableModel;\r
+        return fvAdditionalTableModel;\r
     }\r
 \r
     /**\r
@@ -1821,7 +1901,17 @@ public class FpdFlash extends IInternalFrame {
         if (jButtonAddFv == null) {\r
             jButtonAddFv = new JButton();\r
             jButtonAddFv.setPreferredSize(new java.awt.Dimension(80,20));\r
+            jButtonAddFv.setEnabled(true);\r
             jButtonAddFv.setText("New");\r
+            jButtonAddFv.addActionListener(new java.awt.event.ActionListener() {\r
+                public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                    if (jTableFvAdditional.isEditing()) {\r
+                        jTableFvAdditional.getCellEditor().stopCellEditing();\r
+                    }\r
+                    String[] row = {"", "", ""};\r
+                    fvAdditionalTableModel.addRow(row);\r
+                }\r
+            });\r
         }\r
         return jButtonAddFv;\r
     }\r
@@ -1835,7 +1925,28 @@ public class FpdFlash extends IInternalFrame {
         if (jButtonDelFv == null) {\r
             jButtonDelFv = new JButton();\r
             jButtonDelFv.setPreferredSize(new java.awt.Dimension(80,20));\r
+            jButtonDelFv.setEnabled(true);\r
             jButtonDelFv.setText("Delete");\r
+            jButtonDelFv.addActionListener(new java.awt.event.ActionListener() {\r
+                public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                    //delete row in FvAdditional table.\r
+                    int selectedRow = jTableFvAdditional.getSelectedRow();\r
+                    if (selectedRow < 0) {\r
+                        return;\r
+                    }\r
+                    String fvName = fvAdditionalTableModel.getValueAt(selectedRow, 0) + "";\r
+                    fvAdditionalTableModel.removeRow(selectedRow);\r
+                    //\r
+                    //delete tab with selected FV name.\r
+                    //\r
+                    jTabbedPane.removeTabAt(jTabbedPane.indexOfTab(fvName));\r
+                    //delete FV Name from FvImages element.\r
+                    ffc.updateFvImageNameAll(fvName, null);\r
+                    //delete FvBinding from ModuleSA.\r
+                    ffc.removeFvBindingAll(fvName);\r
+                    docConsole.setSaved(false);\r
+                }\r
+            });\r
         }\r
         return jButtonDelFv;\r
     }\r
@@ -1849,26 +1960,118 @@ public class FpdFlash extends IInternalFrame {
         if (jButtonAddFvOptions == null) {\r
             jButtonAddFvOptions = new JButton();\r
             jButtonAddFvOptions.setPreferredSize(new java.awt.Dimension(80,20));\r
+            jButtonAddFvOptions.setEnabled(true);\r
             jButtonAddFvOptions.setText("Options");\r
+            jButtonAddFvOptions.addActionListener(new java.awt.event.ActionListener() {\r
+                public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                    int selectedRow = jTableFvAdditional.getSelectedRow();\r
+                    if (selectedRow < 0) {\r
+                        return;\r
+                    }\r
+                    String fvName = jTableFvAdditional.getValueAt(selectedRow, 0)+"";\r
+                    String oldFvSize = jTableFvAdditional.getValueAt(selectedRow, 1)+"";\r
+                    String oldFileName = jTableFvAdditional.getValueAt(selectedRow, 2)+"";\r
+                    if (fvName.length() == 0) {\r
+                        return;\r
+                    }\r
+                    DefaultTableModel dtm = getFvAdditionalOptTableModel();\r
+                    new FpdFvOptions(fvName, dtm, ffc, docConsole);\r
+                    \r
+                    String[] updatedFvInfo = getBasicFvInfo (fvName);\r
+                    if (!oldFvSize.equalsIgnoreCase(updatedFvInfo[1])) {\r
+                        sizeFromOptionDlg = true;\r
+                        jTableFvAdditional.setValueAt(updatedFvInfo[1], selectedRow, 1);\r
+                        sizeFromOptionDlg = false;\r
+                    }\r
+                    if (!oldFileName.equals(updatedFvInfo[2])) {\r
+                        fileFromOptionDlg = true;\r
+                        jTableFvAdditional.setValueAt(updatedFvInfo[2], selectedRow, 2);\r
+                        fileFromOptionDlg = false;\r
+                    }\r
+                }\r
+            });\r
         }\r
         return jButtonAddFvOptions;\r
     }\r
+    \r
+    private String[] getBasicFvInfo (String fvName) {\r
+        HashMap<String, String> mFvOpts = new HashMap<String, String>();\r
+        ffc.getFvImagesFvImageOptions(fvName, mFvOpts);\r
+        String bSize = "";\r
+        String numBlks = "";\r
+        String fvSize = "";\r
+        String fvFile = "";\r
+        if (mFvOpts.get("EFI_FILE_NAME") != null) {\r
+            fvFile = mFvOpts.get("EFI_FILE_NAME");\r
+        }\r
+        if (mFvOpts.get("EFI_BLOCK_SIZE") != null && mFvOpts.get("EFI_NUM_BLOCKS") != null) {\r
+            bSize = mFvOpts.get("EFI_BLOCK_SIZE");\r
+            numBlks = mFvOpts.get("EFI_NUM_BLOCKS");\r
+            boolean blockSizeWellFormat = true;\r
+            boolean numOfBlockWellFormat = true;\r
+            if (!DataValidation.isHexDoubleWordDataType(bSize) && !DataValidation.isInt(bSize)) {\r
+               blockSizeWellFormat = false;\r
+               JOptionPane.showMessageDialog(frame, fvName + " block size bad format.");\r
+            } \r
+            if (!DataValidation.isHexDoubleWordDataType(numBlks) && !DataValidation.isInt(numBlks)) {\r
+               numOfBlockWellFormat = false;\r
+               JOptionPane.showMessageDialog(frame, fvName + " number of blocks bad format.");\r
+            }\r
+            if (blockSizeWellFormat && numOfBlockWellFormat) {\r
+                int size = Integer.decode(bSize);\r
+                int num = Integer.decode(numBlks);\r
+                fvSize = "0x" + Integer.toHexString(size*num);\r
+            }\r
+        }\r
+        \r
+        return new String[]{fvName, fvSize, fvFile};\r
 \r
+    }\r
     \r
+    /**\r
+     * This method initializes jPanelBgFvName  \r
+     *         \r
+     * @return javax.swing.JPanel      \r
+     */\r
+    private JPanel getJPanelBgFvName() {\r
+        if (jPanelBgFvName == null) {\r
+            jPanelBgFvName = new JPanel();\r
+            jPanelBgFvName.setPreferredSize(new java.awt.Dimension(80,55));\r
+            jPanelBgFvName.add(getJButtonFvNameAdd(), null);\r
+            jPanelBgFvName.add(getJButtonFvNameDel(), null);\r
+        }\r
+        return jPanelBgFvName;\r
+    }\r
 \r
     /**\r
-     * This method initializes nonEditableTableModel   \r
+     * This method initializes jPanelBgFvImage \r
      *         \r
-     * @return org.tianocore.frameworkwizard.platform.ui.NonEditableTableModel \r
+     * @return javax.swing.JPanel      \r
      */\r
-    private NonEditableTableModel getNonEditableTableModel() {\r
-        if (nonEditableTableModel == null) {\r
-            nonEditableTableModel = new NonEditableTableModel();\r
+    private JPanel getJPanelBgFvImage() {\r
+        if (jPanelBgFvImage == null) {\r
+            jPanelBgFvImage = new JPanel();\r
+            jPanelBgFvImage.setPreferredSize(new java.awt.Dimension(150,100));\r
+            jPanelBgFvImage.add(getJButtonAddFvImage(), null);\r
+            jPanelBgFvImage.add(getJButtonDelFvImage(), null);\r
+            jPanelBgFvImage.add(getJButtonUpdateFvImage(), null);\r
         }\r
-        return nonEditableTableModel;\r
+        return jPanelBgFvImage;\r
+    }\r
+\r
+    /**\r
+     * This method initializes jPanelW \r
+     *         \r
+     * @return javax.swing.JPanel      \r
+     */\r
+    private JPanel getJPanelW() {\r
+        if (jPanelW == null) {\r
+            jPanelW = new JPanel();\r
+            jPanelW.add(getJPanelBgFvImage(), null);\r
+        }\r
+        return jPanelW;\r
     }\r
 \r
-    \r
     /**\r
      * @param args\r
      */\r
@@ -1883,7 +2086,7 @@ public class FpdFlash extends IInternalFrame {
      * @return void\r
      */\r
     private void initialize() {\r
-        this.setSize(518, 650);\r
+        this.setSize(660, 650);\r
         this.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);\r
         this.setContentPane(getJContentPane());\r
         this.setTitle("FPD Flash Definitions");\r
@@ -1898,52 +2101,25 @@ public class FpdFlash extends IInternalFrame {
                 if (jTableFvInfo.isEditing()) {\r
                     jTableFvInfo.getCellEditor().stopCellEditing();\r
                 }\r
+                if (jTableFvAdditional.isEditing()) {\r
+                    jTableFvAdditional.getCellEditor().stopCellEditing();\r
+                }\r
             }\r
         });\r
     }\r
 \r
     private void init(FpdFileContents ffc) {\r
-        if (ffc.getFvImagesFvImageCount() == 0) {\r
-            return;\r
-        }\r
-        String[][] saa = new String[ffc.getFvImagesFvImageCount()][2];\r
-        ffc.getFvImagesFvImages(saa);\r
-       \r
-        int i = 0;\r
-        while (i < saa.length) {\r
-            \r
-            fvImageParaTableModel.addRow(saa[i]);\r
-            ++i;\r
-        }\r
-        \r
-        saa = new String[ffc.getFvImagesNameValueCount()][2];\r
-        ffc.getFvImagesNameValues(saa);\r
-        for (int m = 0; m < saa.length; ++m) {\r
-            fvPropertyTableModel.addRow(saa[m]);\r
-        }\r
+        initFvAttributes();\r
         \r
         jTextFieldFdf.setText("");\r
         String fdfFile = ffc.getFlashDefinitionFile();\r
-        if (fdfFile != null) {\r
+        if (fdfFile != null && fdfFile.length() > 0) {\r
             jTextFieldFdf.setText(fdfFile);\r
+            String fdfPath = System.getenv("WORKSPACE") + File.separator + fdfFile;\r
+            initFvInFdfTable(fdfPath);\r
         }\r
         \r
-        String fdfPath = System.getenv("WORKSPACE") + File.separator + fdfFile;\r
-        Vector<FvInfoFromFdf> vFvInfo = new Vector<FvInfoFromFdf>();\r
-        getFvInfoFromFdf(fdfPath, vFvInfo);\r
-        getFvInFdfTableModel().setRowCount(0);\r
-        for (int j = 0; j < vFvInfo.size(); ++j) {\r
-            FvInfoFromFdf fvInfo = vFvInfo.get(j);\r
-            String[] row = {fvInfo.getFvName(), fvInfo.getSize(), fvInfo.getEfiFileName()};\r
-            getFvInFdfTableModel().addRow(row);\r
-        }\r
-        \r
-\r
-        for (int k = 0; k < vFvInfo.size(); ++k) {\r
-            FvInfoFromFdf fvInfo = vFvInfo.get(k);\r
-            getJTabbedPane().addTab(fvInfo.getFvName(), null, getJPanelModOrder(), null);\r
-\r
-        }\r
+        initFvAdditionalTable();\r
     }\r
     \r
     private void getOptionNameValue(Map<String, String> m){\r
@@ -1969,6 +2145,53 @@ public class FpdFlash extends IInternalFrame {
         return jContentPane;\r
     }\r
     \r
+    private void getFlashInfoFromFdf (String fdfPath) {\r
+        File fdf = new File(fdfPath);\r
+        if (!fdf.exists()) {\r
+            return;\r
+        }\r
+        int lines = 0;\r
+\r
+        try {\r
+            FileReader reader = new FileReader(fdf);\r
+            BufferedReader in = new BufferedReader(reader);\r
+            String str;\r
+\r
+            while ((str = in.readLine()) != null) {\r
+                ++lines;\r
+                str = str.trim();\r
+                //\r
+                // skip empty line, comment (start with //) \r
+                //\r
+                if (str.length() == 0 || str.startsWith("//")) {\r
+                    continue;\r
+                }\r
+                //\r
+                // ErasePolarity\r
+                //\r
+                if (str.startsWith("ErasePolarity")) {\r
+                    erasePolarity = str.substring(str.indexOf("=") + 1, str.lastIndexOf(",")).trim();\r
+                }\r
+                //\r
+                // dig into Block section.\r
+                //\r
+                if (str.startsWith("Block") && str.endsWith("}")) {\r
+                    String[] blockSec = str.split(",");\r
+                    String nv = blockSec[1].trim();\r
+                    String[] sizeSec = nv.split("=");\r
+                    vBlockSize.add(sizeSec[1].trim());\r
+                }\r
+                \r
+            }\r
+            \r
+            reader.close();\r
+            in.close();\r
+        }\r
+        catch (Exception e) {\r
+           \r
+        }\r
+    }\r
+    \r
     private void getFvInfoFromFdf(String fdfPath, Vector<FvInfoFromFdf> vFvInfo) {\r
         File fdf = new File(fdfPath);\r
         if (!fdf.exists()) {\r
@@ -2073,25 +2296,785 @@ public class FpdFlash extends IInternalFrame {
                 }\r
    \r
             }\r
-        } catch (Exception e) {\r
+            \r
+            reader.close();\r
+            in.close();\r
+        }\r
+        catch (Exception e) {\r
            \r
         }\r
 \r
     }\r
-        \r
     \r
+//    class ModuleSAInfo {\r
+//        private int rowNumber = -1;\r
+//        private String moduleGuid = null;\r
+//        private String moduleVersion = null;\r
+//        private String packageGuid = null;\r
+//        private String packageVersion = null;\r
+//        private String arch = null;\r
+//        \r
+//        public ModuleSAInfo (String mg, String mv, String pg, String pv, String a) {\r
+//            moduleGuid = mg;\r
+//            moduleVersion = mv;\r
+//            packageGuid = pg;\r
+//            packageVersion = pv;\r
+//            arch = a;\r
+//        }\r
+//\r
+//        /**\r
+//         * @return Returns the arch.\r
+//         */\r
+//        public String getArch() {\r
+//            return arch;\r
+//        }\r
+//\r
+//        /**\r
+//         * @param arch The arch to set.\r
+//         */\r
+//        public void setArch(String arch) {\r
+//            this.arch = arch;\r
+//        }\r
+//\r
+//        /**\r
+//         * @return Returns the moduleGuid.\r
+//         */\r
+//        public String getModuleGuid() {\r
+//            return moduleGuid;\r
+//        }\r
+//\r
+//        /**\r
+//         * @param moduleGuid The moduleGuid to set.\r
+//         */\r
+//        public void setModuleGuid(String moduleGuid) {\r
+//            this.moduleGuid = moduleGuid;\r
+//        }\r
+//\r
+//        /**\r
+//         * @return Returns the moduleVersion.\r
+//         */\r
+//        public String getModuleVersion() {\r
+//            return moduleVersion;\r
+//        }\r
+//\r
+//        /**\r
+//         * @param moduleVersion The moduleVersion to set.\r
+//         */\r
+//        public void setModuleVersion(String moduleVersion) {\r
+//            this.moduleVersion = moduleVersion;\r
+//        }\r
+//\r
+//        /**\r
+//         * @return Returns the packageGuid.\r
+//         */\r
+//        public String getPackageGuid() {\r
+//            return packageGuid;\r
+//        }\r
+//\r
+//        /**\r
+//         * @param packageGuid The packageGuid to set.\r
+//         */\r
+//        public void setPackageGuid(String packageGuid) {\r
+//            this.packageGuid = packageGuid;\r
+//        }\r
+//\r
+//        /**\r
+//         * @return Returns the packageVersion.\r
+//         */\r
+//        public String getPackageVersion() {\r
+//            return packageVersion;\r
+//        }\r
+//\r
+//        /**\r
+//         * @param packageVersion The packageVersion to set.\r
+//         */\r
+//        public void setPackageVersion(String packageVersion) {\r
+//            this.packageVersion = packageVersion;\r
+//        }\r
+//\r
+//        /**\r
+//         * @return Returns the rowNumber.\r
+//         */\r
+//        public int getRowNumber() {\r
+//            return rowNumber;\r
+//        }\r
+//\r
+//        /**\r
+//         * @param rowNumber The rowNumber to set.\r
+//         */\r
+//        public void setRowNumber(int rowNumber) {\r
+//            this.rowNumber = rowNumber;\r
+//        }\r
+//    }\r
+    \r
+    private class ModuleOrderPane extends JPanel {\r
+\r
+        /**\r
+         * \r
+         */\r
+        private static final long serialVersionUID = 1L;\r
+        private JPanel jPanelModOrderN = null;\r
+        private JPanel jPanelModOrderS = null;\r
+        private JPanel jPanelModOrderC = null;\r
+        private JScrollPane jScrollPaneModInFv = null;\r
+        private JTable jTableModInFv = null;\r
+        private JPanel jPanelController = null;\r
+        private JScrollPane jScrollPaneFpdModules = null;\r
+        private JTable jTableFpdModules = null;\r
+        private JButton jButtonUp = null;\r
+        private JButton jButtonInsert = null;\r
+        private JButton jButtonRemove = null;\r
+        private JButton jButtonDown = null;\r
+        private JButton jButtonOk = null;\r
+        private JButton jButtonCancel = null;\r
+        private IDefaultTableModel modInFvTableModel = null;\r
+        private IDefaultTableModel fpdModTableModel = null;\r
+//        private ArrayList<ModuleSAInfo> listTableModInFvModuleSAInfo = null;\r
+//        private ArrayList<ModuleSAInfo> listTableFpdModulesModuleSAInfo = null;\r
+        private String title = null;\r
+        private String outputFileName = null;\r
+        \r
+        public ModuleOrderPane(String tabTitle, String file) {\r
+            super(new BorderLayout());\r
+            title = tabTitle;\r
+            outputFileName = file;\r
+//            listTableModInFvModuleSAInfo = new ArrayList<ModuleSAInfo>();\r
+//            listTableFpdModulesModuleSAInfo = new ArrayList<ModuleSAInfo>();\r
+            add(getJPanelModOrderN(), java.awt.BorderLayout.NORTH);\r
+            add(getJPanelModOrderS(), java.awt.BorderLayout.SOUTH);\r
+            add(getJPanelModOrderC(), java.awt.BorderLayout.CENTER);\r
+            showModulesInFv(title);\r
+            showAllModulesInPlatform();\r
+        }\r
+        \r
+        private void showModulesInFv(String fvName) {\r
+            int size = ffc.getUserExtsIncModCount(fvName);\r
+            \r
+            if (size != -1) {\r
+                String[][] saa = new String[size][5];\r
+                ffc.getUserExtsIncMods(fvName, saa);\r
+\r
+                for (int i = 0; i < size; ++i) {\r
+                    String moduleKey = saa[i][0] + " " + saa[i][1] + " " + saa[i][2] + " " + saa[i][3];\r
+                    ModuleIdentification mi = WorkspaceProfile.getModuleId(moduleKey);\r
+                    String name = "N/A";\r
+                    if (mi != null) {\r
+                        name = mi.getName();\r
+                    }\r
+                    String[] row = { name, saa[i][0] , saa[i][1], saa[i][2] , saa[i][3], saa[i][4] };\r
+                    modInFvTableModel.addRow(row);\r
+                }\r
+            }\r
+            //\r
+            // From ModuleSAs, get module guids with FvBinding = fvName.\r
+            //\r
+            Vector<String[]> vModuleSA = new Vector<String[]>();\r
+            ffc.getFrameworkModuleSAByFvBinding(fvName, vModuleSA);\r
+            //\r
+            // If BuildOptions->UserExtensions already contain these module info,\r
+            // no need to add them into table again.\r
+            //\r
+            Iterator<String[]> iter = vModuleSA.iterator();\r
+            while (iter.hasNext()){\r
+                String[] sa = iter.next();\r
+                if (!moduleInfoInTable (sa, modInFvTableModel)) {\r
+                    String moduleKey = sa[0] + " " + sa[1] + " " + sa[2] + " " + sa[3];\r
+                    ModuleIdentification mi = WorkspaceProfile.getModuleId(moduleKey);\r
+                    String name = "N/A";\r
+                    if (mi != null) {\r
+                        name = mi.getName();\r
+                    }\r
+                    String[] row = { name, sa[0] , sa[1], sa[2] , sa[3], sa[4] };\r
+                    modInFvTableModel.addRow(row);\r
+                }\r
+            }\r
+\r
+        }\r
+        \r
+        private void showAllModulesInPlatform() {\r
+            int size = ffc.getFrameworkModulesCount();\r
+            String[][] saa = new String[size][5];\r
+            ffc.getFrameworkModulesInfo(saa);\r
+            \r
+            for (int i = 0; i < size; ++i) {\r
+                if (moduleInfoInTable(saa[i], modInFvTableModel) || moduleInfoInTable(saa[i], fpdModTableModel)) {\r
+                    continue;\r
+                }\r
+                String moduleKey = saa[i][0] + " " + saa[i][1] + " " + saa[i][2] + " " + saa[i][3];\r
+                ModuleIdentification mi = WorkspaceProfile.getModuleId(moduleKey);\r
+                String name = "N/A";\r
+                if (mi != null) {\r
+                    name = mi.getName();\r
+                }\r
+                String[] row = { name, saa[i][0] , saa[i][1], saa[i][2] , saa[i][3], saa[i][4] };\r
+                fpdModTableModel.addRow(row);\r
+            }\r
+            \r
+            TableSorter sorter = (TableSorter)jTableFpdModules.getModel();\r
+            sorter.setSortState(0, TableSorter.ASCENDING);\r
+        }\r
+        \r
+        \r
+        private boolean moduleInfoInTable (String[] moduleInfo, DefaultTableModel model) {\r
+            boolean matched = false;\r
+            int size = model.getDataVector().size();\r
+            for (int i = 0; i < size; ++i) {\r
+                Vector rowData = (Vector)model.getDataVector().elementAt(i);\r
+                for (int j = 1; j < rowData.size(); ++j) {\r
+                    if (rowData.elementAt(j) == null && moduleInfo[j-1] == null) {\r
+                        matched = true;\r
+                    }\r
+                    else if (rowData.elementAt(j).equals("null") && moduleInfo[j-1] == null) {\r
+                        matched = true;\r
+                    }\r
+                    else if (rowData.elementAt(j) == null && moduleInfo[j-1].equals("null")) {\r
+                        matched = true;\r
+                    }\r
+                    else if (rowData.elementAt(j) != null && rowData.elementAt(j).toString().equalsIgnoreCase(moduleInfo[j-1])) {\r
+                        matched = true;\r
+                    }\r
+                    else {\r
+                        matched = false;\r
+                        break;\r
+                    }\r
+                }\r
+                \r
+                if (matched) {\r
+                    return true;\r
+                }\r
+                \r
+            }\r
+            return false;\r
+        }\r
+        \r
+        \r
+        \r
+        /**\r
+         * This method initializes jPanelModOrderN  \r
+         *  \r
+         * @return javax.swing.JPanel   \r
+         */\r
+        private JPanel getJPanelModOrderN() {\r
+            if (jPanelModOrderN == null) {\r
+                jPanelModOrderN = new JPanel();\r
+            }\r
+            return jPanelModOrderN;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jPanelModOrderS  \r
+         *  \r
+         * @return javax.swing.JPanel   \r
+         */\r
+        private JPanel getJPanelModOrderS() {\r
+            if (jPanelModOrderS == null) {\r
+                FlowLayout flowLayout6 = new FlowLayout();\r
+                flowLayout6.setAlignment(java.awt.FlowLayout.RIGHT);\r
+                jPanelModOrderS = new JPanel();\r
+                jPanelModOrderS.setLayout(flowLayout6);\r
+                jPanelModOrderS.add(getJButtonOk(), null);\r
+                jPanelModOrderS.add(getJButtonCancel(), null);\r
+            }\r
+            return jPanelModOrderS;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jPanelModOrderC  \r
+         *  \r
+         * @return javax.swing.JPanel   \r
+         */\r
+        private JPanel getJPanelModOrderC() {\r
+            if (jPanelModOrderC == null) {\r
+                jPanelModOrderC = new JPanel();\r
+                jPanelModOrderC.add(getJScrollPaneModInFv(), null);\r
+                jPanelModOrderC.add(getJPanelController(), null);\r
+                jPanelModOrderC.add(getJScrollPaneFpdModules(), null);\r
+            }\r
+            return jPanelModOrderC;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jScrollPaneModInFv   \r
+         *  \r
+         * @return javax.swing.JScrollPane  \r
+         */\r
+        private JScrollPane getJScrollPaneModInFv() {\r
+            if (jScrollPaneModInFv == null) {\r
+                jScrollPaneModInFv = new JScrollPane();\r
+                jScrollPaneModInFv.setPreferredSize(new java.awt.Dimension(200,500));\r
+                jScrollPaneModInFv.setViewportView(getJTableModInFv());\r
+            }\r
+            return jScrollPaneModInFv;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jTableModInFv    \r
+         *  \r
+         * @return javax.swing.JTable   \r
+         */\r
+        private JTable getJTableModInFv() {\r
+            if (jTableModInFv == null) {\r
+                modInFvTableModel = new IDefaultTableModel();\r
+                \r
+                jTableModInFv = new JTable(modInFvTableModel){\r
+                    /**\r
+                     * \r
+                     */\r
+                    private static final long serialVersionUID = 4903583933542581721L;\r
+\r
+                    public String getToolTipText(MouseEvent e) {\r
+                        String tip = null;\r
+                        java.awt.Point p = e.getPoint();\r
+                        int rowIndex = rowAtPoint(p);\r
+//                        int colIndex = columnAtPoint(p);\r
+//                        int realColumnIndex = convertColumnIndexToModel(colIndex);\r
+\r
+                        TableModel model = getModel();\r
+                        String mg = (String) model.getValueAt(rowIndex, 1);\r
+                        String mv = (String) model.getValueAt(rowIndex, 2);\r
+                        String pg = (String) model.getValueAt(rowIndex, 3);\r
+                        String pv = (String) model.getValueAt(rowIndex, 4);\r
+                        String arch = (String) model.getValueAt(rowIndex, 5);\r
+                        ModuleIdentification mi = WorkspaceProfile.getModuleId(mg + " " + mv + " " + pg + " " + pv);\r
+                        if (mi != null) {\r
+                            tip = "Path: " + mi.getPath() + "; Arch: " + arch + ";";\r
+                        }\r
+                        else {\r
+                            tip = "No Module Path Information."; \r
+                        }\r
+                             \r
+                        return tip;\r
+                    }\r
+\r
+                };\r
+                modInFvTableModel.addColumn("Module Orders in FV");\r
+                modInFvTableModel.addColumn("mg");\r
+                modInFvTableModel.addColumn("mv");\r
+                modInFvTableModel.addColumn("pg");\r
+                modInFvTableModel.addColumn("pv");\r
+                modInFvTableModel.addColumn("arch");\r
+                \r
+                for (int i = 1; i < 6; ++i) {\r
+                    jTableModInFv.removeColumn(jTableModInFv.getColumnModel().getColumn(jTableModInFv.getColumnCount()-1));\r
+                }\r
+                \r
+                jTableModInFv.setRowHeight(20);\r
+                jTableModInFv.setShowGrid(false);\r
+                jTableModInFv.setAutoCreateColumnsFromModel(false);\r
+                jTableModInFv.addMouseListener(new MouseAdapter() {\r
+\r
+                    /* (non-Javadoc)\r
+                     * @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)\r
+                     */\r
+                    @Override\r
+                    public void mouseClicked(MouseEvent arg0) {\r
+                        if (arg0.getButton() == MouseEvent.BUTTON3) {\r
+                            java.awt.Point p = arg0.getPoint();\r
+                            int rowIndex = jTableModInFv.rowAtPoint(p);\r
+                            TableModel model = jTableModInFv.getModel();\r
+                            String mg = (String) model.getValueAt(rowIndex, 1);\r
+                            String mv = (String) model.getValueAt(rowIndex, 2);\r
+                            String pg = (String) model.getValueAt(rowIndex, 3);\r
+                            String pv = (String) model.getValueAt(rowIndex, 4);\r
+                            ModuleIdentification mi = WorkspaceProfile.getModuleId(mg + " " + mv + " " + pg + " " + pv);\r
+                            String details = "PackageGuid: " + pg + "; ModuleVer:" + mv + "; PkgVer:" + pv;\r
+                            if (mi != null) {\r
+                                details = "In Package " + mi.getPackageId().getName() + "; ModuleVer:" + mv + "; PkgVer:" + pv;\r
+                            }\r
+                            JOptionPane.showMessageDialog(frame, details);\r
+                        }\r
+                    }\r
+                    \r
+                });\r
+            }\r
+            return jTableModInFv;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jPanelController \r
+         *  \r
+         * @return javax.swing.JPanel   \r
+         */\r
+        private JPanel getJPanelController() {\r
+            if (jPanelController == null) {\r
+                FlowLayout flowLayout5 = new FlowLayout();\r
+                flowLayout5.setVgap(50);\r
+                flowLayout5.setHgap(50);\r
+                jPanelController = new JPanel();\r
+                jPanelController.setLayout(flowLayout5);\r
+                jPanelController.setPreferredSize(new java.awt.Dimension(150,500));\r
+                jPanelController.add(getJButtonUp(), null);\r
+                jPanelController.add(getJButtonInsert(), null);\r
+                jPanelController.add(getJButtonRemove(), null);\r
+                jPanelController.add(getJButtonDown(), null);\r
+            }\r
+            return jPanelController;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jScrollPaneFpdModules    \r
+         *  \r
+         * @return javax.swing.JScrollPane  \r
+         */\r
+        private JScrollPane getJScrollPaneFpdModules() {\r
+            if (jScrollPaneFpdModules == null) {\r
+                jScrollPaneFpdModules = new JScrollPane();\r
+                jScrollPaneFpdModules.setPreferredSize(new java.awt.Dimension(200,500));\r
+                jScrollPaneFpdModules.setViewportView(getJTableFpdModules());\r
+            }\r
+            return jScrollPaneFpdModules;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jTableFpdModules \r
+         *  \r
+         * @return javax.swing.JTable   \r
+         */\r
+        private JTable getJTableFpdModules() {\r
+            if (jTableFpdModules == null) {\r
+                fpdModTableModel = new IDefaultTableModel();\r
+                TableSorter sorter = new TableSorter(fpdModTableModel);\r
+                jTableFpdModules = new JTable(sorter){\r
+                    /**\r
+                     * \r
+                     */\r
+                    private static final long serialVersionUID = -4666296888377637808L;\r
+\r
+                    public String getToolTipText(MouseEvent e) {\r
+                        String tip = null;\r
+                        java.awt.Point p = e.getPoint();\r
+                        int rowIndex = rowAtPoint(p);\r
+//                        int colIndex = columnAtPoint(p);\r
+//                        int realColumnIndex = convertColumnIndexToModel(colIndex);\r
+\r
+                        TableModel model = getModel();\r
+                        String mg = (String) model.getValueAt(rowIndex, 1);\r
+                        String mv = (String) model.getValueAt(rowIndex, 2);\r
+                        String pg = (String) model.getValueAt(rowIndex, 3);\r
+                        String pv = (String) model.getValueAt(rowIndex, 4);\r
+                        String arch = (String) model.getValueAt(rowIndex, 5);\r
+                        ModuleIdentification mi = WorkspaceProfile.getModuleId(mg + " " + mv + " " + pg + " " + pv);\r
+                        if (mi != null) {\r
+                            tip = "Path: " + mi.getPath() + "; Arch: " + arch + ";";\r
+                        }\r
+                        else {\r
+                            tip = "No Module Path Information."; \r
+                        }\r
+                             \r
+                        return tip;\r
+                    }\r
+\r
+                };\r
+                \r
+                fpdModTableModel.addColumn("Modules in Platform");\r
+                fpdModTableModel.addColumn("mg");\r
+                fpdModTableModel.addColumn("mv");\r
+                fpdModTableModel.addColumn("pg");\r
+                fpdModTableModel.addColumn("pv");\r
+                fpdModTableModel.addColumn("arch");\r
+                \r
+                for (int i = 1; i < 6; ++i) {\r
+                    jTableFpdModules.removeColumn(jTableFpdModules.getColumnModel().getColumn(jTableFpdModules.getColumnCount()-1));\r
+                }\r
+                jTableFpdModules.setRowHeight(20);\r
+                jTableFpdModules.setShowGrid(false);\r
+                jTableFpdModules.setAutoCreateColumnsFromModel(false);\r
+                jTableFpdModules.addMouseListener(new MouseAdapter() {\r
+\r
+                    /* (non-Javadoc)\r
+                     * @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)\r
+                     */\r
+                    @Override\r
+                    public void mouseClicked(MouseEvent arg0) {\r
+                        if (arg0.getButton() == MouseEvent.BUTTON3) {\r
+                            java.awt.Point p = arg0.getPoint();\r
+                            int rowIndex = jTableFpdModules.rowAtPoint(p);\r
+                            TableModel model = jTableFpdModules.getModel();\r
+                            String mg = (String) model.getValueAt(rowIndex, 1);\r
+                            String mv = (String) model.getValueAt(rowIndex, 2);\r
+                            String pg = (String) model.getValueAt(rowIndex, 3);\r
+                            String pv = (String) model.getValueAt(rowIndex, 4);\r
+                            ModuleIdentification mi = WorkspaceProfile.getModuleId(mg + " " + mv + " " + pg + " " + pv);\r
+                            String details = "PackageGuid: " + pg + "; ModuleVer:" + mv + "; PkgVer:" + pv;\r
+                            if (mi != null) {\r
+                                details = "In Package " + mi.getPackageId().getName() + "; ModuleVer:" + mv + "; PkgVer:" + pv;\r
+                            }\r
+                            JOptionPane.showMessageDialog(frame, details);\r
+                        }\r
+                    }\r
+                    \r
+                });\r
+\r
+            }\r
+            return jTableFpdModules;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jButtonUp    \r
+         *  \r
+         * @return javax.swing.JButton  \r
+         */\r
+        private JButton getJButtonUp() {\r
+            if (jButtonUp == null) {\r
+                jButtonUp = new JButton();\r
+                jButtonUp.setPreferredSize(new java.awt.Dimension(60,20));\r
+                jButtonUp.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 14));\r
+                jButtonUp.setText("^");\r
+                jButtonUp.addActionListener(new java.awt.event.ActionListener() {\r
+                    public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                        int selectedRow = jTableModInFv.getSelectedRow();\r
+                        if (selectedRow <= 0) {\r
+                            return;\r
+                        }\r
+                        modInFvTableModel.moveRow(selectedRow, selectedRow, selectedRow - 1);\r
+                        jTableModInFv.changeSelection(selectedRow - 1, 0, false, false);\r
+                    }\r
+                });\r
+            }\r
+            return jButtonUp;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jButtonInsert    \r
+         *  \r
+         * @return javax.swing.JButton  \r
+         */\r
+        private JButton getJButtonInsert() {\r
+            if (jButtonInsert == null) {\r
+                jButtonInsert = new JButton();\r
+                jButtonInsert.setText("<<");\r
+                jButtonInsert.setPreferredSize(new java.awt.Dimension(60,20));\r
+                jButtonInsert.addActionListener(new java.awt.event.ActionListener() {\r
+                    public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                        int selectedRowRight = jTableFpdModules.getSelectedRow();\r
+                        if (selectedRowRight < 0) {\r
+                            return;\r
+                        }\r
+                        \r
+                        int rowInModel = ((TableSorter)jTableFpdModules.getModel()).getModelRowIndex(selectedRowRight);\r
+                        String name = fpdModTableModel.getValueAt(rowInModel, 0)+"";\r
+                        String mg = fpdModTableModel.getValueAt(rowInModel, 1)+"";\r
+                        String mv = fpdModTableModel.getValueAt(rowInModel, 2)+"";\r
+                        String pg = fpdModTableModel.getValueAt(rowInModel, 3)+"";\r
+                        String pv = fpdModTableModel.getValueAt(rowInModel, 4)+"";\r
+                        String arch = fpdModTableModel.getValueAt(rowInModel, 5)+"";\r
+                        String[] row = {name, mg, mv, pg, pv, arch};\r
+                        if (name.length() == 0 || name.equals("N/A")) {\r
+                            return;\r
+                        }\r
+                        \r
+                        int selectedRowLeft = jTableModInFv.getSelectedRow();\r
+                        if (selectedRowLeft < 0) {\r
+                            modInFvTableModel.addRow(row);\r
+                            jTableModInFv.changeSelection(jTableModInFv.getRowCount() - 1, 0, false, false);\r
+                        }\r
+                        else {\r
+                            modInFvTableModel.insertRow(selectedRowLeft, row);\r
+                            jTableModInFv.changeSelection(selectedRowLeft, 0, false, false);\r
+                        }\r
+                        fpdModTableModel.removeRow(rowInModel);\r
+                    }\r
+                });\r
+            }\r
+            return jButtonInsert;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jButtonRemove    \r
+         *  \r
+         * @return javax.swing.JButton  \r
+         */\r
+        private JButton getJButtonRemove() {\r
+            if (jButtonRemove == null) {\r
+                jButtonRemove = new JButton();\r
+                jButtonRemove.setPreferredSize(new java.awt.Dimension(60,20));\r
+                jButtonRemove.setText(">>");\r
+                jButtonRemove.addActionListener(new java.awt.event.ActionListener() {\r
+                    public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                        int selectedRowLeft = jTableModInFv.getSelectedRow();\r
+                        if (selectedRowLeft < 0) {\r
+                            return;\r
+                        }\r
+                        \r
+                        String name = modInFvTableModel.getValueAt(selectedRowLeft, 0)+"";\r
+                        String mg = modInFvTableModel.getValueAt(selectedRowLeft, 1)+"";\r
+                        String mv = modInFvTableModel.getValueAt(selectedRowLeft, 2)+"";\r
+                        String pg = modInFvTableModel.getValueAt(selectedRowLeft, 3)+"";\r
+                        String pv = modInFvTableModel.getValueAt(selectedRowLeft, 4)+"";\r
+                        String arch = modInFvTableModel.getValueAt(selectedRowLeft, 5)+"";\r
+                        String[] row = {name, mg, mv, pg, pv, arch};\r
+                        if (name.length() == 0 || name.equals("N/A")) {\r
+                            return;\r
+                        }\r
+                        \r
+                        fpdModTableModel.addRow(row);\r
+                        int viewIndex = ((TableSorter) jTableFpdModules.getModel()).getViewIndexArray()[jTableFpdModules\r
+                                                                                                                        .getRowCount() - 1];\r
+                        jTableFpdModules.changeSelection(viewIndex, 0, false, false);\r
+                        modInFvTableModel.removeRow(selectedRowLeft);\r
+                    }\r
+                });\r
+            }\r
+            return jButtonRemove;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jButtonDown  \r
+         *  \r
+         * @return javax.swing.JButton  \r
+         */\r
+        private JButton getJButtonDown() {\r
+            if (jButtonDown == null) {\r
+                jButtonDown = new JButton();\r
+                jButtonDown.setPreferredSize(new java.awt.Dimension(60,20));\r
+                jButtonDown.setFont(new java.awt.Font("Dialog", java.awt.Font.BOLD, 10));\r
+                jButtonDown.setText("v");\r
+                jButtonDown.addActionListener(new java.awt.event.ActionListener() {\r
+                    public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                        int selectedRow = jTableModInFv.getSelectedRow();\r
+                        if (selectedRow >= jTableModInFv.getRowCount() - 1) {\r
+                            return;\r
+                        }\r
+                        modInFvTableModel.moveRow(selectedRow, selectedRow, selectedRow + 1);\r
+                        jTableModInFv.changeSelection(selectedRow + 1, 0, false, false);\r
+                    }\r
+                });\r
+            }\r
+            return jButtonDown;\r
+        }\r
+        \r
+        /**\r
+         * This method initializes jButtonOk    \r
+         *  \r
+         * @return javax.swing.JButton  \r
+         */\r
+        private JButton getJButtonOk() {\r
+            if (jButtonOk == null) {\r
+                jButtonOk = new JButton();\r
+                jButtonOk.setPreferredSize(new java.awt.Dimension(80,20));\r
+                jButtonOk.setText("Ok");\r
+                jButtonOk.addActionListener(new java.awt.event.ActionListener() {\r
+                    public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                        // need reset FvBindings in ModuleSA.\r
+                        ffc.removeFvBindingAll(title);\r
+                        //\r
+                        // collect module order information to store them into <BuildOptions> -> <UserExtensions>.\r
+                        // also update the FvBinding info in <ModuleSA>.\r
+                        //\r
+                        Vector<String[]> vModInFv = new Vector<String[]>();\r
+                        for (int i = 0; i < jTableModInFv.getRowCount(); ++i) {\r
+                            String moduleName = modInFvTableModel.getValueAt(i, 0)+"";\r
+                            if (moduleName.length() == 0 || moduleName.equals("N/A")) {\r
+                                continue;\r
+                            }\r
+                            \r
+                            String mg = modInFvTableModel.getValueAt(i, 1)+"";\r
+                            String mv = modInFvTableModel.getValueAt(i, 2)+"";\r
+                            String pg = modInFvTableModel.getValueAt(i, 3)+"";\r
+                            String pv = modInFvTableModel.getValueAt(i, 4)+"";\r
+                            String arch = modInFvTableModel.getValueAt(i, 5)+"";\r
+                           \r
+                            String moduleInfo = mg + " " + mv + " " + pg + " " + pv + " " + arch;\r
+                                \r
+                            String[] sa = { mg, mv, pg, pv, arch};\r
+                            vModInFv.add(sa);\r
+                            ffc.updateFvBindingInModuleSA(moduleInfo, title);\r
+                            \r
+                        }\r
+                        ffc.removeBuildOptionsUserExtensions(title);\r
+                        ffc.genBuildOptionsUserExtensions(title, outputFileName, vModInFv);\r
+                        \r
+                        docConsole.setSaved(false);\r
+                        jTabbedPane.setSelectedIndex(0);\r
+                    }\r
+                });\r
+            }\r
+            return jButtonOk;\r
+        }\r
+\r
+        /**\r
+         * This method initializes jButtonCancel    \r
+         *  \r
+         * @return javax.swing.JButton  \r
+         */\r
+        private JButton getJButtonCancel() {\r
+            if (jButtonCancel == null) {\r
+                jButtonCancel = new JButton();\r
+                jButtonCancel.setPreferredSize(new java.awt.Dimension(80,20));\r
+                jButtonCancel.setText("Cancel");\r
+                jButtonCancel.addActionListener(new java.awt.event.ActionListener() {\r
+                    public void actionPerformed(java.awt.event.ActionEvent e) {\r
+                        jTabbedPane.setSelectedIndex(0);\r
+                    }\r
+                });\r
+            }\r
+            return jButtonCancel;\r
+        }\r
+    }\r
 \r
 }  //  @jve:decl-index=0:visual-constraint="10,10"\r
 \r
+class FvOptsTableModel extends DefaultTableModel {\r
+\r
+    private static final long serialVersionUID = 1L;\r
+    \r
+    private Vector<Object> vNonEditableName = new Vector<Object>();\r
+    private Vector<Object> vKeyWords = new Vector<Object>();\r
+    \r
+    public boolean isCellEditable(int row, int col) {\r
+        if (vNonEditableName.size() > 0 || vKeyWords.size() > 0) {\r
+            if (vKeyWords.contains(getValueAt(row, 0))) {\r
+                return false;\r
+            }\r
+            if (vNonEditableName.contains(getValueAt(row, 0)) && col == 0) {\r
+                return false;\r
+            }\r
+        }  \r
+       \r
+        return true;\r
+    }\r
+\r
+    /**\r
+     * @return Returns the vKeyWords.\r
+     */\r
+    protected Vector<Object> getVKeyWords() {\r
+        return vKeyWords;\r
+    }\r
+\r
+    /**\r
+     * @param keyWords The vKeyWords to set.\r
+     */\r
+    protected void setVKeyWords(Vector<Object> keyWords) {\r
+        vKeyWords.removeAllElements();\r
+        vKeyWords.addAll(keyWords);\r
+    }\r
+\r
+    /**\r
+     * @return Returns the vNonEditableName.\r
+     */\r
+    protected Vector<Object> getVNonEditableName() {\r
+        return vNonEditableName;\r
+    }\r
+\r
+    /**\r
+     * @param nonEditableName The vNonEditableName to set.\r
+     */\r
+    protected void setVNonEditableName(Vector<Object> nonEditableName) {\r
+        vNonEditableName.removeAllElements();\r
+        vNonEditableName.addAll(nonEditableName);\r
+    }\r
+    \r
+}\r
 class ImageParaTableModel extends DefaultTableModel {\r
 \r
     private static final long serialVersionUID = 1L;\r
     \r
    public boolean isCellEditable(int row, int col) {\r
-        if (getValueAt(row, 1).equals("ImageName") && col >=1) {\r
-            return false;\r
-        }\r
-        return true;\r
+//        if (getValueAt(row, 1).equals("ImageName") && col >=1) {\r
+//            return false;\r
+//        }\r
+//        return true;\r
+       return false;\r
     }\r
 }\r
 \r