summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/options/ex/SortedConfigurableGroup.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/options/ex/SortedConfigurableGroup.java')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/options/ex/SortedConfigurableGroup.java195
1 files changed, 195 insertions, 0 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/SortedConfigurableGroup.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/SortedConfigurableGroup.java
new file mode 100644
index 000000000000..3d87b7679359
--- /dev/null
+++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/SortedConfigurableGroup.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.openapi.options.ex;
+
+import com.intellij.openapi.options.Configurable;
+import com.intellij.openapi.options.ConfigurableGroup;
+import com.intellij.openapi.options.OptionsBundle;
+import com.intellij.openapi.options.SearchableConfigurable;
+import com.intellij.openapi.util.text.StringUtil;
+import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+
+/**
+ * @author Sergey.Malenkov
+ */
+public final class SortedConfigurableGroup
+ extends SearchableConfigurable.Parent.Abstract
+ implements SearchableConfigurable, ConfigurableGroup, Configurable.NoScroll {
+
+ public static ConfigurableGroup getGroup(Configurable... configurables) {
+ SortedConfigurableGroup root = new SortedConfigurableGroup("root");
+ HashMap<String, SortedConfigurableGroup> map = new HashMap<String, SortedConfigurableGroup>();
+ map.put("root", root);
+ for (Configurable configurable : configurables) {
+ int weight = 0;
+ String groupId = null;
+ if (configurable instanceof ConfigurableWrapper) {
+ ConfigurableWrapper wrapper = (ConfigurableWrapper)configurable;
+ weight = wrapper.getExtensionPoint().groupWeight;
+ groupId = wrapper.getExtensionPoint().groupId;
+ }
+ SortedConfigurableGroup composite = map.get(groupId);
+ if (composite == null) {
+ composite = new SortedConfigurableGroup(groupId);
+ map.put(groupId, composite);
+ }
+ composite.add(weight, configurable);
+ }
+ // process supported groups
+ root.add(60, map.remove("appearance"));
+ root.add(50, map.remove("editor"));
+ root.add(40, map.remove("project"));
+ SortedConfigurableGroup build = map.remove("build");
+ if (build == null) {
+ build = map.remove("build.tools");
+ }
+ else {
+ build.add(1000, map.remove("build.tools"));
+ }
+ root.add(30, build);
+ root.add(20, map.remove("language"));
+ root.add(10, map.remove("tools"));
+ root.add(-10, map.remove(null));
+ // process unsupported groups
+ if (1 < map.size()) {
+ for (SortedConfigurableGroup group : map.values()) {
+ if (root != group) {
+ group.myDisplayName = "Category: " + group.myGroupId;
+ root.add(0, group);
+ }
+ }
+ }
+ return root;
+ }
+
+ private final ArrayList<WeightConfigurable> myList = new ArrayList<WeightConfigurable>();
+ private final String myGroupId;
+ private String myDisplayName;
+
+ private SortedConfigurableGroup(String groupId) {
+ myGroupId = groupId;
+ }
+
+ public SortedConfigurableGroup(Configurable... configurables) {
+ myGroupId = "root";
+ // create groups from configurations
+ HashMap<String, SortedConfigurableGroup> map = new HashMap<String, SortedConfigurableGroup>();
+ map.put(myGroupId, this);
+ for (Configurable configurable : configurables) {
+ int weight = 0;
+ String groupId = null;
+ if (configurable instanceof ConfigurableWrapper) {
+ ConfigurableWrapper wrapper = (ConfigurableWrapper)configurable;
+ weight = wrapper.getExtensionPoint().groupWeight;
+ groupId = wrapper.getExtensionPoint().groupId;
+ }
+ SortedConfigurableGroup composite = map.get(groupId);
+ if (composite == null) {
+ composite = new SortedConfigurableGroup(groupId);
+ map.put(groupId, composite);
+ }
+ composite.add(weight, configurable);
+ }
+ // process supported groups
+ add(60, map.remove("appearance"));
+ add(50, map.remove("editor"));
+ add(40, map.remove("project"));
+ SortedConfigurableGroup build = map.remove("build");
+ if (build == null) {
+ build = map.remove("build.tools");
+ }
+ else {
+ build.add(1000, map.remove("build.tools"));
+ }
+ add(30, build);
+ add(20, map.remove("language"));
+ add(10, map.remove("tools"));
+ add(-10, map.remove(null));
+ // process unsupported groups
+ if (1 < map.size()) {
+ for (SortedConfigurableGroup group : map.values()) {
+ if (this != group) {
+ group.myDisplayName = "Category: " + group.myGroupId;
+ add(0, group);
+ }
+ }
+ }
+ }
+
+ private void add(int weight, Configurable configurable) {
+ if (configurable != null) {
+ myList.add(new WeightConfigurable(configurable, weight));
+ }
+ }
+
+ @Override
+ protected Configurable[] buildConfigurables() {
+ Collections.sort(myList);
+ int length = myList.size();
+ Configurable[] result = new Configurable[length];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = myList.get(i).myConfigurable;
+ }
+ myList.clear();
+ return result;
+ }
+
+ @NotNull
+ @Override
+ public String getId() {
+ return "configurable.group." + myGroupId;
+ }
+
+ @Nullable
+ @Override
+ public String getHelpTopic() {
+ return "configurable.group." + myGroupId + ".help.topic";
+ }
+
+ @Nls
+ @Override
+ public String getDisplayName() {
+ return myDisplayName != null ? myDisplayName : OptionsBundle.message("configurable.group." + myGroupId + ".settings.display.name");
+ }
+
+ @Override
+ public String getShortName() {
+ return getDisplayName();
+ }
+
+ private static final class WeightConfigurable implements Comparable<WeightConfigurable> {
+ private final Configurable myConfigurable;
+ private final int myWeight;
+
+ private WeightConfigurable(@NotNull Configurable configurable, int weight) {
+ myConfigurable = configurable;
+ myWeight = weight;
+ }
+
+ @Override
+ public int compareTo(@NotNull WeightConfigurable pair) {
+ return myWeight > pair.myWeight ? -1 :
+ myWeight < pair.myWeight ? 1 :
+ StringUtil.naturalCompare(myConfigurable.getDisplayName(), pair.myConfigurable.getDisplayName());
+ }
+ }
+}