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

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

=== How do I add an action to a the popup menu of the Java editor?

The simplest way is to run New Action Wizard (File > New... > Module Development > Action) which creates an action for you and registers it in your `layer.xml`.

1. On the first tab, choose *Conditionally Enabled* action and select `EditorCookie` as the cookie class. 
2. On the second tab, check *Editor Context Menu Item* and choose MIME type (`text/x-java` in this case) and position.

OR
use

[source,java]
----

@ActionReference(path="Editors/text/x-java/Popup")
----

 for an action with the `EditorCookie` as context object
<hr/>

=== See also:

* link:DevFaqActionAddToContextMenuOfAllEditors.asciidoc[How do I add an action to the context menu of all editors?]
* link:DevFaqActionAddFileMime.asciidoc[How do I add an action to a file of a given mime-type? ]
* link:DevFaqActionAddFolder.asciidoc[How do I add an action to a folder? ]
* link:DevFaqActionAddEditorPopup.asciidoc[How do I add an action to the text-editor popup menu? ]
* link:DevFaqActionAddMenuBar.asciidoc[How do I add an action to the NetBeans menu bar? ]
* link:DevFaqActionAddToolBar.asciidoc[How do I add an action to the NetBeans tool bar? ]
* link:DevFaqActionAddDataObject.asciidoc[How do I add an action to my custom node? ]

=== 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/DevFaqActionAddEditorPopup[http://wiki.netbeans.org/DevFaqActionAddEditorPopup] , 
that was last modified by NetBeans user Markiewb 
on 2014-12-31T11:45:54Z.


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