2 Java class SpdPcdDefs is GUI for create PCD definition elements of spd file.
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 package org
.tianocore
.frameworkwizard
.packaging
.ui
;
15 import java
.awt
.Dimension
;
16 import java
.awt
.FontMetrics
;
17 import java
.awt
.event
.ActionEvent
;
18 import java
.awt
.event
.ComponentEvent
;
20 import javax
.swing
.DefaultCellEditor
;
21 import javax
.swing
.JFrame
;
22 import javax
.swing
.JOptionPane
;
23 import javax
.swing
.JPanel
;
24 import javax
.swing
.JLabel
;
25 import javax
.swing
.JTextField
;
26 import javax
.swing
.JComboBox
;
27 import javax
.swing
.JButton
;
28 import javax
.swing
.ListSelectionModel
;
30 import javax
.swing
.event
.InternalFrameAdapter
;
31 import javax
.swing
.event
.InternalFrameEvent
;
32 import javax
.swing
.event
.ListSelectionEvent
;
33 import javax
.swing
.event
.ListSelectionListener
;
34 import javax
.swing
.event
.TableModelEvent
;
35 import javax
.swing
.event
.TableModelListener
;
36 import javax
.swing
.table
.DefaultTableModel
;
37 import javax
.swing
.table
.TableColumn
;
38 import javax
.swing
.table
.TableModel
;
40 import org
.tianocore
.PackageSurfaceAreaDocument
;
42 import org
.tianocore
.frameworkwizard
.common
.DataValidation
;
43 import org
.tianocore
.frameworkwizard
.common
.Tools
;
44 import org
.tianocore
.frameworkwizard
.common
.Identifications
.OpeningPackageType
;
45 import org
.tianocore
.frameworkwizard
.common
.ui
.IInternalFrame
;
46 import org
.tianocore
.frameworkwizard
.common
.ui
.StarLabel
;
47 import javax
.swing
.JScrollPane
;
48 import javax
.swing
.JTable
;
49 import javax
.swing
.JCheckBox
;
50 import org
.tianocore
.frameworkwizard
.common
.ui
.iCheckBoxList
.ICheckBoxList
;
51 import org
.tianocore
.frameworkwizard
.platform
.ui
.ListEditor
;
52 import org
.tianocore
.frameworkwizard
.platform
.ui
.LongTextEditor
;
54 import java
.awt
.Rectangle
;
55 import java
.util
.Vector
;
58 GUI for create PCD definition elements of spd file
60 @since PackageEditor 1.0
62 public class SpdPcdDefs
extends IInternalFrame
implements TableModelListener
{
67 private static final long serialVersionUID
= 1L;
71 private JPanel jContentPane
= null;
73 private JLabel jLabelItemType
= null;
75 private JLabel jLabelC_Name
= null;
77 private JTextField jTextFieldC_Name
= null;
79 private JLabel jLabelToken
= null;
81 private JTextField jTextFieldToken
= null;
83 private JLabel jLabelDataType
= null;
85 private JButton jButtonOk
= null;
87 private JButton jButtonCancel
= null;
89 private JComboBox jComboBoxDataType
= null;
91 private SpdFileContents sfc
= null;
93 private OpeningPackageType docConsole
= null;
95 private StarLabel jStarLabel2
= null;
97 private StarLabel jStarLabel3
= null;
99 private StarLabel jStarLabel4
= null;
101 private StarLabel jStarLabel
= null;
103 private StarLabel jStarLabel1
= null;
105 private JLabel jLabelTokenSpace
= null;
107 private JComboBox jComboBoxTsGuid
= null;
109 private JLabel jLabelVarVal
= null;
111 private JTextField jTextFieldHelp
= null;
113 private JLabel jLabelDefVal
= null;
115 private JTextField jTextFieldDefaultValue
= null;
117 private JButton jButtonAdd
= null;
119 private CheckboxTableModel model
= null;
121 private JButton jButtonRemove
= null;
123 private JButton jButtonClearAll
= null;
125 private JScrollPane jScrollPane
= null;
127 private JTable jTable
= null;
129 private JScrollPane topScrollPane
= null; // @jve:decl-index=0:visual-constraint="390,10"
131 private int selectedRow
= -1;
133 private StarLabel starLabel
= null;
135 private JCheckBox jCheckBoxFeatureFlag
= null;
137 private JCheckBox jCheckBoxFixedAtBuild
= null;
139 private JCheckBox jCheckBoxPatchInMod
= null;
141 private JCheckBox jCheckBoxDyn
= null;
143 private JCheckBox jCheckBoxDynEx
= null;
145 private JScrollPane jScrollPaneArch
= null;
147 private ICheckBoxList iCheckBoxListArch
= null;
149 private JScrollPane jScrollPaneMod
= null;
151 private ICheckBoxList iCheckBoxListMod
= null;
153 private JLabel jLabelSupMod
= null;
155 private JLabel jLabelSupArch
= null;
157 private final int pcdCNameMinWidth
= 200;
158 private final int pcdTokenMinWidth
= 100;
159 private final int pcdTokenSpaceMinWidth
= 200;
160 private final int datumTypeMinWidth
= 80;
161 private final int defaultValueMinWidth
= 100;
162 private final int helpTextMinWidth
= 200;
163 private final int usageMinWidth
= 60;
164 private final int supArchMinWidth
= 200;
165 private final int supModMinWidth
= 200;
167 // private Object boolModifyLock = new Object();
168 // private boolean exclusiveUsage = false;
171 This method initializes this
174 private void initialize() {
175 this.setTitle("PCD Declarations");
176 this.setDefaultCloseOperation(javax
.swing
.WindowConstants
.DISPOSE_ON_CLOSE
);
178 int xPos
= jCheckBoxPatchInMod
.getX() + jCheckBoxPatchInMod
.getWidth();
179 jCheckBoxFixedAtBuild
.setLocation(xPos
,133);
181 xPos
= jCheckBoxFeatureFlag
.getX() + jCheckBoxFeatureFlag
.getWidth();
182 jCheckBoxDyn
.setLocation(xPos
,161);
184 xPos
= jCheckBoxDyn
.getX() + jCheckBoxDyn
.getWidth();
185 jCheckBoxDynEx
.setLocation(xPos
,161);
190 This method initializes jTextFieldC_Name
192 @return javax.swing.JTextField
194 private JTextField
getJTextFieldC_Name() {
195 if (jTextFieldC_Name
== null) {
196 jTextFieldC_Name
= new JTextField();
197 jTextFieldC_Name
.setBounds(new java
.awt
.Rectangle(156,9,317,20));
198 jTextFieldC_Name
.setPreferredSize(new java
.awt
.Dimension(315,20));
200 return jTextFieldC_Name
;
204 This method initializes jTextFieldToken
206 @return javax.swing.JTextField
208 private JTextField
getJTextFieldToken() {
209 if (jTextFieldToken
== null) {
210 jTextFieldToken
= new JTextField();
211 jTextFieldToken
.setBounds(new java
.awt
.Rectangle(156,33,317,20));
212 jTextFieldToken
.setPreferredSize(new java
.awt
.Dimension(315,20));
214 return jTextFieldToken
;
218 This method initializes jButtonOk
220 @return javax.swing.JButton
222 private JButton
getJButtonOk() {
223 if (jButtonOk
== null) {
224 jButtonOk
= new JButton();
225 jButtonOk
.setText("OK");
226 jButtonOk
.setBounds(new java
.awt
.Rectangle(279,276,90,20));
227 jButtonOk
.setVisible(false);
228 jButtonOk
.addActionListener(this);
234 This method initializes jButtonCancel
236 @return javax.swing.JButton
238 private JButton
getJButtonCancel() {
239 if (jButtonCancel
== null) {
240 jButtonCancel
= new JButton();
241 jButtonCancel
.setText("Cancel");
242 jButtonCancel
.setBounds(new java
.awt
.Rectangle(389,276,82,20));
243 jButtonCancel
.setVisible(false);
244 jButtonCancel
.addActionListener(this);
246 return jButtonCancel
;
250 This method initializes jComboBoxDataType
252 @return javax.swing.JComboBox
254 private JComboBox
getJComboBoxDataType() {
255 if (jComboBoxDataType
== null) {
256 jComboBoxDataType
= new JComboBox();
257 jComboBoxDataType
.setBounds(new java
.awt
.Rectangle(156,84,110,20));
259 return jComboBoxDataType
;
263 This is the default constructor
265 public SpdPcdDefs() {
272 public SpdPcdDefs(PackageSurfaceAreaDocument
.PackageSurfaceArea inPsa
) {
274 sfc
= new SpdFileContents(inPsa
);
278 public SpdPcdDefs(OpeningPackageType opt
) {
279 this(opt
.getXmlSpd());
283 This method initializes this
287 private void init() {
288 this.setSize(500, 650);
289 this.setContentPane(getJContentPane());
290 this.addInternalFrameListener(new InternalFrameAdapter(){
291 public void internalFrameDeactivated(InternalFrameEvent e
){
292 if (jTable
.isEditing()) {
293 jTable
.getCellEditor().stopCellEditing();
298 this.setVisible(true);
301 private void init(SpdFileContents sfc
){
303 if (sfc
.getSpdPkgDefsRdOnly().equals("true")) {
304 JOptionPane
.showMessageDialog(frame
, "This is a read-only package. You will not be able to edit contents in table.");
308 if (sfc
.getSpdPcdDefinitionCount() == 0) {
311 String
[][] saa
= new String
[sfc
.getSpdPcdDefinitionCount()][8];
312 String
[][] usage
= new String
[sfc
.getSpdPcdDefinitionCount()][5];
313 Object
[] rowData
= new Object
[13];
314 sfc
.getSpdPcdDefinitions(saa
, usage
);
316 while (i
< saa
.length
) {
318 for (int k
= 0; k
< 6; ++k
) {
319 rowData
[k
] = saa
[i
][k
];
321 for (int m
= 6; m
< 11; ++m
) {
322 rowData
[m
] = new Boolean("false");
326 if (usage
[i
][j
] == null || usage
[i
][j
].length()==0){
330 if (usage
[i
][j
].equals("FEATURE_FLAG")){
331 rowData
[6] = new Boolean("true");
333 if (usage
[i
][j
].equals("FIXED_AT_BUILD")){
334 rowData
[7] = new Boolean("true");
336 if (usage
[i
][j
].equals("PATCHABLE_IN_MODULE")){
337 rowData
[8] = new Boolean("true");
339 if (usage
[i
][j
].equals("DYNAMIC")){
340 rowData
[9] = new Boolean("true");
342 if (usage
[i
][j
].equals("DYNAMIC_EX")){
343 rowData
[10] = new Boolean("true");
349 rowData
[11] = saa
[i
][6];
350 rowData
[12] = saa
[i
][7];
352 model
.addRow(rowData
);
359 private JScrollPane
getJContentPane(){
360 if (topScrollPane
== null){
361 topScrollPane
= new JScrollPane();
362 topScrollPane
.setSize(new java
.awt
.Dimension(482,451));
363 topScrollPane
.setViewportView(getJContentPane1());
365 return topScrollPane
;
367 private JPanel
getJContentPane1() {
368 if (jContentPane
== null) {
370 jLabelSupArch
= new JLabel();
371 jLabelSupArch
.setBounds(new java
.awt
.Rectangle(241,192,89,16));
372 jLabelSupArch
.setText("Supported Architectures");
373 jLabelSupArch
.setEnabled(true);
374 FontMetrics fm
= jLabelSupArch
.getFontMetrics(jLabelSupArch
.getFont());
375 jLabelSupArch
.setSize(fm
.stringWidth(jLabelSupArch
.getText()) + 10, 20);
376 jLabelSupMod
= new JLabel();
377 jLabelSupMod
.setBounds(new java
.awt
.Rectangle(15,193,103,16));
378 jLabelSupMod
.setText("Supported Module types");
379 jLabelSupMod
.setEnabled(true);
380 fm
= jLabelSupMod
.getFontMetrics(jLabelSupMod
.getFont());
381 jLabelSupMod
.setSize(fm
.stringWidth(jLabelSupMod
.getText()) + 10, 20);
382 starLabel
= new StarLabel();
383 starLabel
.setBounds(new java
.awt
.Rectangle(2,134,10,20));
384 jLabelDefVal
= new JLabel();
385 jLabelDefVal
.setBounds(new java
.awt
.Rectangle(277,84,80,20));
386 jLabelDefVal
.setText("Default Value");
387 fm
= jLabelDefVal
.getFontMetrics(jLabelDefVal
.getFont());
388 jLabelDefVal
.setSize(fm
.stringWidth(jLabelDefVal
.getText()) + 10, 20);
389 jLabelVarVal
= new JLabel();
390 jLabelVarVal
.setBounds(new java
.awt
.Rectangle(11,133,100,20));
391 jLabelVarVal
.setText("Valid Usage");
392 jLabelC_Name
= new JLabel();
393 jLabelC_Name
.setText("C Name");
394 jLabelC_Name
.setBounds(new java
.awt
.Rectangle(11,9,140,20));
395 jLabelTokenSpace
= new JLabel();
396 jLabelTokenSpace
.setBounds(new java
.awt
.Rectangle(11,58,140,20));
397 jLabelTokenSpace
.setText("Token Space");
398 jLabelDataType
= new JLabel();
399 jLabelDataType
.setText("Data Type");
400 jLabelDataType
.setBounds(new java
.awt
.Rectangle(11,83,140,20));
401 jLabelToken
= new JLabel();
402 jLabelToken
.setText("Token Number");
403 jLabelToken
.setBounds(new java
.awt
.Rectangle(11,33,140,20));
404 jLabelItemType
= new JLabel();
405 jLabelItemType
.setText("Help Text");
406 jLabelItemType
.setBounds(new java
.awt
.Rectangle(11,108,140,20));
409 jContentPane
= new JPanel();
410 jContentPane
.setLayout(null);
411 jContentPane
.setPreferredSize(new java
.awt
.Dimension(479,375));
413 jContentPane
.add(jLabelItemType
, null);
414 jContentPane
.add(jLabelC_Name
, null);
415 jContentPane
.add(jLabelTokenSpace
, null);
416 jContentPane
.add(getJComboBoxTsGuid(), null);
417 jContentPane
.add(jLabelVarVal
, null);
418 jContentPane
.add(getJTextFieldC_Name(), null);
419 jContentPane
.add(jLabelToken
, null);
420 jContentPane
.add(getJTextFieldToken(), null);
421 jContentPane
.add(jLabelDataType
, null);
422 jContentPane
.add(getJButtonOk(), null);
423 jContentPane
.add(getJButtonCancel(), null);
424 jContentPane
.add(getJComboBoxDataType(), null);
426 jStarLabel
= new StarLabel();
427 jStarLabel1
= new StarLabel();
428 jStarLabel1
.setBounds(new java
.awt
.Rectangle(2,8,10,20));
429 jStarLabel2
= new StarLabel();
430 jStarLabel3
= new StarLabel();
431 jStarLabel4
= new StarLabel();
432 jStarLabel
.setLocation(new java
.awt
.Point(2,84));
433 jStarLabel4
.setLocation(new java
.awt
.Point(2, 109));
434 jStarLabel2
.setLocation(new java
.awt
.Point(2,33));
435 jStarLabel3
.setLocation(new java
.awt
.Point(2, 58));
436 jStarLabel3
.setSize(new java
.awt
.Dimension(8,20));
437 jContentPane
.add(jStarLabel2
, null);
438 jContentPane
.add(jStarLabel3
, null);
439 jContentPane
.add(jStarLabel
, null);
440 jContentPane
.add(jStarLabel1
, null);
441 jContentPane
.add(jStarLabel4
, null);
442 jContentPane
.add(getJTextFieldHelp(), null);
443 jContentPane
.add(jLabelDefVal
, null);
444 jContentPane
.add(getJTextFieldDefaultValue(), null);
445 jContentPane
.add(getJButtonAdd(), null);
446 jContentPane
.add(getJButtonRemove(), null);
447 jContentPane
.add(getJButtonClearAll(), null);
448 jContentPane
.add(getJScrollPane(), null);
449 jContentPane
.add(starLabel
, null);
450 jContentPane
.add(getJCheckBoxFeatureFlag(), null);
451 jContentPane
.add(getJCheckBoxFixedAtBuild(), null);
452 jContentPane
.add(getJCheckBoxPatchInMod(), null);
453 jContentPane
.add(getJCheckBoxDyn(), null);
454 jContentPane
.add(getJCheckBoxDynEx(), null);
455 jContentPane
.add(getJScrollPaneArch(), null);
456 jContentPane
.add(getJScrollPaneMod(), null);
457 jContentPane
.add(jLabelSupMod
, null);
458 jContentPane
.add(jLabelSupArch
, null);
464 This method initializes comboboxes
465 jContentPane.add(jLabelTokenSpace, null);
468 private void initFrame() {
470 jComboBoxDataType
.addItem("UINT8");
471 jComboBoxDataType
.addItem("UINT16");
472 jComboBoxDataType
.addItem("UINT32");
473 jComboBoxDataType
.addItem("UINT64");
474 jComboBoxDataType
.addItem("VOID*");
475 jComboBoxDataType
.addItem("BOOLEAN");
476 jComboBoxDataType
.setSelectedIndex(0);
478 Vector
<String
> vGuidCName
= new Vector
<String
>();
479 sfc
.getSpdGuidDeclWithType(vGuidCName
, "TOKEN_SPACE_GUID");
480 for (int i
= 0; i
< vGuidCName
.size(); ++i
) {
481 jComboBoxTsGuid
.addItem(vGuidCName
.get(i
));
484 boolean editable
= true;
485 if (sfc
.getSpdPkgDefsRdOnly().equals("true")) {
489 jButtonAdd
.setEnabled(editable
);
490 jButtonRemove
.setEnabled(editable
);
491 jButtonClearAll
.setEnabled(editable
);
492 jTable
.setEnabled(editable
);
495 public void actionPerformed(ActionEvent arg0
) {
498 if (arg0
.getSource() == jButtonOk
) {
502 if (arg0
.getSource() == jButtonCancel
) {
506 if (arg0
.getSource() == jButtonAdd
) {
507 //ToDo: check before add
509 boolean[] b
= {jCheckBoxFeatureFlag
.isSelected(), jCheckBoxFixedAtBuild
.isSelected(), jCheckBoxPatchInMod
.isSelected(), jCheckBoxDyn
.isSelected(), jCheckBoxDynEx
.isSelected()};
510 if (!checkValidUsage(b
)) {
513 String archList
= vectorToString(iCheckBoxListArch
.getAllCheckedItemsString());
514 if (archList
.length() == 0) {
517 String modTypeList
= vectorToString(iCheckBoxListMod
.getAllCheckedItemsString());
518 if (modTypeList
.length() == 0) {
521 Object
[] row
= {jTextFieldC_Name
.getText(), jTextFieldToken
.getText(),
522 jComboBoxTsGuid
.getSelectedItem(), jComboBoxDataType
.getSelectedItem(),
523 jTextFieldDefaultValue
.getText(), jTextFieldHelp
.getText(),
524 jCheckBoxFeatureFlag
.isSelected(), jCheckBoxFixedAtBuild
.isSelected(),
525 jCheckBoxPatchInMod
.isSelected(), jCheckBoxDyn
.isSelected(), jCheckBoxDynEx
.isSelected(),
526 archList
, modTypeList
};
528 if (!dataValidation(row
)) {
532 if (tokenCNameExisted(jTextFieldToken
.getText(),jTextFieldC_Name
.getText())) {
535 } catch (Exception e
) {
536 JOptionPane
.showMessageDialog(frame
, "Illegal Token:"+ e
.getCause());
541 jTable
.changeSelection(model
.getRowCount()-1, 0, false, false);
542 String usage
= getValidUsage(jCheckBoxFeatureFlag
.isSelected(), jCheckBoxFixedAtBuild
.isSelected(), jCheckBoxPatchInMod
.isSelected(), jCheckBoxDyn
.isSelected(), jCheckBoxDynEx
.isSelected());
543 if (usage
.length() == 0) {
546 sfc
.genSpdPcdDefinitions(row
[0]+"", row
[1]+"", row
[3]+"", usage
, row
[2]+"", row
[4]+"", row
[5]+"", archList
, modTypeList
);
547 docConsole
.setSaved(false);
550 // remove selected line
552 if (arg0
.getSource() == jButtonRemove
) {
553 if (jTable
.isEditing()){
554 jTable
.getCellEditor().stopCellEditing();
556 int rowSelected
= selectedRow
;
557 if (rowSelected
>= 0) {
558 model
.removeRow(rowSelected
);
559 sfc
.removeSpdPcdDefinition(rowSelected
);
560 docConsole
.setSaved(false);
564 if (arg0
.getSource() == jButtonClearAll
) {
565 if (model
.getRowCount() == 0) {
568 model
.setRowCount(0);
569 sfc
.removeSpdPcdDefinition();
570 docConsole
.setSaved(false);
575 protected void save() {
580 * This method initializes jComboBoxTsGuid
582 * @return javax.swing.JComboBox
584 private JComboBox
getJComboBoxTsGuid() {
585 if (jComboBoxTsGuid
== null) {
586 jComboBoxTsGuid
= new JComboBox();
587 jComboBoxTsGuid
.setBounds(new java
.awt
.Rectangle(156,58,315,20));
590 return jComboBoxTsGuid
;
594 * This method initializes jTextField
596 * @return javax.swing.JTextField
598 private JTextField
getJTextFieldHelp() {
599 if (jTextFieldHelp
== null) {
600 jTextFieldHelp
= new JTextField();
601 jTextFieldHelp
.setBounds(new java
.awt
.Rectangle(156,108,317,20));
602 jTextFieldHelp
.setPreferredSize(new java
.awt
.Dimension(315,20));
604 return jTextFieldHelp
;
608 * This method initializes jTextFieldDefaultValue
610 * @return javax.swing.JTextField
612 private JTextField
getJTextFieldDefaultValue() {
613 if (jTextFieldDefaultValue
== null) {
614 jTextFieldDefaultValue
= new JTextField();
615 int xPos
= jLabelDefVal
.getX() + jLabelDefVal
.getWidth();
616 jTextFieldDefaultValue
.setBounds(new java
.awt
.Rectangle(xPos
,84,105,20));
617 jTextFieldDefaultValue
.setPreferredSize(new java
.awt
.Dimension(104,20));
619 return jTextFieldDefaultValue
;
623 * This method initializes jButtonAdd
625 * @return javax.swing.JButton
627 private JButton
getJButtonAdd() {
628 if (jButtonAdd
== null) {
629 jButtonAdd
= new JButton();
630 jButtonAdd
.setBounds(new java
.awt
.Rectangle(195,277,71,20));
631 jButtonAdd
.setPreferredSize(new java
.awt
.Dimension(70,20));
632 jButtonAdd
.setText("Add");
633 jButtonAdd
.addActionListener(this);
640 * This method initializes jButtonRemove
642 * @return javax.swing.JButton
644 private JButton
getJButtonRemove() {
645 if (jButtonRemove
== null) {
646 jButtonRemove
= new JButton();
647 jButtonRemove
.setBounds(new java
.awt
.Rectangle(278,277,81,20));
648 jButtonRemove
.setPreferredSize(new java
.awt
.Dimension(70,20));
649 jButtonRemove
.setText("Delete");
650 jButtonRemove
.addActionListener(this);
652 return jButtonRemove
;
656 * This method initializes jButtonClearAll
658 * @return javax.swing.JButton
660 private JButton
getJButtonClearAll() {
661 if (jButtonClearAll
== null) {
662 jButtonClearAll
= new JButton();
663 jButtonClearAll
.setBounds(new java
.awt
.Rectangle(382,277,90,20));
664 jButtonClearAll
.setPreferredSize(new java
.awt
.Dimension(81,20));
665 jButtonClearAll
.setText("Clear All");
666 jButtonClearAll
.addActionListener(this);
668 return jButtonClearAll
;
671 public void componentResized(ComponentEvent arg0
) {
672 int intPreferredWidth
= 500;
674 Tools
.resizeComponentWidth(this.jTextFieldC_Name
, this.getWidth(), intPreferredWidth
);
675 Tools
.resizeComponentWidth(this.jTextFieldToken
, this.getWidth(), intPreferredWidth
);
676 Tools
.resizeComponentWidth(this.jComboBoxTsGuid
, this.getWidth(), intPreferredWidth
);
677 Tools
.resizeComponentWidth(this.jTextFieldDefaultValue
, this.getWidth(), intPreferredWidth
);
678 Tools
.resizeComponentWidth(this.jTextFieldHelp
, this.getWidth(), intPreferredWidth
);
679 Tools
.resizeComponentWidth(this.jScrollPane
, this.getWidth(), intPreferredWidth
);
681 Tools
.resizeComponentWidth(this.jTextFieldDefaultValue
, this.getWidth(), intPreferredWidth
);
682 // relocateComponentX(this.jButtonClearAll, this.getWidth(), DataType.SPACE_TO_RIGHT_FOR_GENERATE_BUTTON);
683 // relocateComponentX(this.jButtonRemove, this.getWidth(), DataType.SPACE_TO_RIGHT_FOR_GENERATE_BUTTON);
684 // relocateComponentX(this.jButtonAdd, this.getWidth(), DataType.SPACE_TO_RIGHT_FOR_GENERATE_BUTTON);
688 * This method initializes jScrollPane
690 * @return javax.swing.JScrollPane
692 private JScrollPane
getJScrollPane() {
693 if (jScrollPane
== null) {
694 jScrollPane
= new JScrollPane();
695 jScrollPane
.setBounds(new java
.awt
.Rectangle(5,301,1473,259));
696 jScrollPane
.setViewportView(getJTable());
702 * This method initializes jTable
704 * @return javax.swing.JTable
706 private JTable
getJTable() {
707 if (jTable
== null) {
708 model
= new CheckboxTableModel();
709 jTable
= new JTable(model
);
710 jTable
.setRowHeight(20);
711 jTable
.setAutoResizeMode(JTable
.AUTO_RESIZE_OFF
);
712 jTable
.setSize(new Dimension(1000, 300));
714 model
.addColumn("C_Name");
715 model
.addColumn("Token");
716 model
.addColumn("TokenSpace");
717 model
.addColumn("DatumType");
718 model
.addColumn("DefaultValue");
719 model
.addColumn("HelpText");
721 model
.addColumn("FeatureFlag");
722 model
.addColumn("FixedAtBuild");
723 model
.addColumn("PatchableInModule");
724 model
.addColumn("Dynamic");
725 model
.addColumn("DynamicEx");
726 model
.addColumn("SupportedArch");
727 model
.addColumn("SupportedModule");
729 TableColumn column
= jTable
.getColumnModel().getColumn(0);
730 column
.setMinWidth(this.pcdCNameMinWidth
);
731 column
= jTable
.getColumnModel().getColumn(1);
732 column
.setMinWidth(this.pcdTokenMinWidth
);
733 column
= jTable
.getColumnModel().getColumn(2);
734 column
.setMinWidth(this.pcdTokenSpaceMinWidth
);
735 column
= jTable
.getColumnModel().getColumn(3);
736 column
.setMinWidth(this.datumTypeMinWidth
);
737 column
= jTable
.getColumnModel().getColumn(4);
738 column
.setMinWidth(this.defaultValueMinWidth
);
739 column
= jTable
.getColumnModel().getColumn(5);
740 column
.setMinWidth(this.helpTextMinWidth
);
741 column
= jTable
.getColumnModel().getColumn(6);
742 column
.setMinWidth(this.usageMinWidth
);
743 column
= jTable
.getColumnModel().getColumn(7);
744 column
.setMinWidth(this.usageMinWidth
);
745 column
= jTable
.getColumnModel().getColumn(8);
746 column
.setMinWidth(this.usageMinWidth
);
747 column
= jTable
.getColumnModel().getColumn(9);
748 column
.setMinWidth(this.usageMinWidth
);
749 column
= jTable
.getColumnModel().getColumn(10);
750 column
.setMinWidth(this.usageMinWidth
);
751 column
= jTable
.getColumnModel().getColumn(11);
752 column
.setMinWidth(this.supArchMinWidth
);
753 column
= jTable
.getColumnModel().getColumn(12);
754 column
.setMinWidth(this.supModMinWidth
);
756 //ToDo: add a valid usage editor
758 JComboBox jComboBoxDataType
= new JComboBox();
759 jComboBoxDataType
.addItem("UINT8");
760 jComboBoxDataType
.addItem("UINT16");
761 jComboBoxDataType
.addItem("UINT32");
762 jComboBoxDataType
.addItem("UINT64");
763 jComboBoxDataType
.addItem("VOID*");
764 jComboBoxDataType
.addItem("BOOLEAN");
765 TableColumn dataTypeColumn
= jTable
.getColumnModel().getColumn(3);
766 dataTypeColumn
.setCellEditor(new DefaultCellEditor(jComboBoxDataType
));
768 jTable
.getColumnModel().getColumn(5).setCellEditor(new LongTextEditor());
770 Vector
<String
> vArch
= new Vector
<String
>();
777 jTable
.getColumnModel().getColumn(11).setCellEditor(new ListEditor(vArch
));
779 Vector
<String
> vModule
= new Vector
<String
>();
782 vModule
.add("PEI_CORE");
784 vModule
.add("DXE_CORE");
785 vModule
.add("DXE_DRIVER");
786 vModule
.add("DXE_RUNTIME_DRIVER");
787 vModule
.add("DXE_SAL_DRIVER");
788 vModule
.add("DXE_SMM_DRIVER");
789 vModule
.add("UEFI_DRIVER");
790 vModule
.add("UEFI_APPLICATION");
791 vModule
.add("USER_DEFINED");
792 jTable
.getColumnModel().getColumn(12).setCellEditor(new ListEditor(vModule
));
794 jTable
.setSelectionMode(ListSelectionModel
.SINGLE_SELECTION
);
795 jTable
.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
796 public void valueChanged(ListSelectionEvent e
) {
797 if (e
.getValueIsAdjusting()){
800 ListSelectionModel lsm
= (ListSelectionModel
)e
.getSource();
801 if (lsm
.isSelectionEmpty()) {
805 selectedRow
= lsm
.getMinSelectionIndex();
810 jTable
.getModel().addTableModelListener(this);
815 public void tableChanged(TableModelEvent arg0
) {
816 // TODO Auto-generated method stub
817 int row
= arg0
.getFirstRow();
818 int column
= arg0
.getColumn();
819 TableModel m
= (TableModel
)arg0
.getSource();
820 if (arg0
.getType() == TableModelEvent
.UPDATE
){
821 String
[] sa
= new String
[9];
822 sfc
.getSpdPcdDeclaration(sa
, row
);
823 Object cellData
= m
.getValueAt(row
, column
);
826 if (cellData
== null) {
829 if (cellData
.equals(sa
[column
])) {
832 if (cellData
.toString().length() == 0 && sa
[column
] == null) {
837 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)+""));
838 if (usage
.length() == 0) {
839 JOptionPane
.showMessageDialog(frame
, "You must choose at least one usage for PCD entry.");
843 if (column
<= 10 && column
>= 6) {
844 Vector
<String
> v
= stringToVector(usage
);
845 if (compareTwoVectors(v
, stringToVector(sa
[6]))) {
848 if (v
.contains("FEATURE_FLAG")/* && v.size() > 1 && !exclusiveUsage*/) {
850 JOptionPane
.showMessageDialog(frame
, "Usage Feature Flag can NOT co-exist with others.");
853 // synchronized (boolModifyLock){
854 // exclusiveUsage = true;
856 // m.setValueAt(false, row, 7);
857 // m.setValueAt(false, row, 8);
858 // m.setValueAt(false, row, 9);
859 // m.setValueAt(false, row, 10);
861 m
.setValueAt("BOOLEAN", row
, 3);
868 if (cellData
== null) {
871 if (cellData
.equals(sa
[7])) {
874 if (cellData
.toString().length() == 0 && sa
[7] == null) {
880 if (cellData
== null) {
883 if (cellData
.equals(sa
[8])) {
886 if (cellData
.toString().length() == 0 && sa
[8] == null) {
890 String cName
= m
.getValueAt(row
, 0) + "";
891 String token
= m
.getValueAt(row
, 1) + "";
892 String ts
= m
.getValueAt(row
, 2) + "";
893 String dataType
= m
.getValueAt(row
, 3) + "";
894 String defaultVal
= m
.getValueAt(row
, 4) + "";
895 String help
= m
.getValueAt(row
, 5) + "";
898 String archList
= null;
899 if (m
.getValueAt(row
, 11) != null){
900 archList
= m
.getValueAt(row
, 11).toString();
902 String modTypeList
= null;
903 if (m
.getValueAt(row
, 12) != null) {
904 modTypeList
= m
.getValueAt(row
, 12).toString();
907 Object
[] o
= {cName
, token
, ts
, dataType
, defaultVal
, help
};
909 if (!dataValidation(o
)){
913 catch (Exception e
) {
914 JOptionPane
.showMessageDialog(frame
, "Illegal Token:" + e
.getCause());
917 docConsole
.setSaved(false);
918 sfc
.updateSpdPcdDefinition(row
, cName
, token
, dataType
, usage
, ts
, defaultVal
, help
, archList
, modTypeList
);
923 * This method initializes jCheckBox
925 * @return javax.swing.JCheckBox
927 private JCheckBox
getJCheckBoxFeatureFlag() {
928 if (jCheckBoxFeatureFlag
== null) {
929 jCheckBoxFeatureFlag
= new JCheckBox();
930 jCheckBoxFeatureFlag
.setBounds(new java
.awt
.Rectangle(156,161,100,21));
931 jCheckBoxFeatureFlag
.setText("Feature Flag");
932 FontMetrics fm
= jCheckBoxFeatureFlag
.getFontMetrics(jCheckBoxFeatureFlag
.getFont());
933 jCheckBoxFeatureFlag
.setSize(fm
.stringWidth(jCheckBoxFeatureFlag
.getText()) + 30, 20);
934 jCheckBoxFeatureFlag
.addItemListener(new java
.awt
.event
.ItemListener() {
935 public void itemStateChanged(java
.awt
.event
.ItemEvent e
) {
936 if (jCheckBoxFeatureFlag
.isSelected()) {
937 jCheckBoxPatchInMod
.setSelected(false);
938 jCheckBoxFixedAtBuild
.setSelected(false);
939 jCheckBoxDyn
.setSelected(false);
940 jCheckBoxDynEx
.setSelected(false);
941 jComboBoxDataType
.setSelectedItem("BOOLEAN");
946 return jCheckBoxFeatureFlag
;
950 * This method initializes jCheckBox1
952 * @return javax.swing.JCheckBox
954 private JCheckBox
getJCheckBoxFixedAtBuild() {
955 if (jCheckBoxFixedAtBuild
== null) {
956 jCheckBoxFixedAtBuild
= new JCheckBox();
958 jCheckBoxFixedAtBuild
.setText("Fixed at Build");
959 FontMetrics fm
= jCheckBoxFixedAtBuild
.getFontMetrics(jCheckBoxFixedAtBuild
.getFont());
960 jCheckBoxFixedAtBuild
.setSize(fm
.stringWidth(jCheckBoxFixedAtBuild
.getText()) + 30, 20);
961 jCheckBoxFixedAtBuild
.addItemListener(new java
.awt
.event
.ItemListener() {
962 public void itemStateChanged(java
.awt
.event
.ItemEvent e
) {
963 if (jCheckBoxFixedAtBuild
.isSelected()) {
964 jCheckBoxFeatureFlag
.setSelected(false);
969 return jCheckBoxFixedAtBuild
;
973 * This method initializes jCheckBox2
975 * @return javax.swing.JCheckBox
977 private JCheckBox
getJCheckBoxPatchInMod() {
978 if (jCheckBoxPatchInMod
== null) {
979 jCheckBoxPatchInMod
= new JCheckBox();
981 jCheckBoxPatchInMod
.setBounds(new java
.awt
.Rectangle(156,133,154,20));
982 jCheckBoxPatchInMod
.setText("Patchable in Module");
983 FontMetrics fm
= jCheckBoxPatchInMod
.getFontMetrics(jCheckBoxPatchInMod
.getFont());
984 jCheckBoxPatchInMod
.setSize(fm
.stringWidth(jCheckBoxPatchInMod
.getText()) + 30, 20);
985 jCheckBoxPatchInMod
.addItemListener(new java
.awt
.event
.ItemListener() {
986 public void itemStateChanged(java
.awt
.event
.ItemEvent e
) {
987 if (jCheckBoxPatchInMod
.isSelected()) {
988 jCheckBoxFeatureFlag
.setSelected(false);
993 return jCheckBoxPatchInMod
;
997 * This method initializes jCheckBox3
999 * @return javax.swing.JCheckBox
1001 private JCheckBox
getJCheckBoxDyn() {
1002 if (jCheckBoxDyn
== null) {
1003 jCheckBoxDyn
= new JCheckBox();
1005 jCheckBoxDyn
.setText("Dynamic");
1006 FontMetrics fm
= jCheckBoxDyn
.getFontMetrics(jCheckBoxDyn
.getFont());
1007 jCheckBoxDyn
.setSize(fm
.stringWidth(jCheckBoxDyn
.getText()) + 30, 20);
1008 jCheckBoxDyn
.addItemListener(new java
.awt
.event
.ItemListener() {
1009 public void itemStateChanged(java
.awt
.event
.ItemEvent e
) {
1010 if (jCheckBoxDyn
.isSelected()) {
1011 jCheckBoxFeatureFlag
.setSelected(false);
1016 return jCheckBoxDyn
;
1020 * This method initializes jCheckBox4
1022 * @return javax.swing.JCheckBox
1024 private JCheckBox
getJCheckBoxDynEx() {
1025 if (jCheckBoxDynEx
== null) {
1026 jCheckBoxDynEx
= new JCheckBox();
1028 jCheckBoxDynEx
.setText("DynamicEx");
1029 FontMetrics fm
= jCheckBoxDynEx
.getFontMetrics(jCheckBoxDynEx
.getFont());
1030 jCheckBoxDynEx
.setSize(fm
.stringWidth(jCheckBoxDynEx
.getText()) + 30, 20);
1031 jCheckBoxDynEx
.addItemListener(new java
.awt
.event
.ItemListener() {
1032 public void itemStateChanged(java
.awt
.event
.ItemEvent e
) {
1033 if (jCheckBoxDynEx
.isSelected()) {
1034 jCheckBoxFeatureFlag
.setSelected(false);
1039 return jCheckBoxDynEx
;
1042 private String
getValidUsage(boolean ff
, boolean fab
, boolean pim
, boolean d
, boolean de
) {
1045 usage
+= "FEATURE_FLAG ";
1048 usage
+= "FIXED_AT_BUILD ";
1051 usage
+= "PATCHABLE_IN_MODULE ";
1054 usage
+= "DYNAMIC ";
1057 usage
+= "DYNAMIC_EX ";
1060 return usage
.trim();
1063 private boolean tokenCNameExisted(String token
, String cName
) throws Exception
{
1064 Long inputToken
= Long
.decode(token
);
1066 for (int i
= 0; i
< model
.getRowCount(); ++i
) {
1067 if (model
.getValueAt(i
, 0).equals(cName
)) {
1068 JOptionPane
.showMessageDialog(frame
, "C_Name already existed in table.");
1071 if (model
.getValueAt(i
, 1).equals(token
)) {
1072 JOptionPane
.showMessageDialog(frame
, "Token already existed in table.");
1075 Long tokenValue
= Long
.decode(model
.getValueAt(i
, 1)+"");
1076 if (tokenValue
.equals(inputToken
)) {
1077 JOptionPane
.showMessageDialog(frame
, "Same token value already existed in table.");
1085 private boolean checkValidUsage(boolean[] b
) {
1086 if (!(b
[0] || b
[1] || b
[2] || b
[3] || b
[4])){
1087 JOptionPane
.showMessageDialog(frame
, "You must specify at least one usage.");
1092 private boolean dataValidation(Object
[] row
) throws Exception
{
1094 if (!DataValidation
.isC_NameType(row
[0].toString())) {
1095 JOptionPane
.showMessageDialog(frame
, "C_Name is NOT C_NameType.");
1098 if (!DataValidation
.isHexDoubleWordDataType(row
[1].toString()) &&
1099 !DataValidation
.isLongInt(row
[1].toString(), 1, Long
.MAX_VALUE
)) {
1100 JOptionPane
.showMessageDialog(frame
, "Token is NOT correct.");
1103 if (!DataValidation
.isC_NameType(row
[2].toString())) {
1104 JOptionPane
.showMessageDialog(frame
, "Token Space is NOT C_NameType");
1107 if (row
[5].toString().length() == 0) {
1108 JOptionPane
.showMessageDialog(frame
, "HelpText could NOT be empty.");
1115 * This method initializes jScrollPane1
1117 * @return javax.swing.JScrollPane
1119 private JScrollPane
getJScrollPaneArch() {
1120 if (jScrollPaneArch
== null) {
1121 jScrollPaneArch
= new JScrollPane();
1122 jScrollPaneArch
.setBounds(new java
.awt
.Rectangle(242,213,188,54));
1123 jScrollPaneArch
.setViewportView(getICheckBoxListArch());
1124 jScrollPaneArch
.setPreferredSize(new Dimension(188, 74));
1126 return jScrollPaneArch
;
1130 * This method initializes iCheckBoxList
1132 * @return org.tianocore.frameworkwizard.common.ui.iCheckBoxList.ICheckBoxList
1134 private ICheckBoxList
getICheckBoxListArch() {
1135 if (iCheckBoxListArch
== null) {
1136 iCheckBoxListArch
= new ICheckBoxList();
1137 iCheckBoxListArch
.setBounds(new Rectangle(197, 142, 188, 74));
1138 Vector
<String
> v
= new Vector
<String
>();
1145 iCheckBoxListArch
.setAllItems(v
);
1147 return iCheckBoxListArch
;
1151 * This method initializes jScrollPane2
1153 * @return javax.swing.JScrollPane
1155 private JScrollPane
getJScrollPaneMod() {
1156 if (jScrollPaneMod
== null) {
1157 jScrollPaneMod
= new JScrollPane();
1158 jScrollPaneMod
.setBounds(new java
.awt
.Rectangle(15,213,199,55));
1159 jScrollPaneMod
.setViewportView(getICheckBoxListMod());
1160 jScrollPaneMod
.setPreferredSize(new Dimension(170, 74));
1162 return jScrollPaneMod
;
1166 * This method initializes iCheckBoxList1
1168 * @return org.tianocore.frameworkwizard.common.ui.iCheckBoxList.ICheckBoxList
1170 private ICheckBoxList
getICheckBoxListMod() {
1171 if (iCheckBoxListMod
== null) {
1172 iCheckBoxListMod
= new ICheckBoxList();
1173 iCheckBoxListMod
.setBounds(new Rectangle(14, 142, 170, 74));
1174 Vector
<String
> v
= new Vector
<String
>();
1180 v
.add("DXE_DRIVER");
1181 v
.add("DXE_RUNTIME_DRIVER");
1182 v
.add("DXE_SAL_DRIVER");
1183 v
.add("DXE_SMM_DRIVER");
1184 v
.add("UEFI_DRIVER");
1185 v
.add("UEFI_APPLICATION");
1186 v
.add("USER_DEFINED");
1187 iCheckBoxListMod
.setAllItems(v
);
1189 return iCheckBoxListMod
;
1192 protected String
vectorToString(Vector
<String
> v
) {
1197 for (int i
= 0; i
< v
.size(); ++i
) {
1204 protected Vector
<String
> stringToVector(String s
){
1205 Vector
<String
> v
= new Vector
<String
>();
1209 String
[] sArray
= s
.split(" ");
1211 for (int i
= 0; i
< sArray
.length
; ++i
) {
1217 private boolean compareTwoVectors(Vector v1
, Vector v2
) {
1218 if (v1
.size() != v2
.size()) {
1221 for (int i
= 0; i
< v1
.size(); ++i
) {
1222 if (!v2
.contains(v1
.get(i
))) {
1228 } // @jve:decl-index=0:visual-constraint="22,11"
1230 class CheckboxTableModel
extends DefaultTableModel
{
1234 private static final long serialVersionUID
= 1L;
1236 public Class
<?
> getColumnClass (int c
) {
1237 if (getValueAt(0, c
) != null){
1238 return getValueAt(0, c
).getClass();
1240 return String
.class;