IDEA-127739 Navigation Tab
authorVassiliy.Kudryashov <Vassiliy.Kudryashov@jetbrains.com>
Tue, 9 Sep 2014 13:51:51 +0000 (17:51 +0400)
committerVassiliy.Kudryashov <Vassiliy.Kudryashov@jetbrains.com>
Tue, 9 Sep 2014 13:52:32 +0000 (17:52 +0400)
Stage 5 better "resizing" UI for sliding toolwindow

platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/PreviewPanel.java
platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java

index 1c9af86cd12a1f5762368037b0761d7a69345b74..54a81453553b843c8110f5c753570e628a0814e2 100644 (file)
@@ -47,6 +47,9 @@ import java.util.ArrayList;
 import java.util.EnumSet;
 
 class PreviewPanel extends JPanel {
+
+  private CardLayout myLayout;
+
   enum ContentType {Files, Usages, Diagrams, Documentation}
 
   private static final Key<VirtualFile> FILE_KEY = Key.create("v_file");
@@ -162,8 +165,12 @@ class PreviewPanel extends JPanel {
     myEditorsSplitters.createCurrentWindow();
     myWindow = myEditorsSplitters.getCurrentWindow();
     myWindow.setTabsPlacement(UISettings.TABS_NONE);
-    setLayout(new GridLayout(1, 1));
-    add(myEditorsSplitters);
+    myLayout = new CardLayout();
+    setLayout(myLayout);
+    add(ContentType.Files.toString(), myEditorsSplitters);
+    //add(ContentType.Usages.toString(), myUsagesPreview);??? tree or editor ???
+    //add(ContentType.Diagrams.toString(), myDiagramPanel);
+    //add(ContentType.Documentation.toString(), myDocumentationPanel);//todo
     myToolWindow.setTitleActions(new MoveToEditorTabsAction(), new CloseFileAction());
     ArrayList<AnAction> myGearActions = new ArrayList<AnAction>();
     for (ContentType contentType : ContentType.values()) {
index 17acd7d1ee6646b4cffec4b328abd49558a92a3f..ba5c59a9ac25576c2c03bfb87c3bb7f02fa765ad 100644 (file)
@@ -17,6 +17,7 @@ package com.intellij.openapi.wm.impl;
 
 import com.intellij.ide.actions.ResizeToolWindowAction;
 import com.intellij.idea.ActionsBundle;
+import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.*;
 import com.intellij.openapi.keymap.Keymap;
 import com.intellij.openapi.keymap.KeymapManagerListener;
@@ -55,8 +56,6 @@ import java.util.Map;
  */
 public final class InternalDecorator extends JPanel implements Queryable, TypeSafeDataProvider {
 
-  private static final int DIVIDER_WIDTH = UIUtil.isUnderDarcula() ? 2 : 5;
-
   private Project myProject;
   private WindowInfoImpl myInfo;
   private final ToolWindowImpl myToolWindow;
@@ -170,7 +169,7 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa
       else if (ToolWindowAnchor.RIGHT == anchor) {
         add(myDivider, BorderLayout.WEST);
       }
-      myDivider.setPreferredSize(new Dimension(DIVIDER_WIDTH, DIVIDER_WIDTH));
+      myDivider.setPreferredSize(new Dimension(0, 0));
     }
     else { // docked and floating windows don't have divider
       remove(myDivider);
@@ -304,10 +303,16 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa
 
     @Override
     public void paintBorder(final Component c, final Graphics g, final int x, final int y, final int width, final int height) {
-      g.setColor(UIUtil.getPanelBackground());
-      doPaintBorder(c, g, x, y, width, height);
-      g.setColor(new Color(0, 0, 0, 90));
-      doPaintBorder(c, g, x, y, width, height);
+      if (UIUtil.isUnderDarcula()) {
+        g.setColor(Gray._40);
+        doPaintBorder(c, g, x, y, width, height);
+      }
+      else {
+        g.setColor(UIUtil.getPanelBackground());
+        doPaintBorder(c, g, x, y, width, height);
+        g.setColor(Gray._155);
+        doPaintBorder(c, g, x, y, width, height);
+      }
     }
 
     private void doPaintBorder(Component c, Graphics g, int x, int y, int width, int height) {
@@ -315,18 +320,22 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa
 
       if (insets.top > 0) {
         UIUtil.drawLine(g, x, y + insets.top - 1, x + width - 1, y + insets.top - 1);
+        UIUtil.drawLine(g, x, y + insets.top, x + width - 1, y + insets.top);
       }
 
       if (insets.left > 0) {
-        UIUtil.drawLine(g, x, y + insets.top, x, y + height - 1);
+        UIUtil.drawLine(g, x, y, x, y + height);
+        UIUtil.drawLine(g, x + 1, y, x + 1, y + height);
       }
 
       if (insets.right > 0) {
-        UIUtil.drawLine(g, x + width - 1, y + insets.top, x + width - 1, y + height - 1);
+        UIUtil.drawLine(g, x + width - 1, y + insets.top, x + width - 1, y + height);
+        UIUtil.drawLine(g, x + width, y + insets.top, x + width, y + height);
       }
 
       if (insets.bottom > 0) {
-        UIUtil.drawLine(g, x, y + height - 1, x + width - 1, y + height - 1);
+        UIUtil.drawLine(g, x, y + height - 1, x + width, y + height - 1);
+        UIUtil.drawLine(g, x, y + height, x + width, y + height);
        }
     }
 
@@ -355,7 +364,7 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa
         component = parent;
         parent = component.getParent();
       }
-      return new Insets(0, anchor == ToolWindowAnchor.RIGHT ? 1 : 0, 0, anchor == ToolWindowAnchor.LEFT ? 1 : 0);
+      return new Insets(0, anchor == ToolWindowAnchor.RIGHT ? 1 : 0, anchor == ToolWindowAnchor.TOP ? 1 : 0, anchor == ToolWindowAnchor.LEFT ? 1 : 0);
     }
 
     @Override
@@ -614,135 +623,98 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa
   private final class MyDivider extends JPanel {
     private boolean myDragging;
     private Point myLastPoint;
+    private Disposable myDisposable;
+    private IdeGlassPane myGlassPane;
+
+    private final MouseAdapter myListener = new MyMouseAdapter();
 
-    private MyDivider() {
-      myDragging = false;
-      enableEvents(MouseEvent.MOUSE_EVENT_MASK | MouseEvent.MOUSE_MOTION_EVENT_MASK);
-      setBorder(new DividerBorder());
+    @Override
+    public void addNotify() {
+      super.addNotify();
+      myGlassPane = IdeGlassPaneUtil.find(this);
+      myDisposable = Disposer.newDisposable();
+      myGlassPane.addMouseMotionPreprocessor(myListener, myDisposable);
+      myGlassPane.addMousePreprocessor(myListener, myDisposable);
     }
 
     @Override
-    protected final void processMouseMotionEvent(final MouseEvent e) {
-      super.processMouseMotionEvent(e);
-      if (MouseEvent.MOUSE_DRAGGED == e.getID()) {
-        myDragging = true;
-        final ToolWindowAnchor anchor = myInfo.getAnchor();
-        final boolean isVerticalCursor = myInfo.isDocked() ? anchor.isSplitVertically() : anchor.isHorizontal();
-        setCursor(isVerticalCursor ? Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR) : Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
-        final Point point = e.getPoint();
+    public void removeNotify() {
+      super.removeNotify();
+      if (myDisposable != null && !Disposer.isDisposed(myDisposable)) {
+        Disposer.dispose(myDisposable);
+      }
+    }
+
+    boolean isInDragZone(MouseEvent e) {
+      final Point p = SwingUtilities.convertMouseEvent(e.getComponent(), e, this).getPoint();
+      return Math.abs(myInfo.getAnchor().isHorizontal() ? p.y : p.x) < 6;
+    }
+
+
+    private class MyMouseAdapter extends MouseAdapter {
+
+      private void updateCursor(MouseEvent e) {
+        if (isInDragZone(e)) {
+          myGlassPane.setCursor(MyDivider.this.getCursor(), MyDivider.this);
+          e.consume();
+        }
+      }
+
+      @Override
+      public void mousePressed(MouseEvent e) {
+        myDragging = isInDragZone(e);
+        updateCursor(e);
+      }
+
+      @Override
+      public void mouseClicked(MouseEvent e) {
+        updateCursor(e);
+      }
 
+      @Override
+      public void mouseReleased(MouseEvent e) {
+        updateCursor(e);
+        myDragging = false;
+      }
+
+      @Override
+      public void mouseMoved(MouseEvent e) {
+        updateCursor(e);
+      }
+
+      @Override
+      public void mouseDragged(MouseEvent e) {
+        if (!myDragging) return;
+        MouseEvent event = SwingUtilities.convertMouseEvent(e.getComponent(), e, MyDivider.this);
+        final ToolWindowAnchor anchor = myInfo.getAnchor();
+        final Point point = event.getPoint();
         final Container windowPane = InternalDecorator.this.getParent();
-        myLastPoint = SwingUtilities.convertPoint(this, point, windowPane);
+        myLastPoint = SwingUtilities.convertPoint(MyDivider.this, point, windowPane);
         myLastPoint.x = Math.min(Math.max(myLastPoint.x, 0), windowPane.getWidth());
         myLastPoint.y = Math.min(Math.max(myLastPoint.y, 0), windowPane.getHeight());
 
         final Rectangle bounds = InternalDecorator.this.getBounds();
         if (anchor == ToolWindowAnchor.TOP) {
-          if (myLastPoint.y < DIVIDER_WIDTH) {
-            myLastPoint.y = DIVIDER_WIDTH;
-          }
           InternalDecorator.this.setBounds(0, 0, bounds.width, myLastPoint.y);
         }
         else if (anchor == ToolWindowAnchor.LEFT) {
-          if (myLastPoint.x < DIVIDER_WIDTH) {
-            myLastPoint.x = DIVIDER_WIDTH;
-          }
           InternalDecorator.this.setBounds(0, 0, myLastPoint.x, bounds.height);
         }
         else if (anchor == ToolWindowAnchor.BOTTOM) {
-          if (myLastPoint.y > windowPane.getHeight() - DIVIDER_WIDTH) {
-            myLastPoint.y = windowPane.getHeight() - DIVIDER_WIDTH;
-          }
           InternalDecorator.this.setBounds(0, myLastPoint.y, bounds.width, windowPane.getHeight() - myLastPoint.y);
         }
         else if (anchor == ToolWindowAnchor.RIGHT) {
-          if (myLastPoint.x > windowPane.getWidth() - DIVIDER_WIDTH) {
-            myLastPoint.x = windowPane.getWidth() - DIVIDER_WIDTH;
-          }
           InternalDecorator.this.setBounds(myLastPoint.x, 0, windowPane.getWidth() - myLastPoint.x, bounds.height);
         }
         InternalDecorator.this.validate();
+        e.consume();
       }
     }
 
     @Override
-    protected final void processMouseEvent(final MouseEvent e) {
-      super.processMouseEvent(e);
+    public Cursor getCursor() {
       final boolean isVerticalCursor = myInfo.isDocked() ? myInfo.getAnchor().isSplitVertically() : myInfo.getAnchor().isHorizontal();
-      switch (e.getID()) {
-        case MouseEvent.MOUSE_MOVED:
-        default:
-          break;
-        case MouseEvent.MOUSE_ENTERED:
-          setCursor(
-            isVerticalCursor ? Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR) : Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
-          break;
-        case MouseEvent.MOUSE_EXITED:
-          if (!myDragging) {
-            setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-          }
-          break;
-        case MouseEvent.MOUSE_PRESSED:
-          setCursor(
-            isVerticalCursor ? Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR) : Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
-          break;
-        case MouseEvent.MOUSE_RELEASED:
-          myDragging = false;
-          myLastPoint = null;
-          break;
-        case MouseEvent.MOUSE_CLICKED:
-          break;
-      }
-    }
-
-    private final class DividerBorder implements Border {
-      @Override
-      public final void paintBorder(final Component c, final Graphics g, final int x, final int y, final int width, final int height) {
-        final ToolWindowAnchor anchor = myInfo.getAnchor();
-        final boolean isVertical = !anchor.isSplitVertically();
-        final JBColor outer = new JBColor(Color.white, Color.darkGray);
-        if (isVertical) {
-          if (anchor == ToolWindowAnchor.TOP) {
-            g.setColor(outer);
-            UIUtil.drawLine(g, x, y, x + width - 1, y);
-            g.setColor(Color.darkGray);
-            UIUtil.drawLine(g, x, y + height - 1, x + width - 1, y + height - 1);
-          }
-          else {
-            g.setColor(Color.darkGray);
-            UIUtil.drawLine(g, x, y, x + width - 1, y);
-            g.setColor(outer);
-            UIUtil.drawLine(g, x, y + height - 1, x + width - 1, y + height - 1);
-          }
-        }
-        else {
-          if (anchor == ToolWindowAnchor.LEFT) {
-            g.setColor(outer);
-            UIUtil.drawLine(g, x, y, x, y + height - 1);
-            g.setColor(Color.darkGray);
-            UIUtil.drawLine(g, x + width - 1, y, x + width - 1, y + height - 1);
-          }
-          else {
-            g.setColor(Color.darkGray);
-            UIUtil.drawLine(g, x, y, x, y + height - 1);
-            g.setColor(outer);
-            UIUtil.drawLine(g, x + width - 1, y, x + width - 1, y + height - 1);
-          }
-        }
-      }
-
-      @Override
-      public final Insets getBorderInsets(final Component c) {
-        if (c instanceof MyDivider) {
-          return new Insets(1, 1, 1, 1);
-        }
-        return new Insets(0, 0, 0, 0);
-      }
-
-      @Override
-      public final boolean isBorderOpaque() {
-        return true;
-      }
+      return isVerticalCursor ? Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR) : Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
     }
   }