Add data provider to search settings and to select them in editor.

This commit is contained in:
Sergey Malenkov
2014-09-12 19:45:04 +04:00
parent 771b77c72f
commit bf4516ec43
9 changed files with 124 additions and 42 deletions
@@ -20,8 +20,7 @@ import com.intellij.ide.DataManager;
import com.intellij.ide.util.scopeChooser.EditScopesDialog;
import com.intellij.ide.util.scopeChooser.ScopeChooserConfigurable;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.newEditor.OptionsEditor;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import org.jetbrains.annotations.NotNull;
@@ -75,11 +74,10 @@ class ScopeColorsPageFactory implements ColorAndFontPanelFactory {
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
final OptionsEditor optionsEditor = OptionsEditor.KEY.getData(DataManager.getInstance().getDataContext());
if (optionsEditor != null) {
Settings settings = Settings.KEY.getData(DataManager.getInstance().getDataContext());
if (settings != null) {
try {
Configurable configurable = optionsEditor.findConfigurableById(ScopeChooserConfigurable.PROJECT_SCOPES);
if (configurable == null || optionsEditor.clearSearchAndSelect(configurable).isRejected()) {
if (settings.select(settings.find(ScopeChooserConfigurable.PROJECT_SCOPES)).isRejected()) {
EditScopesDialog.showDialog(project, null);
}
} catch (IllegalStateException ex) {
@@ -37,8 +37,7 @@ import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.options.ex.ConfigurableWrapper;
import com.intellij.openapi.options.newEditor.OptionsEditor;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.InputValidator;
import com.intellij.openapi.ui.Messages;
@@ -230,14 +229,13 @@ public class SeverityEditorDialog extends DialogWrapper {
doOKAction();
myOptionsList.clearSelection();
final DataContext dataContext = DataManager.getInstance().getDataContext(myPanel);
final OptionsEditor optionsEditor = OptionsEditor.KEY.getData(dataContext);
if (optionsEditor != null) {
final ColorAndFontOptions colorAndFontOptions =
(ColorAndFontOptions)((ConfigurableWrapper)optionsEditor.findConfigurableById(ColorAndFontOptions.ID)).getConfigurable();
Settings settings = Settings.KEY.getData(dataContext);
if (settings != null) {
ColorAndFontOptions colorAndFontOptions = settings.find(ColorAndFontOptions.class);
assert colorAndFontOptions != null;
final SearchableConfigurable javaPage = colorAndFontOptions.findSubConfigurable(InspectionColorSettingsPage.class);
LOG.assertTrue(javaPage != null);
optionsEditor.clearSearchAndSelect(javaPage).doWhenDone(new Runnable() {
settings.select(javaPage).doWhenDone(new Runnable() {
@Override
public void run() {
final Runnable runnable = javaPage.enableSearch(toConfigure);
@@ -0,0 +1,81 @@
/*
* 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.actionSystem.DataKey;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurableGroup;
import com.intellij.openapi.options.UnnamedConfigurable;
import com.intellij.openapi.util.ActionCallback;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.IdentityHashMap;
/**
* @author Sergey.Malenkov
*/
public abstract class Settings {
public static final DataKey<Settings> KEY = DataKey.create("settings.editor");
private final ConfigurableGroup[] myGroups;
private final IdentityHashMap<UnnamedConfigurable, ConfigurableWrapper>
myMap = new IdentityHashMap<UnnamedConfigurable, ConfigurableWrapper>();
protected Settings(@NotNull ConfigurableGroup... groups) {
myGroups = groups;
}
@Nullable
public final <T extends Configurable> T find(@NotNull Class<T> type) {
Configurable configurable = new ConfigurableVisitor.ByType(type).find(myGroups);
if (type.isInstance(configurable)) {
return type.cast(configurable);
}
return unwrap(configurable, type);
}
@Nullable
public final Configurable find(@NotNull String id) {
Configurable configurable = new ConfigurableVisitor.ByID(id).find(myGroups);
return choose(configurable, unwrap(configurable, Configurable.class));
}
@NotNull
public final ActionCallback select(Configurable configurable) {
return configurable != null
? selectImpl(choose(configurable, myMap.get(configurable)))
: new ActionCallback.Rejected();
}
protected abstract ActionCallback selectImpl(Configurable configurable);
private <T extends Configurable> T unwrap(Configurable configurable, Class<T> type) {
if (configurable instanceof ConfigurableWrapper) {
ConfigurableWrapper wrapper = (ConfigurableWrapper)configurable;
UnnamedConfigurable unnamed = wrapper.getConfigurable();
if (type.isInstance(unnamed)) {
myMap.put(unnamed, wrapper);
return type.cast(unnamed);
}
}
return null;
}
private static Configurable choose(Configurable configurable, Configurable variant) {
return variant != null ? variant : configurable;
}
}
@@ -33,6 +33,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.options.*;
import com.intellij.openapi.options.ex.ConfigurableWrapper;
import com.intellij.openapi.options.ex.GlassPanel;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.*;
import com.intellij.openapi.util.ActionCallback;
@@ -143,9 +144,18 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat
}
};
final Settings mySettings;
public OptionsEditor(Project project, ConfigurableGroup[] groups, Configurable preselectedConfigurable) {
myProperties = PropertiesComponent.getInstance(project);
mySettings = new Settings(groups) {
@Override
protected ActionCallback selectImpl(Configurable configurable) {
return OptionsEditor.this.select(configurable, "");
}
};
mySearch = new MySearchField() {
@Override
protected void onTextKeyEvent(final KeyEvent e) {
@@ -844,6 +854,9 @@ public class OptionsEditor extends JPanel implements DataProvider, Place.Navigat
@Override
public Object getData(@NonNls final String dataId) {
if (Settings.KEY.is(dataId)) {
return mySettings;
}
if (KEY.is(dataId)) {
return this;
}
@@ -25,6 +25,7 @@ import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurableGroup;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.ActionCallback;
@@ -278,6 +279,9 @@ public class OptionsEditorDialog extends DialogWrapper implements DataProvider{
}
public Object getData(@NonNls String dataId) {
if (Settings.KEY.is(dataId)) {
return myEditor.mySettings;
}
if (OptionsEditor.KEY.is(dataId)) {
return myEditor;
}
@@ -19,8 +19,7 @@ import com.intellij.ide.DataManager;
import com.intellij.ide.util.scopeChooser.ScopeChooserConfigurable;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.options.newEditor.OptionsEditor;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.util.Comparing;
@@ -95,12 +94,9 @@ class VcsUpdateInfoScopeFilterConfigurable implements Configurable, NamedScopesH
panel.add(new LinkLabel("Manage Scopes", null, new LinkListener() {
@Override
public void linkSelected(LinkLabel aSource, Object aLinkData) {
OptionsEditor optionsEditor = OptionsEditor.KEY.getData(DataManager.getInstance().getDataContext(panel));
if (optionsEditor != null) {
SearchableConfigurable configurable = optionsEditor.findConfigurableById(ScopeChooserConfigurable.PROJECT_SCOPES);
if (configurable != null) {
optionsEditor.select(configurable);
}
Settings settings = Settings.KEY.getData(DataManager.getInstance().getDataContext(panel));
if (settings != null) {
settings.select(settings.find(ScopeChooserConfigurable.PROJECT_SCOPES));
}
}
}));
@@ -19,8 +19,7 @@ import com.intellij.ide.DataManager;
import com.intellij.ide.util.scopeChooser.PackageSetChooserCombo;
import com.intellij.ide.util.scopeChooser.ScopeChooserConfigurable;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.newEditor.OptionsEditor;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.util.Comparing;
@@ -108,12 +107,9 @@ public class ProjectSettingsPanel {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
DataContext context = DataManager.getInstance().getDataContextFromFocus().getResult();
if (context != null) {
OptionsEditor optionsEditor = OptionsEditor.KEY.getData(context);
if (optionsEditor != null) {
Configurable configurable = optionsEditor.findConfigurableById(ScopeChooserConfigurable.PROJECT_SCOPES);
if (configurable != null) {
optionsEditor.clearSearchAndSelect(configurable);
}
Settings settings = Settings.KEY.getData(context);
if (settings != null) {
settings.select(settings.find(ScopeChooserConfigurable.PROJECT_SCOPES));
}
}
}
@@ -16,8 +16,7 @@
package com.jetbrains.python.configuration;
import com.intellij.ide.DataManager;
import com.intellij.openapi.options.SearchableConfigurable;
import com.intellij.openapi.options.newEditor.OptionsEditor;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.ui.ClickListener;
import com.intellij.ui.components.JBLabel;
import org.jetbrains.annotations.NotNull;
@@ -40,12 +39,9 @@ public class PyConfigureInterpretersLinkPanel extends JPanel {
@Override
public boolean onClick(@NotNull MouseEvent e, int clickCount) {
if (clickCount == 1) {
final OptionsEditor optionsEditor = OptionsEditor.KEY.getData(DataManager.getInstance().getDataContext(parentPanel));
if (optionsEditor != null) {
SearchableConfigurable configurable = optionsEditor.findConfigurableById(PyActiveSdkModuleConfigurable.class.getName());
if (configurable != null) {
optionsEditor.clearSearchAndSelect(configurable);
}
Settings settings = Settings.KEY.getData(DataManager.getInstance().getDataContext(parentPanel));
if (settings != null) {
settings.select(settings.find(PyActiveSdkModuleConfigurable.class.getName()));
return true;
}
}
@@ -18,7 +18,7 @@ package com.intellij.spellchecker.settings;
import com.intellij.ide.DataManager;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.newEditor.OptionsEditor;
import com.intellij.openapi.options.ex.Settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Pair;
@@ -67,11 +67,11 @@ public class SpellCheckerSettingsPane implements Disposable {
link.addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(final HyperlinkEvent e) {
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
final OptionsEditor optionsEditor = OptionsEditor.KEY.getData(DataManager.getInstance().getDataContext());
if (optionsEditor != null) {
final ErrorsConfigurable errorsConfigurable = optionsEditor.findConfigurable(ErrorsConfigurable.class);
Settings allSettings = Settings.KEY.getData(DataManager.getInstance().getDataContext());
if (allSettings != null) {
final ErrorsConfigurable errorsConfigurable = allSettings.find(ErrorsConfigurable.class);
if (errorsConfigurable != null) {
optionsEditor.clearSearchAndSelect(errorsConfigurable).doWhenDone(new Runnable() {
allSettings.select(errorsConfigurable).doWhenDone(new Runnable() {
public void run() {
errorsConfigurable.selectInspectionTool(SpellCheckingInspection.SPELL_CHECKING_INSPECTION_TOOL_NAME);
}