package com.intellij.openapi.ui; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.WindowWrapper.Mode; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class WindowWrapperBuilder { @NotNull private final Mode myMode; @NotNull private final JComponent myComponent; @Nullable private Project myProject; @Nullable private Component myParent; @Nullable private String myTitle; @Nullable private JComponent myPreferredFocusedComponent; @Nullable private String myDimensionServiceKey; @Nullable private Runnable myOnShowCallback; public WindowWrapperBuilder(@NotNull Mode mode, @NotNull JComponent component) { myMode = mode; myComponent = component; } @NotNull public WindowWrapperBuilder setProject(@Nullable Project project) { myProject = project; return this; } @NotNull public WindowWrapperBuilder setParent(@Nullable Component parent) { myParent = parent; return this; } @NotNull public WindowWrapperBuilder setTitle(@Nullable String title) { myTitle = title; return this; } @NotNull public WindowWrapperBuilder setPreferredFocusedComponent(@Nullable JComponent preferredFocusedComponent) { myPreferredFocusedComponent = preferredFocusedComponent; return this; } @NotNull public WindowWrapperBuilder setDimensionServiceKey(@Nullable String dimensionServiceKey) { myDimensionServiceKey = dimensionServiceKey; return this; } @NotNull public WindowWrapperBuilder setOnShowCallback(@NotNull Runnable callback) { myOnShowCallback = callback; return this; } @NotNull public WindowWrapper build() { switch (myMode) { case FRAME: return new FrameWindowWrapper(this); case MODAL: case NON_MODAL: return new DialogWindowWrapper(this); default: throw new IllegalArgumentException(myMode.toString()); } } private static class DialogWindowWrapper implements WindowWrapper { @Nullable private final Project myProject; @NotNull private final JComponent myComponent; @NotNull private final Mode myMode; @NotNull private final DialogWrapper myDialog; public DialogWindowWrapper(@NotNull final WindowWrapperBuilder builder) { myProject = builder.myProject; myComponent = builder.myComponent; myMode = builder.myMode; if (builder.myParent != null) { myDialog = new MyDialogWrapper(builder.myParent, builder.myComponent, builder.myDimensionServiceKey, builder.myPreferredFocusedComponent); } else { myDialog = new MyDialogWrapper(builder.myProject, builder.myComponent, builder.myDimensionServiceKey, builder.myPreferredFocusedComponent); } final Runnable onShowCallback = builder.myOnShowCallback; if (onShowCallback != null) { myDialog.getWindow().addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { onShowCallback.run(); } }); } setTitle(builder.myTitle); switch (builder.myMode) { case MODAL: myDialog.setModal(true); break; case NON_MODAL: myDialog.setModal(false); break; default: throw new IllegalArgumentException(builder.myMode.toString()); } myDialog.init(); Disposer.register(myDialog.getDisposable(), this); } @Override public void dispose() { Disposer.dispose(myDialog.getDisposable()); } @Override public void show() { myDialog.show(); } @Nullable @Override public Project getProject() { return myProject; } @NotNull @Override public JComponent getComponent() { return myComponent; } @NotNull @Override public Mode getMode() { return myMode; } @NotNull @Override public Window getWindow() { return myDialog.getWindow(); } @Override public void setTitle(@Nullable String title) { myDialog.setTitle(StringUtil.notNullize(title)); } @Override public void setImage(@Nullable Image image) { } @Override public void close() { myDialog.close(DialogWrapper.CANCEL_EXIT_CODE); } private static class MyDialogWrapper extends DialogWrapper { @NotNull private final JComponent myComponent; @Nullable private final String myDimensionServiceKey; @Nullable private final JComponent myPreferredFocusedComponent; public MyDialogWrapper(@Nullable Project project, @NotNull JComponent component, @Nullable String dimensionServiceKey, @Nullable JComponent preferredFocusedComponent) { super(project, true); myComponent = component; myDimensionServiceKey = dimensionServiceKey; myPreferredFocusedComponent = preferredFocusedComponent; } public MyDialogWrapper(@NotNull Component parent, @NotNull JComponent component, @Nullable String dimensionServiceKey, @Nullable JComponent preferredFocusedComponent) { super(parent, true); myComponent = component; myDimensionServiceKey = dimensionServiceKey; myPreferredFocusedComponent = preferredFocusedComponent; } @Nullable @Override protected Border createContentPaneBorder() { return null; } @Override protected JComponent createCenterPanel() { return myComponent; } // it is information dialog - no need to OK or Cancel. Close the dialog by clicking the cross button or pressing Esc. @NotNull @Override protected Action[] createActions() { return new Action[0]; } @Nullable @Override protected JComponent createSouthPanel() { return null; } @Nullable @Override protected String getDimensionServiceKey() { return myDimensionServiceKey; } @Nullable @Override public JComponent getPreferredFocusedComponent() { return myPreferredFocusedComponent; } } } private static class FrameWindowWrapper implements WindowWrapper { @Nullable private final Project myProject; @NotNull private final JComponent myComponent; @NotNull private final Mode myMode; @Nullable private final Runnable myOnShowCallback; @NotNull private final FrameWrapper myFrame; public FrameWindowWrapper(@NotNull WindowWrapperBuilder builder) { myProject = builder.myProject; myComponent = builder.myComponent; myMode = builder.myMode; myOnShowCallback = builder.myOnShowCallback; myFrame = new FrameWrapper(builder.myProject, builder.myDimensionServiceKey); assert builder.myMode == Mode.FRAME; myFrame.setComponent(builder.myComponent); myFrame.setPreferredFocusedComponent(builder.myPreferredFocusedComponent); myFrame.setTitle(builder.myTitle); myFrame.closeOnEsc(); Disposer.register(myFrame, this); } @Override public void show() { myFrame.show(); if (myOnShowCallback != null) myOnShowCallback.run(); } @Nullable @Override public Project getProject() { return myProject; } @NotNull @Override public JComponent getComponent() { return myComponent; } @NotNull @Override public Mode getMode() { return myMode; } @NotNull @Override public Window getWindow() { return myFrame.getFrame(); } @Override public void setTitle(@Nullable String title) { title = StringUtil.notNullize(title); myFrame.setTitle(title); Window window = getWindow(); if (window instanceof JFrame) ((JFrame)window).setTitle(title); if (window instanceof JDialog) ((JDialog)window).setTitle(title); } @Override public void setImage(@Nullable Image image) { myFrame.setImage(image); } @Override public void close() { myFrame.close(); } @Override public void dispose() { Disposer.dispose(myFrame); } } }