This example shows how the methods of the predefined
view interactor
IlvDragRectangleInteractor
are
implemented. You can use this example as a starting point for creating
your own interactor functionality. The class
IlvDragRectangleInteractor is used to specify a rectangular region in a view.
When this rectangle is selected, the
fireRectangleDraggedEvent method is called. The rectangle can then be used
for various purposes in derived interactors. For example, you can
create a subclass of this interactor to zoom in on the selected area.
You can see the complete code example file
DragRectangleInteractor.java located
at
codefragments/interactors/dragrectinter/src/DragRectangleInteractor.java in
the installed product. For details, see
<installdir>
/jviews-framework89/codefragments/interactors/dragrectinter/srchtml/DragRectangleInteractor.java.html.
The DragRectangleInteractor
class
defines the following attributes: start
, rectangle
,
and dragging
.
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 dragging. */
private boolean dragging = false;
...
}
The attribute start
is the
point at the start of the drag action; rectangle
is
the rectangle that is drawn when dragging; dragging
is
a Boolean variable whose value is true
when
the user drags.
The enableEvents
method called
in the constructor takes the MOUSE_EVENT_MASK
and MOUSE_MOTION_EVENT_MASK
as
parameters. Events must be enabled to be taken into account by the
interactor:
public DragRectangleInteractor()
{
enableEvents(AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
The processMouseEvent
method
handles the MOUSE_PRESSED
and MOUSE_RELEASED
events:
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;
}
break;
}
case MouseEvent.MOUSE_RELEASED:
if (dragging) {
dragging = false;
drawGhost();
rectangle.width = 0;
rectangle.height = 0;
fireRectangleDraggedEvent(new IlvRect(rectangle), event);
}
}
}
When the mouse button is pressed, the mouse pointer coordinates
are stored in the start
variable and are
converted for storage in the coordinate system of the manager. When
the mouse is released, the drawGhost
method
of IlvManagerViewInteractor
is called to
erase the ghost image. The width and height of the rectangle are set
to 0
to prevent further drawings of the
ghost, and the fireRectangleDraggedEvent
method
is called to notify the end of the drag operation. The following code
demonstrates the dragged rectangle.
Note
The
drawGhost method can be used to perform a temporary drawing
that gives the user feedback on the action of his present operation.
The processMouseMotionEvents
handles
the MOUSE_DRAGGED
events:
protected void processMouseMotionEvent(MouseEvent event)
{
if (event.getID() == MouseEvent.MOUSE_DRAGGED && dragging) {
drawGhost();
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();
}
}
First the rectangle is erased by a call to drawGhost
.
The call to ensureVisible
ensures that
the dragged point remains visible on the screen. The new rectangle
is then computed in the coordinate system of the manager and drawGhost
is
called to draw the new rectangle.
The drawGhost
method simply
draws the dragged rectangle. Since the rectangle is in the manager
coordinate system, the method needs to apply the view transformer
before drawing.
protected void drawGhost(Graphics g)
{
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));
}
}