lttng: Add time alignment work to scatter chart
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / viewers / xycharts / TmfMouseDragProvider.java
1 /**********************************************************************
2 * Copyright (c) 2014 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * Bernd Hufmann - Initial API and implementation
11 **********************************************************************/
12 package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
13
14 import org.eclipse.swt.events.MouseEvent;
15 import org.eclipse.swt.events.MouseListener;
16 import org.eclipse.swt.events.MouseMoveListener;
17 import org.swtchart.IAxis;
18 import org.swtchart.Range;
19
20 /**
21 * Class for updating time ranges based on middle mouse button drag.
22 * It also notifies the viewer about a change of range.
23 *
24 * @author Bernd Hufmann
25 */
26 public class TmfMouseDragProvider extends TmfBaseProvider implements MouseListener, MouseMoveListener {
27
28 // ------------------------------------------------------------------------
29 // Attributes
30 // ------------------------------------------------------------------------
31 /** Cached start time */
32 private long fStartTime;
33 /** Cached end time */
34 private long fEndTime;
35 /** Flag indicating that an update is ongoing */
36 private boolean fIsUpdate;
37 /** Cached position when mouse button was pressed */
38 private int fStartPosition;
39
40 // ------------------------------------------------------------------------
41 // Constructors
42 // ------------------------------------------------------------------------
43 /**
44 * Default constructor
45 *
46 * @param tmfChartViewer
47 * the chart viewer reference.
48 */
49 public TmfMouseDragProvider(ITmfChartTimeProvider tmfChartViewer) {
50 super(tmfChartViewer);
51 register();
52 }
53
54 // ------------------------------------------------------------------------
55 // TmfBaseProvider
56 // ------------------------------------------------------------------------
57 @Override
58 public void register() {
59 getChart().getPlotArea().addMouseListener(this);
60 getChart().getPlotArea().addMouseMoveListener(this);
61 }
62
63 @Override
64 public void deregister() {
65 if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
66 getChart().getPlotArea().removeMouseListener(this);
67 getChart().getPlotArea().removeMouseMoveListener(this);
68 }
69 }
70
71 @Override
72 public void refresh() {
73 // nothing to do
74 }
75
76 // ------------------------------------------------------------------------
77 // MouseListener
78 // ------------------------------------------------------------------------
79 @Override
80 public void mouseDoubleClick(MouseEvent e) {
81 }
82
83 @Override
84 public void mouseDown(MouseEvent e) {
85 if ((getChartViewer().getWindowDuration() != 0) && (e.button == 2)) {
86 fStartPosition = e.x;
87 fIsUpdate = true;
88 }
89 }
90
91 @Override
92 public void mouseUp(MouseEvent e) {
93 if ((fIsUpdate) && (fStartTime != fEndTime)) {
94 ITmfChartTimeProvider viewer = getChartViewer();
95 viewer.updateWindow(fStartTime, fEndTime);
96 }
97 fIsUpdate = false;
98 }
99
100 // ------------------------------------------------------------------------
101 // MouseMoveListener
102 // ------------------------------------------------------------------------
103 @Override
104 public void mouseMove(MouseEvent e) {
105 if (fIsUpdate) {
106 IAxis xAxis = getChart().getAxisSet().getXAxis(0);
107
108 ITmfChartTimeProvider viewer = getChartViewer();
109
110 fStartTime = viewer.getWindowStartTime();
111 fEndTime = viewer.getWindowEndTime();
112
113 long startTime = viewer.getStartTime();
114 long endTime = viewer.getEndTime();
115
116 long delta = 0;
117 if (fStartPosition > e.x) {
118 delta = (long) (xAxis.getDataCoordinate(fStartPosition) - xAxis.getDataCoordinate(e.x));
119 long max = endTime - fEndTime;
120 delta = Math.max(0, Math.min(delta, max));
121 fStartTime = fStartTime + delta;
122 fEndTime = fEndTime + delta;
123 } else if (fStartPosition < e.x) {
124 delta = (long) (xAxis.getDataCoordinate(e.x) - xAxis.getDataCoordinate(fStartPosition));
125 long max = fStartTime - startTime;
126 delta = Math.max(0, Math.min(delta, max));
127 fStartTime = fStartTime - delta;
128 fEndTime = fEndTime - delta;
129 }
130
131 xAxis.setRange(new Range(fStartTime - viewer.getTimeOffset(), fEndTime - viewer.getTimeOffset()));
132 getChart().redraw();
133 }
134 }
135 }
This page took 0.03596 seconds and 5 git commands to generate.