/* GeoGebra - Dynamic Mathematics for Everyone http://www.geogebra.org This file is part of GeoGebra. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. */ package org.geogebra.desktop.main; import java.awt.Component; import java.awt.Container; import java.awt.KeyEventDispatcher; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.SwingUtilities; /** * Dispatches all mouse and key events from the glass pane to a given component. */ public class GlassPaneListener implements MouseListener, MouseMotionListener, KeyEventDispatcher { private Component glassPane, destComp; private Container contentPane; /** * @param glassPane * glass pane * @param contentPane * container * @param destComp * destination component */ public GlassPaneListener(Component glassPane, Container contentPane, Component destComp) { this.glassPane = glassPane; this.contentPane = contentPane; this.destComp = destComp; } @Override public void mouseMoved(MouseEvent e) { redispatchMouseEvent(e); } @Override public void mouseDragged(MouseEvent e) { redispatchMouseEvent(e); } @Override public void mouseClicked(MouseEvent e) { redispatchMouseEvent(e); } @Override public void mouseEntered(MouseEvent e) { redispatchMouseEvent(e); } @Override public void mouseExited(MouseEvent e) { redispatchMouseEvent(e); } @Override public void mousePressed(MouseEvent e) { redispatchMouseEvent(e); } @Override public void mouseReleased(MouseEvent e) { redispatchMouseEvent(e); } private void redispatchMouseEvent(MouseEvent e) { Point glassPanePoint = e.getPoint(); Container container = contentPane; Point containerPoint = SwingUtilities.convertPoint(glassPane, glassPanePoint, contentPane); // Find out exactly which component the mouse event is over. Component component = SwingUtilities.getDeepestComponentAt(container, containerPoint.x, containerPoint.y); if ((component != null) && (component.equals(destComp))) { // Forward events to the destination comp Point componentPoint = SwingUtilities.convertPoint(glassPane, glassPanePoint, component); component.dispatchEvent(new MouseEvent(component, e.getID(), e.getWhen(), e.getModifiers(), componentPoint.x, componentPoint.y, e.getClickCount(), AppD.isRightClick(e))); } } @Override public boolean dispatchKeyEvent(KeyEvent e) { if (destComp != null) { destComp.dispatchEvent(e); } return true; } }