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

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

=== How do I add an action to a folder?

Use @ActionReference.

=== See also:

* link:DevFaqActionAddFileMime.asciidoc[How do I add an action to a file of a given mime-type?]
* 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/DevFaqActionAddFolder[http://wiki.netbeans.org/DevFaqActionAddFolder] , 
that was last modified by NetBeans user Jglick 
on 2011-12-14T00:15:37Z.


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