--- a/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Feb 19 22:23:34 2013 -0800
+++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Wed Mar 27 16:37:00 2013 +0400
@@ -41,8 +41,7 @@
public class LWWindowPeer
extends LWContainerPeer<Window, JComponent>
- implements WindowPeer, FramePeer, DialogPeer, FullScreenCapable
-{
+ implements WindowPeer, FramePeer, DialogPeer, FullScreenCapable, PlatformEventNotifier {
public static enum PeerType {
SIMPLEWINDOW,
FRAME,
@@ -111,6 +110,8 @@
private final PeerType peerType;
+ private final SecurityWarningWindow warningWindow;
+
/**
* Current modal blocker or null.
*
@@ -157,11 +158,26 @@
}
platformWindow.initialize(target, this, ownerDelegate);
+
+ // Init warning window(for applets)
+ SecurityWarningWindow warn = null;
+ if (((Window)target).getWarningString() != null) {
+ // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
+ // and TrayIcon balloon windows without a warning window.
+ if (!AWTAccessor.getWindowAccessor().isTrayIconWindow((Window)target)) {
+ LWToolkit toolkit = (LWToolkit)Toolkit.getDefaultToolkit();
+ warn = toolkit.createSecurityWarning(target, this);
+ }
+ }
+
+ warningWindow = warn;
}
@Override
void initializeImpl() {
super.initializeImpl();
+
+
if (getTarget() instanceof Frame) {
setTitle(((Frame) getTarget()).getTitle());
setState(((Frame) getTarget()).getExtendedState());
@@ -219,12 +235,20 @@
if (isGrabbing()) {
ungrab();
}
+ if (warningWindow != null) {
+ warningWindow.dispose();
+ }
+
platformWindow.dispose();
super.disposeImpl();
}
@Override
protected void setVisibleImpl(final boolean visible) {
+ if (!visible && warningWindow != null) {
+ warningWindow.setVisible(false, false);
+ }
+
super.setVisibleImpl(visible);
// TODO: update graphicsConfig, see 4868278
platformWindow.setVisible(visible);
@@ -455,7 +479,15 @@
@Override
public void repositionSecurityWarning() {
- throw new RuntimeException("not implemented");
+ if (warningWindow != null) {
+ AWTAccessor.ComponentAccessor compAccessor = AWTAccessor.getComponentAccessor();
+ Window target = getTarget();
+ int x = compAccessor.getX(target);
+ int y = compAccessor.getY(target);
+ int width = compAccessor.getWidth(target);
+ int height = compAccessor.getHeight(target);
+ warningWindow.reposition(x, y, width, height);
+ }
}
// ---- FRAME PEER METHODS ---- //
@@ -515,6 +547,7 @@
// ---- PEER NOTIFICATIONS ---- //
+ @Override
public void notifyIconify(boolean iconify) {
//The toplevel target is Frame and states are applicable to it.
//Otherwise, the target is Window and it don't have state property.
@@ -539,6 +572,7 @@
}
}
+ @Override
public void notifyZoom(boolean isZoomed) {
int newWindowState = isZoomed ? Frame.MAXIMIZED_BOTH : Frame.NORMAL;
postWindowStateChangedEvent(newWindowState);
@@ -548,7 +582,8 @@
* Called by the {@code PlatformWindow} when any part of the window should
* be repainted.
*/
- public final void notifyExpose(final Rectangle r) {
+ @Override
+ public void notifyExpose(final Rectangle r) {
repaintPeer(r);
}
@@ -558,7 +593,8 @@
* LWComponentPeer as the only components which could be resized by user are
* top-level windows.
*/
- public final void notifyReshape(int x, int y, int w, int h) {
+ @Override
+ public void notifyReshape(int x, int y, int w, int h) {
final boolean moved;
final boolean resized;
final boolean invalid = updateInsets(platformWindow.getInsets());
@@ -593,6 +629,8 @@
handleResize(w, h, true);
repaintPeer();
}
+
+ repositionSecurityWarning();
}
private void clearBackground(final int w, final int h) {
@@ -620,16 +658,19 @@
}
}
+ @Override
public void notifyUpdateCursor() {
getLWToolkit().getCursorManager().updateCursorLater(this);
}
+ @Override
public void notifyActivation(boolean activation, LWWindowPeer opposite) {
Window oppositeWindow = (opposite == null)? null : opposite.getTarget();
changeFocusedWindow(activation, oppositeWindow);
}
// MouseDown in non-client area
+ @Override
public void notifyNCMouseDown() {
// Ungrab except for a click on a Dialog with the grabbing owner
if (grabbingWindow != null &&
@@ -646,10 +687,11 @@
* coordinates are relative to non-client window are, i.e. the top-left
* point of the client area is (insets.top, insets.left).
*/
- public void dispatchMouseEvent(int id, long when, int button,
- int x, int y, int screenX, int screenY,
- int modifiers, int clickCount, boolean popupTrigger,
- byte[] bdata)
+ @Override
+ public void notifyMouseEvent(int id, long when, int button,
+ int x, int y, int screenX, int screenY,
+ int modifiers, int clickCount, boolean popupTrigger,
+ byte[] bdata)
{
// TODO: fill "bdata" member of AWTEvent
Rectangle r = getBounds();
@@ -662,11 +704,9 @@
if (lastMouseEventPeer.isEnabled()) {
Point lp = lastMouseEventPeer.windowToLocal(x, y,
this);
- postEvent(new MouseEvent(lastMouseEventPeer.getTarget(),
- MouseEvent.MOUSE_EXITED, when,
- modifiers, lp.x, lp.y, screenX,
- screenY, clickCount, popupTrigger,
- button));
+ Component target = lastMouseEventPeer.getTarget();
+ postMouseExitedEvent(target, when, modifiers, lp,
+ screenX, screenY, clickCount, popupTrigger, button);
}
// Sometimes we may get MOUSE_EXITED after lastCommonMouseEventPeer is switched
@@ -682,11 +722,9 @@
if (targetPeer != null) {
if (targetPeer.isEnabled()) {
Point lp = targetPeer.windowToLocal(x, y, this);
- postEvent(new MouseEvent(targetPeer.getTarget(),
- MouseEvent.MOUSE_ENTERED, when,
- modifiers, lp.x, lp.y, screenX,
- screenY, clickCount, popupTrigger,
- button));
+ Component target = targetPeer.getTarget();
+ postMouseEnteredEvent(target, when, modifiers, lp,
+ screenX, screenY, clickCount, popupTrigger, button);
}
lastCommonMouseEventPeer = targetPeer;
lastMouseEventPeer = targetPeer;
@@ -813,11 +851,9 @@
// Generate Mouse Exit for components
if (lastMouseEventPeer != null && lastMouseEventPeer.isEnabled()) {
Point oldp = lastMouseEventPeer.windowToLocal(x, y, this);
- postEvent(new MouseEvent(lastMouseEventPeer.getTarget(),
- MouseEvent.MOUSE_EXITED,
- when, modifiers,
- oldp.x, oldp.y, screenX, screenY,
- clickCount, popupTrigger, button));
+ Component target = lastMouseEventPeer.getTarget();
+ postMouseExitedEvent(target, when, modifiers, oldp, screenX, screenY,
+ clickCount, popupTrigger, button);
}
lastCommonMouseEventPeer = targetPeer;
lastMouseEventPeer = targetPeer;
@@ -825,18 +861,42 @@
// Generate Mouse Enter for components
if (targetPeer != null && targetPeer.isEnabled()) {
Point newp = targetPeer.windowToLocal(x, y, this);
- postEvent(new MouseEvent(targetPeer.getTarget(),
- MouseEvent.MOUSE_ENTERED,
- when, modifiers,
- newp.x, newp.y, screenX, screenY,
- clickCount, popupTrigger, button));
+ Component target = targetPeer.getTarget();
+ postMouseEnteredEvent(target, when, modifiers, newp, screenX, screenY, clickCount, popupTrigger, button);
}
}
- public void dispatchMouseWheelEvent(long when, int x, int y, int modifiers,
- int scrollType, int scrollAmount,
- int wheelRotation, double preciseWheelRotation,
- byte[] bdata)
+ private void postMouseEnteredEvent(Component target, long when, int modifiers,
+ Point loc, int xAbs, int yAbs,
+ int clickCount, boolean popupTrigger, int button) {
+
+ updateSecurityWarningVisibility();
+
+ postEvent(new MouseEvent(target,
+ MouseEvent.MOUSE_ENTERED,
+ when, modifiers,
+ loc.x, loc.y, xAbs, yAbs,
+ clickCount, popupTrigger, button));
+ }
+
+ private void postMouseExitedEvent(Component target, long when, int modifiers,
+ Point loc, int xAbs, int yAbs,
+ int clickCount, boolean popupTrigger, int button) {
+
+ updateSecurityWarningVisibility();
+
+ postEvent(new MouseEvent(target,
+ MouseEvent.MOUSE_EXITED,
+ when, modifiers,
+ loc.x, loc.y, xAbs, yAbs,
+ clickCount, popupTrigger, button));
+ }
+
+ @Override
+ public void notifyMouseWheelEvent(long when, int x, int y, int modifiers,
+ int scrollType, int scrollAmount,
+ int wheelRotation, double preciseWheelRotation,
+ byte[] bdata)
{
// TODO: could we just use the last mouse event target here?
Rectangle r = getBounds();
@@ -862,8 +922,9 @@
/*
* Called by the delegate when a key is pressed.
*/
- public void dispatchKeyEvent(int id, long when, int modifiers,
- int keyCode, char keyChar, int keyLocation)
+ @Override
+ public void notifyKeyEvent(int id, long when, int modifiers,
+ int keyCode, char keyChar, int keyLocation)
{
LWKeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance();
Component focusOwner = kfmPeer.getCurrentFocusOwner();
@@ -877,7 +938,6 @@
postEvent(new KeyEvent(focusOwner, id, when, modifiers, keyCode, keyChar, keyLocation));
}
-
// ---- UTILITY METHODS ---- //
private void postWindowStateChangedEvent(int newWindowState) {
@@ -885,11 +945,14 @@
AWTAccessor.getFrameAccessor().setExtendedState(
(Frame)getTarget(), newWindowState);
}
+
WindowEvent stateChangedEvent = new WindowEvent(getTarget(),
WindowEvent.WINDOW_STATE_CHANGED,
windowState, newWindowState);
postEvent(stateChangedEvent);
windowState = newWindowState;
+
+ updateSecurityWarningVisibility();
}
private static int getGraphicsConfigScreen(GraphicsConfiguration gc) {
@@ -1187,10 +1250,12 @@
public void enterFullScreenMode() {
platformWindow.enterFullScreenMode();
+ updateSecurityWarningVisibility();
}
public void exitFullScreenMode() {
platformWindow.exitFullScreenMode();
+ updateSecurityWarningVisibility();
}
public long getLayerPtr() {
@@ -1225,6 +1290,33 @@
return peerType;
}
+ public void updateSecurityWarningVisibility() {
+ if (warningWindow == null) {
+ return;
+ }
+
+ if (!isVisible()) {
+ return; // The warning window should already be hidden.
+ }
+
+ boolean show = false;
+
+ if (!platformWindow.isFullScreenMode()) {
+ if (isVisible()) {
+ if (LWKeyboardFocusManagerPeer.getInstance().getCurrentFocusedWindow() ==
+ getTarget()) {
+ show = true;
+ }
+
+ if (platformWindow.isUnderMouse() || warningWindow.isUnderMouse()) {
+ show = true;
+ }
+ }
+ }
+
+ warningWindow.setVisible(show, true);
+ }
+
@Override
public String toString() {
return super.toString() + " [target is " + getTarget() + "]";