visual switcher - navigation to minmized content
authorKirill Kalishev <kirill.kalishev@jetbrains.com>
Fri, 23 Apr 2010 11:36:37 +0000 (15:36 +0400)
committerKirill Kalishev <kirill.kalishev@jetbrains.com>
Fri, 23 Apr 2010 11:36:37 +0000 (15:36 +0400)
platform/lang-api/src/com/intellij/execution/ui/RunnerLayoutUi.java
platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java
platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayoutUiImpl.java
platform/platform-api/src/com/intellij/openapi/actionSystem/ActionToolbar.java
platform/platform-api/src/com/intellij/ui/switcher/SwitchingSession.java
platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionButton.java
platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java

index abfc45c5541ca076f9993f9c7a0d2d255b263af3..7ebdac1cad026e4e6b7fe67accb6dddd96e5f2a0 100644 (file)
@@ -26,10 +26,12 @@ import com.intellij.openapi.util.ActionCallback;
 import com.intellij.ui.content.Content;
 import com.intellij.ui.content.ContentManager;
 import com.intellij.ui.content.ContentManagerListener;
+import com.intellij.ui.switcher.SwitchTarget;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
+import java.util.List;
 
 public interface RunnerLayoutUi  {
 
@@ -79,7 +81,6 @@ public interface RunnerLayoutUi  {
   void updateActionsNow();
 
   Content[] getContents();
-  
 
   abstract class Factory {
     protected Factory() {
index 4b5cd7a1f8623a09048321f79384875d8ba2f5a8..88ff067e2eb31c11718f259d57cee6489f5a1090 100644 (file)
@@ -1128,6 +1128,17 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
     result.addAll(myTabs.getTargets(true));
     result.addAll(getSelectedGrid().getTargets(onlyVisible));
 
+    Iterator<Wrapper> toolbars = myMinimizedButtonsPlaceholder.values().iterator();
+    while (toolbars.hasNext()) {
+      Wrapper each = toolbars.next();
+      if (!each.isShowing()) continue;
+      JComponent target = each.getTargetComponent();
+      if (target instanceof ActionToolbar) {
+        ActionToolbar tb = (ActionToolbar)target;
+        result.addAll(tb.getTargets(onlyVisible));
+      }
+    }
+
     return result;
   }
 
index 51cf2bc42371385fd903f1c0bf7f98acd55523ce..505022faa0532060ba706ba8c79b3e9f42fd533b 100644 (file)
@@ -44,6 +44,8 @@ import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.awt.*;
+import java.util.*;
+import java.util.List;
 
 public class RunnerLayoutUiImpl implements Disposable, RunnerLayoutUi, LayoutStateDefaults, LayoutViewOptions {
   private final RunnerLayout myLayout;
index 9e94a1ae614db9e8d10dd282c5f64059a7b7144d..42ad8821c69fb4118c1beb91320f882ce4719760 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.intellij.openapi.actionSystem;
 
+import com.intellij.ui.switcher.SwitchProvider;
 import org.jetbrains.annotations.NotNull;
 
 import javax.swing.*;
@@ -25,7 +26,7 @@ import java.awt.*;
  *
  * @see ActionManager#createActionToolbar(String, ActionGroup, boolean)
  */
-public interface ActionToolbar {
+public interface ActionToolbar extends SwitchProvider {
   /**
    * This is default layout policy for the toolbar. It defines that
    * all toolbar component are in one row / column and they are not wrapped
index 2763dfa1d4241a6f8abe071d86eb96064ea55ae0..5435dc84193777a4961ac9a9c96cc068b287ed1e 100644 (file)
@@ -136,6 +136,12 @@ public class SwitchingSession implements KeyEventDispatcher, Disposable {
         g.fillOval(paintRect.x + dX - d / 2, paintRect.y + paintRect.height + dY - d / 2, d, d);
       }
 
+      if (myPoint != null) {
+        g.setColor(Color.green);
+        Point p = myPoint.getPoint(component);
+        //g.fillOval(p.x - 2, p.y - 2, 4, 4);
+      }
+
       cfg.restore();
     }
 
@@ -246,22 +252,22 @@ public class SwitchingSession implements KeyEventDispatcher, Disposable {
       Point eachPoint = target2Point.get(eachTarget);
       switch (direction) {
         case up:
-          if (eachPoint.y < selected.y) {
+          if (eachPoint.y <= selected.y) {
             return eachTarget;
           }
           break;
         case down:
-          if (eachPoint.y > selected.y) {
+          if (eachPoint.y >= selected.y) {
             return eachTarget;
           }
           break;
         case left:
-          if (eachPoint.x < selected.x) {
+          if (eachPoint.x <= selected.x) {
             return eachTarget;
           }
           break;
         case right:
-          if (eachPoint.x > selected.x) {
+          if (eachPoint.x >= selected.x) {
             return eachTarget;
           }
           break;
@@ -274,22 +280,22 @@ public class SwitchingSession implements KeyEventDispatcher, Disposable {
 
       switch (direction) {
         case up:
-          if (eachPoint.y > selected.y) {
+          if (eachPoint.y >= selected.y) {
             return eachTarget;
           }
           break;
         case down:
-          if (eachPoint.y < selected.y) {
+          if (eachPoint.y <= selected.y) {
             return eachTarget;
           }
           break;
         case left:
-          if (eachPoint.x > selected.x) {
+          if (eachPoint.x >= selected.x) {
             return eachTarget;
           }
           break;
         case right:
-          if (eachPoint.x < selected.x) {
+          if (eachPoint.x <= selected.x) {
             return eachTarget;
           }
           break;
index 8353229c0cffb363b4104e5d79d3866ae6c954c1..d282bb74f70c33c77935cffd76e6f7590e6d5cee 100644 (file)
@@ -99,6 +99,10 @@ public class ActionButton extends JComponent implements ActionButtonComponent {
     ActionMenu.showDescriptionInStatusBar(setInfo, this, myPresentation.getDescription());
   }
 
+  public void click() {
+    performAction(new MouseEvent(this, MouseEvent.MOUSE_CLICKED, System.currentTimeMillis(), 0, 0, 0, 1, false));
+  }
+
   private void performAction(MouseEvent e) {
     AnActionEvent event = new AnActionEvent(
       e, getDataContext(),
index b0563b27c2a05976b6a00823875a789bf35bef43..619fbc7b540c7f3a8fc9a4d5ebe4bb386996f51c 100644 (file)
@@ -33,12 +33,15 @@ import com.intellij.openapi.keymap.ex.KeymapManagerEx;
 import com.intellij.openapi.keymap.ex.WeakKeymapManagerListener;
 import com.intellij.openapi.project.DumbAwareRunnable;
 import com.intellij.openapi.ui.popup.*;
+import com.intellij.openapi.util.ActionCallback;
 import com.intellij.openapi.util.Computable;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.IconLoader;
 import com.intellij.openapi.wm.IdeFocusManager;
 import com.intellij.ui.awt.RelativePoint;
 import com.intellij.ui.awt.RelativeRectangle;
+import com.intellij.ui.switcher.SwitchProvider;
+import com.intellij.ui.switcher.SwitchTarget;
 import com.intellij.util.ui.UIUtil;
 import com.intellij.util.ui.update.UiNotifyConnector;
 import org.jetbrains.annotations.NotNull;
@@ -48,7 +51,8 @@ import java.awt.*;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.MouseEvent;
-import java.util.ArrayList;
+import java.util.*;
+import java.util.List;
 
 public class ActionToolbarImpl extends JPanel implements ActionToolbar {
   private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.actionSystem.impl.ActionToolbarImpl");
@@ -986,4 +990,47 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar {
       super.paintButtonLook(g);
     }
   }
+
+  public List<SwitchTarget> getTargets(boolean onlyVisible) {
+    ArrayList<SwitchTarget> result = new ArrayList<SwitchTarget>();
+
+    if ((getBounds().width * getBounds().height) <= 0) return result;
+
+    for (int i = 0; i < getComponentCount(); i++) {
+      Component each = getComponent(i);
+      if (each instanceof ActionButton) {
+        result.add(new ActionTarget((ActionButton)each));
+      }
+    }
+    return result;
+  }
+
+  private class ActionTarget implements SwitchTarget {
+    private ActionButton myButton;
+
+    private ActionTarget(ActionButton button) {
+      myButton = button;
+    }
+
+    public ActionCallback switchTo(boolean requestFocus) {
+      myButton.click();
+      return new ActionCallback.Done();
+    }
+
+    public boolean isVisible() {
+      return myButton.isVisible();
+    }
+
+    public RelativeRectangle getRectangle() {
+      return new RelativeRectangle(myButton.getParent(), myButton.getBounds());
+    }
+  }
+
+  public SwitchTarget getCurrentTarget() {
+    return null;
+  }
+
+  public boolean isCycleRoot() {
+    return false;
+  }
 }