--- old/src/java.desktop/windows/classes/sun/awt/windows/WDesktopPeer.java 2015-11-20 08:17:43.567843626 +0300 +++ new/src/java.desktop/windows/classes/sun/awt/windows/WDesktopPeer.java 2015-11-20 08:17:43.451843570 +0300 @@ -26,11 +26,18 @@ package sun.awt.windows; +import java.awt.AppEvent; import java.awt.Desktop.Action; +import java.awt.EventQueue; +import java.awt.desktop.SystemEventListener; +import java.awt.desktop.SystemSleepListener; +import java.awt.desktop.UserSessionListener; import java.awt.peer.DesktopPeer; import java.io.File; import java.io.IOException; import java.net.URI; +import javax.swing.event.EventListenerList; +import sun.awt.OSInfo; /** @@ -44,11 +51,33 @@ private static String ACTION_OPEN_VERB = "open"; private static String ACTION_EDIT_VERB = "edit"; private static String ACTION_PRINT_VERB = "print"; - + + private static boolean isEventUserSessionSupported = false; + + private static native void init(); + + WDesktopPeer() { + init(); + isEventUserSessionSupported = OSInfo.getWindowsVersion() + .compareTo(OSInfo.WINDOWS_VISTA) >= 0; + } + @Override public boolean isSupported(Action action) { - // OPEN, EDIT, PRINT, MAIL, BROWSE all supported on windows. - return true; + switch(action) { + case OPEN: + case EDIT: + case PRINT: + case MAIL: + case BROWSE: + case MOVE_TO_TRASH: + case APP_EVENT_SYSTEM_SLEEP: + return true; + case APP_EVENT_USER_SESSION: + return isEventUserSessionSupported; + default: + return false; + } } @Override @@ -93,5 +122,59 @@ } private static native String ShellExecute(String fileOrUri, String verb); - + + private static final EventListenerList listenerList = new EventListenerList(); + + @Override + public void addAppEventListener(final SystemEventListener listener) { + if (listener instanceof UserSessionListener) { + listenerList.add(UserSessionListener.class, (UserSessionListener) listener); + } + if (listener instanceof SystemSleepListener) { + listenerList.add(SystemSleepListener.class, (SystemSleepListener) listener); + } + } + + @Override + public void removeAppEventListener(final SystemEventListener listener) { + if (listener instanceof UserSessionListener) { + listenerList.remove(UserSessionListener.class, (UserSessionListener) listener); + } + if (listener instanceof SystemSleepListener) { + listenerList.remove(SystemSleepListener.class, (SystemSleepListener) listener); + } + } + + private static void userSessionCallback(boolean activated) { + UserSessionListener[] listeners = listenerList.getListeners(UserSessionListener.class); + for (UserSessionListener use : listeners) { + EventQueue.invokeLater(() -> { + if (activated) { + use.userSessionActivated(new AppEvent.UserSessionEvent()); + } else { + use.userSessionDeactivated(new AppEvent.UserSessionEvent()); + } + }); + } + } + + private static void systemSleepCallback(boolean resumed) { + SystemSleepListener[] listeners = listenerList.getListeners(SystemSleepListener.class); + for (SystemSleepListener ssl : listeners) { + EventQueue.invokeLater(() -> { + if (resumed) { + ssl.systemAwoke(new AppEvent.SystemSleepEvent()); + } else { + ssl.systemAboutToSleep(new AppEvent.SystemSleepEvent()); + } + }); + } + } + + @Override + public boolean moveToTrash(File file) { + return moveToTrash(file.getAbsolutePath()); + } + private static native boolean moveToTrash(String file); + }