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); ! } } } } } }