1 /**********************************************************************
2 * Copyright (c) 2013, 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
.SWT
;
15 import org
.eclipse
.swt
.events
.MouseEvent
;
16 import org
.eclipse
.swt
.events
.MouseListener
;
17 import org
.eclipse
.swt
.events
.MouseMoveListener
;
18 import org
.eclipse
.swt
.events
.PaintEvent
;
19 import org
.swtchart
.IAxis
;
20 import org
.swtchart
.ICustomPaintListener
;
21 import org
.swtchart
.IPlotArea
;
24 * Class for providing selection of ranges with the left mouse button. It also
25 * notifies the viewer about a change of selection.
27 * @author Bernd Hufmann
29 public class TmfMouseSelectionProvider
extends TmfBaseProvider
implements MouseListener
, MouseMoveListener
, ICustomPaintListener
{
31 // ------------------------------------------------------------------------
33 // ------------------------------------------------------------------------
34 /** Cached start time */
35 private long fBeginTime
;
36 /** Cached end time */
37 private long fEndTime
;
38 /** Flag indicating that an update is ongoing */
39 private boolean fIsInternalUpdate
;
40 /** Flag indicating that the begin marker is dragged */
41 private boolean fDragBeginMarker
;
43 // ------------------------------------------------------------------------
45 // ------------------------------------------------------------------------
49 * @param tmfChartViewer
50 * The chart viewer reference.
52 public TmfMouseSelectionProvider(ITmfChartTimeProvider tmfChartViewer
) {
53 super(tmfChartViewer
);
57 // ------------------------------------------------------------------------
59 // ------------------------------------------------------------------------
61 public void register() {
62 getChart().getPlotArea().addMouseListener(this);
63 getChart().getPlotArea().addMouseMoveListener(this);
64 ((IPlotArea
) getChart().getPlotArea()).addCustomPaintListener(this);
68 public void deregister() {
69 if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
70 getChart().getPlotArea().removeMouseListener(this);
71 getChart().getPlotArea().removeMouseMoveListener(this);
72 ((IPlotArea
) getChart().getPlotArea()).removeCustomPaintListener(this);
76 // ------------------------------------------------------------------------
78 // ------------------------------------------------------------------------
80 public void mouseDoubleClick(MouseEvent e
) {
84 public void mouseDown(MouseEvent e
) {
85 if ((getChartViewer().getWindowDuration() != 0) && (e
.button
== 1)) {
86 if ((e
.stateMask
& SWT
.CTRL
) != 0) {
89 fDragBeginMarker
= false;
90 if ((e
.stateMask
& SWT
.SHIFT
) != SWT
.SHIFT
) {
91 IAxis xAxis
= getChart().getAxisSet().getXAxis(0);
92 fBeginTime
= limitXDataCoordinate(xAxis
.getDataCoordinate(e
.x
));
93 fEndTime
= fBeginTime
;
95 long selectionBegin
= fBeginTime
;
96 long selectionEnd
= fEndTime
;
97 IAxis xAxis
= getChart().getAxisSet().getXAxis(0);
98 long time
= limitXDataCoordinate(xAxis
.getDataCoordinate(e
.x
));
99 if (Math
.abs(time
- selectionBegin
) < Math
.abs(time
- selectionEnd
)) {
100 fDragBeginMarker
= true;
102 fEndTime
= selectionEnd
;
104 fBeginTime
= selectionBegin
;
108 fIsInternalUpdate
= true;
113 public void mouseUp(MouseEvent e
) {
114 if (fIsInternalUpdate
) {
115 if (fBeginTime
> fEndTime
) {
117 long tmp
= fBeginTime
;
118 fBeginTime
= fEndTime
;
121 ITmfChartTimeProvider viewer
= getChartViewer();
122 viewer
.updateSelectionRange(fBeginTime
+ viewer
.getTimeOffset(), fEndTime
+ viewer
.getTimeOffset());
123 fIsInternalUpdate
= false;
128 // ------------------------------------------------------------------------
130 // ------------------------------------------------------------------------
132 public void mouseMove(MouseEvent e
) {
133 if (fIsInternalUpdate
) {
134 IAxis xAxis
= getChart().getAxisSet().getXAxis(0);
135 if (fDragBeginMarker
) {
136 fBeginTime
= limitXDataCoordinate(xAxis
.getDataCoordinate(e
.x
));
138 fEndTime
= limitXDataCoordinate(xAxis
.getDataCoordinate(e
.x
));
144 // ------------------------------------------------------------------------
145 // ICustomPaintListener
146 // ------------------------------------------------------------------------
148 public void paintControl(PaintEvent e
) {
149 ITmfChartTimeProvider viewer
= getChartViewer();
151 if (!fIsInternalUpdate
) {
152 fBeginTime
= viewer
.getSelectionBeginTime() - viewer
.getTimeOffset();
153 fEndTime
= viewer
.getSelectionEndTime() - viewer
.getTimeOffset();
155 long windowStartTime
= viewer
.getWindowStartTime() - viewer
.getTimeOffset();
156 long windowEndTime
= viewer
.getWindowEndTime() - viewer
.getTimeOffset();
158 IAxis xAxis
= getChart().getAxisSet().getXAxis(0);
159 e
.gc
.setBackground(TmfXYChartViewer
.getDisplay().getSystemColor(SWT
.COLOR_BLUE
));
160 e
.gc
.setForeground(TmfXYChartViewer
.getDisplay().getSystemColor(SWT
.COLOR_BLUE
));
161 e
.gc
.setLineStyle(SWT
.LINE_SOLID
);
162 if ((fBeginTime
>= windowStartTime
) && (fBeginTime
<= windowEndTime
)) {
163 int beginX
= xAxis
.getPixelCoordinate(fBeginTime
);
164 e
.gc
.drawLine(beginX
, 0, beginX
, e
.height
);
167 if ((fEndTime
>= windowStartTime
) && (fEndTime
<= windowEndTime
) && (fBeginTime
!= fEndTime
)) {
168 int endX
= xAxis
.getPixelCoordinate(fEndTime
);
169 e
.gc
.drawLine(endX
, 0, endX
, e
.height
);
172 if (Math
.abs(fEndTime
- fBeginTime
) > 1) {
173 e
.gc
.setBackground(TmfXYChartViewer
.getDisplay().getSystemColor(SWT
.COLOR_WIDGET_BACKGROUND
));
174 int beginX
= xAxis
.getPixelCoordinate(fBeginTime
);
175 int endX
= xAxis
.getPixelCoordinate(fEndTime
);
176 if (fEndTime
> fBeginTime
) {
177 e
.gc
.fillRectangle(beginX
+ 1, 0, endX
- beginX
- 1, e
.height
);
179 e
.gc
.fillRectangle(endX
+ 1, 0, beginX
- endX
- 1, e
.height
);
185 public boolean drawBehindSeries() {