提交 71d13868 编写于 作者: S serb

7150105: [macosx] four scroll-buttons don't display. scroll-sliders cursors are TextCursor.

Reviewed-by: anthony, art, alexp
上级 330c79f5
...@@ -616,6 +616,17 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent> ...@@ -616,6 +616,17 @@ public abstract class LWComponentPeer<T extends Component, D extends JComponent>
windowLocation.y + locationInWindow.y); windowLocation.y + locationInWindow.y);
} }
/**
* Returns the cursor of the peer, which is cursor of the target by default,
* but peer can override this behavior.
*
* @param p Point relative to the peer.
* @return Cursor of the peer or null if default cursor should be used.
*/
protected Cursor getCursor(final Point p) {
return getTarget().getCursor();
}
@Override @Override
public void setBackground(final Color c) { public void setBackground(final Color c) {
final Color oldBg = getBackground(); final Color oldBg = getBackground();
......
...@@ -36,32 +36,34 @@ import sun.awt.SunToolkit; ...@@ -36,32 +36,34 @@ import sun.awt.SunToolkit;
public abstract class LWCursorManager { public abstract class LWCursorManager {
// A flag to indicate if the update is scheduled, so we don't /**
// process it twice * A flag to indicate if the update is scheduled, so we don't process it
private AtomicBoolean updatePending = new AtomicBoolean(false); * twice.
*/
private final AtomicBoolean updatePending = new AtomicBoolean(false);
protected LWCursorManager() { protected LWCursorManager() {
} }
/* /**
* Sets the cursor to correspond the component currently under mouse. * Sets the cursor to correspond the component currently under mouse.
* *
* This method should not be executed on the toolkit thread as it * This method should not be executed on the toolkit thread as it
* calls to user code (e.g. Container.findComponentAt). * calls to user code (e.g. Container.findComponentAt).
*/ */
public void updateCursor() { public final void updateCursor() {
updatePending.set(false); updatePending.set(false);
updateCursorImpl(); updateCursorImpl();
} }
/* /**
* Schedules updating the cursor on the corresponding event dispatch * Schedules updating the cursor on the corresponding event dispatch
* thread for the given window. * thread for the given window.
* *
* This method is called on the toolkit thread as a result of a * This method is called on the toolkit thread as a result of a
* native update cursor request (e.g. WM_SETCURSOR on Windows). * native update cursor request (e.g. WM_SETCURSOR on Windows).
*/ */
public void updateCursorLater(LWWindowPeer window) { public final void updateCursorLater(final LWWindowPeer window) {
if (updatePending.compareAndSet(false, true)) { if (updatePending.compareAndSet(false, true)) {
Runnable r = new Runnable() { Runnable r = new Runnable() {
@Override @Override
...@@ -74,45 +76,58 @@ public abstract class LWCursorManager { ...@@ -74,45 +76,58 @@ public abstract class LWCursorManager {
} }
private void updateCursorImpl() { private void updateCursorImpl() {
LWWindowPeer windowUnderCursor = LWWindowPeer.getWindowUnderCursor(); final Point cursorPos = getCursorPosition();
Point cursorPos = getCursorPosition(); final Component c = findComponent(cursorPos);
LWComponentPeer<?, ?> componentUnderCursor = null; final Cursor cursor;
// TODO: it's possible to get the component under cursor directly as final Object peer = LWToolkit.targetToPeer(c);
// it's stored in LWWindowPee anyway (lastMouseEventPeer) if (peer instanceof LWComponentPeer) {
if (windowUnderCursor != null) { final LWComponentPeer<?, ?> lwpeer = (LWComponentPeer<?, ?>) peer;
componentUnderCursor = windowUnderCursor.findPeerAt(cursorPos.x, cursorPos.y); 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;
} }
Cursor cursor = null; // TODO: default cursor for modal blocked windows
if (componentUnderCursor != null) { setCursor(cursor);
Component c = componentUnderCursor.getTarget(); }
/**
* 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) { if (c instanceof Container) {
Point p = componentUnderCursor.getLocationOnScreen(); final Point p = peer.getLocationOnScreen();
c = ((Container)c).findComponentAt(cursorPos.x - p.x, cursorPos.y - p.y); 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) { while (c != null) {
if (c.isVisible() && c.isEnabled() && (c.getPeer() != null)) { if (c.isVisible() && c.isEnabled() && (c.getPeer() != null)) {
break; break;
} }
c = c.getParent(); c = c.getParent();
} }
if (c != null) {
cursor = c.getCursor();
}
} }
// TODO: default cursor for modal blocked windows return c;
setCursor(windowUnderCursor, cursor);
} }
/* /**
* Returns the current cursor position. * Returns the current cursor position.
*/ */
// TODO: make it public to reuse for MouseInfo // TODO: make it public to reuse for MouseInfo
protected abstract Point getCursorPosition(); protected abstract Point getCursorPosition();
/* /**
* Sets a cursor. The cursor can be null if the mouse is not over a Java window. * 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(LWWindowPeer windowUnderCursor, Cursor cursor); protected abstract void setCursor(Cursor cursor);
} }
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
package sun.lwawt; package sun.lwawt;
import java.awt.Component; import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Point; import java.awt.Point;
import java.awt.TextArea; import java.awt.TextArea;
...@@ -71,6 +72,15 @@ final class LWTextAreaPeer ...@@ -71,6 +72,15 @@ final class LWTextAreaPeer
return getDelegate().getView(); return getDelegate().getView();
} }
@Override
protected Cursor getCursor(final Point p) {
final boolean isContains;
synchronized (getDelegateLock()) {
isContains = getDelegate().getViewport().getBounds().contains(p);
}
return isContains ? super.getCursor(p) : null;
}
@Override @Override
protected Component getDelegateFocusOwner() { protected Component getDelegateFocusOwner() {
return getTextComponent(); return getTextComponent();
......
...@@ -784,9 +784,8 @@ public class LWWindowPeer ...@@ -784,9 +784,8 @@ public class LWWindowPeer
} }
mouseClickButtons &= ~eventButtonMask; mouseClickButtons &= ~eventButtonMask;
} }
notifyUpdateCursor();
} }
notifyUpdateCursor();
} }
public void dispatchMouseWheelEvent(long when, int x, int y, int modifiers, public void dispatchMouseWheelEvent(long when, int x, int y, int modifiers,
...@@ -1057,6 +1056,10 @@ public class LWWindowPeer ...@@ -1057,6 +1056,10 @@ public class LWWindowPeer
return lastMouseEventPeer != null ? lastMouseEventPeer.getWindowPeerOrSelf() : null; return lastMouseEventPeer != null ? lastMouseEventPeer.getWindowPeerOrSelf() : null;
} }
public static LWComponentPeer<?, ?> getPeerUnderCursor() {
return lastMouseEventPeer;
}
public boolean requestWindowFocus(CausedFocusEvent.Cause cause) { public boolean requestWindowFocus(CausedFocusEvent.Cause cause) {
if (focusLog.isLoggable(PlatformLogger.FINE)) { if (focusLog.isLoggable(PlatformLogger.FINE)) {
focusLog.fine("requesting native focus to " + this); focusLog.fine("requesting native focus to " + this);
......
...@@ -25,24 +25,26 @@ ...@@ -25,24 +25,26 @@
package sun.lwawt.macosx; package sun.lwawt.macosx;
import java.awt.*; import sun.lwawt.LWCursorManager;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import sun.lwawt.*; final class CCursorManager extends LWCursorManager {
public class CCursorManager extends LWCursorManager {
private static native Point2D nativeGetCursorPosition(); private static native Point2D nativeGetCursorPosition();
private static native void nativeSetBuiltInCursor(final int type, final String name); private static native void nativeSetBuiltInCursor(final int type, final String name);
private static native void nativeSetCustomCursor(final long imgPtr, final double x, final double y); private static native void nativeSetCustomCursor(final long imgPtr, final double x, final double y);
private static final int NAMED_CURSOR = -1; private static final int NAMED_CURSOR = -1;
private final static CCursorManager theInstance = new CCursorManager(); private static final CCursorManager theInstance = new CCursorManager();
public static CCursorManager getInstance() { public static CCursorManager getInstance() {
return theInstance; return theInstance;
} }
Cursor currentCursor; private volatile Cursor currentCursor;
private CCursorManager() { } private CCursorManager() { }
...@@ -62,8 +64,11 @@ public class CCursorManager extends LWCursorManager { ...@@ -62,8 +64,11 @@ public class CCursorManager extends LWCursorManager {
} }
@Override @Override
protected void setCursor(final LWWindowPeer windowUnderCursor, final Cursor cursor) { protected void setCursor(final Cursor cursor) {
if (cursor == currentCursor) return; if (cursor == currentCursor) {
return;
}
currentCursor = cursor;
if (cursor == null) { if (cursor == null) {
nativeSetBuiltInCursor(Cursor.DEFAULT_CURSOR, null); nativeSetBuiltInCursor(Cursor.DEFAULT_CURSOR, null);
...@@ -71,10 +76,12 @@ public class CCursorManager extends LWCursorManager { ...@@ -71,10 +76,12 @@ public class CCursorManager extends LWCursorManager {
} }
if (cursor instanceof CCustomCursor) { if (cursor instanceof CCustomCursor) {
final CCustomCursor customCursor = ((CCustomCursor)cursor); final CCustomCursor customCursor = (CCustomCursor) cursor;
final long imagePtr = customCursor.getImageData(); final long imagePtr = customCursor.getImageData();
final Point hotSpot = customCursor.getHotSpot(); if (imagePtr != 0L) {
if(imagePtr != 0L) nativeSetCustomCursor(imagePtr, hotSpot.x, hotSpot.y); final Point hotSpot = customCursor.getHotSpot();
nativeSetCustomCursor(imagePtr, hotSpot.x, hotSpot.y);
}
return; return;
} }
...@@ -94,13 +101,6 @@ public class CCursorManager extends LWCursorManager { ...@@ -94,13 +101,6 @@ public class CCursorManager extends LWCursorManager {
throw new RuntimeException("Unimplemented"); throw new RuntimeException("Unimplemented");
} }
static long getNativeWindow(final LWWindowPeer window) {
if (window == null) return 0;
final CPlatformWindow platformWindow = (CPlatformWindow)window.getPlatformWindow();
if (platformWindow == null) return 0;
return platformWindow.getNSWindowPtr();
}
// package private methods to handle cursor change during drag-and-drop // package private methods to handle cursor change during drag-and-drop
private boolean isDragging = false; private boolean isDragging = false;
private Point dragPos = null; private Point dragPos = null;
...@@ -109,9 +109,7 @@ public class CCursorManager extends LWCursorManager { ...@@ -109,9 +109,7 @@ public class CCursorManager extends LWCursorManager {
if (isDragging) { if (isDragging) {
throw new RuntimeException("Invalid Drag state in CCursorManager!"); throw new RuntimeException("Invalid Drag state in CCursorManager!");
} }
isDragging = true; isDragging = true;
dragPos = new Point(x, y); dragPos = new Point(x, y);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册