blob: 87efe1339bad24735ed9e9ea887ea8b6bfac56cb [file] [log] [blame]
/**********************************************************************
* 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 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Bernd Hufmann - Initial API and implementation
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.viewers.xycharts.barcharts;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.ITmfChartTimeProvider;
import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfBaseProvider;
import org.swtchart.IAxis;
import org.swtchart.ISeries;
/**
* Tool tip provider for TMF bar chart viewer. It displays the y value of
* position x as well as it highlights the bar of the x position.
* It only considers the first series of the chart.
*
* @author Bernd Hufmann
*/
public class TmfHistogramTooltipProvider extends TmfBaseProvider implements MouseTrackListener, MouseMoveListener, PaintListener {
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
/** X coordinate for highlighting */
private int fHighlightX;
/** y coordinate for highlighting */
private int fHighlightY;
/** Flag to do highlighting or not */
private boolean fIsHighlight;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
/**
* Constructor for a tool tip provider.
*
* @param tmfChartViewer
* - the parent chart viewer
*/
public TmfHistogramTooltipProvider(ITmfChartTimeProvider tmfChartViewer) {
super(tmfChartViewer);
register();
}
// ------------------------------------------------------------------------
// TmfBaseProvider
// ------------------------------------------------------------------------
@Override
public void register() {
getChart().getPlotArea().addMouseTrackListener(this);
getChart().getPlotArea().addMouseMoveListener(this);
getChart().getPlotArea().addPaintListener(this);
}
@Override
public void deregister() {
if ((getChartViewer().getControl() != null) && !getChartViewer().getControl().isDisposed()) {
getChart().getPlotArea().removeMouseTrackListener(this);
getChart().getPlotArea().removeMouseMoveListener(this);
getChart().getPlotArea().removePaintListener(this);
}
}
@Override
public void refresh() {
// nothing to do
}
// ------------------------------------------------------------------------
// MouseTrackListener
// ------------------------------------------------------------------------
@Override
public void mouseEnter(MouseEvent e) {
// Do nothing
}
@Override
public void mouseExit(MouseEvent e) {
// Do nothing
}
@Override
public void mouseHover(MouseEvent e) {
if (getChartViewer().getWindowDuration() != 0) {
IAxis xAxis = getChart().getAxisSet().getXAxis(0);
IAxis yAxis = getChart().getAxisSet().getYAxis(0);
double xCoordinate = xAxis.getDataCoordinate(e.x);
ISeries[] series = getChart().getSeriesSet().getSeries();
if ((xCoordinate < 0) || (series.length == 0)) {
return;
}
double y = 0.0;
double rangeStart = 0.0;
double rangeEnd = 0.0;
// Consider first series only
double[] xS = series[0].getXSeries();
double[] yS = series[0].getYSeries();
if ((xS == null) || (yS == null)) {
return;
}
for (int i = 0; i < xS.length - 1; i++) {
int pixel = xAxis.getPixelCoordinate(xS[i]);
if (pixel <= e.x) {
rangeStart = xS[i];
rangeEnd = (long) xS[i + 1];
if (xCoordinate >= rangeStart) {
y = yS[i + 1];
} else {
y = yS[i];
}
}
}
ITmfChartTimeProvider viewer = getChartViewer();
/* set tooltip of closest data point */
StringBuffer buffer = new StringBuffer();
buffer.append("Range=["); //$NON-NLS-1$
buffer.append(TmfTimestamp.fromNanos((long) rangeStart + viewer.getTimeOffset()).toString());
buffer.append(',');
buffer.append(TmfTimestamp.fromNanos((long) rangeEnd + viewer.getTimeOffset()).toString());
buffer.append("]\n"); //$NON-NLS-1$
buffer.append("y="); //$NON-NLS-1$
buffer.append((long) y);
getChart().getPlotArea().setToolTipText(buffer.toString());
fHighlightX = e.x;
fHighlightY = yAxis.getPixelCoordinate(y);
fIsHighlight = true;
getChart().redraw();
}
}
// ------------------------------------------------------------------------
// MouseMoveListener
// ------------------------------------------------------------------------
@Override
public void mouseMove(MouseEvent e) {
fIsHighlight = false;
getChart().redraw();
}
// ------------------------------------------------------------------------
// PaintListener
// ------------------------------------------------------------------------
@Override
public void paintControl(PaintEvent e) {
if (fIsHighlight) {
e.gc.setBackground(Display.getDefault().getSystemColor(
SWT.COLOR_RED));
e.gc.setAlpha(128);
e.gc.fillOval(fHighlightX - 5, fHighlightY - 5, 10, 10);
}
}
}