2 * Copyright 2000-2007 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com
.intellij
.psi
.search
.scope
.packageSet
;
18 import com
.intellij
.openapi
.components
.PersistentStateComponent
;
19 import com
.intellij
.openapi
.project
.Project
;
20 import com
.intellij
.packageDependencies
.DependencyValidationManager
;
21 import org
.jdom
.Element
;
22 import org
.jetbrains
.annotations
.NonNls
;
23 import org
.jetbrains
.annotations
.NotNull
;
24 import org
.jetbrains
.annotations
.Nullable
;
27 import java
.util
.ArrayList
;
28 import java
.util
.Arrays
;
29 import java
.util
.Collections
;
30 import java
.util
.List
;
32 public abstract class NamedScopesHolder
implements PersistentStateComponent
<Element
> {
33 private List
<NamedScope
> myScopes
= new ArrayList
<NamedScope
>();
34 @NonNls private static final String SCOPE_TAG
= "scope";
35 @NonNls private static final String NAME_ATT
= "name";
36 @NonNls private static final String PATTERN_ATT
= "pattern";
38 public abstract String
getDisplayName();
39 public abstract Icon
getIcon();
41 public static interface ScopeListener
{
44 private List
<ScopeListener
> myScopeListeners
;
45 public synchronized void addScopeListener(ScopeListener scopeListener
) {
46 if (myScopeListeners
== null) {
47 myScopeListeners
= new ArrayList
<ScopeListener
>();
49 myScopeListeners
.add(scopeListener
);
51 public synchronized void removeScopeListener(ScopeListener scopeListener
) {
52 myScopeListeners
.remove(scopeListener
);
55 public synchronized void fireScopeListeners() {
56 if (myScopeListeners
!= null) {
57 for (ScopeListener listener
: myScopeListeners
) {
58 listener
.scopesChanged();
63 @NotNull public NamedScope
[] getScopes() {
64 final List
<NamedScope
> scopes
= new ArrayList
<NamedScope
>();
65 List
<NamedScope
> list
= getPredefinedScopes();
67 scopes
.addAll(myScopes
);
68 return scopes
.toArray(new NamedScope
[scopes
.size()]);
71 public NamedScope
[] getEditableScopes(){
72 return myScopes
.toArray(new NamedScope
[myScopes
.size()]);
75 public void removeAllSets() {
80 public void setScopes(NamedScope
[] scopes
) {
81 myScopes
= new ArrayList
<NamedScope
>(Arrays
.asList(scopes
));
85 public void addScope(NamedScope scope
) {
91 public static NamedScope
getScope(final Project project
, final String scopeName
) {
92 final NamedScopesHolder
[] holders
= getAllNamedScopeHolders(project
);
93 for (NamedScopesHolder holder
: holders
) {
94 final NamedScope scope
= holder
.getScope(scopeName
);
102 public static NamedScopesHolder
[] getAllNamedScopeHolders(final Project project
) {
103 NamedScopesHolder
[] holders
= new NamedScopesHolder
[2];
104 holders
[0] = NamedScopeManager
.getInstance(project
);
105 holders
[1] = DependencyValidationManager
.getInstance(project
);
110 public static NamedScopesHolder
getHolder(final Project project
, final String scopeName
, final NamedScopesHolder defaultHolder
) {
111 final NamedScopesHolder
[] holders
= getAllNamedScopeHolders(project
);
112 for (NamedScopesHolder holder
: holders
) {
113 final NamedScope scope
= holder
.getScope(scopeName
);
118 return defaultHolder
;
121 private static Element
writeScope(NamedScope scope
) {
122 Element setElement
= new Element(SCOPE_TAG
);
123 setElement
.setAttribute(NAME_ATT
, scope
.getName());
124 final PackageSet packageSet
= scope
.getValue();
125 setElement
.setAttribute(PATTERN_ATT
, packageSet
!= null ? packageSet
.getText() : "");
129 private static NamedScope
readScope(Element setElement
){
130 String name
= setElement
.getAttributeValue(NAME_ATT
);
131 PackageSet set
= null;
133 set
= PackageSetFactory
.getInstance().compile(setElement
.getAttributeValue(PATTERN_ATT
));
135 catch (ParsingException e
) {
138 return new NamedScope(name
, set
);
141 public void loadState(final Element state
) {
142 List sets
= state
.getChildren(SCOPE_TAG
);
143 for (Object set
: sets
) {
144 addScope(readScope((Element
)set
));
146 fireScopeListeners();
149 public Element
getState() {
150 Element element
= new Element("state");
151 for (NamedScope myScope
: myScopes
) {
152 element
.addContent(writeScope(myScope
));
158 public NamedScope
getScope(@Nullable String name
) {
159 if (name
== null) return null;
160 for (NamedScope scope
: myScopes
) {
161 if (name
.equals(scope
.getName())) return scope
;
163 final List
<NamedScope
> predefinedScopes
= getPredefinedScopes();
164 for (NamedScope scope
: predefinedScopes
) {
165 if (name
.equals(scope
.getName())) return scope
;
171 public List
<NamedScope
> getPredefinedScopes(){
172 return Collections
.emptyList();