diff --git a/platform/platform-api/src/com/intellij/openapi/options/Configurable.java b/platform/platform-api/src/com/intellij/openapi/options/Configurable.java index 343264c0e3e4..2bc51dc52fc2 100644 --- a/platform/platform-api/src/com/intellij/openapi/options/Configurable.java +++ b/platform/platform-api/src/com/intellij/openapi/options/Configurable.java @@ -87,4 +87,9 @@ public interface Configurable extends UnnamedConfigurable { interface NoScroll { } + /** + * Forbids setting an empty border to the content of the configurable. + */ + interface NoMargin { + } } diff --git a/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java b/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java index 547fa03e438d..e4def48595bc 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java @@ -140,6 +140,9 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom } private boolean isNewProjectSettings() { + if (Registry.is("ide.new.settings.view")) { + return true; + } if (!Registry.is("ide.new.project.settings")) { return false; } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableVisitor.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableVisitor.java index 7d820a255fb3..b46b6f1b14ae 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableVisitor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableVisitor.java @@ -131,14 +131,7 @@ public abstract class ConfigurableVisitor { @Override protected boolean accept(Configurable configurable) { - if (myType.isInstance(configurable)) { - return true; - } - if (configurable instanceof ConfigurableWrapper) { - ConfigurableWrapper wrapper = (ConfigurableWrapper)configurable; - return myType.isInstance(wrapper.getConfigurable()); - } - return false; + return ConfigurableWrapper.cast(myType, configurable) != null; } } } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java index fbb33a8648bc..3489f01419fc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/ConfigurableWrapper.java @@ -77,20 +77,12 @@ public class ConfigurableWrapper implements SearchableConfigurable { } public static boolean isNoScroll(Configurable configurable) { - return configurable instanceof NoScroll || - (configurable instanceof ConfigurableWrapper && ((ConfigurableWrapper)configurable).getConfigurable() instanceof NoScroll); + return cast(NoScroll.class, configurable) != null; } public static boolean hasOwnContent(UnnamedConfigurable configurable) { - if (configurable instanceof ConfigurableWrapper) { - ConfigurableWrapper wrapper = (ConfigurableWrapper)configurable; - configurable = wrapper.getConfigurable(); - } - if (configurable instanceof SearchableConfigurable.Parent) { - SearchableConfigurable.Parent parent = (SearchableConfigurable.Parent)configurable; - return parent.hasOwnContent(); - } - return false; + SearchableConfigurable.Parent parent = cast(SearchableConfigurable.Parent.class, configurable); + return parent != null && parent.hasOwnContent(); } public static boolean isNonDefaultProject(Configurable configurable) { @@ -98,6 +90,27 @@ public class ConfigurableWrapper implements SearchableConfigurable { (configurable instanceof ConfigurableWrapper && ((ConfigurableWrapper)configurable).myEp.nonDefaultProject); } + @Nullable + public static T cast(@NotNull Class type, UnnamedConfigurable configurable) { + if (configurable instanceof ConfigurableWrapper) { + ConfigurableWrapper wrapper = (ConfigurableWrapper)configurable; + if (wrapper.myConfigurable == null) { + try { + String name = wrapper.myEp.instanceClass != null ? wrapper.myEp.instanceClass : wrapper.myEp.implementationClass; + if (!type.isAssignableFrom(Class.forName(name, false, wrapper.myEp.getLoaderForClass()))) { + return null; // do not create configurable that cannot be cast to the specified type + } + } + catch (Exception ignored) { + } + } + configurable = wrapper.getConfigurable(); + } + return type.isInstance(configurable) + ? type.cast(configurable) + : null; + } + private final ConfigurableEP myEp; private ConfigurableWrapper(@NotNull ConfigurableEP ep, @Nullable UnnamedConfigurable configurable) { diff --git a/platform/platform-impl/src/com/intellij/openapi/options/ex/Settings.java b/platform/platform-impl/src/com/intellij/openapi/options/ex/Settings.java index dee78567f7af..a352c621af4c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/ex/Settings.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/ex/Settings.java @@ -41,17 +41,12 @@ public abstract class Settings { @Nullable public final T find(@NotNull Class type) { - Configurable configurable = new ConfigurableVisitor.ByType(type).find(myGroups); - if (type.isInstance(configurable)) { - return type.cast(configurable); - } - return unwrap(configurable, type); + return unwrap(new ConfigurableVisitor.ByType(type).find(myGroups), type); } @Nullable public final Configurable find(@NotNull String id) { - Configurable configurable = new ConfigurableVisitor.ByID(id).find(myGroups); - return choose(configurable, unwrap(configurable, Configurable.class)); + return unwrap(new ConfigurableVisitor.ByID(id).find(myGroups), Configurable.class); } @NotNull @@ -64,15 +59,11 @@ public abstract class Settings { protected abstract ActionCallback selectImpl(Configurable configurable); private T unwrap(Configurable configurable, Class 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); - } + T result = ConfigurableWrapper.cast(type, configurable); + if (result != null && configurable instanceof ConfigurableWrapper) { + myMap.put(result, (ConfigurableWrapper)configurable); } - return null; + return result; } private static Configurable choose(Configurable configurable, Configurable variant) { diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/ConfigurableEditor.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/ConfigurableEditor.java index 276488529932..1f77aea77ccf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/ConfigurableEditor.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/ConfigurableEditor.java @@ -31,8 +31,6 @@ import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.options.*; import com.intellij.openapi.options.ex.ConfigurableVisitor; import com.intellij.openapi.options.ex.ConfigurableWrapper; -import com.intellij.openapi.ui.DetailsComponent; -import com.intellij.openapi.ui.Splitter; import com.intellij.openapi.util.ActionCallback; import com.intellij.ui.JBColor; import com.intellij.ui.ScrollPaneFactory; @@ -262,32 +260,18 @@ class ConfigurableEditor extends AbstractEditor implements AnActionListener, AWT } private JComponent createContent(Configurable configurable) { - if (configurable instanceof MasterDetails) { - MasterDetails master = (MasterDetails)configurable; - master.initUi(); - - DetailsComponent details = master.getDetails(); - JComponent toolbar = master.getToolbar(); - - JPanel leftPanel = new JPanel(new BorderLayout()); - leftPanel.add(BorderLayout.NORTH, toolbar); - leftPanel.add(BorderLayout.CENTER, master.getMaster()); - - details.setBannerMinHeight(toolbar.getPreferredSize().height); - - Splitter splitter = new Splitter(false); - splitter.setFirstComponent(leftPanel); - splitter.setSecondComponent(details.getComponent()); - configurable.reset(); - return splitter; - } JComponent content = configurable == null ? null : configurable.createComponent(); if (content != null) { configurable.reset(); - if (!ConfigurableWrapper.isNoScroll(configurable)) { - JScrollPane scroll = ScrollPaneFactory.createScrollPane(content, true); - scroll.getVerticalScrollBar().setUnitIncrement(10); - content = scroll; + if (ConfigurableWrapper.cast(MasterDetails.class, configurable) == null) { + if (ConfigurableWrapper.cast(Configurable.NoMargin.class, configurable) == null) { + content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + } + if (ConfigurableWrapper.cast(Configurable.NoScroll.class, configurable) == null) { + JScrollPane scroll = ScrollPaneFactory.createScrollPane(content, true); + scroll.getVerticalScrollBar().setUnitIncrement(10); + content = scroll; + } } } else {