]> git.proxmox.com Git - mirror_edk2.git/blob - Tools/Java/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/packaging/ui/SpdPcdDefs.java
1ada3027531f8b2756d207dbf0d85f6d1c231a1e
[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 try {
528 if (!dataValidation(row)) {
529 return;
530 }
531
532 if (tokenCNameExisted(jTextFieldToken.getText(),jTextFieldC_Name.getText())) {
533 return;
534 }
535 } catch (Exception e) {
536 JOptionPane.showMessageDialog(frame, "Illegal Token:"+ e.getCause());
537 return;
538 }
539
540 model.addRow(row);
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) {
544 usage = null;
545 }
546 sfc.genSpdPcdDefinitions(row[0]+"", row[1]+"", row[3]+"", usage, row[2]+"", row[4]+"", row[5]+"", archList, modTypeList);
547 docConsole.setSaved(false);
548 }
549 //
550 // remove selected line
551 //
552 if (arg0.getSource() == jButtonRemove) {
553 if (jTable.isEditing()){
554 jTable.getCellEditor().stopCellEditing();
555 }
556 int rowSelected = selectedRow;
557 if (rowSelected >= 0) {
558 model.removeRow(rowSelected);
559 sfc.removeSpdPcdDefinition(rowSelected);
560 docConsole.setSaved(false);
561 }
562 }
563
564 if (arg0.getSource() == jButtonClearAll) {
565 if (model.getRowCount() == 0) {
566 return;
567 }
568 model.setRowCount(0);
569 sfc.removeSpdPcdDefinition();
570 docConsole.setSaved(false);
571 }
572
573 }
574
575 protected void save() {
576
577 }
578
579 /**
580 * This method initializes jComboBoxTsGuid
581 *
582 * @return javax.swing.JComboBox
583 */
584 private JComboBox getJComboBoxTsGuid() {
585 if (jComboBoxTsGuid == null) {
586 jComboBoxTsGuid = new JComboBox();
587 jComboBoxTsGuid.setBounds(new java.awt.Rectangle(156,58,315,20));
588
589 }
590 return jComboBoxTsGuid;
591 }
592
593 /**
594 * This method initializes jTextField
595 *
596 * @return javax.swing.JTextField
597 */
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));
603 }
604 return jTextFieldHelp;
605 }
606
607 /**
608 * This method initializes jTextFieldDefaultValue
609 *
610 * @return javax.swing.JTextField
611 */
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));
618 }
619 return jTextFieldDefaultValue;
620 }
621
622 /**
623 * This method initializes jButtonAdd
624 *
625 * @return javax.swing.JButton
626 */
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);
634 }
635 return jButtonAdd;
636
637 }
638
639 /**
640 * This method initializes jButtonRemove
641 *
642 * @return javax.swing.JButton
643 */
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);
651 }
652 return jButtonRemove;
653 }
654
655 /**
656 * This method initializes jButtonClearAll
657 *
658 * @return javax.swing.JButton
659 */
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);
667 }
668 return jButtonClearAll;
669 }
670
671 public void componentResized(ComponentEvent arg0) {
672 int intPreferredWidth = 500;
673
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);
680
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);
685 }
686
687 /**
688 * This method initializes jScrollPane
689 *
690 * @return javax.swing.JScrollPane
691 */
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());
697 }
698 return jScrollPane;
699 }
700
701 /**
702 * This method initializes jTable
703 *
704 * @return javax.swing.JTable
705 */
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));
713
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");
720
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");
728
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);
755
756 //ToDo: add a valid usage editor
757
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));
767
768 jTable.getColumnModel().getColumn(5).setCellEditor(new LongTextEditor());
769
770 Vector<String> vArch = new Vector<String>();
771 vArch.add("IA32");
772 vArch.add("X64");
773 vArch.add("IPF");
774 vArch.add("EBC");
775 vArch.add("ARM");
776 vArch.add("PPC");
777 jTable.getColumnModel().getColumn(11).setCellEditor(new ListEditor(vArch));
778
779 Vector<String> vModule = new Vector<String>();
780 vModule.add("BASE");
781 vModule.add("SEC");
782 vModule.add("PEI_CORE");
783 vModule.add("PEIM");
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));
793
794 jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
795 jTable.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
796 public void valueChanged(ListSelectionEvent e) {
797 if (e.getValueIsAdjusting()){
798 return;
799 }
800 ListSelectionModel lsm = (ListSelectionModel)e.getSource();
801 if (lsm.isSelectionEmpty()) {
802 return;
803 }
804 else{
805 selectedRow = lsm.getMinSelectionIndex();
806 }
807 }
808 });
809
810 jTable.getModel().addTableModelListener(this);
811 }
812 return jTable;
813 }
814
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);
824 if (column < 6) {
825
826 if (cellData == null) {
827 cellData = "";
828 }
829 if (cellData.equals(sa[column])) {
830 return;
831 }
832 if (cellData.toString().length() == 0 && sa[column] == null) {
833 return;
834 }
835 }
836
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.");
840 return;
841 }
842
843 if (column <= 10 && column >= 6) {
844 Vector<String> v = stringToVector(usage);
845 if (compareTwoVectors(v, stringToVector(sa[6]))) {
846 return;
847 }
848 if (v.contains("FEATURE_FLAG")/* && v.size() > 1 && !exclusiveUsage*/) {
849 if (v.size() > 1) {
850 JOptionPane.showMessageDialog(frame, "Usage Feature Flag can NOT co-exist with others.");
851 return;
852 }
853 // synchronized (boolModifyLock){
854 // exclusiveUsage = true;
855 // }
856 // m.setValueAt(false, row, 7);
857 // m.setValueAt(false, row, 8);
858 // m.setValueAt(false, row, 9);
859 // m.setValueAt(false, row, 10);
860 else {
861 m.setValueAt("BOOLEAN", row, 3);
862 }
863
864 }
865 }
866
867 if (column == 11) {
868 if (cellData == null) {
869 cellData = "";
870 }
871 if (cellData.equals(sa[7])) {
872 return;
873 }
874 if (cellData.toString().length() == 0 && sa[7] == null) {
875 return;
876 }
877 }
878
879 if (column == 12) {
880 if (cellData == null) {
881 cellData = "";
882 }
883 if (cellData.equals(sa[8])) {
884 return;
885 }
886 if (cellData.toString().length() == 0 && sa[8] == null) {
887 return;
888 }
889 }
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) + "";
896
897
898 String archList = null;
899 if (m.getValueAt(row, 11) != null){
900 archList = m.getValueAt(row, 11).toString();
901 }
902 String modTypeList = null;
903 if (m.getValueAt(row, 12) != null) {
904 modTypeList = m.getValueAt(row, 12).toString();
905 }
906
907 Object[] o = {cName, token, ts, dataType, defaultVal, help};
908 try {
909 if (!dataValidation(o)){
910 return;
911 }
912 }
913 catch (Exception e) {
914 JOptionPane.showMessageDialog(frame, "Illegal Token:" + e.getCause());
915 return;
916 }
917 docConsole.setSaved(false);
918 sfc.updateSpdPcdDefinition(row, cName, token, dataType, usage, ts, defaultVal, help, archList, modTypeList);
919 }
920 }
921
922 /**
923 * This method initializes jCheckBox
924 *
925 * @return javax.swing.JCheckBox
926 */
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");
942 }
943 }
944 });
945 }
946 return jCheckBoxFeatureFlag;
947 }
948
949 /**
950 * This method initializes jCheckBox1
951 *
952 * @return javax.swing.JCheckBox
953 */
954 private JCheckBox getJCheckBoxFixedAtBuild() {
955 if (jCheckBoxFixedAtBuild == null) {
956 jCheckBoxFixedAtBuild = new JCheckBox();
957
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);
965 }
966 }
967 });
968 }
969 return jCheckBoxFixedAtBuild;
970 }
971
972 /**
973 * This method initializes jCheckBox2
974 *
975 * @return javax.swing.JCheckBox
976 */
977 private JCheckBox getJCheckBoxPatchInMod() {
978 if (jCheckBoxPatchInMod == null) {
979 jCheckBoxPatchInMod = new JCheckBox();
980
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);
989 }
990 }
991 });
992 }
993 return jCheckBoxPatchInMod;
994 }
995
996 /**
997 * This method initializes jCheckBox3
998 *
999 * @return javax.swing.JCheckBox
1000 */
1001 private JCheckBox getJCheckBoxDyn() {
1002 if (jCheckBoxDyn == null) {
1003 jCheckBoxDyn = new JCheckBox();
1004
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);
1012 }
1013 }
1014 });
1015 }
1016 return jCheckBoxDyn;
1017 }
1018
1019 /**
1020 * This method initializes jCheckBox4
1021 *
1022 * @return javax.swing.JCheckBox
1023 */
1024 private JCheckBox getJCheckBoxDynEx() {
1025 if (jCheckBoxDynEx == null) {
1026 jCheckBoxDynEx = new JCheckBox();
1027
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);
1035 }
1036 }
1037 });
1038 }
1039 return jCheckBoxDynEx;
1040 }
1041
1042 private String getValidUsage(boolean ff, boolean fab, boolean pim, boolean d, boolean de) {
1043 String usage = "";
1044 if (ff){
1045 usage += "FEATURE_FLAG ";
1046 }
1047 if (fab){
1048 usage += "FIXED_AT_BUILD ";
1049 }
1050 if (pim){
1051 usage += "PATCHABLE_IN_MODULE ";
1052 }
1053 if (d){
1054 usage += "DYNAMIC ";
1055 }
1056 if (de){
1057 usage += "DYNAMIC_EX ";
1058 }
1059
1060 return usage.trim();
1061 }
1062
1063 private boolean tokenCNameExisted(String token, String cName) throws Exception{
1064 Long inputToken = Long.decode(token);
1065
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.");
1069 return true;
1070 }
1071 if (model.getValueAt(i, 1).equals(token)) {
1072 JOptionPane.showMessageDialog(frame, "Token already existed in table.");
1073 return true;
1074 }
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.");
1078 return true;
1079 }
1080
1081 }
1082 return false;
1083 }
1084
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.");
1088 return false;
1089 }
1090 return true;
1091 }
1092 private boolean dataValidation(Object[] row) throws Exception{
1093
1094 if (!DataValidation.isC_NameType(row[0].toString())) {
1095 JOptionPane.showMessageDialog(frame, "C_Name is NOT C_NameType.");
1096 return false;
1097 }
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.");
1101 return false;
1102 }
1103 if (!DataValidation.isC_NameType(row[2].toString())) {
1104 JOptionPane.showMessageDialog(frame, "Token Space is NOT C_NameType");
1105 return false;
1106 }
1107 if (row[5].toString().length() == 0) {
1108 JOptionPane.showMessageDialog(frame, "HelpText could NOT be empty.");
1109 return false;
1110 }
1111 return true;
1112 }
1113
1114 /**
1115 * This method initializes jScrollPane1
1116 *
1117 * @return javax.swing.JScrollPane
1118 */
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));
1125 }
1126 return jScrollPaneArch;
1127 }
1128
1129 /**
1130 * This method initializes iCheckBoxList
1131 *
1132 * @return org.tianocore.frameworkwizard.common.ui.iCheckBoxList.ICheckBoxList
1133 */
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>();
1139 v.add("IA32");
1140 v.add("X64");
1141 v.add("IPF");
1142 v.add("EBC");
1143 v.add("ARM");
1144 v.add("PPC");
1145 iCheckBoxListArch.setAllItems(v);
1146 }
1147 return iCheckBoxListArch;
1148 }
1149
1150 /**
1151 * This method initializes jScrollPane2
1152 *
1153 * @return javax.swing.JScrollPane
1154 */
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));
1161 }
1162 return jScrollPaneMod;
1163 }
1164
1165 /**
1166 * This method initializes iCheckBoxList1
1167 *
1168 * @return org.tianocore.frameworkwizard.common.ui.iCheckBoxList.ICheckBoxList
1169 */
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>();
1175 v.add("BASE");
1176 v.add("SEC");
1177 v.add("PEI_CORE");
1178 v.add("PEIM");
1179 v.add("DXE_CORE");
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);
1188 }
1189 return iCheckBoxListMod;
1190 }
1191
1192 protected String vectorToString(Vector<String> v) {
1193 if (v == null) {
1194 return null;
1195 }
1196 String s = " ";
1197 for (int i = 0; i < v.size(); ++i) {
1198 s += v.get(i);
1199 s += " ";
1200 }
1201 return s.trim();
1202 }
1203
1204 protected Vector<String> stringToVector(String s){
1205 Vector<String> v = new Vector<String>();
1206 if (s == null) {
1207 return v;
1208 }
1209 String[] sArray = s.split(" ");
1210
1211 for (int i = 0; i < sArray.length; ++i) {
1212 v.add(sArray[i]);
1213 }
1214 return v;
1215 }
1216
1217 private boolean compareTwoVectors(Vector v1, Vector v2) {
1218 if (v1.size() != v2.size()) {
1219 return false;
1220 }
1221 for (int i = 0; i < v1.size(); ++i) {
1222 if (!v2.contains(v1.get(i))) {
1223 return false;
1224 }
1225 }
1226 return true;
1227 }
1228 } // @jve:decl-index=0:visual-constraint="22,11"
1229
1230 class CheckboxTableModel extends DefaultTableModel {
1231 /**
1232 *
1233 */
1234 private static final long serialVersionUID = 1L;
1235
1236 public Class<?> getColumnClass (int c) {
1237 if (getValueAt(0, c) != null){
1238 return getValueAt(0, c).getClass();
1239 }
1240 return String.class;
1241 }
1242 }