IDEA-230715: another way to allow expand/collapse
[idea/community.git] / platform / lang-api / src / com / intellij / facet / Facet.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.facet;
18
19 import com.intellij.openapi.Disposable;
20 import com.intellij.openapi.module.Module;
21 import com.intellij.openapi.roots.ProjectModelElement;
22 import com.intellij.openapi.roots.ProjectModelExternalSource;
23 import com.intellij.openapi.util.Disposer;
24 import com.intellij.openapi.util.UserDataHolder;
25 import com.intellij.openapi.util.UserDataHolderBase;
26 import org.jetbrains.annotations.NotNull;
27 import org.jetbrains.annotations.Nullable;
28
29 /**
30  * Represents a specific instance of facet
31  *
32  * @see FacetType
33  */
34 public class Facet<C extends FacetConfiguration> extends UserDataHolderBase implements UserDataHolder, Disposable, ProjectModelElement {
35   public static final Facet[] EMPTY_ARRAY = new Facet[0];
36   @NotNull private final FacetType myFacetType;
37   @NotNull private final Module myModule;
38   @NotNull private final C myConfiguration;
39   private final Facet myUnderlyingFacet;
40   private String myName;
41   private boolean isDisposed;
42   private ProjectModelExternalSource myExternalSource;
43
44   public Facet(@NotNull final FacetType facetType, @NotNull final Module module, @NotNull final String name, @NotNull final C configuration, Facet underlyingFacet) {
45     myName = name;
46     myFacetType = facetType;
47     myModule = module;
48     myConfiguration = configuration;
49     myUnderlyingFacet = underlyingFacet;
50     Disposer.register(myModule, this);
51   }
52
53   @NotNull
54   public final FacetType getType() {
55     return myFacetType;
56   }
57
58   public final FacetTypeId getTypeId() {
59     return myFacetType.getId();
60   }
61
62   public final Facet getUnderlyingFacet() {
63     return myUnderlyingFacet;
64   }
65
66   @NotNull
67   public final C getConfiguration() {
68     return myConfiguration;
69   }
70
71   @NotNull
72   public final Module getModule() {
73     return myModule;
74   }
75
76   public boolean isDisposed() {
77     return isDisposed;
78   }
79
80   /**
81    * Called when the module containing this facet is initialized
82    */
83   public void initFacet() {
84   }
85
86   /**
87    * Called when the module containing this facet is disposed
88    */
89   public void disposeFacet() {
90   }
91
92   @Override
93   public final void dispose() {
94     assert !isDisposed;
95     isDisposed = true;
96     disposeFacet();
97   }
98
99   public final int hashCode() {
100     return super.hashCode();
101   }
102
103   public final boolean equals(Object obj) {
104     return super.equals(obj);
105   }
106
107   @NotNull
108   public final String getName() {
109     return myName;
110   }
111
112   /**
113    * Use {@link ModifiableFacetModel#rename} to rename facets
114    */
115   final void setName(@NotNull final String name) {
116     myName = name;
117   }
118
119   @Nullable
120   @Override
121   public ProjectModelExternalSource getExternalSource() {
122     return myExternalSource;
123   }
124
125   void setExternalSource(ProjectModelExternalSource externalSource) {
126     myExternalSource = externalSource;
127   }
128
129   @Override
130   public String toString() {
131     return getName() + " (" + getModule().getName() + ")";
132   }
133 }