Search in sources :

Example 1 with IdeGlassPane

use of com.intellij.openapi.wm.IdeGlassPane in project intellij-community by JetBrains.

the class IdeGlassPaneImpl method dispatch.

public boolean dispatch(@NotNull final AWTEvent e) {
    JRootPane eventRootPane = myRootPane;
    if (e instanceof MouseEvent) {
        MouseEvent me = (MouseEvent) e;
        Window eventWindow = UIUtil.getWindow(me.getComponent());
        if (isContextMenu(eventWindow))
            return false;
        final Window thisGlassWindow = SwingUtilities.getWindowAncestor(myRootPane);
        if (eventWindow instanceof JWindow) {
            eventRootPane = ((JWindow) eventWindow).getRootPane();
            if (eventRootPane != null) {
                if (!(eventRootPane.getGlassPane() instanceof IdeGlassPane)) {
                    final Container parentWindow = eventWindow.getParent();
                    if (parentWindow instanceof Window) {
                        eventWindow = (Window) parentWindow;
                    }
                }
            }
        }
        if (eventWindow != thisGlassWindow)
            return false;
    }
    if (e.getID() == MouseEvent.MOUSE_DRAGGED) {
        if (ApplicationManager.getApplication() != null) {
            IdeTooltipManager.getInstance().hideCurrent((MouseEvent) e);
        }
    }
    boolean dispatched;
    if (e.getID() == MouseEvent.MOUSE_PRESSED || e.getID() == MouseEvent.MOUSE_RELEASED || e.getID() == MouseEvent.MOUSE_CLICKED) {
        dispatched = preprocess((MouseEvent) e, false, eventRootPane);
    } else if (e.getID() == MouseEvent.MOUSE_MOVED || e.getID() == MouseEvent.MOUSE_DRAGGED) {
        dispatched = preprocess((MouseEvent) e, true, eventRootPane);
    } else if (e.getID() == MouseEvent.MOUSE_EXITED || e.getID() == MouseEvent.MOUSE_ENTERED) {
        dispatched = preprocess((MouseEvent) e, false, eventRootPane);
    } else {
        return false;
    }
    MouseEvent me = (MouseEvent) e;
    final Component meComponent = me.getComponent();
    if (!dispatched && meComponent != null) {
        final Window eventWindow = UIUtil.getWindow(meComponent);
        if (eventWindow != SwingUtilities.getWindowAncestor(myRootPane)) {
            return false;
        }
        int button1 = MouseEvent.BUTTON1_MASK | MouseEvent.BUTTON1_DOWN_MASK;
        final boolean pureMouse1Event = (me.getModifiersEx() | button1) == button1;
        if (pureMouse1Event && me.getClickCount() <= 1 && !me.isPopupTrigger()) {
            final Point point = SwingUtilities.convertPoint(meComponent, me.getPoint(), myRootPane.getContentPane());
            JMenuBar menuBar = myRootPane.getJMenuBar();
            point.y += menuBar != null ? menuBar.getHeight() : 0;
            final Component target = SwingUtilities.getDeepestComponentAt(myRootPane.getContentPane().getParent(), point.x, point.y);
            if (target instanceof DnDAware) {
                final Point targetPoint = SwingUtilities.convertPoint(myRootPane.getContentPane().getParent(), point.x, point.y, target);
                final boolean overSelection = ((DnDAware) target).isOverSelection(targetPoint);
                if (overSelection) {
                    final MouseListener[] listeners = target.getListeners(MouseListener.class);
                    final MouseEvent mouseEvent = MouseEventAdapter.convert(me, target);
                    switch(me.getID()) {
                        case MouseEvent.MOUSE_PRESSED:
                            boolean consumed = false;
                            if (target.isFocusable()) {
                                IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> {
                                    IdeFocusManager.getGlobalInstance().requestFocus(target, true);
                                });
                            }
                            for (final MouseListener listener : listeners) {
                                final String className = listener.getClass().getName();
                                if (className.indexOf("BasicTreeUI$") >= 0 || className.indexOf("MacTreeUI$") >= 0)
                                    continue;
                                fireMouseEvent(listener, mouseEvent);
                                if (mouseEvent.isConsumed()) {
                                    consumed = true;
                                    break;
                                }
                            }
                            if (!mouseEvent.isConsumed()) {
                                final AWTEventListener[] eventListeners = Toolkit.getDefaultToolkit().getAWTEventListeners(MouseEvent.MOUSE_EVENT_MASK);
                                if (eventListeners != null && eventListeners.length > 0) {
                                    for (final AWTEventListener eventListener : eventListeners) {
                                        eventListener.eventDispatched(me);
                                        if (me.isConsumed())
                                            break;
                                    }
                                    if (me.isConsumed()) {
                                        consumed = true;
                                        break;
                                    }
                                }
                            }
                            if (!consumed) {
                                myPrevPressEvent = mouseEvent;
                            } else {
                                me.consume();
                            }
                            dispatched = true;
                            break;
                        case MouseEvent.MOUSE_RELEASED:
                            if (myPrevPressEvent != null && myPrevPressEvent.getComponent() == target) {
                                for (final MouseListener listener : listeners) {
                                    final String className = listener.getClass().getName();
                                    if (className.indexOf("BasicTreeUI$") >= 0 || className.indexOf("MacTreeUI$") >= 0) {
                                        fireMouseEvent(listener, myPrevPressEvent);
                                        fireMouseEvent(listener, mouseEvent);
                                        if (mouseEvent.isConsumed()) {
                                            break;
                                        }
                                    }
                                    fireMouseEvent(listener, mouseEvent);
                                    if (mouseEvent.isConsumed()) {
                                        break;
                                    }
                                }
                                if (mouseEvent.isConsumed()) {
                                    me.consume();
                                }
                                myPrevPressEvent = null;
                                dispatched = true;
                            }
                            break;
                        default:
                            myPrevPressEvent = null;
                            break;
                    }
                }
            }
        }
    }
    if (isVisible() && getComponentCount() == 0) {
        boolean cursorSet = false;
        if (meComponent != null) {
            final Point point = SwingUtilities.convertPoint(meComponent, me.getPoint(), myRootPane.getContentPane());
            if (myRootPane.getMenuBar() != null && myRootPane.getMenuBar().isVisible()) {
                point.y += myRootPane.getMenuBar().getHeight();
            }
            final Component target = SwingUtilities.getDeepestComponentAt(myRootPane.getContentPane().getParent(), point.x, point.y);
            if (target != null) {
                setCursor(target.getCursor());
                cursorSet = true;
            }
        }
        if (!cursorSet) {
            setCursor(Cursor.getDefaultCursor());
        }
    }
    return dispatched;
}
Also used : MouseEvent(java.awt.event.MouseEvent) AWTEventListener(java.awt.event.AWTEventListener) MouseListener(java.awt.event.MouseListener) DnDAware(com.intellij.ide.dnd.DnDAware) IdeGlassPane(com.intellij.openapi.wm.IdeGlassPane)

Aggregations

DnDAware (com.intellij.ide.dnd.DnDAware)1 IdeGlassPane (com.intellij.openapi.wm.IdeGlassPane)1 AWTEventListener (java.awt.event.AWTEventListener)1 MouseEvent (java.awt.event.MouseEvent)1 MouseListener (java.awt.event.MouseListener)1