diff options
author | Tor Norbye <tnorbye@google.com> | 2014-07-25 20:12:40 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-07-24 20:55:36 +0000 |
commit | 6044be7330c93bc8dacb0f63e62da8029f39a16f (patch) | |
tree | 0ba72f5de1949e0527874a799baa224cbe1537e0 /platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/MergedCompositeConfigurable.java | |
parent | b03a5855292feb8c331815f883fe64372aacd872 (diff) | |
parent | e5266e2343c8d275d79fa0be725180d0fe3a993c (diff) | |
download | idea-6044be7330c93bc8dacb0f63e62da8029f39a16f.tar.gz |
Merge "Merge remote-tracking branch 'aosp/upstream-master' into merge"
Diffstat (limited to 'platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/MergedCompositeConfigurable.java')
-rw-r--r-- | platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/MergedCompositeConfigurable.java | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/MergedCompositeConfigurable.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/MergedCompositeConfigurable.java new file mode 100644 index 000000000000..be0bdbf0ab2f --- /dev/null +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/MergedCompositeConfigurable.java @@ -0,0 +1,118 @@ +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.ui.VerticalFlowLayout; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.TitledSeparator; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; + +abstract class MergedCompositeConfigurable implements SearchableConfigurable { + static final EmptyBorder BOTTOM_INSETS = new EmptyBorder(0, 0, IdeBorderFactory.TITLED_BORDER_BOTTOM_INSET, 0); + + protected final Configurable[] children; + protected JComponent rootComponent; + + protected MergedCompositeConfigurable(@NotNull Configurable[] children) { + this.children = children; + } + + protected boolean isUseTitledBorder() { + return true; + } + + @Nullable + @Override + public Runnable enableSearch(String option) { + return null; + } + + @Nullable + @Override + public String getHelpTopic() { + return children.length == 1 ? children[0].getHelpTopic() : null; + } + + @Nullable + @Override + public JComponent createComponent() { + if (rootComponent == null) { + if (children.length == 1) { + rootComponent = children[0].createComponent(); + } + else { + JPanel panel = createPanel(isUseTitledBorder()); + for (Configurable child : children) { + JComponent component = child.createComponent(); + assert component != null; + if (isUseTitledBorder()) { + String displayName = child.getDisplayName(); + if (StringUtil.isEmpty(displayName)) { + component.setBorder(BOTTOM_INSETS); + } + else { + Insets insets = new Insets(children[0] == child ? 0 : IdeBorderFactory.TITLED_BORDER_TOP_INSET, 0, IdeBorderFactory.TITLED_BORDER_BOTTOM_INSET, 0); + component.setBorder(IdeBorderFactory.createTitledBorder(displayName, false, insets)); + } + } + panel.add(component); + } + rootComponent = panel; + } + } + return rootComponent; + } + + @NotNull + static JPanel createPanel(boolean isUseTitledBorder) { + int verticalGap = TitledSeparator.TOP_INSET; + JPanel panel = new JPanel(new VerticalFlowLayout(0, isUseTitledBorder ? 0 : verticalGap)); + // VerticalFlowLayout incorrectly use vertical gap as top inset + if (!isUseTitledBorder) { + panel.setBorder(new EmptyBorder(-verticalGap, 0, 0, 0)); + } + return panel; + } + + @Override + public boolean isModified() { + for (Configurable child : children) { + if (child.isModified()) { + return true; + } + } + return false; + } + + @Override + public void apply() throws ConfigurationException { + for (Configurable child : children) { + if (child.isModified()) { + child.apply(); + } + } + } + + @Override + public void reset() { + for (Configurable child : children) { + child.reset(); + } + } + + @Override + public void disposeUIResources() { + rootComponent = null; + + for (Configurable child : children) { + child.disposeUIResources(); + } + } +}
\ No newline at end of file |