--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/dnd/ImageDecoratedDnD/DnDSource.java Thu Dec 24 17:19:09 2009 +0300
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2009 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.
+ */
+
+/*
+* AWT Button is a DragSource and also a transferable object
+*/
+
+import java.awt.*;
+import java.awt.datatransfer.*;
+import java.awt.dnd.*;
+import java.io.*;
+
+class DnDSource extends Button implements Transferable,
+ DragGestureListener,
+ DragSourceListener {
+ private DataFlavor df;
+ private transient int dropAction;
+ private final int dragOperation = DnDConstants.ACTION_COPY | DnDConstants.ACTION_MOVE | DnDConstants.ACTION_LINK;
+ DragSource dragSource = new DragSource();
+
+ DnDSource(String label) {
+ super(label);
+ setBackground(Color.yellow);
+ setForeground(Color.blue);
+ df = new DataFlavor(DnDSource.class, "DnDSource");
+
+ dragSource.createDefaultDragGestureRecognizer(
+ this,
+ dragOperation,
+ this
+ );
+ dragSource.addDragSourceListener(this);
+ }
+
+ public void changeCursor(
+ DragSourceContext dsc,
+ int ra
+ ) {
+ java.awt.Cursor c = null;
+ if ((ra & DnDConstants.ACTION_LINK) == DnDConstants.ACTION_LINK)
+ c = DragSource.DefaultLinkDrop;
+ else if ((ra & DnDConstants.ACTION_MOVE) == DnDConstants.ACTION_MOVE)
+ c = MyCursor.MOVE;//DragSource.DefaultMoveDrop;
+ else if ((ra & DnDConstants.ACTION_COPY) == DnDConstants.ACTION_COPY)
+ c = MyCursor.COPY;
+ else
+ c = MyCursor.NO_DROP;
+ dsc.setCursor(c);
+ }
+
+ /**
+ * a Drag gesture has been recognized
+ */
+
+ public void dragGestureRecognized(DragGestureEvent dge) {
+ System.out.println("starting Drag");
+ try {
+ if (DragSource.isDragImageSupported()) {
+ System.out.println("starting Imaged Drag");
+ dge.startDrag(
+ null,
+ new ImageGenerator(50, 100, new Color(0xff, 0xff, 0xff, 0x00) ) {
+ @Override public void paint(Graphics gr) {
+ gr.translate(width/2, height/2);
+ ((Graphics2D)gr).setStroke(new BasicStroke(3));
+ int R = width/4+5;
+ gr.setColor(new Color(0x00, 0x00, 0xff, 0x7F));
+ gr.fillRect(-R, -R, 2*R, 2*R);
+ gr.setColor(new Color(0x00, 0x00, 0xff, 0xff));
+ gr.drawRect(-R, -R, 2*R, 2*R);
+
+
+ gr.translate(10, -10);
+ R -= 5;
+ gr.setColor(Color.RED);
+ gr.fillOval(-R, -R, 2*R, 2*R);
+ gr.setColor(Color.MAGENTA);
+ gr.drawOval(-R, -R, 2*R, 2*R);
+ }
+ }.getImage(),
+ new Point(15, 40),
+ this,
+ this);
+ } else {
+ dge.startDrag(
+ null,
+ this,
+ this);
+ }
+ } catch (InvalidDnDOperationException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * as the hotspot enters a platform dependent drop site
+ */
+
+ public void dragEnter(DragSourceDragEvent dsde) {
+ System.out.println("[Source] dragEnter");
+ changeCursor(
+ dsde.getDragSourceContext(),
+ dsde.getUserAction() & dsde.getDropAction()
+ );
+ }
+
+ /**
+ * as the hotspot moves over a platform dependent drop site
+ */
+ public void dragOver(DragSourceDragEvent dsde) {
+ System.out.println("[Source] dragOver");
+ changeCursor(
+ dsde.getDragSourceContext(),
+ dsde.getUserAction() & dsde.getDropAction()
+ );
+ dropAction = dsde.getUserAction() & dsde.getDropAction();
+ System.out.println("dropAction = " + dropAction);
+ }
+
+ /**
+ * as the hotspot exits a platform dependent drop site
+ */
+ public void dragExit(DragSourceEvent dse) {
+ System.out.println("[Source] dragExit");
+ changeCursor(
+ dse.getDragSourceContext(),
+ DnDConstants.ACTION_NONE
+ );
+ }
+
+ /**
+ * as the operation changes
+ */
+ public void dragGestureChanged(DragSourceDragEvent dsde) {
+ System.out.println("[Source] dragGestureChanged");
+ changeCursor(
+ dsde.getDragSourceContext(),
+ dsde.getUserAction() & dsde.getDropAction()
+ );
+ dropAction = dsde.getUserAction() & dsde.getDropAction();
+ System.out.println("dropAction = " + dropAction);
+ }
+
+
+ /**
+ * as the operation completes
+ */
+ public void dragDropEnd(DragSourceDropEvent dsde) {
+ System.out.println("[Source] dragDropEnd");
+ }
+
+ public void dropActionChanged(DragSourceDragEvent dsde) {
+ System.out.println("[Source] dropActionChanged");
+ dropAction = dsde.getUserAction() & dsde.getDropAction();
+ System.out.println("dropAction = " + dropAction);
+ }
+
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor[]{df};
+ }
+
+ public boolean isDataFlavorSupported(DataFlavor sdf) {
+ return df.equals(sdf);
+ }
+
+ public Object getTransferData(DataFlavor tdf) throws UnsupportedFlavorException, IOException {
+ Object copy = null;
+ if( !df.equals(tdf) ){
+ throw new UnsupportedFlavorException(tdf);
+ }
+ Container parent = getParent();
+ switch (dropAction) {
+ case DnDConstants.ACTION_COPY:
+ try {
+ copy = this.clone();
+ } catch (CloneNotSupportedException e) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+
+ oos.writeObject(this);
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ ObjectInputStream ois = new ObjectInputStream(bais);
+ try {
+ copy = ois.readObject();
+ } catch (ClassNotFoundException cnfe) {
+ // do nothing
+ }
+ }
+ parent.add(this);
+ return copy;
+
+ case DnDConstants.ACTION_MOVE:
+ synchronized (this) {
+ if (parent != null) {
+ parent.remove(this);
+ Label label = new Label("[empty]");
+ label.setBackground(Color.cyan);
+ label.setBounds(this.getBounds());
+ parent.add(label);
+ }
+ }
+ return this;
+
+ case DnDConstants.ACTION_LINK:
+ return this;
+
+ default:
+ return null;
+ }
+
+ }
+}
+