EditorOptions mapped to XML

This commit is contained in:
Dmitry Avdeev
2012-09-21 13:45:40 +04:00
parent 2a6abe716c
commit cdbe339f11
4 changed files with 67 additions and 53 deletions
@@ -17,27 +17,16 @@
package com.intellij.application.options.editor;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.options.*;
import com.intellij.openapi.options.ex.ConfigurableWrapper;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
public class EditorOptions implements SearchableConfigurable.Parent {
public class EditorOptions implements SearchableConfigurable {
@NonNls public static final String ID = "preferences.editor";
private EditorOptionsPanel myEditorOptionsPanel;
private Configurable[] myChildren;
@Override
public Configurable[] getConfigurables() {
if (myChildren == null) {
final List<EditorOptionsProvider> configurables = ConfigurableWrapper.createConfigurables(EditorOptionsProviderEP.EP_NAME);
myChildren = configurables.toArray(new EditorOptionsProvider[configurables.size()]);
}
return myChildren;
}
@Override
public String getDisplayName() {
@@ -60,16 +49,6 @@ public class EditorOptions implements SearchableConfigurable.Parent {
return null;
}
@Override
public boolean hasOwnContent() {
return true;
}
@Override
public boolean isVisible() {
return true;
}
@Override
public JComponent createComponent() {
myEditorOptionsPanel = new EditorOptionsPanel();
@@ -98,6 +77,5 @@ public class EditorOptions implements SearchableConfigurable.Parent {
@Override
public void disposeUIResources() {
myEditorOptionsPanel = null;
}
}
@@ -53,6 +53,7 @@ public class ConfigurableEP<T extends UnnamedConfigurable> extends AbstractExten
public String getDisplayName() {
if (displayName != null) return displayName;
LOG.assertTrue(bundle != null, "Bundle missed for " + this);
final ResourceBundle resourceBundle = AbstractBundle.getResourceBundle(bundle, myPluginDescriptor.getPluginClassLoader());
return displayName = CommonBundle.message(resourceBundle, key);
}
@@ -61,6 +62,12 @@ public class ConfigurableEP<T extends UnnamedConfigurable> extends AbstractExten
@AbstractCollection(surroundWithTag = false)
public ConfigurableEP[] children;
/**
* Extension point of ConfigurableEP type to calculate children
*/
@Attribute("childrenEPName")
public String childrenEPName;
public ConfigurableEP[] getChildren() {
for (ConfigurableEP child : children) {
child.myPicoContainer = myPicoContainer;
@@ -18,6 +18,7 @@ package com.intellij.openapi.options.ex;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.options.*;
import com.intellij.util.ArrayUtil;
import com.intellij.util.NullableFunction;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.Nls;
@@ -31,13 +32,24 @@ import java.util.List;
* @author Dmitry Avdeev
* Date: 9/17/12
*/
public class ConfigurableWrapper implements SearchableConfigurable, Configurable.Composite {
public class ConfigurableWrapper implements SearchableConfigurable {
private static final ConfigurableWrapper[] EMPTY_ARRAY = new ConfigurableWrapper[0];
private static final NullableFunction<ConfigurableEP<Configurable>,Configurable> CONFIGURABLE_FUNCTION = new NullableFunction<ConfigurableEP<Configurable>, Configurable>() {
@Override
public Configurable fun(ConfigurableEP<Configurable> ep) {
return wrapConfigurable(ep);
}
};
@Nullable
public static <T extends UnnamedConfigurable> T wrapConfigurable(ConfigurableEP<T> ep) {
return ep.displayName != null || ep.key != null ? (T)new ConfigurableWrapper(ep) : ep.createConfigurable();
if (ep.displayName != null || ep.key != null) {
return (T)(ep.children != null || ep.childrenEPName != null ? new CompositeWrapper(ep) : new ConfigurableWrapper(ep));
}
else {
return ep.createConfigurable();
}
}
public static <T extends UnnamedConfigurable> List<T> createConfigurables(ExtensionPointName<? extends ConfigurableEP<T>> name) {
@@ -60,17 +72,9 @@ public class ConfigurableWrapper implements SearchableConfigurable, Configurable
}
private final ConfigurableEP myEp;
private final ConfigurableWrapper[] myKids;
public ConfigurableWrapper(ConfigurableEP ep) {
myEp = ep;
myKids = ep.children == null ? EMPTY_ARRAY : ContainerUtil.mapNotNull(ep.getChildren(),
new NullableFunction<ConfigurableEP, ConfigurableWrapper>() {
@Override
public ConfigurableWrapper fun(ConfigurableEP ep) {
return ep.isAvailable() ? new ConfigurableWrapper(ep) : null;
}
}, new ConfigurableWrapper[0]);
}
private UnnamedConfigurable myConfigurable;
@@ -124,11 +128,6 @@ public class ConfigurableWrapper implements SearchableConfigurable, Configurable
getConfigurable().disposeUIResources();
}
@Override
public Configurable[] getConfigurables() {
return myKids;
}
@NotNull
@Override
public String getId() {
@@ -141,4 +140,36 @@ public class ConfigurableWrapper implements SearchableConfigurable, Configurable
final UnnamedConfigurable configurable = getConfigurable();
return configurable instanceof SearchableConfigurable ? ((SearchableConfigurable)configurable).enableSearch(option) : null;
}
private static class CompositeWrapper extends ConfigurableWrapper implements Configurable.Composite {
private final Configurable[] myKids;
public CompositeWrapper(ConfigurableEP ep) {
super(ep);
Configurable[] kids;
if (ep.children == null) {
kids = EMPTY_ARRAY;
}
else {
kids = ContainerUtil.mapNotNull(ep.getChildren(),
new NullableFunction<ConfigurableEP, ConfigurableWrapper>() {
@Override
public ConfigurableWrapper fun(ConfigurableEP ep) {
return ep.isAvailable() ? new ConfigurableWrapper(ep) : null;
}
}, EMPTY_ARRAY);
}
if (ep.childrenEPName != null) {
kids = ArrayUtil.mergeArrays(kids, ContainerUtil.mapNotNull(((ConfigurableEP<Configurable>[])Extensions.getExtensions(ep.childrenEPName)),
CONFIGURABLE_FUNCTION, new Configurable[0]));
}
myKids = kids;
}
@Override
public Configurable[] getConfigurables() {
return myKids;
}
}
}
@@ -341,15 +341,11 @@
serviceImplementation="com.intellij.codeInspection.ex.ProjectInspectionProfilesVisibleTreeState"/>
<!-- Editor -->
<applicationConfigurable instance="com.intellij.application.options.editor.EditorOptions" id="editor" order="after appearance"/>
<applicationConfigurable instance="com.intellij.application.options.editor.EditorOptions" id="editor" key="title.editor"
bundle="messages.ApplicationBundle" order="after appearance" childrenEPName="com.intellij.editorOptionsProvider"/>
<projectService serviceInterface="com.intellij.semantic.SemService" serviceImplementation="com.intellij.semantic.SemServiceImpl"/>
<!--
-->
<!-- Code Completion -->
<!-- Global Code Style -->
<projectConfigurable instance="com.intellij.application.options.CodeStyleSchemesConfigurable" order="after colors"/>
@@ -568,18 +564,20 @@
<codeInsight.linkHandler prefix="#navigation/" handlerClass="com.intellij.codeInsight.hint.NavigationLinkHandler"/>
<codeFoldingOptionsProvider instance="com.intellij.application.options.editor.BaseCodeFoldingOptionsProvider" order="first"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorSmartKeysConfigurable"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorAppearanceConfigurable"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorSmartKeysConfigurable" id="editor.preferences.smartKeys"
displayName="Smart Keys"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorAppearanceConfigurable" id="editor.preferences.appearance"
key="tab.editor.settings.appearance" bundle="messages.ApplicationBundle"/>
<editorCustomization implementation="com.intellij.ui.SoftWrapsEditorCustomization"/>
<editorCustomization implementation="com.intellij.ui.HorizontalScrollBarEditorCustomization"/>
<editorCustomization implementation="com.intellij.ui.AdditionalPageAtBottomEditorCustomization"/>
<editorCustomization implementation="com.intellij.ui.OneLineEditorCustomization"/>
<!-- Colors & Fonts-->
<editorOptionsProvider instance="com.intellij.application.options.colors.ColorAndFontOptions"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorTabsConfigurable"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.CodeFoldingConfigurable"/>
<editorOptionsProvider instance="com.intellij.application.options.CodeCompletionOptions"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.AutoImportOptionsConfigurable"/>
<editorOptionsProvider instance="com.intellij.application.options.colors.ColorAndFontOptions" id="reference.settingsdialog.IDE.editor.colors"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorTabsConfigurable" id="editor.preferences.tabs" displayName="Editor Tabs"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.CodeFoldingConfigurable" id="editor.preferences.folding" key="group.code.folding" bundle="messages.ApplicationBundle"/>
<editorOptionsProvider instance="com.intellij.application.options.CodeCompletionOptions" id="editor.preferences.completion" key="title.code.completion" bundle="messages.ApplicationBundle"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.AutoImportOptionsConfigurable" id="editor.preferences.import" key="auto.import" bundle="messages.ApplicationBundle"/>
<editorTabColorProvider implementation="com.intellij.ui.tabs.EditorTabColorProviderImpl"/>