blob: 9cc115bf489ab13269ff205f3a6ddcffc0e091ee [file] [log] [blame]
/**********************************************************************
* 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.tmf.ui.swtbot.tests.views;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.swt.graphics.RGBA;
import org.eclipse.tracecompass.internal.tmf.ui.widgets.timegraph.model.TimeLineEvent;
import org.eclipse.tracecompass.tmf.core.model.timegraph.IFilterProperty;
import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractTimeGraphView;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ILinkEvent;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.IMarkerEvent;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry.DisplayStyle;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.MarkerEvent;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.NullTimeEvent;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeEvent;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeLinkEvent;
import com.google.common.collect.Multimap;
/**
* Time graph stub.
*
* @author Matthew Khouzam
*/
public class TimeGraphViewStub extends AbstractTimeGraphView {
/**
* Id
*/
public static final String ID = "org.eclipse.tracecompass.tmf.ui.swtbot.tests.views.timegraph.stub";
/**
* Hat id
*/
public static final int HAT = 0;
/**
* Skin id
*/
public static final int SKIN = 1;
/**
* Hair id
*/
public static final int HAIR = 2;
/**
* Eye id
*/
public static final int EYE = 3;
/**
* Pie chart id
*/
public static final int PIE = 4;
/**
* The marker group
*/
private static final String MARKER_GROUP = "sample";
private final List<@NonNull TimeGraphEntry> fEntries = new ArrayList<>();
private final Map<String, List<@NonNull ITimeEvent>> fEvents = new HashMap<>();
private final @NonNull TimeGraphEntry fRow2;
private final @NonNull TimeGraphEntry fHead1;
private final @NonNull TimeGraphEntry fRow4;
private StubPresentationProvider fPresentationProvider;
private String fFilterRegex;
/**
* Constructor
*/
public TimeGraphViewStub() {
super(ID, new StubPresentationProvider());
fPresentationProvider = (StubPresentationProvider) super.getPresentationProvider();
TimeGraphEntry hero1 = new TimeGraphEntry("Plumber guy", 0, 120);
TimeGraphEntry hat1 = new TimeGraphEntry("Hat1", 0, 120);
TimeGraphEntry hat2 = new TimeGraphEntry("Hat2", 0, 120);
fHead1 = new TimeGraphEntry("Head1", 0, 120);
TimeGraphEntry head2 = new TimeGraphEntry("Head2", 0, 120);
TimeGraphEntry head3 = new TimeGraphEntry("Head3", 0, 120);
TimeGraphEntry head4 = new TimeGraphEntry("Head4", 0, 120);
TimeGraphEntry neck = new TimeGraphEntry("Neck", 0, 120);
TimeGraphEntry hero2 = new TimeGraphEntry("Hungry pie chart", 80, 160);
TimeGraphEntry row1 = new TimeGraphEntry("row1", 80, 160);
fRow2 = new TimeGraphEntry("row2", 80, 160);
TimeGraphEntry row3 = new TimeGraphEntry("row3", 80, 160);
fRow4 = new TimeGraphEntry("row4", 80, 160);
TimeGraphEntry row5 = new TimeGraphEntry("row5", 80, 160);
TimeGraphEntry row6 = new TimeGraphEntry("row6", 80, 160);
TimeGraphEntry row7 = new TimeGraphEntry("row7", 80, 160);
TimeGraphEntry pulse = TimeGraphEntry.create(new TimeGraphEntryModel(444, -1, Collections.singletonList("pulse"), -1, Long.MAX_VALUE), DisplayStyle.LINE);
fEntries.add(hero1);
hero1.addChild(hat1);
hero1.addChild(hat2);
hero1.addChild(fHead1);
hero1.addChild(head2);
hero1.addChild(head3);
hero1.addChild(head4);
hero1.addChild(neck);
fEntries.add(hero2);
hero2.addChild(row1);
hero2.addChild(fRow2);
hero2.addChild(row3);
hero2.addChild(fRow4);
hero2.addChild(row5);
hero2.addChild(row6);
hero2.addChild(row7);
fEntries.add(pulse);
fEvents.put(hero1.getName(), Arrays.asList(new NullTimeEvent(hero1, 0, 120)));
// hat
fEvents.put(hat1.getName(), Arrays.asList(new NullTimeEvent(hat1, 0, 30), new TimeEvent(hat1, 30, 50, HAT), new NullTimeEvent(hat1, 80, 40)));
fEvents.put(hat2.getName(), Arrays.asList(new NullTimeEvent(hat2, 0, 20), new TimeEvent(hat2, 20, 90, HAT), new NullTimeEvent(hat2, 110, 10)));
// head
fEvents.put(fHead1.getName(),
Arrays.asList(new NullTimeEvent(fHead1, 0, 20), new TimeEvent(fHead1, 20, 30, HAIR), new TimeEvent(fHead1, 50, 20, SKIN), new TimeEvent(fHead1, 70, 10, EYE), new TimeEvent(fHead1, 80, 10, SKIN), new NullTimeEvent(fHead1, 90, 30)));
fEvents.put(head2.getName(), Arrays.asList(new NullTimeEvent(head2, 0, 10), new TimeEvent(head2, 10, 10, HAIR), new TimeEvent(head2, 20, 10, SKIN), new TimeEvent(head2, 30, 10, HAIR), new TimeEvent(head2, 40, 30, SKIN),
new TimeEvent(head2, 70, 10, EYE), new TimeEvent(head2, 80, 30, SKIN), new NullTimeEvent(head2, 110, 10)));
fEvents.put(head3.getName(), Arrays.asList(new NullTimeEvent(head3, 0, 10), new TimeEvent(head3, 10, 10, HAIR), new TimeEvent(head3, 20, 10, SKIN), new TimeEvent(head3, 30, 20, HAIR), new TimeEvent(head3, 50, 30, SKIN),
new TimeEvent(head3, 80, 10, HAIR), new TimeEvent(head3, 90, 30, SKIN)));
fEvents.put(head4.getName(), Arrays.asList(new NullTimeEvent(head4, 0, 10), new TimeEvent(head4, 10, 20, HAIR), new TimeEvent(head4, 30, 40, SKIN), new TimeEvent(head4, 70, 40, HAIR), new TimeEvent(head4, 110, 10)));
// neck
fEvents.put(neck.getName(), Arrays.asList(new NullTimeEvent(neck, 0, 30), new TimeEvent(neck, 30, 70, SKIN), new NullTimeEvent(neck, 100, 20)));
fEvents.put(row1.getName(), Arrays.asList(new TimeEvent(row1, 110, 30, PIE)));
fEvents.put(fRow2.getName(), Arrays.asList(new TimeEvent(fRow2, 90, 60, PIE)));
fEvents.put(row3.getName(), Arrays.asList(new TimeEvent(row3, 80, 50, PIE)));
fEvents.put(fRow4.getName(), Arrays.asList(new TimeEvent(fRow4, 80, 30, PIE)));
fEvents.put(row5.getName(), Arrays.asList(new TimeEvent(row5, 80, 50, PIE)));
fEvents.put(row6.getName(), Arrays.asList(new TimeEvent(row6, 90, 60, PIE)));
fEvents.put(row7.getName(), Arrays.asList(new TimeEvent(row7, 110, 30, PIE)));
List<ITimeEvent> events = new ArrayList<>();
for (long i = -1; i < 160; i++) {
double phase = ((double) i) / 16;
long value1 = Math.abs((long) (Math.sin(phase) * 1024) + 1024);
long value2 = Math.abs((long) (Math.sin(phase + Math.PI * 0.2) * 1024)+1024);
long value3 = Math.abs((long) (Math.sin(phase + Math.PI * 0.4) * 1024)+1024);
long value4 = Math.abs((long) (Math.sin(phase + Math.PI * 0.6) * 1024)+1024);
events.add(new TimeLineEvent(pulse, i, Arrays.asList(value1, value2, value3, value4)));
}
fEvents.put(pulse.getName(), events);
}
@Override
protected @NonNull Multimap<@NonNull Integer, @NonNull String> getRegexes() {
Multimap<@NonNull Integer, @NonNull String> regexes = super.getRegexes();
if (regexes.containsKey(IFilterProperty.BOUND) && (fFilterRegex == null || fFilterRegex.isEmpty())) {
regexes.removeAll(IFilterProperty.BOUND);
}
if (!regexes.containsKey(IFilterProperty.BOUND) && fFilterRegex != null && !fFilterRegex.isEmpty()) {
regexes.put(IFilterProperty.BOUND, fFilterRegex);
}
return regexes;
}
/**
* Set the regex to highlight on
*/
public void setFilterRegex(String filterRegex) {
fFilterRegex = filterRegex;
}
@Override
protected void buildEntryList(@NonNull ITmfTrace trace, @NonNull ITmfTrace parentTrace, @NonNull IProgressMonitor monitor) {
List<@NonNull TimeGraphEntry> entryList = getEntryList(trace);
if (entryList == null || entryList.isEmpty()) {
addToEntryList(trace, fEntries);
}
refresh();
}
@Override
protected StubPresentationProvider getPresentationProvider() {
StubPresentationProvider presentationProvider = fPresentationProvider;
if (presentationProvider == null && (super.getPresentationProvider() instanceof StubPresentationProvider)) {
return (StubPresentationProvider) super.getPresentationProvider();
}
return presentationProvider;
}
/**
* Set the presentation provider
*
* @param presentaitonProvider
* the presentation provider
*/
public void setPresentationProvider(StubPresentationProvider presentaitonProvider) {
fPresentationProvider = presentaitonProvider;
getTimeGraphViewer().setTimeGraphProvider(presentaitonProvider);
refresh();
}
@SuppressWarnings("restriction")
@Override
protected @Nullable List<@NonNull ITimeEvent> getEventList(@NonNull TimeGraphEntry entry, long startTime, long endTime, long resolution, @NonNull IProgressMonitor monitor) {
ITmfTrace trace = getTrace();
if (trace == null) {
return Collections.emptyList();
}
List<@NonNull ITimeEvent> references = fEvents.get(entry.getName());
List<@NonNull ITimeEvent> ret = new ArrayList<>();
if (references != null) {
for (ITimeEvent ref : references) {
if (ref instanceof NullTimeEvent) {
ret.add(new NullTimeEvent(ref.getEntry(), ref.getTime() + trace.getStartTime().toNanos(), ref.getDuration()));
} else if (ref instanceof TimeLineEvent) {
ret.add(new TimeLineEvent(ref.getEntry(), ref.getTime() + trace.getStartTime().toNanos(), ((TimeLineEvent) ref).getValues()));
} if (ref instanceof TimeEvent) {
ret.add(new TimeEvent(ref.getEntry(), ref.getTime() + trace.getStartTime().toNanos(), ref.getDuration(), ((TimeEvent) ref).getValue()));
}
}
}
entry.setEventList(ret);
return ret;
}
@Override
protected @NonNull List<String> getMarkerCategories() {
return Collections.singletonList(MARKER_GROUP);
}
@Override
protected @Nullable List<@NonNull ILinkEvent> getLinkList(long startTime, long endTime, long resolution, @NonNull IProgressMonitor monitor) {
ITmfTrace trace = getTrace();
if (trace == null) {
return Collections.emptyList();
}
return Collections.singletonList(new TimeLinkEvent(fHead1, fRow2, 75 + trace.getStartTime().toNanos(), 15));
}
@Override
protected @NonNull List<IMarkerEvent> getViewMarkerList(long startTime, long endTime, long resolution, @NonNull IProgressMonitor monitor) {
ITmfTrace trace = getTrace();
if (trace == null) {
return Collections.emptyList();
}
long start = trace.getStartTime().toNanos();
return Arrays.<IMarkerEvent> asList(
(IMarkerEvent) new MarkerEvent(fHead1, 120 + start, 50, MARKER_GROUP, new RGBA(33, 33, 33, 33), "Wind", true),
(IMarkerEvent) new MarkerEvent(fRow4, 20 + start, 60, MARKER_GROUP, new RGBA(22, 33, 44, 22), "Speed", false),
(IMarkerEvent) new MarkerEvent(fRow2, 20 + start, 0, MARKER_GROUP, new RGBA(22, 33, 44, 22), "", false, 0),
(IMarkerEvent) new MarkerEvent(fRow2, 26 + start, 0, MARKER_GROUP, new RGBA(22, 33, 44, 22), "", false, 1),
(IMarkerEvent) new MarkerEvent(fRow2, 32 + start, 0, MARKER_GROUP, new RGBA(22, 33, 44, 22), "", false, 2),
(IMarkerEvent) new MarkerEvent(fRow2, 38 + start, 0, MARKER_GROUP, new RGBA(22, 33, 44, 22), "", false, 3),
(IMarkerEvent) new MarkerEvent(fRow2, 44 + start, 0, MARKER_GROUP, new RGBA(22, 33, 44, 22), "", false, 4),
(IMarkerEvent) new MarkerEvent(fRow2, 50 + start, 0, MARKER_GROUP, new RGBA(22, 33, 44, 22), "", false, 5));
}
/**
* Get window range, for testing
*
* @return the window range
*/
public TmfTimeRange getWindowRange() {
return new TmfTimeRange(TmfTimestamp.fromNanos(getTimeGraphViewer().getTime0()), TmfTimestamp.fromNanos(getTimeGraphViewer().getTime1()));
}
}