tmf: Update Javadoc throughout tmf.ui
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / uml2sd / SDWidget.java
CommitLineData
73005152 1/**********************************************************************
df0b8ff4
BH
2 * Copyright (c) 2005, 2008 IBM Corporation and others.
3 * Copyright (c) 2011, 2012 Ericsson.
013a5f1c 4 *
73005152
BH
5 * All rights reserved. This program and the accompanying materials
6 * are made available under the terms of the Eclipse Public License v1.0
7 * which accompanies this distribution, and is available at
8 * http://www.eclipse.org/legal/epl-v10.html
013a5f1c
AM
9 *
10 * Contributors:
73005152
BH
11 * IBM - Initial API and implementation
12 * Bernd Hufmann - Updated for TMF
13 **********************************************************************/
14package org.eclipse.linuxtools.tmf.ui.views.uml2sd;
15
16import java.text.MessageFormat;
17import java.util.ArrayList;
18import java.util.List;
19import java.util.Timer;
20import java.util.TimerTask;
21
22import org.eclipse.jface.contexts.IContextIds;
23import org.eclipse.jface.util.IPropertyChangeListener;
24import org.eclipse.jface.util.PropertyChangeEvent;
25import org.eclipse.jface.viewers.ISelectionProvider;
26import org.eclipse.jface.viewers.StructuredSelection;
8fd82db5 27import org.eclipse.linuxtools.internal.tmf.ui.Activator;
d34665f9 28import org.eclipse.linuxtools.internal.tmf.ui.ITmfImageConstants;
4df4581d 29import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
6c13869b 30import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
73005152
BH
31import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.BaseMessage;
32import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.BasicExecutionOccurrence;
33import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Frame;
34import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.GraphNode;
35import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.ITimeRange;
36import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Lifeline;
37import org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Metrics;
df0b8ff4
BH
38import org.eclipse.linuxtools.tmf.ui.views.uml2sd.dialogs.SDPrintDialog;
39import org.eclipse.linuxtools.tmf.ui.views.uml2sd.dialogs.SDPrintDialogUI;
73005152 40import org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor;
73005152
BH
41import org.eclipse.linuxtools.tmf.ui.views.uml2sd.handlers.provider.ISDCollapseProvider;
42import org.eclipse.linuxtools.tmf.ui.views.uml2sd.load.LoadersManager;
df0b8ff4 43import org.eclipse.linuxtools.tmf.ui.views.uml2sd.preferences.ISDPreferences;
73005152
BH
44import org.eclipse.linuxtools.tmf.ui.views.uml2sd.preferences.SDViewPref;
45import org.eclipse.linuxtools.tmf.ui.views.uml2sd.util.SDMessages;
73005152
BH
46import org.eclipse.swt.SWT;
47import org.eclipse.swt.accessibility.ACC;
48import org.eclipse.swt.accessibility.Accessible;
49import org.eclipse.swt.accessibility.AccessibleAdapter;
50import org.eclipse.swt.accessibility.AccessibleControlAdapter;
51import org.eclipse.swt.accessibility.AccessibleControlEvent;
52import org.eclipse.swt.accessibility.AccessibleEvent;
53import org.eclipse.swt.events.DisposeEvent;
54import org.eclipse.swt.events.DisposeListener;
55import org.eclipse.swt.events.FocusEvent;
56import org.eclipse.swt.events.FocusListener;
57import org.eclipse.swt.events.KeyEvent;
58import org.eclipse.swt.events.MouseEvent;
59import org.eclipse.swt.events.SelectionEvent;
60import org.eclipse.swt.events.SelectionListener;
61import org.eclipse.swt.events.TraverseEvent;
62import org.eclipse.swt.events.TraverseListener;
63import org.eclipse.swt.graphics.GC;
64import org.eclipse.swt.graphics.Image;
65import org.eclipse.swt.graphics.ImageData;
66import org.eclipse.swt.graphics.Rectangle;
67import org.eclipse.swt.printing.Printer;
68import org.eclipse.swt.printing.PrinterData;
69import org.eclipse.swt.widgets.Canvas;
70import org.eclipse.swt.widgets.Caret;
71import org.eclipse.swt.widgets.Composite;
72import org.eclipse.swt.widgets.Control;
73import org.eclipse.swt.widgets.Display;
74import org.eclipse.swt.widgets.Event;
75import org.eclipse.swt.widgets.Listener;
76import org.eclipse.swt.widgets.MenuItem;
77import org.eclipse.ui.contexts.IContextService;
78import org.eclipse.ui.part.ViewPart;
79
80/**
df0b8ff4
BH
81 * <p>
82 * This class implements sequence diagram widget used in the sequence diagram view.
83 * </p>
013a5f1c
AM
84 *
85 * @version 1.0
73005152 86 * @author sveyrier
73005152
BH
87 */
88public class SDWidget extends ScrollView implements SelectionListener, IPropertyChangeListener, DisposeListener, ITimeCompressionListener {
89
df0b8ff4
BH
90 // ------------------------------------------------------------------------
91 // Attributes
92 // ------------------------------------------------------------------------
93
94 /**
95 * The frame to display in the sequence diagram widget.
96 */
eb63f5ff 97 protected Frame fFrame;
df0b8ff4
BH
98 /**
99 * The overview image to display.
100 */
eb63f5ff 101 protected Image fOverView = null;
df0b8ff4 102 /**
013a5f1c 103 * The zoom in menu item.
df0b8ff4 104 */
eb63f5ff 105 protected MenuItem fZoomIn = null;
df0b8ff4 106 /**
013a5f1c 107 * The zoom out menu item.
df0b8ff4 108 */
eb63f5ff 109 protected MenuItem fZoomOut = null;
df0b8ff4 110 /**
013a5f1c 111 * The sequence diagram selection provider.
df0b8ff4 112 */
eb63f5ff 113 protected SDWidgetSelectionProvider fSelProvider = null;
df0b8ff4 114 /**
013a5f1c 115 * The current zoom value.
df0b8ff4 116 */
eb63f5ff 117 public float fZoomValue = 1;
df0b8ff4 118 /**
013a5f1c 119 * The current zoomInMode (true for zoom in).
df0b8ff4 120 */
eb63f5ff 121 protected boolean fZoomInMode = false;
df0b8ff4 122 /**
013a5f1c 123 * The current zoomOutMode (true for zoom out).
df0b8ff4 124 */
eb63f5ff 125 protected boolean fZoomOutMode = false;
df0b8ff4 126 /**
013a5f1c 127 * The current list of selected graph nodes.
df0b8ff4 128 */
eb63f5ff 129 protected List<GraphNode> fSelectedNodeList = null;
df0b8ff4 130 /**
013a5f1c 131 * Flag whether ctrl button is selected or not.
df0b8ff4 132 */
eb63f5ff 133 protected boolean fCtrlSelection = false;
df0b8ff4 134 /**
013a5f1c 135 * A reference to the view site.
df0b8ff4 136 */
eb63f5ff 137 protected ViewPart fSite = null;
df0b8ff4 138 /**
013a5f1c 139 * The current graph node (the last selected one).
df0b8ff4 140 */
eb63f5ff 141 public GraphNode fCurrentGraphNode = null;
df0b8ff4 142 /**
013a5f1c 143 * The first graph node in list (multiple selection).
df0b8ff4 144 */
eb63f5ff 145 public GraphNode fListStart = null;
df0b8ff4 146 /**
013a5f1c 147 * The previous graph node (multiple selection).
df0b8ff4 148 */
eb63f5ff 149 public List<GraphNode> fPrevList = null;
df0b8ff4 150 /**
013a5f1c 151 * The time compression bar.
df0b8ff4 152 */
eb63f5ff 153 protected TimeCompressionBar fTimeBar = null;
df0b8ff4 154 /**
013a5f1c 155 * The current diagram tool tip.
df0b8ff4 156 */
eb63f5ff 157 protected DiagramToolTip fToolTip = null;
df0b8ff4
BH
158 /**
159 * The accessible object reference of view control.
160 */
eb63f5ff 161 protected Accessible fAccessible = null;
df0b8ff4
BH
162 /**
163 * The current node for the tooltip to display.
164 */
eb63f5ff 165 protected GraphNode fToolTipNode;
df0b8ff4
BH
166 /**
167 * The life line to drag and drop.
168 */
eb63f5ff 169 protected Lifeline fDragAndDrop = null;
df0b8ff4 170 /**
013a5f1c 171 * The number of focused widgets.
df0b8ff4 172 */
eb63f5ff 173 protected int fFocusedWidget = -1;
df0b8ff4
BH
174 /**
175 * The printer zoom.
176 */
eb63f5ff 177 protected float fPrinterZoom = 0;
df0b8ff4
BH
178 /**
179 * Y coordinate for printer.
180 */
eb63f5ff 181 protected int fPrinterY = 0;
df0b8ff4
BH
182 /**
183 * X coordinate for printer.
184 */
eb63f5ff 185 protected int fPrinterX = 0;
df0b8ff4 186 /**
013a5f1c 187 * Flag whether drag and drop is enabled or not.
df0b8ff4 188 */
eb63f5ff 189 protected boolean fIsDragAndDrop = false;
df0b8ff4
BH
190 /**
191 * The x coordinate for drag.
192 */
eb63f5ff 193 protected int fDragX = 0;
df0b8ff4
BH
194 /**
195 * The y coordinate for drag.
196 */
eb63f5ff 197 protected int fDragY = 0;
df0b8ff4
BH
198 /**
199 * The reorder mode.
200 */
eb63f5ff 201 protected boolean fReorderMode = false;
df0b8ff4
BH
202 /**
203 * The collapse caret image.
204 */
eb63f5ff 205 protected Image fCollapaseCaretImg = null;
df0b8ff4
BH
206 /**
207 * The arrow up caret image.
208 */
eb63f5ff 209 protected Image fArrowUpCaretImg = null;
df0b8ff4
BH
210 /**
211 * The current caret image.
212 */
eb63f5ff 213 protected Image fCurrentCaretImage = null;
df0b8ff4
BH
214 /**
215 * A sequence diagramm collapse provider (for collapsing graph nodes)
216 */
eb63f5ff 217 protected ISDCollapseProvider fCollapseProvider = null;
df0b8ff4
BH
218 /**
219 * The insertion caret.
220 */
eb63f5ff 221 protected Caret fInsertionCartet = null;
df0b8ff4
BH
222 /**
223 * The reorder list when in reorder mode.
224 */
3145ec83 225 protected List<Lifeline[]> fReorderList = null;
df0b8ff4
BH
226 /**
227 * Flag to specify whether in printing mode or not.
228 */
eb63f5ff 229 protected boolean fIsPrinting = false;
df0b8ff4
BH
230 /**
231 * A printer reference.
232 */
eb63f5ff 233 protected Printer fPrinter = null;
df0b8ff4 234 /**
013a5f1c 235 * Flag whether shift was selected or not.
df0b8ff4 236 */
eb63f5ff 237 protected boolean fShiftSelection = false;
df0b8ff4 238 /**
013a5f1c 239 * The scroll tooltip.
df0b8ff4 240 */
eb63f5ff 241 protected DiagramToolTip fScrollToolTip = null;
013a5f1c
AM
242 /**
243 * Timer for auto_scroll feature
df0b8ff4 244 */
eb63f5ff 245 protected AutoScroll fLocalAutoScroll = null;
df0b8ff4 246 /**
013a5f1c 247 * TimerTask for auto_scroll feature !=null when auto scroll is running
df0b8ff4 248 */
eb63f5ff 249 protected Timer fLocalAutoScrollTimer = null;
73005152 250
df0b8ff4
BH
251 // ------------------------------------------------------------------------
252 // Constructor
253 // ------------------------------------------------------------------------
254 /**
255 * Constructor for SDWidget.
256 * @param c The parent composite
257 * @param s The style
258 */
73005152
BH
259 public SDWidget(Composite c, int s) {
260 super(c, s | SWT.NO_BACKGROUND, true);
261 setOverviewEnabled(true);
eb63f5ff
BH
262 fSelectedNodeList = new ArrayList<GraphNode>();
263 fSelProvider = new SDWidgetSelectionProvider();
73005152 264 SDViewPref.getInstance().addPropertyChangeListener(this);
eb63f5ff 265 fToolTip = new DiagramToolTip(getViewControl());
73005152
BH
266 super.addDisposeListener(this);
267
eb63f5ff 268 fScrollToolTip = new DiagramToolTip(c);
73005152
BH
269 getVerticalBar().addListener(SWT.MouseUp, new Listener() {
270
271 @Override
272 public void handleEvent(Event event) {
eb63f5ff 273 fScrollToolTip.hideToolTip();
73005152
BH
274 }
275
276 });
eb63f5ff 277 fAccessible = getViewControl().getAccessible();
73005152 278
eb63f5ff 279 fAccessible.addAccessibleListener(new AccessibleAdapter() {
df0b8ff4
BH
280 /*
281 * (non-Javadoc)
282 * @see org.eclipse.swt.accessibility.AccessibleAdapter#getName(org.eclipse.swt.accessibility.AccessibleEvent)
283 */
73005152
BH
284 @Override
285 public void getName(AccessibleEvent e) {
73005152 286 // Case toolTip
df0b8ff4 287 if (e.childID == 0) {
eb63f5ff
BH
288 if (fToolTipNode != null) {
289 if (fToolTipNode instanceof Lifeline) {
290 Lifeline lifeline = (Lifeline) fToolTipNode;
73005152
BH
291 e.result = lifeline.getToolTipText();
292 } else {
eb63f5ff 293 e.result = fToolTipNode.getName() + getPostfixForTooltip(true);
73005152
BH
294 }
295 }
296 } else {
297 if (getFocusNode() != null) {
298 if (getFocusNode() instanceof Lifeline) {
299 e.result = MessageFormat.format(SDMessages._1, new Object[] { String.valueOf(getFocusNode().getName()) });
300 }
301 if (getFocusNode() instanceof BaseMessage) {
302 BaseMessage mes = (BaseMessage) getFocusNode();
303 if ((mes.getStartLifeline() != null) && (mes.getEndLifeline() != null)) {
304 e.result = MessageFormat.format(
305 SDMessages._2,
306 new Object[] { String.valueOf(mes.getName()), String.valueOf(mes.getStartLifeline().getName()), Integer.valueOf(mes.getStartOccurrence()), String.valueOf(mes.getEndLifeline().getName()),
307 Integer.valueOf(mes.getEndOccurrence()) });
308 } else if ((mes.getStartLifeline() == null) && (mes.getEndLifeline() != null)) {
309 e.result = MessageFormat.format(SDMessages._4, new Object[] { String.valueOf(mes.getName()), String.valueOf(mes.getEndLifeline().getName()), Integer.valueOf(mes.getEndOccurrence()) });
310 } else if ((mes.getStartLifeline() != null) && (mes.getEndLifeline() == null)) {
311 e.result = MessageFormat.format(SDMessages._3, new Object[] { String.valueOf(mes.getName()), String.valueOf(mes.getStartLifeline().getName()), Integer.valueOf(mes.getStartOccurrence()) });
312 }
313 } else if (getFocusNode() instanceof BasicExecutionOccurrence) {
314 BasicExecutionOccurrence exec = (BasicExecutionOccurrence) getFocusNode();
315 e.result = MessageFormat.format(SDMessages._5,
316 new Object[] { String.valueOf(exec.getName()), String.valueOf(exec.getLifeline().getName()), Integer.valueOf(exec.getStartOccurrence()), Integer.valueOf(exec.getEndOccurrence()) });
317 }
318
319 }
73005152
BH
320 }
321 }
322 });
323
eb63f5ff 324 fAccessible.addAccessibleControlListener(new AccessibleControlAdapter() {
df0b8ff4
BH
325 /*
326 * (non-Javadoc)
327 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getFocus(org.eclipse.swt.accessibility.AccessibleControlEvent)
328 */
73005152
BH
329 @Override
330 public void getFocus(AccessibleControlEvent e) {
eb63f5ff 331 if (fFocusedWidget == -1) {
73005152 332 e.childID = ACC.CHILDID_SELF;
df0b8ff4 333 } else {
eb63f5ff 334 e.childID = fFocusedWidget;
df0b8ff4 335 }
73005152
BH
336 }
337
df0b8ff4
BH
338 /*
339 * (non-Javadoc)
340 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getRole(org.eclipse.swt.accessibility.AccessibleControlEvent)
341 */
73005152
BH
342 @Override
343 public void getRole(AccessibleControlEvent e) {
344 switch (e.childID) {
345 case ACC.CHILDID_SELF:
346 e.detail = ACC.ROLE_CLIENT_AREA;
347 break;
348 case 0:
349 e.detail = ACC.ROLE_TOOLTIP;
350 break;
351 case 1:
352 e.detail = ACC.ROLE_LABEL;
353 break;
eb63f5ff
BH
354 default:
355 break;
73005152
BH
356 }
357 }
358
df0b8ff4
BH
359 /*
360 * (non-Javadoc)
361 * @see org.eclipse.swt.accessibility.AccessibleControlAdapter#getState(org.eclipse.swt.accessibility.AccessibleControlEvent)
362 */
73005152
BH
363 @Override
364 public void getState(AccessibleControlEvent e) {
365 e.detail = ACC.STATE_FOCUSABLE;
366 if (e.childID == ACC.CHILDID_SELF) {
367 e.detail |= ACC.STATE_FOCUSED;
368 } else {
369 e.detail |= ACC.STATE_SELECTABLE;
013a5f1c 370 if (e.childID == fFocusedWidget) {
73005152 371 e.detail |= ACC.STATE_FOCUSED | ACC.STATE_SELECTED | ACC.STATE_CHECKED;
013a5f1c 372 }
73005152
BH
373 }
374 }
375 });
376
eb63f5ff
BH
377 fInsertionCartet = new Caret((Canvas) getViewControl(), SWT.NONE);
378 fInsertionCartet.setVisible(false);
73005152 379
8fd82db5
FC
380 fCollapaseCaretImg = Activator.getDefault().getImageFromPath(ITmfImageConstants.IMG_UI_ARROW_COLLAPSE_OBJ);
381 fArrowUpCaretImg = Activator.getDefault().getImageFromPath(ITmfImageConstants.IMG_UI_ARROW_UP_OBJ);
73005152 382
eb63f5ff 383 fReorderList = new ArrayList<Lifeline[]>();
3145ec83 384 getViewControl().addTraverseListener(new LocalTraverseListener());
73005152 385
3145ec83 386 addTraverseListener(new LocalTraverseListener());
73005152
BH
387
388 getViewControl().addFocusListener(new FocusListener() {
389
df0b8ff4
BH
390 /*
391 * (non-Javadoc)
392 * @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
393 */
73005152
BH
394 @Override
395 public void focusGained(FocusEvent e) {
73005152 396 SDViewPref.getInstance().setNoFocusSelection(false);
eb63f5ff
BH
397 fCtrlSelection = false;
398 fShiftSelection = false;
73005152
BH
399 redraw();
400 }
401
df0b8ff4
BH
402 /*
403 * (non-Javadoc)
404 * @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
405 */
73005152
BH
406 @Override
407 public void focusLost(FocusEvent e) {
408 SDViewPref.getInstance().setNoFocusSelection(true);
409 redraw();
410 }
411 });
412 }
013a5f1c 413
df0b8ff4
BH
414 // ------------------------------------------------------------------------
415 // Operations
416 // ------------------------------------------------------------------------
417 /**
418 * Sets the time compression bar.
013a5f1c 419 *
df0b8ff4
BH
420 * @param bar The time compression bar to set
421 */
73005152
BH
422 public void setTimeBar(TimeCompressionBar bar) {
423 if (bar != null) {
eb63f5ff
BH
424 fTimeBar = bar;
425 fTimeBar.addTimeCompressionListener(this);
73005152
BH
426 }
427 }
013a5f1c 428
73005152
BH
429 /**
430 * Resize the contents to insure the frame fit into the view
013a5f1c 431 *
73005152
BH
432 * @param frame the frame which will be drawn in the view
433 */
434 public void resizeContents(Frame frame) {
eb63f5ff
BH
435 int width = Math.round((frame.getWidth() + 2 * Metrics.FRAME_H_MARGIN) * fZoomValue);
436 int height = Math.round((frame.getHeight() + 2 * Metrics.FRAME_V_MARGIN) * fZoomValue);
73005152
BH
437 resizeContents(width, height);
438 }
439
73005152
BH
440 /**
441 * The frame to render (the sequence diagram)
013a5f1c 442 *
73005152 443 * @param theFrame the frame to display
df0b8ff4 444 * @param resetPosition boolean
73005152
BH
445 */
446 public void setFrame(Frame theFrame, boolean resetPosition) {
eb63f5ff
BH
447 fReorderList.clear();
448 fSelectedNodeList.clear();
449 fSelProvider.setSelection(new StructuredSelection());
450 fFrame = theFrame;
73005152
BH
451 if (resetPosition) {
452 setContentsPos(0, 0);
eb63f5ff 453 resizeContents(fFrame);
73005152
BH
454 redraw();
455 }
456 // prepare the old overview to be reused
eb63f5ff
BH
457 if (fOverView != null) {
458 fOverView.dispose();
df0b8ff4 459 }
eb63f5ff
BH
460 fOverView = null;
461 resizeContents(fFrame);
73005152
BH
462 }
463
464 /**
465 * Returns the current Frame (the sequence diagram container)
013a5f1c
AM
466 *
467 * @return the frame
73005152
BH
468 */
469 public Frame getFrame() {
eb63f5ff 470 return fFrame;
73005152
BH
471 }
472
473 /**
474 * Returns the selection provider for the current sequence diagram
013a5f1c
AM
475 *
476 * @return the selection provider
73005152
BH
477 */
478 public ISelectionProvider getSelectionProvider() {
eb63f5ff 479 return fSelProvider;
73005152 480 }
013a5f1c 481
df0b8ff4
BH
482 /**
483 * Returns a list of selected graph nodes.
013a5f1c 484 *
df0b8ff4
BH
485 * @return a list of selected graph nodes.
486 */
487 public List<GraphNode> getSelection() {
eb63f5ff 488 return fSelectedNodeList;
73005152
BH
489 }
490
df0b8ff4
BH
491 /**
492 * Adds a graph node to the selected nodes list.
013a5f1c 493 *
df0b8ff4
BH
494 * @param node A graph node
495 */
496 public void addSelection(GraphNode node) {
497 if (node == null) {
498 return;
499 }
eb63f5ff 500 fSelectedNodeList.add(node);
df0b8ff4 501 node.setSelected(true);
eb63f5ff
BH
502 fCurrentGraphNode = node;
503 StructuredSelection selection = new StructuredSelection(fSelectedNodeList);
504 fSelProvider.setSelection(selection);
df0b8ff4
BH
505 }
506
507 /**
508 * Adds a list of node to the selected nodes list.
013a5f1c 509 *
df0b8ff4
BH
510 * @param list of graph nodes
511 */
512 public void addSelection(List<GraphNode> list) {
513 // selectedNodeList.addAll(list);
514 for (int i = 0; i < list.size(); i++) {
eb63f5ff
BH
515 if (!fSelectedNodeList.contains(list.get(i))) {
516 fSelectedNodeList.add(list.get(i));
df0b8ff4
BH
517 ((GraphNode) list.get(i)).setSelected(true);
518 }
519 }
eb63f5ff
BH
520 StructuredSelection selection = new StructuredSelection(fSelectedNodeList);
521 fSelProvider.setSelection(selection);
df0b8ff4
BH
522 }
523
524 /**
525 * Removes a node from the selected nodes list.
013a5f1c 526 *
df0b8ff4
BH
527 * @param node to remove
528 */
529 public void removeSelection(GraphNode node) {
eb63f5ff 530 fSelectedNodeList.remove(node);
df0b8ff4
BH
531 node.setSelected(false);
532 node.setFocused(false);
eb63f5ff
BH
533 StructuredSelection selection = new StructuredSelection(fSelectedNodeList);
534 fSelProvider.setSelection(selection);
df0b8ff4
BH
535 }
536
537 /**
538 * Removes a list of graph nodes from the selected nodes list.
013a5f1c 539 *
df0b8ff4
BH
540 * @param list of nodes to remove.
541 */
542 public void removeSelection(List<GraphNode> list) {
eb63f5ff 543 fSelectedNodeList.removeAll(list);
df0b8ff4
BH
544 for (int i = 0; i < list.size(); i++) {
545 ((GraphNode) list.get(i)).setSelected(false);
546 ((GraphNode) list.get(i)).setFocused(false);
547 }
eb63f5ff
BH
548 StructuredSelection selection = new StructuredSelection(fSelectedNodeList);
549 fSelProvider.setSelection(selection);
df0b8ff4
BH
550 }
551
552 /**
553 * Clear the list of GraphNodes which must be drawn selected.
554 */
555 public void clearSelection() {
eb63f5ff
BH
556 for (int i = 0; i < fSelectedNodeList.size(); i++) {
557 ((GraphNode) fSelectedNodeList.get(i)).setSelected(false);
558 ((GraphNode) fSelectedNodeList.get(i)).setFocused(false);
df0b8ff4 559 }
eb63f5ff
BH
560 fCurrentGraphNode = null;
561 fSelectedNodeList.clear();
562 fSelProvider.setSelection(new StructuredSelection());
df0b8ff4
BH
563 }
564
565 /**
566 * Sets view part.
013a5f1c 567 *
df0b8ff4
BH
568 * @param viewSite The view part to set
569 */
570 public void setSite(ViewPart viewSite) {
eb63f5ff
BH
571 fSite = viewSite;
572 fSite.getSite().setSelectionProvider(fSelProvider);
573 IContextService service = (IContextService) fSite.getSite().getWorkbenchWindow().getService(IContextService.class);
df0b8ff4
BH
574 service.activateContext("org.eclipse.linuxtools.tmf.ui.view.uml2sd.context"); //$NON-NLS-1$
575 service.activateContext(IContextIds.CONTEXT_ID_WINDOW);
576 }
577
578 /**
579 * Returns the GraphNode overView the mouse if any
013a5f1c
AM
580 *
581 * @return the current graph node
df0b8ff4
BH
582 * */
583 public GraphNode getMouseOverNode() {
eb63f5ff 584 return fCurrentGraphNode;
df0b8ff4 585 }
013a5f1c 586
df0b8ff4
BH
587 /**
588 * Sets the zoom in mode.
013a5f1c
AM
589 *
590 * @param The mode value to set.
df0b8ff4
BH
591 */
592 public void setZoomInMode(boolean value) {
593 if (value) {
594 setZoomOutMode(false);
595 }
eb63f5ff 596 fZoomInMode = value;
df0b8ff4
BH
597 }
598
599 /**
600 * Sets the zoom out mode.
013a5f1c 601 *
df0b8ff4
BH
602 * @param The mode value to set.
603 */
604 public void setZoomOutMode(boolean value) {
605 if (value) {
606 setZoomInMode(false);
607 }
eb63f5ff 608 fZoomOutMode = value;
df0b8ff4
BH
609 }
610
611 /**
612 * Moves the Sequence diagram to ensure the given node is visible and draw it selected
013a5f1c 613 *
df0b8ff4
BH
614 * @param node the GraphNode to move to
615 */
616 public void moveTo(GraphNode node) {
617 if (node == null) {
618 return;
619 }
620 clearSelection();
621 addSelection(node);
622 ensureVisible(node);
623 }
624
625 /**
626 * Moves the Sequence diagram to ensure the given node is visible
013a5f1c 627 *
df0b8ff4
BH
628 * @param node the GraphNode to move to
629 */
630 public void ensureVisible(GraphNode node) {
631 if (node == null) {
632 return;
633 }
eb63f5ff
BH
634 int x = Math.round(node.getX() * fZoomValue);
635 int y = Math.round(node.getY() * fZoomValue);
636 int width = Math.round(node.getWidth() * fZoomValue);
637 int height = Math.round(node.getHeight() * fZoomValue);
638 if ((node instanceof BaseMessage) && (height == 0)) {
639 int header = Metrics.LIFELINE_HEARDER_TEXT_V_MARGIN * 2 + Metrics.getLifelineHeaderFontHeigth();
640 height = -Math.round((Metrics.getMessagesSpacing() + header) * fZoomValue);
641 y = y + Math.round(Metrics.SYNC_INTERNAL_MESSAGE_HEIGHT * fZoomValue);
df0b8ff4
BH
642 }
643 if (node instanceof BasicExecutionOccurrence) {
644 width = 1;
645 height = 1;
646 }
647 if (node instanceof Lifeline) {
648 y = getContentsY();
649 height = getVisibleHeight();
650 }
651 ensureVisible(x, y, width, height, SWT.CENTER, true);
652 redraw();
653 }
654
655 /**
656 * Returns the current zoom factor.
657 * @return the current zoom factor.
658 */
659 public float getZoomFactor() {
eb63f5ff 660 return fZoomValue;
df0b8ff4
BH
661 }
662
663 /**
664 * Returns teh printer reference.
013a5f1c 665 *
df0b8ff4
BH
666 * @return the printer reference
667 */
668 public Printer getPrinter() {
eb63f5ff 669 return fPrinter;
df0b8ff4
BH
670 }
671
672 /**
673 * Returns whether the widget is used for printing or not.
013a5f1c 674 *
df0b8ff4
BH
675 * @return whether the widget is used for printing or not
676 */
677 public boolean isPrinting() {
eb63f5ff 678 return fIsPrinting;
df0b8ff4
BH
679 }
680
681 /**
682 * Gets the overview image.
013a5f1c 683 *
df0b8ff4
BH
684 * @param rect Rectangle to include overview.
685 * @return the overview image
686 */
687 public Image getOverview(Rectangle rect) {
eb63f5ff
BH
688 float oldzoom = fZoomValue;
689 if ((fOverView != null) && ((rect.width != fOverView.getBounds().width) || (rect.height != fOverView.getBounds().height))) {
690 fOverView.dispose();
691 fOverView = null;
df0b8ff4 692 }
eb63f5ff 693 if (fOverView == null) {
df0b8ff4
BH
694 int backX = getContentsX();
695 int backY = getContentsY();
696 setContentsPos(0, 0);
eb63f5ff
BH
697 fOverView = new Image(getDisplay(), rect.width, rect.height);
698 GC gcim = new GC(fOverView);
df0b8ff4
BH
699 NGC context = new NGC(this, gcim);
700 context.setBackground(SDViewPref.getInstance().getBackGroundColor(SDViewPref.PREF_FRAME));
eb63f5ff 701 fFrame.draw(context);
df0b8ff4
BH
702 setContentsPos(backX, backY);
703 gcim.dispose();
704 context.dispose();
705 }
eb63f5ff
BH
706 fZoomValue = oldzoom;
707 return fOverView;
df0b8ff4 708 }
013a5f1c 709
df0b8ff4
BH
710 /**
711 * Resets the zoom factor.
712 */
713 public void resetZoomFactor() {
eb63f5ff
BH
714 int currentX = Math.round(getContentsX() / fZoomValue);
715 int currentY = Math.round(getContentsY() / fZoomValue);
716 fZoomValue = 1;
717 if (fTimeBar != null && !fTimeBar.isDisposed()) {
718 fTimeBar.setZoom(fZoomValue);
df0b8ff4
BH
719 }
720 redraw();
721 update();
722 setContentsPos(currentX, currentY);
723 }
724
725 /**
726 * Enable or disable the lifeline reodering using Drag and Drop
013a5f1c 727 *
df0b8ff4
BH
728 * @param mode - true to enable false otherwise
729 */
730 public void setReorderMode(boolean mode) {
eb63f5ff 731 fReorderMode = mode;
df0b8ff4
BH
732 }
733
734 /**
735 * Return the lifelines reorder sequence (using Drag and Drop) if the the reorder mode is turn on. Each ArryList
736 * element is of type Lifeline[2] with Lifeline[0] inserted before Lifeline[1] in the diagram
013a5f1c
AM
737 *
738 * @return - the re-odered sequence
df0b8ff4 739 */
3145ec83 740 public List<Lifeline[]> getLifelineReoderList() {
eb63f5ff 741 return fReorderList;
df0b8ff4
BH
742 }
743
744 /**
745 * Sets the focus on given graph node (current node).
013a5f1c 746 *
df0b8ff4
BH
747 * @param the graph node to focus on.
748 */
749 public void setFocus(GraphNode node) {
750 if (node == null) {
751 return;
752 }
eb63f5ff
BH
753 if (fCurrentGraphNode != null) {
754 fCurrentGraphNode.setFocused(false);
df0b8ff4 755 }
eb63f5ff 756 fCurrentGraphNode = node;
df0b8ff4
BH
757 node.setFocused(true);
758 ensureVisible(node);
759 setFocus(0);
760 }
761
762 /**
763 * Returns the graph node focused on.
013a5f1c 764 *
df0b8ff4
BH
765 * @return the current graph node
766 */
767 public GraphNode getFocusNode() {
eb63f5ff 768 return fCurrentGraphNode;
df0b8ff4
BH
769 }
770
771 /**
772 * Method to traverse right.
773 */
774 public void traverseRight() {
775 Object selectedNode = getFocusNode();
776 if (selectedNode == null) {
777 traverseLeft();
778 }
779 GraphNode node = null;
eb63f5ff
BH
780 if ((selectedNode instanceof BaseMessage) && (((BaseMessage) selectedNode).getEndLifeline() != null)) {
781 node = fFrame.getCalledMessage((BaseMessage) selectedNode);
df0b8ff4
BH
782 }
783 if (selectedNode instanceof BasicExecutionOccurrence) {
784 selectedNode = ((BasicExecutionOccurrence) selectedNode).getLifeline();
785 }
786 if ((node == null) && (selectedNode instanceof Lifeline)) {
eb63f5ff
BH
787 for (int i = 0; i < fFrame.lifeLinesCount(); i++) {
788 if ((selectedNode == fFrame.getLifeline(i)) && (i < fFrame.lifeLinesCount() - 1)) {
789 node = fFrame.getLifeline(i + 1);
df0b8ff4
BH
790 break;
791 }
792 }
793 }
794 if (node != null) {
795 setFocus(node);
796 redraw();
797 }
798 }
799
800 /**
801 * Method to traverse left.
802 */
803 public void traverseLeft() {
804 Object selectedNode = getFocusNode();
805 GraphNode node = null;
eb63f5ff
BH
806 if ((selectedNode instanceof BaseMessage) && (((BaseMessage) selectedNode).getStartLifeline() != null)) {
807 node = fFrame.getCallerMessage((BaseMessage) selectedNode);
df0b8ff4
BH
808 }
809 if (selectedNode instanceof BasicExecutionOccurrence) {
810 selectedNode = ((BasicExecutionOccurrence) selectedNode).getLifeline();
811 }
812 if (node == null) {
eb63f5ff
BH
813 if ((selectedNode instanceof BaseMessage) && (((BaseMessage) selectedNode).getEndLifeline() != null)) {
814 selectedNode = ((BaseMessage) selectedNode).getEndLifeline();
df0b8ff4 815 }
eb63f5ff
BH
816 for (int i = 0; i < fFrame.lifeLinesCount(); i++) {
817 if ((selectedNode == fFrame.getLifeline(i)) && (i > 0)) {
818 node = fFrame.getLifeline(i - 1);
df0b8ff4
BH
819 break;
820 }
821 }
eb63f5ff
BH
822 if ((fFrame.lifeLinesCount() > 0) && (node == null)) {
823 node = fFrame.getLifeline(0);
df0b8ff4
BH
824 }
825 }
826 if (node != null) {
827 setFocus(node);
828 redraw();
829 }
830 }
831
832 /**
833 * Method to traverse up.
834 */
835 public void traverseUp() {
836 Object selectedNode = getFocusNode();
837 if (selectedNode == null) {
838 traverseLeft();
839 }
840 GraphNode node = null;
841 if (selectedNode instanceof BaseMessage) {
eb63f5ff 842 node = fFrame.getPrevLifelineMessage(((BaseMessage) selectedNode).getStartLifeline(), (BaseMessage) selectedNode);
df0b8ff4 843 } else if (selectedNode instanceof Lifeline) {
eb63f5ff 844 node = fFrame.getPrevLifelineMessage((Lifeline) selectedNode, null);
df0b8ff4
BH
845 if (!(node instanceof Lifeline)) {
846 node = null;
847 }
848 } else if (selectedNode instanceof BasicExecutionOccurrence) {
eb63f5ff 849 node = fFrame.getPrevExecOccurrence((BasicExecutionOccurrence) selectedNode);
df0b8ff4
BH
850 if (node == null) {
851 node = ((BasicExecutionOccurrence) selectedNode).getLifeline();
852 }
853 }
eb63f5ff
BH
854 if ((node == null) && (selectedNode instanceof BaseMessage) && (((BaseMessage) selectedNode).getStartLifeline() != null)) {
855 node = ((BaseMessage) selectedNode).getStartLifeline();
df0b8ff4
BH
856 }
857
858 if (node != null) {
859 setFocus(node);
860 redraw();
861 }
862 }
863
864 /**
865 * Method to traverse down.
866 */
867 public void traverseDown() {
868 Object selectedNode = getFocusNode();
869 if (selectedNode == null) {
870 traverseLeft();
871 }
872 GraphNode node;
873 if (selectedNode instanceof BaseMessage) {
eb63f5ff 874 node = fFrame.getNextLifelineMessage(((BaseMessage) selectedNode).getStartLifeline(), (BaseMessage) selectedNode);
df0b8ff4
BH
875 } else if (selectedNode instanceof Lifeline) {
876 // node = frame.getNextLifelineMessage((Lifeline)selectedNode,null);
eb63f5ff 877 node = fFrame.getFirstExecution((Lifeline) selectedNode);
df0b8ff4 878 } else if (selectedNode instanceof BasicExecutionOccurrence) {
eb63f5ff 879 node = fFrame.getNextExecOccurrence((BasicExecutionOccurrence) selectedNode);
df0b8ff4
BH
880 } else {
881 return;
882 }
883
884 if (node != null) {
885 setFocus(node);
886 redraw();
887 }
888 }
889
890 /**
891 * Method to traverse home.
892 */
893 public void traverseHome() {
894 Object selectedNode = getFocusNode();
895 if (selectedNode == null) {
896 traverseLeft();
897 }
898 GraphNode node = null;
013a5f1c 899
df0b8ff4
BH
900 if (selectedNode instanceof BaseMessage) {
901 if (((BaseMessage) selectedNode).getStartLifeline() != null) {
eb63f5ff 902 node = fFrame.getNextLifelineMessage(((BaseMessage) selectedNode).getStartLifeline(), null);
df0b8ff4 903 } else {
eb63f5ff 904 node = fFrame.getNextLifelineMessage(((BaseMessage) selectedNode).getEndLifeline(), null);
df0b8ff4
BH
905 }
906 } else if (selectedNode instanceof Lifeline) {
eb63f5ff 907 node = fFrame.getNextLifelineMessage((Lifeline) selectedNode, null);
df0b8ff4 908 } else if (selectedNode instanceof BasicExecutionOccurrence) {
eb63f5ff 909 node = fFrame.getFirstExecution(((BasicExecutionOccurrence) selectedNode).getLifeline());
df0b8ff4 910 } else {
eb63f5ff
BH
911 if (fFrame.lifeLinesCount() > 0) {
912 Lifeline lifeline = fFrame.getLifeline(0);
913 node = fFrame.getNextLifelineMessage(lifeline, null);
df0b8ff4
BH
914 }
915 }
916
917 if (node != null) {
918 setFocus(node);
919 redraw();
920 }
921 }
922
923 /**
924 * Method to traverse to the end.
925 */
926 public void traverseEnd() {
927 Object selectedNode = getFocusNode();
928 if (selectedNode == null) {
929 traverseLeft();
930 }
931 GraphNode node;
932 if (selectedNode instanceof BaseMessage) {
eb63f5ff 933 node = fFrame.getPrevLifelineMessage(((BaseMessage) selectedNode).getStartLifeline(), null);
df0b8ff4 934 } else if (selectedNode instanceof Lifeline) {
eb63f5ff 935 node = fFrame.getPrevLifelineMessage((Lifeline) selectedNode, null);
df0b8ff4 936 } else if (selectedNode instanceof BasicExecutionOccurrence) {
eb63f5ff 937 node = fFrame.getLastExecOccurrence(((BasicExecutionOccurrence) selectedNode).getLifeline());
df0b8ff4 938 } else {
eb63f5ff
BH
939 if (fFrame.lifeLinesCount() > 0) {
940 Lifeline lifeline = fFrame.getLifeline(0);
941 node = fFrame.getPrevLifelineMessage(lifeline, null);
df0b8ff4
BH
942 } else {
943 return;
944 }
945 }
946
947 if (node != null) {
948 setFocus(node);
949 redraw();
950 }
951 }
952
953 /**
954 * Method to print UI.
013a5f1c 955 *
df0b8ff4
BH
956 * @param sdPrintDialog the sequence diagram printer dialog.
957 */
958 public void printUI(SDPrintDialogUI sdPrintDialog) {
959 PrinterData data = sdPrintDialog.getPrinterData();
960
eb63f5ff 961 if ((data == null) || (fFrame == null)) {
df0b8ff4
BH
962 return;
963 }
013a5f1c 964
eb63f5ff 965 fPrinter = new Printer(data);
013a5f1c 966
eb63f5ff
BH
967 String jobName = MessageFormat.format(SDMessages._116, new Object[] { String.valueOf(fSite.getContentDescription()), String.valueOf(fFrame.getName()) });
968 fPrinter.startJob(jobName);
013a5f1c 969
eb63f5ff 970 GC gc = new GC(fPrinter);
3145ec83 971// Frame.setUserPref(SDViewPref.getInstance());
df0b8ff4 972
eb63f5ff 973 float lastZoom = fZoomValue;
df0b8ff4
BH
974
975 Rectangle area = getClientArea();
976 GC gcim = null;
977
978 gcim = gc;
979 NGC context = new NGC(this, gcim);
980
981 // Set the metrics to use for lifeline text and message text
982 // using the Graphical Context
983 Metrics.setLifelineFontHeight(context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_LIFELINE)));
984 Metrics.setLifelineFontWidth(context.getFontWidth(SDViewPref.getInstance().getFont(SDViewPref.PREF_LIFELINE)));
985 Metrics.setLifelineWidth(SDViewPref.getInstance().getLifelineWidth());
3145ec83
BH
986 Metrics.setFrameFontHeight(context.getFontHeight(SDViewPref.getInstance().getFont(ISDPreferences.PREF_FRAME_NAME)));
987 Metrics.setLifelineHeaderFontHeight(context.getFontHeight(SDViewPref.getInstance().getFont(ISDPreferences.PREF_LIFELINE_HEADER)));
df0b8ff4
BH
988
989 int syncMessFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_SYNC_MESS));
990 int syncMessRetFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_SYNC_MESS_RET));
991 int asyncMessFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_ASYNC_MESS));
992 int asyncMessRetFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_ASYNC_MESS_RET));
993
994 int messageFontHeight = 0;
995 if (syncMessFontH > syncMessRetFontH) {
996 messageFontHeight = syncMessFontH;
997 } else {
998 messageFontHeight = syncMessRetFontH;
999 }
1000 if (messageFontHeight < asyncMessFontH) {
1001 messageFontHeight = asyncMessFontH;
1002 }
1003 if (messageFontHeight < asyncMessRetFontH) {
1004 messageFontHeight = asyncMessRetFontH;
1005 }
1006 Metrics.setMessageFontHeight(messageFontHeight);
1007 context.setFont(SDViewPref.getInstance().getFont(SDViewPref.PREF_LIFELINE));
1008
eb63f5ff
BH
1009 int width = Math.round((fFrame.getWidth() + 2 * Metrics.FRAME_H_MARGIN) * fZoomValue);
1010 int height = Math.round((fFrame.getHeight() + 2 * Metrics.FRAME_V_MARGIN) * fZoomValue);
df0b8ff4
BH
1011 if (width < area.width) {
1012 width = area.width;
1013 }
1014 if (height < area.height) {
1015 height = area.height;
1016 }
1017 resizeContents(width, height);
1018
3145ec83 1019 context.setBackground(SDViewPref.getInstance().getBackGroundColor(ISDPreferences.PREF_FRAME));
df0b8ff4 1020 context.fillRectangle(0, 0, getContentsWidth(), Metrics.FRAME_V_MARGIN);
eb63f5ff
BH
1021 context.fillRectangle(0, 0, fFrame.getX(), getContentsHeight());
1022 context.fillRectangle(fFrame.getX() + fFrame.getWidth() + 1, 0, getContentsWidth() - (fFrame.getX() + fFrame.getWidth() + 1), getContentsHeight());
1023 context.fillRectangle(0, fFrame.getY() + fFrame.getHeight() + 1, getContentsWidth(), getContentsHeight() - (fFrame.getY() + fFrame.getHeight() + 1));
df0b8ff4
BH
1024 gcim.setLineWidth(1);
1025
eb63f5ff
BH
1026 fPrinter.startPage();
1027 fZoomValue = lastZoom;
df0b8ff4
BH
1028
1029 int restoreX = getContentsX();
1030 int restoreY = getContentsY();
1031
eb63f5ff
BH
1032 float zh = sdPrintDialog.getStepY() * sdPrintDialog.getZoomFactor();
1033 float zw = sdPrintDialog.getStepX() * sdPrintDialog.getZoomFactor();
df0b8ff4 1034
eb63f5ff
BH
1035 float zoomValueH = fPrinter.getClientArea().height / zh;
1036 float zoomValueW = fPrinter.getClientArea().width / zw;
df0b8ff4 1037 if (zoomValueH > zoomValueW) {
eb63f5ff 1038 fPrinterZoom = zoomValueH;
df0b8ff4 1039 } else {
eb63f5ff 1040 fPrinterZoom = zoomValueW;
df0b8ff4
BH
1041 }
1042
1043 if (sdPrintDialog.printSelection()) {
1044 int[] pagesList = sdPrintDialog.getPageList();
1045
1046 for (int pageIndex = 0; pageIndex < pagesList.length; pageIndex++) {
1047 printPage(pagesList[pageIndex], sdPrintDialog, context);
1048 }
1049 } else if (sdPrintDialog.printAll()) {
1050 for (int pageIndex = 1; pageIndex <= sdPrintDialog.maxNumOfPages(); pageIndex++) {
1051 printPage(pageIndex, sdPrintDialog, context);
1052 }
1053 } else if (sdPrintDialog.printCurrent()) {
1054 printPage(getContentsX(), getContentsY(), sdPrintDialog, context, 1);
1055 } else if (sdPrintDialog.printRange()) {
1056 for (int pageIndex = sdPrintDialog.getFrom(); pageIndex <= sdPrintDialog.maxNumOfPages() && pageIndex <= sdPrintDialog.getTo(); pageIndex++) {
1057 printPage(pageIndex, sdPrintDialog, context);
1058 }
1059 }
1060
eb63f5ff
BH
1061 fPrinter.endJob();
1062 fIsPrinting = false;
df0b8ff4
BH
1063
1064 gc.dispose();
1065 context.dispose();
1066
eb63f5ff
BH
1067 fZoomValue = lastZoom;
1068 fPrinter.dispose();
df0b8ff4
BH
1069 setContentsPos(restoreX, restoreY);
1070 }
1071
1072 /**
1073 * Method to print.
1074 */
1075 public void print() {
1076 SDPrintDialog sdPrinter = new SDPrintDialog(this.getShell(), this);
1077 try {
1078 if (sdPrinter.open() != 0) {
1079 return;
1080 }
1081 } catch (Exception e) {
8fd82db5 1082 Activator.getDefault().logError("Error creating image", e); //$NON-NLS-1$
df0b8ff4
BH
1083 return;
1084 }
1085 printUI(sdPrinter.getDialogUI());
1086 }
1087
1088 /**
1089 * Method to print a page.
013a5f1c 1090 *
df0b8ff4
BH
1091 * @param pageNum The page number
1092 * @param pd The sequence diagram print dialog
1093 * @param context The graphical context
1094 */
1095 public void printPage(int pageNum, SDPrintDialogUI pd, NGC context) {
1096 int j = pageNum / pd.getNbRow();
1097 int i = pageNum % pd.getNbRow();
1098 if (i != 0) {
1099 j++;
1100 } else {
1101 i = pd.getNbRow();
1102 }
1103
1104 i--;
1105 j--;
1106
1107 i = (int) (i * pd.getStepX());
1108 j = (int) (j * pd.getStepY());
1109
1110 printPage(i, j, pd, context, pageNum);
1111
eb63f5ff 1112 fPrinter.endPage();
df0b8ff4
BH
1113 }
1114
1115 /**
1116 * Method to print page ranges.
013a5f1c 1117 *
df0b8ff4
BH
1118 * @param i The start page
1119 * @param j The end page
1120 * @param pd The sequence diagram print dialog
1121 * @param context The graphical context
1122 * @param pageNum int the current page
1123 */
1124 public void printPage(int i, int j, SDPrintDialogUI pd, NGC context, int pageNum) {
eb63f5ff
BH
1125 fIsPrinting = false;
1126 int pageNumFontZoom = fPrinter.getClientArea().height / getVisibleHeight();
1127 fPrinterX = i;
1128 fPrinterY = j;
df0b8ff4
BH
1129 setContentsPos(i, j);
1130 update();
eb63f5ff
BH
1131 fIsPrinting = true;
1132 float lastZoom = fZoomValue;
1133 fZoomValue = fPrinterZoom * lastZoom;
df0b8ff4 1134
eb63f5ff 1135 fFrame.draw(context);
df0b8ff4 1136
eb63f5ff 1137 fZoomValue = pageNumFontZoom;
df0b8ff4
BH
1138 context.setFont(SDViewPref.getInstance().getFont(SDViewPref.PREF_LIFELINE));
1139 String currentPageNum = String.valueOf(pageNum);
1140 int ii = context.textExtent(currentPageNum);
1141 int jj = context.getCurrentFontHeight();
1142 // context.setBackground(ColorImpl.getSystemColor(SWT.COLOR_BLACK));
1143 // context.setForeground(ColorImpl.getSystemColor(SWT.COLOR_WHITE));
eb63f5ff
BH
1144 fZoomValue = fPrinterZoom * lastZoom;
1145 context.drawText(currentPageNum, Math.round(fPrinterX + getVisibleWidth() / fPrinterZoom - ii / fPrinterZoom), Math.round(fPrinterY + getVisibleHeight() / fPrinterZoom - jj / fPrinterZoom), false);
1146 fIsPrinting = false;
1147 fZoomValue = lastZoom;
df0b8ff4 1148 }
013a5f1c 1149
df0b8ff4
BH
1150 /**
1151 * Sets the collapse provider.
013a5f1c 1152 *
df0b8ff4
BH
1153 * @param provider The collapse provider to set
1154 */
1155 protected void setCollapseProvider(ISDCollapseProvider provider) {
eb63f5ff 1156 fCollapseProvider = provider;
df0b8ff4
BH
1157 }
1158
013a5f1c 1159
df0b8ff4
BH
1160 /**
1161 * Checks for focus of children.
013a5f1c 1162 *
df0b8ff4
BH
1163 * @param children Control to check
1164 * @return true if child is on focus else false
1165 */
1166 protected boolean checkFocusOnChilds(Control children) {
1167 if (children instanceof Composite) {
1168 Control[] child = ((Composite) children).getChildren();
1169 for (int i = 0; i < child.length; i++) {
1170 if (child[i].isFocusControl()) {
1171 return true;
73005152 1172 } else {
df0b8ff4 1173 checkFocusOnChilds(child[i]);
73005152 1174 }
df0b8ff4 1175 }
73005152 1176 }
df0b8ff4 1177 return false;
73005152
BH
1178 }
1179
df0b8ff4
BH
1180 /**
1181 * A post action for a tooltip (before displaying).
013a5f1c 1182 *
df0b8ff4
BH
1183 * @param accessible true if accessible else false
1184 * @return the tooltip text.
1185 */
73005152 1186 protected String getPostfixForTooltip(boolean accessible) {
3145ec83
BH
1187 StringBuffer postfix = new StringBuffer();
1188// String postfix = "";//$NON-NLS-1$
73005152
BH
1189 // Determine if the tooltip must show the time difference between the current mouse position and
1190 // the last selected graphNode
013a5f1c
AM
1191 if ((fCurrentGraphNode != null) &&
1192 (fCurrentGraphNode instanceof ITimeRange) &&
1193 (fToolTipNode instanceof ITimeRange) &&
1194 (fCurrentGraphNode != fToolTipNode) &&
1195 ((ITimeRange) fToolTipNode).hasTimeInfo() &&
eb63f5ff 1196 ((ITimeRange) fCurrentGraphNode).hasTimeInfo()) {
3145ec83
BH
1197 postfix.append(" -> "); //$NON-NLS-1$
1198 postfix.append(fCurrentGraphNode.getName());
1199 postfix.append("\n"); //$NON-NLS-1$
1200 postfix.append(SDMessages._138);
1201 postfix.append(" "); //$NON-NLS-1$
013a5f1c
AM
1202
1203// postfix = " -> " + fCurrentGraphNode.getName() + "\n" + SDMessages._138 + " "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
1204
73005152 1205 //double delta = ((ITimeRange)toolTipNode).getLastTime()-((ITimeRange)currentGraphNode).getLastTime();
eb63f5ff
BH
1206 ITmfTimestamp firstTime = ((ITimeRange) fCurrentGraphNode).getEndTime();
1207 ITmfTimestamp lastTime = ((ITimeRange) fToolTipNode).getEndTime();
5179fc01 1208 TmfTimestamp delta = (TmfTimestamp) lastTime.getDelta(firstTime);
3145ec83
BH
1209 postfix.append(delta.toString());
1210
1211// postfix += delta.toString();
73005152 1212 } else {
eb63f5ff 1213 if ((fToolTipNode instanceof ITimeRange) && ((ITimeRange) fToolTipNode).hasTimeInfo()) {
3145ec83
BH
1214 postfix.append("\n"); //$NON-NLS-1$
1215// postfix = "\n";//$NON-NLS-1$
eb63f5ff 1216 ITmfTimestamp firstTime = ((ITimeRange) fToolTipNode).getStartTime();
013a5f1c
AM
1217 ITmfTimestamp lastTime = ((ITimeRange) fToolTipNode).getEndTime();
1218
73005152
BH
1219 if (firstTime != null) {
1220 if (lastTime != null && firstTime.compareTo(lastTime, true) != 0) {
3145ec83
BH
1221 postfix.append("start: "); //$NON-NLS-1$
1222 postfix.append(firstTime.toString());
1223 postfix.append("\n"); //$NON-NLS-1$
013a5f1c 1224 postfix.append("end: "); //$NON-NLS-1$
3145ec83
BH
1225 postfix.append(lastTime.toString());
1226 postfix.append("\n"); //$NON-NLS-1$
1227// postfix += "start: " + firstTime + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
1228// postfix += "end: " + lastTime + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
df0b8ff4 1229 } else {
3145ec83 1230 postfix.append(firstTime.toString());
013a5f1c 1231// postfix += firstTime.toString();
df0b8ff4
BH
1232 }
1233 }
1234 else if (lastTime != null) {
3145ec83
BH
1235 postfix.append(lastTime.toString());
1236// postfix += lastTime.toString();
73005152 1237 }
73005152
BH
1238 }
1239 }
3145ec83 1240 return postfix.toString();
df0b8ff4 1241 }
73005152 1242
df0b8ff4
BH
1243 /**
1244 * Sets a new focused widget.
013a5f1c 1245 *
df0b8ff4
BH
1246 * @param newFocusShape A new focus shape.
1247 */
1248 protected void setFocus(int newFocusShape) {
eb63f5ff
BH
1249 fFocusedWidget = newFocusShape;
1250 if (fFocusedWidget == -1) {
df0b8ff4
BH
1251 getViewControl().getAccessible().setFocus(ACC.CHILDID_SELF);
1252 } else {
eb63f5ff 1253 getViewControl().getAccessible().setFocus(fFocusedWidget);
df0b8ff4 1254 }
73005152
BH
1255 }
1256
1257 /**
1258 * Highlight the given GraphNode<br>
1259 * The GraphNode is then displayed using the system default selection color
013a5f1c 1260 *
73005152
BH
1261 * @param node the GraphNode to highlight
1262 */
1263 protected void performSelection(GraphNode node) {
eb63f5ff 1264 if ((fCtrlSelection) || (fShiftSelection)) {
73005152 1265 if (node != null) {
eb63f5ff 1266 if (fSelectedNodeList.contains(node)) {
73005152
BH
1267 removeSelection(node);
1268 } else {
1269 addSelection(node);
1270 }
df0b8ff4 1271 } else {
73005152 1272 return;
df0b8ff4 1273 }
73005152
BH
1274 } else {
1275 clearSelection();
1276 if (node != null) {
1277 addSelection(node);
1278 }
1279 }
1280 }
1281
73005152 1282 /**
df0b8ff4 1283 * Returns a draw buffer image.
013a5f1c
AM
1284 *
1285 * @return a Image containing the draw buffer.
73005152 1286 */
df0b8ff4 1287 protected Image getDrawBuffer() {
73005152
BH
1288
1289 update();
1290 Rectangle area = getClientArea();
1291 Image dbuffer = null;
1292 GC gcim = null;
1293
1294 try {
73005152
BH
1295 dbuffer = new Image(getDisplay(), area.width, area.height);
1296 } catch (Exception e) {
8fd82db5 1297 Activator.getDefault().logError("Error creating image", e); //$NON-NLS-1$
73005152 1298 }
df0b8ff4 1299
73005152
BH
1300 gcim = new GC(dbuffer);
1301
1302 NGC context = new NGC(this, gcim);
1303
1304 // Set the metrics to use for lifeline text and message text
1305 // using the Graphical Context
1306 Metrics.setLifelineFontHeight(context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_LIFELINE)));
1307 Metrics.setLifelineFontWidth(context.getFontWidth(SDViewPref.getInstance().getFont(SDViewPref.PREF_LIFELINE)));
1308 Metrics.setLifelineWidth(SDViewPref.getInstance().getLifelineWidth());
3145ec83
BH
1309 Metrics.setFrameFontHeight(context.getFontHeight(SDViewPref.getInstance().getFont(ISDPreferences.PREF_FRAME_NAME)));
1310 Metrics.setLifelineHeaderFontHeight(context.getFontHeight(SDViewPref.getInstance().getFont(ISDPreferences.PREF_LIFELINE_HEADER)));
73005152
BH
1311
1312 int syncMessFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_SYNC_MESS));
1313 int syncMessRetFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_SYNC_MESS_RET));
1314 int asyncMessFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_ASYNC_MESS));
1315 int asyncMessRetFontH = context.getFontHeight(SDViewPref.getInstance().getFont(SDViewPref.PREF_ASYNC_MESS_RET));
1316
1317 int messageFontHeight = 0;
df0b8ff4 1318 if (syncMessFontH > syncMessRetFontH) {
73005152 1319 messageFontHeight = syncMessFontH;
df0b8ff4 1320 } else {
73005152 1321 messageFontHeight = syncMessRetFontH;
df0b8ff4
BH
1322 }
1323 if (messageFontHeight < asyncMessFontH) {
73005152 1324 messageFontHeight = asyncMessFontH;
df0b8ff4
BH
1325 }
1326 if (messageFontHeight < asyncMessRetFontH) {
73005152 1327 messageFontHeight = asyncMessRetFontH;
df0b8ff4 1328 }
73005152
BH
1329 Metrics.setMessageFontHeight(messageFontHeight);
1330 context.setFont(SDViewPref.getInstance().getFont(SDViewPref.PREF_LIFELINE));
1331
eb63f5ff
BH
1332 int width = (int) ((fFrame.getWidth() + 2 * Metrics.FRAME_H_MARGIN) * fZoomValue);
1333 int height = (int) ((fFrame.getHeight() + 2 * Metrics.FRAME_V_MARGIN) * fZoomValue);
df0b8ff4 1334
73005152
BH
1335 resizeContents(width, height);
1336
3145ec83 1337 context.setBackground(SDViewPref.getInstance().getBackGroundColor(ISDPreferences.PREF_FRAME));
73005152 1338 context.fillRectangle(0, 0, getContentsWidth(), Metrics.FRAME_V_MARGIN);
eb63f5ff
BH
1339 context.fillRectangle(0, 0, fFrame.getX(), getContentsHeight());
1340 context.fillRectangle(fFrame.getX() + fFrame.getWidth() + 1, 0, getContentsWidth() - (fFrame.getX() + fFrame.getWidth() + 1), getContentsHeight());
1341 context.fillRectangle(0, fFrame.getY() + fFrame.getHeight() + 1, getContentsWidth(), getContentsHeight() - (fFrame.getY() + fFrame.getHeight() + 1));
73005152
BH
1342 gcim.setLineWidth(1);
1343
eb63f5ff
BH
1344 fFrame.draw(context);
1345 if (fDragAndDrop != null) {
1346 Lifeline node = (Lifeline) fDragAndDrop;
1347 boolean isSelected = fDragAndDrop.isSelected();
1348 boolean hasFocus = fDragAndDrop.hasFocus();
73005152
BH
1349 node.setSelected(false);
1350 node.setFocused(false);
eb63f5ff 1351 node.draw(context, fDragX, fDragY);
73005152
BH
1352 node.setSelected(isSelected);
1353 node.setFocused(hasFocus);
1354 }
1355 gcim.dispose();
1356 context.dispose();
1357 return dbuffer;
1358 }
013a5f1c 1359
df0b8ff4
BH
1360 /*
1361 * (non-Javadoc)
1362 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#keyPressedEvent(org.eclipse.swt.events.KeyEvent)
73005152
BH
1363 */
1364 @Override
df0b8ff4
BH
1365 protected void keyPressedEvent(KeyEvent event) {
1366 if (!(isFocusControl() || getViewControl().isFocusControl())) {
1367 Control[] child = getParent().getChildren();
1368 for (int i = 0; i < child.length; i++) {
eb63f5ff
BH
1369 if ((child[i].isFocusControl())&& (!(child[i] instanceof ScrollView))) {
1370 getViewControl().setFocus();
1371 break;
df0b8ff4
BH
1372 }
1373 }
73005152 1374 }
df0b8ff4 1375 setFocus(-1);
73005152 1376
df0b8ff4 1377 if (event.keyCode == SWT.CTRL) {
eb63f5ff 1378 fCtrlSelection = true;
df0b8ff4
BH
1379 }
1380 if (event.keyCode == SWT.SHIFT) {
eb63f5ff
BH
1381 fShiftSelection = true;
1382 fPrevList = new ArrayList<GraphNode>();
1383 fPrevList.addAll(getSelection());
df0b8ff4 1384 }
73005152 1385
df0b8ff4
BH
1386 GraphNode prevNode = getFocusNode();
1387
1388 if (event.keyCode == SWT.ARROW_RIGHT) {
1389 traverseRight();
73005152 1390 }
df0b8ff4
BH
1391
1392 if (event.keyCode == SWT.ARROW_LEFT) {
1393 traverseLeft();
73005152 1394 }
df0b8ff4
BH
1395
1396 if (event.keyCode == SWT.ARROW_DOWN) {
1397 traverseDown();
73005152 1398 }
73005152 1399
df0b8ff4
BH
1400 if (event.keyCode == SWT.ARROW_UP) {
1401 traverseUp();
1402 }
73005152 1403
df0b8ff4
BH
1404 if (event.keyCode == SWT.HOME) {
1405 traverseHome();
1406 }
73005152 1407
df0b8ff4
BH
1408 if (event.keyCode == SWT.END) {
1409 traverseEnd();
73005152 1410 }
73005152 1411
eb63f5ff
BH
1412 if ((!fShiftSelection) && (!fCtrlSelection)) {
1413 fListStart = fCurrentGraphNode;
df0b8ff4 1414 }
73005152 1415
df0b8ff4 1416 if (event.character == ' ') {
eb63f5ff 1417 performSelection(fCurrentGraphNode);
013a5f1c 1418 if (!fShiftSelection) {
eb63f5ff 1419 fListStart = fCurrentGraphNode;
013a5f1c 1420 }
df0b8ff4 1421 }
73005152 1422
eb63f5ff 1423 if ((fShiftSelection) && (prevNode != getFocusNode())) {
df0b8ff4 1424 clearSelection();
eb63f5ff
BH
1425 addSelection(fPrevList);
1426 addSelection(fFrame.getNodeList(fListStart, getFocusNode()));
df0b8ff4
BH
1427 if (getFocusNode() instanceof Lifeline) {
1428 ensureVisible(getFocusNode().getX(), getFocusNode().getY(), getFocusNode().getWidth(), getFocusNode().getHeight(), SWT.CENTER | SWT.VERTICAL, true);
013a5f1c 1429 } else {
df0b8ff4
BH
1430 ensureVisible(getFocusNode());
1431 }
eb63f5ff 1432 } else if ((!fCtrlSelection) && (!fShiftSelection)) {
73005152 1433
df0b8ff4
BH
1434 clearSelection();
1435 if (getFocusNode() != null) {
1436 addSelection(getFocusNode());
1437
1438 if (getFocusNode() instanceof Lifeline) {
1439 ensureVisible(getFocusNode().getX(), getFocusNode().getY(), getFocusNode().getWidth(), getFocusNode().getHeight(), SWT.CENTER | SWT.VERTICAL, true);
1440 } else {
1441 ensureVisible(getFocusNode());
1442 }
73005152
BH
1443 }
1444 }
df0b8ff4 1445
eb63f5ff
BH
1446 if (fCurrentGraphNode != null) {
1447 fCurrentGraphNode.setFocused(true);
73005152 1448 }
73005152 1449 redraw();
73005152 1450
eb63f5ff
BH
1451 if ((event.character == ' ') && ((fZoomInMode) || (fZoomOutMode))) {
1452 int cx = Math.round((getContentsX() + getVisibleWidth() / 2) / fZoomValue);
1453 int cy = Math.round((getContentsY() + getVisibleHeight() / 2) / fZoomValue);
1454 if (fZoomInMode) {
1455 if (fZoomValue < 64) {
1456 fZoomValue = fZoomValue * (float) 1.25;
df0b8ff4
BH
1457 }
1458 } else {
eb63f5ff 1459 fZoomValue = fZoomValue / (float) 1.25;
df0b8ff4 1460 }
eb63f5ff
BH
1461 int x = Math.round(cx * fZoomValue - getVisibleWidth() / (float) 2);
1462 int y = Math.round(cy * fZoomValue - getVisibleHeight() / (float) 2);
df0b8ff4 1463 setContentsPos(x, y);
eb63f5ff
BH
1464 if (fTimeBar != null) {
1465 fTimeBar.setZoom(fZoomValue);
df0b8ff4
BH
1466 }
1467 // redraw also resize the scrollView content
1468 redraw();
1469 }
73005152
BH
1470 }
1471
df0b8ff4
BH
1472 /*
1473 * (non-Javadoc)
1474 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#keyReleasedEvent(org.eclipse.swt.events.KeyEvent)
73005152
BH
1475 */
1476 @Override
df0b8ff4
BH
1477 protected void keyReleasedEvent(KeyEvent event) {
1478 setFocus(-1);
013a5f1c 1479 if (event.keyCode == SWT.CTRL) {
eb63f5ff 1480 fCtrlSelection = false;
013a5f1c
AM
1481 }
1482 if (event.keyCode == SWT.SHIFT) {
eb63f5ff 1483 fShiftSelection = false;
013a5f1c 1484 }
df0b8ff4
BH
1485 super.keyReleasedEvent(event);
1486 setFocus(1);
73005152
BH
1487 }
1488
df0b8ff4
BH
1489 /*
1490 * (non-Javadoc)
1491 * @see org.eclipse.swt.widgets.Control#isFocusControl()
1492 */
73005152 1493 @Override
df0b8ff4
BH
1494 public boolean isFocusControl() {
1495 Control[] child = getChildren();
1496 for (int i = 0; i < child.length; i++) {
1497 if (child[i].isFocusControl()) {
1498 return true;
1499 } else {
1500 checkFocusOnChilds(child[i]);
1501 }
73005152 1502 }
df0b8ff4 1503 return false;
73005152
BH
1504 }
1505
df0b8ff4
BH
1506 /*
1507 * (non-Javadoc)
1508 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#setContentsPos(int, int)
1509 */
1510 @Override
1511 public boolean setContentsPos(int x, int y) {
eb63f5ff
BH
1512 int localX = x;
1513 int localY = y;
013a5f1c 1514
eb63f5ff
BH
1515 if (localX < 0) {
1516 localX = 0;
73005152 1517 }
eb63f5ff
BH
1518 if (localY < 0) {
1519 localY = 0;
73005152 1520 }
eb63f5ff 1521 if (fFrame == null) {
df0b8ff4 1522 return false;
73005152 1523 }
eb63f5ff
BH
1524 if (localX + getVisibleWidth() > getContentsWidth()) {
1525 localX = getContentsWidth() - getVisibleWidth();
73005152 1526 }
eb63f5ff
BH
1527 if (localY + getVisibleHeight() > getContentsHeight()) {
1528 localY = getContentsHeight() - getVisibleHeight();
df0b8ff4 1529 }
eb63f5ff
BH
1530 int x1 = Math.round(localX / fZoomValue);
1531 int y2 = Math.round(localY / fZoomValue);
1532 int width = Math.round(getVisibleWidth() / fZoomValue);
1533 int height = Math.round(getVisibleHeight() / fZoomValue);
1534 fFrame.updateIndex(x1, y2, width, height);
73005152 1535
eb63f5ff
BH
1536 if (fInsertionCartet != null && fInsertionCartet.isVisible()) {
1537 fInsertionCartet.setVisible(false);
df0b8ff4 1538 }
73005152 1539
eb63f5ff 1540 return super.setContentsPos(localX, localY);
73005152
BH
1541 }
1542
df0b8ff4
BH
1543 /*
1544 * (non-Javadoc)
1545 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseHover(org.eclipse.swt.events.MouseEvent)
1546 */
73005152 1547 @Override
df0b8ff4
BH
1548 protected void contentsMouseHover(MouseEvent event) {
1549 GraphNode graphNode = null;
eb63f5ff
BH
1550 if (fFrame != null) {
1551 int x = Math.round(event.x / fZoomValue);
1552 int y = Math.round(event.y / fZoomValue);
1553 graphNode = fFrame.getNodeAt(x, y);
df0b8ff4 1554 if ((graphNode != null) && (SDViewPref.getInstance().tooltipEnabled())) {
eb63f5ff 1555 fToolTipNode = graphNode;
df0b8ff4
BH
1556 String postfix = getPostfixForTooltip(true);
1557 if (graphNode instanceof Lifeline) {
1558 Lifeline lifeline = (Lifeline) graphNode;
eb63f5ff 1559 fToolTip.showToolTip(lifeline.getToolTipText() + postfix);
df0b8ff4
BH
1560 setFocus(0);
1561 } else {
eb63f5ff 1562 fToolTip.showToolTip(graphNode.getName() + postfix);
df0b8ff4
BH
1563 setFocus(0);
1564 }
1565 } else {
eb63f5ff 1566 fToolTip.hideToolTip();
df0b8ff4 1567 }
73005152 1568 }
73005152
BH
1569 }
1570
df0b8ff4
BH
1571 /*
1572 * (non-Javadoc)
1573 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseMoveEvent(org.eclipse.swt.events.MouseEvent)
73005152 1574 */
df0b8ff4
BH
1575 @Override
1576 protected void contentsMouseMoveEvent(MouseEvent e) {
eb63f5ff
BH
1577 fScrollToolTip.hideToolTip();
1578 fToolTip.hideToolTip();
df0b8ff4
BH
1579 // super.contentsMouseMoveEvent(e);
1580 if (!(isFocusControl() || getViewControl().isFocusControl())) {
1581 Control[] child = getParent().getChildren();
1582 for (int i = 0; i < child.length; i++) {
eb63f5ff
BH
1583 if ((child[i].isFocusControl()) && (!(child[i] instanceof ScrollView))) {
1584 getViewControl().setFocus();
1585 break;
df0b8ff4
BH
1586 }
1587 }
1588 }
1589 setFocus(-1);
73005152 1590
eb63f5ff
BH
1591 if (((e.stateMask & SWT.BUTTON_MASK) != 0) && ((fDragAndDrop != null) || fIsDragAndDrop) && (fReorderMode || fCollapseProvider != null)) {
1592 fIsDragAndDrop = false;
1593 if (fCurrentGraphNode instanceof Lifeline) {
1594 fDragAndDrop = (Lifeline) fCurrentGraphNode;
df0b8ff4 1595 }
eb63f5ff 1596 if (fDragAndDrop != null) {
df0b8ff4
BH
1597 int dx = 0;
1598 int dy = 0;
1599 if (e.x > getContentsX() + getVisibleWidth()) {
1600 dx = e.x - (getContentsX() + getVisibleWidth());
1601 } else if (e.x < getContentsX()) {
1602 dx = -getContentsX() + e.x;
1603 }
1604 if (e.y > getContentsY() + getVisibleHeight()) {
1605 dy = e.y - (getContentsY() + getVisibleHeight());
1606 } else if (e.y < getContentsY()) {
1607 dy = -getContentsY() + e.y;
1608 }
eb63f5ff
BH
1609 fDragX = e.x;
1610 fDragY = e.y;
df0b8ff4 1611 if (dx != 0 || dy != 0) {
eb63f5ff
BH
1612 if (fLocalAutoScroll == null) {
1613 if (fLocalAutoScrollTimer == null) {
1614 fLocalAutoScrollTimer = new Timer(true);
df0b8ff4 1615 }
eb63f5ff
BH
1616 fLocalAutoScroll = new AutoScroll(this, dx, dy);
1617 fLocalAutoScrollTimer.schedule(fLocalAutoScroll, 0, 75);
df0b8ff4 1618 } else {
eb63f5ff
BH
1619 fLocalAutoScroll.fDeltaX = dx;
1620 fLocalAutoScroll.fDeltaY = dy;
df0b8ff4 1621 }
eb63f5ff
BH
1622 } else if (fLocalAutoScroll != null) {
1623 fLocalAutoScroll.cancel();
1624 fLocalAutoScroll = null;
df0b8ff4 1625 }
eb63f5ff
BH
1626 fDragX = Math.round(e.x / fZoomValue);
1627 fDragY = Math.round(e.y / fZoomValue);
df0b8ff4 1628 redraw();
eb63f5ff
BH
1629 Lifeline node = fFrame.getCloserLifeline(fDragX);
1630 if ((node != null) && (node != fDragAndDrop)) {
df0b8ff4
BH
1631 int y = 0;
1632 int y1 = 0;
1633 int height = Metrics.getLifelineHeaderFontHeigth() + 2 * Metrics.LIFELINE_HEARDER_TEXT_V_MARGIN;
1634 int hMargin = Metrics.LIFELINE_VT_MAGIN / 4;
1635 int x = node.getX();
1636 int width = node.getWidth();
eb63f5ff
BH
1637 if (fFrame.getVisibleAreaY() < node.getY() + node.getHeight() - height - hMargin) {
1638 y = contentsToViewY(Math.round((node.getY() + node.getHeight()) * fZoomValue));
df0b8ff4 1639 } else {
eb63f5ff 1640 y = Math.round(height * fZoomValue);
df0b8ff4 1641 }
73005152 1642
eb63f5ff
BH
1643 if (fFrame.getVisibleAreaY() < contentsToViewY(node.getY() - hMargin)) {
1644 y1 = contentsToViewY(Math.round((node.getY() - hMargin) * fZoomValue));
df0b8ff4 1645 } else {
eb63f5ff 1646 y1 = Math.round(height * fZoomValue);
df0b8ff4
BH
1647 }
1648
eb63f5ff 1649 int rx = Math.round(x * fZoomValue);
df0b8ff4 1650
eb63f5ff
BH
1651 fInsertionCartet.setVisible(true);
1652 if ((fInsertionCartet.getImage() != null) && (!fInsertionCartet.getImage().isDisposed())) {
1653 fInsertionCartet.getImage().dispose();
df0b8ff4 1654 }
eb63f5ff
BH
1655 if (rx <= e.x && Math.round(rx + (width * fZoomValue)) >= e.x) {
1656 if (fCollapseProvider != null) {
1657 ImageData data = fCollapaseCaretImg.getImageData();
1658 data = data.scaledTo(Math.round(fCollapaseCaretImg.getBounds().width * fZoomValue), Math.round(fCollapaseCaretImg.getBounds().height * fZoomValue));
1659 fCurrentCaretImage = new Image(Display.getCurrent(), data);
1660 fInsertionCartet.setImage(fCurrentCaretImage);
1661 fInsertionCartet.setLocation(contentsToViewX(rx + Math.round((width / (float) 2) * fZoomValue)) - fCurrentCaretImage.getBounds().width / 2, y);
df0b8ff4 1662 }
eb63f5ff 1663 } else if (fReorderMode) {
df0b8ff4 1664 if (rx > e.x) {
eb63f5ff 1665 if (node.getIndex() > 1 && fFrame.getLifeline(node.getIndex() - 2) == fDragAndDrop) {
df0b8ff4
BH
1666 return;
1667 }
eb63f5ff
BH
1668 ImageData data = fArrowUpCaretImg.getImageData();
1669 data = data.scaledTo(Math.round(fArrowUpCaretImg.getBounds().width * fZoomValue), Math.round(fArrowUpCaretImg.getBounds().height * fZoomValue));
1670 fCurrentCaretImage = new Image(Display.getCurrent(), data);
1671 fInsertionCartet.setImage(fCurrentCaretImage);
1672 fInsertionCartet.setLocation(contentsToViewX(Math.round((x - Metrics.LIFELINE_SPACING / 2) * fZoomValue)) - fCurrentCaretImage.getBounds().width / 2, y1);
df0b8ff4 1673 } else {
eb63f5ff 1674 if (node.getIndex() < fFrame.lifeLinesCount() && fFrame.getLifeline(node.getIndex()) == fDragAndDrop) {
df0b8ff4
BH
1675 return;
1676 }
eb63f5ff
BH
1677 ImageData data = fArrowUpCaretImg.getImageData();
1678 data = data.scaledTo(Math.round(fArrowUpCaretImg.getBounds().width * fZoomValue), Math.round(fArrowUpCaretImg.getBounds().height * fZoomValue));
1679 fCurrentCaretImage = new Image(Display.getCurrent(), data);
1680 fInsertionCartet.setImage(fCurrentCaretImage);
1681 fInsertionCartet.setLocation(contentsToViewX(Math.round((x + width + Metrics.LIFELINE_SPACING / 2) * fZoomValue)) - fCurrentCaretImage.getBounds().width / 2 + 1, y1);
df0b8ff4
BH
1682 }
1683 }
1684 } else {
eb63f5ff 1685 fInsertionCartet.setVisible(false);
73005152
BH
1686 }
1687 }
df0b8ff4
BH
1688 } else {
1689 super.contentsMouseMoveEvent(e);
73005152
BH
1690 }
1691 }
1692
df0b8ff4
BH
1693 /*
1694 * (non-Javadoc)
1695 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseUpEvent(org.eclipse.swt.events.MouseEvent)
1696 */
1697 @Override
1698 protected void contentsMouseUpEvent(MouseEvent event) {
1699 // Just in case the diagram highlight a time compression region
1700 // this region need to be released when clicking everywhere
eb63f5ff
BH
1701 fInsertionCartet.setVisible(false);
1702 if (fDragAndDrop != null) {
1703 if ((fOverView != null) && (!fOverView.isDisposed())) {
1704 fOverView.dispose();
73005152 1705 }
eb63f5ff
BH
1706 fOverView = null;
1707 Lifeline node = fFrame.getCloserLifeline(fDragX);
df0b8ff4 1708 if (node != null) {
eb63f5ff
BH
1709 int rx = Math.round(node.getX() * fZoomValue);
1710 if (rx <= event.x && Math.round(rx + (node.getWidth() * fZoomValue)) >= event.x) {
1711 if ((fCollapseProvider != null) && (fDragAndDrop != node)) {
1712 fCollapseProvider.collapseTwoLifelines((Lifeline) fDragAndDrop, node);
df0b8ff4
BH
1713 }
1714 } else if (rx < event.x) {
eb63f5ff
BH
1715 fFrame.insertLifelineAfter((Lifeline) fDragAndDrop, node);
1716 if (node.getIndex() < fFrame.lifeLinesCount()) {
1717 Lifeline temp[] = { (Lifeline) fDragAndDrop, fFrame.getLifeline(node.getIndex()) };
1718 fReorderList.add(temp);
df0b8ff4 1719 } else {
eb63f5ff
BH
1720 Lifeline temp[] = { (Lifeline) fDragAndDrop, null };
1721 fReorderList.add(temp);
df0b8ff4
BH
1722 }
1723 } else {
eb63f5ff
BH
1724 fFrame.insertLifelineBefore((Lifeline) fDragAndDrop, node);
1725 Lifeline temp[] = { (Lifeline) fDragAndDrop, node };
1726 fReorderList.add(temp);
73005152
BH
1727 }
1728 }
73005152 1729 }
eb63f5ff 1730 fDragAndDrop = null;
df0b8ff4 1731 redraw();
eb63f5ff 1732 if (fFrame == null) {
73005152 1733 return;
73005152 1734 }
eb63f5ff 1735 fFrame.resetTimeCompression();
73005152 1736
df0b8ff4 1737 // reset auto scroll if it's engaged
eb63f5ff
BH
1738 if (fLocalAutoScroll != null) {
1739 fLocalAutoScroll.cancel();
1740 fLocalAutoScroll = null;
73005152 1741 }
df0b8ff4 1742 super.contentsMouseUpEvent(event);
73005152
BH
1743 }
1744
df0b8ff4
BH
1745 /*
1746 * (non-Javadoc)
1747 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsMouseDownEvent(org.eclipse.swt.events.MouseEvent)
1748 */
1749 @Override
1750 protected void contentsMouseDownEvent(MouseEvent event) {
eb63f5ff
BH
1751 if (fCurrentGraphNode != null) {
1752 fCurrentGraphNode.setFocused(false);
73005152 1753 }
73005152 1754
df0b8ff4
BH
1755 // Just in case the diagram highlight a time compression region
1756 // this region need to be released when clicking everywhere
eb63f5ff 1757 if (fFrame == null) {
73005152
BH
1758 return;
1759 }
eb63f5ff
BH
1760
1761 fFrame.resetTimeCompression();
73005152 1762
df0b8ff4 1763 if ((event.stateMask & SWT.CTRL) != 0) {
eb63f5ff 1764 fCtrlSelection = true;
df0b8ff4 1765 } else {
eb63f5ff 1766 fCtrlSelection = false;
df0b8ff4 1767 }
73005152 1768
eb63f5ff
BH
1769 if (((fZoomInMode) || (fZoomOutMode)) && (event.button == 1)) {
1770 int cx = Math.round(event.x / fZoomValue);
1771 int cy = Math.round(event.y / fZoomValue);
1772 if (fZoomInMode) {
1773 if (fZoomValue < 64) {
1774 fZoomValue = fZoomValue * (float) 1.25;
df0b8ff4
BH
1775 }
1776 } else {
eb63f5ff 1777 fZoomValue = fZoomValue / (float) 1.25;
73005152 1778 }
eb63f5ff
BH
1779 int x = Math.round(cx * fZoomValue - getVisibleWidth() / (float) 2);
1780 int y = Math.round(cy * fZoomValue - getVisibleHeight() / (float) 2);
df0b8ff4 1781 setContentsPos(x, y);
eb63f5ff
BH
1782 if (fTimeBar != null) {
1783 fTimeBar.setZoom(fZoomValue);
73005152 1784 }
df0b8ff4
BH
1785 // redraw also resize the scrollView content
1786 redraw();
1787 } else {// if (event.button ==1)
1788 GraphNode node = null;
eb63f5ff
BH
1789 int x = Math.round(event.x / fZoomValue);
1790 int y = Math.round(event.y / fZoomValue);
1791 node = fFrame.getNodeAt(x, y);
1792
1793 if ((event.button == 1) || ((node != null) && !node.isSelected())) {
1794 if (!fShiftSelection) {
1795 fListStart = node;
1796 }
1797 if (fShiftSelection) {
1798 clearSelection();
1799 addSelection(fFrame.getNodeList(fListStart, node));
1800 } else {
1801 performSelection(node);
1802 }
1803 fCurrentGraphNode = node;
1804 if (node != null) {
1805 node.setFocused(true);
df0b8ff4 1806 }
73005152 1807 }
eb63f5ff 1808 redraw();
73005152 1809 }
eb63f5ff 1810 if (fDragAndDrop == null) {
df0b8ff4
BH
1811 super.contentsMouseDownEvent(event);
1812 }
eb63f5ff 1813 fIsDragAndDrop = (event.button == 1);
73005152 1814
df0b8ff4 1815 }
013a5f1c
AM
1816
1817 /**
1818 * TimerTask for auto scroll feature.
df0b8ff4
BH
1819 */
1820 protected static class AutoScroll extends TimerTask {
1821 /**
1822 * Field delta x.
1823 */
eb63f5ff 1824 public int fDeltaX;
df0b8ff4
BH
1825 /**
1826 * Field delta y.
1827 */
eb63f5ff 1828 public int fDeltaY;
df0b8ff4
BH
1829 /**
1830 * Field sequence diagram reference.
1831 */
eb63f5ff 1832 public SDWidget fSdWidget;
73005152 1833
df0b8ff4
BH
1834 /**
1835 * Constructor for AutoScroll.
013a5f1c 1836 * @param sv sequence diagram widget reference
eb63f5ff
BH
1837 * @param dx delta x
1838 * @param dy delta y
df0b8ff4 1839 */
eb63f5ff
BH
1840 public AutoScroll(SDWidget sv, int dx, int dy) {
1841 fSdWidget = sv;
1842 fDeltaX = dx;
1843 fDeltaY = dy;
df0b8ff4 1844 }
73005152 1845
df0b8ff4
BH
1846 /*
1847 * (non-Javadoc)
1848 * @see java.util.TimerTask#run()
1849 */
1850 @Override
1851 public void run() {
1852 Display.getDefault().asyncExec(new Runnable() {
1853 @Override
1854 public void run() {
013a5f1c 1855 if (fSdWidget.isDisposed()) {
df0b8ff4 1856 return;
013a5f1c 1857 }
eb63f5ff
BH
1858 fSdWidget.fDragX += fDeltaX;
1859 fSdWidget.fDragY += fDeltaY;
1860 fSdWidget.scrollBy(fDeltaX, fDeltaY);
df0b8ff4
BH
1861 }
1862 });
1863 }
73005152
BH
1864 }
1865
df0b8ff4
BH
1866 /*
1867 * (non-Javadoc)
1868 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#drawContents(org.eclipse.swt.graphics.GC, int, int, int, int)
1869 */
1870 @Override
1871 protected void drawContents(GC gc, int clipx, int clipy, int clipw, int cliph) {
eb63f5ff 1872 if (fFrame == null) {
df0b8ff4
BH
1873 gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WHITE));
1874 gc.fillRectangle(0, 0, getVisibleWidth(), getVisibleHeight());
1875 gc.dispose();
1876 return;
1877 } else {
3145ec83
BH
1878// Frame.setUserPref(SDViewPref.getInstance());
1879 SDViewPref.getInstance();
df0b8ff4
BH
1880 }
1881
1882 Rectangle area = getClientArea();
1883 Image dbuffer = getDrawBuffer();
eb63f5ff 1884 int height = Math.round((fFrame.getHeight() + 2 * Metrics.FRAME_V_MARGIN) * fZoomValue);
df0b8ff4 1885
73005152 1886 try {
df0b8ff4 1887 gc.drawImage(dbuffer, 0, 0, area.width, area.height, 0, 0, area.width, area.height);
73005152 1888 } catch (Exception e) {
8fd82db5 1889 Activator.getDefault().logError("Error drawin content", e); //$NON-NLS-1$
df0b8ff4
BH
1890 }
1891 dbuffer.dispose();
eb63f5ff
BH
1892 setHScrollBarIncrement(Math.round(SDViewPref.getInstance().getLifelineWidth() / (float) 2 * fZoomValue));
1893 setVScrollBarIncrement(Math.round(Metrics.getMessagesSpacing() * fZoomValue));
1894 if ((fTimeBar != null) && (fFrame.hasTimeInfo())) {
1895 fTimeBar.resizeContents(9, height + getHorizontalBarHeight());
1896 fTimeBar.setContentsPos(getContentsX(), getContentsY());
1897 fTimeBar.redraw();
1898 fTimeBar.update();
73005152 1899 }
df0b8ff4
BH
1900 float xRatio = getContentsWidth() / (float) getVisibleWidth();
1901 float yRatio = getContentsHeight() / (float) getVisibleHeight();
1902 if (yRatio > xRatio) {
1903 setOverviewSize((int) (getVisibleHeight() * 0.75));
1904 } else {
1905 setOverviewSize((int) (getVisibleWidth() * 0.75));
1906 }
1907 }
73005152 1908
df0b8ff4
BH
1909 /*
1910 * (non-Javadoc)
1911 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
1912 */
1913 @Override
1914 public void widgetDefaultSelected(SelectionEvent event) {
73005152
BH
1915 }
1916
df0b8ff4
BH
1917 /*
1918 * (non-Javadoc)
1919 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
1920 */
1921 @Override
1922 public void widgetSelected(SelectionEvent event) {
eb63f5ff
BH
1923 if (event.widget == fZoomIn) {
1924 fZoomValue = fZoomValue * 2;
1925 } else if (event.widget == fZoomOut) {
1926 fZoomValue = fZoomValue / 2;
df0b8ff4
BH
1927 }
1928 redraw();
1929 }
73005152 1930
df0b8ff4
BH
1931 /*
1932 * Called when property changed occurs in the preference page. "PREFOK" is fired when the user press the ok or apply button
013a5f1c 1933 *
df0b8ff4
BH
1934 * (non-Javadoc)
1935 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
1936 */
1937 @Override
1938 public void propertyChange(PropertyChangeEvent e) {
eb63f5ff
BH
1939 if (fFrame != null && !isDisposed()) {
1940 fFrame.resetTimeCompression();
df0b8ff4
BH
1941 }
1942 if (e.getProperty().equals("PREFOK")) //$NON-NLS-1$
1943 {
1944 // Prepare the overview to be reused for the new
1945 // settings (especially the colors)
013a5f1c 1946 if (fOverView != null) {
eb63f5ff 1947 fOverView.dispose();
013a5f1c 1948 }
eb63f5ff 1949 fOverView = null;
df0b8ff4
BH
1950 redraw();
1951 }
1952 }
73005152 1953
df0b8ff4
BH
1954 /*
1955 * (non-Javadoc)
1956 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
1957 */
1958 @Override
1959 public void widgetDisposed(DisposeEvent e) {
eb63f5ff
BH
1960 if (fOverView != null) {
1961 fOverView.dispose();
df0b8ff4
BH
1962 }
1963 super.removeDisposeListener(this);
eb63f5ff
BH
1964 if ((fCurrentCaretImage != null) && (!fCurrentCaretImage.isDisposed())) {
1965 fCurrentCaretImage.dispose();
df0b8ff4 1966 }
eb63f5ff
BH
1967 if ((fArrowUpCaretImg != null) && (!fArrowUpCaretImg.isDisposed())) {
1968 fArrowUpCaretImg.dispose();
df0b8ff4 1969 }
eb63f5ff
BH
1970 if ((fCollapaseCaretImg != null) && (!fCollapaseCaretImg.isDisposed())) {
1971 fCollapaseCaretImg.dispose();
df0b8ff4
BH
1972 }
1973 SDViewPref.getInstance().removePropertyChangeListener(this);
1974 LoadersManager lm = LoadersManager.getInstance();
eb63f5ff
BH
1975 if (fSite instanceof SDView) {
1976 ((SDView) fSite).resetProviders();
df0b8ff4 1977 if (lm != null) {
eb63f5ff 1978 lm.resetLoader(((SDView) fSite).getViewSite().getId());
df0b8ff4
BH
1979 }
1980 }
1981 }
73005152 1982
df0b8ff4
BH
1983 /*
1984 * (non-Javadoc)
1985 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#drawOverview(org.eclipse.swt.graphics.GC, org.eclipse.swt.graphics.Rectangle)
1986 */
1987 @Override
1988 protected void drawOverview(GC gc, Rectangle r) {
eb63f5ff 1989 float oldzoom = fZoomValue;
df0b8ff4 1990 if (getContentsWidth() > getContentsHeight()) {
eb63f5ff 1991 fZoomValue = (float) r.width / (float) getContentsWidth() * oldzoom;
df0b8ff4 1992 } else {
eb63f5ff 1993 fZoomValue = (float) r.height / (float) getContentsHeight() * oldzoom;
df0b8ff4 1994 }
eb63f5ff
BH
1995 if ((fOverView != null) && ((r.width != fOverView.getBounds().width) || (r.height != fOverView.getBounds().height))) {
1996 fOverView.dispose();
1997 fOverView = null;
df0b8ff4 1998 }
eb63f5ff 1999 if (fOverView == null) {
df0b8ff4
BH
2000 int backX = getContentsX();
2001 int backY = getContentsY();
2002 setContentsPos(0, 0);
eb63f5ff
BH
2003 fOverView = new Image(getDisplay(), r.width, r.height);
2004 GC gcim = new GC(fOverView);
df0b8ff4
BH
2005 NGC context = new NGC(this, gcim);
2006 context.setBackground(SDViewPref.getInstance().getBackGroundColor(SDViewPref.PREF_FRAME));
eb63f5ff 2007 fFrame.draw(context);
df0b8ff4
BH
2008 setContentsPos(backX, backY);
2009 gcim.dispose();
2010 context.dispose();
2011 }
eb63f5ff
BH
2012 if ((fOverView != null) && (r.width == fOverView.getBounds().width) && (r.height == fOverView.getBounds().height)) {
2013 gc.drawImage(fOverView, 0, 0, r.width, r.height, 0, 0, r.width, r.height);
df0b8ff4 2014 }
73005152 2015
eb63f5ff 2016 fZoomValue = oldzoom;
df0b8ff4
BH
2017
2018 super.drawOverview(gc, r);
73005152
BH
2019 }
2020
df0b8ff4
BH
2021 /*
2022 * (non-Javadoc)
2023 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ITimeCompressionListener#deltaSelected(org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.Lifeline, int, int, org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IColor)
2024 */
2025 @Override
2026 public void deltaSelected(Lifeline lifeline, int startEvent, int nbEvent, IColor color) {
eb63f5ff 2027 fFrame.highlightTimeCompression(lifeline, startEvent, nbEvent, color);
df0b8ff4
BH
2028 ensureVisible(lifeline);
2029 int y1 = lifeline.getY() + lifeline.getHeight() + (Metrics.getMessageFontHeigth() + Metrics.getMessagesSpacing()) * startEvent;
2030 int y2 = lifeline.getY() + lifeline.getHeight() + (Metrics.getMessageFontHeigth() + Metrics.getMessagesSpacing()) * (startEvent + nbEvent);
2031 ensureVisible(lifeline.getX(), y1 - (Metrics.getLifelineHeaderFontHeigth() + +2 * Metrics.LIFELINE_HEARDER_TEXT_V_MARGIN), lifeline.getWidth(), y2 - y1 + 3, SWT.CENTER | SWT.VERTICAL, true);
2032 redraw();
73005152 2033 update();
73005152
BH
2034 }
2035
df0b8ff4
BH
2036 /*
2037 * (non-Javadoc)
2038 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#getVisibleWidth()
2039 */
73005152
BH
2040 @Override
2041 public int getVisibleWidth() {
eb63f5ff
BH
2042 if (fIsPrinting) {
2043 return fPrinter.getClientArea().width;
df0b8ff4 2044 }
73005152
BH
2045 return super.getVisibleWidth();
2046 }
2047
df0b8ff4
BH
2048 /*
2049 * (non-Javadoc)
2050 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#getVisibleHeight()
2051 */
73005152
BH
2052 @Override
2053 public int getVisibleHeight() {
eb63f5ff
BH
2054 if (fIsPrinting) {
2055 return fPrinter.getClientArea().height;
df0b8ff4 2056 }
73005152
BH
2057 return super.getVisibleHeight();
2058 }
2059
df0b8ff4
BH
2060 /*
2061 * (non-Javadoc)
2062 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsToViewX(int)
2063 */
73005152 2064 @Override
eb63f5ff
BH
2065 public int contentsToViewX(int x) {
2066 if (fIsPrinting) {
2067 int v = Math.round(fPrinterX * fPrinterZoom);
2068 return x - v;
73005152 2069 }
eb63f5ff 2070 return x - getContentsX();
73005152
BH
2071 }
2072
df0b8ff4
BH
2073 /*
2074 * (non-Javadoc)
2075 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#contentsToViewY(int)
2076 */
73005152 2077 @Override
eb63f5ff
BH
2078 public int contentsToViewY(int y) {
2079 if (fIsPrinting) {
2080 int v = Math.round(fPrinterY * fPrinterZoom);
2081 return y - v;
73005152 2082 }
eb63f5ff 2083 return y - getContentsY();
73005152
BH
2084 }
2085
df0b8ff4
BH
2086 /*
2087 * (non-Javadoc)
2088 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#getContentsX()
2089 */
73005152
BH
2090 @Override
2091 public int getContentsX() {
eb63f5ff
BH
2092 if (fIsPrinting) {
2093 return Math.round(fPrinterX * fPrinterZoom);
df0b8ff4 2094 }
73005152
BH
2095 return super.getContentsX();
2096
2097 }
2098
df0b8ff4
BH
2099 /*
2100 * (non-Javadoc)
2101 * @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.ScrollView#getContentsY()
2102 */
73005152
BH
2103 @Override
2104 public int getContentsY() {
eb63f5ff
BH
2105 if (fIsPrinting) {
2106 return Math.round(fPrinterY * fPrinterZoom);
df0b8ff4 2107 }
73005152
BH
2108 return super.getContentsY();
2109 }
013a5f1c 2110
3145ec83
BH
2111 /**
2112 * Traverse Listener implementation.
2113 */
2114 protected static class LocalTraverseListener implements TraverseListener {
2115
2116 /*
2117 * (non-Javadoc)
2118 * @see org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse.swt.events.TraverseEvent)
2119 */
2120 @Override
2121 public void keyTraversed(TraverseEvent e) {
2122 if ((e.detail == SWT.TRAVERSE_TAB_NEXT) || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS)) {
2123 e.doit = true;
2124 }
2125 }
2126 }
2127
73005152 2128}
This page took 0.138922 seconds and 5 git commands to generate.