CR-IC-875 (border tampering replaced by event redirection)

This commit is contained in:
Roman Shevchenko
2013-04-30 18:15:38 +02:00
parent fe5171d21f
commit 24ceec79a8
@@ -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);
}
}
}