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