src/macosx/classes/sun/lwawt/LWCursorManager.java

Print this page

        

*** 34,69 **** import sun.awt.SunToolkit; public abstract class LWCursorManager { ! // A flag to indicate if the update is scheduled, so we don't ! // process it twice ! private AtomicBoolean updatePending = new AtomicBoolean(false); protected LWCursorManager() { } ! /* * Sets the cursor to correspond the component currently under mouse. * * This method should not be executed on the toolkit thread as it * calls to user code (e.g. Container.findComponentAt). */ ! public void updateCursor() { updatePending.set(false); updateCursorImpl(); } ! /* * Schedules updating the cursor on the corresponding event dispatch * thread for the given window. * * This method is called on the toolkit thread as a result of a * native update cursor request (e.g. WM_SETCURSOR on Windows). */ ! public void updateCursorLater(LWWindowPeer window) { if (updatePending.compareAndSet(false, true)) { Runnable r = new Runnable() { @Override public void run() { updateCursor(); --- 34,71 ---- import sun.awt.SunToolkit; public abstract class LWCursorManager { ! /** ! * A flag to indicate if the update is scheduled, so we don't process it ! * twice. ! */ ! private final AtomicBoolean updatePending = new AtomicBoolean(false); protected LWCursorManager() { } ! /** * Sets the cursor to correspond the component currently under mouse. * * This method should not be executed on the toolkit thread as it * calls to user code (e.g. Container.findComponentAt). */ ! public final void updateCursor() { updatePending.set(false); updateCursorImpl(); } ! /** * Schedules updating the cursor on the corresponding event dispatch * thread for the given window. * * This method is called on the toolkit thread as a result of a * native update cursor request (e.g. WM_SETCURSOR on Windows). */ ! public final void updateCursorLater(final LWWindowPeer window) { if (updatePending.compareAndSet(false, true)) { Runnable r = new Runnable() { @Override public void run() { updateCursor();
*** 72,118 **** SunToolkit.executeOnEventHandlerThread(window.getTarget(), r); } } private void updateCursorImpl() { ! LWWindowPeer windowUnderCursor = LWWindowPeer.getWindowUnderCursor(); ! Point cursorPos = getCursorPosition(); ! LWComponentPeer<?, ?> componentUnderCursor = null; ! // TODO: it's possible to get the component under cursor directly as ! // it's stored in LWWindowPee anyway (lastMouseEventPeer) ! if (windowUnderCursor != null) { ! componentUnderCursor = windowUnderCursor.findPeerAt(cursorPos.x, cursorPos.y); ! } ! Cursor cursor = null; ! if (componentUnderCursor != null) { ! Component c = componentUnderCursor.getTarget(); if (c instanceof Container) { ! Point p = componentUnderCursor.getLocationOnScreen(); ! c = ((Container)c).findComponentAt(cursorPos.x - p.x, cursorPos.y - p.y); } - // Traverse up to the first visible, enabled and showing component while (c != null) { if (c.isVisible() && c.isEnabled() && (c.getPeer() != null)) { break; } c = c.getParent(); } - if (c != null) { - cursor = c.getCursor(); } ! } ! // TODO: default cursor for modal blocked windows ! setCursor(windowUnderCursor, cursor); } ! /* * Returns the current cursor position. */ // TODO: make it public to reuse for MouseInfo protected abstract Point getCursorPosition(); ! /* ! * Sets a cursor. The cursor can be null if the mouse is not over a Java window. */ ! protected abstract void setCursor(LWWindowPeer windowUnderCursor, Cursor cursor); ! } --- 74,133 ---- SunToolkit.executeOnEventHandlerThread(window.getTarget(), r); } } private void updateCursorImpl() { ! final Point cursorPos = getCursorPosition(); ! final Component c = findComponent(cursorPos); ! final Cursor cursor; ! final Object peer = LWToolkit.targetToPeer(c); ! if (peer instanceof LWComponentPeer) { ! final LWComponentPeer<?, ?> lwpeer = (LWComponentPeer<?, ?>) peer; ! final Point p = lwpeer.getLocationOnScreen(); ! cursor = lwpeer.getCursor(new Point(cursorPos.x - p.x, ! cursorPos.y - p.y)); ! } else { ! cursor = (c != null) ? c.getCursor() : null; ! } ! // TODO: default cursor for modal blocked windows ! setCursor(cursor); ! } ! ! /** ! * Returns the first visible, enabled and showing component under cursor. ! * ! * @param cursorPos Current cursor position. ! * @return Component ! */ ! private static final Component findComponent(final Point cursorPos) { ! final LWComponentPeer<?, ?> peer = LWWindowPeer.getPeerUnderCursor(); ! Component c = null; ! if (peer != null) { ! c = peer.getTarget(); if (c instanceof Container) { ! final Point p = peer.getLocationOnScreen(); ! c = ((Container) c).findComponentAt(cursorPos.x - p.x, ! cursorPos.y - p.y); } while (c != null) { if (c.isVisible() && c.isEnabled() && (c.getPeer() != null)) { break; } c = c.getParent(); } } ! return c; } ! /** * Returns the current cursor position. */ // TODO: make it public to reuse for MouseInfo protected abstract Point getCursorPosition(); ! /** ! * Sets a cursor. The cursor can be null if the mouse is not over a Java ! * window. ! * @param cursor the new {@code Cursor}. */ ! protected abstract void setCursor(Cursor cursor); }