4
/************************************************************************\
5
classes used by GraphHandler
6
\************************************************************************/
8
class ActionHandler; /* public IlvManagerViewInteractor */
10
class MotionHandler; /* public ActionHandler */
11
class Selector; /* public MotionHandler */
12
class SweepSelector; /* public Selector */
13
class SubgraphSelector; /* public Selector */
14
class ArcHandler; /* public MotionHandler */
15
class ArcMaker; /* public ArcHandler */
16
class ArcChanger; /* public ArcHandler */
17
class NodeMaker; /* public MotionHandler */
19
class ItemMover; /* public ActionHandler */
20
class NodeMover; /* public ItemMover */
21
class SelectionMover; /* public ItemMover */
24
class MenuHandler; /* public ActionHandler */
26
/************************************************************************\
27
GraphHandler declaration and implementation
28
\************************************************************************/
31
#define GraphHandlerParent IlvManagerViewInteractor
32
#define GraphHandlerParentPtr IlvManagerViewInteractor*
33
class GraphHandler: public GraphHandlerParent {
37
SweepSelector* _sweepSelector;
38
SubgraphSelector* _subgraphSelector;
39
Selector* _toggleSelector;
42
NodeMover* _nodeMover;
43
SelectionMover* _selectionMover;
46
ArcChanger* _arcChanger;
47
NodeMaker* _nodeMaker;
49
MenuHandler* _menuHandler;
52
GraphHandler(GrapherPtr graph, GraphViewPtr view);
55
virtual void handleEvent(IlvEvent& event);
56
virtual void doIt(IlvGraphic* graphic,const IlvPoint&);
60
#define ActionHandlerParent IlvManagerViewInteractor
61
#define ActionHandlerParentPtr IlvManagerViewInteractor*
62
class ActionHandler: public ActionHandlerParent
65
GraphHandler* _caller;
71
getManager()->setInteractor(_caller, getView());
73
getManager()->removeInteractor(getView());
77
ActionHandler(GraphHandler* caller, GrapherPtr manager, IlvView* view)
78
: ActionHandlerParent(manager, view), _caller(caller), _target(nil)
83
void target(IlvGraphic* t) { _target = t; }
84
IlvGraphic* target() { return _target; }
85
IlvBoolean targetted() { return (_target) ? IlvTrue : IlvFalse; }
87
virtual void handleEvent(IlvEvent& event);
90
ActionHandlerParent::init();
94
void takeCharge(IlvEvent& event, IlvGraphic* under = nil)
96
getManager()->setInteractor(this);
102
ActionHandlerParent::abort();
108
#define MotionHandlerParent ActionHandler
109
#define MotionHandlerParentPtr ActionHandler*
110
class MotionHandler: public MotionHandlerParent
113
// for rubber-banding
117
virtual void initializeData(IlvEvent& event)
119
_first.move(event.x(), event.y());
122
virtual void updateData(IlvEvent& event, IlvView*, IlvManager*)
124
_current.move(event.x(), event.y());
127
virtual void startMotion(IlvEvent& event) {
128
initializeData(event);
132
virtual void updateMotion(IlvEvent& event) {
134
updateData(event, getView(), getManager());
135
ensureVisible(IlvPoint(event.x(), event.y()));
138
virtual void endMotion(IlvEvent& event) {
139
updateData(event, getView(), getManager());
145
virtual void drawGhost() { }
146
virtual void doIt() { }
148
MotionHandler(GraphHandler* caller, GrapherPtr manager, IlvView* view)
149
: MotionHandlerParent(caller, manager, view)
155
virtual IlvBoolean isInitialEvent(IlvEvent&) { return IlvTrue; }
156
virtual IlvBoolean isOkInitialTarget(IlvGraphic*) { return IlvTrue; }
157
virtual IlvBoolean isOkFinalTarget(IlvGraphic*) { return IlvTrue; }
158
virtual void handleEvent(IlvEvent& event);
163
#define ArcHandlerParent MotionHandler
164
#define ArcHandlerParentPtr MotionHandler*
165
class ArcHandler: public ArcHandlerParent
169
IlvCursor* originalCursor;
170
IlvCursor* initialTargetCursor;
171
IlvCursor* noTargetCursor;
172
IlvCursor* finalTargetCursor;
174
void indicateInitialTarget() {
175
IlvDisplay* display = getView()->getDisplay();
176
originalCursor = display->defaultCursor();
177
display->setCursor(getView(), initialTargetCursor);
178
// setCursor(originalCursor);
180
void indicateNoTarget() {
181
getView()->getDisplay()->setCursor(getView(), noTargetCursor);
182
// setCursor(originalCursor);
184
void indicateFinalTarget() {
185
getView()->getDisplay()->setCursor(getView(), finalTargetCursor);
186
// setCursor(originalCursor);
188
void indicatePreviousCursor() {
189
getView()->getDisplay()->setCursor(getView(), originalCursor);
192
virtual void drawGhost()
194
if ((_current.x() != _first.x()) ||
195
(_current.y() != _first.y())) {
196
IlvPoint tf = _first;
197
IlvTransformer* t = getTransformer();
202
getManager()->getDisplay()->drawLine(getView(),
203
getManager()->getPalette(),
208
virtual IlvBoolean isInitialEvent(IlvEvent& event)
210
return (IlvBoolean) (event.modifiers() & IlvCtrlModifier);
213
virtual IlvBoolean isOkInitialTarget(IlvGraphic* t)
215
return (t) ? IlvTrue : IlvFalse;
217
virtual IlvBoolean isOkFinalTarget(IlvGraphic* t)
219
return (t) ? IlvTrue : IlvFalse;
223
void deleteCursors();
226
/* protected constructor... cannot instantiate one of these */
227
ArcHandler(GraphHandler* caller, GrapherPtr manager, IlvView* view)
228
: ArcHandlerParent(caller, manager, view)
242
#define ArcMakerParent ArcHandler
243
#define ArcMakerParentPtr ArcHandler*
244
class ArcMaker: public ArcMakerParent
247
IlvBoolean exitedTarget;
248
IlvGraphic* finalTarget;
250
virtual void initializeData(IlvEvent& event)
253
target()->boundingBox(bbox);
254
_first.move(bbox.centerx(), bbox.centery());
255
_current.move(event.x(), event.y());
257
exitedTarget = IlvFalse;
260
virtual void startMotion(IlvEvent& event) {
264
initializeData(event);
266
indicateInitialTarget();
271
virtual void updateMotion(IlvEvent& event)
274
IlvPoint p(event.x(), event.y());
275
IlvManager* mgr = getManager();
276
IlvView* view = getView();
277
updateData(event, view, mgr);
279
if (mgr->lastContains(p, view) != target()) {
280
exitedTarget = IlvTrue;
284
IlvGraphic* newTarget = mgr->lastContains(p, view);
286
if (newTarget != finalTarget) {
287
if (isOkFinalTarget(newTarget)) {
288
finalTarget = newTarget;
293
} else { // no previous final target
294
if (isOkFinalTarget(newTarget)) {
295
finalTarget = newTarget;
300
indicateFinalTarget();
301
} else if (exitedTarget) {
303
} // else leave as it was...
305
ensureVisible(IlvPoint(event.x(), event.y()));
309
virtual void endMotion(IlvEvent& event)
311
updateData(event, getView(), getManager());
312
indicatePreviousCursor();
315
if (targetted() && exitedTarget && (finalTarget != nil)) {
323
XeNodePtr tail = ((LabelledNodePtr) target())->xeNode();
324
XeNodePtr head = ((LabelledNodePtr) finalTarget)->xeNode();
325
XeGraphPtr graph = ((GrapherPtr)getManager())->xegraph();
327
// This will need to be replaced with a call to XeGraph::notify(ArcCreate
329
XeArcPtr arc = new XeArc(head, tail, "New Arc", True);
332
virtual IlvBoolean isOkInitialTarget(IlvGraphic* t)
334
return (t != nil) && ((GrapherPtr)getManager())->isNode(t);
336
virtual IlvBoolean isOkFinalTarget(IlvGraphic* t)
338
return isOkInitialTarget(t);
342
ArcMaker(GraphHandler* caller, GrapherPtr manager, IlvView* view)
343
: ArcMakerParent(caller, manager, view)
349
#define ArcChangerParent ArcHandler
350
#define ArcChangerParentPtr ArcHandler*
351
class ArcChanger: public ArcChangerParent
354
IlvGraphic* finalTarget;
356
virtual IlvBoolean isOkInitialTarget(IlvGraphic* t)
358
return (t != nil) && ((GrapherPtr)getManager())->isLink(t);
360
virtual IlvBoolean isOkFinalTarget(IlvGraphic* t)
362
return (t != nil) && ((GrapherPtr)getManager())->isNode(t);
365
virtual void initializeData(IlvEvent& event) {
366
// decide which end was the initial target. For now,
367
// only allow change of head
368
IlvLinkImage* arc = (IlvLinkImage*) target();
369
IlvGraphic* node = arc->getFrom();
372
node->boundingBox(bbox);
373
_first.move(bbox.centerx(), bbox.centery());
374
_current.move(event.x(), event.y());
378
virtual void startMotion(IlvEvent& event) {
382
initializeData(event);
385
// this will change to indicate appropriate target.
391
virtual void updateMotion(IlvEvent& event)
394
IlvPoint p(event.x(), event.y());
395
IlvManager* mgr = getManager();
396
IlvView* view = getView();
397
updateData(event, view, mgr);
398
IlvGraphic* newTarget = mgr->lastContains(p, view);
400
if (newTarget != finalTarget) {
401
if (isOkFinalTarget(newTarget)) {
402
finalTarget = newTarget;
407
} else { // no previous final target
408
if (isOkFinalTarget(newTarget)) {
409
finalTarget = newTarget;
413
indicateFinalTarget();
418
ensureVisible(IlvPoint(event.x(), event.y()));
422
virtual void endMotion(IlvEvent& event)
424
updateData(event, getView(), getManager());
425
indicatePreviousCursor();
428
if (targetted() && (finalTarget != nil)) {
436
ArcChanger(GraphHandler* caller, GrapherPtr manager, IlvView* view)
437
: ArcChangerParent(caller, manager, view)
444
#define NodeMakerParent MotionHandler
445
#define NodeMakerParentPtr MotionHandler*
446
class NodeMaker: public NodeMakerParent
449
IlvRect _xor_rectangle;
451
virtual void drawGhost()
453
if (_xor_rectangle.w()) {
454
getManager()->getDisplay()->drawRectangle(getView(),
455
getManager()->getPalette(),
459
virtual IlvBoolean isInitialEvent(IlvEvent& event)
461
return (IlvBoolean) (event.modifiers() & IlvCtrlModifier);
464
virtual IlvBoolean isOkInitialTarget(IlvGraphic* t)
466
return (t) ? IlvFalse : IlvTrue;
469
virtual void initializeData(IlvEvent& event)
471
_xor_rectangle.move(event.x(), event.y());
472
_xor_rectangle.resize(100, 40);
474
virtual void updateData(IlvEvent& event, IlvView* view, IlvManager* mgr)
476
NodeMakerParent::updateData(event, view, mgr);
477
_xor_rectangle.move(event.x(), event.y());
482
NodeMaker(GraphHandler* caller, GrapherPtr manager, IlvView* view)
483
: NodeMakerParent(caller, manager, view)
488
const int ObjectLayer = 0;
489
const int HighlightLayer = 1;
498
#define SelectorParent MotionHandler
499
#define SelectorParentPtr MotionHandler*
500
class Selector: public SelectorParent
503
// used to determine actions in various modes
509
// for manipulating an individual object
510
IlvBoolean _wasSelected;
512
// for outlining individual graphical objects
516
getManager()->deSelectAll();
519
virtual void updateData(IlvEvent& event, IlvView* view, IlvManager* mgr)
521
SelectorParent::updateData(event, view, mgr);
522
_p.move(event.x(), event.y());
524
IlvTransformer* xform = getTransformer();
530
virtual IlvBoolean isInitialEvent(IlvEvent& event)
532
return (IlvBoolean) ((!event.modifiers()) ||
533
(event.modifiers() & IlvCtrlModifier));
536
virtual IlvBoolean isOkInitialTarget(IlvGraphic* t)
538
return (IlvBoolean)(t != nil);
539
// && ((GrapherPtr) getManager())->isNode(target()));
543
Selector(GraphHandler* caller, GrapherPtr manager, IlvView* view)
544
: SelectorParent(caller, manager, view)
545
, _type(NewSelection)
546
, _wasSelected(IlvFalse)
553
virtual void startMotion(IlvEvent& event);
554
virtual void updateMotion(IlvEvent& event);
555
virtual void endMotion(IlvEvent& event);
560
#define SweepSelectorParent Selector
561
#define SweepSelectorParentPtr Selector*
562
class SweepSelector: public SweepSelectorParent
565
// for sweeping out rectangles for selection
566
IlvRect _xor_rectangle;
570
void updateData(IlvEvent& event, IlvView* view, IlvManager* mgr)
572
SweepSelectorParent::updateData(event, view, mgr);
573
_xor_rectangle.move(IlvMin(_firstx, event.x()),
574
IlvMin(_firsty, event.y()));
575
_xor_rectangle.resize((IlvDim)(IlvMax(_firstx, event.x()) -
577
(IlvDim)(IlvMax(_firsty, event.y()) -
578
_xor_rectangle.y()));
581
virtual void startMotion(IlvEvent& event) {
595
virtual void updateMotion(IlvEvent& event) {
596
if (_xor_rectangle.w()) drawGhost();
598
updateData(event, getView(), getManager());
599
ensureVisible(IlvPoint(event.x(), event.y()));
603
virtual void endMotion(IlvEvent& event) {
605
updateData(event, getView(), getManager());
606
if (_xor_rectangle.w()) {
616
virtual void drawGhost()
618
if (_xor_rectangle.w()) {
619
getManager()->getDisplay()->drawRectangle(getView(),
620
getManager()->getPalette(),
625
IlvBoolean isInitialEvent(IlvEvent& event)
627
return (IlvBoolean) !event.modifiers();
630
IlvBoolean isOkInitialTarget(IlvGraphic* t)
632
return (IlvBoolean)(t == nil);
636
SweepSelector(GraphHandler* caller, GrapherPtr manager, IlvView* view)
637
: SweepSelectorParent(caller, manager, view)
644
#define SubgraphSelectorParent Selector
645
#define SubgraphSelectorParentPtr Selector*
646
class SubgraphSelector: public SubgraphSelectorParent
649
// for selecting subgraph -- _target holds topmost node...
650
IlvUInt _nSubgraphNodes;
651
LabelledNodePtr* _subgraph;
652
Outliner** _subgraphOutliners;
654
virtual void startMotion(IlvEvent& event);
656
virtual void updateMotion(IlvEvent& event);
657
virtual void endMotion(IlvEvent& event);
658
IlvBoolean isInitialEvent(IlvEvent& event)
660
return (IlvBoolean) (event.modifiers() & IlvShiftModifier);
663
IlvBoolean isOkInitialTarget(IlvGraphic* t)
665
return (IlvBoolean)(t && ((GrapherPtr) getManager())->isNode(target()));
669
SubgraphSelector(GraphHandler* caller, GrapherPtr manager, IlvView* view)
670
: SubgraphSelectorParent(caller, manager, view)
676
#define ItemMoverParent ActionHandler
677
#define ItemMoverParentPtr ActionHandler*
678
class ItemMover: public ItemMoverParent
681
virtual void startMove(IlvEvent&) { }
682
virtual void updateMove(IlvEvent&) { }
683
virtual void endMove(IlvEvent&) { }
685
virtual IlvBoolean isOkInitialTarget(IlvGraphic* t) {
686
return (t != nil) && ((GrapherPtr) getManager())->isNode(t);
689
ItemMover(GraphHandler* caller, GrapherPtr manager, IlvView* view)
690
: ItemMoverParent(caller, manager, view)
694
void handleEvent(IlvEvent& event);
699
#define NodeMoverParent ItemMover
700
#define NodeMoverParentPtr ItemMover*
701
class NodeMover: public NodeMoverParent
704
IlvPos _deltax, _deltay;
706
void startMove(IlvEvent& event) {
708
target()->boundingBox(bbox, getTransformer());
709
_deltax = event.x() - bbox.x();
710
_deltay = event.y() - bbox.y();
712
virtual void updateMove(IlvEvent& event) {
714
target()->boundingBox(bbox, getTransformer());
715
IlvPoint newOrigin(event.x() - _deltax,
716
event.y() - _deltay);
717
if(getTransformer()) getTransformer()->inverse(newOrigin);
718
target()->boundingBox(bbox);
719
IlvDeltaPoint dp((IlvDeltaPos)(newOrigin.x()-bbox.x()),
720
(IlvDeltaPos)(newOrigin.y()-bbox.y()));
723
virtual void endMove(IlvEvent&) {
726
virtual void doIt(IlvGraphic* graphic,const IlvDeltaPoint& p);
728
NodeMover(GraphHandler* caller, GrapherPtr manager, IlvView* view)
729
: NodeMoverParent(caller, manager, view)
735
#define SelectionMoverParent NodeMover
736
#define SelectionMoverParentPtr NodeMover*
737
class SelectionMover: public SelectionMoverParent
740
virtual IlvBoolean isOkInitialTarget(IlvGraphic* t) {
741
return (IlvBoolean) (t && getManager()->isSelected(t) &&
742
((GrapherPtr)getManager())->isNode(t));
744
virtual void doIt(IlvGraphic* graphic, const IlvDeltaPoint& p);
746
SelectionMover(GraphHandler* caller, GrapherPtr manager, IlvView* view)
747
: SelectionMoverParent(caller, manager, view)
753
#define MenuHandlerParent ActionHandler
754
#define MenuHandlerParentPtr ActionHandler*
755
class MenuHandler : public MenuHandlerParent
758
MenuHandler(GraphHandler* caller, GrapherPtr manager, IlvView* view)
759
: MenuHandlerParent(caller, manager, view)
762
void handleEvent(IlvEvent& event);
765
extern void PopupMenu(XegPopupMenuPtr menu, Widget w, IlvEvent* event);