From 8c868505a3f175c2d9267c85c0fb41c476e4c191 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Mon, 8 Nov 2010 19:20:48 +0300 Subject: [PATCH] navbar location, focus and plainting fixes --- .../ide/navigationToolbar/NavBarPanel.java | 9 ++++---- .../src/com/intellij/ide/IdeEventQueue.java | 22 +++++++++++++++++++ .../wm/impl/ToolWindowManagerImpl.java | 18 +++++++++++---- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java index af4979d6bcfb..bc4b12ebf655 100644 --- a/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/navigationToolbar/NavBarPanel.java @@ -103,7 +103,7 @@ public class NavBarPanel extends OpaquePanel.List implements DataProvider, Popup private LightweightHint myHint = null; private ListPopupImpl myNodePopup = null; - private Container myHintContainer; + private JComponent myHintContainer; private Component myContextComponent; private Runnable myRunWhenListRebuilt; @@ -1041,7 +1041,8 @@ public class NavBarPanel extends OpaquePanel.List implements DataProvider, Popup final AsyncResult result = new AsyncResult(); if (myHintContainer != null) { final Point p = AbstractPopup.getCenterOf(myHintContainer, this); - p.y -= myHintContainer.getHeight() / 4; + p.y -= myHintContainer.getVisibleRect().height / 4; + result.setDone(RelativePoint.fromScreen(p)); } else { @@ -1114,8 +1115,8 @@ public class NavBarPanel extends OpaquePanel.List implements DataProvider, Popup boolean selected = myModel.getSelectedIndex() == myIndex; - setPaintFocusBorder(selected); - setFocusBorderAroundIcon(true); + setPaintFocusBorder(!focused && selected); + setFocusBorderAroundIcon(false); setBackground(selected && focused ? UIUtil.getListSelectionBackground() diff --git a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java index b5efa1e0163a..65e04b9340a6 100644 --- a/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java +++ b/platform/platform-impl/src/com/intellij/ide/IdeEventQueue.java @@ -39,6 +39,7 @@ import com.intellij.util.Alarm; import com.intellij.util.ReflectionUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,6 +49,7 @@ import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; @@ -569,6 +571,26 @@ public class IdeEventQueue extends EventQueue { if (!mouseEventsAhead) { Window showingWindow = mgr.getActiveWindow(); + if (showingWindow == null) { + Method getNativeFocusOwner = ReflectionUtil.getDeclaredMethod(KeyboardFocusManager.class, "getNativeFocusOwner"); + if (getNativeFocusOwner != null) { + getNativeFocusOwner.setAccessible(true); + try { + Object owner = getNativeFocusOwner.invoke(mgr); + if (owner instanceof Component) { + Component nativeFocusOwner = (Component)owner; + if (nativeFocusOwner instanceof Window) { + showingWindow = (Window)nativeFocusOwner; + } else { + showingWindow = SwingUtilities.getWindowAncestor(nativeFocusOwner); + } + } + } + catch (Exception e1) { + LOG.debug(e1); + } + } + } if (showingWindow != null) { final IdeFocusManager fm = IdeFocusManager.findInstanceByComponent(showingWindow); Runnable requestDefaultFocus = new Runnable() { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java index 273f62fea55f..adf6866eacf3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowManagerImpl.java @@ -496,19 +496,29 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } private void activateEditorComponent(final boolean forced) { + activateEditorComponent(forced, false); + } + private void activateEditorComponent(final boolean forced, boolean now) { if (LOG.isDebugEnabled()) { LOG.debug("enter: activateEditorComponent()"); } ApplicationManager.getApplication().assertIsDispatchThread(); - getFocusManager().doWhenFocusSettlesDown(new Runnable() { + Runnable runnable = new Runnable() { @Override public void run() { final ArrayList commandList = new ArrayList(); activateEditorComponentImpl(getSplittersFromFocus(), commandList, forced); execute(commandList); } - }); + }; + + if (now) { + runnable.run(); + } else { + getFocusManager().doWhenFocusSettlesDown(runnable); + + } } private EditorsSplitters getSplittersFromFocus() { @@ -2035,10 +2045,10 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements if (ModalityState.NON_MODAL.equals(ModalityState.current())) { final String activeId = getActiveToolWindowId(); if (myEditorComponentActive || activeId == null || getToolWindow(activeId) == null) { - activateEditorComponent(forced); + activateEditorComponent(forced, true); } else { - activateToolWindow(activeId, forced, false); + activateToolWindow(activeId, forced, true); } } return new ActionCallback.Done();