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

= DevFaqListenForOpeningClosingProject
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published

= How to listen for projects to be opened/closed?

== Specific for a project-type

Implement a ProjectOpenedHook and register it to a project-type
`

[source,java]
----

@ProjectServiceProvider(
    service =ProjectOpenedHook.class,
    projectType = {"org-netbeans-modules-web-project"}
)
public class MyProjectOpenedHook extends ProjectOpenedHook {

    private final Project project;

    public MyProjectOpenedHook(Project project) {
        this.project = project;
    }

    @Override
    protected void projectOpened() {
          System.out.println("opened"+project);
    }

    @Override
    protected void projectClosed() {
          System.out.println("closed"+project);
    }
}

----

`
Inspired by link:https://github.com/shannah/mirah-nbm/blob/695afe895553bbcae0a2f3ad8bfc38f48963de9b/src/ca/weblite/netbeans/mirah/antproject/web/WebMirahProjectOpenedHook.java[https://github.com/shannah/mirah-nbm/blob/695afe895553bbcae0a2f3ad8bfc38f48963de9b/src/ca/weblite/netbeans/mirah/antproject/web/WebMirahProjectOpenedHook.java]

== For all project-types

See link:https://blogs.oracle.com/geertjan/entry/org_netbeans_spi_project_ui[https://blogs.oracle.com/geertjan/entry/org_netbeans_spi_project_ui]

=== 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/DevFaqListenForOpeningClosingProject[http://wiki.netbeans.org/DevFaqListenForOpeningClosingProject] , 
that was last modified by NetBeans user Markiewb 
on 2015-03-12T18:54:53Z.


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