diff --git a/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowManager.java b/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowManager.java index e7245b93aabb..05c9de1d087e 100644 --- a/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowManager.java +++ b/platform/platform-api/src/com/intellij/openapi/wm/ToolWindowManager.java @@ -130,7 +130,10 @@ public abstract class ToolWindowManager { public abstract void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String htmlBody); - public abstract void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String htmlBody, @Nullable final Icon icon, + public abstract void notifyByBalloon(@NotNull final String toolWindowId, + @NotNull final MessageType type, + @NotNull final String htmlBody, + @Nullable final Icon icon, @Nullable HyperlinkListener listener); @Nullable 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 03e5e3ec3d7e..a8c31f4db77c 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 @@ -89,10 +89,10 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements private final WindowManagerEx myWindowManager; private final EventListenerList myListenerList; private final DesktopLayout myLayout; - private final HashMap myId2InternalDecorator; - private final HashMap myId2FloatingDecorator; - private final HashMap myId2StripeButton; - private final HashMap myId2FocusWatcher; + private final Map myId2InternalDecorator; + private final Map myId2FloatingDecorator; + private final Map myId2StripeButton; + private final Map myId2FocusWatcher; private final Set myDumbAwareIds = Collections.synchronizedSet(CollectionFactory.troveSet()); private final EditorComponentFocusWatcher myEditorComponentFocusWatcher; @@ -124,13 +124,14 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements private KeyState myCurrentState = KeyState.waiting; private final Alarm myWaiterForSecondPress = new Alarm(); private final Runnable mySecondPressRunnable = new Runnable() { + @Override public void run() { if (myCurrentState != KeyState.hold) { resetHoldState(); } } }; - private PropertyChangeListener myFocusListener; + private final PropertyChangeListener myFocusListener; public boolean isToolWindowRegistered(String id) { return myLayout.isToolWindowRegistered(id); @@ -140,8 +141,8 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements waiting, pressed, released, hold } - private Alarm myUpdateHeadersAlarm = new Alarm(); - private Runnable myUpdateHeadersRunnable = new Runnable() { + private final Alarm myUpdateHeadersAlarm = new Alarm(); + private final Runnable myUpdateHeadersRunnable = new Runnable() { @Override public void run() { updateToolWindowHeaders(); @@ -197,11 +198,14 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements mySideStack = new SideStack(); project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerListener() { + @Override public void fileOpened(FileEditorManager source, VirtualFile file) { } + @Override public void fileClosed(FileEditorManager source, VirtualFile file) { getFocusManagerImpl(myProject).doWhenFocusSettlesDown(new ExpirableRunnable.ForProject(myProject) { + @Override public void run() { if (!hasOpenEditorFiles()) { focusToolWinowByDefault(null); @@ -210,6 +214,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements }); } + @Override public void selectionChanged(FileEditorManagerEvent event) { } }); @@ -269,7 +274,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements Set vks = getActivateToolWindowVKs(); - if (vks.size() == 0) { + if (vks.isEmpty()) { resetHoldState(); return false; } @@ -360,13 +365,16 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements return myProject; } + @Override public void initComponent() { } + @Override public void disposeComponent() { KeyboardFocusManager.getCurrentKeyboardFocusManager().removePropertyChangeListener(myFocusListener); } + @Override public void projectOpened() { final MyUIManagerPropertyChangeListener myUIManagerPropertyChangeListener = new MyUIManagerPropertyChangeListener(); final MyLafManagerListener myLafManagerListener = new MyLafManagerListener(); @@ -375,6 +383,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements myLafManager.addLafManagerListener(myLafManagerListener); Disposer.register(myProject, new Disposable() { + @Override public void dispose() { UIManager.removePropertyChangeListener(myUIManagerPropertyChangeListener); myLafManager.removeLafManagerListener(myLafManagerListener); @@ -403,6 +412,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements execute(commandsList); final DumbService.DumbModeListener dumbModeListener = new DumbService.DumbModeListener() { + @Override public void enteredDumbMode() { for (final String id : getToolWindowIds()) { if (!myDumbAwareIds.contains(id)) { @@ -414,6 +424,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } } + @Override public void exitDumbMode() { for (final String id : getToolWindowIds()) { getStripeButton(id).setEnabled(true); @@ -423,6 +434,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements myProject.getMessageBus().connect().subscribe(DumbService.DUMB_MODE, dumbModeListener); StartupManager.getInstance(myProject).registerPostStartupActivity(new DumbAwareRunnable() { + @Override public void run() { registerToolWindowsFromBeans(); if (DumbService.getInstance(myProject).isDumb()) { @@ -435,7 +447,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements @Override public boolean dispatch(AWTEvent e) { if (e instanceof KeyEvent) { - dispatchKeyEvent(((KeyEvent)e)); + dispatchKeyEvent((KeyEvent)e); } return false; } @@ -492,6 +504,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements final ActionCallback activation = toolWindow.setActivation(new ActionCallback()); final DumbAwareRunnable runnable = new DumbAwareRunnable() { + @Override public void run() { if (toolWindow.isDisposed()) return; @@ -504,6 +517,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } else { UiNotifyConnector.doWhenFirstShown(label, new Runnable() { + @Override public void run() { ApplicationManager.getApplication().invokeLater(runnable); } @@ -511,6 +525,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } } + @Override public void projectClosed() { final ArrayList commandsList = new ArrayList(); final String[] ids = getToolWindowIds(); @@ -536,10 +551,12 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements execute(commandsList); } + @Override public void addToolWindowManagerListener(@NotNull final ToolWindowManagerListener l) { myListenerList.add(ToolWindowManagerListener.class, l); } + @Override public void removeToolWindowManagerListener(@NotNull final ToolWindowManagerListener l) { myListenerList.remove(ToolWindowManagerListener.class, l); } @@ -562,6 +579,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements myWindowManager.getCommandProcessor().execute(commandList, myProject.getDisposed()); } + @Override public void activateEditorComponent() { activateEditorComponent(true); } @@ -612,6 +630,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements final String active = getActiveToolWindowId(); // Now we have to request focus into most recent focused editor appendRequestFocusInEditorComponentCmd(splitters, commandList, forced).doWhenDone(new Runnable() { + @Override public void run() { final ArrayList postExecute = new ArrayList(); @@ -624,9 +643,11 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements execute(postExecute); } }).doWhenRejected(new Runnable() { + @Override public void run() { if (forced) { getFocusManagerImpl(myProject).requestFocus(new FocusCommand() { + @Override public ActionCallback run() { final ArrayList cmds = new ArrayList(); @@ -781,6 +802,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements appendApplyWindowInfoCmd(info, commandsList); } + @Override public String[] getToolWindowIds() { final WindowInfoImpl[] infos = myLayout.getInfos(); final String[] ids = ArrayUtil.newStringArray(infos.length); @@ -790,15 +812,18 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements return ids; } + @Override public String getActiveToolWindowId() { ApplicationManager.getApplication().assertIsDispatchThread(); return myLayout.getActiveId(); } + @Override public String getLastActiveToolWindowId() { return getLastActiveToolWindowId(null); } + @Override @Nullable public String getLastActiveToolWindowId(@Nullable Condition condition) { ApplicationManager.getApplication().assertIsDispatchThread(); @@ -845,10 +870,12 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements return myLayout.getInfo(id, true); } + @Override public List getIdsOn(@NotNull final ToolWindowAnchor anchor) { return myLayout.getVisibleIdsOn(anchor, this); } + @Override public ToolWindow getToolWindow(final String id) { if (!myLayout.isToolWindowRegistered(id)) { return null; @@ -867,6 +894,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements execute(commandList); } + @Override public void hideToolWindow(@NotNull final String id, final boolean hideSide) { hideToolWindow(id, hideSide, true); } @@ -962,7 +990,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements execute(commandList); } - private boolean isStackEnabled() { + private static boolean isStackEnabled() { return Registry.is("ide.enable.toolwindow.stack"); } @@ -1026,12 +1054,14 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements appendApplyWindowInfoCmd(toBeShownInfo, commandsList); } + @Override public ToolWindow registerToolWindow(@NotNull final String id, @NotNull final JComponent component, @NotNull final ToolWindowAnchor anchor) { return registerToolWindow(id, component, anchor, false); } + @Override public ToolWindow registerToolWindow(@NotNull final String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor, @@ -1048,6 +1078,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements return registerToolWindow(id, component, anchor, parentDisposable, canWorkInDumbMode, false); } + @Override public ToolWindow registerToolWindow(@NotNull final String id, @NotNull JComponent component, @NotNull ToolWindowAnchor anchor, @@ -1063,10 +1094,12 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements return registerToolWindow(id, component, anchor, false, false, canWorkInDumbMode); } + @Override public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor) { return registerToolWindow(id, null, anchor, false, canCloseContent, false); } + @Override public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor, @@ -1075,6 +1108,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } + @Override public ToolWindow registerToolWindow(@NotNull final String id, final boolean canCloseContent, @NotNull final ToolWindowAnchor anchor, @@ -1150,6 +1184,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements private ToolWindow registerDisposable(final String id, final Disposable parentDisposable, final ToolWindow window) { Disposer.register(parentDisposable, new Disposable() { + @Override public void dispose() { unregisterToolWindow(id); } @@ -1157,6 +1192,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements return window; } + @Override public void unregisterToolWindow(@NotNull final String id) { if (LOG.isDebugEnabled()) { LOG.debug("enter: unregisterToolWindow(" + id + ")"); @@ -1203,19 +1239,23 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements myId2InternalDecorator.remove(id); } + @Override public DesktopLayout getLayout() { ApplicationManager.getApplication().assertIsDispatchThread(); return myLayout; } + @Override public void setLayoutToRestoreLater(DesktopLayout layout) { myLayoutToRestoreLater = layout; } + @Override public DesktopLayout getLayoutToRestoreLater() { return myLayoutToRestoreLater; } + @Override public void setLayout(@NotNull final DesktopLayout layout) { ApplicationManager.getApplication().assertIsDispatchThread(); final ArrayList commandList = new ArrayList(); @@ -1278,12 +1318,14 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements execute(commandList); } + @Override public void invokeLater(final Runnable runnable) { final ArrayList commandList = new ArrayList(); commandList.add(new InvokeLaterCmd(runnable, myWindowManager.getCommandProcessor())); execute(commandList); } + @Override public IdeFocusManager getFocusManager() { return IdeFocusManager.getInstance(myProject); } @@ -1303,6 +1345,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements notifyByBalloon(toolWindowId, type, htmlBody, null, null); } + @Override public void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String text, @@ -1360,6 +1403,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements listenerWrapper.myBalloon = balloon; myWindow2Balloon.put(toolWindowId, balloon); Disposer.register(balloon, new Disposable() { + @Override public void dispose() { window.setPlaceholderMode(false); stripe.updateState(); @@ -1380,9 +1424,10 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements if (button == null) return; final Runnable show = new Runnable() { + @Override public void run() { if (button.isShowing()) { - PositionTracker tracker = new PositionTracker(button) { + PositionTracker tracker = new PositionTracker(button) { @Override @Nullable public RelativePoint recalculateLocation(Balloon object) { @@ -1428,6 +1473,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements if (!button.isValid()) { SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { show.run(); } @@ -1444,6 +1490,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements return myWindow2Balloon.get(id); } + @Override public boolean isEditorComponentActive() { ApplicationManager.getApplication().assertIsDispatchThread(); @@ -1794,10 +1841,12 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } } + @Override public void clearSideStack() { mySideStack.clear(); } + @Override public void readExternal(final Element element) { for (final Object o : element.getChildren()) { final Element e = (Element)o; @@ -1814,6 +1863,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } } + @Override public void writeExternal(final Element element) { if (myFrame == null) { // do nothing if the project was not opened @@ -1937,6 +1987,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } } + @Override public void run() { try { myFloatingDecorator.show(); @@ -1961,6 +2012,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements info.setFloatingBounds(myFloatingDecorator.getBounds()); } + @Override public void run() { try { if (Patches.SPECIAL_INPUT_METHOD_PROCESSING) { @@ -1973,6 +2025,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } } + @Override @Nullable public Condition getExpireCondition() { return ApplicationManager.getApplication().getDisposed(); @@ -1980,6 +2033,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } private final class EditorComponentFocusWatcher extends FocusWatcher { + @Override protected void focusedComponentChanged(final Component component, final AWTEvent cause) { if (myWindowManager.getCommandProcessor().getCommandCount() > 0 || component == null) { return; @@ -1989,6 +2043,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements final Component owner = mgr.getFocusOwner(); IdeFocusManager.getInstance(myProject).doWhenFocusSettlesDown(new ExpirableRunnable.ForProject(myProject) { + @Override public void run() { if (mgr.getFocusOwner() == owner) { activateEditorComponent(false); @@ -2017,10 +2072,12 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements deinstall(myToolWindow.getComponent()); } + @Override protected boolean isFocusedComponentChangeValid(final Component comp, final AWTEvent cause) { return myWindowManager.getCommandProcessor().getCommandCount() == 0 && comp != null; } + @Override protected void focusedComponentChanged(final Component component, final AWTEvent cause) { if (myWindowManager.getCommandProcessor().getCommandCount() > 0 || component == null) { return; @@ -2030,6 +2087,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements if (!info.isActive()) { getFocusManagerImpl(myProject).doWhenFocusSettlesDown(new EdtRunnable() { + @Override public void runEdt() { if (!myLayout.isToolWindowRegistered(myId)) return; activateToolWindow(myId, false, false); @@ -2044,6 +2102,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements * state. */ private final class MyToolWindowPropertyChangeListener implements PropertyChangeListener { + @Override public void propertyChange(final PropertyChangeEvent e) { final ToolWindowImpl toolWindow = (ToolWindowImpl)e.getSource(); if (ToolWindowEx.PROP_AVAILABLE.equals(e.getPropertyName())) { @@ -2059,22 +2118,27 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements * Translates events from InternalDecorator into ToolWindowManager method invocations. */ private final class MyInternalDecoratorListener implements InternalDecoratorListener { + @Override public void anchorChanged(final InternalDecorator source, final ToolWindowAnchor anchor) { setToolWindowAnchor(source.getToolWindow().getId(), anchor); } + @Override public void autoHideChanged(final InternalDecorator source, final boolean autoHide) { setToolWindowAutoHide(source.getToolWindow().getId(), autoHide); } + @Override public void hidden(final InternalDecorator source) { hideToolWindow(source.getToolWindow().getId(), false); } + @Override public void hiddenSide(final InternalDecorator source) { hideToolWindow(source.getToolWindow().getId(), true); } + @Override public void contentUiTypeChanges(InternalDecorator source, ToolWindowContentUiType type) { setContentUiType(source.getToolWindow().getId(), type); } @@ -2083,6 +2147,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements * Handles event from decorator and modify weight/floating bounds of the * tool window depending on decoration type. */ + @Override public void resized(final InternalDecorator source) { if (!source.isShowing()) return; // do not recalculate the tool window size if it is not yet shown (and, therefore, has 0,0,0,0 bounds) @@ -2111,14 +2176,17 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } } + @Override public void activated(final InternalDecorator source) { activateToolWindow(source.getToolWindow().getId(), true, true); } + @Override public void typeChanged(final InternalDecorator source, final ToolWindowType type) { setToolWindowType(source.getToolWindow().getId(), type); } + @Override public void sideStatusChanged(final InternalDecorator source, final boolean isSideTool) { setSideTool(source.getToolWindow().getId(), isSideTool); } @@ -2136,18 +2204,21 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } private final class MyUIManagerPropertyChangeListener implements PropertyChangeListener { + @Override public void propertyChange(final PropertyChangeEvent e) { updateComponentTreeUI(); } } private final class MyLafManagerListener implements LafManagerListener { + @Override public void lookAndFeelChanged(final LafManager source) { updateComponentTreeUI(); } } + @Override @NotNull public String getComponentName() { return "ToolWindowManager"; @@ -2155,6 +2226,7 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements public ActionCallback requestDefaultFocus(final boolean forced) { return getFocusManagerImpl(myProject).requestFocus(new FocusCommand() { + @Override public ActionCallback run() { return processDefaultFocusRequest(forced); } @@ -2200,24 +2272,23 @@ public final class ToolWindowManagerImpl extends ToolWindowManagerEx implements } return new ActionCallback.Done(); - } else { - Window activeWindow = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); - if (activeWindow != null) { - JRootPane root = null; - if (activeWindow instanceof JDialog) { - root = ((JDialog)activeWindow).getRootPane(); - } else if (activeWindow instanceof JFrame) { - root = ((JFrame)activeWindow).getRootPane(); - } + } + Window activeWindow = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow(); + if (activeWindow != null) { + JRootPane root = null; + if (activeWindow instanceof JDialog) { + root = ((JDialog)activeWindow).getRootPane(); + } else if (activeWindow instanceof JFrame) { + root = ((JFrame)activeWindow).getRootPane(); + } - if (root != null) { - JComponent toFocus = IdeFocusTraversalPolicy.getPreferredFocusedComponent(root); - if (toFocus != null) { - if (DialogWrapper.findInstance(toFocus) != null) { - return new ActionCallback.Done(); //IDEA-80929 - } - return IdeFocusManager.findInstanceByComponent(toFocus).requestFocus(toFocus, forced); + if (root != null) { + JComponent toFocus = IdeFocusTraversalPolicy.getPreferredFocusedComponent(root); + if (toFocus != null) { + if (DialogWrapper.findInstance(toFocus) != null) { + return new ActionCallback.Done(); //IDEA-80929 } + return IdeFocusManager.findInstanceByComponent(toFocus).requestFocus(toFocus, forced); } } } diff --git a/platform/testFramework/src/com/intellij/mock/Mock.java b/platform/testFramework/src/com/intellij/mock/Mock.java index df2b960465ca..4080c8d91b9f 100644 --- a/platform/testFramework/src/com/intellij/mock/Mock.java +++ b/platform/testFramework/src/com/intellij/mock/Mock.java @@ -631,7 +631,7 @@ public class Mock { } @Override - public void notifyByBalloon(@NotNull final String toolWindowId, final MessageType type, @NotNull final String text, @Nullable final Icon icon, + public void notifyByBalloon(@NotNull final String toolWindowId, @NotNull final MessageType type, @NotNull final String text, @Nullable final Icon icon, @Nullable final HyperlinkListener listener) { }