diff options
Diffstat (limited to 'libjava/classpath/java/awt/datatransfer')
-rw-r--r-- | libjava/classpath/java/awt/datatransfer/Clipboard.java | 123 | ||||
-rw-r--r-- | libjava/classpath/java/awt/datatransfer/DataFlavor.java | 55 |
2 files changed, 139 insertions, 39 deletions
diff --git a/libjava/classpath/java/awt/datatransfer/Clipboard.java b/libjava/classpath/java/awt/datatransfer/Clipboard.java index 9953a724dba..5fa1d1ab134 100644 --- a/libjava/classpath/java/awt/datatransfer/Clipboard.java +++ b/libjava/classpath/java/awt/datatransfer/Clipboard.java @@ -1,5 +1,5 @@ /* Clipboard.java -- Class for transferring data via cut and paste. - Copyright (C) 1999, 2001 Free Software Foundation, Inc. + Copyright (C) 1999, 2001, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,16 +38,21 @@ exception statement from your version. */ package java.awt.datatransfer; +import java.io.IOException; +import java.util.ArrayList; + /** * This class allows data to be transferred using a cut and paste type * mechanism. * * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Mark J. Wielaard (mark@klomp.org) */ public class Clipboard { /** - * The data being transferred. + * The data currently on this clipboard. For use by + * subclasses. Also returned by the public method getContents(). */ protected Transferable contents; @@ -57,7 +62,10 @@ public class Clipboard protected ClipboardOwner owner; // The clipboard name - private String name; + private final String name; + + // The flavor listeners (most likely small). + private final ArrayList listeners = new ArrayList(3); /** * Initializes a new instance of <code>Clipboard</code> with the @@ -81,7 +89,8 @@ public class Clipboard /** * Returns the contents of the clipboard. * - * @param requestor The object requesting the contents. + * @param requestor The object requesting the contents. This + * implementation ignores this parameter. * * @exception IllegalStateException If the clipboard is currently unavailable */ @@ -91,24 +100,108 @@ public class Clipboard } /** - * Sets the content and owner of this clipboard. - * If the given owner is different from the current owner - * then lostOwnership is called on the current owner. - * XXX - is this called with the old or new contents. + * Sets the content and owner of this clipboard. If the given owner + * is different from the current owner then <code>lostOwnership()</code> + * is called on the current owner with the old contents of the given + * clipboard. * * @param contents The new clipboard contents. * @param owner The new clipboard owner * * @exception IllegalStateException If the clipboard is currently unavailable */ - public synchronized void setContents(Transferable contents, ClipboardOwner owner) + public synchronized void setContents(Transferable contents, + ClipboardOwner owner) { - if (this.owner != owner) - if (this.owner != null) - this.owner.lostOwnership(this, contents); - - this.owner = owner; + Transferable oldContents = getContents(null); this.contents = contents; + if (this.owner != owner) + { + ClipboardOwner oldOwner = this.owner; + this.owner = owner; + if (oldOwner != null) + oldOwner.lostOwnership(this, oldContents); + } + + FlavorListener[] fs = getFlavorListeners(); + if (fs.length > 0) + { + // We are a bit optimistic here. We assume DataFlavors will be + // given in the same order. If the number of flavors is + // different or the order of the DataFlavors in the list then + // fire a change event. + boolean newFlavors = ((contents != null && oldContents == null) + || (contents == null && oldContents != null)); + if (!newFlavors && contents != null && oldContents != null) + { + DataFlavor[] df1 = contents.getTransferDataFlavors(); + DataFlavor[] df2 = oldContents.getTransferDataFlavors(); + newFlavors = df1.length != df2.length; + + for (int i = 0; !newFlavors && i < df1.length; i++) + newFlavors = !df1[i].equals(df2[i]); + } + + if (newFlavors) + { + FlavorEvent e = new FlavorEvent(this); + for (int i = 0; i < fs.length; i++) + fs[i].flavorsChanged(e); + } + } + } + + public DataFlavor[] getAvailableDataFlavors() + { + Transferable c = getContents(null); + if (c == null) + return new DataFlavor[0]; + else + return c.getTransferDataFlavors(); + } + + public boolean isDataFlavorAvailable(DataFlavor flavor) + { + DataFlavor[] fs = getAvailableDataFlavors(); + for (int i = 0; i < fs.length; i++) + if (flavor.equals(fs[i])) + return true; + + return false; } -} + public Object getData(DataFlavor flavor) + throws UnsupportedFlavorException, IOException + { + Transferable c = getContents(null); + if (c == null) + throw new UnsupportedFlavorException(flavor); + else + return c.getTransferData(flavor); + } + + public void addFlavorListener(FlavorListener listener) + { + synchronized(listeners) + { + listeners.add(listener); + } + } + + public void removeFlavorListener(FlavorListener listener) + { + synchronized(listeners) + { + listeners.remove(listener); + } + } + + public FlavorListener[] getFlavorListeners() + { + synchronized(listeners) + { + return (FlavorListener[]) + listeners.toArray(new FlavorListener[listeners.size()]); + } + } +} diff --git a/libjava/classpath/java/awt/datatransfer/DataFlavor.java b/libjava/classpath/java/awt/datatransfer/DataFlavor.java index e5fbd240293..38f415b7526 100644 --- a/libjava/classpath/java/awt/datatransfer/DataFlavor.java +++ b/libjava/classpath/java/awt/datatransfer/DataFlavor.java @@ -49,6 +49,7 @@ import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.CharBuffer; +import java.rmi.Remote; /** * This class represents a particular data format used for transferring @@ -127,10 +128,9 @@ static javaFileListFlavor = new DataFlavor(java.util.List.class, + "application/x-java-file-list; class=java.util.List", "Java File List"); - // javaFileListFlavor.mimeType = "application/x-java-file-list"; - imageFlavor = new DataFlavor(java.awt.Image.class, "Java Image"); @@ -335,7 +335,8 @@ getRepresentationClassFromMime(String mimeString, ClassLoader classLoader) public DataFlavor(String mimeType, String humanPresentableName) { - this (getRepresentationClassFromMime (mimeType, null), humanPresentableName); + this (getRepresentationClassFromMime (mimeType, null), + mimeType, humanPresentableName); } /*************************************************************************/ @@ -426,17 +427,15 @@ getPrimaryType() public String getSubType() { - int idx = mimeType.indexOf("/"); - if (idx == -1) - return(""); - - String subtype = mimeType.substring(idx + 1); + int start = mimeType.indexOf("/"); + if (start == -1) + return ""; - idx = subtype.indexOf(" "); - if (idx == -1) - return(subtype); + int end = mimeType.indexOf(";", start + 1); + if (end == -1) + return mimeType.substring(start + 1); else - return(subtype.substring(0, idx)); + return mimeType.substring(start + 1, end); } /*************************************************************************/ @@ -480,6 +479,9 @@ getParameter(String paramName, String mimeString) public String getParameter(String paramName) { + if ("humanPresentableName".equals(paramName)) + return getHumanPresentableName(); + return getParameter(paramName, mimeType); } @@ -500,21 +502,28 @@ setHumanPresentableName(String humanPresentableName) /** * Tests the MIME type of this object for equality against the specified - * MIME type. + * MIME type. Ignores parameters. * * @param mimeType The MIME type to test against. * * @return <code>true</code> if the MIME type is equal to this object's - * MIME type, <code>false</code> otherwise. + * MIME type (ignoring parameters), <code>false</code> otherwise. * * @exception NullPointerException If mimeType is null. */ public boolean isMimeTypeEqual(String mimeType) { - // FIXME: Need to handle default attributes and parameters + String mime = getMimeType(); + int i = mime.indexOf(";"); + if (i != -1) + mime = mime.substring(0, i); + + i = mimeType.indexOf(";"); + if (i != -1) + mimeType = mimeType.substring(0, i); - return(this.mimeType.equals(mimeType)); + return mime.equals(mimeType); } /*************************************************************************/ @@ -599,8 +608,7 @@ isRepresentationClassSerializable() public boolean isRepresentationClassRemote() { - // FIXME: Implement - throw new RuntimeException("Not implemented"); + return Remote.class.isAssignableFrom (representationClass); } /*************************************************************************/ @@ -852,12 +860,11 @@ readExternal(ObjectInput stream) throws IOException, ClassNotFoundException public String toString() { - return("DataFlavor[representationClass=" - + representationClass.getName() - + ",mimeType=" - + mimeType - + "humanPresentableName=" - + humanPresentableName); + return(getClass().getName() + + "[representationClass=" + getRepresentationClass().getName() + + ",mimeType=" + getMimeType() + + ",humanPresentableName=" + getHumanPresentableName() + + "]"); } /*************************************************************************/ |