// 
//     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
:keywords: Apache NetBeans wiki DevFaqListenForOpeningClosingProject
:description: Apache NetBeans wiki DevFaqListenForOpeningClosingProject
:toc: left
:toc-title:
:syntax: true

= 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-02-07, and needs to be reviewed.
