dialog creation support for dock containers
authorDennis Ushakov <dennis.ushakov@gmail.com>
Sat, 28 Jan 2012 13:08:24 +0000 (17:08 +0400)
committerDennis Ushakov <dennis.ushakov@gmail.com>
Sun, 29 Jan 2012 07:51:37 +0000 (11:51 +0400)
platform/platform-api/src/com/intellij/ui/docking/DockContainer.java
platform/platform-impl/src/com/intellij/openapi/ui/FrameWrapper.java
platform/platform-impl/src/com/intellij/ui/docking/impl/DockManagerImpl.java
platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffWindow.java

index 25fb0289681322209015af5ef266af07e1897749..88e6365ed38ab60e68ce6d926021e59344e870e1 100644 (file)
@@ -51,6 +51,8 @@ public interface DockContainer extends Disposable, Activatable {
 
   boolean isDisposeWhenEmpty();
 
+  interface Dialog extends DockContainer {}
+
   interface Persistent extends DockContainer {
 
     String getDockContainerType();
index f45e1bcd8aa25a46701d96cf874f323ed9e13c90..742340f74fc1372f40ac6b3ee3561dbe188c0ca3 100644 (file)
@@ -57,7 +57,7 @@ public class FrameWrapper implements Disposable, DataProvider {
   private String myTitle = "";
   private Image myImage = ImageLoader.loadFromResource(ApplicationInfoImpl.getShadowInstance().getIconUrl());
   private boolean myCloseOnEsc = false;
-  private JFrame myFrame;
+  private Window myFrame;
   private final Map<String, Object> myDatas = new HashMap<String, Object>();
   private Project myProject;
   private final ProjectManagerListener myProjectListener = new MyProjectManagerListener();
@@ -69,14 +69,20 @@ public class FrameWrapper implements Disposable, DataProvider {
 
   protected StatusBar myStatusBar;
   private boolean myShown;
+  private boolean myIsDialog;
 
   public FrameWrapper(Project project) {
     this(project, null);
   }
 
   public FrameWrapper(Project project, @Nullable @NonNls String dimensionServiceKey) {
+    this(project, dimensionServiceKey, false);
+  }
+
+  public FrameWrapper(Project project, @Nullable @NonNls String dimensionServiceKey, boolean isDialog) {
     myProject = project;
     myDimensionKey = dimensionServiceKey;
+    myIsDialog = isDialog;
   }
 
   public void setDimensionKey(String dimensionKey) {
@@ -110,7 +116,7 @@ public class FrameWrapper implements Disposable, DataProvider {
       IdeFocusManager.getInstance(myProject).typeAheadUntil(myFocusedCallback);
     }
 
-    final JFrame frame = getFrame();
+    final Window frame = getFrame();
 
     if (myStatusBar != null) {
       myStatusBar.install((IdeFrame)frame);
@@ -118,7 +124,11 @@ public class FrameWrapper implements Disposable, DataProvider {
 
     myFocusTrackback = new FocusTrackback(this, IdeFocusManager.findInstance().getFocusOwner(), true);
 
-    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+    if (frame instanceof JFrame) {
+      ((JFrame)frame).setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+    } else {
+      ((JDialog)frame).setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+    }
     WindowAdapter focusListener = new WindowAdapter() {
       public void windowOpened(WindowEvent e) {
         IdeFocusManager fm = IdeFocusManager.getInstance(myProject);
@@ -135,9 +145,13 @@ public class FrameWrapper implements Disposable, DataProvider {
       }
     };
     frame.addWindowListener(focusListener);
-    if (myCloseOnEsc) addCloseOnEsc(frame);
-    frame.getContentPane().add(myComponent, BorderLayout.CENTER);
-    frame.setTitle(myTitle);
+    if (myCloseOnEsc) addCloseOnEsc((RootPaneContainer)frame);
+    ((RootPaneContainer)frame).getContentPane().add(myComponent, BorderLayout.CENTER);
+    if (frame instanceof JFrame) {
+      ((JFrame)frame).setTitle(myTitle);
+    } else {
+      ((JDialog)frame).setTitle(myTitle);
+    }
     frame.setIconImage(myImage);
 
     if (restoreBounds) {
@@ -153,9 +167,9 @@ public class FrameWrapper implements Disposable, DataProvider {
     myShown = true;
     frame.setVisible(true);
 
-    if (UIUtil.isUnderAlloyLookAndFeel()) {
+    if (UIUtil.isUnderAlloyLookAndFeel() && frame instanceof JFrame) {
       //please ask [kb] before remove it
-      frame.setMaximizedBounds(null);
+      ((JFrame)frame).setMaximizedBounds(null);
     }
   }
 
@@ -166,11 +180,13 @@ public class FrameWrapper implements Disposable, DataProvider {
   public void dispose() {
     if (isDisposed()) return;
 
-    JFrame frame = getFrame();
+    Window frame = getFrame();
     frame.setVisible(false);
     frame.dispose();
 
-    FocusTrackback.release(frame);
+    if (frame instanceof JFrame) {
+      FocusTrackback.release((JFrame)frame);
+    }
 
     if (myStatusBar != null) {
       Disposer.dispose(myStatusBar);
@@ -184,7 +200,7 @@ public class FrameWrapper implements Disposable, DataProvider {
     return myDisposed;
   }
 
-  private void addCloseOnEsc(final JFrame frame) {
+  private void addCloseOnEsc(final RootPaneContainer frame) {
     frame.getRootPane().registerKeyboardAction(
       new ActionListener() {
         public void actionPerformed(ActionEvent e) {
@@ -203,11 +219,12 @@ public class FrameWrapper implements Disposable, DataProvider {
     );
   }
 
-  public JFrame getFrame() {
+  public Window getFrame() {
     assert !myDisposed : "Already disposed!";
 
     if (myFrame == null) {
-      myFrame = createJFrame(WindowManager.getInstance().getIdeFrame(myProject));
+      final IdeFrame parent = WindowManager.getInstance().getIdeFrame(myProject);
+      myFrame = myIsDialog ? createJDialog(parent) : createJFrame(parent);
     }
     return myFrame;
   }
@@ -221,6 +238,10 @@ public class FrameWrapper implements Disposable, DataProvider {
     };
   }
 
+  protected JDialog createJDialog(IdeFrame parent) {
+    return new MyJDialog(parent);
+  }
+
   protected IdeRootPaneNorthExtension getNorthExtension(String key) {
     return null;
   }
@@ -247,7 +268,7 @@ public class FrameWrapper implements Disposable, DataProvider {
   }
 
   protected void loadFrameState() {
-    final JFrame frame = getFrame();
+    final Window frame = getFrame();
     final Point location;
     final Dimension size;
     final int extendedState;
@@ -266,24 +287,26 @@ public class FrameWrapper implements Disposable, DataProvider {
     if (size != null && location != null) {
       frame.setLocation(location);
       frame.setSize(size);
-      frame.getRootPane().revalidate();
+      ((RootPaneContainer)frame).getRootPane().revalidate();
     }
     else {
       frame.pack();
       frame.setBounds(WindowManagerEx.getInstanceEx().getIdeFrame(myProject).suggestChildFrameBounds());
     }
 
-    if (extendedState == Frame.ICONIFIED || extendedState == Frame.MAXIMIZED_BOTH) {
-      frame.setExtendedState(extendedState);
+    if (extendedState == Frame.ICONIFIED || extendedState == Frame.MAXIMIZED_BOTH && frame instanceof JFrame) {
+      ((JFrame)frame).setExtendedState(extendedState);
     }
   }
 
-  private static void saveFrameState(String dimensionKey, JFrame frame) {
+  private static void saveFrameState(String dimensionKey, Component frame) {
     DimensionService dimensionService = DimensionService.getInstance();
     if (dimensionKey == null || dimensionService == null) return;
     dimensionService.setLocation(dimensionKey, frame.getLocation());
     dimensionService.setSize(dimensionKey, frame.getSize());
-    dimensionService.setExtendedState(dimensionKey, frame.getExtendedState());
+    if (frame instanceof JFrame) {
+      dimensionService.setExtendedState(dimensionKey, ((JFrame)frame).getExtendedState());
+    }
   }
 
   public void setTitle(String title) {
@@ -413,6 +436,104 @@ public class FrameWrapper implements Disposable, DataProvider {
     }
   }
 
+  private class MyJDialog extends JDialog implements DataProvider, IdeFrame.Child {
+
+    private boolean myDisposing;
+    private final IdeFrame myParent;
+
+    private MyJDialog(IdeFrame parent) throws HeadlessException {
+      super((JFrame)parent);
+      myParent = parent;
+      setGlassPane(new IdeGlassPaneImpl(getRootPane()));
+
+      MouseGestureManager.getInstance().add(this);
+      setFocusTraversalPolicy(new LayoutFocusTraversalPolicyExt());
+    }
+
+    @Override
+    public JComponent getComponent() {
+      return getRootPane();
+    }
+
+    @Override
+    public StatusBar getStatusBar() {
+      return null;
+    }
+
+    @Override
+    public Rectangle suggestChildFrameBounds() {
+      return myParent.suggestChildFrameBounds();
+    }
+
+    @Override
+    public Project getProject() {
+      return myParent.getProject();
+    }
+
+    @Override
+    public void setFrameTitle(String title) {
+      setTitle(title);
+    }
+
+    @Override
+    public void setFileTitle(String fileTitle, File ioFile) {
+      setTitle(fileTitle);
+    }
+
+    @Override
+    public IdeRootPaneNorthExtension getNorthExtension(String key) {
+      return null;
+    }
+
+    @Override
+    public IdeFrame getParentFrame() {
+      return myParent;
+    }
+
+    public void dispose() {
+      if (myDisposing) return;
+      myDisposing = true;
+
+      MouseGestureManager.getInstance().remove(this);
+
+      if (myShown) {
+        saveFrameState(myDimensionKey, this);
+      }
+
+      Disposer.dispose(FrameWrapper.this);
+      myDatas.clear();
+      myProject = null;
+      myPreferedFocus = null;
+
+      if (myFocusTrackback != null) {
+        myFocusTrackback.restoreFocus();
+      }
+      if (myComponent != null && myFocusWatcher != null) {
+        myFocusWatcher.deinstall(myComponent);
+      }
+      myFocusWatcher = null;
+      myFocusedCallback = null;
+
+      super.dispose();
+    }
+
+    public Object getData(String dataId) {
+      if (IdeFrame.KEY.getName().equals(dataId)) {
+        return this;
+      }
+
+      Object data = FrameWrapper.this.getData(dataId);
+      return data != null ? data : myDatas.get(dataId);
+    }
+
+    @Override
+    public void paint(Graphics g) {
+      UIUtil.applyRenderingHints(g);
+      super.paint(g);
+    }
+  }
+
+
   public void setLocation(Point location) {
     getFrame().setLocation(location);
   }
index b490ba433f58791c773368d09887829d1f326a75..2329cd55ef6c63a347c3638b7eb2582dc54cb792 100644 (file)
@@ -388,7 +388,7 @@ public class DockManagerImpl extends DockManager implements PersistentStateCompo
 
   private DockWindow createWindowFor(@Nullable String id, DockContainer container) {
     String windowId = id != null ? id : String.valueOf(myWindowIdCounter++);
-    DockWindow window = new DockWindow(windowId, myProject, container);
+    DockWindow window = new DockWindow(windowId, myProject, container, container instanceof DockContainer.Dialog);
     window.setDimensionKey("dock-window-" + windowId);
     myWindows.put(container, window);
     return window;
@@ -405,13 +405,15 @@ public class DockManagerImpl extends DockManager implements PersistentStateCompo
     private NonOpaquePanel myUiContainer;
     private NonOpaquePanel myDockContentUiContainer;
 
-    private DockWindow(String id, Project project, DockContainer container) {
-      super(project);
+    private DockWindow(String id, Project project, DockContainer container, boolean dialog) {
+      super(project, null, dialog);
       myId = id;
       myContainer = container;
       setProject(project);
 
-      setStatusBar(WindowManager.getInstance().getStatusBar(project).createChild());
+      if (!(container instanceof DockContainer.Dialog)) {
+        setStatusBar(WindowManager.getInstance().getStatusBar(project).createChild());
+      }
 
       myUiContainer = new NonOpaquePanel(new BorderLayout());
 
@@ -428,7 +430,9 @@ public class DockManagerImpl extends DockManager implements PersistentStateCompo
       center.add(myDockContentUiContainer, BorderLayout.CENTER);
 
       myUiContainer.add(center, BorderLayout.CENTER);
-      myUiContainer.add(myStatusBar.getComponent(), BorderLayout.SOUTH);
+      if (!(container instanceof DockContainer.Dialog)) {
+        myUiContainer.add(myStatusBar.getComponent(), BorderLayout.SOUTH);
+      }
 
       setComponent(myUiContainer);
       addDisposable(container);
@@ -480,7 +484,8 @@ public class DockManagerImpl extends DockManager implements PersistentStateCompo
     }
 
     private void updateNorthPanel() {
-      myNorthPanel.setVisible(UISettings.getInstance().SHOW_NAVIGATION_BAR);
+      myNorthPanel.setVisible(UISettings.getInstance().SHOW_NAVIGATION_BAR &&
+                              !(myContainer instanceof DockContainer.Dialog));
 
       IdeRootPaneNorthExtension[] extensions = Extensions.getArea(myProject).getExtensionPoint(IdeRootPaneNorthExtension.EP_NAME).getExtensions();
       HashSet<String> processedKeys = new HashSet<String>();
@@ -541,6 +546,20 @@ public class DockManagerImpl extends DockManager implements PersistentStateCompo
     @Override
     protected JFrame createJFrame(IdeFrame parent) {
       JFrame frame = super.createJFrame(parent);
+      installListeners(frame);
+
+      return frame;
+    }
+
+    @Override
+    protected JDialog createJDialog(IdeFrame parent) {
+      JDialog frame = super.createJDialog(parent);
+      installListeners(frame);
+
+      return frame;
+    }
+
+    private void installListeners(Window frame) {
       frame.addWindowListener(new WindowAdapter() {
         @Override
         public void windowClosing(WindowEvent e) {
@@ -548,9 +567,7 @@ public class DockManagerImpl extends DockManager implements PersistentStateCompo
         }
       });
 
-      new UiNotifyConnector(frame.getContentPane(), myContainer);
-
-      return frame;
+      new UiNotifyConnector(((RootPaneContainer)frame).getContentPane(), myContainer);
     }
   }
 
index aca2c3ac04f2d2135d2ebb1c171b23f0470e8414..39edc03d201cfbb61e600c3ec212f8d76e469328 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.openapi.diff.impl.dir;
 
 import com.intellij.openapi.Disposable;
 
+import javax.swing.*;
 import java.awt.*;
 
 /**
@@ -46,7 +47,7 @@ public class DirDiffWindow {
 
   public void setTitle(String title) {
     if (myDialog == null) {
-      myFrame.getFrame().setTitle(title);
+      ((JFrame)myFrame.getFrame()).setTitle(title);
     } else {
       myDialog.setTitle(title);
     }