jdk/src/solaris/classes/sun/awt/X11/XClipboard.java
changeset 2 90ce3da70b43
child 117 766ae458aaf1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/solaris/classes/sun/awt/X11/XClipboard.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.awt.X11;
+
+import java.awt.datatransfer.Transferable;
+
+import java.util.SortedMap;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.HashSet;
+
+import java.io.IOException;
+
+import java.security.AccessController;
+
+import sun.awt.datatransfer.DataTransferer;
+import sun.awt.datatransfer.SunClipboard;
+import sun.awt.datatransfer.ClipboardTransferable;
+
+import sun.security.action.GetIntegerAction;
+
+
+
+/**
+ * A class which interfaces with the X11 selection service in order to support
+ * data transfer via Clipboard operations.
+ */
+public class XClipboard extends SunClipboard implements Runnable {
+    private final XSelection selection;
+
+    private static final Object classLock = new Object();
+
+    private static final int defaultPollInterval = 200;
+
+    private static int pollInterval;
+
+    private static Set listenedClipboards;
+
+
+    /**
+     * Creates a system clipboard object.
+     */
+    public XClipboard(String name, String selectionName) {
+        super(name);
+        selection = new XSelection(XAtom.get(selectionName), this);
+    }
+
+    /**
+     * The action to be run when we lose ownership
+     * NOTE: This method may be called by privileged threads.
+     *       DO NOT INVOKE CLIENT CODE ON THIS THREAD!
+     */
+    public void run() {
+        lostOwnershipImpl();
+    }
+
+    protected synchronized void setContentsNative(Transferable contents) {
+        SortedMap formatMap = DataTransferer.getInstance().getFormatsForTransferable
+                (contents, DataTransferer.adaptFlavorMap(flavorMap));
+        long[] formats =
+            DataTransferer.getInstance().keysToLongArray(formatMap);
+
+        if (!selection.setOwner(contents, formatMap, formats,
+                                XToolkit.getCurrentServerTime())) {
+            this.owner = null;
+            this.contents = null;
+        }
+    }
+
+    public long getID() {
+        return selection.getSelectionAtom().getAtom();
+    }
+
+    public synchronized Transferable getContents(Object requestor) {
+        if (contents != null) {
+            return contents;
+        }
+        return new ClipboardTransferable(this);
+    }
+
+    /* Caller is synchronized on this. */
+    protected void clearNativeContext() {
+        selection.reset();
+    }
+
+
+    protected long[] getClipboardFormats() {
+        return selection.getTargets(XToolkit.getCurrentServerTime());
+    }
+
+    protected byte[] getClipboardData(long format) throws IOException {
+        return selection.getData(format, XToolkit.getCurrentServerTime());
+    }
+
+    // Called on the toolkit thread under awtLock.
+    public void checkChange(long[] formats) {
+        if (!selection.isOwner()) {
+            super.checkChange(formats);
+        }
+    }
+
+    void checkChangeHere(Transferable contents) {
+        if (areFlavorListenersRegistered()) {
+            super.checkChange(DataTransferer.getInstance().
+                        getFormatsForTransferableAsArray(contents, flavorMap));
+        }
+    }
+
+    protected void registerClipboardViewerChecked() {
+        if (pollInterval <= 0) {
+            pollInterval = ((Integer)AccessController.doPrivileged(
+                    new GetIntegerAction("awt.datatransfer.clipboard.poll.interval",
+                                         defaultPollInterval))).intValue();
+            if (pollInterval <= 0) {
+                pollInterval = defaultPollInterval;
+            }
+        }
+        selection.initializeSelectionForTrackingChanges();
+        boolean mustSchedule = false;
+        synchronized (XClipboard.classLock) {
+            if (listenedClipboards == null) {
+                listenedClipboards = new HashSet(2);
+            }
+            mustSchedule = listenedClipboards.isEmpty();
+            listenedClipboards.add(this);
+        }
+        if (mustSchedule) {
+            XToolkit.schedule(new CheckChangeTimerTask(), pollInterval);
+        }
+    }
+
+    private static class CheckChangeTimerTask implements Runnable {
+        public void run() {
+            for (Iterator iter = listenedClipboards.iterator(); iter.hasNext();) {
+                XClipboard clpbrd = (XClipboard)iter.next();
+                clpbrd.selection.getTargetsDelayed();
+            }
+            synchronized (XClipboard.classLock) {
+                if (listenedClipboards != null && !listenedClipboards.isEmpty()) {
+                    XToolkit.schedule(this, pollInterval);
+                }
+            }
+        }
+    }
+
+    protected void unregisterClipboardViewerChecked() {
+        selection.deinitializeSelectionForTrackingChanges();
+        synchronized (XClipboard.classLock) {
+            listenedClipboards.remove(this);
+        }
+    }
+
+}