// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= How do I register a "ProjectCustomizer" to multiple project types?
:jbake-type: wikidev
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqActionAddProjectCustomizerToMultipleTypes
:description: Apache NetBeans wiki DevFaqActionAddProjectCustomizerToMultipleTypes
:toc: left
:toc-title:
:syntax: true
:wikidevsection: _project_types
:position: 6

Use the *@Registrations* annotation to group the multiple *@Registration* annotations.

For example 

[source,java]
----

@ProjectCustomizer.CompositeCategoryProvider.Registrations({
    @ProjectCustomizer.CompositeCategoryProvider.Registration(projectType = "org-netbeans-modules-java-j2seproject"),
    @ProjectCustomizer.CompositeCategoryProvider.Registration(projectType = "org-netbeans-modules-web-project"),
    @ProjectCustomizer.CompositeCategoryProvider.Registration(projectType = "org-netbeans-modules-maven")
})
public class MyPluginPanelProvider implements ProjectCustomizer.CompositeCategoryProvider {
//...
}
----

Applies to: NetBeans IDE 7.x
Platforms: All

See xref:../tutorials/nbm-projecttype.adoc#projectcustomizer[https://netbeans.apache.org/tutorials/nbm-projecttype.html#projectcustomizer]

////
== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqActionAddProjectCustomizerToMultipleTypes[http://wiki.netbeans.org/DevFaqActionAddProjectCustomizerToMultipleTypes] , 
that was last modified by NetBeans user Markiewb 
on 2012-10-07T13:56:52Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
////