aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/javax/swing/TransferHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/javax/swing/TransferHandler.java')
-rw-r--r--libjava/classpath/javax/swing/TransferHandler.java654
1 files changed, 0 insertions, 654 deletions
diff --git a/libjava/classpath/javax/swing/TransferHandler.java b/libjava/classpath/javax/swing/TransferHandler.java
deleted file mode 100644
index abf6e8c..0000000
--- a/libjava/classpath/javax/swing/TransferHandler.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/* TransferHandler.java --
- Copyright (C) 2004, 2005, 2006, 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 javax.swing;
-
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.awt.dnd.DragGestureEvent;
-import java.awt.dnd.DragGestureListener;
-import java.awt.dnd.DragGestureRecognizer;
-import java.awt.dnd.DragSource;
-import java.awt.dnd.DragSourceContext;
-import java.awt.dnd.DragSourceDragEvent;
-import java.awt.dnd.DragSourceDropEvent;
-import java.awt.dnd.DragSourceEvent;
-import java.awt.dnd.DragSourceListener;
-import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.MouseEvent;
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Method;
-
-public class TransferHandler implements Serializable
-{
-
- /**
- * An implementation of {@link Transferable} that can be used to export
- * data from a component's property.
- */
- private static class PropertyTransferable
- implements Transferable
- {
- /**
- * The component from which we export.
- */
- private JComponent component;
-
- /**
- * The property descriptor of the property that we handle.
- */
- private PropertyDescriptor property;
-
- /**
- * Creates a new PropertyTransferable.
- *
- * @param c the component from which we export
- * @param prop the property from which we export
- */
- PropertyTransferable(JComponent c, PropertyDescriptor prop)
- {
- component = c;
- property = prop;
- }
-
- /**
- * Returns the data flavors supported by the Transferable.
- *
- * @return the data flavors supported by the Transferable
- */
- public DataFlavor[] getTransferDataFlavors()
- {
- DataFlavor[] flavors;
- Class propClass = property.getPropertyType();
- String mime = DataFlavor.javaJVMLocalObjectMimeType + "; class="
- + propClass.getName();
- try
- {
- DataFlavor flavor = new DataFlavor(mime);
- flavors = new DataFlavor[]{ flavor };
- }
- catch (ClassNotFoundException ex)
- {
- flavors = new DataFlavor[0];
- }
- return flavors;
- }
-
- /**
- * Returns <code>true</code> when the specified data flavor is supported,
- * <code>false</code> otherwise.
- *
- * @return <code>true</code> when the specified data flavor is supported,
- * <code>false</code> otherwise
- */
- public boolean isDataFlavorSupported(DataFlavor flavor)
- {
- Class propClass = property.getPropertyType();
- return flavor.getPrimaryType().equals("application")
- && flavor.getSubType().equals("x-java-jvm-local-objectref")
- && propClass.isAssignableFrom(flavor.getRepresentationClass());
- }
-
- /**
- * Returns the actual transfer data.
- *
- * @param flavor the data flavor
- *
- * @return the actual transfer data
- */
- public Object getTransferData(DataFlavor flavor)
- throws UnsupportedFlavorException, IOException
- {
- if (isDataFlavorSupported(flavor))
- {
- Method getter = property.getReadMethod();
- Object o;
- try
- {
- o = getter.invoke(component);
- return o;
- }
- catch (Exception ex)
- {
- throw new IOException("Property read failed: "
- + property.getName());
- }
- }
- else
- throw new UnsupportedFlavorException(flavor);
- }
- }
-
- static class TransferAction extends AbstractAction
- {
- private String command;
-
- public TransferAction(String command)
- {
- super(command);
- this.command = command;
- }
-
- public void actionPerformed(ActionEvent event)
- {
- JComponent component = (JComponent) event.getSource();
- TransferHandler transferHandler = component.getTransferHandler();
- Clipboard clipboard = getClipboard(component);
-
- if (clipboard == null)
- {
- // Access denied!
- Toolkit.getDefaultToolkit().beep();
- return;
- }
-
- if (command.equals(COMMAND_COPY))
- transferHandler.exportToClipboard(component, clipboard, COPY);
- else if (command.equals(COMMAND_CUT))
- transferHandler.exportToClipboard(component, clipboard, MOVE);
- else if (command.equals(COMMAND_PASTE))
- {
- Transferable transferable = clipboard.getContents(null);
-
- if (transferable != null)
- transferHandler.importData(component, transferable);
- }
- }
-
- /**
- * Get the system cliboard or null if the caller isn't allowed to
- * access the system clipboard.
- *
- * @param component a component, used to get the toolkit.
- * @return the clipboard
- */
- private static Clipboard getClipboard(JComponent component)
- {
- try
- {
- return component.getToolkit().getSystemClipboard();
- }
- catch (SecurityException se)
- {
- return null;
- }
- }
- }
-
- private static class SwingDragGestureRecognizer extends DragGestureRecognizer
- {
-
- protected SwingDragGestureRecognizer(DragGestureListener dgl)
- {
- super(DragSource.getDefaultDragSource(), null, NONE, dgl);
- }
-
- void gesture(JComponent c, MouseEvent e, int src, int drag)
- {
- setComponent(c);
- setSourceActions(src);
- appendEvent(e);
- fireDragGestureRecognized(drag, e.getPoint());
- }
-
- protected void registerListeners()
- {
- // Nothing to do here.
- }
-
- protected void unregisterListeners()
- {
- // Nothing to do here.
- }
-
- }
-
- private static class SwingDragHandler
- implements DragGestureListener, DragSourceListener
- {
-
- private boolean autoscrolls;
-
- public void dragGestureRecognized(DragGestureEvent e)
- {
- JComponent c = (JComponent) e.getComponent();
- TransferHandler th = c.getTransferHandler();
- Transferable t = th.createTransferable(c);
- if (t != null)
- {
- autoscrolls = c.getAutoscrolls();
- c.setAutoscrolls(false);
- try
- {
- e.startDrag(null, t, this);
- return;
- }
- finally
- {
- c.setAutoscrolls(autoscrolls);
- }
- }
- th.exportDone(c, t, NONE);
- }
-
- public void dragDropEnd(DragSourceDropEvent e)
- {
- DragSourceContext ctx = e.getDragSourceContext();
- JComponent c = (JComponent) ctx.getComponent();
- TransferHandler th = c.getTransferHandler();
- if (e.getDropSuccess())
- {
- th.exportDone(c, ctx.getTransferable(), e.getDropAction());
- }
- else
- {
- th.exportDone(c, ctx.getTransferable(), e.getDropAction());
- }
- c.setAutoscrolls(autoscrolls);
- }
-
- public void dragEnter(DragSourceDragEvent e)
- {
- // Nothing to do here.
- }
-
- public void dragExit(DragSourceEvent e)
- {
- // Nothing to do here.
- }
-
- public void dragOver(DragSourceDragEvent e)
- {
- // Nothing to do here.
- }
-
- public void dropActionChanged(DragSourceDragEvent e)
- {
- // Nothing to do here.
- }
-
- }
-
- private static final long serialVersionUID = -967749805571669910L;
-
- private static final String COMMAND_COPY = "copy";
- private static final String COMMAND_CUT = "cut";
- private static final String COMMAND_PASTE = "paste";
-
- public static final int NONE = 0;
- public static final int COPY = 1;
- public static final int MOVE = 2;
- public static final int COPY_OR_MOVE = 3;
-
- private static Action copyAction = new TransferAction(COMMAND_COPY);
- private static Action cutAction = new TransferAction(COMMAND_CUT);
- private static Action pasteAction = new TransferAction(COMMAND_PASTE);
-
- private int sourceActions;
- private Icon visualRepresentation;
-
- /**
- * The name of the property into/from which this TransferHandler
- * imports/exports.
- */
- private String propertyName;
-
- /**
- * The DragGestureRecognizer for Swing.
- */
- private SwingDragGestureRecognizer recognizer;
-
- public static Action getCopyAction()
- {
- return copyAction;
- }
-
- public static Action getCutAction()
- {
- return cutAction;
- }
-
- public static Action getPasteAction()
- {
- return pasteAction;
- }
-
- protected TransferHandler()
- {
- this.sourceActions = NONE;
- }
-
- public TransferHandler(String property)
- {
- propertyName = property;
- this.sourceActions = property != null ? COPY : NONE;
- }
-
- /**
- * Returns <code>true</code> if the data in this TransferHandler can be
- * imported into the specified component. This will be the case when:
- * <ul>
- * <li>The component has a readable and writable property with the property
- * name specified in the TransferHandler constructor.</li>
- * <li>There is a dataflavor with a mime type of
- * <code>application/x-java-jvm-local-object-ref</code>.</li>
- * <li>The dataflavor's representation class matches the class of the
- * property in the component.</li>
- * </li>
- *
- * @param c the component to check
- * @param flavors the possible data flavors
- *
- * @return <code>true</code> if the data in this TransferHandler can be
- * imported into the specified component, <code>false</code>
- * otherwise
- */
- public boolean canImport(JComponent c, DataFlavor[] flavors)
- {
- PropertyDescriptor propDesc = getPropertyDescriptor(c);
- boolean canImport = false;
- if (propDesc != null)
- {
- // Check if the property is writable. The readable check is already
- // done in getPropertyDescriptor().
- Method writer = propDesc.getWriteMethod();
- if (writer != null)
- {
- Class[] params = writer.getParameterTypes();
- if (params.length == 1)
- {
- // Number of parameters ok, now check mime type and
- // representation class.
- DataFlavor flavor = getPropertyDataFlavor(params[0], flavors);
- if (flavor != null)
- canImport = true;
- }
- }
- }
- return canImport;
- }
-
- /**
- * Creates a {@link Transferable} that can be used to export data
- * from the specified component.
- *
- * This method returns <code>null</code> when the specified component
- * doesn't have a readable property that matches the property name
- * specified in the <code>TransferHandler</code> constructor.
- *
- * @param c the component to create a transferable for
- *
- * @return a {@link Transferable} that can be used to export data
- * from the specified component, or null if the component doesn't
- * have a readable property like the transfer handler
- */
- protected Transferable createTransferable(JComponent c)
- {
- Transferable transferable = null;
- if (propertyName != null)
- {
- PropertyDescriptor prop = getPropertyDescriptor(c);
- if (prop != null)
- transferable = new PropertyTransferable(c, prop);
- }
- return transferable;
- }
-
- public void exportAsDrag(JComponent c, InputEvent e, int action)
- {
- int src = getSourceActions(c);
- int drag = src & action;
- if (! (e instanceof MouseEvent))
- {
- drag = NONE;
- }
- if (drag != NONE)
- {
- if (recognizer == null)
- {
- SwingDragHandler ds = new SwingDragHandler();
- recognizer = new SwingDragGestureRecognizer(ds);
- }
- recognizer.gesture(c, (MouseEvent) e, src, drag);
- }
- else
- {
- exportDone(c, null, NONE);
- }
- }
-
- /**
- * This method is invoked after data has been exported.
- * Subclasses should implement this method to remove the data that has been
- * transferred when the action was <code>MOVE</code>.
- *
- * The default implementation does nothing because MOVE is not supported.
- *
- * @param c the source component
- * @param data the data that has been transferred or <code>null</code>
- * when the action is NONE
- * @param action the action that has been performed
- */
- protected void exportDone(JComponent c, Transferable data, int action)
- {
- // Nothing to do in the default implementation.
- }
-
- /**
- * Exports the property of the component <code>c</code> that was
- * specified for this TransferHandler to the clipboard, performing
- * the specified action.
- *
- * This will check if the action is allowed by calling
- * {@link #getSourceActions(JComponent)}. If the action is not allowed,
- * then no export is performed.
- *
- * In either case the method {@link #exportDone} will be called with
- * the action that has been performed, or {@link #NONE} if the action
- * was not allowed or could otherwise not be completed.
- * Any IllegalStateException that is thrown by the Clipboard due to
- * beeing unavailable will be propagated through this method.
- *
- * @param c the component from which to export
- * @param clip the clipboard to which the data will be exported
- * @param action the action to perform
- *
- * @throws IllegalStateException when the clipboard is not available
- */
- public void exportToClipboard(JComponent c, Clipboard clip, int action)
- throws IllegalStateException
- {
- action &= getSourceActions(c);
- Transferable transferable = createTransferable(c);
- if (transferable != null && action != NONE)
- {
- try
- {
- clip.setContents(transferable, null);
- exportDone(c, transferable, action);
- }
- catch (IllegalStateException ex)
- {
- exportDone(c, transferable, NONE);
- throw ex;
- }
- }
- else
- exportDone(c, null, NONE);
- }
-
- public int getSourceActions(JComponent c)
- {
- return sourceActions;
- }
-
- public Icon getVisualRepresentation(Transferable t)
- {
- return visualRepresentation;
- }
-
- /**
- * Imports the transfer data represented by <code>t</code> into the specified
- * component <code>c</code> by setting the property of this TransferHandler
- * on that component. If this succeeds, this method returns
- * <code>true</code>, otherwise <code>false</code>.
- *
- *
- * @param c the component to import into
- * @param t the transfer data to import
- *
- * @return <code>true</code> if the transfer succeeds, <code>false</code>
- * otherwise
- */
- public boolean importData(JComponent c, Transferable t)
- {
- boolean ok = false;
- PropertyDescriptor prop = getPropertyDescriptor(c);
- if (prop != null)
- {
- Method writer = prop.getWriteMethod();
- if (writer != null)
- {
- Class[] params = writer.getParameterTypes();
- if (params.length == 1)
- {
- DataFlavor flavor = getPropertyDataFlavor(params[0],
- t.getTransferDataFlavors());
- if (flavor != null)
- {
- try
- {
- Object value = t.getTransferData(flavor);
- writer.invoke(c, new Object[]{ value });
- ok = true;
- }
- catch (Exception ex)
- {
- // If anything goes wrong here, do nothing and return
- // false;
- }
- }
- }
- }
- }
- return ok;
- }
-
- /**
- * Returns the property descriptor for the property of this TransferHandler
- * in the specified component, or <code>null</code> if no such property
- * exists in the component. This method only returns properties that are
- * at least readable (that is, it has a public no-arg getter method).
- *
- * @param c the component to check
- *
- * @return the property descriptor for the property of this TransferHandler
- * in the specified component, or <code>null</code> if no such
- * property exists in the component
- */
- private PropertyDescriptor getPropertyDescriptor(JComponent c)
- {
- PropertyDescriptor prop = null;
- if (propertyName != null)
- {
- Class clazz = c.getClass();
- BeanInfo beanInfo;
- try
- {
- beanInfo = Introspector.getBeanInfo(clazz);
- }
- catch (IntrospectionException ex)
- {
- beanInfo = null;
- }
- if (beanInfo != null)
- {
- PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
- for (int i = 0; i < props.length && prop == null; i++)
- {
- PropertyDescriptor desc = props[i];
- if (desc.getName().equals(propertyName))
- {
- Method reader = desc.getReadMethod();
- if (reader != null)
- {
- Class[] params = reader.getParameterTypes();
- if (params == null || params.length == 0)
- prop = desc;
- }
- }
- }
- }
- }
- return prop;
- }
-
- /**
- * Searches <code>flavors</code> to find a suitable data flavor that
- * has the mime type application/x-java-jvm-local-objectref and a
- * representation class that is the same as the specified <code>clazz</code>.
- * When no such data flavor is found, this returns <code>null</code>.
- *
- * @param clazz the representation class required for the data flavor
- * @param flavors the possible data flavors
- *
- * @return the suitable data flavor or null if none is found
- */
- private DataFlavor getPropertyDataFlavor(Class clazz, DataFlavor[] flavors)
- {
- DataFlavor found = null;
- for (int i = 0; i < flavors.length && found == null; i++)
- {
- DataFlavor flavor = flavors[i];
- if (flavor.getPrimaryType().equals("application")
- && flavor.getSubType().equals("x-java-jvm-local-objectref")
- && clazz.isAssignableFrom(flavor.getRepresentationClass()))
- found = flavor;
- }
- return found;
- }
-}