mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
New Configurable.NoMargin interface to add corresponding component without empty border
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+24
-11
@@ -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) {
|
||||
|
||||
+9
-25
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user