New Configurable.NoMargin interface to add corresponding component without empty border

This commit is contained in:
Sergey Malenkov
2014-09-26 16:17:54 +04:00
parent 737777103b
commit 95cfa20cf7
6 changed files with 48 additions and 59 deletions
@@ -87,4 +87,9 @@ public interface Configurable extends UnnamedConfigurable {
interface NoScroll {
}
/**
* Forbids setting an empty border to the content of the configurable.
*/
interface NoMargin {
}
}
@@ -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;
}
@@ -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;
}
}
}
@@ -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> T cast(@NotNull Class<T> 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) {
@@ -41,17 +41,12 @@ public abstract class Settings {
@Nullable
public final <T extends Configurable> T find(@NotNull Class<T> 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 extends Configurable> T unwrap(Configurable configurable, Class<T> 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) {
@@ -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 {