From 24ceec79a89c6091168ab7d6f9926f71e9f48d5f Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 30 Apr 2013 18:14:49 +0200 Subject: [PATCH] CR-IC-875 (border tampering replaced by event redirection) --- .../intellij/openapi/wm/impl/IdeMenuBar.java | 62 ++++++++----------- 1 file changed, 25 insertions(+), 37 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeMenuBar.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeMenuBar.java index d018dda48ed7..b0e69491a230 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeMenuBar.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeMenuBar.java @@ -38,7 +38,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.border.Border; import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; @@ -87,7 +86,6 @@ public class IdeMenuBar extends JMenuBar { myDataManager = dataManager; if (WindowManagerImpl.isFloatingMenuBarSupported()) { - addMouseListener(new MouseAdapter() {}); // event catcher for "floating" full screen menu myAnimator = new MyAnimator(); Toolkit.getDefaultToolkit().addAWTEventListener(new MyAWTEventListener(), AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK); myActivationWatcher = new Timer(100, new MyActionListener()); @@ -98,6 +96,7 @@ public class IdeMenuBar extends JMenuBar { updateState(); } }); + addMouseListener(new MyMouseListener()); } else { myAnimator = null; @@ -144,14 +143,6 @@ public class IdeMenuBar extends JMenuBar { super.menuSelectionChanged(isIncluded); } - @Override - public void setBorder(Border border) { - if (border != null && myAnimator != null) { - border = new MyBorderDelegator(border); - } - super.setBorder(border); - } - private static boolean isDescendingFrom(@Nullable Component a, @NotNull Component b) { while (a != null) { if (a == b) { @@ -417,33 +408,6 @@ public class IdeMenuBar extends JMenuBar { } } - private class MyBorderDelegator implements Border { - @NotNull private final Border mySource; - - private MyBorderDelegator(@NotNull Border source) { - mySource = source; - } - - @Override - public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - mySource.paintBorder(c, g, x, y, width, height); - } - - @Override - public Insets getBorderInsets(Component c) { - Insets insets = mySource.getBorderInsets(c); - if (myState != State.EXPANDED) { - insets.top = 0; // get rid of "passive top pixel" in full screen mode - } - return insets; - } - - @Override - public boolean isBorderOpaque() { - return mySource.isBorderOpaque(); - } - } - private class MyAnimator extends Animator { public MyAnimator() { super("MenuBarAnimator", 16, 300, false); @@ -527,4 +491,28 @@ public class IdeMenuBar extends JMenuBar { } } } + + private static class MyMouseListener extends MouseAdapter { + @Override + public void mousePressed(MouseEvent e) { + Component c = e.getComponent(); + if (c instanceof IdeMenuBar) { + Dimension size = c.getSize(); + Insets insets = ((IdeMenuBar)c).getInsets(); + Point p = e.getPoint(); + if (p.y < insets.top || p.y >= size.height - insets.bottom) { + Component item = ((IdeMenuBar)c).findComponentAt(p.x, size.height / 2); + if (item instanceof JMenuItem) { + // re-target border clicks as a menu item ones + item.dispatchEvent( + new MouseEvent(item, e.getID(), e.getWhen(), e.getModifiers(), 1, 1, e.getClickCount(), e.isPopupTrigger(), e.getButton())); + e.consume(); + return; + } + } + } + + super.mouseClicked(e); + } + } }