提交 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>
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
public void setBackground(final Color c) {
final Color oldBg = getBackground();
......
......@@ -36,32 +36,34 @@ 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);
/**
* 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 void updateCursor() {
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 void updateCursorLater(LWWindowPeer window) {
public final void updateCursorLater(final LWWindowPeer window) {
if (updatePending.compareAndSet(false, true)) {
Runnable r = new Runnable() {
@Override
......@@ -74,45 +76,58 @@ public abstract class LWCursorManager {
}
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);
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;
}
Cursor cursor = null;
if (componentUnderCursor != null) {
Component c = componentUnderCursor.getTarget();
// 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) {
Point p = componentUnderCursor.getLocationOnScreen();
c = ((Container)c).findComponentAt(cursorPos.x - p.x, cursorPos.y - p.y);
final Point p = peer.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);
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.
/**
* 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 @@
package sun.lwawt;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.TextArea;
......@@ -71,6 +72,15 @@ final class LWTextAreaPeer
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
protected Component getDelegateFocusOwner() {
return getTextComponent();
......
......@@ -784,9 +784,8 @@ public class LWWindowPeer
}
mouseClickButtons &= ~eventButtonMask;
}
notifyUpdateCursor();
}
notifyUpdateCursor();
}
public void dispatchMouseWheelEvent(long when, int x, int y, int modifiers,
......@@ -1057,6 +1056,10 @@ public class LWWindowPeer
return lastMouseEventPeer != null ? lastMouseEventPeer.getWindowPeerOrSelf() : null;
}
public static LWComponentPeer<?, ?> getPeerUnderCursor() {
return lastMouseEventPeer;
}
public boolean requestWindowFocus(CausedFocusEvent.Cause cause) {
if (focusLog.isLoggable(PlatformLogger.FINE)) {
focusLog.fine("requesting native focus to " + this);
......
......@@ -25,24 +25,26 @@
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 sun.lwawt.*;
final class CCursorManager extends LWCursorManager {
public class CCursorManager extends LWCursorManager {
private static native Point2D nativeGetCursorPosition();
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 final int NAMED_CURSOR = -1;
private final static CCursorManager theInstance = new CCursorManager();
private static final CCursorManager theInstance = new CCursorManager();
public static CCursorManager getInstance() {
return theInstance;
}
Cursor currentCursor;
private volatile Cursor currentCursor;
private CCursorManager() { }
......@@ -62,8 +64,11 @@ public class CCursorManager extends LWCursorManager {
}
@Override
protected void setCursor(final LWWindowPeer windowUnderCursor, final Cursor cursor) {
if (cursor == currentCursor) return;
protected void setCursor(final Cursor cursor) {
if (cursor == currentCursor) {
return;
}
currentCursor = cursor;
if (cursor == null) {
nativeSetBuiltInCursor(Cursor.DEFAULT_CURSOR, null);
......@@ -71,10 +76,12 @@ public class CCursorManager extends LWCursorManager {
}
if (cursor instanceof CCustomCursor) {
final CCustomCursor customCursor = ((CCustomCursor)cursor);
final CCustomCursor customCursor = (CCustomCursor) cursor;
final long imagePtr = customCursor.getImageData();
final Point hotSpot = customCursor.getHotSpot();
if(imagePtr != 0L) nativeSetCustomCursor(imagePtr, hotSpot.x, hotSpot.y);
if (imagePtr != 0L) {
final Point hotSpot = customCursor.getHotSpot();
nativeSetCustomCursor(imagePtr, hotSpot.x, hotSpot.y);
}
return;
}
......@@ -94,13 +101,6 @@ public class CCursorManager extends LWCursorManager {
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
private boolean isDragging = false;
private Point dragPos = null;
......@@ -109,9 +109,7 @@ public class CCursorManager extends LWCursorManager {
if (isDragging) {
throw new RuntimeException("Invalid Drag state in CCursorManager!");
}
isDragging = true;
dragPos = new Point(x, y);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册