| /****************************************************************************** |
| * Copyright (c) 2017 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 |
| *******************************************************************************/ |
| |
| package org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.scatter; |
| |
| import java.text.Format; |
| |
| import org.eclipse.jdt.annotation.NonNull; |
| import org.eclipse.jdt.annotation.Nullable; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.tracecompass.common.core.format.SubSecondTimeWithUnitFormat; |
| import org.eclipse.tracecompass.internal.analysis.timing.core.segmentstore.SegmentStoreScatterDataProvider; |
| import org.eclipse.tracecompass.internal.analysis.timing.ui.views.segmentstore.scatter.SegmentStoreScatterGraphTooltipProvider; |
| import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager; |
| import org.eclipse.tracecompass.tmf.core.model.xy.ITmfTreeXYDataProvider; |
| import org.eclipse.tracecompass.tmf.core.model.xy.ITmfXYDataProvider; |
| import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance; |
| import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler; |
| import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal; |
| import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal; |
| import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal; |
| import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; |
| import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; |
| import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; |
| import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfFilteredXYChartViewer; |
| import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings; |
| |
| /** |
| * Displays the segment store provider data in a SWT scatter chart |
| * |
| * @author Yonni Chen |
| * @since 2.1 |
| */ |
| public class AbstractSegmentStoreScatterChartViewer extends TmfFilteredXYChartViewer { |
| |
| private static final Format FORMAT =SubSecondTimeWithUnitFormat.getInstance(); |
| private static final int DEFAULT_SERIES_WIDTH = 1; |
| private String fAnalysisId; |
| |
| /** |
| * Constructor |
| * |
| * @param parent |
| * parent composite |
| * @param settings |
| * See {@link TmfXYChartSettings} to know what it contains |
| */ |
| public AbstractSegmentStoreScatterChartViewer(Composite parent, TmfXYChartSettings settings) { |
| this(parent, settings, ""); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Constructor |
| * |
| * @param parent |
| * parent composite |
| * @param settings |
| * See {@link TmfXYChartSettings} to know what it contains |
| * @param analysisId |
| * The ID of the analysis to show in this viewer |
| * @since 3.0 |
| */ |
| public AbstractSegmentStoreScatterChartViewer(Composite parent, TmfXYChartSettings settings, String analysisId) { |
| super(parent, settings, SegmentStoreScatterDataProvider.ID); |
| fAnalysisId = analysisId; |
| setTooltipProvider(new SegmentStoreScatterGraphTooltipProvider(this)); |
| getSwtChart().getLegend().setVisible(false); |
| getSwtChart().getAxisSet().getYAxis(0).getTick().setFormat(FORMAT); |
| } |
| |
| // ------------------------------------------------------------------------ |
| // Operations |
| // ------------------------------------------------------------------------ |
| |
| /** |
| * Get the analysis ID to show in the viewer |
| * |
| * @return The analysis ID |
| * @since 3.0 |
| */ |
| protected String getAnalysisId() { |
| return fAnalysisId; |
| } |
| |
| @Override |
| protected @Nullable ITmfXYDataProvider initializeDataProvider(ITmfTrace trace) { |
| String analysisId = getAnalysisId(); |
| |
| if (analysisId.isEmpty()) { |
| /* Should not happen anymore since legacy code, |
| * that get the analysis ID of the segment store, is removed */ |
| return null; |
| } |
| return DataProviderManager.getInstance().getDataProvider(trace, SegmentStoreScatterDataProvider.ID + ':' + analysisId, ITmfTreeXYDataProvider.class); |
| } |
| |
| // ------------------------------------------------------------------------ |
| // Signal handlers |
| // ------------------------------------------------------------------------ |
| |
| /** |
| * @param signal |
| * Signal received when a different trace is selected |
| */ |
| @Override |
| @TmfSignalHandler |
| public void traceSelected(@Nullable TmfTraceSelectedSignal signal) { |
| super.traceSelected(signal); |
| if (getTrace() != null) { |
| final TmfTimeRange timeRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange(); |
| setWindowRange(timeRange.getStartTime().toNanos(), timeRange.getEndTime().toNanos()); |
| } |
| } |
| |
| /** |
| * @param signal |
| * Signal received when trace is opened |
| */ |
| @Override |
| @TmfSignalHandler |
| public void traceOpened(@Nullable TmfTraceOpenedSignal signal) { |
| super.traceOpened(signal); |
| if (getTrace() != null) { |
| final TmfTimeRange timeRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange(); |
| setWindowRange(timeRange.getStartTime().toNanos(), timeRange.getEndTime().toNanos()); |
| } |
| } |
| |
| @Override |
| public IYAppearance getSeriesAppearance(@NonNull String seriesName) { |
| return getPresentationProvider().getAppearance(seriesName, IYAppearance.Type.SCATTER, DEFAULT_SERIES_WIDTH); |
| } |
| |
| /** |
| * @param signal |
| * Signal received when last opened trace is closed |
| */ |
| @Override |
| @TmfSignalHandler |
| public void traceClosed(@Nullable TmfTraceClosedSignal signal) { |
| super.traceClosed(signal); |
| |
| // Check if there is no more opened trace |
| if (signal != null && TmfTraceManager.getInstance().getActiveTrace() == null) { |
| clearContent(); |
| } |
| refresh(); |
| } |
| } |