]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - Tools/Java/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdModuleSA.java
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2297 6f19259b...
[mirror_edk2.git] / Tools / Java / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / platform / ui / FpdModuleSA.java
... / ...
CommitLineData
1package org.tianocore.frameworkwizard.platform.ui;\r
2\r
3import java.awt.BorderLayout;\r
4import java.awt.Dimension;\r
5import java.awt.Toolkit;\r
6\r
7import javax.swing.JOptionPane;\r
8import javax.swing.JPanel;\r
9import javax.swing.JDialog;\r
10import javax.swing.JTabbedPane;\r
11import javax.swing.JLabel;\r
12import javax.swing.JScrollPane;\r
13import javax.swing.JTable;\r
14import javax.swing.JTextArea;\r
15import javax.swing.JSplitPane;\r
16import javax.swing.JButton;\r
17import javax.swing.ListSelectionModel;\r
18import javax.swing.event.ListSelectionEvent;\r
19import javax.swing.event.ListSelectionListener;\r
20import javax.swing.event.TableModelEvent;\r
21import javax.swing.event.TableModelListener;\r
22import javax.swing.table.DefaultTableModel;\r
23import javax.swing.table.TableColumn;\r
24import javax.swing.table.TableModel;\r
25\r
26import org.tianocore.frameworkwizard.FrameworkWizardUI;\r
27import org.tianocore.frameworkwizard.common.DataValidation;\r
28import org.tianocore.frameworkwizard.common.GlobalData;\r
29import org.tianocore.frameworkwizard.common.IDefaultTableModel;\r
30import org.tianocore.frameworkwizard.common.Identifications.OpeningPlatformType;\r
31import org.tianocore.frameworkwizard.platform.ui.global.LibraryClassDescriptor;\r
32import org.tianocore.frameworkwizard.platform.ui.global.WorkspaceProfile;\r
33import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery;\r
34import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification;\r
35import org.tianocore.frameworkwizard.packaging.PackageIdentification;\r
36\r
37import java.awt.FlowLayout;\r
38import java.awt.event.ActionEvent;\r
39import java.awt.event.ActionListener;\r
40import java.util.ArrayList;\r
41import java.util.HashMap;\r
42import java.util.Iterator;\r
43import java.util.ListIterator;\r
44import java.util.Vector;\r
45\r
46import javax.swing.JTextField;\r
47import java.awt.GridLayout;\r
48import javax.swing.JComboBox;\r
49\r
50public class FpdModuleSA extends JDialog implements ActionListener {\r
51\r
52 /**\r
53 * \r
54 */\r
55 private static final long serialVersionUID = 1L;\r
56 private JPanel jContentPane = null;\r
57 private JTabbedPane jTabbedPane = null;\r
58 private JPanel jPanelPcd = null;\r
59 private JPanel jPanelLibrary = null;\r
60 private JLabel jLabelPcdData = null;\r
61 private JScrollPane jScrollPaneTablePcd = null;\r
62 private JTable jTablePcd = null;\r
63 private JPanel jPanelPcdSouth = null;\r
64 private JScrollPane jScrollPanePcdHelp = null;\r
65 private JTextArea jTextAreaPcdHelp = null;\r
66 private JPanel jPanelContentPaneSouth = null;\r
67 private JSplitPane jSplitPane = null;\r
68 private JPanel jPanelLibraryLeft = null;\r
69 private JPanel jPanelLibraryRight = null;\r
70 private JLabel jLabelLibClass = null;\r
71 private JLabel jLabelQualifiedInstance = null;\r
72 private JScrollPane jScrollPaneSelectedInstances = null;\r
73 private JTable jTableSelectedInstances = null;\r
74 private JScrollPane jScrollPaneLibClass = null;\r
75 private JTable jTableLibClass = null;\r
76 private JScrollPane jScrollPaneQualifiedInstance = null;\r
77 private JTable jTableLibInstances = null;\r
78 private JPanel jPanelLibrarySouth = null;\r
79 private JPanel jPanelLibraryCenter = null;\r
80 private JScrollPane jScrollPaneInstanceHelp = null;\r
81 private JTextArea jTextAreaInstanceHelp = null;\r
82 private JLabel jLabelSelectedInstances = null;\r
83 private JLabel jLabelInstanceHelp = null;\r
84 private JButton jButtonAdd = null;\r
85 private JButton jButtonDeleteInstance = null;\r
86 private JLabel jLabelPcdHelp = null;\r
87 private JButton jButtonOk = null;\r
88 private JButton jButtonCancel = null;\r
89 private IDefaultTableModel model = null;\r
90 private IDefaultTableModel selectedInstancesTableModel = null;\r
91 private IDefaultTableModel libClassTableModel = null;\r
92 private IDefaultTableModel libInstanceTableModel = null;\r
93 private DefaultTableModel optionsTableModel = null;\r
94 private FpdFileContents ffc = null;\r
95 private String moduleKey = null;\r
96 private ModuleIdentification moduleId = null;\r
97 private int moduleSaNum = -1;\r
98 private HashMap<LibraryClassDescriptor, ArrayList<String>> classInstanceMap = null;\r
99 //\r
100 // map of <{libName, supArch, supMod}, list of Module information>\r
101 //\r
102 private HashMap<LibraryClassDescriptor, ArrayList<String>> classConsumed = null;\r
103 private HashMap<LibraryClassDescriptor, ArrayList<String>> classProduced = null;\r
104 \r
105 private JPanel jPanelModuleSaOpts = null;\r
106 private JLabel jLabelFvBinding = null;\r
107 private JTextField jTextFieldFvBinding = null;\r
108 private JLabel jLabelFfsFileGuid = null;\r
109 private JTextField jTextFieldFileGuid = null;\r
110 private JLabel jLabelFfsFormatKey = null;\r
111 private JTextField jTextFieldFfsKey = null;\r
112 private JScrollPane jScrollPaneModuleSaOptions = null;\r
113 private JTable jTableModuleSaOptions = null;\r
114 private JButton jButtonNew = null;\r
115 private JButton jButtonDeleteOption = null;\r
116 private JPanel jPanelPcdFields = null;\r
117 private JPanel jPanelPcdFieldsSecondRow = null;\r
118 private JPanel jPanelPcdFieldsThirdRow = null;\r
119 private JPanel jPanelPcdFieldsFirstRow = null;\r
120 private JLabel jLabelItemType = null;\r
121 private JComboBox jComboBoxItemType = null;\r
122 private JLabel jLabelMaxDatumSize = null;\r
123 private JTextField jTextFieldMaxDatumSize = null;\r
124 private JLabel jLabelPcdDefaultValue = null;\r
125 private JTextField jTextFieldPcdDefault = null;\r
126 private JButton jButtonUpdatePcd = null;\r
127 private JComboBox jComboBoxFeatureFlagValue = null;\r
128 private OpeningPlatformType docConsole = null;\r
129 private JPanel jPanelCustomToolChain = null;\r
130 private JPanel jPanelToolchainS = null;\r
131 private JPanel jPanelLibraryCenterN = null;\r
132 private JPanel jPanelLibraryCenterC = null; // @jve:decl-index=0:visual-constraint="20,224"\r
133 \r
134 private final int buildTargetWidth = 150;\r
135 private final int toolChainFamilyWidth = 150;\r
136 private final int supportArchWidth = 150;\r
137 private final int toolCmdCodeWidth = 200;\r
138 private final int tagNameWidth = 150;\r
139 private final int argWidth = 400;\r
140 \r
141 /**\r
142 * This is the default constructor\r
143 */\r
144 public FpdModuleSA() {\r
145 super(FrameworkWizardUI.getInstance());\r
146 initialize();\r
147 }\r
148 public FpdModuleSA(FpdFileContents ffc) {\r
149 this();\r
150 this.ffc = ffc;\r
151 }\r
152 \r
153 public void setKey(String k, int i, OpeningPlatformType dc){\r
154 this.moduleKey = k;\r
155 moduleSaNum = i;\r
156 this.docConsole = dc;\r
157 classInstanceMap = null;\r
158 classProduced = null;\r
159 classConsumed = null;\r
160 jTabbedPane.setSelectedIndex(0);\r
161 initPcdBuildDefinition(i);\r
162 moduleId = WorkspaceProfile.getModuleId(moduleKey);\r
163 if (moduleId == null) {\r
164 return;\r
165 }\r
166 int tabIndex = jTabbedPane.indexOfTab("Libraries");\r
167 if (moduleId.isLibrary()) {\r
168 jTabbedPane.setEnabledAt(tabIndex, false);\r
169 }\r
170 else {\r
171 jTabbedPane.setEnabledAt(tabIndex, true);\r
172 }\r
173 }\r
174\r
175 /**\r
176 init will be called each time FpdModuleSA object is to be shown.\r
177 @param key Module information.\r
178 **/\r
179 public void initPcdBuildDefinition(int i) {\r
180 //\r
181 // display pcd for key.\r
182 //\r
183 model.setRowCount(0);\r
184 jTextAreaPcdHelp.setText("");\r
185 jComboBoxItemType.setSelectedIndex(-1);\r
186 jTextFieldMaxDatumSize.setText("");\r
187 jTextFieldPcdDefault.setText("");\r
188 int pcdCount = ffc.getPcdDataCount(i);\r
189 if (pcdCount != 0) {\r
190 String[][] saa = new String[pcdCount][7];\r
191 ffc.getPcdData(i, saa);\r
192 for (int j = 0; j < saa.length; ++j) {\r
193 model.addRow(saa[j]);\r
194 }\r
195 }\r
196 }\r
197 \r
198 public void initLibraries(String key) {\r
199 libClassTableModel.setRowCount(0);\r
200 libInstanceTableModel.setRowCount(0);\r
201 selectedInstancesTableModel.setRowCount(0);\r
202 Vector<String> errorMsg = new Vector<String>();\r
203 try {\r
204 //\r
205 // display library classes that need to be resolved. also potential instances for them.\r
206 //\r
207 resolveLibraryInstances(moduleKey, errorMsg);\r
208 } catch (Exception e) {\r
209 String exceptionMsg = e.getCause() + " " + e.getMessage();\r
210 errorMsg.add(exceptionMsg);\r
211 JOptionPane.showMessageDialog(FrameworkWizardUI.getInstance(), exceptionMsg);\r
212 }\r
213 //\r
214 // display lib instances already selected for key\r
215 //\r
216 \r
217 int instanceCount = ffc.getLibraryInstancesCount(key);\r
218 if (instanceCount != 0) {\r
219 String[][] saa = new String[instanceCount][5];\r
220 ffc.getLibraryInstances(key, saa);\r
221 for (int i = 0; i < saa.length; ++i) {\r
222 ModuleIdentification mi = WorkspaceProfile.getModuleId(saa[i][1] + " " + saa[i][2] + " " + saa[i][3]\r
223 + " " + saa[i][4]);\r
224 if (mi != null) {\r
225 //\r
226 // ToDo: verify this instance first.\r
227 //\r
228 saa[i][0] = mi.getName();\r
229 saa[i][2] = mi.getVersion();\r
230 saa[i][4] = mi.getPackageId().getVersion();\r
231 //\r
232 // re-evaluate lib instance usage when adding a already-selected lib instance.\r
233 //\r
234 try {\r
235 resolveLibraryInstances(saa[i][1] + " " + saa[i][2] + " " + saa[i][3] + " " + saa[i][4], errorMsg);\r
236 } catch (Exception e) {\r
237 String exceptionMsg = e.getCause() + " " + e.getMessage();\r
238 if (!errorMsg.contains(exceptionMsg)) {\r
239 JOptionPane.showMessageDialog(FrameworkWizardUI.getInstance(), e.getCause() + " " + e.getMessage());\r
240 }\r
241 }\r
242 selectedInstancesTableModel.addRow(saa[i]);\r
243 }\r
244 }\r
245 }\r
246\r
247 if (errorMsg.size() > 0) {\r
248 String errors = "";\r
249 for (int i = 0; i < errorMsg.size(); ++i) {\r
250 errors += " " + errorMsg.get(i) + "\n";\r
251 }\r
252 JOptionPane.showMessageDialog(FrameworkWizardUI.getInstance(), errors);\r
253 }\r
254 showClassToResolved();\r
255 }\r
256 \r
257 public void initFvInfo (String key) {\r
258 //\r
259 // display module SA options\r
260 //\r
261 jTextFieldFvBinding.setText("");\r
262 String fvBinding = ffc.getFvBinding(key);\r
263 if (fvBinding != null) {\r
264 jTextFieldFvBinding.setText(fvBinding);\r
265 }\r
266 jTextFieldFileGuid.setText("");\r
267 String fileGuid = ffc.getFfsFileNameGuid(key);\r
268 if (fileGuid != null) {\r
269 jTextFieldFileGuid.setText(fileGuid);\r
270 }\r
271 jTextFieldFfsKey.setText("");\r
272 String ffsKey = ffc.getFfsFormatKey(key);\r
273 if (ffsKey != null) {\r
274 jTextFieldFfsKey.setText(ffsKey);\r
275 }\r
276 }\r
277 \r
278 public void initToolChainOptions(String key) {\r
279 \r
280 optionsTableModel.setRowCount(0);\r
281 String[][] saa = new String[ffc.getModuleSAOptionsCount(key)][6];\r
282 ffc.getModuleSAOptions(key, saa);\r
283 for (int i = 0; i < saa.length; ++i) {\r
284 optionsTableModel.addRow(saa[i]);\r
285 }\r
286 }\r
287 \r
288 private void filterClassConsumedByArch (Vector<LibraryClassDescriptor> v) {\r
289 String[] moduleInfo = moduleKey.split(" ");\r
290 Vector<String> vModuleArchs = new Vector<String>();\r
291 //\r
292 // Skip guid, version information, get archs to check.\r
293 //\r
294 for (int i = 4; i < moduleInfo.length; ++i) {\r
295 vModuleArchs.add(moduleInfo[i]);\r
296 }\r
297 //\r
298 // if module will be built on all platforms, no filter needed for lib classes.\r
299 //\r
300 if (vModuleArchs.size() == 0) {\r
301 return;\r
302 }\r
303 \r
304 Iterator<LibraryClassDescriptor> iter = v.iterator();\r
305 while (iter.hasNext()) {\r
306 LibraryClassDescriptor libInfo = iter.next();\r
307\r
308 Vector<String> vSupArchs = libInfo.getVectorFromString(libInfo.supArchs);\r
309 \r
310 if (vSupArchs.size() == 0 || (vSupArchs.size() == 1 && vSupArchs.get(0).equalsIgnoreCase(""))) {\r
311 //\r
312 // update lib info to module archs only.\r
313 //\r
314 libInfo.supArchs = "";\r
315 for (int i = 0; i < vModuleArchs.size(); ++i) {\r
316 libInfo.supArchs += vModuleArchs.get(i);\r
317 libInfo.supArchs += " ";\r
318 }\r
319 libInfo.supArchs.trim();\r
320 continue;\r
321 }\r
322 //\r
323 // only retain those lib class used by module archs.\r
324 //\r
325 vSupArchs.retainAll(vModuleArchs);\r
326 if (vSupArchs.size() > 0) {\r
327 //\r
328 // update lib info to reflect which kind of arch need to select instance.\r
329 //\r
330 libInfo.supArchs = "";\r
331 for (int i = 0; i < vSupArchs.size(); ++i) {\r
332 libInfo.supArchs += vSupArchs.get(i);\r
333 libInfo.supArchs += " ";\r
334 }\r
335 libInfo.supArchs.trim();\r
336 continue;\r
337 }\r
338 //\r
339 // remove this lib definition if it supports no archs module will be built under.\r
340 //\r
341 iter.remove();\r
342 }\r
343 }\r
344 \r
345 private void resolveLibraryInstances(String key, Vector<String> errorMsg) throws MultipleInstanceException, NoInstanceException{\r
346 ModuleIdentification mi = WorkspaceProfile.getModuleId(key);\r
347 PackageIdentification[] depPkgList = null;\r
348 \r
349 //\r
350 // Get dependency pkg list into which we will search lib instances.\r
351 //\r
352 //depPkgList = SurfaceAreaQuery.getDependencePkg(null, mi);\r
353 //\r
354 // Get the lib class consumed, produced by this module itself.\r
355 //\r
356 Vector<LibraryClassDescriptor> vClassConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
357 for (int i = 0; i < vClassConsumed.size(); ++i) {\r
358 vClassConsumed.get(i).supModTypes = WorkspaceProfile.getModuleType(moduleId);\r
359 }\r
360 filterClassConsumedByArch(vClassConsumed);\r
361 if (this.classConsumed == null) {\r
362 this.classConsumed = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
363 }\r
364\r
365 for (int i = 0; i < vClassConsumed.size(); ++i) {\r
366 ArrayList<String> consumedBy = this.classConsumed.get(vClassConsumed.get(i));\r
367 if (consumedBy == null) {\r
368 consumedBy = new ArrayList<String>();\r
369 }\r
370 consumedBy.add(key);\r
371 this.classConsumed.put(vClassConsumed.get(i), consumedBy);\r
372 }\r
373\r
374 Vector<LibraryClassDescriptor> vClassProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
375 if (this.classProduced == null) {\r
376 this.classProduced = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
377 }\r
378 for (int i = 0; i < vClassProduced.size(); ++i) {\r
379 ArrayList<String> producedBy = this.classProduced.get(vClassProduced.get(i));\r
380 if (producedBy == null) {\r
381 producedBy = new ArrayList<String>();\r
382 }\r
383 //\r
384 // class already produced by previous module (lib instance).\r
385 /*\r
386 if (producedBy.size() == 1) {\r
387 String instanceKey = producedBy.get(0);\r
388 ModuleIdentification libMi = WorkspaceProfile.getModuleId(instanceKey);\r
389 throw new MultipleInstanceException (vClassProduced.get(i).className, libMi.getName(), mi.getName());\r
390 }\r
391 Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
392 while (lcdi.hasNext()) {\r
393 LibraryClassDescriptor lcd = lcdi.next();\r
394 if (vClassProduced.get(i).hasInterSectionWith(lcd)) {\r
395 ArrayList<String> alreadyProducedBy = this.classProduced.get(lcd);\r
396 String instanceKey = alreadyProducedBy.get(0);\r
397 ModuleIdentification libMi = WorkspaceProfile.getModuleId(instanceKey);\r
398 throw new MultipleInstanceException (vClassProduced.get(i).className, libMi.getName(), mi.getName());\r
399 }\r
400 }\r
401 */\r
402 // normal case.\r
403 //\r
404 producedBy.add(key);\r
405 this.classProduced.put(vClassProduced.get(i), producedBy);\r
406 \r
407 }\r
408\r
409 //\r
410 // find potential instances in all pkgs for classes still in classConsumed.\r
411 //\r
412 if (classInstanceMap == null) {\r
413 classInstanceMap = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
414 }\r
415 Iterator<LibraryClassDescriptor> lic = this.classConsumed.keySet().iterator();\r
416 while (lic.hasNext()) {\r
417 LibraryClassDescriptor cls = lic.next();\r
418 if (isBoundedClass(cls, errorMsg)) {\r
419 continue;\r
420 }\r
421 ArrayList<String> instances = getInstancesForClass(cls, depPkgList);\r
422 if (instances.size() == 0) {\r
423// throw new NoInstanceException (cls.className);\r
424 String exceptionMsg = new NoInstanceException (cls.className).getMessage();\r
425 if (!errorMsg.contains(exceptionMsg)) {\r
426 errorMsg.add(exceptionMsg); \r
427 }\r
428 \r
429 }\r
430 classInstanceMap.put(cls, instances);\r
431\r
432 }\r
433// showClassToResolved();\r
434 }\r
435\r
436 /**Search classProduced map to see if this class has been produced by some instance (module).\r
437 * @param cls\r
438 * @return\r
439 */\r
440 private boolean isBoundedClass (LibraryClassDescriptor cls, Vector<String> errorMsg) {\r
441// if (this.classProduced.containsKey(cls)) {\r
442// return true;\r
443// }\r
444 Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
445 while (lcdi.hasNext()) {\r
446 LibraryClassDescriptor lcd = lcdi.next();\r
447 if (cls.className.equals(lcd.className)) {\r
448 if (cls.isSubSetByArchs(lcd) && cls.isSubSetByModTypes(lcd)) {\r
449 return true;\r
450 }\r
451 else {\r
452 ArrayList<String> producedBy = this.classProduced.get(lcd);\r
453 String instancesName = "";\r
454 for (int i = 0; i < producedBy.size(); ++i) {\r
455 ModuleIdentification mi = WorkspaceProfile.getModuleId(producedBy.get(i));\r
456 instancesName += mi.getName();\r
457 instancesName += " ";\r
458 }\r
459 String msg = new ImproperInstanceException(lcd.className, instancesName, lcd.supArchs, lcd.supModTypes).getMessage();\r
460 if (!errorMsg.contains(msg)) {\r
461 errorMsg.add(msg);\r
462 }\r
463 }\r
464 }\r
465 }\r
466 \r
467 return false;\r
468 }\r
469 \r
470 private ArrayList<String> getInstancesForClass(LibraryClassDescriptor cls, PackageIdentification[] depPkgList){\r
471 ArrayList<String> al = new ArrayList<String>();\r
472 \r
473// for (int i = 0; i < depPkgList.length; ++i) {\r
474 Iterator ismi = GlobalData.vModuleList.iterator();\r
475 while(ismi.hasNext()) {\r
476 ModuleIdentification mi = (ModuleIdentification)ismi.next();\r
477// if (!mi.getPackageId().getGuid().equalsIgnoreCase(depPkgList[i].getGuid())) {\r
478// continue;\r
479// }\r
480 Vector<LibraryClassDescriptor> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
481 \r
482 boolean isPotential = false;\r
483 Iterator<LibraryClassDescriptor> lcdi = clsProduced.iterator();\r
484 while (lcdi.hasNext()) {\r
485 LibraryClassDescriptor lcd = lcdi.next();\r
486 if (cls.isSubSetByArchs(lcd) && cls.isSubSetByModTypes(lcd)){\r
487 isPotential = true;\r
488 }\r
489 \r
490 if (isPotential && hasBeenProduced(lcd)) {\r
491 isPotential = false;\r
492 break;\r
493 }\r
494 }\r
495 if (isPotential) {\r
496 al.add(mi.getGuid() + " " + mi.getVersion() + " " + \r
497 mi.getPackageId().getGuid() + " " + mi.getPackageId().getVersion());\r
498 }\r
499 }\r
500// }\r
501 \r
502 return al;\r
503 }\r
504 \r
505 private boolean hasBeenProduced (LibraryClassDescriptor cls) {\r
506 Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
507 while (lcdi.hasNext()) {\r
508 LibraryClassDescriptor lcd = lcdi.next();\r
509 if (cls.isSubSetByArchs(lcd) && cls.isSubSetByModTypes(lcd)) {\r
510 return true;\r
511 }\r
512 }\r
513 return false;\r
514 }\r
515 \r
516 private ArrayList<String> getConsumedBy (String className) {\r
517 Iterator<LibraryClassDescriptor> lcdi = this.classConsumed.keySet().iterator();\r
518 while (lcdi.hasNext()) {\r
519 LibraryClassDescriptor lcd = lcdi.next();\r
520 if ((lcd.className != null) && lcd.className.equals(className)) {\r
521 return this.classConsumed.get(lcd);\r
522 }\r
523 }\r
524 return null;\r
525 }\r
526 \r
527 private void removeInstance(String key) {\r
528 ModuleIdentification mi = WorkspaceProfile.getModuleId(key); \r
529 //\r
530 // remove pcd information of instance from current ModuleSA\r
531 //\r
532 ffc.removePcdData(moduleKey, mi);\r
533 //\r
534 // remove class produced by this instance and add back these produced class to be bound.\r
535 //\r
536 Vector<LibraryClassDescriptor> clsProduced = getClassProduced(mi);\r
537 for (int i = 0; i < clsProduced.size(); ++i) {\r
538 \r
539 classProduced.remove(clsProduced.get(i));\r
540 }\r
541 //\r
542 // remove class consumed by this instance. we do not need to bound it now.\r
543 //\r
544 String[] clsConsumed = getClassConsumed(mi);\r
545 for (int i = 0; i < clsConsumed.length; ++i) {\r
546 ArrayList<String> al = getConsumedBy (clsConsumed[i]);\r
547 \r
548 if (al == null ) {\r
549 continue;\r
550 }\r
551 al.remove(key);\r
552 \r
553 }\r
554 \r
555 showClassToResolved();\r
556 \r
557 }\r
558 \r
559 \r
560 private Vector<LibraryClassDescriptor> getClassProduced(ModuleIdentification mi){\r
561 \r
562 Vector<LibraryClassDescriptor> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
563 return clsProduced;\r
564// String[] sClassProduced = new String[clsProduced.size()];\r
565// for (int i = 0; i < clsProduced.size(); ++i) {\r
566// sClassProduced[i] = clsProduced.get(i).className;\r
567// }\r
568// return sClassProduced;\r
569 }\r
570 \r
571 private String[] getClassConsumed(ModuleIdentification mi){\r
572 \r
573 Vector<LibraryClassDescriptor> clsConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
574 String[] sClassConsumed = new String[clsConsumed.size()];\r
575 for (int i = 0; i < clsConsumed.size(); ++i) {\r
576 sClassConsumed[i] = clsConsumed.get(i).className;\r
577 }\r
578 return sClassConsumed;\r
579 }\r
580 \r
581 private void showClassToResolved(){\r
582 Vector<String> errorMsg = new Vector<String>();\r
583 libClassTableModel.setRowCount(0);\r
584 libInstanceTableModel.setRowCount(0);\r
585 if (classConsumed == null || classConsumed.size() == 0) {\r
586 return;\r
587 }\r
588 Iterator<LibraryClassDescriptor> li = classConsumed.keySet().iterator();\r
589 while(li.hasNext()){\r
590 LibraryClassDescriptor lcd = li.next();\r
591 String[] s = {lcd.className, lcd.supArchs, lcd.supModTypes};\r
592 if (classConsumed.get(lcd) == null || classConsumed.get(lcd).size() == 0) {\r
593 continue;\r
594 }\r
595 \r
596 if (!isBoundedClass(lcd, errorMsg)){\r
597 libClassTableModel.addRow(s);\r
598 }\r
599 }\r
600 \r
601 if (errorMsg.size() > 0) {\r
602 String errors = "";\r
603 for (int i = 0; i < errorMsg.size(); ++i) {\r
604 errors += " " + errorMsg.get(i) + "\n";\r
605 }\r
606 JOptionPane.showMessageDialog(FrameworkWizardUI.getInstance(), errors);\r
607 }\r
608 }\r
609 \r
610 private String getModuleArch () {\r
611 String arch = "";\r
612 String[] moduleInfo = moduleKey.split(" ");\r
613 for (int i = 4; i < moduleInfo.length; ++i) {\r
614 arch += moduleInfo[i];\r
615 arch += " ";\r
616 }\r
617 return arch.trim();\r
618 }\r
619 private void addLibInstance (ModuleIdentification libMi) throws Exception{\r
620 \r
621 //\r
622 // Add pcd information of selected instance to current moduleSA\r
623 //\r
624 ffc.addFrameworkModulesPcdBuildDefs(libMi, getModuleArch(), ffc.getModuleSA(moduleKey));\r
625 \r
626 ffc.genLibraryInstance(libMi, moduleKey);\r
627 }\r
628 /**\r
629 * This method initializes this\r
630 * \r
631 * @return void\r
632 */\r
633 private void initialize() {\r
634 this.setSize(877, 555);\r
635 this.setResizable(false);\r
636 this.centerWindow();\r
637 this.setModal(true);\r
638 this.setTitle("Module Settings");\r
639 this.setContentPane(getJContentPane());\r
640 }\r
641\r
642 /**\r
643 * This method initializes jContentPane\r
644 * \r
645 * @return javax.swing.JPanel\r
646 */\r
647 private JPanel getJContentPane() {\r
648 if (jContentPane == null) {\r
649 jContentPane = new JPanel();\r
650 jContentPane.setLayout(new BorderLayout());\r
651 jContentPane.add(getJTabbedPane(), java.awt.BorderLayout.CENTER);\r
652 jContentPane.add(getJPanelContentPaneSouth(), java.awt.BorderLayout.SOUTH);\r
653 }\r
654 return jContentPane;\r
655 }\r
656\r
657 /**\r
658 * This method initializes jTabbedPane \r
659 * \r
660 * @return javax.swing.JTabbedPane \r
661 */\r
662 private JTabbedPane getJTabbedPane() {\r
663 if (jTabbedPane == null) {\r
664 jTabbedPane = new JTabbedPane();\r
665 jTabbedPane.addTab("PCD Build Definition", null, getJPanelPcd(), null);\r
666 jTabbedPane.addTab("Libraries", null, getJPanelLibrary(), null);\r
667 jTabbedPane.addTab("FV Info", null, getJPanelModuleSaOpts(), null);\r
668 jTabbedPane.addTab("Custom Toolchain", null, getJPanelCustomToolChain(), null);\r
669 \r
670 }\r
671 return jTabbedPane;\r
672 }\r
673\r
674 /**\r
675 * This method initializes jPanelPcd\r
676 * \r
677 * @return javax.swing.JPanel \r
678 */\r
679 private JPanel getJPanelPcd() {\r
680 if (jPanelPcd == null) {\r
681 jLabelPcdData = new JLabel();\r
682 jLabelPcdData.setText(" PCD Data");\r
683 jPanelPcd = new JPanel();\r
684 jPanelPcd.setLayout(new BorderLayout());\r
685 jPanelPcd.add(jLabelPcdData, java.awt.BorderLayout.NORTH);\r
686 jPanelPcd.add(getJScrollPaneTablePcd(), java.awt.BorderLayout.CENTER);\r
687 jPanelPcd.add(getJPanelPcdSouth(), java.awt.BorderLayout.SOUTH);\r
688 jPanelPcd.addComponentListener(new java.awt.event.ComponentAdapter() {\r
689 public void componentShown(java.awt.event.ComponentEvent e) {\r
690 initPcdBuildDefinition(moduleSaNum);\r
691 }\r
692 });\r
693 \r
694 }\r
695 return jPanelPcd;\r
696 }\r
697\r
698 /**\r
699 * This method initializes jPanelLibrary\r
700 * \r
701 * @return javax.swing.JPanel \r
702 */\r
703 private JPanel getJPanelLibrary() {\r
704 if (jPanelLibrary == null) {\r
705 jPanelLibrary = new JPanel();\r
706 jPanelLibrary.setLayout(new BorderLayout());\r
707 jPanelLibrary.add(getJSplitPane(), java.awt.BorderLayout.NORTH);\r
708 jPanelLibrary.add(getJPanelLibrarySouth(), java.awt.BorderLayout.SOUTH);\r
709 jPanelLibrary.add(getJPanelLibraryCenter(), java.awt.BorderLayout.CENTER);\r
710 jPanelLibrary.addComponentListener(new java.awt.event.ComponentAdapter() {\r
711 public void componentShown(java.awt.event.ComponentEvent e) {\r
712 initLibraries(moduleKey);\r
713 }\r
714 });\r
715 }\r
716 return jPanelLibrary;\r
717 }\r
718\r
719 /**\r
720 * This method initializes jScrollPaneTablePcd\r
721 * \r
722 * @return javax.swing.JScrollPane \r
723 */\r
724 private JScrollPane getJScrollPaneTablePcd() {\r
725 if (jScrollPaneTablePcd == null) {\r
726 jScrollPaneTablePcd = new JScrollPane();\r
727 jScrollPaneTablePcd.setViewportView(getJTablePcd());\r
728 }\r
729 return jScrollPaneTablePcd;\r
730 }\r
731\r
732 /**\r
733 * This method initializes jTable \r
734 * \r
735 * @return javax.swing.JTable \r
736 */\r
737 private JTable getJTablePcd() {\r
738 if (jTablePcd == null) {\r
739 model = new IDefaultTableModel();\r
740 jTablePcd = new JTable(model);\r
741 jTablePcd.setRowHeight(20);\r
742 jTablePcd.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);\r
743 model.addColumn("CName");\r
744 model.addColumn("TokenSpaceGUID");\r
745 model.addColumn("ItemType");\r
746 model.addColumn("Token");\r
747 model.addColumn("MaxDatumSize");\r
748 model.addColumn("DataType");\r
749 model.addColumn("DefaultValue");\r
750 \r
751 jTablePcd.getColumnModel().getColumn(0).setMinWidth(250);\r
752 \r
753 TableColumn tokenColumn = jTablePcd.getColumnModel().getColumn(3);\r
754 jTablePcd.removeColumn(tokenColumn);\r
755 \r
756 jTablePcd.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
757 jTablePcd.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
758 public void valueChanged(ListSelectionEvent e) {\r
759 \r
760 if (e.getValueIsAdjusting()){\r
761 return;\r
762 }\r
763 ListSelectionModel lsm = (ListSelectionModel)e.getSource();\r
764 if (lsm.isSelectionEmpty()) {\r
765 return;\r
766 }\r
767 else{\r
768 int selectedRow = lsm.getMinSelectionIndex();\r
769 String cName = model.getValueAt(selectedRow, 0)+"";\r
770 String tsGuid = model.getValueAt(selectedRow, 1)+"";\r
771 String itemType = model.getValueAt(selectedRow, 2)+"";\r
772 //\r
773 // array for pcd related information: helpText, itemType, moduleType.\r
774 //\r
775 String[] pcdInfo = {"", "", ""};\r
776 Vector<String> validPcdTypes = new Vector<String>();\r
777 getPcdInfo(moduleKey, cName, tsGuid, pcdInfo, validPcdTypes);\r
778 jTextAreaPcdHelp.setText(pcdInfo[0]);\r
779 initComboBox(pcdInfo[1], pcdInfo[2], validPcdTypes);\r
780 jComboBoxItemType.setSelectedItem(itemType);\r
781 jTextFieldMaxDatumSize.setEnabled(true);\r
782 jTextFieldMaxDatumSize.setVisible(true);\r
783 jTextFieldMaxDatumSize.setText(model.getValueAt(selectedRow, 4)+"");\r
784 jTextFieldPcdDefault.setEnabled(true);\r
785 jTextFieldPcdDefault.setText(model.getValueAt(selectedRow, 6)+"");\r
786 if ((model.getValueAt(selectedRow, 5) != null) && model.getValueAt(selectedRow, 5).equals("VOID*")) {\r
787 if (pcdInfo[1].equals("FEATURE_FLAG")) {\r
788 jTextFieldMaxDatumSize.setVisible(false);\r
789 }\r
790 else if (pcdInfo[1].equals("FIXED_AT_BUILD")) {\r
791 try{\r
792 jTextFieldMaxDatumSize.setEnabled(false);\r
793 jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(model.getValueAt(selectedRow, 6)+"")+"");\r
794 }\r
795 catch(Exception except){\r
796 JOptionPane.showMessageDialog(FpdModuleSA.this, "Unacceptable PCD Value: " + except.getMessage());\r
797 }\r
798 }\r
799 else{\r
800 jTextFieldMaxDatumSize.setText(model.getValueAt(selectedRow, 4)+"");\r
801 }\r
802 }\r
803 else {\r
804 jTextFieldMaxDatumSize.setEnabled(false);\r
805 }\r
806 \r
807 if (!model.getValueAt(selectedRow, 2).equals("DYNAMIC") && !model.getValueAt(selectedRow, 2).equals("DYNAMIC_EX")) {\r
808 jTextFieldPcdDefault.setText(model.getValueAt(selectedRow, 6)+"");\r
809 if (model.getValueAt(selectedRow, 2).equals("FEATURE_FLAG")){\r
810 jTextFieldPcdDefault.setVisible(false);\r
811 jComboBoxFeatureFlagValue.setVisible(true);\r
812 jComboBoxFeatureFlagValue.setSelectedItem(model.getValueAt(selectedRow, 6)+"");\r
813 }\r
814 else{\r
815 jTextFieldPcdDefault.setVisible(true);\r
816 jTextFieldPcdDefault.setEnabled(true);\r
817 jComboBoxFeatureFlagValue.setVisible(false);\r
818 }\r
819 }\r
820 else{\r
821 jTextFieldPcdDefault.setEnabled(false);\r
822 }\r
823 }\r
824 \r
825 \r
826 }\r
827 });\r
828 \r
829 }\r
830 return jTablePcd;\r
831 }\r
832 \r
833 private void initComboBox(String originalType, String mType, Vector<String> validPcdTypes) {\r
834 jComboBoxItemType.removeAllItems();\r
835\r
836 if (originalType.equals("DYNAMIC")) {\r
837 for (int i = 0; i < validPcdTypes.size(); ++i) {\r
838 jComboBoxItemType.addItem(validPcdTypes.get(i));\r
839 }\r
840 }\r
841 else {\r
842 jComboBoxItemType.addItem(originalType);\r
843 }\r
844 }\r
845 \r
846 /**\r
847 * @param cName\r
848 * @param tsGuid\r
849 * @param sa sa[0]: HelpText; sa[1]: itemType in Msa; sa[2]: isBinary;\r
850 */\r
851 private void getPcdInfo(String moduleKey, String cName, String tsGuid, String[] sa, Vector<String> validPcdTypes) {\r
852 String[][] saa = new String[ffc.getLibraryInstancesCount(moduleKey)][5];\r
853 ffc.getLibraryInstances(moduleKey, saa);\r
854 \r
855 try{\r
856 if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(moduleKey), cName, tsGuid, sa, validPcdTypes)) {\r
857 return;\r
858 }\r
859 for (int j = 0; j < saa.length; ++j) {\r
860 if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(saa[j][1] + " " + saa[j][2] + " " + saa[j][3] + " " + saa[j][4]),\r
861 cName, tsGuid, sa, validPcdTypes)) {\r
862 return;\r
863 }\r
864 }\r
865 }\r
866 catch(Exception e) {\r
867 JOptionPane.showMessageDialog(this, "Get PCD details fail: " + e.getMessage());\r
868 }\r
869 }\r
870\r
871 /**\r
872 * This method initializes jPanelPcdSouth\r
873 * \r
874 * @return javax.swing.JPanel \r
875 */\r
876 private JPanel getJPanelPcdSouth() {\r
877 if (jPanelPcdSouth == null) {\r
878 jLabelPcdHelp = new JLabel();\r
879 jLabelPcdHelp.setText("PCD Description");\r
880 jPanelPcdSouth = new JPanel();\r
881 jPanelPcdSouth.setPreferredSize(new java.awt.Dimension(607,200));\r
882 jPanelPcdSouth.add(jLabelPcdHelp, null);\r
883 jPanelPcdSouth.add(getJScrollPanePcdHelp(), null);\r
884 jPanelPcdSouth.add(getJPanelPcdFields(), null);\r
885 }\r
886 return jPanelPcdSouth;\r
887 }\r
888\r
889 /**\r
890 * This method initializes jScrollPanePcdHelp\r
891 * \r
892 * @return javax.swing.JScrollPane \r
893 */\r
894 private JScrollPane getJScrollPanePcdHelp() {\r
895 if (jScrollPanePcdHelp == null) {\r
896 jScrollPanePcdHelp = new JScrollPane();\r
897 jScrollPanePcdHelp.setPreferredSize(new java.awt.Dimension(500,100));\r
898 jScrollPanePcdHelp.setViewportView(getJTextAreaPcdHelp());\r
899 }\r
900 return jScrollPanePcdHelp;\r
901 }\r
902\r
903 /**\r
904 * This method initializes jTextAreaPcdHelp\r
905 * \r
906 * @return javax.swing.JTextArea \r
907 */\r
908 private JTextArea getJTextAreaPcdHelp() {\r
909 if (jTextAreaPcdHelp == null) {\r
910 jTextAreaPcdHelp = new JTextArea();\r
911 jTextAreaPcdHelp.setEditable(false);\r
912 }\r
913 return jTextAreaPcdHelp;\r
914 }\r
915\r
916 /**\r
917 * This method initializes jPanelContentPaneSouth\r
918 * \r
919 * @return javax.swing.JPanel \r
920 */\r
921 private JPanel getJPanelContentPaneSouth() {\r
922 if (jPanelContentPaneSouth == null) {\r
923 FlowLayout flowLayout = new FlowLayout();\r
924 flowLayout.setAlignment(java.awt.FlowLayout.RIGHT);\r
925 jPanelContentPaneSouth = new JPanel();\r
926 jPanelContentPaneSouth.setLayout(flowLayout);\r
927 jPanelContentPaneSouth.add(getJButtonOk(), null);\r
928 jPanelContentPaneSouth.add(getJButtonCancel(), null);\r
929 }\r
930 return jPanelContentPaneSouth;\r
931 }\r
932\r
933 /**\r
934 * This method initializes jSplitPane \r
935 * \r
936 * @return javax.swing.JSplitPane \r
937 */\r
938 private JSplitPane getJSplitPane() {\r
939 if (jSplitPane == null) {\r
940 jSplitPane = new JSplitPane();\r
941 jSplitPane.setDividerLocation(200);\r
942 jSplitPane.setLeftComponent(getJPanelLibraryLeft());\r
943 jSplitPane.setRightComponent(getJPanelLibraryRight());\r
944 jSplitPane.setPreferredSize(new java.awt.Dimension(202,200));\r
945 }\r
946 return jSplitPane;\r
947 }\r
948\r
949 /**\r
950 * This method initializes jPanelLibraryLeft\r
951 * \r
952 * @return javax.swing.JPanel \r
953 */\r
954 private JPanel getJPanelLibraryLeft() {\r
955 if (jPanelLibraryLeft == null) {\r
956 jLabelLibClass = new JLabel();\r
957 jLabelLibClass.setText("Library Classes Uninstantiated");\r
958 jPanelLibraryLeft = new JPanel();\r
959 jPanelLibraryLeft.add(jLabelLibClass, null);\r
960 jPanelLibraryLeft.add(getJScrollPaneLibClass(), null);\r
961 }\r
962 return jPanelLibraryLeft;\r
963 }\r
964\r
965 /**\r
966 * This method initializes jPanelLibraryRight\r
967 * \r
968 * @return javax.swing.JPanel \r
969 */\r
970 private JPanel getJPanelLibraryRight() {\r
971 if (jPanelLibraryRight == null) {\r
972 jLabelQualifiedInstance = new JLabel();\r
973 jLabelQualifiedInstance.setText("Instances Available");\r
974 jPanelLibraryRight = new JPanel();\r
975 jPanelLibraryRight.add(jLabelQualifiedInstance, null);\r
976 jPanelLibraryRight.add(getJScrollPaneQualifiedInstance(), null);\r
977 }\r
978 return jPanelLibraryRight;\r
979 }\r
980\r
981 /**\r
982 * This method initializes jScrollPaneSelectedInstances\r
983 * \r
984 * @return javax.swing.JScrollPane \r
985 */\r
986 private JScrollPane getJScrollPaneSelectedInstances() {\r
987 if (jScrollPaneSelectedInstances == null) {\r
988 jScrollPaneSelectedInstances = new JScrollPane();\r
989 jScrollPaneSelectedInstances.setPreferredSize(new java.awt.Dimension(600,150));\r
990 jScrollPaneSelectedInstances.setViewportView(getJTableSelectedInstances());\r
991 }\r
992 return jScrollPaneSelectedInstances;\r
993 }\r
994\r
995 /**\r
996 * This method initializes jTableSelectedInstances\r
997 * \r
998 * @return javax.swing.JTable \r
999 */\r
1000 private JTable getJTableSelectedInstances() {\r
1001 if (jTableSelectedInstances == null) {\r
1002 selectedInstancesTableModel = new IDefaultTableModel();\r
1003 selectedInstancesTableModel.addColumn("Name");\r
1004 selectedInstancesTableModel.addColumn("ModuleGUID");\r
1005 selectedInstancesTableModel.addColumn("ModuleVersion");\r
1006 selectedInstancesTableModel.addColumn("PackageGUID");\r
1007 selectedInstancesTableModel.addColumn("PackageVersion");\r
1008 jTableSelectedInstances = new JTable(selectedInstancesTableModel);\r
1009 jTableSelectedInstances.setRowHeight(20);\r
1010 \r
1011 jTableSelectedInstances.getColumnModel().getColumn(0).setMinWidth(250);\r
1012 \r
1013 jTableSelectedInstances.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);\r
1014 jTableSelectedInstances.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
1015 \r
1016 }\r
1017 return jTableSelectedInstances;\r
1018 }\r
1019\r
1020 /**\r
1021 * This method initializes jScrollPaneLibClass\r
1022 * \r
1023 * @return javax.swing.JScrollPane \r
1024 */\r
1025 private JScrollPane getJScrollPaneLibClass() {\r
1026 if (jScrollPaneLibClass == null) {\r
1027 jScrollPaneLibClass = new JScrollPane();\r
1028 jScrollPaneLibClass.setPreferredSize(new java.awt.Dimension(200,170));\r
1029 jScrollPaneLibClass.setViewportView(getJTableLibClass());\r
1030 }\r
1031 return jScrollPaneLibClass;\r
1032 }\r
1033\r
1034 /**\r
1035 * This method initializes jTableLibClass\r
1036 * \r
1037 * @return javax.swing.JTable \r
1038 */\r
1039 private JTable getJTableLibClass() {\r
1040 if (jTableLibClass == null) {\r
1041 libClassTableModel = new IDefaultTableModel();\r
1042 libClassTableModel.addColumn("LibraryClass");\r
1043 libClassTableModel.addColumn("Arch");\r
1044 libClassTableModel.addColumn("ModType");\r
1045 jTableLibClass = new JTable(libClassTableModel);\r
1046 jTableLibClass.setRowHeight(20);\r
1047 jTableLibClass.setShowGrid(false);\r
1048 jTableLibClass.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
1049 \r
1050 TableColumn column = jTableLibClass.getColumnModel().getColumn(1);\r
1051 jTableLibClass.getColumnModel().removeColumn(column);\r
1052 column = jTableLibClass.getColumnModel().getColumn(1);\r
1053 jTableLibClass.getColumnModel().removeColumn(column);\r
1054 \r
1055 jTableLibClass.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
1056 public void valueChanged(ListSelectionEvent e) {\r
1057 if (e.getValueIsAdjusting()){\r
1058 return;\r
1059 }\r
1060 ListSelectionModel lsm = (ListSelectionModel)e.getSource();\r
1061 if (lsm.isSelectionEmpty()) {\r
1062 return;\r
1063 }\r
1064 else{\r
1065 int selectedRow2 = lsm.getMinSelectionIndex();\r
1066 if (selectedRow2 < 0) {\r
1067 return;\r
1068 }\r
1069 //\r
1070 // display potential lib instances according to class selection\r
1071 //\r
1072 libInstanceTableModel.setRowCount(0);\r
1073 String cls = libClassTableModel.getValueAt(selectedRow2, 0).toString();\r
1074 String arch = libClassTableModel.getValueAt(selectedRow2, 1).toString();\r
1075 String modType = libClassTableModel.getValueAt(selectedRow2, 2).toString();\r
1076 ArrayList<String> al = classInstanceMap.get(new LibraryClassDescriptor(cls, arch, modType));\r
1077 if (al == null) {\r
1078 return;\r
1079 }\r
1080 ListIterator<String> li = al.listIterator();\r
1081 while(li.hasNext()) {\r
1082 String instance = li.next();\r
1083 String[] s = {"", "", "", "", ""};\r
1084 if (WorkspaceProfile.getModuleId(instance) != null) {\r
1085 s[0] = WorkspaceProfile.getModuleId(instance).getName();\r
1086 }\r
1087 \r
1088 String[] instancePart = instance.split(" ");\r
1089 for (int i = 0; i < instancePart.length; ++i){\r
1090 s[i+1] = instancePart[i];\r
1091 }\r
1092 libInstanceTableModel.addRow(s);\r
1093 }\r
1094 \r
1095 }\r
1096 }\r
1097 });\r
1098 }\r
1099 return jTableLibClass;\r
1100 }\r
1101\r
1102 /**\r
1103 * This method initializes jScrollPaneQualifiedInstance\r
1104 * \r
1105 * @return javax.swing.JScrollPane \r
1106 */\r
1107 private JScrollPane getJScrollPaneQualifiedInstance() {\r
1108 if (jScrollPaneQualifiedInstance == null) {\r
1109 jScrollPaneQualifiedInstance = new JScrollPane();\r
1110 jScrollPaneQualifiedInstance.setPreferredSize(new java.awt.Dimension(600,170));\r
1111 jScrollPaneQualifiedInstance.setViewportView(getJTableLibInstances());\r
1112 }\r
1113 return jScrollPaneQualifiedInstance;\r
1114 }\r
1115\r
1116 /**\r
1117 * This method initializes jTableLibInstances\r
1118 * \r
1119 * @return javax.swing.JTable \r
1120 */\r
1121 private JTable getJTableLibInstances() {\r
1122 if (jTableLibInstances == null) {\r
1123 libInstanceTableModel = new IDefaultTableModel();\r
1124 libInstanceTableModel.addColumn("Name");\r
1125 libInstanceTableModel.addColumn("ModuleGUID");\r
1126 libInstanceTableModel.addColumn("ModuleVersion");\r
1127 libInstanceTableModel.addColumn("PackageGUID");\r
1128 libInstanceTableModel.addColumn("PackageVersion");\r
1129 jTableLibInstances = new JTable(libInstanceTableModel);\r
1130 jTableLibInstances.setRowHeight(20);\r
1131 \r
1132 jTableLibInstances.getColumnModel().getColumn(0).setMinWidth(250);\r
1133 \r
1134 jTableLibInstances.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);\r
1135 jTableLibInstances.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
1136 \r
1137 }\r
1138 return jTableLibInstances;\r
1139 }\r
1140\r
1141 /**\r
1142 * This method initializes jPanelLibrarySouth\r
1143 * \r
1144 * @return javax.swing.JPanel \r
1145 */\r
1146 private JPanel getJPanelLibrarySouth() {\r
1147 if (jPanelLibrarySouth == null) {\r
1148 jPanelLibrarySouth = new JPanel();\r
1149 }\r
1150 return jPanelLibrarySouth;\r
1151 }\r
1152\r
1153 /**\r
1154 * This method initializes jPanelLibraryCenter\r
1155 * \r
1156 * @return javax.swing.JPanel \r
1157 */\r
1158 private JPanel getJPanelLibraryCenter() {\r
1159 if (jPanelLibraryCenter == null) {\r
1160 jLabelInstanceHelp = new JLabel();\r
1161 jLabelInstanceHelp.setText("Instance Description");\r
1162 jLabelSelectedInstances = new JLabel();\r
1163 jLabelSelectedInstances.setText("Selected Instances");\r
1164 jPanelLibraryCenter = new JPanel();\r
1165 jPanelLibraryCenter.setLayout(new BorderLayout());\r
1166\r
1167 jPanelLibraryCenter.add(getJPanelLibraryCenterC(), java.awt.BorderLayout.CENTER);\r
1168 jPanelLibraryCenter.add(getJPanelLibraryCenterN(), java.awt.BorderLayout.NORTH);\r
1169\r
1170 }\r
1171 return jPanelLibraryCenter;\r
1172 }\r
1173\r
1174 /**\r
1175 * This method initializes jScrollPaneInstanceHelp\r
1176 * \r
1177 * @return javax.swing.JScrollPane \r
1178 */\r
1179 private JScrollPane getJScrollPaneInstanceHelp() {\r
1180 if (jScrollPaneInstanceHelp == null) {\r
1181 jScrollPaneInstanceHelp = new JScrollPane();\r
1182 jScrollPaneInstanceHelp.setPreferredSize(new java.awt.Dimension(400,50));\r
1183 jScrollPaneInstanceHelp.setViewportView(getJTextAreaInstanceHelp());\r
1184 }\r
1185 return jScrollPaneInstanceHelp;\r
1186 }\r
1187\r
1188 /**\r
1189 * This method initializes jTextAreaInstanceHelp\r
1190 * \r
1191 * @return javax.swing.JTextArea \r
1192 */\r
1193 private JTextArea getJTextAreaInstanceHelp() {\r
1194 if (jTextAreaInstanceHelp == null) {\r
1195 jTextAreaInstanceHelp = new JTextArea();\r
1196 jTextAreaInstanceHelp.setEditable(false);\r
1197 }\r
1198 return jTextAreaInstanceHelp;\r
1199 }\r
1200\r
1201 /**\r
1202 * This method initializes jButtonAdd\r
1203 * \r
1204 * @return javax.swing.JButton \r
1205 */\r
1206 private JButton getJButtonAdd() {\r
1207 if (jButtonAdd == null) {\r
1208 jButtonAdd = new JButton();\r
1209 jButtonAdd.setPreferredSize(new java.awt.Dimension(80,20));\r
1210 jButtonAdd.setText("Add");\r
1211 jButtonAdd.addActionListener(new java.awt.event.ActionListener() {\r
1212 public void actionPerformed(java.awt.event.ActionEvent e) {\r
1213 int row = jTableLibInstances.getSelectedRow();\r
1214 if (row < 0) {\r
1215 return;\r
1216 }\r
1217 \r
1218 String instanceValue = libInstanceTableModel.getValueAt(row, 1) + " " +\r
1219 libInstanceTableModel.getValueAt(row, 2) + " " +\r
1220 libInstanceTableModel.getValueAt(row, 3) + " " +\r
1221 libInstanceTableModel.getValueAt(row, 4);\r
1222 ModuleIdentification libMi = WorkspaceProfile.getModuleId(instanceValue);\r
1223 try {\r
1224 addLibInstance (libMi);\r
1225 }\r
1226 catch (Exception exception) {\r
1227 JOptionPane.showMessageDialog(FpdModuleSA.this, "Adding Instance " + libMi.getName() + " : \n"+ exception.getMessage());\r
1228 return;\r
1229 }\r
1230 docConsole.setSaved(false);\r
1231 Object[] s = {libInstanceTableModel.getValueAt(row, 0), libInstanceTableModel.getValueAt(row, 1),\r
1232 libInstanceTableModel.getValueAt(row, 2), libInstanceTableModel.getValueAt(row, 3),\r
1233 libInstanceTableModel.getValueAt(row, 4)};\r
1234 selectedInstancesTableModel.addRow(s);\r
1235 \r
1236 Vector<String> errorMsg = new Vector<String>();\r
1237 try {\r
1238 resolveLibraryInstances(instanceValue, errorMsg);\r
1239 }\r
1240 catch (Exception exp) {\r
1241 JOptionPane.showMessageDialog(FpdModuleSA.this, exp.getMessage());\r
1242 }\r
1243 \r
1244 if (errorMsg.size() > 0) {\r
1245 String errors = "";\r
1246 for (int i = 0; i < errorMsg.size(); ++i) {\r
1247 errors += " " + errorMsg.get(i) + "\n";\r
1248 }\r
1249 JOptionPane.showMessageDialog(FpdModuleSA.this, errors);\r
1250 }\r
1251 showClassToResolved();\r
1252 }\r
1253 });\r
1254 }\r
1255 return jButtonAdd;\r
1256 }\r
1257\r
1258 /**\r
1259 * This method initializes jButton1\r
1260 * \r
1261 * @return javax.swing.JButton \r
1262 */\r
1263 private JButton getJButtonDeleteInstance() {\r
1264 if (jButtonDeleteInstance == null) {\r
1265 jButtonDeleteInstance = new JButton();\r
1266 jButtonDeleteInstance.setPreferredSize(new java.awt.Dimension(80,20));\r
1267 jButtonDeleteInstance.setText("Delete");\r
1268 jButtonDeleteInstance.addActionListener(new java.awt.event.ActionListener() {\r
1269 public void actionPerformed(java.awt.event.ActionEvent e) {\r
1270 int row = jTableSelectedInstances.getSelectedRow();\r
1271 if (row < 0) {\r
1272 return;\r
1273 }\r
1274 docConsole.setSaved(false);\r
1275 removeInstance(selectedInstancesTableModel.getValueAt(row, 1) + " " +\r
1276 selectedInstancesTableModel.getValueAt(row, 2) + " " +\r
1277 selectedInstancesTableModel.getValueAt(row, 3) + " " +\r
1278 selectedInstancesTableModel.getValueAt(row, 4));\r
1279 ffc.removeLibraryInstance(moduleKey, row);\r
1280 selectedInstancesTableModel.removeRow(row);\r
1281 \r
1282 }\r
1283 });\r
1284 }\r
1285 return jButtonDeleteInstance;\r
1286 }\r
1287\r
1288 /**\r
1289 * This method initializes jButton2 \r
1290 * \r
1291 * @return javax.swing.JButton \r
1292 */\r
1293 private JButton getJButtonOk() {\r
1294 if (jButtonOk == null) {\r
1295 jButtonOk = new JButton();\r
1296 jButtonOk.setPreferredSize(new java.awt.Dimension(80,20));\r
1297 jButtonOk.setText("Close");\r
1298 jButtonOk.addActionListener(this);\r
1299 }\r
1300 return jButtonOk;\r
1301 }\r
1302\r
1303 /**\r
1304 * This method initializes jButton3 \r
1305 * \r
1306 * @return javax.swing.JButton \r
1307 */\r
1308 private JButton getJButtonCancel() {\r
1309 if (jButtonCancel == null) {\r
1310 jButtonCancel = new JButton();\r
1311 jButtonCancel.setPreferredSize(new java.awt.Dimension(80,20));\r
1312 jButtonCancel.setText("Cancel");\r
1313 jButtonCancel.setVisible(false);\r
1314 }\r
1315 return jButtonCancel;\r
1316 }\r
1317 public void actionPerformed(ActionEvent arg0) {\r
1318\r
1319 if (arg0.getSource() == jButtonOk) {\r
1320 if (jTableModuleSaOptions.isEditing()) {\r
1321 jTableModuleSaOptions.getCellEditor().stopCellEditing();\r
1322 }\r
1323 this.setVisible(false);\r
1324 }\r
1325 }\r
1326 /**\r
1327 * This method initializes jPanelModuleSaOpts\r
1328 * \r
1329 * @return javax.swing.JPanel \r
1330 */\r
1331 private JPanel getJPanelModuleSaOpts() {\r
1332 if (jPanelModuleSaOpts == null) {\r
1333 FlowLayout flowLayout4 = new FlowLayout();\r
1334 flowLayout4.setAlignment(java.awt.FlowLayout.LEFT);\r
1335 jLabelFfsFormatKey = new JLabel();\r
1336 jLabelFfsFormatKey.setText("FFS Format Key");\r
1337 jLabelFfsFormatKey.setPreferredSize(new java.awt.Dimension(90,16));\r
1338 jLabelFfsFileGuid = new JLabel();\r
1339 jLabelFfsFileGuid.setText("FFS File GUID");\r
1340 jLabelFfsFileGuid.setPreferredSize(new java.awt.Dimension(90,16));\r
1341 jLabelFfsFileGuid.setVisible(false);\r
1342 jLabelFvBinding = new JLabel();\r
1343 jLabelFvBinding.setText("FV Binding");\r
1344 jLabelFvBinding.setPreferredSize(new java.awt.Dimension(90,16));\r
1345 jPanelModuleSaOpts = new JPanel();\r
1346 jPanelModuleSaOpts.setLayout(flowLayout4);\r
1347 jPanelModuleSaOpts.add(jLabelFvBinding, null);\r
1348 jPanelModuleSaOpts.add(getJTextFieldFvBinding(), null);\r
1349 jPanelModuleSaOpts.add(jLabelFfsFileGuid, null);\r
1350 jPanelModuleSaOpts.add(getJTextFieldFileGuid(), null);\r
1351 jPanelModuleSaOpts.add(jLabelFfsFormatKey, null);\r
1352 jPanelModuleSaOpts.add(getJTextFieldFfsKey(), null);\r
1353 jPanelModuleSaOpts.addComponentListener(new java.awt.event.ComponentAdapter() {\r
1354 public void componentShown(java.awt.event.ComponentEvent e) {\r
1355 initFvInfo(moduleKey);\r
1356 }\r
1357 });\r
1358 }\r
1359 return jPanelModuleSaOpts;\r
1360 }\r
1361 \r
1362 private Vector<String> getVectorFromString (String s) {\r
1363 if (s == null || s.equals("null")) {\r
1364 s = "";\r
1365 }\r
1366 String[] sa1 = s.split(" ");\r
1367 Vector<String> v = new Vector<String>();\r
1368 for (int i = 0; i < sa1.length; ++i) {\r
1369 v.add(sa1[i]);\r
1370 }\r
1371 return v;\r
1372 }\r
1373 \r
1374 /**\r
1375 * This method initializes jTextField \r
1376 * \r
1377 * @return javax.swing.JTextField \r
1378 */\r
1379 private JTextField getJTextFieldFvBinding() {\r
1380 if (jTextFieldFvBinding == null) {\r
1381 jTextFieldFvBinding = new JTextField();\r
1382 jTextFieldFvBinding.setPreferredSize(new java.awt.Dimension(400,20));\r
1383 jTextFieldFvBinding.setEditable(true);\r
1384 jTextFieldFvBinding.addFocusListener(new java.awt.event.FocusAdapter() {\r
1385 public void focusLost(java.awt.event.FocusEvent e) {\r
1386 String originalFvBinding = ffc.getFvBinding(moduleKey);\r
1387 String newFvBinding = jTextFieldFvBinding.getText();\r
1388 if (newFvBinding.equals(originalFvBinding)) {\r
1389 return;\r
1390 }\r
1391 if (newFvBinding.length() == 0 && originalFvBinding == null) {\r
1392 return;\r
1393 }\r
1394 \r
1395 Vector<String> oldFvList = getVectorFromString (originalFvBinding);\r
1396 Vector<String> newFvList = getVectorFromString (newFvBinding);\r
1397 String moduleInfo[] = moduleKey.split(" ");\r
1398 ffc.setFvBinding(moduleKey, newFvBinding);\r
1399 //\r
1400 // remove module from Fvs that not in newFvList now.\r
1401 //\r
1402 oldFvList.removeAll(newFvList);\r
1403 for (int j = 0; j < oldFvList.size(); ++j) {\r
1404 ffc.removeModuleInBuildOptionsUserExtensions(oldFvList.get(j), "IMAGES", 1, moduleInfo[0], moduleInfo[1], moduleInfo[2], moduleInfo[3], moduleInfo[4]); \r
1405 }\r
1406 //\r
1407 // add module to Fvs that were not in oldFvList.\r
1408 //\r
1409 oldFvList = getVectorFromString (originalFvBinding);\r
1410 newFvList.removeAll(oldFvList);\r
1411 for (int i = 0; i < newFvList.size(); ++i) {\r
1412 ffc.addModuleIntoBuildOptionsUserExtensions(newFvList.get(i), "IMAGES", 1, moduleInfo[0], moduleInfo[1], moduleInfo[2], moduleInfo[3], moduleInfo[4]);\r
1413 }\r
1414 docConsole.setSaved(false);\r
1415 }\r
1416 });\r
1417 \r
1418 }\r
1419 return jTextFieldFvBinding;\r
1420 }\r
1421 /**\r
1422 * This method initializes jTextField1 \r
1423 * \r
1424 * @return javax.swing.JTextField \r
1425 */\r
1426 private JTextField getJTextFieldFileGuid() {\r
1427 if (jTextFieldFileGuid == null) {\r
1428 jTextFieldFileGuid = new JTextField();\r
1429 jTextFieldFileGuid.setPreferredSize(new java.awt.Dimension(300,20));\r
1430 jTextFieldFileGuid.setVisible(false);\r
1431 jTextFieldFileGuid.addFocusListener(new java.awt.event.FocusAdapter() {\r
1432 public void focusLost(java.awt.event.FocusEvent e) {\r
1433 String originalFileGuid = ffc.getFfsFileNameGuid(moduleKey);\r
1434 String newFileGuid = jTextFieldFileGuid.getText();\r
1435 if (newFileGuid.equals(originalFileGuid)) {\r
1436 return;\r
1437 }\r
1438 if (newFileGuid.length() == 0 && originalFileGuid == null) {\r
1439 return;\r
1440 }\r
1441 if (newFileGuid.length() > 0) {\r
1442 if (!DataValidation.isGuid(newFileGuid)) {\r
1443 JOptionPane.showMessageDialog(FpdModuleSA.this, "FFS File Guid is NOT GUID Type.");\r
1444 return;\r
1445 }\r
1446 }\r
1447 \r
1448 docConsole.setSaved(false);\r
1449 if (newFileGuid.length() == 0) {\r
1450 newFileGuid = null;\r
1451 }\r
1452 ffc.setFfsFileNameGuid(moduleKey, newFileGuid);\r
1453 }\r
1454 });\r
1455 \r
1456 }\r
1457 return jTextFieldFileGuid;\r
1458 }\r
1459 /**\r
1460 * This method initializes jTextFieldFfsKey \r
1461 * \r
1462 * @return javax.swing.JTextField \r
1463 */\r
1464 private JTextField getJTextFieldFfsKey() {\r
1465 if (jTextFieldFfsKey == null) {\r
1466 jTextFieldFfsKey = new JTextField();\r
1467 jTextFieldFfsKey.setPreferredSize(new java.awt.Dimension(250,20));\r
1468 jTextFieldFfsKey.addFocusListener(new java.awt.event.FocusAdapter() {\r
1469 public void focusLost(java.awt.event.FocusEvent e) {\r
1470 String originalFfsKey = ffc.getFfsFormatKey(moduleKey);\r
1471 String newFfsKey = jTextFieldFfsKey.getText();\r
1472 if (newFfsKey.equals(originalFfsKey)) {\r
1473 return;\r
1474 }\r
1475 if (newFfsKey.length() == 0 && originalFfsKey == null) {\r
1476 return;\r
1477 }\r
1478 docConsole.setSaved(false);\r
1479 ffc.setFfsFormatKey(moduleKey, newFfsKey);\r
1480 }\r
1481 });\r
1482 \r
1483 }\r
1484 return jTextFieldFfsKey;\r
1485 }\r
1486 /**\r
1487 * This method initializes jScrollPaneModuleSaOptions\r
1488 * \r
1489 * @return javax.swing.JScrollPane \r
1490 */\r
1491 private JScrollPane getJScrollPaneModuleSaOptions() {\r
1492 if (jScrollPaneModuleSaOptions == null) {\r
1493 jScrollPaneModuleSaOptions = new JScrollPane();\r
1494 jScrollPaneModuleSaOptions.setPreferredSize(new java.awt.Dimension(600,350));\r
1495 jScrollPaneModuleSaOptions.setViewportView(getJTableModuleSaOptions());\r
1496 }\r
1497 return jScrollPaneModuleSaOptions;\r
1498 }\r
1499 /**\r
1500 * This method initializes jTableModuleSaOptions\r
1501 * \r
1502 * @return javax.swing.JTable \r
1503 */\r
1504 private JTable getJTableModuleSaOptions() {\r
1505 if (jTableModuleSaOptions == null) {\r
1506 optionsTableModel = new DefaultTableModel();\r
1507 optionsTableModel.addColumn("BuildTargets");\r
1508 optionsTableModel.addColumn("ToolChainFamily");\r
1509 optionsTableModel.addColumn("TagName");\r
1510 optionsTableModel.addColumn("ToolCode");\r
1511 optionsTableModel.addColumn("SupportedArchs");\r
1512 optionsTableModel.addColumn("Contents");\r
1513 jTableModuleSaOptions = new JTable(optionsTableModel);\r
1514 jTableModuleSaOptions.setRowHeight(20);\r
1515 \r
1516 jTableModuleSaOptions.getColumnModel().getColumn(0).setMinWidth(buildTargetWidth);\r
1517 jTableModuleSaOptions.getColumnModel().getColumn(1).setMinWidth(toolChainFamilyWidth);\r
1518 jTableModuleSaOptions.getColumnModel().getColumn(2).setMinWidth(tagNameWidth);\r
1519 jTableModuleSaOptions.getColumnModel().getColumn(3).setMinWidth(toolCmdCodeWidth);\r
1520 jTableModuleSaOptions.getColumnModel().getColumn(4).setMinWidth(supportArchWidth);\r
1521 jTableModuleSaOptions.getColumnModel().getColumn(5).setMinWidth(argWidth);\r
1522// javax.swing.table.TableColumn toolFamilyCol = jTableModuleSaOptions.getColumnModel().getColumn(1);\r
1523// JComboBox cb = new JComboBox();\r
1524// cb.addItem("MSFT");\r
1525// cb.addItem("GCC");\r
1526// cb.addItem("CYGWIN");\r
1527// cb.addItem("INTEL");\r
1528// cb.addItem("USER_DEFINED");\r
1529// toolFamilyCol.setCellEditor(new DefaultCellEditor(cb));\r
1530 \r
1531 Vector<String> vArch = new Vector<String>();\r
1532 vArch.add("IA32");\r
1533 vArch.add("X64");\r
1534 vArch.add("IPF");\r
1535 vArch.add("EBC");\r
1536 vArch.add("ARM");\r
1537 vArch.add("PPC");\r
1538 jTableModuleSaOptions.getColumnModel().getColumn(4).setCellEditor(new ListEditor(vArch, FrameworkWizardUI.getInstance()));\r
1539 \r
1540 jTableModuleSaOptions.getColumnModel().getColumn(5).setCellEditor(new LongTextEditor(FrameworkWizardUI.getInstance()));\r
1541 \r
1542 jTableModuleSaOptions.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
1543 jTableModuleSaOptions.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);\r
1544 jTableModuleSaOptions.getModel().addTableModelListener(new TableModelListener() {\r
1545 public void tableChanged(TableModelEvent arg0) {\r
1546 // TODO Auto-generated method stub\r
1547 int row = arg0.getFirstRow();\r
1548 TableModel m = (TableModel)arg0.getSource();\r
1549 \r
1550 if (arg0.getType() == TableModelEvent.UPDATE){\r
1551 //ToDo Data Validition check.\r
1552 String targets = m.getValueAt(row, 0) + "";\r
1553 Vector<Object> targetName = null;\r
1554 if (targets.length() > 0) {\r
1555 targetName = new Vector<Object>();\r
1556 String[] sArray = targets.split(" ");\r
1557 for (int i = 0; i < sArray.length; ++i) {\r
1558 targetName.add(sArray[i]);\r
1559 }\r
1560 }\r
1561 \r
1562 String toolChain = m.getValueAt(row, 1) + "";\r
1563 String tagName = m.getValueAt(row, 2) + "";\r
1564 String toolCode = m.getValueAt(row, 3) + "";\r
1565 String archs = m.getValueAt(row, 4) + "";\r
1566 Vector<Object> supArch = null;\r
1567 if (archs.length() > 0) {\r
1568 supArch = new Vector<Object>();\r
1569 String[] sArray1 = archs.split(" ");\r
1570 for (int i = 0; i < sArray1.length; ++i) {\r
1571 supArch.add(sArray1[i]);\r
1572 }\r
1573 }\r
1574 \r
1575 String contents = m.getValueAt(row, 5) + "";\r
1576 docConsole.setSaved(false);\r
1577 ffc.updateModuleSAOptionsOpt(moduleKey, row, targetName, toolChain, tagName, toolCode, supArch, contents);\r
1578 }\r
1579 }\r
1580 });\r
1581 }\r
1582 return jTableModuleSaOptions;\r
1583 }\r
1584 /**\r
1585 * This method initializes jButtonNew\r
1586 * \r
1587 * @return javax.swing.JButton \r
1588 */\r
1589 private JButton getJButtonNew() {\r
1590 if (jButtonNew == null) {\r
1591 jButtonNew = new JButton();\r
1592 jButtonNew.setPreferredSize(new java.awt.Dimension(80,20));\r
1593 jButtonNew.setText("New");\r
1594 jButtonNew.addActionListener(new java.awt.event.ActionListener() {\r
1595 public void actionPerformed(java.awt.event.ActionEvent e) {\r
1596 String[] row = {"", "", "", "", "", ""};\r
1597 optionsTableModel.addRow(row);\r
1598 Vector<Object> v = null;\r
1599 Vector<Object> v1 = null;\r
1600 docConsole.setSaved(false);\r
1601 ffc.genModuleSAOptionsOpt(moduleKey, v, "", "", "", v1, "");\r
1602 }\r
1603 });\r
1604 }\r
1605 return jButtonNew;\r
1606 }\r
1607 /**\r
1608 * This method initializes jButtonDelete\r
1609 * \r
1610 * @return javax.swing.JButton \r
1611 */\r
1612 private JButton getJButtonDeleteOption() {\r
1613 if (jButtonDeleteOption == null) {\r
1614 jButtonDeleteOption = new JButton();\r
1615 jButtonDeleteOption.setPreferredSize(new java.awt.Dimension(80,20));\r
1616 jButtonDeleteOption.setText("Delete");\r
1617 jButtonDeleteOption.addActionListener(new java.awt.event.ActionListener() {\r
1618 public void actionPerformed(java.awt.event.ActionEvent e) {\r
1619 if (jTableModuleSaOptions.getSelectedRow() < 0) {\r
1620 return;\r
1621 }\r
1622 docConsole.setSaved(false);\r
1623 ffc.removeModuleSAOptionsOpt(moduleKey, jTableModuleSaOptions.getSelectedRow());\r
1624 optionsTableModel.removeRow(jTableModuleSaOptions.getSelectedRow());\r
1625 }\r
1626 });\r
1627 }\r
1628 return jButtonDeleteOption;\r
1629 }\r
1630 \r
1631 /**\r
1632 Start the window at the center of screen\r
1633 \r
1634 **/\r
1635 protected void centerWindow(int intWidth, int intHeight) {\r
1636 Dimension d = Toolkit.getDefaultToolkit().getScreenSize();\r
1637 this.setLocation((d.width - intWidth) / 2, (d.height - intHeight) / 2);\r
1638 }\r
1639\r
1640 /**\r
1641 Start the window at the center of screen\r
1642 \r
1643 **/\r
1644 protected void centerWindow() {\r
1645 centerWindow(this.getSize().width, this.getSize().height);\r
1646 }\r
1647/**\r
1648 * This method initializes jPanelPcdFields\r
1649 * \r
1650 * @return javax.swing.JPanel \r
1651 */\r
1652private JPanel getJPanelPcdFields() {\r
1653 if (jPanelPcdFields == null) {\r
1654 GridLayout gridLayout = new GridLayout();\r
1655 gridLayout.setRows(3);\r
1656 gridLayout.setColumns(2);\r
1657 jPanelPcdFields = new JPanel();\r
1658 jPanelPcdFields.setLayout(gridLayout);\r
1659 jPanelPcdFields.setPreferredSize(new java.awt.Dimension(600,90));\r
1660 jPanelPcdFields.add(getJPanelPcdFieldsFirstRow(), null);\r
1661 jPanelPcdFields.add(getJPanelPcdFieldsSecondRow(), null);\r
1662 jPanelPcdFields.add(getJPanelPcdFieldsThirdRow(), null);\r
1663 }\r
1664 return jPanelPcdFields;\r
1665}\r
1666/**\r
1667 * This method initializes jPanelPcdFieldsSecondRow\r
1668 * \r
1669 * @return javax.swing.JPanel \r
1670 */\r
1671private JPanel getJPanelPcdFieldsSecondRow() {\r
1672 if (jPanelPcdFieldsSecondRow == null) {\r
1673 FlowLayout flowLayout2 = new FlowLayout();\r
1674 flowLayout2.setAlignment(java.awt.FlowLayout.LEFT);\r
1675 jLabelMaxDatumSize = new JLabel();\r
1676 jLabelMaxDatumSize.setText("Max Datum Size");\r
1677 jPanelPcdFieldsSecondRow = new JPanel();\r
1678 jPanelPcdFieldsSecondRow.setLayout(flowLayout2);\r
1679 jPanelPcdFieldsSecondRow.add(jLabelMaxDatumSize, null);\r
1680 jPanelPcdFieldsSecondRow.add(getJTextFieldMaxDatumSize(), null);\r
1681 }\r
1682 return jPanelPcdFieldsSecondRow;\r
1683}\r
1684/**\r
1685 * This method initializes jPanelPcdFieldsThirdRow\r
1686 * \r
1687 * @return javax.swing.JPanel \r
1688 */\r
1689private JPanel getJPanelPcdFieldsThirdRow() {\r
1690 if (jPanelPcdFieldsThirdRow == null) {\r
1691 FlowLayout flowLayout3 = new FlowLayout();\r
1692 flowLayout3.setAlignment(java.awt.FlowLayout.LEFT);\r
1693 jLabelPcdDefaultValue = new JLabel();\r
1694 jLabelPcdDefaultValue.setText("Default Value");\r
1695 jLabelPcdDefaultValue.setPreferredSize(new java.awt.Dimension(91,16));\r
1696 jPanelPcdFieldsThirdRow = new JPanel();\r
1697 jPanelPcdFieldsThirdRow.setLayout(flowLayout3);\r
1698 jPanelPcdFieldsThirdRow.add(jLabelPcdDefaultValue, null);\r
1699 jPanelPcdFieldsThirdRow.add(getJTextFieldPcdDefault(), null);\r
1700 jPanelPcdFieldsThirdRow.add(getJComboBoxFeatureFlagValue(), null);\r
1701 jPanelPcdFieldsThirdRow.add(getJButtonUpdatePcd(), null);\r
1702 }\r
1703 return jPanelPcdFieldsThirdRow;\r
1704}\r
1705/**\r
1706 * This method initializes jPanelPcdFieldsFirstRow\r
1707 * \r
1708 * @return javax.swing.JPanel \r
1709 */\r
1710private JPanel getJPanelPcdFieldsFirstRow() {\r
1711 if (jPanelPcdFieldsFirstRow == null) {\r
1712 FlowLayout flowLayout1 = new FlowLayout();\r
1713 flowLayout1.setAlignment(java.awt.FlowLayout.LEFT);\r
1714 jLabelItemType = new JLabel();\r
1715 jLabelItemType.setText("Item Type");\r
1716 jLabelItemType.setPreferredSize(new java.awt.Dimension(91,16));\r
1717 jPanelPcdFieldsFirstRow = new JPanel();\r
1718 jPanelPcdFieldsFirstRow.setLayout(flowLayout1);\r
1719 jPanelPcdFieldsFirstRow.add(jLabelItemType, null);\r
1720 jPanelPcdFieldsFirstRow.add(getJComboBoxItemType(), null);\r
1721 }\r
1722 return jPanelPcdFieldsFirstRow;\r
1723}\r
1724/**\r
1725 * This method initializes jComboBoxItemType\r
1726 * \r
1727 * @return javax.swing.JComboBox \r
1728 */\r
1729private JComboBox getJComboBoxItemType() {\r
1730 if (jComboBoxItemType == null) {\r
1731 jComboBoxItemType = new JComboBox();\r
1732 jComboBoxItemType.setPreferredSize(new java.awt.Dimension(200,20));\r
1733 jComboBoxItemType.addItemListener(new java.awt.event.ItemListener() {\r
1734 public void itemStateChanged(java.awt.event.ItemEvent e) {\r
1735 \r
1736 int row = jTablePcd.getSelectedRow();\r
1737 if (row < 0) {\r
1738 return;\r
1739 }\r
1740 \r
1741 if (jComboBoxItemType.getSelectedItem() != null && jComboBoxItemType.getSelectedItem().equals("FIXED_AT_BUILD")) {\r
1742 jTextFieldPcdDefault.setEnabled(true);\r
1743 }\r
1744 else {\r
1745 jTextFieldPcdDefault.setEnabled(false);\r
1746 }\r
1747 } \r
1748 });\r
1749 }\r
1750 return jComboBoxItemType;\r
1751}\r
1752\r
1753private void pcdDynamicToNonDynamic(String cName, String tsGuid) {\r
1754 String[][] saa = new String[ffc.getDynamicPcdBuildDataCount()][5];\r
1755 ffc.getDynamicPcdBuildData(saa);\r
1756 String maxSize = "";\r
1757 String value = "";\r
1758 for (int i = 0; i < saa.length; ++i) {\r
1759 if (saa[i][0].equals(cName) && saa[i][2].equals(tsGuid)) {\r
1760 maxSize = saa[i][3];\r
1761 value = ffc.getDynamicPcdBuildDataValue(i);\r
1762 break;\r
1763 }\r
1764 }\r
1765 \r
1766 ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
1767 for (int i = 0; i < al.size(); ++i) {\r
1768 String mKey = moduleInfo (al.get(i));\r
1769 value = null;\r
1770 String itemType = jComboBoxItemType.getSelectedItem()+"";\r
1771 ffc.updatePcdData(mKey, cName, tsGuid, itemType, maxSize, value);\r
1772 al.set(i, mKey + " " + itemType);\r
1773 }\r
1774 \r
1775 ffc.removeDynamicPcdBuildData(cName, tsGuid);\r
1776}\r
1777\r
1778private void pcdNonDynamicToDynamic(String cName, String tsGuid) {\r
1779 ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
1780 for (int i = 0; i < al.size(); ++i) {\r
1781 String mKey = moduleInfo (al.get(i));\r
1782 String itemType = jComboBoxItemType.getSelectedItem()+"";\r
1783 ffc.updatePcdData(mKey, cName, tsGuid, itemType, jTextFieldMaxDatumSize.getText(), jTextFieldPcdDefault.isVisible() ? jTextFieldPcdDefault.getText() : jComboBoxFeatureFlagValue.getSelectedItem()+"");\r
1784 al.set(i, mKey + " " + itemType);\r
1785 }\r
1786 try{\r
1787 ffc.addDynamicPcdBuildData(cName, model.getValueAt(jTablePcd.getSelectedRow(), 3), tsGuid, "DYNAMIC", model.getValueAt(jTablePcd.getSelectedRow(), 5)+"", jTextFieldPcdDefault.isVisible() ? jTextFieldPcdDefault.getText() : jComboBoxFeatureFlagValue.getSelectedItem()+"");\r
1788 }\r
1789 catch(Exception e){\r
1790 JOptionPane.showMessageDialog(FpdModuleSA.this, "PCD value format: " + e.getMessage());\r
1791 }\r
1792}\r
1793\r
1794private void changePcdTypeWithinSameCategory (String cName, String tsGuid) {\r
1795 ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
1796 for (int i = 0; i < al.size(); ++i) {\r
1797 String mKey = moduleInfo (al.get(i));\r
1798 String itemType = jComboBoxItemType.getSelectedItem()+"";\r
1799 ffc.updatePcdData(mKey, cName, tsGuid, itemType, null, null);\r
1800 al.set(i, mKey + " " + itemType);\r
1801 }\r
1802}\r
1803\r
1804private String moduleInfo (String pcdInfo) {\r
1805 \r
1806 return pcdInfo.substring(0, pcdInfo.lastIndexOf(" "));\r
1807}\r
1808\r
1809/**\r
1810 * This method initializes jTextFieldMaxDatumSize\r
1811 * \r
1812 * @return javax.swing.JTextField \r
1813 */\r
1814private JTextField getJTextFieldMaxDatumSize() {\r
1815 if (jTextFieldMaxDatumSize == null) {\r
1816 jTextFieldMaxDatumSize = new JTextField();\r
1817 jTextFieldMaxDatumSize.setPreferredSize(new java.awt.Dimension(200,20));\r
1818 }\r
1819 return jTextFieldMaxDatumSize;\r
1820}\r
1821/**\r
1822 * This method initializes jTextField4 \r
1823 * \r
1824 * @return javax.swing.JTextField \r
1825 */\r
1826private JTextField getJTextFieldPcdDefault() {\r
1827 if (jTextFieldPcdDefault == null) {\r
1828 jTextFieldPcdDefault = new JTextField();\r
1829 jTextFieldPcdDefault.setPreferredSize(new java.awt.Dimension(200,20));\r
1830 }\r
1831 return jTextFieldPcdDefault;\r
1832}\r
1833/**\r
1834 * This method initializes jButton6 \r
1835 * \r
1836 * @return javax.swing.JButton \r
1837 */\r
1838private JButton getJButtonUpdatePcd() {\r
1839 if (jButtonUpdatePcd == null) {\r
1840 jButtonUpdatePcd = new JButton();\r
1841 jButtonUpdatePcd.setPreferredSize(new java.awt.Dimension(150,20));\r
1842 jButtonUpdatePcd.setText("Update PCD Data");\r
1843 jButtonUpdatePcd.addActionListener(new java.awt.event.ActionListener() {\r
1844 public void actionPerformed(java.awt.event.ActionEvent e) {\r
1845 int row = jTablePcd.getSelectedRow();\r
1846 if (row < 0) {\r
1847 return;\r
1848 }\r
1849 \r
1850 String cName = model.getValueAt(row, 0)+"";\r
1851 String tsGuid = model.getValueAt(row, 1)+"";\r
1852 String oldItemType = model.getValueAt(row, 2)+"";\r
1853 String dataType = model.getValueAt(row, 5)+"";\r
1854 String newItemType = jComboBoxItemType.getSelectedItem()+"";\r
1855 String newValue = jTextFieldPcdDefault.isVisible()? jTextFieldPcdDefault.getText():jComboBoxFeatureFlagValue.getSelectedItem()+""; \r
1856 if (newValue.length() == 0){\r
1857 \r
1858 if (dataType.equals("UINT8") || dataType.equals("UINT16") || dataType.equals("UINT32") || dataType.equals("UINT64")) {\r
1859 newValue = "0";\r
1860 }\r
1861 if (dataType.equals("BOOLEAN")){\r
1862 newValue = "FALSE";\r
1863 }\r
1864 if (dataType.equals("VOID*")) {\r
1865 newValue = "L\"\"";\r
1866 }\r
1867 }\r
1868 \r
1869 String[] pcdInfo = {"", "", ""};\r
1870 Vector<String> validPcdTypes = new Vector<String>();\r
1871 getPcdInfo (moduleKey, cName, tsGuid, pcdInfo, validPcdTypes);\r
1872 if (pcdInfo[1].equals("FIXED_AT_BUILD") && model.getValueAt(row, 5).equals("VOID*")) {\r
1873 try {\r
1874 jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(newValue)+"");\r
1875 }\r
1876 catch (Exception exp) {\r
1877 JOptionPane.showMessageDialog(FpdModuleSA.this, "PCD Value MalFormed: " + exp.getMessage());\r
1878 return;\r
1879 }\r
1880 }\r
1881 String newMaxDatumSize = jTextFieldMaxDatumSize.getText();\r
1882 \r
1883 if (!newItemType.equals(oldItemType)) {\r
1884 Vector<ModuleIdentification> moduleInfo = new Vector<ModuleIdentification>();\r
1885 try {\r
1886 boolean changable = itemTypeCouldBeChanged (cName, tsGuid, newItemType, moduleInfo);\r
1887 if (!changable) {\r
1888 JOptionPane.showMessageDialog(FpdModuleSA.this, "Can NOT Change Pcd Type in: " + moduleInfo.get(0).getName() + " contained in package " + moduleInfo.get(0).getPackageId().getName());\r
1889 return;\r
1890 }\r
1891 }\r
1892 catch (Exception exp) {\r
1893 JOptionPane.showMessageDialog(FpdModuleSA.this, "Can NOT Change Pcd Type in: " + moduleInfo.get(0).getName() + " contained in package " + moduleInfo.get(0).getPackageId().getName() + " " + exp.getMessage());\r
1894 return;\r
1895 }\r
1896 \r
1897 if ((oldItemType.equals("DYNAMIC") || oldItemType.equals("DYNAMIC_EX")) && !newItemType.equals("DYNAMIC") && !newItemType.equals("DYNAMIC_EX")) {\r
1898 pcdDynamicToNonDynamic(cName, tsGuid);\r
1899 }\r
1900 if (!oldItemType.equals("DYNAMIC") && !oldItemType.equals("DYNAMIC_EX") && (newItemType.equals("DYNAMIC") || newItemType.equals("DYNAMIC_EX"))) {\r
1901 pcdNonDynamicToDynamic(cName, tsGuid);\r
1902 }\r
1903 else {\r
1904 changePcdTypeWithinSameCategory (cName, tsGuid);\r
1905 }\r
1906 model.setValueAt(newItemType, row, 2);\r
1907 }\r
1908 \r
1909 ffc.updatePcdData(moduleKey, cName, tsGuid, model.getValueAt(row, 2)+"", newMaxDatumSize, newValue);\r
1910 docConsole.setSaved(false);\r
1911 model.setValueAt(newValue, row, 6);\r
1912 model.setValueAt(newMaxDatumSize, row, 4);\r
1913 \r
1914 }\r
1915 });\r
1916 }\r
1917 return jButtonUpdatePcd;\r
1918}\r
1919\r
1920private boolean itemTypeCouldBeChanged (String cName, String tsGuid, String newItemType, Vector<ModuleIdentification> mi) throws Exception{\r
1921 ArrayList<String> pcdConsumers = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
1922 for (int i = 0; i < pcdConsumers.size(); ++i) {\r
1923 String consumerInfo = moduleInfo (pcdConsumers.get(i));\r
1924 mi.removeAllElements();\r
1925 mi.add(WorkspaceProfile.getModuleId(consumerInfo));\r
1926 String[] sa = {"", "", ""};\r
1927 Vector<String> validPcdTypes = new Vector<String>();\r
1928 getPcdInfo (consumerInfo, cName, tsGuid, sa, validPcdTypes);\r
1929 if (validPcdTypes.size() == 0) {\r
1930 return false;\r
1931 }\r
1932 if (!sa[1].equals("DYNAMIC")) {\r
1933 return false;\r
1934 }\r
1935 if (!validPcdTypes.contains(newItemType)) {\r
1936 return false;\r
1937 }\r
1938 }\r
1939 return true;\r
1940}\r
1941\r
1942/**\r
1943 * This method initializes jComboBoxFeatureFlagValue\r
1944 * \r
1945 * @return javax.swing.JComboBox \r
1946 */\r
1947private JComboBox getJComboBoxFeatureFlagValue() {\r
1948 if (jComboBoxFeatureFlagValue == null) {\r
1949 jComboBoxFeatureFlagValue = new JComboBox();\r
1950 jComboBoxFeatureFlagValue.setPreferredSize(new java.awt.Dimension(100,20));\r
1951 jComboBoxFeatureFlagValue.setVisible(false);\r
1952 jComboBoxFeatureFlagValue.addItem("TRUE");\r
1953 jComboBoxFeatureFlagValue.addItem("FALSE");\r
1954 }\r
1955 return jComboBoxFeatureFlagValue;\r
1956}\r
1957/**\r
1958 * This method initializes jPanelCustomToolChain \r
1959 * \r
1960 * @return javax.swing.JPanel \r
1961 */\r
1962private JPanel getJPanelCustomToolChain() {\r
1963 if (jPanelCustomToolChain == null) {\r
1964 jPanelCustomToolChain = new JPanel();\r
1965 jPanelCustomToolChain.setLayout(new BorderLayout());\r
1966 jPanelCustomToolChain.add(getJPanelToolchainS(), java.awt.BorderLayout.SOUTH);\r
1967 jPanelCustomToolChain.add(getJScrollPaneModuleSaOptions(), java.awt.BorderLayout.CENTER);\r
1968 jPanelCustomToolChain.addComponentListener(new java.awt.event.ComponentAdapter() {\r
1969 public void componentShown(java.awt.event.ComponentEvent e) {\r
1970 initToolChainOptions(moduleKey);\r
1971 }\r
1972 });\r
1973 }\r
1974 return jPanelCustomToolChain;\r
1975}\r
1976/**\r
1977 * This method initializes jPanelToolchainS \r
1978 * \r
1979 * @return javax.swing.JPanel \r
1980 */\r
1981private JPanel getJPanelToolchainS() {\r
1982 if (jPanelToolchainS == null) {\r
1983 jPanelToolchainS = new JPanel();\r
1984 jPanelToolchainS.add(getJButtonNew(), null);\r
1985 jPanelToolchainS.add(getJButtonDeleteOption(), null);\r
1986 }\r
1987 return jPanelToolchainS;\r
1988}\r
1989\r
1990/**\r
1991 * This method initializes jPanelLibraryCenterN \r
1992 * \r
1993 * @return javax.swing.JPanel \r
1994 */\r
1995private JPanel getJPanelLibraryCenterN() {\r
1996 if (jPanelLibraryCenterN == null) {\r
1997 FlowLayout flowLayout5 = new FlowLayout();\r
1998 flowLayout5.setAlignment(java.awt.FlowLayout.CENTER);\r
1999 flowLayout5.setHgap(10);\r
2000 jPanelLibraryCenterN = new JPanel();\r
2001 jPanelLibraryCenterN.setLayout(flowLayout5);\r
2002 jPanelLibraryCenterN.add(jLabelInstanceHelp, null);\r
2003 jPanelLibraryCenterN.add(getJScrollPaneInstanceHelp(), null);\r
2004 jPanelLibraryCenterN.add(getJButtonAdd(), null);\r
2005 jPanelLibraryCenterN.add(getJButtonDeleteInstance(), null);\r
2006 }\r
2007 return jPanelLibraryCenterN;\r
2008}\r
2009/**\r
2010 * This method initializes jPanelLibraryCenterC \r
2011 * \r
2012 * @return javax.swing.JPanel \r
2013 */\r
2014private JPanel getJPanelLibraryCenterC() {\r
2015 if (jPanelLibraryCenterC == null) {\r
2016 jPanelLibraryCenterC = new JPanel();\r
2017 jPanelLibraryCenterC.add(jLabelSelectedInstances, null);\r
2018 jPanelLibraryCenterC.add(getJScrollPaneSelectedInstances(), null);\r
2019 }\r
2020 return jPanelLibraryCenterC;\r
2021}\r
2022\r
2023\r
2024} // @jve:decl-index=0:visual-constraint="10,10"\r
2025\r
2026class MultipleInstanceException extends Exception {\r
2027\r
2028 /**\r
2029 * \r
2030 */\r
2031 private static final long serialVersionUID = -9148463005930920297L;\r
2032 private String className = null;\r
2033 private String libInstance1 = null;\r
2034 private String libInstance2 = null;\r
2035 \r
2036 MultipleInstanceException (String libClass, String instance1, String instance2) {\r
2037 super();\r
2038 className = libClass;\r
2039 libInstance1 = instance1;\r
2040 libInstance2 = instance2;\r
2041 }\r
2042\r
2043 /* (non-Javadoc)\r
2044 * @see java.lang.Throwable#getMessage()\r
2045 */\r
2046 @Override\r
2047 public String getMessage() {\r
2048 // TODO Auto-generated method stub\r
2049 return " Library Class " + className + "is Produced by Two Instances: " \r
2050 + libInstance1 + " and " + libInstance2 + ". Platform Build will Fail.";\r
2051 }\r
2052 \r
2053}\r
2054\r
2055class ImproperInstanceException extends Exception {\r
2056\r
2057 /**\r
2058 * \r
2059 */\r
2060 private static final long serialVersionUID = -5279700566993277033L;\r
2061 private String className = null;\r
2062 private String libInstance = null;\r
2063 private String instanceSupArch = null;\r
2064 private String instanceSupModType = null;\r
2065 \r
2066 ImproperInstanceException (String libClass, String instance1, String arch, String type) {\r
2067 super();\r
2068 className = libClass;\r
2069 libInstance = instance1;\r
2070 instanceSupArch = arch;\r
2071 instanceSupModType = type;\r
2072 }\r
2073\r
2074 /* (non-Javadoc)\r
2075 * @see java.lang.Throwable#getMessage()\r
2076 */\r
2077 @Override\r
2078 public String getMessage() {\r
2079 // TODO Auto-generated method stub\r
2080 return " Library Class " + className + " Produced by Library Instance: " \r
2081 + libInstance + "\nOnly Supports " + instanceSupArch + " and Module Type " + instanceSupModType + ".\n This instance should be removed.\n";\r
2082 }\r
2083 \r
2084}\r
2085\r
2086class NoInstanceException extends Exception {\r
2087\r
2088 /**\r
2089 * \r
2090 */\r
2091 private static final long serialVersionUID = 1987122786598970598L;\r
2092 \r
2093 private String className = null;\r
2094 \r
2095 NoInstanceException (String libClass) {\r
2096 className = libClass;\r
2097 }\r
2098 \r
2099 public String getMessage() {\r
2100 return "No Applicable Instance for Library Class " + className\r
2101 + ", Platform Build will Fail.";\r
2102 }\r
2103}\r