'Show project structure' actions moved to idea-ui module
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / options / ex / ProjectConfigurablesGroup.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 package com.intellij.openapi.options.ex;
17
18 import com.intellij.openapi.options.*;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.util.containers.ContainerUtil;
21
22 import java.util.ArrayList;
23 import java.util.Iterator;
24 import java.util.List;
25
26 /**
27  * @author max
28  */
29 public class ProjectConfigurablesGroup implements ConfigurableGroup {
30   private Project myProject;
31   private boolean myIncludeProjectStructure;
32   private static final String PROJECT_STRUCTURE_CLASS_FQ_NAME = "com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable";
33
34   public ProjectConfigurablesGroup(Project project) {
35     this(project, true);
36   }
37
38   public ProjectConfigurablesGroup(Project project, boolean includeProjectStructure) {
39     myProject = project;
40     myIncludeProjectStructure = includeProjectStructure;
41   }
42
43   public String getDisplayName() {
44     if (isDefault()) return OptionsBundle.message("template.project.settings.display.name");
45     return OptionsBundle.message("project.settings.display.name", myProject.getName());
46   }
47
48   public String getShortName() {
49     return isDefault() ? OptionsBundle.message("template.project.settings.short.name") : OptionsBundle
50       .message("project.settings.short.name");
51   }
52
53   private boolean isDefault() {
54     return myProject.isDefault();
55   }
56
57   public Configurable[] getConfigurables() {
58     return getConfigurables(myProject, new ConfigurableFilter() {
59       public boolean isIncluded(final Configurable configurable) {
60         if (isDefault() && configurable instanceof NonDefaultProjectConfigurable) return false;
61         if (configurable instanceof Configurable.Assistant) return false;
62         if (configurable instanceof OptionalConfigurable && !((OptionalConfigurable) configurable).needDisplay()) return false;
63         if (!myIncludeProjectStructure && PROJECT_STRUCTURE_CLASS_FQ_NAME.equals(configurable.getClass().getName())) return false;
64         return true;
65       }
66     });
67   }
68
69   private static Configurable[] getConfigurables(Project project, final ConfigurableFilter filter) {
70     final Configurable[] extensions = project.getExtensions(Configurable.PROJECT_CONFIGURABLES);
71     Configurable[] components = project.getComponents(Configurable.class);
72     List<Configurable> result = buildConfigurablesList(extensions, components, filter);
73
74     return result.toArray(new Configurable[result.size()]);
75   }
76
77   static List<Configurable> buildConfigurablesList(final Configurable[] extensions, final Configurable[] components, ConfigurableFilter filter) {
78     List<Configurable> result = new ArrayList<Configurable>();
79     ContainerUtil.addAll(result, extensions);
80     ContainerUtil.addAll(result, components);
81
82     final Iterator<Configurable> iterator = result.iterator();
83     while (iterator.hasNext()) {
84       Configurable each = iterator.next();
85       if (!filter.isIncluded(each)) {
86         iterator.remove();
87       }
88     }
89
90     return result;
91   }
92
93   public int hashCode() {
94     return 0;
95   }
96
97   public boolean equals(Object object) {
98     return object instanceof ProjectConfigurablesGroup && ((ProjectConfigurablesGroup)object).myProject == myProject;
99   }
100
101
102 }