diff options
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java')
-rw-r--r-- | platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java | 125 |
1 files changed, 117 insertions, 8 deletions
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java index ae0b71eaa20f..a3f4e847288c 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/DebuggerConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -18,12 +18,19 @@ package com.intellij.xdebugger.impl.settings; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.SmartList; import com.intellij.xdebugger.XDebuggerBundle; import com.intellij.xdebugger.impl.DebuggerSupport; +import com.intellij.xdebugger.settings.XDebuggerSettings; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; /** @@ -31,26 +38,118 @@ import java.util.List; */ public class DebuggerConfigurable implements SearchableConfigurable.Parent { public static final String DISPLAY_NAME = XDebuggerBundle.message("debugger.configurable.display.name"); + + static final Configurable[] EMPTY_CONFIGURABLES = new Configurable[0]; + private Configurable myRootConfigurable; private Configurable[] myChildren; - public DebuggerConfigurable(Configurable rootConfigurable, List<Configurable> children) { - myRootConfigurable = rootConfigurable; - myChildren = children.toArray(new Configurable[children.size()]); - } - + @Override public String getDisplayName() { return DISPLAY_NAME; } + @Override public String getHelpTopic() { - return myRootConfigurable != null? myRootConfigurable.getHelpTopic() : null; + return myRootConfigurable != null ? myRootConfigurable.getHelpTopic() : null; } + @Override public Configurable[] getConfigurables() { - return myChildren; + compute(); + + if (myChildren.length == 0 && myRootConfigurable instanceof SearchableConfigurable.Parent) { + return ((Parent)myRootConfigurable).getConfigurables(); + } + else { + return myChildren; + } + } + + private void compute() { + if (myChildren != null) { + return; + } + + List<DebuggerSettingsPanelProvider> providers = DebuggerConfigurableProvider.getSortedProviders(); + + List<Configurable> configurables = new SmartList<Configurable>(); + configurables.add(new DataViewsConfigurable()); + + List<Configurable> steppingConfigurables = DebuggerConfigurableProvider.getConfigurables(XDebuggerSettings.Category.STEPPING, providers); + if (!steppingConfigurables.isEmpty()) { + configurables.add(new SteppingConfigurable(steppingConfigurables)); + } + + Configurable rootConfigurable = computeRootConfigurable(providers, configurables); + + if (configurables.isEmpty() && rootConfigurable == null) { + myChildren = EMPTY_CONFIGURABLES; + } + else if (rootConfigurable == null && configurables.size() == 1) { + myRootConfigurable = configurables.get(0); + myChildren = EMPTY_CONFIGURABLES; + } + else { + myChildren = configurables.toArray(new Configurable[configurables.size()]); + myRootConfigurable = rootConfigurable; + } + } + + @Nullable + private static Configurable computeRootConfigurable(@NotNull List<DebuggerSettingsPanelProvider> providers, @NotNull List<Configurable> configurables) { + Configurable deprecatedRootConfigurable = null; + for (DebuggerSettingsPanelProvider provider : providers) { + configurables.addAll(provider.getConfigurables()); + @SuppressWarnings("deprecation") + Configurable providerRootConfigurable = provider.getRootConfigurable(); + if (providerRootConfigurable != null) { + if (deprecatedRootConfigurable == null) { + deprecatedRootConfigurable = providerRootConfigurable; + } + else { + configurables.add(providerRootConfigurable); + } + } + } + + List<Configurable> rootConfigurables = DebuggerConfigurableProvider.getConfigurables(XDebuggerSettings.Category.ROOT, providers); + if (rootConfigurables.isEmpty()) { + return deprecatedRootConfigurable; + } + else { + Configurable[] mergedRootConfigurables = new Configurable[rootConfigurables.size() + (deprecatedRootConfigurable == null ? 0 : 1)]; + rootConfigurables.toArray(mergedRootConfigurables); + if (deprecatedRootConfigurable != null) { + mergedRootConfigurables[rootConfigurables.size()] = deprecatedRootConfigurable; + } + + // move unnamed to top + Arrays.sort(mergedRootConfigurables, new Comparator<Configurable>() { + @Override + public int compare(Configurable o1, Configurable o2) { + boolean c1e = StringUtil.isEmpty(o1.getDisplayName()); + return c1e == StringUtil.isEmpty(o2.getDisplayName()) ? 0 : (c1e ? -1 : 1); + } + }); + + return new MergedCompositeConfigurable(mergedRootConfigurables) { + @NotNull + @Override + public String getId() { + throw new UnsupportedOperationException(); + } + + @Nls + @Override + public String getDisplayName() { + throw new UnsupportedOperationException(); + } + }; + } } + @Override public void apply() throws ConfigurationException { for (DebuggerSupport support : DebuggerSupport.getDebuggerSupports()) { support.getSettingsPanelProvider().apply(); @@ -60,38 +159,48 @@ public class DebuggerConfigurable implements SearchableConfigurable.Parent { } } + @Override public boolean hasOwnContent() { + compute(); return myRootConfigurable != null; } + @Override public boolean isVisible() { return true; } + @Override public Runnable enableSearch(final String option) { return null; } + @Override public JComponent createComponent() { + compute(); return myRootConfigurable != null ? myRootConfigurable.createComponent() : null; } + @Override public boolean isModified() { return myRootConfigurable != null && myRootConfigurable.isModified(); } + @Override public void reset() { if (myRootConfigurable != null) { myRootConfigurable.reset(); } } + @Override public void disposeUIResources() { if (myRootConfigurable != null) { myRootConfigurable.disposeUIResources(); } } + @Override @NotNull @NonNls public String getId() { |