f1411cf3551d0b7d9a81f2a695ff75709e90f76b
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / options / ex / MixedConfigurableGroup.java
1 /*
2  * Copyright 2000-2014 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.Configurable;
19 import com.intellij.openapi.options.ConfigurableGroup;
20 import com.intellij.openapi.options.OptionsBundle;
21 import com.intellij.openapi.options.SearchableConfigurable;
22
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.Iterator;
26 import java.util.Map.Entry;
27
28 public final class MixedConfigurableGroup implements ConfigurableGroup {
29   private final String myGroupId;
30   private Configurable[] myConfigurables;
31
32   private MixedConfigurableGroup(String groupId, ArrayList<Configurable> configurables) {
33     myGroupId = groupId;
34     myConfigurables = (configurables != null)
35                       ? configurables.toArray(new Configurable[configurables.size()])
36                       : new Configurable[0];
37   }
38
39   private MixedConfigurableGroup(String groupId, HashMap<String, ArrayList<Configurable>> configurables) {
40     this(groupId, configurables.remove(groupId));
41   }
42
43   @Override
44   public String getDisplayName() {
45     return OptionsBundle.message("configurable.group." + myGroupId + ".settings.display.name");
46   }
47
48   @Override
49   public String getShortName() {
50     return getDisplayName();
51   }
52
53   @Override
54   public Configurable[] getConfigurables() {
55     return myConfigurables;
56   }
57
58   public static ConfigurableGroup[] getGroups(Configurable... configurables) {
59     HashMap<String, ArrayList<Configurable>> map = new HashMap<String, ArrayList<Configurable>>();
60     for (Configurable configurable : configurables) {
61       String groupId = null;
62       if (configurable instanceof ConfigurableWrapper) {
63         groupId = ((ConfigurableWrapper)configurable).getGroupId();
64       }
65       ArrayList<Configurable> list = map.get(groupId);
66       if (list == null) {
67         map.put(groupId, list = new ArrayList<Configurable>());
68       }
69       list.add(configurable);
70     }
71     ArrayList<Configurable> buildList = map.get("build");
72     if (buildList != null) {
73       NodeConfigurable buildTools = new NodeConfigurable("build.tools");
74       buildTools.add(find("MavenSettings", buildList.iterator()));
75       buildTools.add(find("reference.settingsdialog.project.gradle", buildList.iterator()));
76       buildTools.add(find("reference.settingsdialog.project.gant", buildList.iterator()));
77       if (buildTools.getConfigurables() != null) {
78         buildList.add(0, buildTools);
79       }
80     }
81     ArrayList<ConfigurableGroup> groups = new ArrayList<ConfigurableGroup>(map.size());
82     groups.add(new MixedConfigurableGroup("appearance", map));
83     groups.add(new MixedConfigurableGroup("editor", map));
84     groups.add(new MixedConfigurableGroup("project", map));
85     groups.add(new MixedConfigurableGroup("build", map));
86     groups.add(new MixedConfigurableGroup("language", map));
87     groups.add(new MixedConfigurableGroup("tools", map));
88     ConfigurableGroup other = new MixedConfigurableGroup(null, map);
89     for(Entry<String, ArrayList<Configurable>>entry: map.entrySet()){
90       groups.add(new MixedConfigurableGroup(entry.getKey(), entry.getValue()));
91     }
92     groups.add(other);
93     return groups.toArray(new ConfigurableGroup[groups.size()]);
94   }
95
96   private static Configurable find(String id, Iterator<Configurable> iterator) {
97     while (iterator.hasNext()) {
98       Configurable configurable = iterator.next();
99       if (configurable instanceof SearchableConfigurable) {
100         SearchableConfigurable sc = (SearchableConfigurable)configurable;
101         if (id.equals(sc.getId())) {
102           iterator.remove();
103           return configurable;
104         }
105       }
106     }
107     return null;
108   }
109 }