1 /**********************************************************************
2 * Copyright (c) 2014 Ericsson
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
10 * Bernd Hufmann - Initial API and implementation
11 **********************************************************************/
12 package org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.xycharts
;
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
;
21 * Class for updating time ranges based on middle mouse button drag.
22 * It also notifies the viewer about a change of range.
24 * @author Bernd Hufmann
26 public class TmfMouseDragProvider
extends TmfBaseProvider
implements MouseListener
, MouseMoveListener
{
28 // ------------------------------------------------------------------------
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
;
40 // ------------------------------------------------------------------------
42 // ------------------------------------------------------------------------
46 * @param tmfChartViewer
47 * the chart viewer reference.
49 public TmfMouseDragProvider(ITmfChartTimeProvider tmfChartViewer
) {
50 super(tmfChartViewer
);
54 // ------------------------------------------------------------------------
56 // ------------------------------------------------------------------------
58 public void register() {
59 getChart().getPlotArea().addMouseListener(this);
60 getChart().getPlotArea().addMouseMoveListener(this);
64 public void deregister() {
65 if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
66 getChart().getPlotArea().removeMouseListener(this);
67 getChart().getPlotArea().removeMouseMoveListener(this);
72 public void refresh() {
76 // ------------------------------------------------------------------------
78 // ------------------------------------------------------------------------
80 public void mouseDoubleClick(MouseEvent e
) {
84 public void mouseDown(MouseEvent e
) {
85 if ((getChartViewer().getWindowDuration() != 0) && (e
.button
== 2)) {
92 public void mouseUp(MouseEvent e
) {
93 if ((fIsUpdate
) && (fStartTime
!= fEndTime
)) {
94 ITmfChartTimeProvider viewer
= getChartViewer();
95 viewer
.updateWindow(fStartTime
, fEndTime
);
100 // ------------------------------------------------------------------------
102 // ------------------------------------------------------------------------
104 public void mouseMove(MouseEvent e
) {
106 IAxis xAxis
= getChart().getAxisSet().getXAxis(0);
108 ITmfChartTimeProvider viewer
= getChartViewer();
110 fStartTime
= viewer
.getWindowStartTime();
111 fEndTime
= viewer
.getWindowEndTime();
113 long startTime
= viewer
.getStartTime();
114 long endTime
= viewer
.getEndTime();
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
;
131 xAxis
.setRange(new Range(fStartTime
- viewer
.getTimeOffset(), fEndTime
- viewer
.getTimeOffset()));