EditorOptionsProvider extension reworked to create new instance each time when the Settings dialog is opened

This commit is contained in:
nik
2010-09-02 11:58:33 +04:00
parent a7e247f240
commit cb7fdcdc9a
11 changed files with 90 additions and 40 deletions
@@ -17,7 +17,6 @@
package com.intellij.codeInsight.daemon.impl.actions;
import com.intellij.application.options.editor.AutoImportOptionsConfigurable;
import com.intellij.application.options.editor.EditorOptionsProvider;
import com.intellij.application.options.editor.JavaAutoImportOptions;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.CodeInsightUtilBase;
@@ -34,7 +33,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.PopupStep;
import com.intellij.openapi.ui.popup.util.BaseListPopupStep;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
@@ -157,7 +155,7 @@ public class AddImportAction implements QuestionAction {
public void run() {
if (project.isDisposed()) return;
final AutoImportOptionsConfigurable configurable = EditorOptionsProvider.EP_NAME.findExtension(AutoImportOptionsConfigurable.class);
final AutoImportOptionsConfigurable configurable = new AutoImportOptionsConfigurable();
ShowSettingsUtil.getInstance().editConfigurable(project, configurable, new Runnable() {
public void run() {
final JavaAutoImportOptions options = ContainerUtil.findInstance(configurable.getConfigurables(), JavaAutoImportOptions.class);
@@ -18,6 +18,7 @@ package com.intellij.application.options.colors;
import com.intellij.application.options.OptionsContainingConfigurable;
import com.intellij.application.options.editor.EditorOptionsProvider;
import com.intellij.application.options.editor.EditorOptionsProviderEP;
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl;
import com.intellij.openapi.Disposable;
@@ -35,6 +36,7 @@ import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl;
import com.intellij.openapi.editor.colors.impl.ReadOnlyColorsScheme;
import com.intellij.openapi.editor.markup.EffectType;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.ExternalizableScheme;
@@ -89,6 +91,17 @@ public class ColorAndFontOptions extends SearchableConfigurable.Parent.Abstract
private boolean myDisposeCompleted = false;
private final Disposable myDisposable = Disposer.newDisposable();
public static ColorAndFontOptions getColorAndFontsInstance() {
ColorAndFontOptions colorAndFontOptions = null;
for (EditorOptionsProviderEP provider : Extensions.getExtensions(EditorOptionsProviderEP.EP_NAME)) {
if (ColorAndFontOptions.class.getName().equals(provider.implementationClass)) {
colorAndFontOptions = (ColorAndFontOptions)provider.createConfigurable();
break;
}
}
return colorAndFontOptions;
}
public boolean isModified() {
boolean listModified = isSchemeListModified();
boolean schemeModified = isSomeSchemeModified();
@@ -17,7 +17,7 @@
package com.intellij.application.options.editor;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.options.AbstractConfigurableEP;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
@@ -25,19 +25,19 @@ import com.intellij.openapi.util.IconLoader;
import org.jetbrains.annotations.NonNls;
import javax.swing.*;
import java.util.List;
public class EditorOptions implements SearchableConfigurable.Parent {
@NonNls public static final String ID = "preferences.editor";
private EditorOptionsPanel myEditorOptionsPanel;
private Configurable[] myChildren;
public Configurable[] getConfigurables() {
return getOptionsConfigurables();
}
public static EditorOptionsProvider[] getOptionsConfigurables() {
return Extensions.getExtensions(EditorOptionsProvider.EP_NAME);
if (myChildren == null) {
final List<EditorOptionsProvider> configurables = AbstractConfigurableEP.createConfigurables(EditorOptionsProviderEP.EP_NAME);
myChildren = configurables.toArray(new EditorOptionsProvider[configurables.size()]);
}
return myChildren;
}
public String getDisplayName() {
@@ -20,9 +20,7 @@
*/
package com.intellij.application.options.editor;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.options.SearchableConfigurable;
public interface EditorOptionsProvider extends SearchableConfigurable {
ExtensionPointName<EditorOptionsProvider> EP_NAME = ExtensionPointName.create("com.intellij.editorOptionsProvider");
}
@@ -0,0 +1,26 @@
/*
* Copyright 2000-2010 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.application.options.editor;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.options.AbstractConfigurableEP;
/**
* @author nik
*/
public class EditorOptionsProviderEP extends AbstractConfigurableEP<EditorOptionsProvider> {
public static final ExtensionPointName<EditorOptionsProviderEP> EP_NAME = ExtensionPointName.create("com.intellij.editorOptionsProvider");
}
@@ -17,11 +17,9 @@
package com.intellij.codeInsight.intention.impl;
import com.intellij.application.options.editor.CodeFoldingConfigurable;
import com.intellij.application.options.editor.EditorOptions;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
@@ -47,12 +45,7 @@ public class EditFoldingOptionsAction implements IntentionAction {
}
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
for (Configurable c : EditorOptions.getOptionsConfigurables()) {
if (c instanceof CodeFoldingConfigurable) {
ShowSettingsUtil.getInstance().editConfigurable(project, c);
break;
}
}
ShowSettingsUtil.getInstance().editConfigurable(project, new CodeFoldingConfigurable());
}
public boolean startInWriteAction() {
@@ -20,7 +20,6 @@ import com.intellij.application.options.colors.ColorAndFontDescriptionPanel;
import com.intellij.application.options.colors.ColorAndFontOptions;
import com.intellij.application.options.colors.InspectionColorSettingsPage;
import com.intellij.application.options.colors.TextAttributesDescription;
import com.intellij.application.options.editor.EditorOptionsProvider;
import com.intellij.codeInsight.daemon.impl.HighlightInfoType;
import com.intellij.codeInsight.daemon.impl.SeverityRegistrar;
import com.intellij.codeInspection.InspectionsBundle;
@@ -34,7 +33,6 @@ import com.intellij.openapi.editor.colors.CodeInsightColors;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.options.newEditor.OptionsEditor;
@@ -122,13 +120,7 @@ public class SeverityEditorDialog extends DialogWrapper {
final String toConfigure = getSelectedType().getSeverity(null).myName;
doOKAction();
myOptionsList.clearSelection();
ColorAndFontOptions colorAndFontOptions = null;
for (EditorOptionsProvider provider : Extensions.getExtensions(EditorOptionsProvider.EP_NAME)) {
if (provider.getClass().isAssignableFrom(ColorAndFontOptions.class)) {
colorAndFontOptions = (ColorAndFontOptions)provider;
break;
}
}
ColorAndFontOptions colorAndFontOptions = ColorAndFontOptions.getColorAndFontsInstance();
assert colorAndFontOptions != null;
final SearchableConfigurable javaPage = colorAndFontOptions.findSubConfigurable(InspectionColorSettingsPage.class);
LOG.assertTrue(javaPage != null);
@@ -15,11 +15,13 @@
*/
package com.intellij.openapi.options;
import com.intellij.openapi.options.AbstractConfigurableEP;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.module.Module;
/**
* @author nik
*/
public class ModuleConfigurableEP extends AbstractConfigurableEP<Configurable> {
public ModuleConfigurableEP(Module module) {
super(module.getPicoContainer());
}
}
@@ -18,6 +18,7 @@ package com.intellij.openapi.options;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.extensions.AbstractExtensionPointBean;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.util.AtomicNotNullLazyValue;
import com.intellij.util.xmlb.annotations.Attribute;
import org.jetbrains.annotations.NotNull;
import org.picocontainer.PicoContainer;
@@ -31,7 +32,34 @@ import java.util.List;
public class AbstractConfigurableEP<T extends UnnamedConfigurable> extends AbstractExtensionPointBean {
@Attribute("instance")
public String instanceClass;
/**
* @deprecated
*/
@Attribute("implementation")
public String implementationClass;
private final PicoContainer myPicoContainer;
private final AtomicNotNullLazyValue<T> myImplementation = new AtomicNotNullLazyValue<T>() {
@NotNull
@Override
protected T compute() {
if (implementationClass == null) {
throw new IllegalArgumentException("Neither 'instance' nor 'implementation' attribute is not specified for " + AbstractConfigurableEP.this.getClass() + " extension");
}
try {
final Class<T> aClass = findClass(implementationClass);
return instantiate(aClass, myPicoContainer, true);
}
catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
};
protected AbstractConfigurableEP(PicoContainer picoContainer) {
myPicoContainer = picoContainer;
}
public AbstractConfigurableEP() {
myPicoContainer = ApplicationManager.getApplication().getPicoContainer();
@@ -40,7 +68,7 @@ public class AbstractConfigurableEP<T extends UnnamedConfigurable> extends Abstr
@NotNull
public T createConfigurable() {
if (instanceClass == null) {
throw new IllegalArgumentException("'instance' attribute isn't specified for " + getClass().getName() + " extension");
return myImplementation.getValue();
}
try {
final Class<T> aClass = findClass(instanceClass);
@@ -308,7 +308,7 @@
interface="com.intellij.openapi.options.colors.ColorSettingsPage"/>
<extensionPoint name="codeInsight.parameterInfo" beanClass="com.intellij.lang.LanguageExtensionPoint"/>
<extensionPoint name="editorOptionsProvider" interface="com.intellij.application.options.editor.EditorOptionsProvider"/>
<extensionPoint name="editorOptionsProvider" beanClass="com.intellij.application.options.editor.EditorOptionsProviderEP"/>
<extensionPoint name="fileTypeIndentOptionsProvider" interface="com.intellij.psi.codeStyle.FileTypeIndentOptionsProvider"/>
<extensionPoint name="referenceImporter" interface="com.intellij.codeInsight.daemon.ReferenceImporter"/>
<extensionPoint name="elementLookupRenderer" interface="com.intellij.codeInsight.lookup.impl.ElementLookupRenderer"/>
@@ -432,15 +432,15 @@
<codeInsight.linkHandler prefix="#navigation/" handlerClass="com.intellij.codeInsight.hint.NavigationLinkHandler"/>
<codeFoldingOptionsProvider instance="com.intellij.application.options.editor.BaseCodeFoldingOptionsProvider" order="first"/>
<editorOptionsProvider implementation="com.intellij.application.options.editor.EditorSmartKeysConfigurable"/>
<editorOptionsProvider implementation="com.intellij.application.options.editor.EditorAppearanceConfigurable"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorSmartKeysConfigurable"/>
<editorOptionsProvider instance="com.intellij.application.options.editor.EditorAppearanceConfigurable"/>
<editorCustomization implementation="com.intellij.ui.SoftWrapsEditorCustomization"/>
<!-- Colors & Fonts-->
<editorOptionsProvider implementation="com.intellij.application.options.colors.ColorAndFontOptions"/>
<editorOptionsProvider implementation="com.intellij.application.options.editor.EditorTabsConfigurable"/>
<editorOptionsProvider implementation="com.intellij.application.options.editor.CodeFoldingConfigurable"/>
<editorOptionsProvider implementation="com.intellij.application.options.CodeCompletionOptions"/>
<editorOptionsProvider implementation="com.intellij.application.options.editor.AutoImportOptionsConfigurable"/>
<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"/>
<editorTabColorProvider implementation="com.intellij.ui.tabs.EditorTabColorProviderImpl"/>