import javax.swing.event.TableModelEvent;\r
import javax.swing.event.TableModelListener;\r
import javax.swing.table.DefaultTableModel;\r
+import javax.swing.table.TableColumn;\r
import javax.swing.table.TableModel;\r
\r
import org.tianocore.frameworkwizard.common.DataValidation;\r
import org.tianocore.frameworkwizard.common.GlobalData;\r
import org.tianocore.frameworkwizard.common.IDefaultTableModel;\r
import org.tianocore.frameworkwizard.common.Identifications.OpeningPlatformType;\r
+import org.tianocore.frameworkwizard.platform.ui.global.LibraryClassDescriptor;\r
import org.tianocore.frameworkwizard.platform.ui.global.WorkspaceProfile;\r
import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery;\r
import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification;\r
private FpdFileContents ffc = null;\r
private String moduleKey = null;\r
private int moduleSaNum = -1;\r
- private HashMap<String, ArrayList<String>> classInstanceMap = null;\r
- private ArrayList<String> classProduced = null;\r
- private HashMap<String, ArrayList<String>> classConsumed = null;\r
+ private HashMap<LibraryClassDescriptor, ArrayList<String>> classInstanceMap = null;\r
+ //\r
+ // map of <{libName, supArch, supMod}, list of Module information>\r
+ //\r
+ private HashMap<LibraryClassDescriptor, ArrayList<String>> classConsumed = null;\r
+ private HashMap<LibraryClassDescriptor, ArrayList<String>> classProduced = null;\r
+ \r
private JPanel jPanelModuleSaOpts = null;\r
private JLabel jLabelFvBinding = null;\r
private JTextField jTextFieldFvBinding = null;\r
private JPanel jPanelToolchainS = null;\r
private JPanel jPanelLibraryCenterN = null;\r
private JPanel jPanelLibraryCenterC = null; // @jve:decl-index=0:visual-constraint="20,224"\r
+ \r
+ private final int buildTargetWidth = 150;\r
+ private final int toolChainFamilyWidth = 150;\r
+ private final int supportArchWidth = 150;\r
+ private final int toolCmdCodeWidth = 200;\r
+ private final int tagNameWidth = 150;\r
+ private final int argWidth = 400;\r
+ \r
/**\r
* This is the default constructor\r
*/\r
this.moduleKey = k;\r
moduleSaNum = i;\r
this.docConsole = dc;\r
+ classInstanceMap = null;\r
classProduced = null;\r
classConsumed = null;\r
jTabbedPane.setSelectedIndex(0);\r
initPcdBuildDefinition(i);\r
+ ModuleIdentification mi = WorkspaceProfile.getModuleId(moduleKey);\r
+ if (mi == null) {\r
+ return;\r
+ }\r
+ int tabIndex = jTabbedPane.indexOfTab("Libraries");\r
+ if (mi.isLibrary()) {\r
+ jTabbedPane.setEnabledAt(tabIndex, false);\r
+ }\r
+ else {\r
+ jTabbedPane.setEnabledAt(tabIndex, true);\r
+ }\r
}\r
\r
/**\r
}\r
\r
public void initLibraries(String key) {\r
- //\r
- // display library classes that need to be resolved. also potential instances for them.\r
- //\r
- resolveLibraryInstances(moduleKey);\r
+ try {\r
+ //\r
+ // display library classes that need to be resolved. also potential instances for them.\r
+ //\r
+ resolveLibraryInstances(moduleKey);\r
+ } catch (Exception e) {\r
+ JOptionPane.showMessageDialog(frame, e.getCause() + " " + e.getMessage());\r
+ }\r
//\r
// display lib instances already selected for key\r
//\r
String[][] saa = new String[instanceCount][5];\r
ffc.getLibraryInstances(key, saa);\r
for (int i = 0; i < saa.length; ++i) {\r
- ModuleIdentification mi = WorkspaceProfile.getModuleId(saa[i][1] + " " + saa[i][2] + " " + saa[i][3] + " " + saa[i][4]);\r
+ ModuleIdentification mi = WorkspaceProfile.getModuleId(saa[i][1] + " " + saa[i][2] + " " + saa[i][3]\r
+ + " " + saa[i][4]);\r
if (mi != null) {\r
+ //\r
+ // ToDo: verify this instance first.\r
+ //\r
saa[i][0] = mi.getName();\r
saa[i][2] = mi.getVersion();\r
saa[i][4] = mi.getPackageId().getVersion();\r
//\r
// re-evaluate lib instance usage when adding a already-selected lib instance.\r
//\r
- resolveLibraryInstances(saa[i][1] + " " + saa[i][2] + " " + saa[i][3] + " " + saa[i][4]);\r
+ try {\r
+ resolveLibraryInstances(saa[i][1] + " " + saa[i][2] + " " + saa[i][3] + " " + saa[i][4]);\r
+ } catch (Exception e) {\r
+ JOptionPane.showMessageDialog(frame, e.getCause() + " " + e.getMessage());\r
+ }\r
selectedInstancesTableModel.addRow(saa[i]);\r
}\r
}\r
}\r
+\r
showClassToResolved();\r
}\r
\r
}\r
}\r
\r
- private void resolveLibraryInstances(String key) {\r
- ModuleIdentification mi = WorkspaceProfile.getModuleId(key);\r
- PackageIdentification[] depPkgList = null;\r
- try{\r
+ private void filterClassConsumedByArch (Vector<LibraryClassDescriptor> v) {\r
+ String[] moduleInfo = moduleKey.split(" ");\r
+ Vector<String> vModuleArchs = new Vector<String>();\r
+ //\r
+ // Skip guid, version information, get archs to check.\r
+ //\r
+ for (int i = 4; i < moduleInfo.length; ++i) {\r
+ vModuleArchs.add(moduleInfo[i]);\r
+ }\r
+ //\r
+ // if module will be built on all platforms, no filter needed for lib classes.\r
+ //\r
+ if (vModuleArchs.size() == 0) {\r
+ return;\r
+ }\r
+ \r
+ Iterator<LibraryClassDescriptor> iter = v.iterator();\r
+ while (iter.hasNext()) {\r
+ LibraryClassDescriptor libInfo = iter.next();\r
+\r
+ Vector<String> vSupArchs = libInfo.getVectorFromString(libInfo.supArchs);\r
+ \r
+ if (vSupArchs.size() == 0 || (vSupArchs.size() == 1 && vSupArchs.get(0).equalsIgnoreCase(""))) {\r
+ //\r
+ // update lib info to module archs only.\r
+ //\r
+ libInfo.supArchs = "";\r
+ for (int i = 0; i < vModuleArchs.size(); ++i) {\r
+ libInfo.supArchs += vModuleArchs.get(i);\r
+ libInfo.supArchs += " ";\r
+ }\r
+ libInfo.supArchs.trim();\r
+ continue;\r
+ }\r
//\r
- // Get dependency pkg list into which we will search lib instances.\r
+ // only retain those lib class used by module archs.\r
//\r
- depPkgList = SurfaceAreaQuery.getDependencePkg(null, mi);\r
+ vSupArchs.retainAll(vModuleArchs);\r
+ if (vSupArchs.size() > 0) {\r
+ //\r
+ // update lib info to reflect which kind of arch need to select instance.\r
+ //\r
+ libInfo.supArchs = "";\r
+ for (int i = 0; i < vSupArchs.size(); ++i) {\r
+ libInfo.supArchs += vSupArchs.get(i);\r
+ libInfo.supArchs += " ";\r
+ }\r
+ libInfo.supArchs.trim();\r
+ continue;\r
+ }\r
//\r
- // Get the lib class consumed, produced by this module itself.\r
+ // remove this lib definition if it supports no archs module will be built under.\r
//\r
- Vector<String> vClassConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
- \r
- if (this.classConsumed == null) {\r
- this.classConsumed = new HashMap<String, ArrayList<String>>();\r
+ iter.remove();\r
+ }\r
+ }\r
+ \r
+ private void resolveLibraryInstances(String key) throws MultipleInstanceException, NoInstanceException{\r
+ ModuleIdentification mi = WorkspaceProfile.getModuleId(key);\r
+ PackageIdentification[] depPkgList = null;\r
+ \r
+ //\r
+ // Get dependency pkg list into which we will search lib instances.\r
+ //\r
+ depPkgList = SurfaceAreaQuery.getDependencePkg(null, mi);\r
+ //\r
+ // Get the lib class consumed, produced by this module itself.\r
+ //\r
+ Vector<LibraryClassDescriptor> vClassConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
+ filterClassConsumedByArch(vClassConsumed);\r
+ if (this.classConsumed == null) {\r
+ this.classConsumed = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
+ }\r
+\r
+ for (int i = 0; i < vClassConsumed.size(); ++i) {\r
+ ArrayList<String> consumedBy = this.classConsumed.get(vClassConsumed.get(i));\r
+ if (consumedBy == null) {\r
+ consumedBy = new ArrayList<String>();\r
}\r
- \r
- for(int i = 0; i < vClassConsumed.size(); ++i){\r
- ArrayList<String> consumedBy = this.classConsumed.get(vClassConsumed.get(i));\r
- if (consumedBy == null) {\r
- consumedBy = new ArrayList<String>();\r
- }\r
- consumedBy.add(key);\r
- this.classConsumed.put(vClassConsumed.get(i), consumedBy);\r
+ consumedBy.add(key);\r
+ this.classConsumed.put(vClassConsumed.get(i), consumedBy);\r
+ }\r
+\r
+ Vector<LibraryClassDescriptor> vClassProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
+ if (this.classProduced == null) {\r
+ this.classProduced = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
+ }\r
+ for (int i = 0; i < vClassProduced.size(); ++i) {\r
+ ArrayList<String> producedBy = this.classProduced.get(vClassProduced.get(i));\r
+ if (producedBy == null) {\r
+ producedBy = new ArrayList<String>();\r
}\r
- \r
- Vector<String> vClassProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
- if (this.classProduced == null) {\r
- this.classProduced = new ArrayList<String>();\r
+ //\r
+ // class already produced by previous module (lib instance).\r
+ /*\r
+ if (producedBy.size() == 1) {\r
+ String instanceKey = producedBy.get(0);\r
+ ModuleIdentification libMi = WorkspaceProfile.getModuleId(instanceKey);\r
+ throw new MultipleInstanceException (vClassProduced.get(i).className, libMi.getName(), mi.getName());\r
}\r
- for(int i = 0; i < vClassProduced.size(); ++i){\r
- if (!this.classProduced.contains(vClassProduced.get(i))){\r
- this.classProduced.add(vClassProduced.get(i));\r
+ Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
+ while (lcdi.hasNext()) {\r
+ LibraryClassDescriptor lcd = lcdi.next();\r
+ if (vClassProduced.get(i).hasInterSectionWith(lcd)) {\r
+ ArrayList<String> alreadyProducedBy = this.classProduced.get(lcd);\r
+ String instanceKey = alreadyProducedBy.get(0);\r
+ ModuleIdentification libMi = WorkspaceProfile.getModuleId(instanceKey);\r
+ throw new MultipleInstanceException (vClassProduced.get(i).className, libMi.getName(), mi.getName());\r
}\r
}\r
- \r
- //\r
- // find potential instances in all dependency pkgs for classes still in classConsumed.\r
+ */\r
+ // normal case.\r
//\r
- if (classInstanceMap == null){\r
- classInstanceMap = new HashMap<String, ArrayList<String>>();\r
+ producedBy.add(key);\r
+ this.classProduced.put(vClassProduced.get(i), producedBy);\r
+ \r
+ }\r
+\r
+ //\r
+ // find potential instances in all pkgs for classes still in classConsumed.\r
+ //\r
+ if (classInstanceMap == null) {\r
+ classInstanceMap = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
+ }\r
+ Iterator<LibraryClassDescriptor> lic = this.classConsumed.keySet().iterator();\r
+ while (lic.hasNext()) {\r
+ LibraryClassDescriptor cls = lic.next();\r
+ if (isBoundedClass(cls)) {\r
+ continue;\r
}\r
- Iterator<String> lic = this.classConsumed.keySet().iterator();\r
- while(lic.hasNext()){\r
- String cls = lic.next();\r
- if (this.classProduced.contains(cls) || classInstanceMap.containsKey(cls)) {\r
- continue;\r
- }\r
- ArrayList<String> instances = getInstancesForClass(cls, depPkgList);\r
- if (instances.size() == 0){\r
- JOptionPane.showMessageDialog(frame, "No Applicable Instance for Library Class " + \r
- cls + ", Platform Build will Fail.");\r
- }\r
- classInstanceMap.put(cls, instances);\r
- \r
+ ArrayList<String> instances = getInstancesForClass(cls, depPkgList);\r
+ if (instances.size() == 0) {\r
+ throw new NoInstanceException (cls.className);\r
}\r
- \r
+ classInstanceMap.put(cls, instances);\r
+\r
+ }\r
// showClassToResolved();\r
+ }\r
+\r
+ /**Search classProduced map to see if this class has been produced by some instance (module).\r
+ * @param cls\r
+ * @return\r
+ */\r
+ private boolean isBoundedClass (LibraryClassDescriptor cls) {\r
+ if (this.classProduced.containsKey(cls)) {\r
+ return true;\r
}\r
- catch(Exception e) {\r
- e.printStackTrace();\r
+ Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
+ while (lcdi.hasNext()) {\r
+ LibraryClassDescriptor lcd = lcdi.next();\r
+ if (cls.isSubSetByArchs(lcd) && cls.isSubSetByModTypes(lcd)) {\r
+ return true;\r
+ }\r
}\r
+ \r
+ return false;\r
}\r
\r
- private ArrayList<String> getInstancesForClass(String cls, PackageIdentification[] depPkgList) throws Exception{\r
+ private ArrayList<String> getInstancesForClass(LibraryClassDescriptor cls, PackageIdentification[] depPkgList){\r
ArrayList<String> al = new ArrayList<String>();\r
\r
// for (int i = 0; i < depPkgList.length; ++i) {\r
// if (!mi.getPackageId().getGuid().equalsIgnoreCase(depPkgList[i].getGuid())) {\r
// continue;\r
// }\r
- String[] clsProduced = getClassProduced(mi);\r
+ Vector<LibraryClassDescriptor> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
\r
boolean isPotential = false;\r
- for (int j = 0; j < clsProduced.length; ++j) {\r
- if (clsProduced[j] == null) {\r
- continue;\r
- }\r
- if (clsProduced[j].equals(cls)){\r
+ Iterator<LibraryClassDescriptor> lcdi = clsProduced.iterator();\r
+ while (lcdi.hasNext()) {\r
+ LibraryClassDescriptor lcd = lcdi.next();\r
+ if (cls.isSubSetByArchs(lcd) && cls.isSubSetByModTypes(lcd)){\r
isPotential = true;\r
}\r
- if (classProduced.contains(clsProduced[j])) {\r
+ \r
+ if (hasBeenProduced(lcd)) {\r
isPotential = false;\r
break;\r
}\r
return al;\r
}\r
\r
+ private boolean hasBeenProduced (LibraryClassDescriptor cls) {\r
+ Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
+ while (lcdi.hasNext()) {\r
+ LibraryClassDescriptor lcd = lcdi.next();\r
+ if (cls.hasInterSectionWith(lcd)) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ private ArrayList<String> getConsumedBy (String className) {\r
+ Iterator<LibraryClassDescriptor> lcdi = this.classConsumed.keySet().iterator();\r
+ while (lcdi.hasNext()) {\r
+ LibraryClassDescriptor lcd = lcdi.next();\r
+ if (lcd.className.equals(className)) {\r
+ return this.classConsumed.get(lcd);\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+ \r
private void removeInstance(String key) {\r
ModuleIdentification mi = WorkspaceProfile.getModuleId(key); \r
//\r
//\r
// remove class produced by this instance and add back these produced class to be bound.\r
//\r
- String[] clsProduced = getClassProduced(mi);\r
- for (int i = 0; i < clsProduced.length; ++i) {\r
+ Vector<LibraryClassDescriptor> clsProduced = getClassProduced(mi);\r
+ for (int i = 0; i < clsProduced.size(); ++i) {\r
\r
- classProduced.remove(clsProduced[i]);\r
+ classProduced.remove(clsProduced.get(i));\r
}\r
//\r
// remove class consumed by this instance. we do not need to bound it now.\r
//\r
String[] clsConsumed = getClassConsumed(mi);\r
for (int i = 0; i < clsConsumed.length; ++i) {\r
- ArrayList<String> al = classConsumed.get(clsConsumed[i]);\r
+ ArrayList<String> al = getConsumedBy (clsConsumed[i]);\r
\r
if (al == null ) {\r
- classConsumed.remove(clsConsumed[i]);\r
continue;\r
}\r
al.remove(key);\r
- if (al.size() == 0) {\r
- classConsumed.remove(clsConsumed[i]);\r
- }\r
- \r
+ \r
}\r
-\r
+ \r
showClassToResolved();\r
\r
}\r
\r
\r
- private String[] getClassProduced(ModuleIdentification mi){\r
- \r
- try{\r
- Vector<String> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
- String[] sClassProduced = new String[clsProduced.size()];\r
- for (int i = 0; i < clsProduced.size(); ++i) {\r
- sClassProduced[i] = clsProduced.get(i);\r
- }\r
- return sClassProduced;\r
- \r
- }catch (Exception e) {\r
- e.printStackTrace();\r
- }\r
- return new String[0];\r
+ private Vector<LibraryClassDescriptor> getClassProduced(ModuleIdentification mi){\r
\r
+ Vector<LibraryClassDescriptor> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
+ return clsProduced;\r
+// String[] sClassProduced = new String[clsProduced.size()];\r
+// for (int i = 0; i < clsProduced.size(); ++i) {\r
+// sClassProduced[i] = clsProduced.get(i).className;\r
+// }\r
+// return sClassProduced;\r
}\r
\r
private String[] getClassConsumed(ModuleIdentification mi){\r
\r
- try{\r
- Vector<String> clsConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
- String[] sClassConsumed = new String[clsConsumed.size()];\r
- for (int i = 0; i < clsConsumed.size(); ++i) {\r
- sClassConsumed[i] = clsConsumed.get(i);\r
- }\r
- return sClassConsumed;\r
- }catch (Exception e) {\r
- e.printStackTrace();\r
+ Vector<LibraryClassDescriptor> clsConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
+ String[] sClassConsumed = new String[clsConsumed.size()];\r
+ for (int i = 0; i < clsConsumed.size(); ++i) {\r
+ sClassConsumed[i] = clsConsumed.get(i).className;\r
}\r
- return new String[0];\r
+ return sClassConsumed;\r
}\r
\r
private void showClassToResolved(){\r
libClassTableModel.setRowCount(0);\r
- if (classConsumed.size() == 0) {\r
+ if (classConsumed == null || classConsumed.size() == 0) {\r
return;\r
}\r
- Iterator<String> li = classConsumed.keySet().iterator();\r
+ Iterator<LibraryClassDescriptor> li = classConsumed.keySet().iterator();\r
while(li.hasNext()){\r
+ LibraryClassDescriptor lcd = li.next();\r
+ String[] s = {lcd.className, lcd.supArchs, lcd.supModTypes};\r
+ if (classConsumed.get(lcd) == null || classConsumed.get(lcd).size() == 0) {\r
+ continue;\r
+ }\r
\r
- String[] s = {li.next()};\r
-// if (classConsumed.get(s[0]) == null) {\r
-// continue;\r
-// }\r
-// if (classConsumed.get(s[0]).size() == 0) {\r
-// continue;\r
-// }\r
- if (!classProduced.contains(s[0])){\r
+ if (!isBoundedClass(lcd)){\r
libClassTableModel.addRow(s);\r
}\r
}\r
model.addColumn("MaxDatumSize");\r
model.addColumn("DataType");\r
model.addColumn("DefaultValue");\r
+ \r
+ jTablePcd.getColumnModel().getColumn(0).setMinWidth(250);\r
+ \r
+ TableColumn tokenColumn = jTablePcd.getColumnModel().getColumn(3);\r
+ jTablePcd.removeColumn(tokenColumn);\r
\r
jTablePcd.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
jTablePcd.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
// array for pcd related information: helpText, itemType, moduleType.\r
//\r
String[] pcdInfo = {"", "", ""};\r
- getPcdInfo(cName, tsGuid, pcdInfo);\r
+ Vector<String> validPcdTypes = new Vector<String>();\r
+ getPcdInfo(moduleKey, cName, tsGuid, pcdInfo, validPcdTypes);\r
jTextAreaPcdHelp.setText(pcdInfo[0]);\r
- initComboBox(pcdInfo[1], pcdInfo[2]);\r
+ initComboBox(pcdInfo[1], pcdInfo[2], validPcdTypes);\r
jComboBoxItemType.setSelectedItem(itemType);\r
jTextFieldMaxDatumSize.setEnabled(true);\r
jTextFieldMaxDatumSize.setVisible(true);\r
- jTextFieldMaxDatumSize.setText(jTablePcd.getValueAt(selectedRow, 4)+"");\r
+ jTextFieldMaxDatumSize.setText(model.getValueAt(selectedRow, 4)+"");\r
jTextFieldPcdDefault.setEnabled(true);\r
- jTextFieldPcdDefault.setText(jTablePcd.getValueAt(selectedRow, 6)+"");\r
+ jTextFieldPcdDefault.setText(model.getValueAt(selectedRow, 6)+"");\r
if (model.getValueAt(selectedRow, 5).equals("VOID*")) {\r
if (pcdInfo[1].equals("FEATURE_FLAG")) {\r
jTextFieldMaxDatumSize.setVisible(false);\r
else if (pcdInfo[1].equals("FIXED_AT_BUILD")) {\r
try{\r
jTextFieldMaxDatumSize.setEnabled(false);\r
- jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(jTablePcd.getValueAt(selectedRow, 6)+"")+"");\r
+ jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(model.getValueAt(selectedRow, 6)+"")+"");\r
}\r
catch(Exception except){\r
JOptionPane.showMessageDialog(frame, "Unacceptable PCD Value: " + except.getMessage());\r
}\r
}\r
else{\r
- jTextFieldMaxDatumSize.setText(jTablePcd.getValueAt(selectedRow, 4)+"");\r
+ jTextFieldMaxDatumSize.setText(model.getValueAt(selectedRow, 4)+"");\r
}\r
}\r
else {\r
return jTablePcd;\r
}\r
\r
- private void initComboBox(String originalType, String mType) {\r
+ private void initComboBox(String originalType, String mType, Vector<String> validPcdTypes) {\r
jComboBoxItemType.removeAllItems();\r
- jComboBoxItemType.addItem(originalType);\r
- if (originalType.equals("PATCHABLE_IN_MODULE") && mType.equalsIgnoreCase("false")) {\r
- jComboBoxItemType.addItem("FIXED_AT_BUILD");\r
- }\r
+\r
if (originalType.equals("DYNAMIC")) {\r
- jComboBoxItemType.addItem("FIXED_AT_BUILD");\r
- jComboBoxItemType.addItem("PATCHABLE_IN_MODULE");\r
+ for (int i = 0; i < validPcdTypes.size(); ++i) {\r
+ jComboBoxItemType.addItem(validPcdTypes.get(i));\r
+ }\r
+ }\r
+ else {\r
+ jComboBoxItemType.addItem(originalType);\r
}\r
}\r
\r
- private void getPcdInfo(String cName, String tsGuid, String[] sa) {\r
+ /**\r
+ * @param cName\r
+ * @param tsGuid\r
+ * @param sa sa[0]: HelpText; sa[1]: itemType in Msa; sa[2]: isBinary;\r
+ */\r
+ private void getPcdInfo(String moduleKey, String cName, String tsGuid, String[] sa, Vector<String> validPcdTypes) {\r
String[][] saa = new String[ffc.getLibraryInstancesCount(moduleKey)][5];\r
ffc.getLibraryInstances(moduleKey, saa);\r
\r
try{\r
- if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(moduleKey), cName, tsGuid, sa)) {\r
+ if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(moduleKey), cName, tsGuid, sa, validPcdTypes)) {\r
return;\r
}\r
for (int j = 0; j < saa.length; ++j) {\r
if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(saa[j][1] + " " + saa[j][2] + " " + saa[j][3] + " " + saa[j][4]),\r
- cName, tsGuid, sa)) {\r
+ cName, tsGuid, sa, validPcdTypes)) {\r
return;\r
}\r
}\r
selectedInstancesTableModel.addColumn("PackageVersion");\r
jTableSelectedInstances = new JTable(selectedInstancesTableModel);\r
jTableSelectedInstances.setRowHeight(20);\r
+ \r
+ jTableSelectedInstances.getColumnModel().getColumn(0).setMinWidth(250);\r
+ \r
jTableSelectedInstances.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);\r
jTableSelectedInstances.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
\r
if (jTableLibClass == null) {\r
libClassTableModel = new IDefaultTableModel();\r
libClassTableModel.addColumn("LibraryClass");\r
+ libClassTableModel.addColumn("Arch");\r
+ libClassTableModel.addColumn("ModType");\r
jTableLibClass = new JTable(libClassTableModel);\r
jTableLibClass.setRowHeight(20);\r
jTableLibClass.setShowGrid(false);\r
jTableLibClass.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
+ \r
+ TableColumn column = jTableLibClass.getColumnModel().getColumn(1);\r
+ jTableLibClass.getColumnModel().removeColumn(column);\r
+ column = jTableLibClass.getColumnModel().getColumn(1);\r
+ jTableLibClass.getColumnModel().removeColumn(column);\r
+ \r
jTableLibClass.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
public void valueChanged(ListSelectionEvent e) {\r
if (e.getValueIsAdjusting()){\r
//\r
libInstanceTableModel.setRowCount(0);\r
String cls = libClassTableModel.getValueAt(selectedRow2, 0).toString();\r
- ArrayList<String> al = classInstanceMap.get(cls);\r
+ String arch = libClassTableModel.getValueAt(selectedRow2, 1).toString();\r
+ String modType = libClassTableModel.getValueAt(selectedRow2, 2).toString();\r
+ ArrayList<String> al = classInstanceMap.get(new LibraryClassDescriptor(cls, arch, modType));\r
+ if (al == null) {\r
+ return;\r
+ }\r
ListIterator<String> li = al.listIterator();\r
while(li.hasNext()) {\r
String instance = li.next();\r
libInstanceTableModel.addColumn("PackageVersion");\r
jTableLibInstances = new JTable(libInstanceTableModel);\r
jTableLibInstances.setRowHeight(20);\r
+ \r
+ jTableLibInstances.getColumnModel().getColumn(0).setMinWidth(250);\r
+ \r
jTableLibInstances.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);\r
jTableLibInstances.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
\r
libInstanceTableModel.getValueAt(row, 2), libInstanceTableModel.getValueAt(row, 3),\r
libInstanceTableModel.getValueAt(row, 4)};\r
selectedInstancesTableModel.addRow(s);\r
- resolveLibraryInstances(instanceValue);\r
+ try {\r
+ resolveLibraryInstances(instanceValue);\r
+ }\r
+ catch (Exception exp) {\r
+ JOptionPane.showMessageDialog(frame, exp.getMessage());\r
+ }\r
showClassToResolved();\r
}\r
});\r
if (jButtonOk == null) {\r
jButtonOk = new JButton();\r
jButtonOk.setPreferredSize(new java.awt.Dimension(80,20));\r
- jButtonOk.setText("Ok");\r
+ jButtonOk.setText("Close");\r
jButtonOk.addActionListener(this);\r
}\r
return jButtonOk;\r
}\r
return jPanelModuleSaOpts;\r
}\r
+ \r
+ private Vector<String> getVectorFromString (String s) {\r
+ if (s == null || s.equals("null")) {\r
+ s = "";\r
+ }\r
+ String[] sa1 = s.split(" ");\r
+ Vector<String> v = new Vector<String>();\r
+ for (int i = 0; i < sa1.length; ++i) {\r
+ v.add(sa1[i]);\r
+ }\r
+ return v;\r
+ }\r
+ \r
/**\r
* This method initializes jTextField \r
* \r
if (newFvBinding.length() == 0 && originalFvBinding == null) {\r
return;\r
}\r
- docConsole.setSaved(false);\r
+ \r
+ Vector<String> oldFvList = getVectorFromString (originalFvBinding);\r
+ Vector<String> newFvList = getVectorFromString (newFvBinding);\r
+ String moduleInfo[] = moduleKey.split(" ");\r
ffc.setFvBinding(moduleKey, newFvBinding);\r
+ //\r
+ // remove module from Fvs that not in newFvList now.\r
+ //\r
+ oldFvList.removeAll(newFvList);\r
+ for (int j = 0; j < oldFvList.size(); ++j) {\r
+ ffc.removeModuleInBuildOptionsUserExtensions(oldFvList.get(j), "IMAGES", 1, moduleInfo[0], moduleInfo[1], moduleInfo[2], moduleInfo[3], moduleInfo[4]); \r
+ }\r
+ //\r
+ // add module to Fvs that were not in oldFvList.\r
+ //\r
+ oldFvList = getVectorFromString (originalFvBinding);\r
+ newFvList.removeAll(oldFvList);\r
+ for (int i = 0; i < newFvList.size(); ++i) {\r
+ ffc.addModuleIntoBuildOptionsUserExtensions(newFvList.get(i), "IMAGES", 1, moduleInfo[0], moduleInfo[1], moduleInfo[2], moduleInfo[3], moduleInfo[4]);\r
+ }\r
+ docConsole.setSaved(false);\r
}\r
});\r
\r
jTableModuleSaOptions = new JTable(optionsTableModel);\r
jTableModuleSaOptions.setRowHeight(20);\r
\r
+ jTableModuleSaOptions.getColumnModel().getColumn(0).setMinWidth(buildTargetWidth);\r
+ jTableModuleSaOptions.getColumnModel().getColumn(1).setMinWidth(toolChainFamilyWidth);\r
+ jTableModuleSaOptions.getColumnModel().getColumn(2).setMinWidth(tagNameWidth);\r
+ jTableModuleSaOptions.getColumnModel().getColumn(3).setMinWidth(toolCmdCodeWidth);\r
+ jTableModuleSaOptions.getColumnModel().getColumn(4).setMinWidth(supportArchWidth);\r
+ jTableModuleSaOptions.getColumnModel().getColumn(5).setMinWidth(argWidth);\r
// javax.swing.table.TableColumn toolFamilyCol = jTableModuleSaOptions.getColumnModel().getColumn(1);\r
// JComboBox cb = new JComboBox();\r
// cb.addItem("MSFT");\r
public void actionPerformed(java.awt.event.ActionEvent e) {\r
String[] row = {"", "", "", "", "", ""};\r
optionsTableModel.addRow(row);\r
- Vector<Object> v = new Vector<Object>();\r
+ Vector<Object> v = null;\r
Vector<Object> v1 = null;\r
docConsole.setSaved(false);\r
ffc.genModuleSAOptionsOpt(moduleKey, v, "", "", "", v1, "");\r
if (jComboBoxItemType == null) {\r
jComboBoxItemType = new JComboBox();\r
jComboBoxItemType.setPreferredSize(new java.awt.Dimension(200,20));\r
- jComboBoxItemType.addItemListener(new java.awt.event.ItemListener() {\r
- public void itemStateChanged(java.awt.event.ItemEvent e) {\r
- int row = jTablePcd.getSelectedRow();\r
- if (row < 0 || model.getValueAt(row, 2).equals(jComboBoxItemType.getSelectedItem())) {\r
- return;\r
- }\r
- if (jComboBoxItemType.getItemCount() == 3) {\r
- if (!jComboBoxItemType.getSelectedItem().equals("DYNAMIC")) {\r
- \r
- if (jComboBoxItemType.getSelectedItem().equals("FIXED_AT_BUILD")) {\r
- jTextFieldPcdDefault.setText("");\r
- jTextFieldPcdDefault.setEnabled(true);\r
- }\r
- }\r
- else{\r
- \r
- }\r
- }\r
- }\r
- });\r
+// jComboBoxItemType.addItemListener(new java.awt.event.ItemListener() {\r
+// public void itemStateChanged(java.awt.event.ItemEvent e) {\r
+// \r
+// int row = jTablePcd.getSelectedRow();\r
+// if (row < 0 || model.getValueAt(row, 2).equals(jComboBoxItemType.getSelectedItem())) {\r
+// return;\r
+// }\r
+// if (!jComboBoxItemType.getSelectedItem().equals("DYNAMIC")) {\r
+// \r
+// if (jComboBoxItemType.getSelectedItem().equals("FIXED_AT_BUILD")) {\r
+// jTextFieldPcdDefault.setText("");\r
+// jTextFieldPcdDefault.setEnabled(true);\r
+// }\r
+// }\r
+// else{\r
+// \r
+// }\r
+// }\r
+// });\r
}\r
return jComboBoxItemType;\r
}\r
ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
for (int i = 0; i < al.size(); ++i) {\r
String mKey = moduleInfo (al.get(i));\r
- ffc.updatePcdData(mKey, cName, tsGuid, jComboBoxItemType.getSelectedItem()+"", maxSize, value);\r
+ value = null;\r
String itemType = jComboBoxItemType.getSelectedItem()+"";\r
+ ffc.updatePcdData(mKey, cName, tsGuid, itemType, maxSize, value);\r
al.set(i, mKey + " " + itemType);\r
}\r
\r
ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
for (int i = 0; i < al.size(); ++i) {\r
String mKey = moduleInfo (al.get(i));\r
- ffc.updatePcdData(mKey, cName, tsGuid, jComboBoxItemType.getSelectedItem()+"", jTextFieldMaxDatumSize.getText(), jTextFieldPcdDefault.isVisible() ? jTextFieldPcdDefault.getText() : jComboBoxFeatureFlagValue.getSelectedItem()+"");\r
String itemType = jComboBoxItemType.getSelectedItem()+"";\r
+ ffc.updatePcdData(mKey, cName, tsGuid, itemType, jTextFieldMaxDatumSize.getText(), jTextFieldPcdDefault.isVisible() ? jTextFieldPcdDefault.getText() : jComboBoxFeatureFlagValue.getSelectedItem()+"");\r
al.set(i, mKey + " " + itemType);\r
}\r
try{\r
}\r
}\r
\r
+private void changePcdTypeWithinSameCategory (String cName, String tsGuid) {\r
+ ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
+ for (int i = 0; i < al.size(); ++i) {\r
+ String mKey = moduleInfo (al.get(i));\r
+ String itemType = jComboBoxItemType.getSelectedItem()+"";\r
+ ffc.updatePcdData(mKey, cName, tsGuid, itemType, null, null);\r
+ al.set(i, mKey + " " + itemType);\r
+ }\r
+}\r
+\r
private String moduleInfo (String pcdInfo) {\r
\r
return pcdInfo.substring(0, pcdInfo.lastIndexOf(" "));\r
if (row < 0) {\r
return;\r
}\r
- docConsole.setSaved(false);\r
+ \r
+ String cName = model.getValueAt(row, 0)+"";\r
+ String tsGuid = model.getValueAt(row, 1)+"";\r
String oldItemType = model.getValueAt(row, 2)+"";\r
String newItemType = jComboBoxItemType.getSelectedItem()+"";\r
- model.setValueAt(newItemType, row, 2);\r
- model.setValueAt(jTextFieldMaxDatumSize.getText(), row, 4);\r
- model.setValueAt(jTextFieldPcdDefault.isVisible()? jTextFieldPcdDefault.getText():jComboBoxFeatureFlagValue.getSelectedItem(), row, 6);\r
- if (oldItemType.equals("DYNAMIC") && !newItemType.equals("DYNAMIC")) {\r
- pcdDynamicToNonDynamic(model.getValueAt(row, 0)+"", model.getValueAt(row, 1)+"");\r
+ String newValue = jTextFieldPcdDefault.isVisible()? jTextFieldPcdDefault.getText():jComboBoxFeatureFlagValue.getSelectedItem()+""; \r
+ \r
+ String[] pcdInfo = {"", "", ""};\r
+ Vector<String> validPcdTypes = new Vector<String>();\r
+ getPcdInfo (moduleKey, cName, tsGuid, pcdInfo, validPcdTypes);\r
+ if (pcdInfo[1].equals("FIXED_AT_BUILD") && model.getValueAt(row, 5).equals("VOID*")) {\r
+ try {\r
+ jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(newValue)+"");\r
+ }\r
+ catch (Exception exp) {\r
+ JOptionPane.showMessageDialog(frame, "PCD Value MalFormed: " + exp.getMessage());\r
+ return;\r
+ }\r
}\r
- if (!oldItemType.equals("DYNAMIC") && newItemType.equals("DYNAMIC")) {\r
- pcdNonDynamicToDynamic(model.getValueAt(row, 0)+"", model.getValueAt(row, 1)+"");\r
+ String newMaxDatumSize = jTextFieldMaxDatumSize.getText();\r
+ \r
+ if (!newItemType.equals(oldItemType)) {\r
+ Vector<ModuleIdentification> moduleInfo = new Vector<ModuleIdentification>();\r
+ try {\r
+ boolean changable = itemTypeCouldBeChanged (cName, tsGuid, newItemType, moduleInfo);\r
+ if (!changable) {\r
+ JOptionPane.showMessageDialog(frame, "Can NOT Change Pcd Type in: " + moduleInfo.get(0).getName() + " contained in package " + moduleInfo.get(0).getPackageId().getName());\r
+ return;\r
+ }\r
+ }\r
+ catch (Exception exp) {\r
+ JOptionPane.showMessageDialog(frame, "Can NOT Change Pcd Type in: " + moduleInfo.get(0).getName() + " contained in package " + moduleInfo.get(0).getPackageId().getName() + " " + exp.getMessage());\r
+ return;\r
+ }\r
+ \r
+ if ((oldItemType.equals("DYNAMIC") || oldItemType.equals("DYNAMIC_EX")) && !newItemType.equals("DYNAMIC") && !newItemType.equals("DYNAMIC_EX")) {\r
+ pcdDynamicToNonDynamic(cName, tsGuid);\r
+ }\r
+ if (!oldItemType.equals("DYNAMIC") && !oldItemType.equals("DYNAMIC_EX") && (newItemType.equals("DYNAMIC") || newItemType.equals("DYNAMIC_EX"))) {\r
+ pcdNonDynamicToDynamic(cName, tsGuid);\r
+ }\r
+ else {\r
+ changePcdTypeWithinSameCategory (cName, tsGuid);\r
+ }\r
+ model.setValueAt(newItemType, row, 2);\r
}\r
- ffc.updatePcdData(moduleKey, model.getValueAt(row, 0)+"", model.getValueAt(row, 1)+"", model.getValueAt(row, 2)+"", model.getValueAt(row, 4)+"", model.getValueAt(row, 6)+"");\r
+ \r
+ ffc.updatePcdData(moduleKey, cName, tsGuid, model.getValueAt(row, 2)+"", newMaxDatumSize, newValue);\r
+ docConsole.setSaved(false);\r
+ model.setValueAt(newValue, row, 6);\r
+ model.setValueAt(newMaxDatumSize, row, 4);\r
+ \r
}\r
});\r
}\r
return jButtonUpdatePcd;\r
}\r
+\r
+private boolean itemTypeCouldBeChanged (String cName, String tsGuid, String newItemType, Vector<ModuleIdentification> mi) throws Exception{\r
+ ArrayList<String> pcdConsumers = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
+ for (int i = 0; i < pcdConsumers.size(); ++i) {\r
+ String consumerInfo = moduleInfo (pcdConsumers.get(i));\r
+ mi.removeAllElements();\r
+ mi.add(WorkspaceProfile.getModuleId(consumerInfo));\r
+ String[] sa = {"", "", ""};\r
+ Vector<String> validPcdTypes = new Vector<String>();\r
+ getPcdInfo (consumerInfo, cName, tsGuid, sa, validPcdTypes);\r
+ if (validPcdTypes.size() == 0) {\r
+ return false;\r
+ }\r
+ if (!sa[1].equals("DYNAMIC")) {\r
+ return false;\r
+ }\r
+ if (!validPcdTypes.contains(newItemType)) {\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+}\r
+\r
/**\r
* This method initializes jComboBoxFeatureFlagValue\r
* \r
\r
\r
} // @jve:decl-index=0:visual-constraint="10,10"\r
+\r
+class MultipleInstanceException extends Exception {\r
+\r
+ /**\r
+ * \r
+ */\r
+ private static final long serialVersionUID = -9148463005930920297L;\r
+ private String className = null;\r
+ private String libInstance1 = null;\r
+ private String libInstance2 = null;\r
+ \r
+ MultipleInstanceException (String libClass, String instance1, String instance2) {\r
+ super();\r
+ className = libClass;\r
+ libInstance1 = instance1;\r
+ libInstance2 = instance2;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see java.lang.Throwable#getMessage()\r
+ */\r
+ @Override\r
+ public String getMessage() {\r
+ // TODO Auto-generated method stub\r
+ return " Library Class " + className + "is Produced by Two Instances: " \r
+ + libInstance1 + " and " + libInstance2 + ". Platform Build will Fail.";\r
+ }\r
+ \r
+}\r
+\r
+class NoInstanceException extends Exception {\r
+\r
+ /**\r
+ * \r
+ */\r
+ private static final long serialVersionUID = 1987122786598970598L;\r
+ \r
+ private String className = null;\r
+ \r
+ NoInstanceException (String libClass) {\r
+ className = libClass;\r
+ }\r
+ \r
+ public String getMessage() {\r
+ return "No Applicable Instance for Library Class " + className\r
+ + ", Platform Build will Fail.";\r
+ }\r
+}\r