src/share/classes/sun/awt/datatransfer/SunClipboard.java
Print this page
*** 38,57 ****
import java.awt.datatransfer.UnsupportedFlavorException;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
! import java.util.Iterator;
import java.util.Set;
import java.util.HashSet;
import java.io.IOException;
import sun.awt.AppContext;
import sun.awt.PeerEvent;
import sun.awt.SunToolkit;
- import sun.awt.EventListenerAggregate;
/**
* Serves as a common, helper superclass for the Win32 and X11 system
* Clipboards.
--- 38,56 ----
import java.awt.datatransfer.UnsupportedFlavorException;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
! import java.util.Objects;
import java.util.Set;
import java.util.HashSet;
import java.io.IOException;
import sun.awt.AppContext;
import sun.awt.PeerEvent;
import sun.awt.SunToolkit;
/**
* Serves as a common, helper superclass for the Win32 and X11 system
* Clipboards.
*** 108,122 ****
this.contents = new TransferableProxy(contents, true);
setContentsNative(contents);
} finally {
if (oldOwner != null && oldOwner != owner) {
! EventQueue.invokeLater(new Runnable() {
! public void run() {
! oldOwner.lostOwnership(SunClipboard.this, oldContents);
! }
! });
}
}
}
private synchronized void initContext() {
--- 107,117 ----
this.contents = new TransferableProxy(contents, true);
setContentsNative(contents);
} finally {
if (oldOwner != null && oldOwner != owner) {
! EventQueue.invokeLater(() -> oldOwner.lostOwnership(SunClipboard.this, oldContents));
}
}
}
private synchronized void initContext() {
*** 356,372 ****
public synchronized void addFlavorListener(FlavorListener listener) {
if (listener == null) {
return;
}
AppContext appContext = AppContext.getAppContext();
! EventListenerAggregate contextFlavorListeners = (EventListenerAggregate)
! appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY);
! if (contextFlavorListeners == null) {
! contextFlavorListeners = new EventListenerAggregate(FlavorListener.class);
! appContext.put(CLIPBOARD_FLAVOR_LISTENER_KEY, contextFlavorListeners);
}
! contextFlavorListeners.add(listener);
if (numberOfFlavorListeners++ == 0) {
long[] currentFormats = null;
try {
openClipboard(null);
--- 351,366 ----
public synchronized void addFlavorListener(FlavorListener listener) {
if (listener == null) {
return;
}
AppContext appContext = AppContext.getAppContext();
! Set<FlavorListener> flavorListeners = getFlavorListeners(appContext);
! if (flavorListeners == null) {
! flavorListeners = new HashSet<>();
! appContext.put(CLIPBOARD_FLAVOR_LISTENER_KEY, flavorListeners);
}
! flavorListeners.add(listener);
if (numberOfFlavorListeners++ == 0) {
long[] currentFormats = null;
try {
openClipboard(null);
*** 383,411 ****
public synchronized void removeFlavorListener(FlavorListener listener) {
if (listener == null) {
return;
}
! AppContext appContext = AppContext.getAppContext();
! EventListenerAggregate contextFlavorListeners = (EventListenerAggregate)
! appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY);
! if (contextFlavorListeners == null){
//else we throw NullPointerException, but it is forbidden
return;
}
! if (contextFlavorListeners.remove(listener) &&
! --numberOfFlavorListeners == 0) {
unregisterClipboardViewerChecked();
currentDataFlavors = null;
}
}
public synchronized FlavorListener[] getFlavorListeners() {
! EventListenerAggregate contextFlavorListeners = (EventListenerAggregate)
! AppContext.getAppContext().get(CLIPBOARD_FLAVOR_LISTENER_KEY);
! return contextFlavorListeners == null ? new FlavorListener[0] :
! (FlavorListener[])contextFlavorListeners.getListenersCopy();
}
public boolean areFlavorListenersRegistered() {
return (numberOfFlavorListeners > 0);
}
--- 377,406 ----
public synchronized void removeFlavorListener(FlavorListener listener) {
if (listener == null) {
return;
}
! Set<FlavorListener> flavorListeners = getFlavorListeners(AppContext.getAppContext());
! if (flavorListeners == null){
//else we throw NullPointerException, but it is forbidden
return;
}
! if (flavorListeners.remove(listener) && --numberOfFlavorListeners == 0) {
unregisterClipboardViewerChecked();
currentDataFlavors = null;
}
}
+ @SuppressWarnings("unchecked")
+ private Set<FlavorListener> getFlavorListeners(AppContext appContext) {
+ return (Set<FlavorListener>)appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY);
+ }
+
public synchronized FlavorListener[] getFlavorListeners() {
! Set<FlavorListener> flavorListeners = getFlavorListeners(AppContext.getAppContext());
! return flavorListeners == null ? new FlavorListener[0]
! : flavorListeners.toArray(new FlavorListener[flavorListeners.size()]);
}
public boolean areFlavorListenersRegistered() {
return (numberOfFlavorListeners > 0);
}
*** 422,472 ****
* failed to get formats available on the clipboard.
*
* @param formats data formats that have just been retrieved from
* this clipboard
*/
! public void checkChange(long[] formats) {
Set prevDataFlavors = currentDataFlavors;
currentDataFlavors = formatArrayAsDataFlavorSet(formats);
! if ((prevDataFlavors != null) && (currentDataFlavors != null) &&
! prevDataFlavors.equals(currentDataFlavors)) {
// we've been able to successfully get available on the clipboard
// DataFlavors this and previous time and they are coincident;
// don't notify
return;
}
! class SunFlavorChangeNotifier implements Runnable {
! private final FlavorListener flavorListener;
!
! SunFlavorChangeNotifier(FlavorListener flavorListener) {
! this.flavorListener = flavorListener;
! }
!
! public void run() {
! if (flavorListener != null) {
! flavorListener.flavorsChanged(new FlavorEvent(SunClipboard.this));
! }
! }
! };
!
! for (Iterator it = AppContext.getAppContexts().iterator(); it.hasNext();) {
! AppContext appContext = (AppContext)it.next();
if (appContext == null || appContext.isDisposed()) {
continue;
}
! EventListenerAggregate flavorListeners = (EventListenerAggregate)
! appContext.get(CLIPBOARD_FLAVOR_LISTENER_KEY);
if (flavorListeners != null) {
! FlavorListener[] flavorListenerArray =
! (FlavorListener[])flavorListeners.getListenersInternal();
! for (int i = 0; i < flavorListenerArray.length; i++) {
! SunToolkit.postEvent(appContext, new PeerEvent(this,
! new SunFlavorChangeNotifier(flavorListenerArray[i]),
! PeerEvent.PRIORITY_EVENT));
}
}
}
}
-
}
--- 417,450 ----
* failed to get formats available on the clipboard.
*
* @param formats data formats that have just been retrieved from
* this clipboard
*/
! public synchronized void checkChange(long[] formats) {
Set prevDataFlavors = currentDataFlavors;
currentDataFlavors = formatArrayAsDataFlavorSet(formats);
! if (Objects.equals(prevDataFlavors, currentDataFlavors)) {
// we've been able to successfully get available on the clipboard
// DataFlavors this and previous time and they are coincident;
// don't notify
return;
}
! for (AppContext appContext : AppContext.getAppContexts()) {
if (appContext == null || appContext.isDisposed()) {
continue;
}
! Set<FlavorListener> flavorListeners = getFlavorListeners(appContext);
if (flavorListeners != null) {
! for (FlavorListener listener : flavorListeners) {
! if (listener != null) {
! PeerEvent peerEvent = new PeerEvent(this,
! () -> listener.flavorsChanged(new FlavorEvent(SunClipboard.this)),
! PeerEvent.PRIORITY_EVENT);
! SunToolkit.postEvent(appContext, peerEvent);
! }
}
}
}
}
}