summaryrefslogtreecommitdiff
path: root/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/settings/MergedCompositeConfigurable.java
diff options
context:
space:
mode:
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.java118
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