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