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