/*
* 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.
*/
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
//import ilog.views.util.IlvProductUtil;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import ilog.views.IlvManager;
import ilog.views.IlvManagerView;
import ilog.views.IlvManagerViewInteractor;
import ilog.views.IlvPoint;
import ilog.views.IlvRect;
import ilog.views.IlvTransformer;
/**
* Interactor class that lets you drag a rectangle, and trigger a
* method when it is done.
*/
public class DragRectangleInteractor
extends IlvManagerViewInteractor
{
/**
* The anchor point of the rectangle.
*/
private final IlvPoint _start = new IlvPoint();
/**
* The rectangle when dragging.
*/
private final IlvRect _rectangle = new IlvRect();
/**
* True if we are dragging.
*/
private boolean _dragging = false;
/**
* Constructs and initializes a new instance of a drag rectangle
* interactor.
*/
public DragRectangleInteractor()
{
enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
Override
protected void processMouseEvent(MouseEvent event)
{
switch (event.getID()) {
case MouseEvent.MOUSE_PRESSED: {
if (_dragging)
break;
if ((event.getModifiers() & InputEvent.BUTTON2_MASK) == 0 &&
(event.getModifiers() & InputEvent.BUTTON3_MASK) == 0) {
_dragging = true;
IlvTransformer t = getTransformer();
_start.move(event.getX(), event.getY());
t.inverse(_start);
_rectangle.width = 0;
_rectangle.height = 0;
event.consume();
}
break;
}
case MouseEvent.MOUSE_RELEASED:
if (_dragging) {
_dragging = false;
drawGhost(); // erase the ghost by redrawing in XOR
fireRectangleDraggedEvent(new IlvRect(_rectangle), event);
// avoid redraw of the ghost after end of interaction
_rectangle.width = 0;
_rectangle.height = 0;
event.consume();
}
}
super.processMouseEvent(event);
}
Override
protected void processMouseMotionEvent(MouseEvent event)
{
if (event.getID() == MouseEvent.MOUSE_DRAGGED &&
_dragging) {
drawGhost(); // erase the ghost by redrawing in XOR
IlvTransformer t = getTransformer();
IlvPoint p = new IlvPoint(event.getX(), event.getY());
ensureVisible(p);
_rectangle.reshape(_start.x, _start.y, 0,0);
t.inverse(p);
_rectangle.add(p.x, p.y);
drawGhost();
event.consume();
}
super.processMouseMotionEvent(event);
}
/**
* Draws the dragged rectangle in xor mode.
*/
Override
protected void drawGhost(Graphics g)
{
if (_rectangle.width > 0 && _rectangle.height >0) {
IlvRect rect = new IlvRect(_rectangle);
IlvTransformer t = getTransformer();
if (t != null)
t.apply(rect);
if (rect.width > 0 && rect.height >0) {
g.drawRect((int)Math.floor(rect.x),
(int)Math.floor(rect.y),
(int)Math.floor(rect.width),
(int)Math.floor(rect.height));
}
}
}
/**
* This method is called when the user
* releases the mouse button after the drag.
* @param event the mouse released event that generates this event.
* @param rectangle the dragged rectangle.
*/
protected void
fireRectangleDraggedEvent(IlvRect rectangle, java.awt.event.MouseEvent event)
{
System.out.println("Rectangle dragged " + rectangle);
}
public static void main(String[] args)
{
// This sample uses JViews Diagrammer features. When deploying an
// application that includes this code, you need to be in possession
// of a Rogue Wave JViews Diagrammer Deployment license.
// IlvProductUtil.DeploymentLicenseRequired(
// IlvProductUtil.JViews_Diagrammer_Deployment);
// Sun recommends that to put the entire GUI initialization into the
// AWT thread
SwingUtilities.invokeLater(
new Runnable() {
Override
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(new Dimension(300, 300));
IlvManager mgr = new IlvManager();
IlvManagerView v = new IlvManagerView(mgr);
v.pushInteractor(new DragRectangleInteractor());
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add("Center", v);
f.setVisible(true);
}
});
}
}