/*
* Licensed Materials - Property of Rogue Wave Software, Inc.
* © Copyright Rogue Wave Software, Inc. 2014, 2017
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
package dnd;
import java.awt.Cursor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragGestureRecognizer;
import java.awt.dnd.DragSource;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import ilog.views.IlvGraphic;
import ilog.views.IlvManagerView;
import ilog.views.IlvPoint;
import ilog.views.IlvRect;
/**
* The <code>DragAdapter</code> class allows an <code>IlvManagerView</code>
* to be a <code>DragSource</code> for Java drag-and-drop mechanism by implementing Java <code>DragSource</code> and
* <code>DragGesture</code> Listners.
* @see DropAdapter
*/
public class DragAdapter
implements DragSourceListener, DragGestureListener
{
private static DragSource ds = DragSource.getDefaultDragSource();
private IlvGraphic currentDrag = null;
/**
* It implements the <code>DragGestureListener</code> method to begin a drag-and-drop operation.
* @param ev The triggered event.
*/
Override
public void dragGestureRecognized(DragGestureEvent ev)
{
// Gets the view from the event.
IlvManagerView view = (IlvManagerView)((DragGestureRecognizer)ev.getSource()).getComponent();
// Tests if the action is allowed.
if ((ev.getDragAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0) {
// Tries to get the object under the mouse (we only deal with
// <code>IlvGraphic</code> objects).
IlvPoint p = new IlvPoint(ev.getDragOrigin().x, ev.getDragOrigin().y);
currentDrag = view.getManager().getObject(p, view);
if (currentDrag != null && view.getManager().isSelectable(currentDrag)) {
// Here we can improve the behavior on platform by allowing <code>DragImage</code>.
if (DragSource.isDragImageSupported()) {
// Creation of an image.
}
// Computation of the position of the mouse pointer in the object.
view.getTransformer().inverse(p);
IlvRect rect = currentDrag.boundingBox(null);
IlvPoint delta = new IlvPoint(p.x - rect.x, p.y - rect.y);
// To remember this position in drop action we set a property on the object.
currentDrag.setNamedProperty(new DeltaProperty(delta));
// We change the cursor depending on the action type.
Cursor cursor = (ev.getDragAction() == DnDConstants.ACTION_COPY)?
DragSource.DefaultCopyDrop:DragSource.DefaultMoveDrop;
try {
// Send the <code>IlvGraphic</code> to the drag-and-drop mechanism starting to drag.
ds.startDrag(ev,
cursor,
// IlvGraphic implements Transferable and can be directly passed
// to drag n drop mechanism.
currentDrag,
// this class will be the DragSourceListener
this);
} catch (Exception ex) {
System.err.println("Drag cannot be performed");
// Removes <code>NamedProperty</code> to prevent from polluting memory space.
currentDrag.removeNamedProperty(DeltaProperty.NAME);
}
}
}
}
/**
* It implements the <code>DragSourceListener</code> method to end a drag-and-drop operation.
* @param dsde The triggered event.
*/
Override
public void dragDropEnd(DragSourceDropEvent dsde)
{
// Gets the view.
IlvManagerView view = (IlvManagerView)(dsde.getDragSourceContext().getComponent());
// Removes <code>NamedProperty</code> to prevent from polluting memory space.
currentDrag.removeNamedProperty(DeltaProperty.NAME);
// In move action we delete the initial object in case of success.
if (dsde.getDropSuccess() && ((dsde.getDropAction() & DnDConstants.ACTION_MOVE) != 0))
view.getManager().removeObject(currentDrag, true);
currentDrag = null;
}
// In this simple example we do not redefine the following methods:
Override
public void dropActionChanged(DragSourceDragEvent dsde)
{
}
public void dragGestureChanged(DragSourceDragEvent dsde)
{
}
Override
public void dragEnter(DragSourceDragEvent dsde)
{
}
Override
public void dragOver(DragSourceDragEvent dsde)
{
}
Override
public void dragExit(DragSourceEvent dse)
{
}
}