Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[linuxtools-dev] TMF: drawing bookmarks on Timegraphs

Hi Alexandre,

Following our discussions at #linuxcon, please find hereafter the code I wrote to draw bookmarks on TMF timegraphs.
I just override TimeGraphPresentationProvider.postDrawControl() method.

However, this I also need to know the current experiment when this method is called, I've added a field in the TimeGraphPresentation provider.

Perhaps there is a better way to do that ? Perhaps using TmfTraceManager.getCurrentTrace() ?
Where is the best place to contribute this code ? Directly in TimeGraphPresentationProvider ?

Xavier Raynaud



public abstract class KTimeGraphProvider extends TimeGraphPresentationProvider {

    private TimeChartView fTimeChartView;

    public KTimeGraphProvider(TimeChartView tgv) {
        super();
        this.fTimeChartView = tgv;
    }

    abstract protected void postDrawEventImpl(IModelTimeEvent currentEvent, Rectangle rect, GC gc);

    private void drawBookmarks(Rectangle bounds, GC gc) {
        if (fTimeChartView != null) {
            TmfExperiment experiment = fTimeChartView.getExperiment();
            TimeGraphViewer timeGraphViewer = fTimeChartView.getTimeGraphViewer();
            if (experiment != null && timeGraphViewer != null) {
                int nameSpace = timeGraphViewer.getNameSpace();
                long time0 = timeGraphViewer.getTime0();
                long time1 = timeGraphViewer.getTime1();
                try {
                    for (IMarker bookmark : experiment.getBookmarksFile().findMarkers(IMarker.BOOKMARK, false,
                            IResource.DEPTH_ZERO)) {
                        int location = bookmark.getAttribute(IMarker.LOCATION, -1);
                        if (location != -1) {
                            long rank = location;
                            ITmfContext context = experiment.seekEvent(rank);
                            ITmfEvent ev = experiment.getNext(context);
                            context.dispose();
                            if (ev != null) {
                                ITmfTimestamp ts = ev.getTimestamp();
                                long selectedTime = ts.normalize(0, -9).getValue();
                                double pixelsPerNanoSec = (bounds.width - nameSpace <= TimeGraphBaseControl.RIGHT_MARGIN) ? 0
                                        : (double) (bounds.width - nameSpace - TimeGraphBaseControl.RIGHT_MARGIN)
                                                / (time1 - time0);
                                int x = bounds.x + nameSpace + (int) ((selectedTime - time0) * pixelsPerNanoSec);
                                if (x >= nameSpace && x < bounds.x + bounds.width) {
                                    gc.setForeground(PlatformUI.getWorkbench().getDisplay()
                                            .getSystemColor(SWT.COLOR_BLACK));
                                    gc.drawLine(x, bounds.y, x, bounds.y + bounds.height);
                                }
                            }
                        }
                    }
                } catch (CoreException e) {
                    Activator.getDefault().getLog().log(e.getStatus());
                }
            }
        }
    }

    /*
     * (non-Javadoc)
     * @see
     * org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider#postDrawControl(org.eclipse.swt
     * .graphics.Rectangle, org.eclipse.swt.graphics.GC)
     */
    @Override
    public void postDrawControl(Rectangle bounds, GC gc) {
        super.postDrawControl(bounds, gc);
        drawBookmarks(bounds, gc);
    }
}

Back to the top