4b9924c32a38aa133b4e40945998ee3135513c47
[people/mcb30/edk2.git] / edk2 / Tools / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / packaging / ui / SpdPcdDefs.java
1 /** @file\r
2   Java class SpdPcdDefs is GUI for create PCD definition elements of spd file.\r
3  \r
4 Copyright (c) 2006, Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution.  The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9 \r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 **/\r
13 package org.tianocore.frameworkwizard.packaging.ui;\r
14 \r
15 import java.awt.Dimension;\r
16 import java.awt.event.ActionEvent;\r
17 import java.awt.event.ComponentEvent;\r
18 \r
19 import javax.swing.DefaultCellEditor;\r
20 import javax.swing.JFrame;\r
21 import javax.swing.JOptionPane;\r
22 import javax.swing.JPanel;\r
23 import javax.swing.JLabel;\r
24 import javax.swing.JTextField;\r
25 import javax.swing.JComboBox;\r
26 import javax.swing.JButton;\r
27 import javax.swing.ListSelectionModel;\r
28 \r
29 import javax.swing.event.InternalFrameAdapter;\r
30 import javax.swing.event.InternalFrameEvent;\r
31 import javax.swing.event.ListSelectionEvent;\r
32 import javax.swing.event.ListSelectionListener;\r
33 import javax.swing.event.TableModelEvent;\r
34 import javax.swing.event.TableModelListener;\r
35 import javax.swing.table.DefaultTableModel;\r
36 import javax.swing.table.TableColumn;\r
37 import javax.swing.table.TableModel;\r
38 \r
39 import org.tianocore.PackageSurfaceAreaDocument;\r
40 \r
41 import org.tianocore.frameworkwizard.common.DataValidation;\r
42 import org.tianocore.frameworkwizard.common.Identifications.OpeningPackageType;\r
43 import org.tianocore.frameworkwizard.common.ui.IInternalFrame;\r
44 import org.tianocore.frameworkwizard.common.ui.StarLabel;\r
45 import javax.swing.JScrollPane;\r
46 import javax.swing.JTable;\r
47 import javax.swing.JCheckBox;\r
48 import org.tianocore.frameworkwizard.common.ui.iCheckBoxList.ICheckBoxList;\r
49 import org.tianocore.frameworkwizard.platform.ui.ListEditor;\r
50 \r
51 import java.awt.Rectangle;\r
52 import java.util.Vector;\r
53 \r
54 /**\r
55  GUI for create PCD definition elements of spd file\r
56   \r
57  @since PackageEditor 1.0\r
58 **/\r
59 public class SpdPcdDefs extends IInternalFrame implements TableModelListener{\r
60 \r
61     /**\r
62      * \r
63      */\r
64     private static final long serialVersionUID = 1L;\r
65 \r
66     static JFrame frame;\r
67     \r
68     private JPanel jContentPane = null;  \r
69 \r
70     private JLabel jLabelItemType = null;\r
71 \r
72     private JLabel jLabelC_Name = null;\r
73 \r
74     private JTextField jTextFieldC_Name = null;\r
75 \r
76     private JLabel jLabelToken = null;\r
77 \r
78     private JTextField jTextFieldToken = null;\r
79 \r
80     private JLabel jLabelDataType = null;\r
81 \r
82     private JButton jButtonOk = null;\r
83 \r
84     private JButton jButtonCancel = null;\r
85 \r
86     private JComboBox jComboBoxDataType = null;\r
87 \r
88     private SpdFileContents sfc = null;\r
89     \r
90     private OpeningPackageType docConsole = null;\r
91 \r
92     private StarLabel jStarLabel2 = null;\r
93 \r
94     private StarLabel jStarLabel3 = null;\r
95 \r
96     private StarLabel jStarLabel4 = null;\r
97 \r
98     private StarLabel jStarLabel = null;\r
99 \r
100     private StarLabel jStarLabel1 = null;\r
101 \r
102     private JLabel jLabelTokenSpace = null;\r
103 \r
104     private JTextField jTextFieldTsGuid = null;\r
105 \r
106     private JLabel jLabelVarVal = null;\r
107 \r
108     private JTextField jTextField = null;\r
109 \r
110     private JLabel jLabelDefVal = null;\r
111 \r
112     private JTextField jTextFieldDefaultValue = null;\r
113 \r
114     private JButton jButtonAdd = null;\r
115     \r
116     private CheckboxTableModel model = null;\r
117 \r
118     private JButton jButtonRemove = null;\r
119 \r
120     private JButton jButtonClearAll = null;\r
121 \r
122     private JScrollPane jScrollPane = null;\r
123 \r
124     private JTable jTable = null;\r
125     \r
126     private JScrollPane topScrollPane = null;  //  @jve:decl-index=0:visual-constraint="390,10"\r
127     \r
128     private int selectedRow = -1;\r
129 \r
130     private StarLabel starLabel = null;\r
131 \r
132     private JCheckBox jCheckBox = null;\r
133 \r
134     private JCheckBox jCheckBox1 = null;\r
135 \r
136     private JCheckBox jCheckBox2 = null;\r
137 \r
138     private JCheckBox jCheckBox3 = null;\r
139 \r
140     private JCheckBox jCheckBox4 = null;\r
141 \r
142     private JScrollPane jScrollPane1 = null;\r
143 \r
144     private ICheckBoxList iCheckBoxList = null;\r
145 \r
146     private JScrollPane jScrollPane2 = null;\r
147 \r
148     private ICheckBoxList iCheckBoxList1 = null;\r
149 \r
150     private JLabel jLabel = null;\r
151 \r
152     private JLabel jLabel1 = null;\r
153 \r
154     /**\r
155      This method initializes this\r
156      \r
157      **/\r
158     private void initialize() {\r
159         this.setTitle("PCD Declarations");\r
160         this.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);\r
161 \r
162     }\r
163 \r
164     /**\r
165      This method initializes jTextFieldC_Name   \r
166         \r
167      @return javax.swing.JTextField     \r
168      **/\r
169     private JTextField getJTextFieldC_Name() {\r
170         if (jTextFieldC_Name == null) {\r
171             jTextFieldC_Name = new JTextField();\r
172             jTextFieldC_Name.setBounds(new java.awt.Rectangle(156,9,317,20));\r
173             jTextFieldC_Name.setPreferredSize(new java.awt.Dimension(315,20));\r
174         }\r
175         return jTextFieldC_Name;\r
176     }\r
177 \r
178     /**\r
179      This method initializes jTextFieldToken    \r
180         \r
181      @return javax.swing.JTextField     \r
182      **/\r
183     private JTextField getJTextFieldToken() {\r
184         if (jTextFieldToken == null) {\r
185             jTextFieldToken = new JTextField();\r
186             jTextFieldToken.setBounds(new java.awt.Rectangle(156,33,317,20));\r
187             jTextFieldToken.setPreferredSize(new java.awt.Dimension(315,20));\r
188         }\r
189         return jTextFieldToken;\r
190     }\r
191 \r
192     /**\r
193      This method initializes jButtonOk  \r
194         \r
195      @return javax.swing.JButton        \r
196      **/\r
197     private JButton getJButtonOk() {\r
198         if (jButtonOk == null) {\r
199             jButtonOk = new JButton();\r
200             jButtonOk.setText("OK");\r
201             jButtonOk.setBounds(new java.awt.Rectangle(279,276,90,20));\r
202             jButtonOk.setVisible(false);\r
203             jButtonOk.addActionListener(this);\r
204         }\r
205         return jButtonOk;\r
206     }\r
207 \r
208     /**\r
209      This method initializes jButtonCancel      \r
210         \r
211      @return javax.swing.JButton        \r
212      **/\r
213     private JButton getJButtonCancel() {\r
214         if (jButtonCancel == null) {\r
215             jButtonCancel = new JButton();\r
216             jButtonCancel.setText("Cancel");\r
217             jButtonCancel.setBounds(new java.awt.Rectangle(389,276,82,20));\r
218             jButtonCancel.setVisible(false);\r
219             jButtonCancel.addActionListener(this);\r
220         }\r
221         return jButtonCancel;\r
222     }\r
223 \r
224     /**\r
225      This method initializes jComboBoxDataType  \r
226         \r
227      @return javax.swing.JComboBox      \r
228      **/\r
229     private JComboBox getJComboBoxDataType() {\r
230         if (jComboBoxDataType == null) {\r
231             jComboBoxDataType = new JComboBox();\r
232             jComboBoxDataType.setBounds(new java.awt.Rectangle(156,84,110,20));\r
233         }\r
234         return jComboBoxDataType;\r
235     }\r
236 \r
237     /**\r
238      This is the default constructor\r
239      **/\r
240     public SpdPcdDefs() {\r
241         super();\r
242         init();\r
243         initialize();\r
244         \r
245     }\r
246 \r
247     public SpdPcdDefs(PackageSurfaceAreaDocument.PackageSurfaceArea inPsa) {\r
248         this();\r
249         sfc = new SpdFileContents(inPsa);\r
250         init(sfc);\r
251     }\r
252     \r
253     public SpdPcdDefs(OpeningPackageType opt) {\r
254         this(opt.getXmlSpd());\r
255         docConsole = opt;\r
256     }\r
257     /**\r
258      This method initializes this\r
259      \r
260      @return void\r
261      **/\r
262     private void init() {\r
263         this.setSize(500, 650);\r
264         this.setContentPane(getJContentPane());\r
265         this.addInternalFrameListener(new InternalFrameAdapter(){\r
266             public void internalFrameDeactivated(InternalFrameEvent e){\r
267                 if (jTable.isEditing()) {\r
268                     jTable.getCellEditor().stopCellEditing();\r
269                 }\r
270             }\r
271         });\r
272         initFrame();\r
273         this.setVisible(true);\r
274     }\r
275 \r
276     private void init(SpdFileContents sfc){\r
277         if (sfc.getSpdPcdDefinitionCount() == 0) {\r
278             return ;\r
279         }\r
280         String[][] saa = new String[sfc.getSpdPcdDefinitionCount()][8];\r
281         String[][] usage = new String[sfc.getSpdPcdDefinitionCount()][5];\r
282         Object[] rowData = new Object[13];\r
283         sfc.getSpdPcdDefinitions(saa, usage);\r
284         int i = 0;\r
285         while (i < saa.length) {\r
286            \r
287             for (int k = 0; k < 6; ++k) {\r
288                 rowData[k] = saa[i][k];\r
289             }\r
290             for (int m = 6; m < 11; ++m) {\r
291                 rowData[m] = new Boolean("false");\r
292             }\r
293             int j = 0;\r
294             while (j < 5) {\r
295                 if (usage[i][j] == null || usage[i][j].length()==0){\r
296                     ++j;\r
297                     continue;\r
298                 }\r
299                 if (usage[i][j].equals("FEATURE_FLAG")){\r
300                     rowData[6] = new Boolean("true");\r
301                 }\r
302                 if (usage[i][j].equals("FIXED_AT_BUILD")){\r
303                     rowData[7] = new Boolean("true");\r
304                 }\r
305                 if (usage[i][j].equals("PATCHABLE_IN_MODULE")){\r
306                     rowData[8] = new Boolean("true");\r
307                 }\r
308                 if (usage[i][j].equals("DYNAMIC")){\r
309                     rowData[9] = new Boolean("true");\r
310                 }\r
311                 if (usage[i][j].equals("DYNAMIC_EX")){\r
312                     rowData[10] = new Boolean("true");\r
313                 }\r
314                 \r
315                 ++j;\r
316             }\r
317             \r
318             rowData[11] = saa[i][6];\r
319             rowData[12] = saa[i][7];\r
320             \r
321             model.addRow(rowData);\r
322             \r
323             i++;\r
324         }\r
325         \r
326         \r
327         \r
328     }\r
329     \r
330     private JScrollPane getJContentPane(){\r
331         if (topScrollPane == null){\r
332             topScrollPane = new JScrollPane();\r
333             topScrollPane.setSize(new java.awt.Dimension(482,451));\r
334             topScrollPane.setViewportView(getJContentPane1());\r
335         }\r
336         return topScrollPane;\r
337     }\r
338     private JPanel getJContentPane1() {\r
339                 if (jContentPane == null) {     \r
340            \r
341             jLabel1 = new JLabel();\r
342             jLabel1.setBounds(new java.awt.Rectangle(241,192,89,16));\r
343             jLabel1.setText("Supported Arch");\r
344             jLabel1.setEnabled(true);\r
345             jLabel = new JLabel();\r
346             jLabel.setBounds(new java.awt.Rectangle(15,193,103,16));\r
347             jLabel.setText("Supported Module");\r
348             jLabel.setEnabled(true);\r
349             starLabel = new StarLabel();\r
350             starLabel.setBounds(new java.awt.Rectangle(2,134,10,20));\r
351             jLabelDefVal = new JLabel();\r
352             jLabelDefVal.setBounds(new java.awt.Rectangle(277,84,80,20));\r
353             jLabelDefVal.setText("Default Value");\r
354             jLabelVarVal = new JLabel();\r
355             jLabelVarVal.setBounds(new java.awt.Rectangle(11,133,84,20));\r
356             jLabelVarVal.setText("Valid Usage");\r
357             jLabelC_Name = new JLabel();\r
358             jLabelC_Name.setText("C_Name");\r
359             jLabelC_Name.setBounds(new java.awt.Rectangle(11,9,140,20));\r
360             jLabelTokenSpace = new JLabel();\r
361             jLabelTokenSpace.setBounds(new java.awt.Rectangle(11,58,140,20));\r
362             jLabelTokenSpace.setText("Token Space");\r
363             jLabelDataType = new JLabel();\r
364             jLabelDataType.setText("Data Type");\r
365             jLabelDataType.setBounds(new java.awt.Rectangle(11,83,140,20));\r
366             jLabelToken = new JLabel();\r
367             jLabelToken.setText("Token");\r
368             jLabelToken.setBounds(new java.awt.Rectangle(11,33,140,20));\r
369             jLabelItemType = new JLabel();\r
370             jLabelItemType.setText("Help Text");\r
371             jLabelItemType.setBounds(new java.awt.Rectangle(11,108,140,20));\r
372             \r
373             \r
374             jContentPane = new JPanel();\r
375             jContentPane.setLayout(null);\r
376             jContentPane.setPreferredSize(new java.awt.Dimension(479,375));\r
377             \r
378             jContentPane.add(jLabelItemType, null);\r
379             jContentPane.add(jLabelC_Name, null);\r
380             jContentPane.add(jLabelTokenSpace, null);\r
381             jContentPane.add(getJTextFieldTsGuid(), null);\r
382             jContentPane.add(jLabelVarVal, null);\r
383             jContentPane.add(getJTextFieldC_Name(), null);\r
384             jContentPane.add(jLabelToken, null);\r
385             jContentPane.add(getJTextFieldToken(), null);\r
386             jContentPane.add(jLabelDataType, null);\r
387             jContentPane.add(getJButtonOk(), null);\r
388             jContentPane.add(getJButtonCancel(), null);\r
389             jContentPane.add(getJComboBoxDataType(), null);\r
390             \r
391             jStarLabel = new StarLabel();\r
392             jStarLabel1 = new StarLabel();\r
393             jStarLabel1.setBounds(new java.awt.Rectangle(2,8,10,20));\r
394             jStarLabel2 = new StarLabel();\r
395             jStarLabel3 = new StarLabel();\r
396             jStarLabel4 = new StarLabel();\r
397             jStarLabel.setLocation(new java.awt.Point(2,84));\r
398             jStarLabel4.setLocation(new java.awt.Point(2, 109));\r
399             jStarLabel2.setLocation(new java.awt.Point(2,33));\r
400             jStarLabel3.setLocation(new java.awt.Point(2, 58));\r
401             jStarLabel3.setSize(new java.awt.Dimension(8,20));\r
402             jContentPane.add(jStarLabel2, null);\r
403             jContentPane.add(jStarLabel3, null);\r
404             jContentPane.add(jStarLabel, null);\r
405             jContentPane.add(jStarLabel1, null);\r
406             jContentPane.add(jStarLabel4, null);\r
407             jContentPane.add(getJTextField(), null);\r
408             jContentPane.add(jLabelDefVal, null);\r
409             jContentPane.add(getJTextFieldDefaultValue(), null);\r
410             jContentPane.add(getJButtonAdd(), null);\r
411             jContentPane.add(getJButtonRemove(), null);\r
412             jContentPane.add(getJButtonClearAll(), null);\r
413             jContentPane.add(getJScrollPane(), null);\r
414             jContentPane.add(starLabel, null);\r
415             jContentPane.add(getJCheckBox(), null);\r
416             jContentPane.add(getJCheckBox1(), null);\r
417             jContentPane.add(getJCheckBox2(), null);\r
418             jContentPane.add(getJCheckBox3(), null);\r
419             jContentPane.add(getJCheckBox4(), null);\r
420             jContentPane.add(getJScrollPane1(), null);\r
421             jContentPane.add(getJScrollPane2(), null);\r
422             jContentPane.add(jLabel, null);\r
423             jContentPane.add(jLabel1, null);\r
424         }\r
425         return jContentPane;\r
426     }\r
427 \r
428     /**\r
429      This method initializes comboboxes                 \r
430                         jContentPane.add(jLabelTokenSpace, null);\r
431     \r
432      **/\r
433     private void initFrame() {\r
434 \r
435         jComboBoxDataType.addItem("UINT8");\r
436         jComboBoxDataType.addItem("UINT16");\r
437         jComboBoxDataType.addItem("UINT32");\r
438         jComboBoxDataType.addItem("UINT64");\r
439         jComboBoxDataType.addItem("VOID*");\r
440         jComboBoxDataType.addItem("BOOLEAN");\r
441         jComboBoxDataType.setSelectedIndex(0);\r
442     }\r
443 \r
444     public void actionPerformed(ActionEvent arg0) {\r
445         \r
446         docConsole.setSaved(false);\r
447             if (arg0.getSource() == jButtonOk) {\r
448                 this.save();\r
449                 this.dispose();\r
450             }\r
451             if (arg0.getSource() == jButtonCancel) {\r
452                 this.dispose();\r
453             }\r
454 \r
455             if (arg0.getSource() == jButtonAdd) {\r
456                 //ToDo: check before add\r
457                 boolean[] b = {jCheckBox.isSelected(), jCheckBox1.isSelected(), jCheckBox2.isSelected(), jCheckBox3.isSelected(), jCheckBox4.isSelected()};\r
458                 if (!checkValidUsage(b)) {\r
459                     return;\r
460                 }\r
461                 String archList = vectorToString(iCheckBoxList.getAllCheckedItemsString());\r
462                 if (archList.length() == 0) {\r
463                     archList = null;\r
464                 }\r
465                 String modTypeList = vectorToString(iCheckBoxList1.getAllCheckedItemsString());\r
466                 if (modTypeList.length() == 0) {\r
467                     modTypeList = null;\r
468                 }\r
469                 Object[] row = {jTextFieldC_Name.getText(), jTextFieldToken.getText(),\r
470                                 jTextFieldTsGuid.getText(), jComboBoxDataType.getSelectedItem(), \r
471                                 jTextFieldDefaultValue.getText(), jTextField.getText(),\r
472                                 jCheckBox.isSelected(), jCheckBox1.isSelected(),\r
473                                 jCheckBox2.isSelected(), jCheckBox3.isSelected(), jCheckBox4.isSelected(),\r
474                                 archList, modTypeList};\r
475                 if (!dataValidation(row)) {\r
476                     return;\r
477                 }\r
478                 model.addRow(row);\r
479                 jTable.changeSelection(model.getRowCount()-1, 0, false, false);\r
480                 String usage = getValidUsage(jCheckBox.isSelected(), jCheckBox1.isSelected(), jCheckBox2.isSelected(), jCheckBox3.isSelected(), jCheckBox4.isSelected());\r
481                 if (usage.length() == 0) {\r
482                     usage = null;\r
483                 }\r
484                 sfc.genSpdPcdDefinitions(row[0]+"", row[1]+"", row[3]+"", usage, row[2]+"", row[4]+"", row[5]+"", archList, modTypeList);\r
485             }\r
486             //\r
487             // remove selected line\r
488             //\r
489             if (arg0.getSource() == jButtonRemove) {\r
490                 if (jTable.isEditing()){\r
491                     jTable.getCellEditor().stopCellEditing();\r
492                 }\r
493                 int rowSelected = selectedRow;\r
494                 if (rowSelected >= 0) {\r
495                     model.removeRow(rowSelected);\r
496                     sfc.removeSpdPcdDefinition(rowSelected);\r
497                 }\r
498             }\r
499 \r
500             if (arg0.getSource() == jButtonClearAll) {\r
501                 if (model.getRowCount() == 0) {\r
502                     return;\r
503                 }\r
504                 model.setRowCount(0);\r
505                 sfc.removeSpdPcdDefinition();\r
506             }\r
507             \r
508     }\r
509 \r
510     protected void save() {\r
511         \r
512     }\r
513 \r
514     /**\r
515      * This method initializes jTextFieldTsGuid \r
516      *  \r
517      * @return javax.swing.JTextField   \r
518      */\r
519     private JTextField getJTextFieldTsGuid() {\r
520         if (jTextFieldTsGuid == null) {\r
521             jTextFieldTsGuid = new JTextField();\r
522             jTextFieldTsGuid.setPreferredSize(new java.awt.Dimension(315,20));\r
523             jTextFieldTsGuid.setSize(new java.awt.Dimension(317,20));\r
524             jTextFieldTsGuid.setLocation(new java.awt.Point(156,58));\r
525         }\r
526         return jTextFieldTsGuid;\r
527     }\r
528 \r
529     /**\r
530      * This method initializes jTextField       \r
531      *  \r
532      * @return javax.swing.JTextField   \r
533      */\r
534     private JTextField getJTextField() {\r
535         if (jTextField == null) {\r
536             jTextField = new JTextField();\r
537             jTextField.setBounds(new java.awt.Rectangle(156,108,317,20));\r
538             jTextField.setPreferredSize(new java.awt.Dimension(315,20));\r
539         }\r
540         return jTextField;\r
541     }\r
542 \r
543     /**\r
544      * This method initializes jTextFieldDefaultValue   \r
545      *  \r
546      * @return javax.swing.JTextField   \r
547      */\r
548     private JTextField getJTextFieldDefaultValue() {\r
549         if (jTextFieldDefaultValue == null) {\r
550             jTextFieldDefaultValue = new JTextField();\r
551             jTextFieldDefaultValue.setBounds(new java.awt.Rectangle(368,84,105,20));\r
552             jTextFieldDefaultValue.setPreferredSize(new java.awt.Dimension(104,20));\r
553         }\r
554         return jTextFieldDefaultValue;\r
555     }\r
556 \r
557     /**\r
558      * This method initializes jButtonAdd       \r
559      *  \r
560      * @return javax.swing.JButton      \r
561      */\r
562     private JButton getJButtonAdd() {\r
563         if (jButtonAdd == null) {\r
564             jButtonAdd = new JButton();\r
565             jButtonAdd.setBounds(new java.awt.Rectangle(195,277,71,20));\r
566             jButtonAdd.setPreferredSize(new java.awt.Dimension(70,20));\r
567             jButtonAdd.setText("Add");\r
568             jButtonAdd.addActionListener(this);\r
569         }\r
570         return jButtonAdd;   \r
571         \r
572     }   \r
573     \r
574     /**\r
575      * This method initializes jButtonRemove    \r
576      *  \r
577      * @return javax.swing.JButton      \r
578      */\r
579     private JButton getJButtonRemove() {\r
580         if (jButtonRemove == null) {\r
581             jButtonRemove = new JButton();\r
582             jButtonRemove.setBounds(new java.awt.Rectangle(278,277,81,20));\r
583             jButtonRemove.setPreferredSize(new java.awt.Dimension(70,20));\r
584             jButtonRemove.setText("Delete");\r
585             jButtonRemove.addActionListener(this);\r
586         }\r
587         return jButtonRemove;\r
588     }\r
589 \r
590     /**\r
591      * This method initializes jButtonClearAll  \r
592      *  \r
593      * @return javax.swing.JButton      \r
594      */\r
595     private JButton getJButtonClearAll() {\r
596         if (jButtonClearAll == null) {\r
597             jButtonClearAll = new JButton();\r
598             jButtonClearAll.setBounds(new java.awt.Rectangle(382,277,90,20));\r
599             jButtonClearAll.setPreferredSize(new java.awt.Dimension(81,20));\r
600             jButtonClearAll.setText("Clear All");\r
601             jButtonClearAll.addActionListener(this);\r
602         }\r
603         return jButtonClearAll;\r
604     }\r
605 \r
606     public void componentResized(ComponentEvent arg0) {\r
607         int intPreferredWidth = 500;\r
608         \r
609         resizeComponentWidth(this.jTextFieldC_Name, this.getWidth(), intPreferredWidth);\r
610         resizeComponentWidth(this.jTextFieldToken, this.getWidth(), intPreferredWidth);\r
611         resizeComponentWidth(this.jTextFieldTsGuid, this.getWidth(), intPreferredWidth);\r
612         resizeComponentWidth(this.jTextFieldDefaultValue, this.getWidth(), intPreferredWidth);\r
613         resizeComponentWidth(this.jTextField, this.getWidth(), intPreferredWidth);\r
614         resizeComponentWidth(this.jScrollPane, this.getWidth(), intPreferredWidth);\r
615         \r
616         resizeComponentWidth(this.jTextFieldDefaultValue, this.getWidth(), intPreferredWidth);\r
617 //        relocateComponentX(this.jButtonClearAll, this.getWidth(), DataType.SPACE_TO_RIGHT_FOR_GENERATE_BUTTON);\r
618 //        relocateComponentX(this.jButtonRemove, this.getWidth(), DataType.SPACE_TO_RIGHT_FOR_GENERATE_BUTTON);\r
619 //        relocateComponentX(this.jButtonAdd, this.getWidth(), DataType.SPACE_TO_RIGHT_FOR_GENERATE_BUTTON);\r
620     }\r
621 \r
622     /**\r
623      * This method initializes jScrollPane      \r
624      *  \r
625      * @return javax.swing.JScrollPane  \r
626      */\r
627     private JScrollPane getJScrollPane() {\r
628         if (jScrollPane == null) {\r
629             jScrollPane = new JScrollPane();\r
630             jScrollPane.setBounds(new java.awt.Rectangle(5,301,1473,259));\r
631             jScrollPane.setViewportView(getJTable());\r
632         }\r
633         return jScrollPane;\r
634     }\r
635 \r
636     /**\r
637      * This method initializes jTable   \r
638      *  \r
639      * @return javax.swing.JTable       \r
640      */\r
641     private JTable getJTable() {\r
642         if (jTable == null) {\r
643             model = new CheckboxTableModel();\r
644             jTable = new JTable(model);\r
645             jTable.setRowHeight(20);\r
646             jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);\r
647             jTable.setSize(new Dimension(1000, 300));\r
648             \r
649             model.addColumn("C_Name");\r
650             model.addColumn("Token");\r
651             model.addColumn("TokenSpace");\r
652             model.addColumn("DatumType");\r
653             model.addColumn("DefaultValue");\r
654             model.addColumn("HelpText");\r
655             \r
656             model.addColumn("FeatureFlag");\r
657             model.addColumn("FixedAtBuild");\r
658             model.addColumn("PatchableInModule");\r
659             model.addColumn("Dynamic");\r
660             model.addColumn("DynamicEx");\r
661             model.addColumn("SupportedArch");\r
662             model.addColumn("SupportedModule");\r
663             \r
664             //ToDo: add a valid usage editor\r
665             \r
666             JComboBox jComboBoxDataType = new JComboBox();\r
667             jComboBoxDataType.addItem("UINT8");\r
668             jComboBoxDataType.addItem("UINT16");\r
669             jComboBoxDataType.addItem("UINT32");\r
670             jComboBoxDataType.addItem("UINT64");\r
671             jComboBoxDataType.addItem("VOID*");\r
672             jComboBoxDataType.addItem("BOOLEAN");\r
673             TableColumn dataTypeColumn = jTable.getColumnModel().getColumn(3);\r
674             dataTypeColumn.setCellEditor(new DefaultCellEditor(jComboBoxDataType));\r
675 \r
676             Vector<String> vArch = new Vector<String>();\r
677             vArch.add("IA32");\r
678             vArch.add("X64");\r
679             vArch.add("IPF");\r
680             vArch.add("EBC");\r
681             vArch.add("ARM");\r
682             vArch.add("PPC");\r
683             jTable.getColumnModel().getColumn(11).setCellEditor(new ListEditor(vArch));\r
684             \r
685             Vector<String> vModule = new Vector<String>();\r
686             vModule.add("BASE");\r
687             vModule.add("SEC");\r
688             vModule.add("PEI_CORE");\r
689             vModule.add("PEIM");\r
690             vModule.add("DXE_CORE");\r
691             vModule.add("DXE_DRIVER");\r
692             vModule.add("DXE_RUNTIME_DRIVER");\r
693             vModule.add("DXE_SAL_DRIVER");\r
694             vModule.add("DXE_SMM_DRIVER");\r
695             vModule.add("UEFI_DRIVER");\r
696             vModule.add("UEFI_APPLICATION");\r
697             vModule.add("USER_DEFINED");\r
698             jTable.getColumnModel().getColumn(12).setCellEditor(new ListEditor(vModule));\r
699             \r
700             jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
701             jTable.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
702                 public void valueChanged(ListSelectionEvent e) {\r
703                     if (e.getValueIsAdjusting()){\r
704                         return;\r
705                     }\r
706                     ListSelectionModel lsm = (ListSelectionModel)e.getSource();\r
707                     if (lsm.isSelectionEmpty()) {\r
708                         return;\r
709                     }\r
710                     else{\r
711                         selectedRow = lsm.getMinSelectionIndex();\r
712                     }\r
713                 }\r
714             });\r
715             \r
716             jTable.getModel().addTableModelListener(this);\r
717         }\r
718         return jTable;\r
719     }\r
720     \r
721     public void tableChanged(TableModelEvent arg0) {\r
722         // TODO Auto-generated method stub\r
723         int row = arg0.getFirstRow();\r
724         int column = arg0.getColumn();\r
725         TableModel m = (TableModel)arg0.getSource();\r
726         if (arg0.getType() == TableModelEvent.UPDATE){\r
727             String[] sa = new String[9];\r
728             sfc.getSpdPcdDeclaration(sa, row);\r
729             Object cellData = m.getValueAt(row, column);\r
730             if (column < 6) {\r
731                 \r
732                 if (cellData == null) {\r
733                     cellData = "";\r
734                 }\r
735                 if (cellData.equals(sa[column])) {\r
736                     return;\r
737                 }\r
738                 if (cellData.toString().length() == 0 && sa[column] == null) {\r
739                     return;\r
740                 }\r
741             }\r
742             \r
743             String usage = getValidUsage(new Boolean(m.getValueAt(row, 6)+""), new Boolean(m.getValueAt(row, 7)+""), new Boolean(m.getValueAt(row, 8)+""), new Boolean(m.getValueAt(row, 9)+""), new Boolean(m.getValueAt(row, 10)+""));\r
744             if (usage.length() == 0) {\r
745                 JOptionPane.showMessageDialog(frame, "You must choose at least one usage for PCD entry.");\r
746                 return;\r
747             }\r
748             if (column <= 10 && column >= 6) {\r
749                 if (compareTwoVectors(stringToVector(usage), stringToVector(sa[6]))) {\r
750                     return;\r
751                 }\r
752             }\r
753             \r
754             if (column == 11) {\r
755                 if (cellData == null) {\r
756                     cellData = "";\r
757                 }\r
758                 if (cellData.equals(sa[7])) {\r
759                     return;\r
760                 }\r
761                 if (cellData.toString().length() == 0 && sa[7] == null) {\r
762                     return;\r
763                 }\r
764             }\r
765             \r
766             if (column == 12) {\r
767                 if (cellData == null) {\r
768                     cellData = "";\r
769                 }\r
770                 if (cellData.equals(sa[8])) {\r
771                     return;\r
772                 }\r
773                 if (cellData.toString().length() == 0 && sa[8] == null) {\r
774                     return;\r
775                 }\r
776             }\r
777             String cName = m.getValueAt(row, 0) + "";\r
778             String token = m.getValueAt(row, 1) + "";\r
779             String ts = m.getValueAt(row, 2) + "";\r
780             String dataType = m.getValueAt(row, 3) + "";\r
781             String defaultVal = m.getValueAt(row, 4) + "";\r
782             String help = m.getValueAt(row, 5) + "";\r
783             \r
784             \r
785             String archList = null;\r
786             if (m.getValueAt(row, 11) != null){\r
787                 archList = m.getValueAt(row, 11).toString();\r
788             }\r
789             String modTypeList = null;\r
790             if (m.getValueAt(row, 12) != null) {\r
791                 modTypeList = m.getValueAt(row, 12).toString(); \r
792             }\r
793             \r
794             Object[] o = {cName, token, ts, dataType, defaultVal, help};\r
795             if (!dataValidation(o)){\r
796                 return;\r
797             }\r
798             docConsole.setSaved(false);\r
799             sfc.updateSpdPcdDefinition(row, cName, token, dataType, usage, ts, defaultVal, help, archList, modTypeList);\r
800         }\r
801     }\r
802 \r
803     /**\r
804      * This method initializes jCheckBox        \r
805      *  \r
806      * @return javax.swing.JCheckBox    \r
807      */\r
808     private JCheckBox getJCheckBox() {\r
809         if (jCheckBox == null) {\r
810             jCheckBox = new JCheckBox();\r
811             jCheckBox.setBounds(new java.awt.Rectangle(156,161,100,21));\r
812             jCheckBox.setText("Feature Flag");\r
813             jCheckBox.setPreferredSize(new java.awt.Dimension(21,20));\r
814         }\r
815         return jCheckBox;\r
816     }\r
817 \r
818     /**\r
819      * This method initializes jCheckBox1       \r
820      *  \r
821      * @return javax.swing.JCheckBox    \r
822      */\r
823     private JCheckBox getJCheckBox1() {\r
824         if (jCheckBox1 == null) {\r
825             jCheckBox1 = new JCheckBox();\r
826             jCheckBox1.setBounds(new java.awt.Rectangle(312,133,108,20));\r
827             jCheckBox1.setText("Fixed at Build");\r
828             jCheckBox1.setPreferredSize(new java.awt.Dimension(21,20));\r
829         }\r
830         return jCheckBox1;\r
831     }\r
832 \r
833     /**\r
834      * This method initializes jCheckBox2       \r
835      *  \r
836      * @return javax.swing.JCheckBox    \r
837      */\r
838     private JCheckBox getJCheckBox2() {\r
839         if (jCheckBox2 == null) {\r
840             jCheckBox2 = new JCheckBox();\r
841             jCheckBox2.setBounds(new java.awt.Rectangle(156,133,154,20));\r
842             jCheckBox2.setText("Patchable in Module");\r
843             jCheckBox2.setPreferredSize(new java.awt.Dimension(21,20));\r
844         }\r
845         return jCheckBox2;\r
846     }\r
847 \r
848     /**\r
849      * This method initializes jCheckBox3       \r
850      *  \r
851      * @return javax.swing.JCheckBox    \r
852      */\r
853     private JCheckBox getJCheckBox3() {\r
854         if (jCheckBox3 == null) {\r
855             jCheckBox3 = new JCheckBox();\r
856             jCheckBox3.setBounds(new java.awt.Rectangle(278,161,80,20));\r
857             jCheckBox3.setText("Dynamic");\r
858             jCheckBox3.setPreferredSize(new java.awt.Dimension(21,20));\r
859         }\r
860         return jCheckBox3;\r
861     }\r
862 \r
863     /**\r
864      * This method initializes jCheckBox4       \r
865      *  \r
866      * @return javax.swing.JCheckBox    \r
867      */\r
868     private JCheckBox getJCheckBox4() {\r
869         if (jCheckBox4 == null) {\r
870             jCheckBox4 = new JCheckBox();\r
871             jCheckBox4.setBounds(new java.awt.Rectangle(371,161,99,20));\r
872             jCheckBox4.setText("DynamicEx");\r
873             jCheckBox4.setPreferredSize(new java.awt.Dimension(21,20));\r
874         }\r
875         return jCheckBox4;\r
876     }\r
877     \r
878     private String getValidUsage(boolean ff, boolean fab, boolean pim, boolean d, boolean de) {\r
879         String usage = "";\r
880         if (ff){\r
881             usage += "FEATURE_FLAG ";\r
882         }\r
883         if (fab){\r
884             usage += "FIXED_AT_BUILD ";\r
885         }\r
886         if (pim){\r
887             usage += "PATCHABLE_IN_MODULE ";\r
888         }\r
889         if (d){\r
890             usage += "DYNAMIC ";\r
891         }\r
892         if (de){\r
893             usage += "DYNAMIC_EX ";\r
894         }\r
895         \r
896         return usage.trim();\r
897     }\r
898     \r
899     private boolean checkValidUsage(boolean[] b) {\r
900         if (!(b[0] || b[1] || b[2] || b[3] || b[4])){\r
901             JOptionPane.showMessageDialog(frame, "You must specify at least one usage.");\r
902             return false;\r
903         }\r
904         return true;\r
905     }\r
906     private boolean dataValidation(Object[] row) {\r
907         \r
908         if (!DataValidation.isC_NameType(row[0].toString())) {\r
909             JOptionPane.showMessageDialog(frame, "C_Name is NOT C_NameType.");\r
910             return false;\r
911         }\r
912         if (!(DataValidation.isHexDoubleWordDataType(row[1].toString()) || \r
913                         DataValidation.isInt(row[1].toString(), 0, 0xffffffff))) {\r
914             JOptionPane.showMessageDialog(frame, "Token is NOT correct.");\r
915             return false;\r
916         }\r
917         if (!DataValidation.isC_NameType(row[2].toString())) {\r
918             JOptionPane.showMessageDialog(frame, "Token Space is NOT C_NameType");\r
919             return false;\r
920         }\r
921         if (row[5].toString().length() == 0) {\r
922             JOptionPane.showMessageDialog(frame, "HelpText could NOT be empty.");\r
923             return false;\r
924         }\r
925         return true;\r
926     }\r
927 \r
928     /**\r
929      * This method initializes jScrollPane1     \r
930      *  \r
931      * @return javax.swing.JScrollPane  \r
932      */\r
933     private JScrollPane getJScrollPane1() {\r
934         if (jScrollPane1 == null) {\r
935             jScrollPane1 = new JScrollPane();\r
936             jScrollPane1.setBounds(new java.awt.Rectangle(242,213,188,54));\r
937             jScrollPane1.setViewportView(getICheckBoxList());\r
938             jScrollPane1.setPreferredSize(new Dimension(188, 74));\r
939         }\r
940         return jScrollPane1;\r
941     }\r
942 \r
943     /**\r
944      * This method initializes iCheckBoxList    \r
945      *  \r
946      * @return org.tianocore.frameworkwizard.common.ui.iCheckBoxList.ICheckBoxList      \r
947      */\r
948     private ICheckBoxList getICheckBoxList() {\r
949         if (iCheckBoxList == null) {\r
950             iCheckBoxList = new ICheckBoxList();\r
951             iCheckBoxList.setBounds(new Rectangle(197, 142, 188, 74));\r
952             Vector<String> v = new Vector<String>();\r
953             v.add("IA32");\r
954             v.add("X64");\r
955             v.add("IPF");\r
956             v.add("EBC");\r
957             v.add("ARM");\r
958             v.add("PPC");\r
959             iCheckBoxList.setAllItems(v);\r
960         }\r
961         return iCheckBoxList;\r
962     }\r
963 \r
964     /**\r
965      * This method initializes jScrollPane2     \r
966      *  \r
967      * @return javax.swing.JScrollPane  \r
968      */\r
969     private JScrollPane getJScrollPane2() {\r
970         if (jScrollPane2 == null) {\r
971             jScrollPane2 = new JScrollPane();\r
972             jScrollPane2.setBounds(new java.awt.Rectangle(15,213,199,55));\r
973             jScrollPane2.setViewportView(getICheckBoxList1());\r
974             jScrollPane2.setPreferredSize(new Dimension(170, 74));\r
975         }\r
976         return jScrollPane2;\r
977     }\r
978 \r
979     /**\r
980      * This method initializes iCheckBoxList1   \r
981      *  \r
982      * @return org.tianocore.frameworkwizard.common.ui.iCheckBoxList.ICheckBoxList      \r
983      */\r
984     private ICheckBoxList getICheckBoxList1() {\r
985         if (iCheckBoxList1 == null) {\r
986             iCheckBoxList1 = new ICheckBoxList();\r
987             iCheckBoxList1.setBounds(new Rectangle(14, 142, 170, 74));\r
988             Vector<String> v = new Vector<String>();\r
989             v.add("BASE");\r
990             v.add("SEC");\r
991             v.add("PEI_CORE");\r
992             v.add("PEIM");\r
993             v.add("DXE_CORE");\r
994             v.add("DXE_DRIVER");\r
995             v.add("DXE_RUNTIME_DRIVER");\r
996             v.add("DXE_SAL_DRIVER");\r
997             v.add("DXE_SMM_DRIVER");\r
998             v.add("UEFI_DRIVER");\r
999             v.add("UEFI_APPLICATION");\r
1000             v.add("USER_DEFINED");\r
1001             iCheckBoxList1.setAllItems(v);\r
1002         }\r
1003         return iCheckBoxList1;\r
1004     }\r
1005     \r
1006     protected String vectorToString(Vector<String> v) {\r
1007         if (v == null) {\r
1008             return null;\r
1009         }\r
1010         String s = " ";\r
1011         for (int i = 0; i < v.size(); ++i) {\r
1012             s += v.get(i);\r
1013             s += " ";\r
1014         }\r
1015         return s.trim();\r
1016     }\r
1017     \r
1018     protected Vector<String> stringToVector(String s){\r
1019         if (s == null) {\r
1020             return null;\r
1021         }\r
1022         String[] sArray = s.split(" ");\r
1023         Vector<String> v = new Vector<String>();\r
1024         for (int i = 0; i < sArray.length; ++i) {\r
1025             v.add(sArray[i]);\r
1026         }\r
1027         return v;\r
1028     }\r
1029     \r
1030     private boolean compareTwoVectors(Vector v1, Vector v2) {\r
1031         if (v1.size() != v2.size()) {\r
1032             return false;\r
1033         }\r
1034         for (int i = 0; i < v1.size(); ++i) {\r
1035             if (!v2.contains(v1.get(i))) {\r
1036                 return false;\r
1037             }\r
1038         }\r
1039         return true;\r
1040     }\r
1041 } //  @jve:decl-index=0:visual-constraint="22,11"\r
1042 \r
1043 class CheckboxTableModel extends DefaultTableModel {\r
1044     /**\r
1045      * \r
1046      */\r
1047     private static final long serialVersionUID = 1L;\r
1048 \r
1049     public Class<?> getColumnClass (int c) {\r
1050         if (getValueAt(0, c) != null){\r
1051             return getValueAt(0, c).getClass();\r
1052         }\r
1053         return String.class;\r
1054     }\r
1055 }\r