# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: E:\sources\netbeans.org\trunk\projects\projectuiapi # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: apichanges.xml *** E:\sources\netbeans.org\trunk\projects\projectuiapi\apichanges.xml Base (1.28) --- E:\sources\netbeans.org\trunk\projects\projectuiapi\apichanges.xml Locally Modified (Based On 1.28) *************** *** 81,86 **** --- 81,106 ---- + + + Added a way how to define UI component for non-leaf category node in project customizer + + + + + Semantic change of handling files according to location and name on layer filesystem - File of particular filename + under category folder is handled differently. + + + Allow to define UI component for non-leaf category node in project customizer by setting name of the + file in folder on layer filesystem. If there is category Cat1 with some subcategories and + UI component is needed for Cat1, the folder that defines Cat1 in layer needs to contain file with name + 'Cat1.itself.instance'. Instance of the file will be used to create customizer component for the category. + + + + + Ability to attach a ok button listener on single customizer category. Index: src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java *** E:\sources\netbeans.org\trunk\projects\projectuiapi\src\org\netbeans\spi\project\ui\support\ProjectCustomizer.java Base (1.10) --- E:\sources\netbeans.org\trunk\projects\projectuiapi\src\org\netbeans\spi\project\ui\support\ProjectCustomizer.java Locally Modified (Based On 1.10) *************** *** 198,204 **** * The panel/category created by the provider can get notified that the customizer got * closed by setting an ActionListener to * {@link org.netbeans.spi.project.ui.support.ProjectCustomizer.Category#setOkButtonListener} . ! * @since org.netbeans.modules.projectuiapi/1 1.15 */ public static interface CompositeCategoryProvider { --- 198,207 ---- * The panel/category created by the provider can get notified that the customizer got * closed by setting an ActionListener to * {@link org.netbeans.spi.project.ui.support.ProjectCustomizer.Category#setOkButtonListener} . ! * UI Component can be defined for category folder that is repesented as node with subnodes in the category tree of ! * project customizer. Name of the file that defines the instance class in layer for such category must be named ! * as folder name + ".itself". For details and usage see issue #91276. ! * @since org.netbeans.modules.projectuiapi/1 1.22 */ public static interface CompositeCategoryProvider { *************** *** 370,384 **** --- 373,393 ---- private final Lookup context; private final Map category2provider; private final DataFolder folder; + private final CompositeCategoryProvider itselfProvider; public DelegateCategoryProvider(DataFolder folder, Lookup context) { this(folder, context, new HashMap()); } private DelegateCategoryProvider(DataFolder folder, Lookup context, Map cat2Provider) { + this(folder, context, cat2Provider, null); + } + + private DelegateCategoryProvider(DataFolder folder, Lookup context, Map cat2Provider, CompositeCategoryProvider iProv) { this.context = context; this.folder = folder; category2provider = cat2Provider; + itselfProvider = iProv; } public JComponent create(ProjectCustomizer.Category category) { *************** *** 404,417 **** List toRet = new ArrayList(); for (DataObject dob : folder.getChildren()) { if (dob instanceof DataFolder) { ! CompositeCategoryProvider prov = new DelegateCategoryProvider((DataFolder) dob, context, category2provider); ProjectCustomizer.Category cat = prov.createCategory(context); toRet.add(cat); category2provider.put(cat, prov); } InstanceCookie cook = dob.getCookie(InstanceCookie.class); if (cook != null && CompositeCategoryProvider.class.isAssignableFrom(cook.instanceClass())) { --- 413,439 ---- List toRet = new ArrayList(); for (DataObject dob : folder.getChildren()) { if (dob instanceof DataFolder) { ! CompositeCategoryProvider iProvider = null; ! DataObject subDobs[] = ((DataFolder) dob).getChildren(); ! for (DataObject subDob : subDobs) { ! if (subDob.getName().equals(dob.getName() + ".itself")) { // NOI18N ! InstanceCookie cookie = subDob.getCookie(InstanceCookie.class); ! if (cookie != null && CompositeCategoryProvider.class.isAssignableFrom(cookie.instanceClass())) { ! iProvider = (CompositeCategoryProvider) cookie.instanceCreate(); ! } ! } ! } ! CompositeCategoryProvider prov = null; ! if (iProvider != null) { ! prov = new DelegateCategoryProvider((DataFolder) dob, context, category2provider, iProvider); ! } else { ! prov = new DelegateCategoryProvider((DataFolder) dob, context, category2provider); ! } ProjectCustomizer.Category cat = prov.createCategory(context); toRet.add(cat); category2provider.put(cat, prov); } + if (!dob.getName().equals(folder.getName() + ".itself")) { // NOI18N InstanceCookie cook = dob.getCookie(InstanceCookie.class); if (cook != null && CompositeCategoryProvider.class.isAssignableFrom(cook.instanceClass())) { CompositeCategoryProvider provider = (CompositeCategoryProvider)cook.instanceCreate(); *************** *** 421,426 **** --- 446,452 ---- } } } + } return toRet.toArray(new ProjectCustomizer.Category[toRet.size()]); } *************** *** 442,447 **** --- 468,476 ---- * provides component for folder category */ public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + if (itselfProvider != null) { + return itselfProvider.createComponent(category, context); + } return new JPanel(); } }