diff options
Diffstat (limited to 'libjava/classpath/gnu/java/awt/peer/gtk/GtkSelection.java')
-rw-r--r-- | libjava/classpath/gnu/java/awt/peer/gtk/GtkSelection.java | 675 |
1 files changed, 0 insertions, 675 deletions
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkSelection.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkSelection.java deleted file mode 100644 index 78ed696763b..00000000000 --- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkSelection.java +++ /dev/null @@ -1,675 +0,0 @@ -/* GtkClipboard.java - Class representing gtk+ clipboard selection. - Copyright (C) 2005 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath 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 for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package gnu.java.awt.peer.gtk; - -import gnu.classpath.Pointer; - -import java.awt.datatransfer.*; - -import java.io.*; -import java.net.*; -import java.util.*; - -import java.awt.Image; - -/** - * Class representing the gtk+ clipboard selection. This is used when - * another program owns the clipboard. Whenever the system clipboard - * selection changes we create a new instance to notify the program - * that the available flavors might have changed. When requested it - * (lazily) caches the targets, and (text, image, or files/uris) - * clipboard contents. - */ -public class GtkSelection implements Transferable -{ - /** - * Static lock used for requests of mimetypes and contents retrieval. - */ - static private Object requestLock = new Object(); - - /** - * Whether we belong to the Clipboard (true) or to the Primary selection. - */ - private final boolean clipboard; - - /** - * Whether a request for mimetypes, text, images, uris or byte[] is - * currently in progress. Should only be tested or set with - * requestLock held. When true no other requests should be made till - * it is false again. - */ - private boolean requestInProgress; - - /** - * Indicates a requestMimeTypes() call was made and the - * corresponding mimeTypesAvailable() callback was triggered. - */ - private boolean mimeTypesDelivered; - - /** - * Set and returned by getTransferDataFlavors. Only valid when - * mimeTypesDelivered is true. - */ - private DataFlavor[] dataFlavors; - - /** - * Indicates a requestText() call was made and the corresponding - * textAvailable() callback was triggered. - */ - private boolean textDelivered; - - /** - * Set as response to a requestText() call and possibly returned by - * getTransferData() for text targets. Only valid when textDelivered - * is true. - */ - private String text; - - /** - * Indicates a requestImage() call was made and the corresponding - * imageAvailable() callback was triggered. - */ - private boolean imageDelivered; - - /** - * Set as response to a requestImage() call and possibly returned by - * getTransferData() for image targets. Only valid when - * imageDelivered is true and image is null. - */ - private Pointer imagePointer; - - /** - * Cached image value. Only valid when imageDelivered is - * true. Created from imagePointer. - */ - private Image image; - - /** - * Indicates a requestUris() call was made and the corresponding - * urisAvailable() callback was triggered. - */ - private boolean urisDelivered; - - /** - * Set as response to a requestURIs() call. Only valid when - * urisDelivered is true - */ - private List<File> uris; - - /** - * Indicates a requestBytes(String) call was made and the - * corresponding bytesAvailable() callback was triggered. - */ - private boolean bytesDelivered; - - /** - * Set as response to a requestBytes(String) call. Only valid when - * bytesDelivered is true. - */ - private byte[] bytes; - - /** - * Should only be created by the GtkClipboard class. The clipboard - * should be either GtkClipboard.clipboard or - * GtkClipboard.selection. - */ - GtkSelection(GtkClipboard clipboard) - { - this.clipboard = (clipboard == GtkClipboard.clipboard); - } - - /** - * Gets an array of mime-type strings from the gtk+ clipboard and - * transforms them into an array of DataFlavors. - */ - public DataFlavor[] getTransferDataFlavors() - { - DataFlavor[] result; - synchronized (requestLock) - { - // Did we request already and cache the result? - if (mimeTypesDelivered) - result = (DataFlavor[]) dataFlavors.clone(); - else - { - // Wait till there are no pending requests. - while (requestInProgress) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - - // If nobody else beat us and cached the result we try - // ourselves to get it. - if (! mimeTypesDelivered) - { - requestInProgress = true; - requestMimeTypes(clipboard); - while (! mimeTypesDelivered) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - requestInProgress = false; - } - result = dataFlavors; - if (! GtkClipboard.canCache) - { - dataFlavors = null; - mimeTypesDelivered = false; - } - requestLock.notifyAll(); - } - } - return result; - } - - /** - * Callback that sets the available DataFlavors[]. Note that this - * should not call any code that could need the main gdk lock. - */ - private void mimeTypesAvailable(String[] mimeTypes) - { - synchronized (requestLock) - { - if (mimeTypes == null) - dataFlavors = new DataFlavor[0]; - else - { - // Most likely the mimeTypes include text in which case we add an - // extra element. - ArrayList<DataFlavor> flavorsList = - new ArrayList<DataFlavor>(mimeTypes.length + 1); - - for (int i = 0; i < mimeTypes.length; i++) - { - try - { - if (mimeTypes[i] == GtkClipboard.stringMimeType) - { - // XXX - Fix DataFlavor.getTextPlainUnicodeFlavor() - // and also add it to the list. - flavorsList.add(DataFlavor.stringFlavor); - flavorsList.add(DataFlavor.plainTextFlavor); - } - else if (mimeTypes[i] == GtkClipboard.imageMimeType) - flavorsList.add(DataFlavor.imageFlavor); - else if (mimeTypes[i] == GtkClipboard.filesMimeType) - flavorsList.add(DataFlavor.javaFileListFlavor); - else - { - // We check the target to prevent duplicates - // of the "magic" targets above. - DataFlavor target = new DataFlavor(mimeTypes[i]); - if (! flavorsList.contains(target)) - flavorsList.add(target); - } - } - catch (ClassNotFoundException cnfe) - { - cnfe.printStackTrace(); - } - catch (NullPointerException npe) - { - npe.printStackTrace(); - } - } - - dataFlavors = new DataFlavor[flavorsList.size()]; - flavorsList.toArray(dataFlavors); - } - - mimeTypesDelivered = true; - requestLock.notifyAll(); - } - } - - /** - * Gets the available data flavors for this selection and checks - * that at least one of them is equal to the given DataFlavor. - */ - public boolean isDataFlavorSupported(DataFlavor flavor) - { - DataFlavor[] dfs = getTransferDataFlavors(); - for (int i = 0; i < dfs.length; i++) - if (flavor.equals(dfs[i])) - return true; - - return false; - } - - /** - * Helper method that tests whether we already have the text for the - * current gtk+ selection on the clipboard and if not requests it - * and waits till it is available. - */ - private String getText() - { - String result; - synchronized (requestLock) - { - // Did we request already and cache the result? - if (textDelivered) - result = text; - else - { - // Wait till there are no pending requests. - while (requestInProgress) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - - // If nobody else beat us we try ourselves to get and - // caching the result. - if (! textDelivered) - { - requestInProgress = true; - requestText(clipboard); - while (! textDelivered) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - requestInProgress = false; - } - result = text; - if (! GtkClipboard.canCache) - { - text = null; - textDelivered = false; - } - requestLock.notifyAll(); - } - } - return result; - } - - /** - * Callback that sets the available text on the clipboard. Note that - * this should not call any code that could need the main gdk lock. - */ - private void textAvailable(String text) - { - synchronized (requestLock) - { - this.text = text; - textDelivered = true; - requestLock.notifyAll(); - } - } - - /** - * Helper method that tests whether we already have an image for the - * current gtk+ selection on the clipboard and if not requests it - * and waits till it is available. - */ - private Image getImage() - { - Image result; - synchronized (requestLock) - { - // Did we request already and cache the result? - if (imageDelivered) - result = image; - else - { - // Wait till there are no pending requests. - while (requestInProgress) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - - // If nobody else beat us we try ourselves to get and - // caching the result. - if (! imageDelivered) - { - requestInProgress = true; - requestImage(clipboard); - while (! imageDelivered) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - requestInProgress = false; - } - - if (imagePointer != null) - image = new GtkImage(imagePointer); - - imagePointer = null; - result = image; - if (! GtkClipboard.canCache) - { - image = null; - imageDelivered = false; - } - requestLock.notifyAll(); - } - } - return result; - } - - /** - * Callback that sets the available image on the clipboard. Note - * that this should not call any code that could need the main gdk - * lock. Note that we get a Pointer to a GdkPixbuf which we cannot - * turn into a real GtkImage at this point. That will be done on the - * "user thread" in getImage(). - */ - private void imageAvailable(Pointer pointer) - { - synchronized (requestLock) - { - this.imagePointer = pointer; - imageDelivered = true; - requestLock.notifyAll(); - } - } - - /** - * Helper method that test whether we already have a list of - * URIs/Files and if not requests them and waits till they are - * available. - */ - private List<File> getURIs() - { - List<File> result; - synchronized (requestLock) - { - // Did we request already and cache the result? - if (urisDelivered) - result = uris; - else - { - // Wait till there are no pending requests. - while (requestInProgress) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - - // If nobody else beat us we try ourselves to get and - // caching the result. - if (! urisDelivered) - { - requestInProgress = true; - requestURIs(clipboard); - while (! urisDelivered) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - requestInProgress = false; - } - result = uris; - if (! GtkClipboard.canCache) - { - uris = null; - urisDelivered = false; - } - requestLock.notifyAll(); - } - } - return result; - } - - /** - * Callback that sets the available File list. Note that this should - * not call any code that could need the main gdk lock. - */ - private void urisAvailable(String[] uris) - { - synchronized (requestLock) - { - if (uris != null && uris.length != 0) - { - ArrayList<File> list = new ArrayList<File>(uris.length); - for (int i = 0; i < uris.length; i++) - { - try - { - URI uri = new URI(uris[i]); - if (uri.getScheme().equals("file")) - list.add(new File(uri)); - } - catch (URISyntaxException use) - { - } - } - this.uris = list; - } - - urisDelivered = true; - requestLock.notifyAll(); - } - } - - /** - * Helper method that requests a byte[] for the given target - * mime-type flavor and waits till it is available. Note that unlike - * the other get methods this one doesn't cache the result since - * there are possibly many targets. - */ - private byte[] getBytes(String target) - { - byte[] result; - synchronized (requestLock) - { - // Wait till there are no pending requests. - while (requestInProgress) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - - // Request bytes and wait till they are available. - requestInProgress = true; - requestBytes(clipboard, target); - while (! bytesDelivered) - { - try - { - requestLock.wait(); - } - catch (InterruptedException ie) - { - // ignored - } - } - result = bytes; - bytes = null; - bytesDelivered = false; - requestInProgress = false; - - requestLock.notifyAll(); - } - return result; - } - - /** - * Callback that sets the available byte array on the - * clipboard. Note that this should not call any code that could - * need the main gdk lock. - */ - private void bytesAvailable(byte[] bytes) - { - synchronized (requestLock) - { - this.bytes = bytes; - bytesDelivered = true; - requestLock.notifyAll(); - } - } - - public Object getTransferData(DataFlavor flavor) - throws UnsupportedFlavorException - { - // Note the fall throughs for the "magic targets" if they fail we - // try one more time through getBytes(). - if (flavor.equals(DataFlavor.stringFlavor)) - { - String text = getText(); - if (text != null) - return text; - } - - if (flavor.equals(DataFlavor.plainTextFlavor)) - { - String text = getText(); - if (text != null) - return new StringBufferInputStream(text); - } - - if (flavor.equals(DataFlavor.imageFlavor)) - { - Image image = getImage(); - if (image != null) - return image; - } - - if (flavor.equals(DataFlavor.javaFileListFlavor)) - { - List<File> uris = getURIs(); - if (uris != null) - return uris; - } - - byte[] bytes = getBytes(flavor.getMimeType()); - if (bytes == null) - throw new UnsupportedFlavorException(flavor); - - if (flavor.isMimeTypeSerializedObject()) - { - try - { - ByteArrayInputStream bais = new ByteArrayInputStream(bytes); - ObjectInputStream ois = new ObjectInputStream(bais); - return ois.readObject(); - } - catch (IOException ioe) - { - ioe.printStackTrace(); - } - catch (ClassNotFoundException cnfe) - { - cnfe.printStackTrace(); - } - } - - if (flavor.isRepresentationClassInputStream()) - return new ByteArrayInputStream(bytes); - - // XXX, need some more conversions? - - throw new UnsupportedFlavorException(flavor); - } - - /* - * Requests text, Image or an byte[] for a particular target from the - * other application. These methods return immediately. When the - * content is available the contentLock will be notified through - * textAvailable, imageAvailable, urisAvailable or bytesAvailable and the - * appropriate field is set. - * The clipboard argument is true if we want the Clipboard, and false - * if we want the (primary) selection. - */ - private native void requestText(boolean clipboard); - private native void requestImage(boolean clipboard); - private native void requestURIs(boolean clipboard); - private native void requestBytes(boolean clipboard, String target); - - /* Similar to the above but for requesting the supported targets. */ - private native void requestMimeTypes(boolean clipboard); -} |