/**********************************************************************
* Copyright (c) 2013, 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bernd Hufmann - Initial API and implementation
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.viewers.xycharts;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.PaintEvent;
import org.swtchart.IAxis;
import org.swtchart.ICustomPaintListener;
import org.swtchart.IPlotArea;
/**
* Class for providing zooming based on mouse drag with right mouse button.
* It also notifies the viewer about a change of range.
*
* @author Bernd Hufmann
*/
public class TmfMouseDragZoomProvider extends TmfBaseProvider implements MouseListener, MouseMoveListener, ICustomPaintListener {
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/** Cached start time */
private long fStartTime;
/** Cached end time */
private long fEndTime;
/** Flag indicating that an update is ongoing */
private boolean fIsUpdate;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Default constructor
*
* @param tmfChartViewer
* the chart viewer reference.
*/
public TmfMouseDragZoomProvider(ITmfChartTimeProvider tmfChartViewer) {
super(tmfChartViewer);
register();
}
// ------------------------------------------------------------------------
// TmfBaseProvider
// ------------------------------------------------------------------------
@Override
public void register() {
getChart().getPlotArea().addMouseListener(this);
getChart().getPlotArea().addMouseMoveListener(this);
((IPlotArea) getChart().getPlotArea()).addCustomPaintListener(this);
}
@Override
public void deregister() {
if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
getChart().getPlotArea().removeMouseListener(this);
getChart().getPlotArea().removeMouseMoveListener(this);
((IPlotArea) getChart().getPlotArea()).removeCustomPaintListener(this);
}
}
@Override
public void refresh() {
// nothing to do
}
// ------------------------------------------------------------------------
// MouseListener
// ------------------------------------------------------------------------
@Override
public void mouseDoubleClick(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
if ((getChartViewer().getWindowDuration() != 0) && (e.button == 3)) {
IAxis xAxis = getChart().getAxisSet().getXAxis(0);
fStartTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
fEndTime = fStartTime;
fIsUpdate = true;
}
}
@Override
public void mouseUp(MouseEvent e) {
if ((fIsUpdate) && (fStartTime != fEndTime)) {
if (fStartTime > fEndTime) {
long tmp = fStartTime;
fStartTime = fEndTime;
fEndTime = tmp;
}
ITmfChartTimeProvider viewer = getChartViewer();
viewer.updateWindow(fStartTime + viewer.getTimeOffset(), fEndTime + viewer.getTimeOffset());
}
if (fIsUpdate) {
getChart().redraw();
}
fIsUpdate = false;
}
// ------------------------------------------------------------------------
// MouseMoveListener
// ------------------------------------------------------------------------
@Override
public void mouseMove(MouseEvent e) {
if (fIsUpdate) {
IAxis xAxis = getChart().getAxisSet().getXAxis(0);
fEndTime = limitXDataCoordinate(xAxis.getDataCoordinate(e.x));
getChart().redraw();
}
}
// ------------------------------------------------------------------------
// ICustomPaintListener
// ------------------------------------------------------------------------
@Override
public void paintControl(PaintEvent e) {
if (fIsUpdate && (fStartTime != fEndTime)) {
IAxis xAxis = getChart().getAxisSet().getXAxis(0);
int startX = xAxis.getPixelCoordinate(fStartTime);
int endX = xAxis.getPixelCoordinate(fEndTime);
e.gc.setBackground(TmfXYChartViewer.getDisplay().getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND));
if (fStartTime < fEndTime) {
e.gc.fillRectangle(startX, 0, endX - startX, e.height);
} else {
e.gc.fillRectangle(endX, 0, startX - endX, e.height);
}
e.gc.drawLine(startX, 0, startX, e.height);
e.gc.drawLine(endX, 0, endX, e.height);
}
}
@Override
public boolean drawBehindSeries() {
return true;
}
}