IDEA-253069 don't show diff editors in the Reader Mode
[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.NlsSafe;
25 import com.intellij.openapi.util.UserDataHolder;
26 import com.intellij.openapi.util.UserDataHolderBase;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29
30 /**
31  * Represents a specific instance of facet
32  *
33  * @see FacetType
34  */
35 public class Facet<C extends FacetConfiguration> extends UserDataHolderBase implements UserDataHolder, Disposable, ProjectModelElement {
36   public static final Facet[] EMPTY_ARRAY = new Facet[0];
37   @NotNull private final FacetType myFacetType;
38   @NotNull private final Module myModule;
39   @NotNull private final C myConfiguration;
40   private final Facet myUnderlyingFacet;
41   private @NlsSafe String myName;
42   private boolean isDisposed;
43   private ProjectModelExternalSource myExternalSource;
44
45   public Facet(@NotNull final FacetType facetType,
46                @NotNull final Module module,
47                @NotNull final @NlsSafe String name,
48                @NotNull final C configuration,
49                Facet underlyingFacet) {
50     myName = name;
51     myFacetType = facetType;
52     myModule = module;
53     myConfiguration = configuration;
54     myUnderlyingFacet = underlyingFacet;
55     Disposer.register(myModule, this);
56   }
57
58   @NotNull
59   public final FacetType getType() {
60     return myFacetType;
61   }
62
63   public final FacetTypeId getTypeId() {
64     return myFacetType.getId();
65   }
66
67   public final Facet getUnderlyingFacet() {
68     return myUnderlyingFacet;
69   }
70
71   @NotNull
72   public final C getConfiguration() {
73     return myConfiguration;
74   }
75
76   @NotNull
77   public final Module getModule() {
78     return myModule;
79   }
80
81   public boolean isDisposed() {
82     return isDisposed;
83   }
84
85   /**
86    * Called when the module containing this facet is initialized
87    */
88   public void initFacet() {
89   }
90
91   /**
92    * Called when the module containing this facet is disposed
93    */
94   public void disposeFacet() {
95   }
96
97   @Override
98   public final void dispose() {
99     assert !isDisposed;
100     isDisposed = true;
101     disposeFacet();
102   }
103
104   public final int hashCode() {
105     return super.hashCode();
106   }
107
108   public final boolean equals(Object obj) {
109     return super.equals(obj);
110   }
111
112   @NotNull
113   public final @NlsSafe String getName() {
114     return myName;
115   }
116
117   /**
118    * Use {@link ModifiableFacetModel#rename} to rename facets
119    */
120   final void setName(@NotNull final @NlsSafe String name) {
121     myName = name;
122   }
123
124   @Nullable
125   @Override
126   public ProjectModelExternalSource getExternalSource() {
127     return myExternalSource;
128   }
129
130   void setExternalSource(ProjectModelExternalSource externalSource) {
131     myExternalSource = externalSource;
132   }
133
134   @Override
135   public String toString() {
136     return getName() + " (" + getModule().getName() + ")";
137   }
138 }