blob: f06b6bcc11075dc6d9843442331f3ef0f5f216f9 [file] [log] [blame]
/*
* 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.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.ui.IdeBorderFactory;
import com.intellij.xdebugger.settings.DebuggerConfigurableProvider;
import com.intellij.xdebugger.settings.DebuggerSettingsCategory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.List;
abstract class SubCompositeConfigurable implements SearchableConfigurable.Parent {
protected DataViewsConfigurableUi root;
protected Configurable[] children;
protected JComponent rootComponent;
@Override
public boolean hasOwnContent() {
return true;
}
@Override
public boolean isVisible() {
return true;
}
@Nullable
@Override
public Runnable enableSearch(String option) {
return null;
}
@Nullable
@Override
public String getHelpTopic() {
getConfigurables();
return children != null && children.length == 1 ? children[0].getHelpTopic() : null;
}
@Override
public final void disposeUIResources() {
root = null;
rootComponent = null;
if (isChildrenMerged()) {
for (Configurable child : children) {
child.disposeUIResources();
}
}
children = null;
}
protected XDebuggerDataViewSettings getSettings() {
return null;
}
@Nullable
protected abstract DataViewsConfigurableUi createRootUi();
@NotNull
protected abstract DebuggerSettingsCategory getCategory();
private boolean isChildrenMerged() {
return children != null && children.length == 1;
}
@Override
public final Configurable[] getConfigurables() {
if (children == null) {
List<Configurable> configurables = DebuggerConfigurable.getConfigurables(getCategory());
children = configurables.toArray(new Configurable[configurables.size()]);
}
return isChildrenMerged() ? DebuggerConfigurable.EMPTY_CONFIGURABLES : children;
}
@Nullable
@Override
public final JComponent createComponent() {
if (rootComponent == null) {
if (root == null) {
root = createRootUi();
}
getConfigurables();
if (isChildrenMerged()) {
if (children.length == 0) {
rootComponent = root == null ? null : root.getComponent();
}
else if (root == null && children.length == 1) {
rootComponent = children[0].createComponent();
}
else {
JPanel panel = new JPanel(new VerticalFlowLayout(0, 0));
if (root != null) {
JComponent c = root.getComponent();
c.setBorder(MergedCompositeConfigurable.BOTTOM_INSETS);
panel.add(c);
}
for (Configurable configurable : children) {
JComponent component = configurable.createComponent();
if (component != null) {
if (children[0] != configurable || !MergedCompositeConfigurable.isTargetedToProduct(configurable)) {
component.setBorder(IdeBorderFactory.createTitledBorder(configurable.getDisplayName(), false));
}
panel.add(component);
}
}
rootComponent = panel;
}
}
else {
rootComponent = root == null ? null : root.getComponent();
}
}
return rootComponent;
}
@Override
public final void reset() {
if (root != null) {
root.reset(getSettings());
}
if (isChildrenMerged()) {
for (Configurable child : children) {
child.reset();
}
}
}
@Override
public final boolean isModified() {
if (root != null && root.isModified(getSettings())) {
return true;
}
else if (isChildrenMerged()) {
for (Configurable child : children) {
if (child.isModified()) {
return true;
}
}
}
return false;
}
@Override
public final void apply() throws ConfigurationException {
if (root != null) {
root.apply(getSettings());
for (DebuggerConfigurableProvider provider : DebuggerConfigurableProvider.EXTENSION_POINT.getExtensions()) {
provider.generalApplied(getCategory());
}
}
if (isChildrenMerged()) {
for (Configurable child : children) {
if (child.isModified()) {
child.apply();
}
}
}
}
}