Index: projects/projectuiapi/apichanges.xml =================================================================== RCS file: /cvs/projects/projectuiapi/apichanges.xml,v retrieving revision 1.28 diff -u -r1.28 apichanges.xml --- projects/projectuiapi/apichanges.xml 23 Oct 2006 14:21:52 -0000 1.28 +++ projects/projectuiapi/apichanges.xml 15 Jan 2007 15:39:20 -0000 @@ -81,6 +81,27 @@ + + + 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 a category with some subcategories and + UI component is needed for the category, the folder that defines the category in layer needs + to contain file with name 'Self.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: projects/projectuiapi/nbproject/project.properties =================================================================== RCS file: /cvs/projects/projectuiapi/nbproject/project.properties,v retrieving revision 1.29 diff -u -r1.29 project.properties --- projects/projectuiapi/nbproject/project.properties 23 Oct 2006 14:21:52 -0000 1.29 +++ projects/projectuiapi/nbproject/project.properties 15 Jan 2007 15:39:20 -0000 @@ -17,7 +17,7 @@ javac.compilerargs=-Xlint -Xlint:-serial javac.source=1.5 -spec.version.base=1.21.0 +spec.version.base=1.22.0 is.autoload=true javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml Index: projects/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java =================================================================== RCS file: /cvs/projects/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java,v retrieving revision 1.10 diff -u -r1.10 ProjectCustomizer.java --- projects/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java 23 Oct 2006 14:21:53 -0000 1.10 +++ projects/projectuiapi/src/org/netbeans/spi/project/ui/support/ProjectCustomizer.java 15 Jan 2007 15:39:20 -0000 @@ -198,7 +198,10 @@ * 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 + * 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 "Self". For details and usage see issue #91276. + * @since org.netbeans.modules.projectuiapi/1 1.22 */ public static interface CompositeCategoryProvider { @@ -370,15 +373,21 @@ private final Lookup context; private final Map category2provider; private final DataFolder folder; + private final CompositeCategoryProvider selfProvider; 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 sProv) { this.context = context; this.folder = folder; category2provider = cat2Provider; + selfProvider = sProv; } public JComponent create(ProjectCustomizer.Category category) { @@ -404,20 +413,37 @@ List toRet = new ArrayList(); for (DataObject dob : folder.getChildren()) { if (dob instanceof DataFolder) { - CompositeCategoryProvider prov = new DelegateCategoryProvider((DataFolder) dob, context, category2provider); + CompositeCategoryProvider sProvider = null; + DataObject subDobs[] = ((DataFolder) dob).getChildren(); + for (DataObject subDob : subDobs) { + if (subDob.getName().equals("Self")) { // NOI18N + InstanceCookie cookie = subDob.getCookie(InstanceCookie.class); + if (cookie != null && CompositeCategoryProvider.class.isAssignableFrom(cookie.instanceClass())) { + sProvider = (CompositeCategoryProvider) cookie.instanceCreate(); + } + } + } + CompositeCategoryProvider prov = null; + if (sProvider != null) { + prov = new DelegateCategoryProvider((DataFolder) dob, context, category2provider, sProvider); + } else { + 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())) { - CompositeCategoryProvider provider = (CompositeCategoryProvider)cook.instanceCreate(); - ProjectCustomizer.Category cat = provider.createCategory(context); - if (cat != null) { - assert cat.getSubcategories() == null || cat.getSubcategories().length == 0 + if (!dob.getName().equals("Self")) { // NOI18N + InstanceCookie cook = dob.getCookie(InstanceCookie.class); + if (cook != null && CompositeCategoryProvider.class.isAssignableFrom(cook.instanceClass())) { + CompositeCategoryProvider provider = (CompositeCategoryProvider)cook.instanceCreate(); + ProjectCustomizer.Category cat = provider.createCategory(context); + if (cat != null) { + assert cat.getSubcategories() == null || cat.getSubcategories().length == 0 : "Cannot have subcategories for declaratively added category. Please declare the subcategories as well."; //NOI18N - toRet.add(cat); - category2provider.put(cat, provider); + toRet.add(cat); + category2provider.put(cat, provider); + } } } } @@ -442,6 +468,9 @@ * provides component for folder category */ public JComponent createComponent(ProjectCustomizer.Category category, Lookup context) { + if (selfProvider != null) { + return selfProvider.createComponent(category, context); + } return new JPanel(); } }