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

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

==== How do I add an action to a project node's popup menu of my own project type?

* To add the Copy/Delete/Move/Rename action to your project's node, you should:
1. Implement the corresponding interface such as `org.netbeans.spi.project.CopyOperationImplementation`.
2. Implement `org.netbeans.spi.project.ActionProvider`:
[source,java]
----

public final class AddActionActions implements ActionProvider {
    private final AddActionProject project; //suppose this is your project
    public AddActionActions(AddActionProject project) {
        this.project = project;
    }
    public String[] getSupportedActions() {
        return new String[] {
            ActionProvider.COMMAND_COPY
        };
    }
    public boolean isActionEnabled(String command, Lookup context) {
        if (command.equals(ActionProvider.COMMAND_COPY)) {
            return true;
        } else {
            throw new IllegalArgumentException(command);
        }
    }
    public void invokeAction(String command, Lookup context) {
        if (command.equalsIgnoreCase(ActionProvider.COMMAND_COPY)){
            DefaultProjectOperations.performDefaultCopyOperation(project);
        }
    }
}

----

1. 1. Add these implementations to your project's lookup:
[source,java]
----

lookup = Lookups.fixed(
    // ... as before
    new AddActionOperation(this),
    new AddActionActions(this),
);
   
----

1. 1. Register the actions into the project node's context menu:
[source,xml]
----

public @Override Action[] getActions(boolean context) {   
    Action[[ | ]] nodeActions = new Action[2];
    nodeActions[0] = CommonProjectActions.copyProjectAction();
    nodeActions[1] = CommonProjectActions.closeProjectAction();
    return nodeActions;
}

----

* To add the other actions specified in the Project API such as `closeProjectAction`, just add it to the list of actions of your node.
* To add an action you created yourself, just add it to the list of actions of your node.

See also: link:http://bits.netbeans.org/dev/javadoc/org-netbeans-modules-projectuiapi/org/netbeans/spi/project/ui/support/CommonProjectActions.html[Common Project Actions]

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


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