From 5ed58483cd78ebc2bb6689e14fd0970077e793fb Mon Sep 17 00:00:00 2001 From: Fabrizio Iannetti Date: Fri, 17 Feb 2023 17:37:46 +0100 Subject: [PATCH] tracebook: first commit Signed-off-by: Fabrizio Iannetti --- .../.classpath | 7 + .../.gitignore | 1 + .../.project | 28 +++ .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 9 + .../META-INF/MANIFEST.MF | 20 ++ .../build.properties | 5 + .../icons/cpuusage.png | Bin 0 -> 240 bytes .../icons/cpuusage@2x.png | Bin 0 -> 162 bytes .../icons/cpuusage@4x.png | Bin 0 -> 206 bytes .../plugin.xml | 14 ++ .../incubator/tracebook/ui/Activator.java | 86 +++++++++ .../tracebook/ui/controls/Section.java | 177 ++++++++++++++++++ .../tracebook/ui/controls/VerticalLabel.java | 32 ++++ .../ui/providers/ProviderPresenter.java | 54 ++++++ .../ui/view/SectionForMultiViewer.java | 107 +++++++++++ .../tracebook/ui/view/TraceBookView.java | 102 ++++++++++ 17 files changed, 644 insertions(+) create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/.classpath create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/.gitignore create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/.project create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.core.resources.prefs create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.jdt.core.prefs create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/META-INF/MANIFEST.MF create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/build.properties create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/icons/cpuusage.png create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/icons/cpuusage@2x.png create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/icons/cpuusage@4x.png create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/plugin.xml create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/Activator.java create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/Section.java create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/VerticalLabel.java create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/providers/ProviderPresenter.java create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/SectionForMultiViewer.java create mode 100644 org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/TraceBookView.java diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/.classpath b/org.eclipse.tracecompass.incubator.tracebook.ui/.classpath new file mode 100644 index 0000000..81fe078 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/.gitignore b/org.eclipse.tracecompass.incubator.tracebook.ui/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/.project b/org.eclipse.tracecompass.incubator.tracebook.ui/.project new file mode 100644 index 0000000..070b26f --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/.project @@ -0,0 +1,28 @@ + + + org.eclipse.tracecompass.incubator.tracebook.ui + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.core.resources.prefs b/org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..62ef348 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/META-INF/MANIFEST.MF b/org.eclipse.tracecompass.incubator.tracebook.ui/META-INF/MANIFEST.MF new file mode 100644 index 0000000..38d57e2 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/META-INF/MANIFEST.MF @@ -0,0 +1,20 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Tracebook +Bundle-SymbolicName: org.eclipse.tracecompass.incubator.tracebook.ui;singleton:=true +Bundle-Version: 1.0.0.qualifier +Require-Bundle: org.eclipse.core.runtime;bundle-version="3.26.100", + org.eclipse.tracecompass.common.core;bundle-version="5.1.1", + org.eclipse.tracecompass.tmf.core;bundle-version="8.3.0", + org.eclipse.tracecompass.tmf.ui;bundle-version="8.1.0", + org.eclipse.tracecompass.incubator.tmf.ui.multiview.ui;bundle-version="0.1.1", + org.eclipse.nebula.widgets.opal.commons, + org.eclipse.tracecompass.analysis.os.linux.core;bundle-version="7.0.0", + org.eclipse.tracecompass.analysis.graph.core;bundle-version="4.0.0", + org.eclipse.jdt.annotation;bundle-version="2.2.700", + org.eclipse.ui;bundle-version="3.201.200", + org.eclipse.swtchart +Automatic-Module-Name: org.eclipse.tracecompass.incubator.tmf.ui.tracebook +Bundle-ActivationPolicy: lazy +Bundle-Activator: org.eclipse.tracecompass.incubator.tracebook.ui.Activator +Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/build.properties b/org.eclipse.tracecompass.incubator.tracebook.ui/build.properties new file mode 100644 index 0000000..e9863e2 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.xml diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/icons/cpuusage.png b/org.eclipse.tracecompass.incubator.tracebook.ui/icons/cpuusage.png new file mode 100644 index 0000000000000000000000000000000000000000..5a77dc4b5ca8bca8fd6553644756872c99254327 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfyU#$>qC3TgC<%}7J+&-TpyJ%xRC?EERTv(%BqN*YsRwCh5GX zxoY$w%`W1Hy3`(?+nH;#-tJMoz|hn7`N@O1%kFzMRW!XcvvSn1TY zY~Yy1>JoatT39D`sn8UA@fa?T;-Uos+{cX1{Bm2%DD(Wr^VlD)mmZpMx4mTTRE)lA l^wU_~`<~gH{kCe)SaA_-f;G^|44$rjF6*2UngEJHPvu|?PvQygMILHS@Z4&rD^?J-lRfZqCb4{l?hxt`LxwzxW z@lH_<>fTaRVP;+S9_uNzLzCm#lyX+MCAbUoKP(>(~L{0KuZ`rUHx3v IIVCg!0O{*Gp#T5? literal 0 HcmV?d00001 diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/icons/cpuusage@4x.png b/org.eclipse.tracecompass.incubator.tracebook.ui/icons/cpuusage@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..70cb671be178a28f113e317f7f2619116a7bc2e4 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=EX7WqAsj$Z!;#Vf + + + + + + + + diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/Activator.java b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/Activator.java new file mode 100644 index 0000000..d43b59c --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/Activator.java @@ -0,0 +1,86 @@ +package org.eclipse.tracecompass.incubator.tracebook.ui; + +import java.io.IOException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +public class Activator extends AbstractUIPlugin { + + public static final String PLUGIN_ID = "org.eclipse.tracecompass.incubator.tracebook.ui"; + + public static final String IMAGE_CPU_USAGE = "icons/cpuusage.png"; + + private static @Nullable Activator fPlugin; + + public Activator() { + } + + // ------------------------------------------------------------------------ + // Accessors + // ------------------------------------------------------------------------ + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + Activator plugin = fPlugin; + if (plugin == null) { + throw new IllegalStateException(); + } + return plugin; + } + + + /** + * Gets the absolute path from a path relative to this plugin's root + * + * @param relativePath + * The path relative to this plugin + * @return The absolute path corresponding to this relative path + */ + public @Nullable IPath getAbsolutePath(Path relativePath) { + URL location = FileLocator.find(getBundle(), relativePath, null); + try { + IPath path = new Path(FileLocator.toFileURL(location).getPath()); + return path; + } catch (IOException e) { + return null; + } + } + + // ------------------------------------------------------------------------ + // Operators + // ------------------------------------------------------------------------ + + @Override + public void start(@Nullable BundleContext context) throws Exception { + super.start(context); + fPlugin = this; + } + + @Override + public void stop(@Nullable BundleContext context) throws Exception { + fPlugin = null; + super.stop(context); + } + + public static Image getImage(String imageId) { + ImageRegistry imageRegistry = getDefault().getImageRegistry(); + Image image = imageRegistry.get(imageId); + if (image == null) { + image = imageDescriptorFromPlugin(PLUGIN_ID, imageId).createImage(); + imageRegistry.put(imageId, image); + } + return image; + } +} diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/Section.java b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/Section.java new file mode 100644 index 0000000..f68794e --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/Section.java @@ -0,0 +1,177 @@ +package org.eclipse.tracecompass.incubator.tracebook.ui.controls; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Sash; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; +import org.eclipse.tracecompass.incubator.tracebook.ui.providers.ProviderPresenter.ProviderPresentationInfo; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.PlatformUI; + +public class Section extends Composite { +// private static final String MOVE_DOWN_IMAGE = "arrow_down.png"; //$NON-NLS-1$ +// private static final String MOVE_UP_IMAGE = "arrow_up.png"; //$NON-NLS-1$ + + public static class ToolAction implements SelectionListener { + @Override + public void widgetSelected(SelectionEvent e) { + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + widgetSelected(e); + } + } + + SelectionListener moveUp = new ToolAction() { + @Override + public void widgetSelected(SelectionEvent e) { + SashForm sashForm = (SashForm) getParent(); + Control[] children = sashForm.getChildren(); + Control previous = null; + for (Control control : children) { + if (control instanceof Sash) { + continue; + } + if (control.equals(Section.this)) { + control.moveAbove(previous); + sashForm.layout(true); + break; + } + previous = control; + } + } + }; + + SelectionListener moveDown = new ToolAction() { + @Override + public void widgetSelected(SelectionEvent e) { + SashForm sashForm = (SashForm) getParent(); + Control[] children = sashForm.getChildren(); + Control previous = null; + for (Control control : children) { + if (control instanceof Sash) { + continue; + } + if (control.equals(Section.this)) { + previous = control; + } else if (previous != null) { + control.moveAbove(previous); + sashForm.layout(true); + break; + } + } + } + }; + + SelectionListener remove = new ToolAction() { + @Override + public void widgetSelected(SelectionEvent e) { +// Composite parent = getParent(); +// dispose(); +// parent.layout(true); + if (onCloseListener != null) { + onCloseListener.widgetDisposed(null); + } + } + }; + + static class ConfigureDialog extends Dialog { + private DisposeListener onClose; + + protected ConfigureDialog(Shell parentShell, DisposeListener onClose) { + super(parentShell); + this.onClose = onClose; + setShellStyle(SWT.RESIZE | SWT.MODELESS | SWT.CLOSE); + } + @Override + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite) super.createDialogArea(parent); + parent.getShell().setText("Configure Section"); + parent.getShell().addDisposeListener(onClose); + return composite; + } + + public void onTop() { + try { + getContents().getShell().forceActive(); + } catch (Exception e) { + // ignore exceptions, like disposed widgets + } + } + } + private ConfigureDialog configureDialog = null; + private DisposeListener onCloseListener; + + private Runnable onPaintListener; + + SelectionListener configure = new ToolAction() { + @Override + public void widgetSelected(SelectionEvent e) { + if (configureDialog != null) { + configureDialog.onTop(); + } else { + configureDialog = new ConfigureDialog(getShell(),e1 -> configureDialog = null); + configureDialog.open(); + } + } + }; + + public Section(Composite parent, Color bgColor, ProviderPresentationInfo info) { + super(parent, SWT.NONE); + // parent has 3 columns: toolbar, table/tree/text, graph (xy or timechart) + setLayout(new GridLayout(3, false)); + setBackground(bgColor); + Composite laneBar = new Composite(this, SWT.NONE); + laneBar.setBackground(bgColor); + laneBar.setLayoutData(GridDataFactory.fillDefaults().grab(false, true).create()); + GridLayoutFactory.fillDefaults().applyTo(laneBar); + ToolBar toolBar = new ToolBar(laneBar, SWT.VERTICAL); + GridDataFactory.fillDefaults().grab(true, false).applyTo(toolBar); + if (info.image != null) { + createToolItem(toolBar, info.image).addSelectionListener(configure); + } +// createToolItem(toolBar, MOVE_UP_IMAGE).addSelectionListener(moveUp); +// createToolItem(toolBar, MOVE_DOWN_IMAGE).addSelectionListener(moveDown); + createToolItem(toolBar, PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_ELCL_REMOVE)).addSelectionListener(remove); + VerticalLabel label = new VerticalLabel(laneBar); + label.setText(info.name); + label.setBackground(new Color(240, 240, 240)); + GridDataFactory.fillDefaults().hint(1, 1).grab(true, true).applyTo(label); + } + + private static ToolItem createToolItem(ToolBar toolBar, Image image) { + ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH); + toolItem.setImage(image); + return toolItem; + } + + public void onClose(DisposeListener listener) { + this.onCloseListener = listener; + } + + public void onPaint(Runnable listener) { + this.onPaintListener = listener; + } + + // private static ToolItem createToolItem(ToolBar toolBar, final String imageFileName) { +// final Image image = SWTGraphicUtil.createImageFromFile("images/" + imageFileName); //$NON-NLS-1$ +// ToolItem toolItem = createToolItem(toolBar, image); +// toolItem.setImage(image); +// SWTGraphicUtil.addDisposer(toolItem, image); +// return toolItem; +// } +} diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/VerticalLabel.java b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/VerticalLabel.java new file mode 100644 index 0000000..d1ce2e4 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/controls/VerticalLabel.java @@ -0,0 +1,32 @@ +package org.eclipse.tracecompass.incubator.tracebook.ui.controls; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Transform; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; + +public class VerticalLabel extends Canvas { + private String text = ""; + public VerticalLabel(Composite parent) { + super(parent, SWT.NONE); + addPaintListener(e -> paintLabel(e)); + } + + public void setText(String text) { + this.text = text; + } + + private void paintLabel(PaintEvent e) { + Point textExtent = e.gc.textExtent(text); + Transform t = new Transform(getDisplay()); + t.translate((e.width - textExtent.y) / 2, (e.height + textExtent.x) / 2); + t.rotate(-90); + float[] p = new float[] {0, 0}; + t.transform(p); + e.gc.setAdvanced(true); + e.gc.setTransform(t); + e.gc.drawText(text, e.x, e.y); + } +} \ No newline at end of file diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/providers/ProviderPresenter.java b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/providers/ProviderPresenter.java new file mode 100644 index 0000000..0508d5f --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/providers/ProviderPresenter.java @@ -0,0 +1,54 @@ +package org.eclipse.tracecompass.incubator.tracebook.ui.providers; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.swt.graphics.Image; +import org.eclipse.tracecompass.incubator.tracebook.ui.Activator; +import org.eclipse.tracecompass.internal.analysis.os.linux.core.cpuusage.CpuUsageDataProvider; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor; + +/** + * This class returns presentation information (name, icon) for known data providers. + * + * @author fab + * + */ +@SuppressWarnings("restriction") +public class ProviderPresenter { + private static ProviderPresenter fInstance = new ProviderPresenter(); + + // map providerId -> presentation info + private Map fInfo = new HashMap<>(); + + private ProviderPresenter() { + // cpu provider + fInfo.put(CpuUsageDataProvider.ID, ProviderPresentationInfo.create("CPU", "", Activator.getImage(Activator.IMAGE_CPU_USAGE))); + } + + public static class ProviderPresentationInfo { + public String name; + public String description; + public Image image; + + public static ProviderPresentationInfo create(IDataProviderDescriptor descriptor) { + return create(descriptor.getName(), descriptor.getDescription(), null); + } + + public static ProviderPresentationInfo create(String name, String description, Image image) { + ProviderPresentationInfo info = new ProviderPresentationInfo(); + info.name = name; + info.description = description; + info.image = image; + return info; + } + } + + public static ProviderPresenter getInstance() { + return fInstance; + } + + public ProviderPresentationInfo presentationFor(IDataProviderDescriptor descriptor) { + return fInfo.computeIfAbsent(descriptor.getId(), id -> ProviderPresentationInfo.create(descriptor)); + } +} diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/SectionForMultiViewer.java b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/SectionForMultiViewer.java new file mode 100644 index 0000000..8042a46 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/SectionForMultiViewer.java @@ -0,0 +1,107 @@ +package org.eclipse.tracecompass.incubator.tracebook.ui.view; + +import java.util.Objects; + +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.tracecompass.incubator.internal.tmf.ui.multiview.ui.view.IMultiViewer; +import org.eclipse.tracecompass.incubator.internal.tmf.ui.multiview.ui.view.xychart.ChartMultiViewer; +import org.eclipse.tracecompass.incubator.tracebook.ui.controls.Section; +import org.eclipse.tracecompass.incubator.tracebook.ui.providers.ProviderPresenter; +import org.eclipse.tracecompass.internal.tmf.ui.viewers.xychart.TmfXYChartTimeAdapter; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor.ProviderType; +import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo; +import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer; +import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.ITimeDataProvider; + +@SuppressWarnings("restriction") +final class SectionForMultiViewer extends Section implements IMultiViewer{ + private IDataProviderDescriptor fProvider; + private TmfViewer fViewer; + + public SectionForMultiViewer(Composite parent, IDataProviderDescriptor provider, ITmfTrace trace) { + super(parent, parent.getBackground(), ProviderPresenter.getInstance().presentationFor(provider)); + this.fProvider = provider; + + if (provider.getType() == ProviderType.TREE_TIME_XY) { + createXYGraph(trace); + } else if(provider.getType() == ProviderType.TIME_GRAPH) { + createTimeGraph(trace); + } else { + Label label = new Label(this, SWT.NONE); + label.setText("Not supported"); + GridDataFactory.fillDefaults().grab(true, true).applyTo(label); + } + } + @Override + public void performAlign(int offset, int width) { + // TODO Auto-generated method stub + } + + @Override + public TmfTimeViewAlignmentInfo getTimeViewAlignmentInfo() { + // TODO Auto-generated method stub + return new TmfTimeViewAlignmentInfo(getShell(), toDisplay(0, 0), 0); + } + + @Override + public int getAvailableWidth(int requestedOffset) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public String getName() { + return fProvider.getName(); + } + + @Override + public void dispose() { + if (isDisposed()) return; + Composite parent = getParent(); + super.dispose(); + if (parent != null && !parent.isDisposed()) { + parent.layout(true); + } + } + + private void createTimeGraph(ITmfTrace trace) { + // TODO Auto-generated method stub + Label label = new Label(this, SWT.CENTER); + label.setText("Timegraph"); + GridDataFactory.fillDefaults().grab(true, true).applyTo(label); + } + + private void createXYGraph(ITmfTrace trace) { + Composite composite = new Composite(this, SWT.NONE); + GridDataFactory.fillDefaults().grab(true, true).applyTo(composite); + composite.setLayout(new FillLayout()); + composite.setBackground(getBackground()); + ChartMultiViewer viewer = new ChartMultiViewer(composite, fProvider.getId()); + //viewer.setStatusLineManager(getViewSite().getActionBars().getStatusLineManager()); + if (trace != null) { + viewer.loadTrace(trace); + } + // A workaround for XYCharts to realign after a selection + // changes leading to possible changing of Y axis labels' width. +// if (viewer.getLeftChildViewer() instanceof AbstractSelectTreeViewer2) { +// AbstractSelectTreeViewer2 tree = (AbstractSelectTreeViewer2) viewer.getLeftChildViewer(); +// tree.addSelectionChangeListener(e -> alignViewers(false)); +// } + fViewer = viewer; + } + + public ITimeDataProvider getTimeDataProvider() { + if (fViewer instanceof ChartMultiViewer) { + ChartMultiViewer viewer = (ChartMultiViewer) fViewer; + TmfXYChartTimeAdapter timeProvider = new TmfXYChartTimeAdapter(Objects.requireNonNull(viewer.getChartViewer())); + return timeProvider; + } + return null; + } +} \ No newline at end of file diff --git a/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/TraceBookView.java b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/TraceBookView.java new file mode 100644 index 0000000..88ab9b0 --- /dev/null +++ b/org.eclipse.tracecompass.incubator.tracebook.ui/src/org/eclipse/tracecompass/incubator/tracebook/ui/view/TraceBookView.java @@ -0,0 +1,102 @@ +package org.eclipse.tracecompass.incubator.tracebook.ui.view; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.tracecompass.incubator.internal.tmf.ui.multiview.ui.view.AbstractMultiView; +import org.eclipse.tracecompass.incubator.internal.tmf.ui.multiview.ui.view.IMultiViewer; +import org.eclipse.tracecompass.internal.tmf.ui.viewers.xychart.TmfXYChartTimeAdapter; +import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderManager; +import org.eclipse.tracecompass.tmf.core.dataprovider.IDataProviderDescriptor; +import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat; +import org.eclipse.ui.dialogs.ListSelectionDialog; + +/** + * A View that can display a Tracebook, i.e. a collection of charts from different providers. + * + * @author Fabrizio Iannetti + * + */ +@SuppressWarnings("restriction") // TODO: move/modify MultiView logic here or extend MultiView and make API +public class TraceBookView extends AbstractMultiView { + + public static final String ID = "org.eclipse.tracecompass.incubator.tmf.ui.tracebook.TreaceBookView"; + + public TraceBookView() { + super(ID); + } + + @Override + protected void partControlCreated(Composite mainComposite, SashForm sashForm) { + hideTimeScales(); + } + + @Override + protected void createMenuItems() { + IMenuManager menuManager = getViewSite().getActionBars().getMenuManager(); + menuManager.add(createAddSectionAction()); + } + + private IAction createAddSectionAction() { + return new Action("Add Section", IAction.AS_PUSH_BUTTON) { + @Override + public void run() { + openDataProviderDialog(getTrace()); + } + }; + } + + private void openDataProviderDialog(ITmfTrace trace) { + Shell shell = getViewSite().getWorkbenchWindow().getShell(); + List providers = getProvidersList(trace); + ListSelectionDialog dialog = ListSelectionDialog.of(providers) + .labelProvider(new LabelProvider() { + @Override + public String getText(Object element) { + IDataProviderDescriptor provider = (IDataProviderDescriptor) element; + return provider.getName(); + } + }) + .title("Add Section") + .message("Select the data provider for the new section") + .create(shell); + if (dialog.open() == Window.OK) { + Object[] selected = dialog.getResult(); + for (Object object : selected) { + IDataProviderDescriptor provider = (IDataProviderDescriptor) object; + SectionForMultiViewer lane = new SectionForMultiViewer(getLanesParent(), provider, getTrace()); + addSection(lane); + lane.onClose(e -> removeLane(lane)); + } + } + } + + private void addSection(SectionForMultiViewer section) { + if (!hasLanes()) { + setTimeProvider(section.getTimeDataProvider()); + section.onPaint(() -> redrawTimeScales()); + } + addLane(section); +// if (!hasLanes()) { +// viewer.getChartViewer().getSwtChart().addPaintListener(e -> redrawTimeScales()); +// TmfXYChartTimeAdapter timeProvider = new TmfXYChartTimeAdapter(Objects.requireNonNull(viewer.getChartViewer())); +// timeProvider.setTimeFormat(TimeFormat.CALENDAR.convert()); +// setTimeProvider(timeProvider); +// } + } + + private List getProvidersList(ITmfTrace trace) { + List descriptors = + DataProviderManager.getInstance().getAvailableProviders(trace); + return descriptors; + } +}