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

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

=== How do I add an item to for every folder in the system?

There is a folder in the link:DevFaqSystemFilesystem.asciidoc[System Filesystem ] called Loaders.  It is where various things are registered that apply to specific link:DevFaqDataObject.asciidoc[DataObject ] types.  For example, there is a folder `Loaders/text/x-java` that contains things that pertain to Java files (notice that the path is a MIME type).  It has an `Actions` subfolder where you can add actions to the popup menu for Java files.

You may not think of a folder as being a file type, but to NetBeans it is.  There is a subfolder `Loaders/folder/any/Actions` which contains actions that should appear in the popup menu for folders.  Just add your action in your link:DevFaqModulesLayerFile.asciidoc[layer file ] to that folder, i.e.

[source,xml]
----

<filesystem>
  <folder name="Loaders">
      <folder name="folder">
          <folder name="any">
            <folder name="Actions">
               <file name="com-foo-module-MyAction.instance"/>
          </folder>
        </folder>
      </folder>
    </folder>
</filesystem>

----

=== 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/DevFaqDataSystemsAddPopupToAllFolders[http://wiki.netbeans.org/DevFaqDataSystemsAddPopupToAllFolders] , 
that was last modified by NetBeans user Jtulach 
on 2010-07-24T19:52:50Z.


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