// 
//     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.
//

= DevFaqHowOrganizeOrReuseExistingActionsWithAnnotations
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqHowOrganizeOrReuseExistingActionsWithAnnotations
:description: Apache NetBeans wiki DevFaqHowOrganizeOrReuseExistingActionsWithAnnotations
:toc: left
:toc-title:
:syntax: true

How can we reuse and organise existing actions in our menus or pop menus? Usually you need to know the original location of the action you want to use and then refer to it as shadow in your layer.xml file. This requires you to create such as file what you want less and less.

Fortunately there is solution: use annotations such as @ActionReference, @ActionReferences and @ActionID. Their usage is obvious when you create your own actions, but how can they be used to refer to existing actions?

Create an empty class that you will include in your module:

[source,java]
----

  public class ActionsRefs {
  }
----

Next annotate this class with @ActionReference, @ActionReferences:

[source,java]
----

  @ActionReferences(value = {
      @ActionReference(id = @ActionID(category = "System", 
                            id =   "org.openide.actions.FileSystemRefreshAction"), 
                       path = "Console/Service/Brokers/Actions/MessageBus", 
                       position = 200)})
  class ActionsRefs {
  }
----

This class will be used as action reference configuration and the annotation preprocessor will create the proper entries the the generated layer.xml file. Notice the embeded @ActionID? This refers to the existing Action.

=== 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/DevFaqHowOrganizeOrReuseExistingActionsWithAnnotations[http://wiki.netbeans.org/DevFaqHowOrganizeOrReuseExistingActionsWithAnnotations] , 
that was last modified by NetBeans user Jmborer 
on 2014-01-09T14:05:20Z.


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