--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.linuxtools.tmf.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name
+Bundle-SymbolicName: org.eclipse.linuxtools.tmf.ui
+Bundle-Version: 0.2.0.qualifier
+Bundle-Activator: org.eclipse.linuxtools.tmf.ui.TmfUiPlugin
+Bundle-Vendor: %Bundle-Vendor
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.linuxtools.tmf;bundle-version="0.2.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.linuxtools.tmf.ui,
+ org.eclipse.linuxtools.tmf.ui.viewers,
+ org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis,
+ org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.dialogs,
+ org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model,
+ org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets,
+ org.eclipse.linuxtools.tmf.ui.views
+Bundle-Localization: plugin
--- /dev/null
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ icons/,\
+ plugin.properties
--- /dev/null
+#Properties file for org.eclipse.linuxtools.tmf.ui
+Bundle-Vendor = Eclipse Linux Tools
+Bundle-Name = Tracing and Monitoring Framework (TMF) UI (Incubation)
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * <b><u>TmfUiPlugin</u></b>
+ * <p>
+ * The activator class controls the plug-in life cycle
+ */
+public class TmfUiPlugin extends AbstractUIPlugin {
+
+ // ========================================================================
+ // Attributes
+ // ========================================================================
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.linuxtools.tmf.ui";
+
+ // The shared instance
+ private static TmfUiPlugin plugin;
+
+ // ========================================================================
+ // Constructors
+ // ========================================================================
+
+ /**
+ * The constructor
+ */
+ public TmfUiPlugin() {
+ }
+
+ // ========================================================================
+ // Accessors
+ // ========================================================================
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static TmfUiPlugin getDefault() {
+ return plugin;
+ }
+
+ // ========================================================================
+ // Operators
+ // ========================================================================
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.viewers;
+
+/**
+ * <b><u>ITmfWidget</u></b>
+ * <p>
+ *
+ * TODO: Implement me. Please.
+ */
+public interface ITmfViewer {
+
+}
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisViewer;\r
+import org.eclipse.swt.widgets.Composite;\r
+\r
+/**\r
+ * <b><u>TmfWidgetFactory</u></b>\r
+ * <p>\r
+ *\r
+ * TODO: Generalize when extension points are introduced\r
+ * TODO: Today, it is specific for the TimeAnalysis widget\r
+ */\r
+public class TmfViewerFactory {\r
+\r
+// public static ITmfWidget createWidget(String id, Composite parent) {\r
+// return null;\r
+// }\r
+ \r
+ public static ITimeAnalysisViewer createViewer(Composite parent,\r
+ TmfTimeAnalysisProvider provider) {\r
+ return new TmfTimeAnalysisViewer(parent, provider);\r
+ }\r
+\r
+}\r
--- /dev/null
+/**********************************************************************\r
+ * Copyright (c) 2005, 2006 IBM Corporation and others.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * $Id: GridUtil.java,v 1.3 2006/09/20 19:49:13 ewchan Exp $\r
+ * \r
+ * Contributors: \r
+ * IBM - Initial API and implementation\r
+ **********************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.layout.GridData;\r
+\r
+/**\r
+ * A utility class to create convenient grid data objects.\r
+ */ \r
+public class GridUtil\r
+{\r
+ /**\r
+ * Creates a grid data object that occupies vertical and horizontal\r
+ * space.\r
+ */\r
+ static public GridData createFill() \r
+ {\r
+ return new GridData(SWT.FILL, SWT.FILL, true, true);\r
+ }\r
+ /**\r
+ * Creates a grid data object that occupies horizontal space.\r
+ */\r
+ static public GridData createHorizontalFill() \r
+ { \r
+ return new GridData(SWT.FILL, SWT.DEFAULT, true, false); \r
+ }\r
+ /**\r
+ * Creates a grid data object that occupies vertical space.\r
+ */\r
+ static public GridData createVerticalFill() \r
+ {\r
+ return new GridData(SWT.DEFAULT, SWT.FILL, false, true);\r
+ }\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009, 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+ package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.ITmfViewer;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.TimeEvent;\r
+import org.eclipse.swt.events.ControlEvent;\r
+import org.eclipse.swt.widgets.Control;\r
+\r
+/**\r
+ * <b><u>ITimeAnalysisWidget</u></b>\r
+ * <p>\r
+ *\r
+ * TODO: Implement me. Please.\r
+ */\r
+public interface ITimeAnalysisViewer extends ITmfViewer {\r
+\r
+ public enum TimeFormat {\r
+ RELATIVE, ABSOLUTE\r
+ };\r
+\r
+ /**\r
+ * @param e\r
+ */\r
+ public void controlResized(ControlEvent e);\r
+\r
+ /**\r
+ * \r
+ * @param traceArr\r
+ * @param start\r
+ * Specifies a fixed start time to the information to be\r
+ * displayed\r
+ * @param end\r
+ * Specifies a fixed end time to the information to be displayed\r
+ * @param updateTimeBounds\r
+ * If True - Time Range boundaries update is required\r
+ */\r
+ public abstract void display(ITmfTimeAnalysisEntry[] traceArr, long start,\r
+ long end, boolean updateTimeBounds);\r
+\r
+ /**\r
+ * The start and End time are taken from the limits used by the children\r
+ * events\r
+ * \r
+ * @param traceArr\r
+ */\r
+ public abstract void display(ITmfTimeAnalysisEntry[] traceArr);\r
+\r
+ public void addWidgetSelectionListner(ITmfTimeSelectionListener listener);\r
+\r
+ public void addWidgetTimeScaleSelectionListner(\r
+ ITmfTimeScaleSelectionListener listener);\r
+\r
+ public void filterTraces();\r
+\r
+ public ITmfTimeAnalysisEntry getSelectedTrace();\r
+\r
+ public ISelection getSelection();\r
+\r
+ public void groupTraces(boolean on);\r
+\r
+ public boolean isInFocus();\r
+\r
+ public void removeWidgetSelectionListner(ITmfTimeSelectionListener listener);\r
+\r
+ public void removeWidgetTimeScaleSelectionListner(\r
+ ITmfTimeScaleSelectionListener listener);\r
+\r
+ public void resetStartFinishTime();\r
+\r
+ public void selectNextEvent();\r
+\r
+ public void selectPrevEvent();\r
+\r
+ public void selectNextTrace();\r
+\r
+ public void selectPrevTrace();\r
+\r
+ public void showLegend();\r
+\r
+ public void zoomIn();\r
+\r
+ public void zoomOut();\r
+\r
+ public void setSelectedTime(long time, boolean ensureVisible, Object source);\r
+\r
+ public void setSelectedEvent(ITimeEvent event, Object Source);\r
+\r
+ public void setSelectedTraceTime(ITmfTimeAnalysisEntry trace, long time, Object Source);\r
+\r
+ public void setSelectVisTimeWindow(long time0, long time1, Object Source);\r
+\r
+ public void setAcceptSelectionAPIcalls(boolean acceptCalls);\r
+\r
+ public void setTimeCalendarFormat(boolean toAbsoluteCaltime);\r
+\r
+ public boolean isCalendarFormat();\r
+\r
+ public boolean isVisibleVerticalScroll();\r
+\r
+ public void setVisibleVerticalScroll(boolean visibleVerticalScroll);\r
+\r
+ public int getBorderWidth();\r
+\r
+ public void setBorderWidth(int borderWidth);\r
+\r
+ public int getHeaderHeight();\r
+\r
+ public void setHeaderHeight(int headerHeight);\r
+\r
+ public int getItemHeight();\r
+\r
+ public void setItemHeight(int rowHeight);\r
+\r
+ public void resizeControls();\r
+\r
+ public void setSelectedTrace(ITmfTimeAnalysisEntry trace);\r
+\r
+ public ISelection getSelectionTrace();\r
+\r
+ public void setNameWidthPref(int width);\r
+\r
+ public int getNameWidthPref(int width);\r
+\r
+ public void addFilterSelectionListner(ITmfTimeFilterSelectionListener listener);\r
+\r
+ public void removeFilterSelectionListner(\r
+ ITmfTimeFilterSelectionListener listener);\r
+\r
+ public int getTimeSpace();\r
+\r
+ public void itemUpdate(ITmfTimeAnalysisEntry parent, TimeEvent item);\r
+\r
+ public Control getControl();\r
+\r
+ public ISelectionProvider getSelectionProvider();\r
+\r
+ /**\r
+ * <p>\r
+ * Provide the possibility to control the wait cursor externally\r
+ * </p>\r
+ * <p>\r
+ * e.g. data requests in progress\r
+ * </p>\r
+ * \r
+ * @param waitInd\r
+ * - true change to wait cursor\r
+ */\r
+ public void waitCursor(boolean waitInd);\r
+\r
+ public void setFocus();\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.EventListener;\r
+\r
+public interface ITmfTimeFilterSelectionListener extends EventListener {\r
+ public void tmfTaProcessFilterSelection(TmfTimeFilterSelectionEvent event);\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.EventListener;\r
+\r
+/**\r
+ * Implemented by any user of TmfTime in order to be notified of available events,\r
+ * upon registration\r
+ * \r
+ */\r
+public interface ITmfTimeScaleSelectionListener extends EventListener {\r
+ public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event);\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.EventListener;\r
+\r
+/**\r
+ * Implemented by any user of TsfTm in order to be notified of available events,\r
+ * upon registration\r
+ * \r
+ */\r
+public interface ITmfTimeSelectionListener extends EventListener {\r
+ public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event);\r
+}\r
--- /dev/null
+/********************************************************************** \r
+ * Copyright (c) 2005, 2008, 2009, 2010 IBM Corporation, Intel Corporation, Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials \r
+ * are made available under the terms of the Eclipse Public License v1.0 \r
+ * which accompanies this distribution, and is available at \r
+ * http://www.eclipse.org/legal/epl-v10.html \r
+ * $Id: UIMessages.java,v 1.18 2008/06/03 16:53:41 aalexeev Exp $ \r
+ * \r
+ * Contributors: \r
+ * IBM - Initial API and implementation \r
+ * Alvaro Sanchez-Leon - Stripped down for TMF\r
+ **********************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import org.eclipse.osgi.util.NLS;\r
+\r
+public class Messages {\r
+\r
+ private static final String BUNDLE_NAME = "org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.messages"; //$NON-NLS-1$\r
+ public static String TRACE_STATES_TITLE;\r
+\r
+ public static String _TRACE_ID;\r
+ public static String _TRACE_NAME;\r
+ public static String _TRACE_CLASS_NAME;\r
+ public static String _TRACE_GROUP_NAME;\r
+ public static String _TRACE_START_TIME;\r
+ public static String _TRACE_EVENT_TIME;\r
+ public static String _TRACE_DATE;\r
+ public static String _TRACE_STOP_TIME;\r
+ public static String _TRACE_STATE;\r
+ public static String _NUMBER_OF_TRACES;\r
+ public static String _TRACE_FILTER;\r
+ public static String _TRACE_FILTER_DESC;\r
+ // misc\r
+ public static String _Timescale;\r
+ public static String _DURATION;\r
+ public static String _UNDEFINED_GROUP;\r
+ public static String _TRACE_GROUP_LABEL;\r
+ public static String _EDIT_PROFILING_OPTIONS;\r
+\r
+ public static String _LEGEND;\r
+ public static String _TRACE_STATES;\r
+ public static String _WINDOW_TITLE;\r
+\r
+ private Messages() {\r
+ // Do not instantiate\r
+ }\r
+\r
+ static {\r
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);\r
+ }\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009, 2010 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.TimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.TraceColorScheme;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+\r
+public abstract class TmfTimeAnalysisProvider {\r
+ \r
+ static public final int IMG_THREAD_RUNNING = 0;\r
+ static public final int IMG_THREAD_SUSPENDED = 1;\r
+ static public final int IMG_THREAD_STOPPED = 2;\r
+ static public final int IMG_METHOD_RUNNING = 3;\r
+ static public final int IMG_METHOD = 4;\r
+ static public final int IMG_NUM = 5;\r
+\r
+ public enum StateColor {\r
+ GREEN, DARK_BLUE, RED, GOLD, ORANGE, GRAY, BLACK, DARK_GREEN, DARK_YELLOW, MAGENTA3, PURPLE1, PINK1, AQUAMARINE, LIGHT_BLUE, CADET_BLUE, OLIVE;\r
+\r
+ private String stateName;\r
+\r
+ StateColor() {\r
+ String undef = new String("Undefined");\r
+ this.stateName = undef;\r
+ }\r
+\r
+ public String getStateName() {\r
+ return stateName;\r
+ }\r
+\r
+ public void setStateName(String stateName) {\r
+ this.stateName = stateName;\r
+ }\r
+ }\r
+\r
+ // static private String _externalPath[] = {\r
+ // "icons/full/obj16/thread_obj.gif", // running thread\r
+ // "icons/full/obj16/threads_obj.gif", // suspended\r
+ // "icons/full/obj16/threadt_obj.gif", // stopped\r
+ // "icons/full/obj16/stckframe_running_obj.gif", // running stack frame\r
+ // "icons/full/obj16/stckframe_obj.gif", // stack frame\r
+ // };\r
+ //\r
+ // static private String _externalPlugin[] = { "org.eclipse.debug.ui",\r
+ // "org.eclipse.debug.ui", "org.eclipse.debug.ui",\r
+ // "org.eclipse.debug.ui", "org.eclipse.debug.ui", };\r
+ //\r
+ // static private Image getImage(int idx) {\r
+ // if (idx < 0 || idx >= IMG_NUM)\r
+ // SWT.error(SWT.ERROR_INVALID_ARGUMENT);\r
+ // String key = "trace.img." + idx;\r
+ // Image img = TmfUiPlugin.getDefault().getImageRegistry().get(key);\r
+ // if (null == img) {\r
+ // ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin(\r
+ // _externalPlugin[idx], _externalPath[idx]);\r
+ // TmfUiPlugin.getDefault().getImageRegistry().put(key, desc);\r
+ // img = TmfUiPlugin.getDefault().getImageRegistry().get(key);\r
+ // }\r
+ // return img;\r
+ // }\r
+\r
+ public void drawState(TraceColorScheme colors, ITimeEvent event,\r
+ Rectangle rect, GC gc, boolean selected, boolean rectBound,\r
+ boolean timeSelected) {\r
+ int colorIdx = getEventColorVal(event);\r
+ drawState(colors, colorIdx, rect, gc, selected, rectBound, timeSelected);\r
+\r
+ }\r
+\r
+ public void drawState(TraceColorScheme colors, int colorIdx,\r
+ Rectangle rect, GC gc, boolean selected, boolean rectBound,\r
+ boolean timeSelected) {\r
+\r
+ boolean visible = rect.width == 0 ? false : true;\r
+ int colorIdx1 = colorIdx;\r
+ \r
+ timeSelected = timeSelected && selected;\r
+ if (timeSelected) {\r
+ colorIdx1 = colorIdx + TraceColorScheme.STATES_SEL0\r
+ - TraceColorScheme.STATES0;\r
+ }\r
+\r
+ if (visible) {\r
+ // fill all rect area\r
+ if (rect.isEmpty())\r
+ return;\r
+\r
+ gc.setBackground(colors.getColor(colorIdx1));\r
+ gc.fillRectangle(rect);\r
+ colorIdx1 = colorIdx + TraceColorScheme.STATES_BORDER0\r
+ - TraceColorScheme.STATES0;\r
+ gc.setForeground(colors.getColor(colorIdx1));\r
+\r
+ // draw bounds\r
+ if (!timeSelected) {\r
+ if (rectBound && rect.width >= 3) {\r
+ gc.drawRectangle(rect.x, rect.y, rect.width - 1,\r
+ rect.height - 1);\r
+ } else {\r
+ // Draw the top and bottom borders i.e. no side borders\r
+ // top\r
+ gc\r
+ .drawLine(rect.x, rect.y, rect.x + rect.width - 1,\r
+ rect.y);\r
+ // bottom\r
+ gc.drawLine(rect.x, rect.y + rect.height - 1, rect.x\r
+ + rect.width - 1, rect.y + rect.height - 1);\r
+ }\r
+ }\r
+ // draw decoration middle line\r
+ // int mindy = rect.y + rect.height / 2;\r
+ // if (TraceColorScheme.GOLD_STATE == colorIdx\r
+ // || TraceColorScheme.ORANGE_STATE == colorIdx) {\r
+ // int s = gc.getLineStyle();\r
+ // int w = gc.getLineWidth();\r
+ // gc.setLineStyle(SWT.LINE_DOT);\r
+ // gc.setLineWidth(2);\r
+ // gc.drawLine(rect.x, mindy, rect.x + rect.width, mindy);\r
+ // gc.setLineStyle(s);\r
+ // gc.setLineWidth(w);\r
+ // } else if (TraceColorScheme.RED_STATE == colorIdx\r
+ // || TraceColorScheme.GRAY_STATE == colorIdx) {\r
+ // int w = gc.getLineWidth();\r
+ // gc.setLineWidth(2);\r
+ // gc.drawLine(rect.x, mindy, rect.x + rect.width, mindy);\r
+ // gc.setLineWidth(w);\r
+ // }\r
+ // // draw selection bounds\r
+ // if (timeSelected) {\r
+ // gc.setForeground(colors\r
+ // .getColor(TraceColorScheme.SELECTED_TIME));\r
+ // if (rect.width >= 3) {\r
+ // gc.drawRectangle(rect.x, rect.y, rect.width - 1,\r
+ // rect.height - 1);\r
+ // // gc.drawRectangle(rect.x + 1, rect.y + 1, rect.width - 3,\r
+ // // rect.height - 3);\r
+ // } else {\r
+ // gc\r
+ // .drawLine(rect.x, rect.y, rect.x + rect.width - 1,\r
+ // rect.y);\r
+ // gc.drawLine(rect.x, rect.y + rect.height - 1, rect.x\r
+ // + rect.width - 1, rect.y + rect.height - 1);\r
+ // }\r
+ // gc.drawLine(rect.x, rect.y + 1, rect.x + rect.width - 1,\r
+ // rect.y + 1);\r
+ // gc.drawLine(rect.x, rect.y + rect.height - 2, rect.x\r
+ // + rect.width - 1, rect.y + rect.height - 2);\r
+ // }\r
+ } else {\r
+ // selected rectangle area is not visible but can be represented\r
+ // with a broken vertical line of specified width.\r
+ int width = 2;\r
+ rect.width = width;\r
+ // check if height is greater than zero.\r
+ if (rect.isEmpty())\r
+ return;\r
+ // colorIdx1 = TraceColorScheme.BLACK;\r
+ gc.setForeground(colors.getColor(colorIdx));\r
+ int s = gc.getLineStyle();\r
+ int w = gc.getLineWidth();\r
+ gc.setLineStyle(SWT.LINE_DOT);\r
+ gc.setLineWidth(width);\r
+ // Trace.debug("Reactangle not visible, drawing vertical line with: "\r
+ // + rect.x + "," + rect.y + "," + rect.x + "," + rect.y\r
+ // + rect.height);\r
+ gc.drawLine(rect.x, rect.y, rect.x, rect.y + rect.height);\r
+ gc.setLineStyle(s);\r
+ gc.setLineWidth(w);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Uses the abstract method getEventcolor to obtain an enum value and\r
+ * convert it to an internal color index\r
+ * \r
+ * @param event\r
+ * @return\r
+ */\r
+ public int getEventColorVal(ITimeEvent event) {\r
+ StateColor colors = getEventColor(event);\r
+ if (colors == StateColor.GREEN) {\r
+ return TraceColorScheme.GREEN_STATE;\r
+ } else if (colors == StateColor.DARK_BLUE) {\r
+ return TraceColorScheme.DARK_BLUE_STATE;\r
+ } else if (colors == StateColor.RED) {\r
+ return TraceColorScheme.RED_STATE;\r
+ } else if (colors == StateColor.GOLD) {\r
+ return TraceColorScheme.GOLD_STATE;\r
+ } else if (colors == StateColor.ORANGE) {\r
+ return TraceColorScheme.ORANGE_STATE;\r
+ } else if (colors == StateColor.GRAY) {\r
+ return TraceColorScheme.GRAY_STATE;\r
+ } else if (colors == StateColor.DARK_GREEN) {\r
+ return TraceColorScheme.DARK_GREEN_STATE;\r
+ } else if (colors == StateColor.DARK_YELLOW) {\r
+ return TraceColorScheme.DARK_YELLOW_STATE;\r
+ } else if (colors == StateColor.MAGENTA3) {\r
+ return TraceColorScheme.MAGENTA3_STATE;\r
+ } else if (colors == StateColor.PURPLE1) {\r
+ return TraceColorScheme.PURPLE1_STATE;\r
+ } else if (colors == StateColor.PINK1) {\r
+ return TraceColorScheme.PINK1_STATE;\r
+ } else if (colors == StateColor.AQUAMARINE) {\r
+ return TraceColorScheme.AQUAMARINE_STATE;\r
+ } else if (colors == StateColor.LIGHT_BLUE) {\r
+ return TraceColorScheme.LIGHT_BLUE_STATE;\r
+ } else if (colors == StateColor.CADET_BLUE) {\r
+ return TraceColorScheme.CADET_BLUE_STATE_SEL;\r
+ } else if (colors == StateColor.OLIVE) {\r
+ return TraceColorScheme.OLIVE_STATE;\r
+ }\r
+\r
+ return TraceColorScheme.BLACK_STATE;\r
+ }\r
+\r
+ /**\r
+ * Select the color for the different internal variants of events.\r
+ * \r
+ * @param event\r
+ * @return\r
+ */\r
+ public abstract StateColor getEventColor(ITimeEvent event);\r
+\r
+ /**\r
+ * This values is appended between braces to the right of Trace Name e.g.\r
+ * Trace And Error Log [Board 17] or for a Thread trace e.g. State Server\r
+ * [java.lang.Thread]\r
+ * \r
+ * @param trace\r
+ * @return\r
+ */\r
+ public abstract String getTraceClassName(ITmfTimeAnalysisEntry trace);\r
+\r
+ public String getEventName(ITimeEvent event) {\r
+ return getEventName(event, true, false);\r
+ }\r
+\r
+ /**\r
+ * Specify a Name for the event depending on its type or state e.g. blocked,\r
+ * running, etc..\r
+ * \r
+ * @param event\r
+ * @param upper\r
+ * True return String value in Upper case\r
+ * @param extInfo\r
+ * Verbose, add additional information if applicable\r
+ * @return\r
+ */\r
+ public abstract String getEventName(ITimeEvent event, boolean upper,\r
+ boolean extInfo);\r
+\r
+ public String composeTraceName(ITmfTimeAnalysisEntry trace, boolean inclState) {\r
+ String name = trace.getName();\r
+ String threadClass = getTraceClassName(trace);\r
+ if (threadClass != null && threadClass.length() > 0) {\r
+ name += " [" + threadClass + "]";\r
+ }\r
+ if (inclState) {\r
+ List<TimeEvent> list = trace.getTraceEvents();\r
+ if (null != list && list.size() > 0) {\r
+ ITimeEvent event = (ITimeEvent) list.get(list.size() - 1);\r
+ name += " (" + getEventName(event, false, true) + ")";\r
+ }\r
+ }\r
+ return name;\r
+ }\r
+\r
+ public String composeEventName(ITimeEvent event) {\r
+ String name = event.getEntry().getName();\r
+ String threadClass = getTraceClassName(event.getEntry());\r
+ if (threadClass != null && threadClass.length() > 0) {\r
+ name += " [" + threadClass + "]";\r
+ }\r
+ name += " (" + getEventName(event, false, true) + ")";\r
+ return name;\r
+ }\r
+\r
+ public abstract Map<String, String> getEventHoverToolTipInfo(\r
+ ITimeEvent event);\r
+\r
+ /**\r
+ * Provides the image icon for a given Event or Trace e.g. customize to use\r
+ * different icons according to specific event /state combination\r
+ * \r
+ * @param obj\r
+ * @return\r
+ */\r
+ public Image getItemImage(Object obj) {\r
+ /*\r
+ if (obj instanceof ITmfTimeAnalysisEntry) {\r
+ List<TimeEvent> list = ((ITmfTimeAnalysisEntry) obj).getTraceEvents();\r
+ if (null != list && list.size() > 0)\r
+ obj = list.get(list.size() - 1);\r
+ else if (((ITmfTimeAnalysisEntry) obj).getStopTime() > 0)\r
+ return getImage(IMG_THREAD_STOPPED);\r
+ else\r
+ return getImage(IMG_THREAD_RUNNING);\r
+ }\r
+ if (obj instanceof TimeEvent) {\r
+ return getImage(IMG_THREAD_RUNNING);\r
+ }\r
+ */\r
+ return null;\r
+ }\r
+\r
+ public abstract String getStateName(StateColor color);\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007, 2008, 2009, 2010 Intel Corporation, Ericsson\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alexander N. Alexeev, Intel - Add monitors statistics support\r
+ * Alvaro Sanchez-Leon - Adapted for TMF\r
+ *\r
+ * $Id: ThreadStatesView.java,v 1.7 2008/05/19 15:07:21 jkubasta Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.dialogs.TmfTimeFilterDialog;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.dialogs.TmfTimeLegend;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.TimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.ITimeDataProvider;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.TimeScaleCtrl;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.TmfTimeStatesCtrl;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.TmfTimeTipHandler;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.TraceColorScheme;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.Utils;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.ControlAdapter;\r
+import org.eclipse.swt.events.ControlEvent;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+\r
+public class TmfTimeAnalysisViewer implements ITimeAnalysisViewer, ITimeDataProvider, SelectionListener {\r
+\r
+ /** vars */\r
+ private long _minTimeInterval;\r
+ private long _selectedTime;\r
+ private long _beginTime;\r
+ private long _endTime;\r
+ private long _time0;\r
+ private long _time1;\r
+ private long _time0_;\r
+ private long _time1_;\r
+ private long _time0_extSynch = 0;\r
+ private long _time1_extSynch = 0;\r
+ private boolean _timeRangeFixed;\r
+ private int _nameWidthPref = 200;\r
+ private int _minNameWidth = 6;\r
+ private int _nameWidth;\r
+ private Composite _dataViewer;\r
+\r
+ private TmfTimeStatesCtrl _stateCtrl;\r
+ private TimeScaleCtrl _timeScaleCtrl;\r
+ private TmfTimeTipHandler _threadTip;\r
+ private TraceColorScheme _colors;\r
+ private TmfTimeAnalysisProvider _utilImplm;\r
+\r
+ private boolean _acceptSetSelAPICalls = false;\r
+ Vector<ITmfTimeSelectionListener> widgetSelectionListners = new Vector<ITmfTimeSelectionListener>();\r
+ Vector<ITmfTimeScaleSelectionListener> widgetTimeScaleSelectionListners = new Vector<ITmfTimeScaleSelectionListener>();\r
+ Vector<ITmfTimeFilterSelectionListener> widgetFilterSelectionListeners = new Vector<ITmfTimeFilterSelectionListener>();\r
+\r
+ // Calender Time format, using Epoch reference or Relative time\r
+ // format(default\r
+ private boolean calendarTimeFormat = false;\r
+ private int borderWidth = 4;\r
+ private int timeScaleHeight = 22;\r
+\r
+ /** ctor */\r
+ public TmfTimeAnalysisViewer(Composite parent, TmfTimeAnalysisProvider provider) {\r
+ createDataViewer(parent, provider);\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.linuxtools.tmf.ui.widgets.timeAnalysis.api.ITimeAnalysisWidget#display(org.eclipse.linuxtools.tmf.ui.widgets.timeAnalysis.model.TmfTaTrace[])\r
+ */\r
+ public void display(ITmfTimeAnalysisEntry[] traceArr) {\r
+ modelUpdate(traceArr);\r
+ }\r
+\r
+ public void display(ITmfTimeAnalysisEntry[] traceArr, long start, long end,\r
+ boolean updateTimeBounds) {\r
+ modelUpdate(traceArr, start, end, updateTimeBounds);\r
+ }\r
+\r
+ public void controlMoved(ControlEvent e) {\r
+ }\r
+\r
+ public void controlResized(ControlEvent e) {\r
+ resizeControls();\r
+ }\r
+\r
+ // called from the display order in the API\r
+ public void modelUpdate(ITmfTimeAnalysisEntry[] traces) {\r
+ if (null != _stateCtrl) {\r
+ loadOptions();\r
+ updateInternalData(traces);\r
+ _stateCtrl.redraw();\r
+ _timeScaleCtrl.redraw();\r
+ }\r
+ }\r
+\r
+ // called from the display order in the API\r
+ public void modelUpdate(ITmfTimeAnalysisEntry[] traces, long start,\r
+ long end, boolean updateTimeBounds) {\r
+ if (null != _stateCtrl) {\r
+ loadOptions();\r
+ updateInternalData(traces, start, end);\r
+ if (updateTimeBounds) {\r
+ _timeRangeFixed = true;\r
+ // set window to match limits\r
+ setStartFinishTime(_time0_, _time1_);\r
+ } else {\r
+ _stateCtrl.redraw();\r
+ _timeScaleCtrl.redraw();\r
+ }\r
+ }\r
+ }\r
+\r
+ public void itemUpdate(ITmfTimeAnalysisEntry parent, TimeEvent item) {\r
+ if (null != parent && null != item) {\r
+ _stateCtrl.refreshPartial(parent, item);\r
+ _stateCtrl.redraw();\r
+ _timeScaleCtrl.redraw();\r
+ }\r
+ }\r
+\r
+ public void selectionChanged() {\r
+ }\r
+\r
+ protected String getViewTypeStr() {\r
+ return "viewoption.threads";\r
+ }\r
+\r
+ int getMarginWidth(int idx) {\r
+ return 0;\r
+ }\r
+\r
+ int getMarginHeight(int idx) {\r
+ return 0;\r
+ }\r
+\r
+ void loadOptions() {\r
+ _minTimeInterval = 1;\r
+ _selectedTime = -1;\r
+ _nameWidth = Utils.loadIntOption(getPreferenceString("namewidth"),\r
+ _nameWidthPref, _minNameWidth, 1000);\r
+ }\r
+\r
+ void saveOptions() {\r
+ Utils.saveIntOption(getPreferenceString("namewidth"), _nameWidth);\r
+ }\r
+\r
+ protected Control createDataViewer(Composite parent,\r
+ TmfTimeAnalysisProvider utilImplm) {\r
+ loadOptions();\r
+ _utilImplm = utilImplm;\r
+ _colors = new TraceColorScheme();\r
+ _dataViewer = new Composite(parent, SWT.NULL);\r
+ _dataViewer.setLayoutData(GridUtil.createFill());\r
+ GridLayout gl = new GridLayout();\r
+ gl.marginHeight = borderWidth;\r
+ gl.marginWidth = 0;\r
+ gl.verticalSpacing = 0;\r
+ gl.horizontalSpacing = 0;\r
+ _dataViewer.setLayout(gl);\r
+\r
+ _timeScaleCtrl = new TimeScaleCtrl(_dataViewer, _colors);\r
+ _timeScaleCtrl.setTimeProvider(this);\r
+ _timeScaleCtrl.setLayoutData(GridUtil.createHorizontalFill());\r
+ _timeScaleCtrl.setHeight(timeScaleHeight);\r
+\r
+ _stateCtrl = new TmfTimeStatesCtrl(_dataViewer, _colors, _utilImplm);\r
+\r
+ _stateCtrl.setTimeProvider(this);\r
+ _stateCtrl.addSelectionListener(this);\r
+ _stateCtrl.setLayoutData(GridUtil.createFill());\r
+ _dataViewer.addControlListener(new ControlAdapter() {\r
+ @Override\r
+ public void controlResized(ControlEvent event) {\r
+ resizeControls();\r
+ }\r
+ });\r
+ resizeControls();\r
+ _dataViewer.update();\r
+ _threadTip = new TmfTimeTipHandler(parent.getShell(), _utilImplm, this);\r
+ _threadTip.activateHoverHelp(_stateCtrl);\r
+ return _dataViewer;\r
+ }\r
+\r
+ public void dispose() {\r
+ saveOptions();\r
+ _stateCtrl.dispose();\r
+ _dataViewer.dispose();\r
+ _colors.dispose();\r
+ }\r
+\r
+ public void resizeControls() {\r
+ Rectangle r = _dataViewer.getClientArea();\r
+ if (r.isEmpty())\r
+ return;\r
+\r
+ int width = r.width;\r
+ if (_nameWidth > width - _minNameWidth)\r
+ _nameWidth = width - _minNameWidth;\r
+ if (_nameWidth < _minNameWidth)\r
+ _nameWidth = _minNameWidth;\r
+ }\r
+\r
+ /** Tries to set most convenient time range for display. */\r
+ void setTimeRange(Object traces[]) {\r
+ _endTime = 0;\r
+ _beginTime = -1;\r
+ ITimeEvent event;\r
+ for (int i = 0; i < traces.length; i++) {\r
+ ITmfTimeAnalysisEntry entry = (ITmfTimeAnalysisEntry) traces[i];\r
+ if (entry.getStopTime() >= entry.getStartTime() && entry.getStopTime() > 0) {\r
+ if (_beginTime < 0 || entry.getStartTime() < _beginTime) {\r
+ _beginTime = entry.getStartTime();\r
+ }\r
+ if (entry.getStopTime() > _endTime) {\r
+ _endTime = entry.getStopTime();\r
+ }\r
+ }\r
+ List<TimeEvent> list = entry.getTraceEvents();\r
+ int len = list.size();\r
+ if (len > 0) {\r
+ event = (ITimeEvent) list.get(0);\r
+ if (_beginTime < 0 || event.getTime() < _beginTime) {\r
+ _beginTime = event.getTime();\r
+ }\r
+ event = (ITimeEvent) list.get(list.size() - 1);\r
+ long eventEndTime = event.getTime() + (event.getDuration() > 0 ? event.getDuration() : 0);\r
+ if (eventEndTime > _endTime) {\r
+ _endTime = eventEndTime;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (_beginTime < 0)\r
+ _beginTime = 0;\r
+ }\r
+\r
+ void setTimeBounds() {\r
+ //_time0_ = _beginTime - (long) ((_endTime - _beginTime) * 0.02);\r
+ _time0_ = _beginTime;\r
+ if (_time0_ < 0)\r
+ _time0_ = 0;\r
+ // _time1_ = _time0_ + (_endTime - _time0_) * 1.05;\r
+ _time1_ = _endTime;\r
+ // _time0_ = Math.floor(_time0_);\r
+ // _time1_ = Math.ceil(_time1_);\r
+ if (!_timeRangeFixed) {\r
+ _time0 = _time0_;\r
+ _time1 = _time1_;\r
+ }\r
+ if (_time1 - _time0 < _minTimeInterval) {\r
+ _time1 = _time0 + _minTimeInterval;\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @param traces\r
+ */\r
+ void updateInternalData(ITmfTimeAnalysisEntry[] traces) {\r
+ if (null == traces)\r
+ traces = new ITmfTimeAnalysisEntry[0];\r
+ setTimeRange(traces);\r
+ refreshAllData(traces);\r
+ }\r
+\r
+ /**\r
+ * @param traces\r
+ * @param start\r
+ * @param end\r
+ */\r
+ void updateInternalData(ITmfTimeAnalysisEntry[] traces, long start, long end) {\r
+ if (null == traces)\r
+ traces = new ITmfTimeAnalysisEntry[0];\r
+ if ((start == 0 && end == 0) || start < 0 || end < 0) {\r
+ // Start and end time are unspecified and need to be determined from\r
+ // individual processes\r
+ setTimeRange(traces);\r
+ } else {\r
+ _beginTime = start;\r
+ _endTime = end;\r
+ }\r
+\r
+ refreshAllData(traces);\r
+ }\r
+\r
+ /**\r
+ * @param traces\r
+ */\r
+ private void refreshAllData(ITmfTimeAnalysisEntry[] traces) {\r
+ setTimeBounds();\r
+ if (_selectedTime < _beginTime) {\r
+ _selectedTime = _beginTime;\r
+ } else if (_selectedTime > _endTime) {\r
+ _selectedTime = _endTime;\r
+ }\r
+ _stateCtrl.refreshData(traces);\r
+ filterOutNotification();\r
+ }\r
+\r
+ public void setFocus() {\r
+ if (null != _stateCtrl)\r
+ _stateCtrl.setFocus();\r
+ }\r
+\r
+ public boolean isInFocus() {\r
+ return _stateCtrl.isInFocus();\r
+ }\r
+\r
+ public ITmfTimeAnalysisEntry getSelectedTrace() {\r
+ return _stateCtrl.getSelectedTrace();\r
+ }\r
+\r
+ public ISelection getSelection() {\r
+ return _stateCtrl.getSelection();\r
+ }\r
+\r
+ public ISelection getSelectionTrace() {\r
+ return _stateCtrl.getSelectionTrace();\r
+ }\r
+\r
+ public long getTime0() {\r
+ return _time0;\r
+ }\r
+\r
+ public long getTime1() {\r
+ return _time1;\r
+ }\r
+\r
+ public long getMinTimeInterval() {\r
+ return _minTimeInterval;\r
+ }\r
+\r
+ public int getNameSpace() {\r
+ return _nameWidth;\r
+ }\r
+\r
+ public void setNameSpace(int width) {\r
+ _nameWidth = width;\r
+ width = _stateCtrl.getClientArea().width;\r
+ if (_nameWidth > width - 6)\r
+ _nameWidth = width - 6;\r
+ if (_nameWidth < 6)\r
+ _nameWidth = 6;\r
+ _stateCtrl.adjustScrolls();\r
+ _stateCtrl.redraw();\r
+ _timeScaleCtrl.redraw();\r
+ }\r
+\r
+ public int getTimeSpace() {\r
+ int w = _stateCtrl.getClientArea().width;\r
+ return w - _nameWidth;\r
+ }\r
+\r
+ public long getSelectedTime() {\r
+ return _selectedTime;\r
+ }\r
+\r
+ public long getBeginTime() {\r
+ return _beginTime;\r
+ }\r
+\r
+ public long getEndTime() {\r
+ return _endTime;\r
+ }\r
+\r
+ public long getMaxTime() {\r
+ return _time1_;\r
+ }\r
+\r
+ public long getMinTime() {\r
+ return _time0_;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.ITimeDataProvider\r
+ * #setStartFinishTimeNotify(long, long)\r
+ */\r
+ public void setStartFinishTimeNotify(long time0, long time1) {\r
+ setStartFinishTime(time0, time1);\r
+ notifyStartFinishTimeSelectionListeners(time0, time1);\r
+ }\r
+\r
+\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.ITimeDataProvider#notifyStartFinishTime()\r
+ */\r
+ public void notifyStartFinishTime() {\r
+ notifyStartFinishTimeSelectionListeners(_time0, _time1);\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.ITimeDataProvider\r
+ * #setStartFinishTime(long, long)\r
+ */\r
+ public void setStartFinishTime(long time0, long time1) {\r
+ _time0 = time0;\r
+ if (_time0 < _time0_)\r
+ _time0 = _time0_;\r
+ if (_time0 > _time1_)\r
+ _time0 = _time1_;\r
+ _time1 = time1;\r
+ if (_time1 < _time0_)\r
+ _time1 = _time0_;\r
+ if (_time1 > _time1_)\r
+ _time1 = _time1_;\r
+ if (_time1 - _time0 < _minTimeInterval)\r
+ _time1 = _time0 + _minTimeInterval;\r
+ _timeRangeFixed = true;\r
+ _stateCtrl.adjustScrolls();\r
+ _stateCtrl.redraw();\r
+ _timeScaleCtrl.redraw();\r
+ }\r
+\r
+ public void resetStartFinishTime() {\r
+ setStartFinishTimeNotify(_time0_, _time1_);\r
+ _timeRangeFixed = false;\r
+ }\r
+\r
+ public void setSelectedTimeInt(long time, boolean ensureVisible) {\r
+ // Trace.debug("currentTime:" + _selectedTime + " new time:" + time);\r
+ _selectedTime = time;\r
+ if (_selectedTime > _endTime)\r
+ _selectedTime = _endTime;\r
+ if (_selectedTime < _beginTime)\r
+ _selectedTime = _beginTime;\r
+ if (ensureVisible) {\r
+ double timeSpace = (_time1 - _time0) * .02;\r
+ double timeMid = (_time1 - _time0) * .1;\r
+ if (_selectedTime < _time0 + timeSpace) {\r
+ double dt = _time0 - _selectedTime + timeMid;\r
+ _time0 -= dt;\r
+ _time1 -= dt;\r
+ } else if (_selectedTime > _time1 - timeSpace) {\r
+ double dt = _selectedTime - _time1 + timeMid;\r
+ _time0 += dt;\r
+ _time1 += dt;\r
+ }\r
+ if (_time0 < _time0_) {\r
+ _time1 += _time0_ - _time0;\r
+ _time0 = _time0_;\r
+ } else if (_time1 > _time1_) {\r
+ _time0 -= _time1 - _time1_;\r
+ _time1 = _time1_;\r
+ }\r
+ }\r
+ _stateCtrl.adjustScrolls();\r
+ _stateCtrl.redraw();\r
+ _timeScaleCtrl.redraw();\r
+ }\r
+\r
+ public void widgetDefaultSelected(SelectionEvent e) {\r
+ // TODO: Opening call stack shall be replaced to a configurable view\r
+ // new OpenCallStackViewAction().openView(false);\r
+ // Replaced by event notification\r
+ // updateModelSelection();\r
+ notifySelectionListeners(TmfTimeSelectionEvent.type.WIDGET_DEF_SEL);\r
+ }\r
+\r
+ public void widgetSelected(SelectionEvent e) {\r
+ // Replace by event notification\r
+ // updateModelSelection();\r
+ notifySelectionListeners(TmfTimeSelectionEvent.type.WIDGET_SEL);\r
+ }\r
+\r
+ public void selectNextEvent() {\r
+ _stateCtrl.selectNextEvent();\r
+ }\r
+\r
+ public void selectPrevEvent() {\r
+ _stateCtrl.selectPrevEvent();\r
+ }\r
+\r
+ public void selectNextTrace() {\r
+ _stateCtrl.selectNextTrace();\r
+ }\r
+\r
+ public void selectPrevTrace() {\r
+ _stateCtrl.selectPrevTrace();\r
+ }\r
+\r
+ public void groupTraces(boolean on) {\r
+ _stateCtrl.groupTraces(on);\r
+ }\r
+\r
+ public void filterTraces() {\r
+ if (_dataViewer == null || _dataViewer.isDisposed())\r
+ return;\r
+\r
+ if (TmfTimeFilterDialog.getTraceFilter(_dataViewer.getShell(), _stateCtrl\r
+ .getTraces(), _stateCtrl.getTraceFilter())) {\r
+ _stateCtrl.refreshData();\r
+ filterOutNotification();\r
+ }\r
+ }\r
+\r
+ public void showLegend() {\r
+ if (_dataViewer == null || _dataViewer.isDisposed())\r
+ return;\r
+\r
+ TmfTimeLegend.open(_dataViewer.getShell(), _utilImplm);\r
+ }\r
+\r
+ public void toggleThreadsInteractionDrawing() {\r
+ _stateCtrl.toggleTraceInteractionDrawing();\r
+ }\r
+\r
+ public void setThreadJoinDrawing(boolean on) {\r
+ _stateCtrl.setTraceJoinDrawing(on);\r
+ }\r
+\r
+ public void setThreadWaitDrawing(boolean on) {\r
+ _stateCtrl.setTraceWaitDrawing(on);\r
+ }\r
+\r
+ public void setThreadReleaseDrawing(boolean on) {\r
+ _stateCtrl.setTraceReleaseDrawing(on);\r
+ }\r
+\r
+ public boolean getThreadInteractionDrawing() {\r
+ return _stateCtrl.getTracesInteractionDrawing();\r
+ }\r
+\r
+ public boolean getThreadJoinDrawing() {\r
+ return _stateCtrl.getTraceJoinDrawing();\r
+ }\r
+\r
+ public boolean getThreadWaitDrawing() {\r
+ return _stateCtrl.getTraceWaitDrawing();\r
+ }\r
+\r
+ public boolean getThreadReleaseDrawing() {\r
+ return _stateCtrl.getTraceReleaseDrawing();\r
+ }\r
+\r
+ protected void select(Object obj) {\r
+ if (obj == null)\r
+ return;\r
+ // TODO: ThreadDetails Adaption removed, might need replacement\r
+ // if (obj instanceof ThreadDetails) {\r
+ // obj = ((ThreadDetails) obj).getThread();\r
+ // }\r
+ if (obj instanceof ITmfTimeAnalysisEntry) {\r
+ // _stateCtrl.selectThread((TsfTmTrace) obj);\r
+ }\r
+ }\r
+\r
+ public void zoomIn() {\r
+ _stateCtrl.zoomIn();\r
+ }\r
+\r
+ public void zoomOut() {\r
+ _stateCtrl.zoomOut();\r
+ }\r
+\r
+ private String getPreferenceString(String string) {\r
+ return getViewTypeStr() + "." + string;\r
+ }\r
+\r
+ public void addWidgetSelectionListner(ITmfTimeSelectionListener listener) {\r
+ widgetSelectionListners.add(listener);\r
+ }\r
+\r
+ public void removeWidgetSelectionListner(ITmfTimeSelectionListener listener) {\r
+ widgetSelectionListners.removeElement(listener);\r
+ }\r
+\r
+ public void addWidgetTimeScaleSelectionListner(\r
+ ITmfTimeScaleSelectionListener listener) {\r
+ widgetTimeScaleSelectionListners.add(listener);\r
+ }\r
+\r
+ public void removeWidgetTimeScaleSelectionListner(\r
+ ITmfTimeScaleSelectionListener listener) {\r
+ widgetTimeScaleSelectionListners.removeElement(listener);\r
+ }\r
+\r
+ public void setSelectedTime(long time, boolean ensureVisible, Object source) {\r
+ if (_acceptSetSelAPICalls == false || this == source) {\r
+ return;\r
+ }\r
+\r
+ setSelectedTimeInt(time, ensureVisible);\r
+ }\r
+\r
+ public void setSelectedEvent(ITimeEvent event, Object source) {\r
+ if (_acceptSetSelAPICalls == false || event == null || source == this) {\r
+ return;\r
+ }\r
+ ITmfTimeAnalysisEntry trace = event.getEntry();\r
+ if (trace != null) {\r
+ _stateCtrl.selectItem(trace, false);\r
+ }\r
+\r
+ setSelectedTimeInt(event.getTime(), true);\r
+ }\r
+\r
+ public void setSelectedTraceTime(ITmfTimeAnalysisEntry trace, long time, Object source) {\r
+ if (_acceptSetSelAPICalls == false || trace == null || source == this) {\r
+ return;\r
+ }\r
+\r
+ if (trace != null) {\r
+ _stateCtrl.selectItem(trace, false);\r
+ }\r
+\r
+ setSelectedTimeInt(time, true);\r
+ }\r
+\r
+ public void setSelectedTrace(ITmfTimeAnalysisEntry trace) {\r
+ if (trace == null) {\r
+ return;\r
+ }\r
+\r
+ _stateCtrl.selectItem(trace, false);\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer\r
+ * #setSelectVisTimeWindow(long, long, java.lang.Object)\r
+ */\r
+ public void setSelectVisTimeWindow(long time0, long time1, Object source) {\r
+ if (_acceptSetSelAPICalls == false || source == this) {\r
+ return;\r
+ }\r
+\r
+ setStartFinishTime(time0, time1);\r
+\r
+ // update notification time values since we are now in synch with the\r
+ // external application\r
+ updateExtSynchTimers();\r
+ }\r
+\r
+ public void setAcceptSelectionAPIcalls(boolean acceptCalls) {\r
+ _acceptSetSelAPICalls = acceptCalls;\r
+ }\r
+\r
+ private synchronized void notifySelectionListeners(\r
+ TmfTimeSelectionEvent.type rtype) {\r
+ // Any listeners out there ?\r
+ if (widgetSelectionListners.size() > 0) {\r
+ // Locate the event selected\r
+ ISelection selection = getSelection();\r
+ Object sel = null;\r
+ if (selection != null && !selection.isEmpty()) {\r
+ sel = ((IStructuredSelection) selection).getFirstElement();\r
+ }\r
+\r
+ if (sel != null) {\r
+ // Notify Selection Listeners\r
+ TmfTimeSelectionEvent event = new TmfTimeSelectionEvent(this,\r
+ rtype, sel, getSelectedTime());\r
+\r
+ for (Iterator<ITmfTimeSelectionListener> iter = widgetSelectionListners\r
+ .iterator(); iter.hasNext();) {\r
+ ITmfTimeSelectionListener listener = (ITmfTimeSelectionListener) iter\r
+ .next();\r
+ listener.tsfTmProcessSelEvent(event);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ public void notifyStartFinishTimeSelectionListeners(long _time0, long _time1) {\r
+ if (widgetTimeScaleSelectionListners.size() > 0) {\r
+ // Check if the time has actually changed from last notification\r
+ if (_time0 != _time0_extSynch || _time1 != _time1_extSynch) {\r
+ // Notify Time Scale Selection Listeners\r
+ TmfTimeScaleSelectionEvent event = new TmfTimeScaleSelectionEvent(\r
+ this, _time0, _time1, getTimeSpace(), getSelectedTime());\r
+\r
+ for (Iterator<ITmfTimeScaleSelectionListener> iter = widgetTimeScaleSelectionListners\r
+ .iterator(); iter.hasNext();) {\r
+ ITmfTimeScaleSelectionListener listener = (ITmfTimeScaleSelectionListener) iter\r
+ .next();\r
+ listener.tsfTmProcessTimeScaleEvent(event);\r
+ }\r
+\r
+ // update external synch timers\r
+ updateExtSynchTimers();\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * update the cache timers used to identify the need to send a time window\r
+ * update to external registered listeners\r
+ */\r
+ private void updateExtSynchTimers() {\r
+ // last time notification cache\r
+ _time0_extSynch = _time0;\r
+ _time1_extSynch = _time1;\r
+ }\r
+\r
+ public void setTimeCalendarFormat(boolean toAbsoluteCaltime) {\r
+ calendarTimeFormat = toAbsoluteCaltime;\r
+ }\r
+\r
+ public boolean isCalendarFormat() {\r
+ return calendarTimeFormat;\r
+ }\r
+\r
+ public int getBorderWidth() {\r
+ return borderWidth;\r
+ }\r
+\r
+ public void setBorderWidth(int borderWidth) {\r
+ if (borderWidth > -1) {\r
+ this.borderWidth = borderWidth;\r
+ GridLayout gl = (GridLayout)_dataViewer.getLayout();\r
+ gl.marginHeight = borderWidth;\r
+ }\r
+ }\r
+\r
+ public int getHeaderHeight() {\r
+ return timeScaleHeight;\r
+ }\r
+\r
+ public void setHeaderHeight(int headerHeight) {\r
+ if (headerHeight > -1) {\r
+ this.timeScaleHeight = headerHeight;\r
+ _timeScaleCtrl.setHeight(headerHeight);\r
+ }\r
+ }\r
+\r
+ public int getItemHeight() {\r
+ if (_stateCtrl != null) {\r
+ return _stateCtrl.getItemHeight();\r
+ }\r
+ return 0;\r
+ }\r
+\r
+ public void setItemHeight(int rowHeight) {\r
+ if (_stateCtrl != null) {\r
+ _stateCtrl.setItemHeight(rowHeight);\r
+ }\r
+ }\r
+\r
+ public boolean isVisibleVerticalScroll() {\r
+ if (_stateCtrl != null) {\r
+ _stateCtrl.isVisibleVerticalScroll();\r
+ }\r
+ return false;\r
+ }\r
+\r
+ public void setVisibleVerticalScroll(boolean visibleVerticalScroll) {\r
+ if (_stateCtrl != null) {\r
+ _stateCtrl.setVisibleVerticalScroll(visibleVerticalScroll);\r
+ }\r
+ }\r
+\r
+ public void setNameWidthPref(int width) {\r
+ _nameWidthPref = width;\r
+ if (width == 0) {\r
+ _minNameWidth = 0;\r
+ }\r
+ }\r
+\r
+ public int getNameWidthPref(int width) {\r
+ return _nameWidthPref;\r
+ }\r
+\r
+ public void addFilterSelectionListner(ITmfTimeFilterSelectionListener listener) {\r
+ widgetFilterSelectionListeners.add(listener);\r
+ }\r
+\r
+ public void removeFilterSelectionListner(\r
+ ITmfTimeFilterSelectionListener listener) {\r
+ widgetFilterSelectionListeners.remove(listener);\r
+ }\r
+\r
+ private void filterOutNotification() {\r
+ TmfTimeFilterSelectionEvent event = new TmfTimeFilterSelectionEvent(this);\r
+ event.setFilteredOut(_stateCtrl.getFilteredOut());\r
+ for (ITmfTimeFilterSelectionListener listener : widgetFilterSelectionListeners) {\r
+ listener.tmfTaProcessFilterSelection(event);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * needed in case there's a need to associate a context menu\r
+ * \r
+ * @return\r
+ */\r
+ public Control getControl() {\r
+ return _stateCtrl;\r
+ }\r
+\r
+ /**\r
+ * Get the selection provider\r
+ * \r
+ * @return\r
+ */\r
+ public ISelectionProvider getSelectionProvider() {\r
+ return _stateCtrl;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ * \r
+ * @see\r
+ * org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer\r
+ * #waitCursor(boolean)\r
+ */\r
+ public void waitCursor(boolean waitInd) {\r
+ _stateCtrl.waitCursor(waitInd);\r
+ }\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.EventObject;\r
+import java.util.Vector;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+\r
+public class TmfTimeFilterSelectionEvent extends EventObject {\r
+ /**\r
+ * \r
+ */\r
+ private static final long serialVersionUID = -150960748016449093L;\r
+\r
+ Vector<ITmfTimeAnalysisEntry> filteredOut = null;\r
+\r
+ public TmfTimeFilterSelectionEvent(Object source) {\r
+ super(source);\r
+ }\r
+\r
+ public Vector<ITmfTimeAnalysisEntry> getFilteredOut() {\r
+ return filteredOut;\r
+ }\r
+\r
+ public void setFilteredOut(Vector<ITmfTimeAnalysisEntry> rfilteredOut) {\r
+ this.filteredOut = rfilteredOut;\r
+ }\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.EventObject;\r
+\r
+public class TmfTimeScaleSelectionEvent extends EventObject {\r
+\r
+ /**\r
+ * \r
+ */\r
+ private static final long serialVersionUID = -4177428788761351379L;\r
+\r
+ \r
+ long time0 = 0;\r
+ long time1 = 0;\r
+ long selectedTime = 0;\r
+ int width = 0;\r
+\r
+ /**\r
+ * \r
+ * @param arg0\r
+ * source of event\r
+ * @param time0\r
+ * time0 the start time\r
+ * @param time1\r
+ * @param width\r
+ * pixels used to draw the width of the time space\r
+ * @param selTime\r
+ * carries the selected time if available otherwise is 0\r
+ */\r
+ public TmfTimeScaleSelectionEvent(Object arg0, long time0, long time1,\r
+ int width, long selTime) {\r
+ super(arg0);\r
+ this.time0 = time0;\r
+ this.time1 = time1;\r
+ this.width = width;\r
+ this.selectedTime = selTime;\r
+ }\r
+ \r
+ /**\r
+ * @return\r
+ */\r
+ public long getTime0() {\r
+ return time0;\r
+ }\r
+ \r
+ /**\r
+ * @return\r
+ */\r
+ public long getTime1() {\r
+ return time1;\r
+ }\r
+\r
+ /**\r
+ * @return\r
+ */\r
+ public int getWidth() {\r
+ return width;\r
+ }\r
+\r
+ /**\r
+ * @return\r
+ */\r
+ public long getSelectedTime() {\r
+ return selectedTime;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis;\r
+\r
+import java.util.EventObject;\r
+\r
+public class TmfTimeSelectionEvent extends EventObject {\r
+\r
+ /**\r
+ * \r
+ */\r
+ private static final long serialVersionUID = 1L;\r
+ \r
+ public enum type {WIDGET_DEF_SEL, WIDGET_SEL}\r
+ type dType;\r
+ Object selection = null;\r
+ long selTime = 0;\r
+ int index = 0;\r
+ \r
+ public TmfTimeSelectionEvent(Object arg0, type rType, Object sel, long selectedTime) {\r
+ super(arg0);\r
+ dType = rType;\r
+ selection = sel;\r
+ selTime = selectedTime;\r
+ }\r
+ \r
+ public type getDType() {\r
+ return dType;\r
+ }\r
+ \r
+ public Object getSelection() {\r
+ return selection;\r
+ }\r
+ \r
+ public long getSelectedTime() {\r
+ return selTime;\r
+ }\r
+\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2008 Intel Corporation.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ *\r
+ * $Id: ThreadFilterDialog.java,v 1.2 2008/03/05 17:31:07 ewchan Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.dialogs;\r
+\r
+import org.eclipse.jface.dialogs.TitleAreaDialog;\r
+import org.eclipse.jface.viewers.CheckStateChangedEvent;\r
+import org.eclipse.jface.viewers.CheckboxTableViewer;\r
+import org.eclipse.jface.viewers.ICheckStateListener;\r
+import org.eclipse.jface.viewers.IStructuredContentProvider;\r
+import org.eclipse.jface.viewers.ITableLabelProvider;\r
+import org.eclipse.jface.viewers.LabelProvider;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.jface.viewers.ViewerComparator;\r
+import org.eclipse.jface.window.Window;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.Messages;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.swt.widgets.Table;\r
+import org.eclipse.swt.widgets.TableColumn;\r
+\r
+public class TmfTimeFilterDialog extends TitleAreaDialog {\r
+ private CheckboxTableViewer viewer;\r
+ private Object[] threads;\r
+ private boolean[] filter;\r
+ private ViewContentProvider viewContentProvider;\r
+ private TraceComparator viewTraceComparator;\r
+ private ViewLabelProvider viewViewLabelProvider;\r
+\r
+ public TmfTimeFilterDialog(Shell parentShell, Object[] threads,\r
+ boolean[] filter) {\r
+ super(parentShell);\r
+\r
+ this.threads = threads;\r
+ if (filter != null)\r
+ this.filter = (boolean[]) filter.clone();\r
+ \r
+ viewContentProvider = new ViewContentProvider();\r
+ viewTraceComparator = new TraceComparator();\r
+ viewViewLabelProvider = new ViewLabelProvider();\r
+ }\r
+\r
+ public static boolean getTraceFilter(Shell parentShell, Object[] threads,\r
+ boolean[] filter) {\r
+ TmfTimeFilterDialog dlg = new TmfTimeFilterDialog(parentShell, threads,\r
+ filter);\r
+ if (dlg.open() != Window.OK)\r
+ return false;\r
+\r
+ boolean f[] = dlg.getFilter();\r
+ if (java.util.Arrays.equals(f, filter))\r
+ return false;\r
+ for (int i = f.length - 1; i >= 0; i--)\r
+ filter[i] = f[i];\r
+\r
+ return true;\r
+ }\r
+\r
+ @Override\r
+ protected Control createDialogArea(Composite parent) {\r
+ Composite composite = (Composite) super.createDialogArea(parent);\r
+\r
+ viewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER\r
+ | SWT.V_SCROLL);\r
+\r
+ Table table = viewer.getTable();\r
+ table.setLayoutData(new GridData(GridData.FILL_BOTH));\r
+ table.setBackground(parent.getBackground());\r
+ createColumns(table);\r
+\r
+ //Assign providers to the viewer.\r
+ viewer.setContentProvider(viewContentProvider);\r
+ viewer.setComparator(viewTraceComparator);\r
+ viewer.setLabelProvider(viewViewLabelProvider);\r
+ \r
+ viewer.setInput(new Object());\r
+\r
+ viewer.addCheckStateListener(new ICheckStateListener() {\r
+ public void checkStateChanged(CheckStateChangedEvent event) {\r
+ Object o = event.getElement();\r
+ for (int i = threads.length - 1; i >= 0; i--) {\r
+ if (threads[i].equals(o))\r
+ filter[i] = event.getChecked();\r
+ }\r
+ }\r
+ });\r
+\r
+ if (filter != null) {\r
+ for (int i = 0; i < filter.length; i++)\r
+ viewer.setChecked(threads[i], filter[i]);\r
+ }\r
+\r
+ setMessage(Messages._TRACE_FILTER_DESC);\r
+ setTitle(Messages._TRACE_FILTER);\r
+ setDialogHelpAvailable(false);\r
+ setHelpAvailable(false);\r
+\r
+// setTitleImage(org.eclipse.hyades.trace.internal.ui.PDPluginImages.DESC_IMG_UI_WZ_EDITPROFSET\r
+// .createImage());\r
+\r
+ return composite;\r
+ }\r
+\r
+ private void createColumns(Table table) {\r
+ table.setHeaderVisible(true);\r
+\r
+ String headers[] = { "", Messages._TRACE_ID, Messages._TRACE_NAME };\r
+ int width[] = { 20, 80, 400 };\r
+\r
+ for (int i = 0; i < headers.length; i++) {\r
+ TableColumn tc = new TableColumn(table, SWT.NONE, i);\r
+ tc.setResizable(true);\r
+ tc.setText(headers[i]);\r
+ tc.setWidth(width[i]);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void configureShell(Shell shell) {\r
+ super.configureShell(shell);\r
+ shell.setText(Messages._EDIT_PROFILING_OPTIONS);\r
+ }\r
+\r
+ public boolean[] getFilter() {\r
+ return filter;\r
+ }\r
+\r
+ /**\r
+ * @param viewContentProvider\r
+ */\r
+ public void setViewContentProvider(ViewContentProvider viewContentProvider) {\r
+ this.viewContentProvider = viewContentProvider;\r
+ }\r
+\r
+ /**\r
+ * @param viewThreadComparator\r
+ */\r
+ public void setViewThreadComparator(TraceComparator viewThreadComparator) {\r
+ this.viewTraceComparator = viewThreadComparator;\r
+ }\r
+\r
+ /**\r
+ * @param viewViewLabelProvider\r
+ */\r
+ public void setViewViewLabelProvider(ViewLabelProvider viewViewLabelProvider) {\r
+ this.viewViewLabelProvider = viewViewLabelProvider;\r
+ }\r
+ \r
+ class ViewContentProvider implements IStructuredContentProvider {\r
+ public void dispose() {\r
+ }\r
+\r
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+ }\r
+\r
+ public Object[] getElements(Object input) {\r
+ return threads;\r
+ }\r
+ }\r
+\r
+ class ViewLabelProvider extends LabelProvider implements\r
+ ITableLabelProvider {\r
+ @Override\r
+ public Image getImage(Object obj) {\r
+ return null;\r
+ }\r
+\r
+ public Image getColumnImage(Object element, int columnIndex) {\r
+ return null;\r
+ }\r
+\r
+ public String getColumnText(Object element, int columnIndex) {\r
+ // TODO: AA: Provide Label Provider externally\r
+ ITmfTimeAnalysisEntry t = (ITmfTimeAnalysisEntry) element;\r
+\r
+ if (columnIndex == 1)\r
+ return String.valueOf(t.getId());\r
+ else if (columnIndex == 2)\r
+ return t.getName();\r
+ else\r
+ return "";\r
+ }\r
+ }\r
+\r
+ class TraceComparator extends ViewerComparator {\r
+ @Override\r
+ public int compare(Viewer viewer, Object e1, Object e2) {\r
+ // TODO: AA: Provide comparator externally\r
+ int id1 = ((ITmfTimeAnalysisEntry) e1).getId();\r
+ int id2 = ((ITmfTimeAnalysisEntry) e2).getId();\r
+\r
+ if (id1 == id2)\r
+ return 0;\r
+\r
+ return (id1 < id2) ? -1 : 1;\r
+ // return 0;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.dialogs;\r
+\r
+import org.eclipse.jface.dialogs.IDialogConstants;\r
+import org.eclipse.jface.dialogs.TitleAreaDialog;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.Messages;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider.StateColor;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.TraceColorScheme;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Canvas;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Group;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.swt.widgets.Shell;\r
+\r
+\r
+public class TmfTimeLegend extends TitleAreaDialog {\r
+\r
+ // public static final String stateNames[] = {\r
+ // UIMessages._Unknown, // "Unknown",\r
+ // UIMessages._Running, // "Running",\r
+ // UIMessages._Sleeping, // "Sleeping",\r
+ // UIMessages._Waiting, // "Waiting",\r
+ // UIMessages._Blocked, // "Blocked",\r
+ // UIMessages._Deadlocked, // "Deadlock",\r
+ // UIMessages._Stopped, // "Stopped",\r
+ // };\r
+\r
+ // public static final String interactionNames[] = {\r
+ // UIMessages._START_THREAD,\r
+ // UIMessages._JOIN_TERMINATE,\r
+ // UIMessages._WAIT_NOTIFY,\r
+ // UIMessages._INTERRUPT,\r
+ // UIMessages._RELEASE_ACQUIRE\r
+ // };\r
+\r
+ public static final int interactionColors[] = {\r
+ TraceColorScheme.TI_START_THREAD,\r
+ TraceColorScheme.TI_NOTIFY_JOINED, TraceColorScheme.TI_NOTIFY,\r
+ TraceColorScheme.TI_INTERRUPT, TraceColorScheme.TI_HANDOFF_LOCK };\r
+\r
+ protected TraceColorScheme colors;\r
+ private TmfTimeAnalysisProvider ifUtil;\r
+\r
+ public static void open(Shell parent, TmfTimeAnalysisProvider rifUtil) {\r
+ (new TmfTimeLegend(parent, rifUtil)).open();\r
+ }\r
+\r
+ public TmfTimeLegend(Shell parent, TmfTimeAnalysisProvider rifUtil) {\r
+ super(parent);\r
+ colors = new TraceColorScheme();\r
+ this.ifUtil = rifUtil;\r
+ }\r
+\r
+ @Override\r
+ protected Control createDialogArea(Composite parent) {\r
+ Composite dlgArea = (Composite) super.createDialogArea(parent);\r
+ Composite composite = new Composite(dlgArea, SWT.NONE);\r
+\r
+ GridLayout layout = new GridLayout();\r
+ layout.numColumns = 2;\r
+ composite.setLayout(layout);\r
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);\r
+ composite.setLayoutData(gd);\r
+\r
+ createThreadStatesGroup(composite);\r
+ // createThreadInteractionsGroup(composite);\r
+\r
+ setMessage(Messages._LEGEND);\r
+ setTitle(Messages.TRACE_STATES_TITLE);\r
+ setDialogHelpAvailable(false);\r
+ setHelpAvailable(false);\r
+\r
+ // setTitleImage(org.eclipse.hyades.trace.internal.ui.PDPluginImages.DESC_IMG_UI_WZ_EDITPROFSET.createImage());\r
+\r
+ return composite;\r
+ }\r
+\r
+ private void createThreadStatesGroup(Composite composite) {\r
+ Group gs = new Group(composite, SWT.NONE);\r
+ gs.setText(Messages._TRACE_STATES);\r
+ GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);\r
+ gs.setLayoutData(gd);\r
+\r
+ GridLayout layout = new GridLayout();\r
+ layout.numColumns = 2;\r
+ layout.marginWidth = 20;\r
+ layout.marginBottom = 10;\r
+ gs.setLayout(layout);\r
+\r
+ for (int i = 0; i < 7; i++) {\r
+ Bar bar = new Bar(gs, i);\r
+ gd = new GridData();\r
+ gd.widthHint = 40;\r
+ gd.heightHint = 20;\r
+ gd.verticalIndent = 8;\r
+ bar.setLayoutData(gd);\r
+\r
+ Label name = new Label(gs, SWT.NONE);\r
+ //Get the color enum related to the index\r
+ StateColor stateColor = TraceColorScheme.getStateColors()[i];\r
+ //Get the given name, provided by the interface to the application\r
+ name.setText(ifUtil.getStateName(stateColor));\r
+ gd = new GridData();\r
+ gd.horizontalIndent = 10;\r
+ gd.verticalIndent = 8;\r
+ name.setLayoutData(gd);\r
+ }\r
+ }\r
+\r
+ // private void createThreadInteractionsGroup(Composite composite) {\r
+ // Group g = new Group (composite, SWT.NONE);\r
+ // g.setText(UIMessages._THREAD_INTERACTIONS);\r
+ // GridData gd = new GridData (SWT.FILL, SWT.FILL, true, true);\r
+ // g.setLayoutData(gd);\r
+ //\r
+ // GridLayout layout = new GridLayout();\r
+ // layout.numColumns = 2;\r
+ // layout.marginWidth = 20;\r
+ // layout.marginBottom = 10;\r
+ // g.setLayout(layout);\r
+ // \r
+ // for (int i=0; i<5; i++) {\r
+ // Arrow a = new Arrow(g, interactionColors[i]);\r
+ // gd = new GridData();\r
+ // gd.widthHint = 10;\r
+ // gd.heightHint = 20;\r
+ // gd.verticalIndent = 8;\r
+ // a.setLayoutData(gd);\r
+ // \r
+ // Label name = new Label (g, SWT.NONE);\r
+ // name.setText(interactionNames[i]);\r
+ // gd = new GridData ();\r
+ // gd.horizontalIndent = 4;\r
+ // gd.verticalIndent = 8;\r
+ // name.setLayoutData(gd);\r
+ // }\r
+ //\r
+ // Mark m = new Mark(g, TraceColorScheme.TI_WAIT_EXCEEDED);\r
+ // gd = new GridData();\r
+ // gd.widthHint = 10;\r
+ // gd.heightHint = 20;\r
+ // gd.verticalIndent = 8;\r
+ // m.setLayoutData(gd);\r
+ // \r
+ // Label name = new Label (g, SWT.NONE);\r
+ // name.setText(UIMessages._WAIT_TIMEOUT_EXCEED);\r
+ // gd = new GridData ();\r
+ // gd.horizontalIndent = 4;\r
+ // gd.verticalIndent = 8;\r
+ // name.setLayoutData(gd);\r
+ // }\r
+\r
+ @Override\r
+ protected void configureShell(Shell shell) {\r
+ super.configureShell(shell);\r
+ shell.setText(Messages._WINDOW_TITLE);\r
+ }\r
+\r
+ @Override\r
+ protected void createButtonsForButtonBar(Composite parent) {\r
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,\r
+ true);\r
+ }\r
+\r
+ class Bar extends Canvas {\r
+ private int colorIdx;\r
+ private Color color;\r
+\r
+ public Bar(Composite parent, int colorIdx) {\r
+ super(parent, SWT.NONE);\r
+\r
+ this.colorIdx = colorIdx;\r
+ color = colors.getColor(colorIdx);\r
+ addListener(SWT.Paint, new Listener() {\r
+ public void handleEvent(Event event) {\r
+ draw(event.gc);\r
+ }\r
+ });\r
+ }\r
+\r
+ private void draw(GC gc) {\r
+ Rectangle r = getClientArea();\r
+ gc.setBackground(color);\r
+ gc.fillRectangle(r);\r
+\r
+ int my = r.height / 2;\r
+\r
+ if (TraceColorScheme.GOLD_STATE == colorIdx\r
+ || TraceColorScheme.ORANGE_STATE == colorIdx) {\r
+ int s = gc.getLineStyle();\r
+ int w = gc.getLineWidth();\r
+ gc.setLineStyle(SWT.LINE_DOT);\r
+ gc.setLineWidth(2);\r
+ gc.drawLine(0, my, r.width - 1, my);\r
+ gc.setLineStyle(s);\r
+ gc.setLineWidth(w);\r
+ } else if (TraceColorScheme.RED_STATE == colorIdx\r
+ || TraceColorScheme.GRAY_STATE == colorIdx) {\r
+ int w = gc.getLineWidth();\r
+ gc.setLineWidth(2);\r
+ gc.drawLine(0, my, r.width - 1, my);\r
+ gc.setLineWidth(w);\r
+ }\r
+\r
+ gc.setForeground(colors.getColor(TraceColorScheme.BLACK));\r
+ gc.drawRectangle(0, 0, r.width - 1, r.height - 1);\r
+ }\r
+ }\r
+\r
+ class Arrow extends Canvas {\r
+ public final static int HEIGHT = 12;\r
+ public final static int DX = 3;\r
+\r
+ private Color color;\r
+\r
+ public Arrow(Composite parent, int colorIdx) {\r
+ super(parent, SWT.NONE);\r
+\r
+ color = colors.getColor(colorIdx);\r
+ addListener(SWT.Paint, new Listener() {\r
+ public void handleEvent(Event event) {\r
+ draw(event.gc);\r
+ }\r
+ });\r
+ }\r
+\r
+ private void draw(GC gc) {\r
+ Rectangle r = getClientArea();\r
+ gc.setForeground(color);\r
+\r
+ int y0, y1;\r
+ if (r.height > HEIGHT) {\r
+ y0 = (r.height - HEIGHT) / 2;\r
+ y1 = y0 + HEIGHT;\r
+ } else {\r
+ y0 = 0;\r
+ y1 = r.height;\r
+ }\r
+\r
+ gc.drawLine(DX, y0, DX, y1);\r
+\r
+ gc.drawLine(0, y0 + 3, DX, y0);\r
+ gc.drawLine(2 * DX, y0 + 3, DX, y0);\r
+ }\r
+ }\r
+\r
+ class Mark extends Canvas {\r
+ public final static int DX = 3;\r
+\r
+ private Color color;\r
+\r
+ public Mark(Composite parent, int colorIdx) {\r
+ super(parent, SWT.NONE);\r
+\r
+ color = colors.getColor(colorIdx);\r
+ addListener(SWT.Paint, new Listener() {\r
+ public void handleEvent(Event event) {\r
+ draw(event.gc);\r
+ }\r
+ });\r
+ }\r
+\r
+ private void draw(GC gc) {\r
+ Rectangle r = getClientArea();\r
+ gc.setBackground(color);\r
+\r
+ int y = (r.height - DX) / 2;\r
+ int c[] = { 0, y, DX, y + DX, 2 * DX, y };\r
+ gc.fillPolygon(c);\r
+ }\r
+ }\r
+}\r
--- /dev/null
+#*******************************************************************************\r
+# Copyright (c) 2009, 2010 Ericsson\r
+# \r
+# All rights reserved. This program and the accompanying materials are\r
+# made available under the terms of the Eclipse Public License v1.0 which\r
+# accompanies this distribution, and is available at\r
+# http://www.eclipse.org/legal/epl-v10.html\r
+# \r
+#2Contributors:\r
+# IBM Corporation - initial API and implementation\r
+# Alvaro Sanchez-Leon - Stripped down for TMF\r
+# *******************************************************************************/\r
+\r
+TRACE_STATES_TITLE = States Transition Visualizer\r
+\r
+# labels\r
+_TRACE_ID = Process Id\r
+_TRACE_DATE = Date\r
+_TRACE_NAME = Process Name\r
+_TRACE_CLASS_NAME = Class Name\r
+_TRACE_GROUP_NAME = Group Name\r
+_TRACE_START_TIME = Start Time\r
+_TRACE_EVENT_TIME = Event Time\r
+_TRACE_STOP_TIME = Stop Time\r
+_DURATION = Duration\r
+_TRACE_STATE = State\r
+_NUMBER_OF_TRACES = Number of processes\r
+_TRACE_FILTER = Process Filter\r
+_TRACE_FILTER_DESC = Define the filter set\r
+_Timescale = Time scale\r
+_UNDEFINED_GROUP = <undefined>\r
+_TRACE_GROUP_LABEL = Process Group [{0}]\r
+_EDIT_PROFILING_OPTIONS = Edit Profiling Options\r
+\r
+#Monitor statistics view messages\r
+MEM_ALLOCATION_DETAILS_FOR = Allocation details for\r
+_LEGEND = Legend\r
+_TRACE_STATES = Process states\r
+_WINDOW_TITLE = Process Visualizer's Legend\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model;\r
+\r
+public interface ITimeEvent {\r
+\r
+ public ITmfTimeAnalysisEntry getEntry();\r
+\r
+ public long getTime();\r
+\r
+ /**\r
+ * Returning <list> <li>-1: Considers duration to be from current event till\r
+ * the next</li> <li>0: Duration is not relevant e.g. a Burst / no state\r
+ * associated</li> <li>>0: Valid duration value specified</list>\r
+ * \r
+ * @return\r
+ */\r
+ public long getDuration();\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model;\r
+\r
+import java.util.Vector;\r
+\r
+public interface ITmfTimeAnalysisEntry {\r
+ \r
+ public String getGroupName();\r
+\r
+ public int getId();\r
+\r
+ public String getName();\r
+\r
+ public long getStartTime();\r
+\r
+ public long getStopTime();\r
+\r
+ public <T extends ITimeEvent> Vector<T> getTraceEvents();\r
+}\r
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2009 Ericsson\r
+ * \r
+ * All rights reserved. This program and the accompanying materials are\r
+ * made available under the terms of the Eclipse Public License v1.0 which\r
+ * accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ * \r
+ * Contributors:\r
+ * Alvaro Sanchez-Leon - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model;\r
+\r
+public abstract class TimeEvent implements ITimeEvent {\r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.linuxtools.tlf.widgets.timeAnalysis.model.TmTaEventI#getTrace()\r
+ */\r
+ public abstract ITmfTimeAnalysisEntry getEntry();\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.linuxtools.tlf.widgets.timeAnalysis.model.TmTaEventI#getTime()\r
+ */\r
+ public abstract long getTime();\r
+ \r
+ /* (non-Javadoc)\r
+ * @see org.eclipse.linuxtools.tlf.widgets.timeAnalysis.model.TmTaEventI#getDuration()\r
+ */\r
+ public long getDuration() {\r
+ return -1;\r
+ }\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007, 2010 Intel Corporation.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Updated for TMF\r
+ *\r
+ * $Id: ITimeDataProvider.java,v 1.2 2007/02/27 18:37:36 ewchan Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+public interface ITimeDataProvider {\r
+\r
+ long getSelectedTime();\r
+\r
+ long getBeginTime();\r
+\r
+ long getEndTime();\r
+\r
+ long getMinTime();\r
+\r
+ long getMaxTime();\r
+\r
+ long getTime0();\r
+\r
+ long getTime1();\r
+\r
+ long getMinTimeInterval();\r
+\r
+ /**\r
+ * Updates the time range and notify registered listeners\r
+ * \r
+ * @param time0\r
+ * @param time1\r
+ */\r
+ void setStartFinishTimeNotify(long time0, long time1);\r
+\r
+ /**\r
+ * Update the time range but do not trigger event notification\r
+ * \r
+ * @param time0\r
+ * @param time1\r
+ */\r
+ void setStartFinishTime(long time0, long time1);\r
+\r
+ /**\r
+ * Notify registered listeners without updating the time range\r
+ */\r
+ void notifyStartFinishTime();\r
+\r
+ void setSelectedTimeInt(long time, boolean ensureVisible);\r
+\r
+ void resetStartFinishTime();\r
+\r
+ int getNameSpace();\r
+\r
+ void setNameSpace(int width);\r
+\r
+ int getTimeSpace();\r
+ \r
+ boolean isCalendarFormat();\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007 Intel Corporation.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Udpated for TMF\r
+ *\r
+ * $Id: PlainSelection.java,v 1.1 2007/04/20 13:06:49 ewchan Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+\r
+public class PlainSelection implements IStructuredSelection {\r
+\r
+ List<Object> list = new ArrayList<Object>();\r
+\r
+ public PlainSelection() {\r
+ }\r
+\r
+ public PlainSelection(Object sel) {\r
+ add(sel);\r
+ }\r
+\r
+ public void add(Object sel) {\r
+ if (null != sel && !list.contains(sel))\r
+ list.add(sel);\r
+ }\r
+\r
+ public Object getFirstElement() {\r
+ if (!list.isEmpty())\r
+ return list.get(0);\r
+ return null;\r
+ }\r
+\r
+ public Iterator<Object> iterator() {\r
+ return list.iterator();\r
+ }\r
+\r
+ public int size() {\r
+ return list.size();\r
+ }\r
+\r
+ public Object[] toArray() {\r
+ return list.toArray();\r
+ }\r
+\r
+ public List<Object> toList() {\r
+ return list;\r
+ }\r
+\r
+ public boolean isEmpty() {\r
+ return list.isEmpty();\r
+ }\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007, 2008, 2010 Intel Corporation and others.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Udpated for TMF\r
+ *\r
+ * $Id: TimeScaleCtrl.java,v 1.5 2008/06/16 21:04:49 jkubasta Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+import java.text.SimpleDateFormat;\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.GregorianCalendar;\r
+import java.util.TimeZone;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.Messages;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.Utils.Resolution;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.events.MouseListener;\r
+import org.eclipse.swt.events.MouseMoveListener;\r
+import org.eclipse.swt.events.PaintEvent;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.widgets.Composite;\r
+\r
+public class TimeScaleCtrl extends TraceCtrl implements MouseListener,\r
+ MouseMoveListener {\r
+\r
+ public TimeScaleCtrl(Composite parent, TraceColorScheme colors) {\r
+ super(parent, colors, SWT.NO_BACKGROUND | SWT.NO_FOCUS\r
+ | SWT.DOUBLE_BUFFERED);\r
+ addMouseListener(this);\r
+ addMouseMoveListener(this);\r
+ }\r
+\r
+ private static final long SEC_IN_NS = 1000000000;\r
+ private static final long MIN_IN_NS = 60 * SEC_IN_NS;\r
+ private static final long HOUR_IN_NS = 60 * MIN_IN_NS;\r
+ private static final long DAY_IN_NS = 24 * HOUR_IN_NS;\r
+ private static final long MONTH_IN_NS = 31 * DAY_IN_NS; // upper limit\r
+ private static final long YEAR_IN_NS = 366 * DAY_IN_NS; // upper limit\r
+ \r
+ private static final double LOG10_1 = Math.log10(1);\r
+ private static final double LOG10_2 = Math.log10(2);\r
+ private static final double LOG10_3 = Math.log10(3);\r
+ private static final double LOG10_5 = Math.log10(5);\r
+ \r
+ private static final Calendar GREGORIAN_CALENDAR = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"));\r
+ \r
+ private ITimeDataProvider _timeProvider;\r
+ private int _dragState = 0;\r
+ private int _dragX0 = 0;\r
+ private int _dragX = 0;\r
+ private long _time0bak;\r
+ private long _time1bak;\r
+ private boolean _isInUpdate;\r
+ private Rectangle _rect0 = new Rectangle(0, 0, 0, 0);\r
+ private int _height;\r
+\r
+ public void setTimeProvider(ITimeDataProvider timeProvider) {\r
+ _timeProvider = timeProvider;\r
+ }\r
+\r
+ private long _timeDelta;\r
+\r
+ @Override\r
+ public Point computeSize(int wHint, int hHint, boolean changed) {\r
+ return super.computeSize(wHint, _height, changed);\r
+ }\r
+\r
+ public void setHeight(int height) {\r
+ this._height = height;\r
+ }\r
+ \r
+ private void calcTimeDelta(int width, double pixelsPerNanoSec) {\r
+ double minDelta = (double) ((pixelsPerNanoSec == 0) ? YEAR_IN_NS : width / pixelsPerNanoSec);\r
+ long unit = 1;\r
+ if (_timeProvider != null && _timeProvider.isCalendarFormat()) {\r
+ if (minDelta > 6 * MONTH_IN_NS) {\r
+ unit = YEAR_IN_NS;\r
+ } else if (minDelta > 3 * MONTH_IN_NS) {\r
+ unit = 6 * MONTH_IN_NS;\r
+ } else if (minDelta > 10 * DAY_IN_NS) {\r
+ unit = MONTH_IN_NS;\r
+ } else if (minDelta > 12 * HOUR_IN_NS) {\r
+ unit = DAY_IN_NS;\r
+ } else if (minDelta > 3 * HOUR_IN_NS) {\r
+ unit = 6 * HOUR_IN_NS;\r
+ } else if (minDelta > 30 * MIN_IN_NS) {\r
+ unit = HOUR_IN_NS;\r
+ } else if (minDelta > 10 * MIN_IN_NS) {\r
+ unit = 15 * MIN_IN_NS;\r
+ } else if (minDelta > 30 * SEC_IN_NS) {\r
+ unit = MIN_IN_NS;\r
+ } else if (minDelta > 20 * SEC_IN_NS) {\r
+ unit = 30 * SEC_IN_NS;\r
+ }\r
+ }\r
+ double log = Math.log10((double) minDelta / unit);\r
+ long pow10 = (long) log;\r
+ double remainder = log - pow10;\r
+ if (remainder < LOG10_1) {\r
+ _timeDelta = (long) Math.pow(10, pow10) * unit;\r
+ } else if (remainder < LOG10_2) {\r
+ _timeDelta = 2 * (long) Math.pow(10, pow10) * unit;\r
+ } else if (remainder < LOG10_3 && unit >= HOUR_IN_NS && unit < YEAR_IN_NS) {\r
+ _timeDelta = 3 * (long) Math.pow(10, pow10) * unit;\r
+ } else if (remainder < LOG10_5) {\r
+ _timeDelta = 5 * (long) Math.pow(10, pow10) * unit;\r
+ } else {\r
+ _timeDelta = 10 * (long) Math.pow(10, pow10) * unit;\r
+ }\r
+ }\r
+\r
+ private static TimeDraw TIMEDRAW_NANOSEC = new TimeDrawNanosec();\r
+ private static TimeDraw TIMEDRAW_MICROSEC = new TimeDrawMicrosec();\r
+ private static TimeDraw TIMEDRAW_MILLISEC = new TimeDrawMillisec();\r
+ private static TimeDraw TIMEDRAW_SEC = new TimeDrawSec();\r
+ private static TimeDraw TIMEDRAW_ABS_NANOSEC = new TimeDrawAbsNanoSec();\r
+ private static TimeDraw TIMEDRAW_ABS_MICROSEC = new TimeDrawAbsMicroSec();\r
+ private static TimeDraw TIMEDRAW_ABS_MILLISEC = new TimeDrawAbsMillisec();\r
+ private static TimeDraw TIMEDRAW_ABS_SEC = new TimeDrawAbsSec();\r
+ private static TimeDraw TIMEDRAW_ABS_MIN = new TimeDrawAbsMin();\r
+ private static TimeDraw TIMEDRAW_ABS_HRS = new TimeDrawAbsHrs();\r
+ private static TimeDraw TIMEDRAW_ABS_DAY = new TimeDrawAbsDay();\r
+ private static TimeDraw TIMEDRAW_ABS_MONTH = new TimeDrawAbsMonth();\r
+ private static TimeDraw TIMEDRAW_ABS_YEAR = new TimeDrawAbsYear();\r
+\r
+ TimeDraw getTimeDraw(long timeDelta) {\r
+ TimeDraw timeDraw;\r
+ if (_timeProvider != null && _timeProvider.isCalendarFormat()) {\r
+ if (timeDelta >= YEAR_IN_NS)\r
+ timeDraw = TIMEDRAW_ABS_YEAR;\r
+ else if (timeDelta >= MONTH_IN_NS)\r
+ timeDraw = TIMEDRAW_ABS_MONTH;\r
+ else if (timeDelta >= DAY_IN_NS)\r
+ timeDraw = TIMEDRAW_ABS_DAY;\r
+ else if (timeDelta >= HOUR_IN_NS)\r
+ timeDraw = TIMEDRAW_ABS_HRS;\r
+ else if (timeDelta >= MIN_IN_NS)\r
+ timeDraw = TIMEDRAW_ABS_MIN;\r
+ else if (timeDelta >= SEC_IN_NS)\r
+ timeDraw = TIMEDRAW_ABS_SEC;\r
+ else if (timeDelta >= 1000000)\r
+ timeDraw = TIMEDRAW_ABS_MILLISEC;\r
+ else if (timeDelta >= 1000)\r
+ timeDraw = TIMEDRAW_ABS_MICROSEC;\r
+ else\r
+ timeDraw = TIMEDRAW_ABS_NANOSEC;\r
+ return timeDraw;\r
+ }\r
+ if (timeDelta >= 1000000000)\r
+ timeDraw = TIMEDRAW_SEC;\r
+ else if (timeDelta >= 1000000)\r
+ timeDraw = TIMEDRAW_MILLISEC;\r
+ else if (timeDelta >= 1000)\r
+ timeDraw = TIMEDRAW_MICROSEC;\r
+ else\r
+ timeDraw = TIMEDRAW_NANOSEC;\r
+ return timeDraw;\r
+ }\r
+\r
+ @Override\r
+ void paint(Rectangle rect, PaintEvent e) {\r
+\r
+ if (_isInUpdate || null == _timeProvider)\r
+ return;\r
+\r
+ GC gc = e.gc;\r
+ gc.fillRectangle(rect);\r
+ \r
+ if (null == _timeProvider) {\r
+ return;\r
+ }\r
+\r
+ long time0 = _timeProvider.getTime0();\r
+ long time1 = _timeProvider.getTime1();\r
+ long selectedTime = _timeProvider.getSelectedTime();\r
+ int leftSpace = _timeProvider.getNameSpace();\r
+ int timeSpace = _timeProvider.getTimeSpace();\r
+ \r
+ gc.setBackground(_colors.getColor(TraceColorScheme.TOOL_BACKGROUND));\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.TOOL_FOREGROUND));\r
+ Utils.init(_rect0, rect);\r
+ \r
+ // draw top left area\r
+ _rect0.width = leftSpace;\r
+ _rect0.x += 4;\r
+ _rect0.width -= 4;\r
+ if (_rect0.width > 0) {\r
+ Utils.drawText(gc, Messages._Timescale + ":", _rect0, true);\r
+ }\r
+ int messageWidth = gc.stringExtent(Messages._Timescale + ":").x + 4;\r
+ Rectangle absHeaderRect = new Rectangle(_rect0.x + messageWidth, _rect0.y, _rect0.width - messageWidth, _rect0.height);\r
+ _rect0.x -= 4;\r
+ _rect0.width += 4;\r
+ \r
+ // prepare and draw right rect of the timescale\r
+ _rect0.x += leftSpace;\r
+ _rect0.width = rect.width - leftSpace;\r
+ \r
+ // draw bottom border and erase all other area\r
+ gc.drawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width - 1,\r
+ rect.y + rect.height - 1);\r
+ _rect0.height--;\r
+ gc.fillRectangle(_rect0);\r
+ \r
+ if (time1 <= time0 || timeSpace < 2) {\r
+ return;\r
+ }\r
+ \r
+ int numDigits = calculateDigits(time0, time1);\r
+ \r
+ int labelWidth = gc.getCharWidth('0') * numDigits;\r
+ double pixelsPerNanoSec = (timeSpace <= RIGHT_MARGIN) ? 0 :\r
+ (double) (timeSpace - RIGHT_MARGIN) / (time1 - time0);\r
+ calcTimeDelta(labelWidth, pixelsPerNanoSec);\r
+ \r
+ TimeDraw timeDraw = getTimeDraw(_timeDelta);\r
+\r
+ // draw zoom rectangle\r
+ if (3 == _dragState && null != _timeProvider) {\r
+ if (_dragX0 < _dragX) {\r
+ gc.drawRectangle(leftSpace + _dragX0, rect.y, _dragX - _dragX0 - 1, rect.height - 8);\r
+ } else if (_dragX0 > _dragX) {\r
+ gc.drawRectangle(leftSpace + _dragX, rect.y, _dragX0 - _dragX - 1, rect.height - 8);\r
+ }\r
+ }\r
+\r
+ if (_rect0.isEmpty())\r
+ return;\r
+\r
+ // draw selected time\r
+ int x = _rect0.x + (int) ((double)(selectedTime - time0) * pixelsPerNanoSec);\r
+ if (x >= _rect0.x && x < _rect0.x + _rect0.width) {\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.SELECTED_TIME));\r
+ gc.drawLine(x, _rect0.y + _rect0.height - 6, x, _rect0.y\r
+ + _rect0.height);\r
+ gc\r
+ .setForeground(_colors\r
+ .getColor(TraceColorScheme.TOOL_FOREGROUND));\r
+ }\r
+\r
+ // draw time scale ticks\r
+ _rect0.y = rect.y;\r
+ _rect0.height = rect.height - 4;\r
+ _rect0.width = labelWidth;\r
+ \r
+ long time;\r
+ if (_timeProvider != null && _timeProvider.isCalendarFormat()) {\r
+ time = floorToCalendar(time0, _timeDelta);\r
+ } else {\r
+ time = (long) (Math.ceil((double) time0 / _timeDelta) * _timeDelta);\r
+ }\r
+ \r
+ // long t = (long) (time * 1000000000);\r
+ int y = _rect0.y + _rect0.height;\r
+\r
+ if (_timeProvider != null && _timeProvider.isCalendarFormat()) {\r
+ timeDraw.drawAbsHeader(gc, time, absHeaderRect);\r
+ }\r
+ \r
+ while (true) {\r
+ x = rect.x + leftSpace + (int) (Math.floor((time - time0) * pixelsPerNanoSec));\r
+ if (x >= rect.x + leftSpace + rect.width - _rect0.width) {\r
+ break;\r
+ }\r
+ if (x >= rect.x + leftSpace) {\r
+ gc.drawLine(x, y, x, y + 4);\r
+ _rect0.x = x;\r
+ if (x + _rect0.width <= rect.x + rect.width)\r
+ timeDraw.draw(gc, time, _rect0);\r
+ }\r
+ if (pixelsPerNanoSec == 0 || time > Long.MAX_VALUE - _timeDelta) {\r
+ break;\r
+ }\r
+ time += _timeDelta;\r
+ if (_timeProvider != null && _timeProvider.isCalendarFormat()) {\r
+ if (_timeDelta >= YEAR_IN_NS) {\r
+ GREGORIAN_CALENDAR.setTime(new Date(time / 1000000));\r
+ GREGORIAN_CALENDAR.set(Calendar.MONTH, 0); // January 1st of year\r
+ GREGORIAN_CALENDAR.set(Calendar.DAY_OF_MONTH, 1);\r
+ time = GREGORIAN_CALENDAR.getTimeInMillis() * 1000000;\r
+ } else if (_timeDelta >= MONTH_IN_NS) {\r
+ GREGORIAN_CALENDAR.setTime(new Date(time / 1000000));\r
+ GREGORIAN_CALENDAR.set(Calendar.DAY_OF_MONTH, 1); // 1st of month\r
+ time = GREGORIAN_CALENDAR.getTimeInMillis() * 1000000;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private long floorToCalendar(long time, long timeDelta) {\r
+ if (_timeDelta >= YEAR_IN_NS) {\r
+ GREGORIAN_CALENDAR.setTime(new Date(time / 1000000));\r
+ int year = GREGORIAN_CALENDAR.get(Calendar.YEAR);\r
+ int yearDelta = (int) (timeDelta / YEAR_IN_NS);\r
+ year = (year / yearDelta) * yearDelta;\r
+ GREGORIAN_CALENDAR.set(Calendar.YEAR, year);\r
+ GREGORIAN_CALENDAR.set(Calendar.MONTH, 0); // January 1st of year\r
+ GREGORIAN_CALENDAR.set(Calendar.DAY_OF_MONTH, 1);\r
+ GREGORIAN_CALENDAR.set(Calendar.HOUR_OF_DAY, 0);\r
+ GREGORIAN_CALENDAR.set(Calendar.MINUTE, 0);\r
+ GREGORIAN_CALENDAR.set(Calendar.SECOND, 0);\r
+ GREGORIAN_CALENDAR.set(Calendar.MILLISECOND, 0);\r
+ time = GREGORIAN_CALENDAR.getTimeInMillis() * 1000000;\r
+ } else if (_timeDelta >= MONTH_IN_NS) {\r
+ GREGORIAN_CALENDAR.setTime(new Date(time / 1000000));\r
+ int month = GREGORIAN_CALENDAR.get(Calendar.MONTH);\r
+ int monthDelta = (int) (timeDelta / MONTH_IN_NS);\r
+ month = (month / monthDelta) * monthDelta;\r
+ GREGORIAN_CALENDAR.set(Calendar.MONTH, month);\r
+ GREGORIAN_CALENDAR.set(Calendar.DAY_OF_MONTH, 1); // 1st of month\r
+ GREGORIAN_CALENDAR.set(Calendar.HOUR_OF_DAY, 0);\r
+ GREGORIAN_CALENDAR.set(Calendar.MINUTE, 0);\r
+ GREGORIAN_CALENDAR.set(Calendar.SECOND, 0);\r
+ GREGORIAN_CALENDAR.set(Calendar.MILLISECOND, 0);\r
+ time = GREGORIAN_CALENDAR.getTimeInMillis() * 1000000;\r
+ } else {\r
+ time = (time / timeDelta) * timeDelta;\r
+ }\r
+ return time;\r
+ }\r
+ \r
+ private int calculateDigits(long time0, long time1) {\r
+ int numDigits = 5;\r
+ long timeRange = time1 - time0;\r
+\r
+ if (_timeProvider.isCalendarFormat()) {\r
+ // Calculate the number of digits to represent the minutes provided\r
+ // 11:222\r
+ // HH:mm:ss\r
+ numDigits += 8;\r
+ if (timeRange < 10000) {\r
+ // HH:11:222:333:444__\r
+ numDigits += 10;\r
+ } else if (timeRange < 10000000) {\r
+ // HH:11:222:333__\r
+ numDigits += 6;\r
+ }\r
+ } else {\r
+ // Calculate the number of digits to represent the minutes provided\r
+ long min = (long) ((time1 * 1E-9) / 60); // to sec then to minutes\r
+ String strMinutes = String.valueOf(min);\r
+ // 11:222\r
+ if (strMinutes != null) {\r
+ numDigits += strMinutes.length();\r
+ } else {\r
+ numDigits += 2;\r
+ }\r
+ if (timeRange < 10000) {\r
+ // 11:222:333:444__\r
+ numDigits += 8;\r
+ } else if (timeRange < 10000000) {\r
+ // 11:222:333__\r
+ numDigits += 4;\r
+ }\r
+ }\r
+\r
+// Trace.debug("timeRange: " + timeRange + " numDigits: " + numDigits);\r
+ return numDigits;\r
+ }\r
+\r
+ public void mouseDown(MouseEvent e) {\r
+ if (_dragState == 0 && null != _timeProvider) {\r
+ if (1 == e.button) {\r
+ setCapture(true);\r
+ _dragState = 1;\r
+ } else if (3 == e.button) {\r
+ _dragState = 3;\r
+ }\r
+ int x = e.x - _timeProvider.getNameSpace();\r
+ if (x < 0) {\r
+ x = 0;\r
+ } else if (x > getSize().x - _timeProvider.getNameSpace()) {\r
+ x = getSize().x - _timeProvider.getNameSpace();\r
+ }\r
+ _dragX = _dragX0 = x;\r
+ _time0bak = _timeProvider.getTime0();\r
+ _time1bak = _timeProvider.getTime1();\r
+ }\r
+ }\r
+\r
+ public void mouseUp(MouseEvent e) {\r
+ if (e.button == 1 && _dragState == 1) {\r
+ setCapture(false);\r
+ _dragState = 0;\r
+ \r
+ // Notify time provider to check the need for listener notification\r
+ if (_dragX != _dragX0) {\r
+ _timeProvider.setStartFinishTimeNotify(_timeProvider.getTime0(), _timeProvider.getTime1());\r
+ }\r
+ } else if (e.button == 3 && _dragState == 3 && null != _timeProvider) {\r
+ _dragState = 0;\r
+ if (_dragX0 == _dragX) {\r
+ return;\r
+ }\r
+ int timeSpace = _timeProvider.getTimeSpace();\r
+ int leftSpace = _timeProvider.getNameSpace();\r
+ int x = e.x - leftSpace;\r
+ if (timeSpace > 0) {\r
+ _dragX = x;\r
+ if (_dragX0 > _dragX) { // drag right to left\r
+ _dragX = _dragX0;\r
+ _dragX0 = x;\r
+ }\r
+ long time0 = _time0bak + (long) ((_time1bak - _time0bak) * ((double) _dragX0 / timeSpace));\r
+ long time1 = _time0bak + (long) ((_time1bak - _time0bak) * ((double) _dragX / timeSpace));\r
+\r
+ _timeProvider.setStartFinishTimeNotify(time0, time1);\r
+ _time0bak = _timeProvider.getTime0();\r
+ _time1bak = _timeProvider.getTime1();\r
+ }\r
+ }\r
+ }\r
+\r
+ public void mouseMove(MouseEvent e) {\r
+ if (_dragX0 < 0 || _dragState == 0) {\r
+ return;\r
+ }\r
+ Point size = getSize();\r
+ int leftSpace = _timeProvider.getNameSpace();\r
+ int timeSpace = _timeProvider.getTimeSpace();\r
+ int x = e.x - leftSpace;\r
+ if (1 == _dragState && null != _timeProvider) {\r
+ if (x > 0 && size.x > leftSpace && _dragX != x) {\r
+ _dragX = x;\r
+ long time1 = _time0bak + (long) ((_time1bak - _time0bak) * ((double) _dragX0 / _dragX));\r
+ _timeProvider.setStartFinishTime(_time0bak, time1);\r
+ }\r
+ } else if (3 == _dragState && null != _timeProvider) {\r
+ if (x < 0) {\r
+ _dragX = 0;\r
+ } else if (x > timeSpace) {\r
+ _dragX = timeSpace;\r
+ } else {\r
+ _dragX = x;\r
+ }\r
+ redraw();\r
+ }\r
+ }\r
+\r
+ public void mouseDoubleClick(MouseEvent e) {\r
+ if (null != _timeProvider) {\r
+ _timeProvider.resetStartFinishTime();\r
+ _time0bak = _timeProvider.getTime0();\r
+ _time1bak = _timeProvider.getTime1();\r
+ }\r
+ }\r
+}\r
+\r
+abstract class TimeDraw {\r
+ static String S = ":";\r
+ static String S0 = ":0";\r
+ static String S00 = ":00";\r
+ protected static final SimpleDateFormat stimeformat = new SimpleDateFormat("HH:mm:ss");\r
+ protected static final SimpleDateFormat stimeformatheader = new SimpleDateFormat("yyyy MMM dd");\r
+ protected static final SimpleDateFormat sminformat = new SimpleDateFormat("HH:mm");\r
+ protected static final SimpleDateFormat sminformatheader = new SimpleDateFormat("yyyy MMM dd");\r
+ protected static final SimpleDateFormat shrsformat = new SimpleDateFormat("MMM dd HH:mm");\r
+ protected static final SimpleDateFormat shrsformatheader = new SimpleDateFormat("yyyy");\r
+ protected static final SimpleDateFormat sdayformat = new SimpleDateFormat("MMM dd");\r
+ protected static final SimpleDateFormat sdayformatheader = new SimpleDateFormat("yyyy");\r
+ protected static final SimpleDateFormat smonthformat = new SimpleDateFormat("yyyy MMM");\r
+ protected static final SimpleDateFormat syearformat = new SimpleDateFormat("yyyy");\r
+ static {\r
+ stimeformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ stimeformatheader.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ sminformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ sminformatheader.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ shrsformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ shrsformatheader.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ sdayformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ sdayformatheader.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ smonthformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ syearformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ }\r
+ \r
+ static String pad(long n) {\r
+ String s = S;\r
+ if (n < 10)\r
+ s = S00;\r
+ else if (n < 100)\r
+ s = S0;\r
+ return s + n;\r
+ }\r
+\r
+ public abstract void draw(GC gc, long time, Rectangle rect);\r
+\r
+ public void drawAbsHeader(GC gc, long time, Rectangle absHeaderRect) {\r
+ // Override to draw absolute time header\r
+ // This is for the time information not shown in the draw of each tick\r
+ }\r
+ \r
+ public abstract String hint();\r
+}\r
+\r
+class TimeDrawSec extends TimeDraw {\r
+ static String _hint = "sec";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ time /= 1000000000;\r
+ Utils.drawText(gc, time + "", rect, true);\r
+ }\r
+\r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawMillisec extends TimeDraw {\r
+ static String _hint = "s:ms";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ time /= 1000000;\r
+ long ms = time % 1000;\r
+ time /= 1000;\r
+ Utils.drawText(gc, time + pad(ms), rect, true);\r
+ }\r
+\r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawMicrosec extends TimeDraw {\r
+ static String _hint = "s:ms:mcs";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ time /= 1000;\r
+ long mcs = time % 1000;\r
+ time /= 1000;\r
+ long ms = time % 1000;\r
+ time /= 1000;\r
+ Utils.drawText(gc, time + pad(ms) + pad(mcs), rect, true);\r
+ }\r
+\r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawNanosec extends TimeDraw {\r
+ static String _hint = "s:ms:mcs:ns";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ long ns = time % 1000;\r
+ time /= 1000;\r
+ long mcs = time % 1000;\r
+ time /= 1000;\r
+ long ms = time % 1000;\r
+ time /= 1000;\r
+ Utils.drawText(gc, time + pad(ms) + pad(mcs) + pad(ns), rect, true);\r
+ }\r
+\r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsYear extends TimeDraw {\r
+ static String _hint = "YYYY";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = syearformat.format(new Date((long) (time / 1000000)));\r
+ Utils.drawText(gc, stime, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsMonth extends TimeDraw {\r
+ static String _hint = "YYYY Mmm";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = smonthformat.format(new Date((long) (time / 1000000)));\r
+ Utils.drawText(gc, stime, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsDay extends TimeDraw {\r
+ static String _hint = "Mmm dd";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = sdayformat.format(new Date((long) (time / 1000000)));\r
+ Utils.drawText(gc, stime, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public void drawAbsHeader(GC gc, long time, Rectangle rect) {\r
+ String header = sdayformatheader.format(new Date((long) (time / 1000000)));\r
+ int headerwidth = gc.stringExtent(header).x + 4;\r
+ if (headerwidth <= rect.width) {\r
+ rect.x += (rect.width - headerwidth);\r
+ Utils.drawText(gc, header, rect, true);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsHrs extends TimeDraw {\r
+ static String _hint = "Mmm dd HH:mm";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = shrsformat.format(new Date((long) (time / 1000000)));\r
+ Utils.drawText(gc, stime, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public void drawAbsHeader(GC gc, long time, Rectangle rect) {\r
+ String header = shrsformatheader.format(new Date((long) (time / 1000000)));\r
+ int headerwidth = gc.stringExtent(header).x + 4;\r
+ if (headerwidth <= rect.width) {\r
+ rect.x += (rect.width - headerwidth);\r
+ Utils.drawText(gc, header, rect, true);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsMin extends TimeDraw {\r
+ static String _hint = "HH:mm";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = sminformat.format(new Date((long) (time / 1000000)));\r
+ Utils.drawText(gc, stime, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public void drawAbsHeader(GC gc, long time, Rectangle rect) {\r
+ String header = sminformatheader.format(new Date((long) (time / 1000000)));\r
+ int headerwidth = gc.stringExtent(header).x + 4;\r
+ if (headerwidth <= rect.width) {\r
+ rect.x += (rect.width - headerwidth);\r
+ Utils.drawText(gc, header, rect, true);\r
+ }\r
+ }\r
+ \r
+ \r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsSec extends TimeDraw {\r
+ static String _hint = "HH:mm:ss";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = stimeformat.format(new Date((long) (time / 1000000)));\r
+ Utils.drawText(gc, stime, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public void drawAbsHeader(GC gc, long time, Rectangle rect) {\r
+ String header = stimeformatheader.format(new Date((long) (time / 1000000)));\r
+ int headerwidth = gc.stringExtent(header).x + 4;\r
+ if (headerwidth <= rect.width) {\r
+ rect.x += (rect.width - headerwidth);\r
+ Utils.drawText(gc, header, rect, true);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsMillisec extends TimeDraw {\r
+ static String _hint = "HH:ss:ms";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = stimeformat.format(new Date((long) (time / 1000000)));\r
+ String ns = Utils.formatNs(time, Resolution.MILLISEC);\r
+\r
+ Utils.drawText(gc, stime + " " + ns, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public void drawAbsHeader(GC gc, long time, Rectangle rect) {\r
+ String header = stimeformatheader.format(new Date((long) (time / 1000000)));\r
+ int headerwidth = gc.stringExtent(header).x + 4;\r
+ if (headerwidth <= rect.width) {\r
+ rect.x += (rect.width - headerwidth);\r
+ Utils.drawText(gc, header, rect, true);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsMicroSec extends TimeDraw {\r
+ static String _hint = "HH:ss:ms:mcs";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = stimeformat.format(new Date((long) (time / 1000000)));\r
+ String micr = Utils.formatNs(time, Resolution.MICROSEC);\r
+ Utils.drawText(gc, stime + " " + micr, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public void drawAbsHeader(GC gc, long time, Rectangle rect) {\r
+ String header = stimeformatheader.format(new Date((long) (time / 1000000)));\r
+ int headerwidth = gc.stringExtent(header).x + 4;\r
+ if (headerwidth <= rect.width) {\r
+ rect.x += (rect.width - headerwidth);\r
+ Utils.drawText(gc, header, rect, true);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
+\r
+class TimeDrawAbsNanoSec extends TimeDraw {\r
+ static String _hint = "HH:ss:ms:mcs:ns";\r
+\r
+ @Override\r
+ public void draw(GC gc, long time, Rectangle rect) {\r
+ String stime = stimeformat.format(new Date((long) (time / 1000000)));\r
+ String ns = Utils.formatNs(time, Resolution.NANOSEC);\r
+ Utils.drawText(gc, stime + " " + ns, rect, true);\r
+ }\r
+\r
+ @Override\r
+ public void drawAbsHeader(GC gc, long time, Rectangle rect) {\r
+ String header = stimeformatheader.format(new Date((long) (time / 1000000)));\r
+ int headerwidth = gc.stringExtent(header).x + 4;\r
+ if (headerwidth <= rect.width) {\r
+ rect.x += (rect.width - headerwidth);\r
+ Utils.drawText(gc, header, rect, true);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public String hint() {\r
+ return _hint;\r
+ }\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007, 2008 Intel Corporation.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Udpated for TMF\r
+ *\r
+ * $Id: ThreadStatesCtrl.java,v 1.15 2008/07/11 13:49:01 aalexeev Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Vector;\r
+\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.jface.viewers.ISelectionChangedListener;\r
+import org.eclipse.jface.viewers.ISelectionProvider;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.Messages;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.TimeEvent;\r
+import org.eclipse.osgi.util.NLS;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.ControlEvent;\r
+import org.eclipse.swt.events.ControlListener;\r
+import org.eclipse.swt.events.FocusEvent;\r
+import org.eclipse.swt.events.FocusListener;\r
+import org.eclipse.swt.events.KeyEvent;\r
+import org.eclipse.swt.events.KeyListener;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.events.MouseListener;\r
+import org.eclipse.swt.events.MouseMoveListener;\r
+import org.eclipse.swt.events.MouseTrackListener;\r
+import org.eclipse.swt.events.MouseWheelListener;\r
+import org.eclipse.swt.events.PaintEvent;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.events.SelectionListener;\r
+import org.eclipse.swt.events.TraverseEvent;\r
+import org.eclipse.swt.events.TraverseListener;\r
+import org.eclipse.swt.graphics.Cursor;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Event;\r
+import org.eclipse.swt.widgets.Listener;\r
+import org.eclipse.swt.widgets.ScrollBar;\r
+\r
+/**\r
+ * @author alvaro\r
+ * \r
+ */\r
+public class TmfTimeStatesCtrl extends TraceCtrl implements FocusListener,\r
+ KeyListener, MouseMoveListener, MouseListener, MouseWheelListener,\r
+ ControlListener, SelectionListener, MouseTrackListener,\r
+ TraverseListener, ISelectionProvider {\r
+\r
+ public static final boolean DEFAULT_DRAW_THREAD_JOIN = true;\r
+ public static final boolean DEFAULT_DRAW_THREAD_WAIT = true;\r
+ public static final boolean DEFAULT_DRAW_THREAD_RELEASE = true;\r
+ public static int H_SCROLLBAR_MAX = Integer.MAX_VALUE - 1;\r
+\r
+ private final double zoomCoeff = 1.5;\r
+\r
+ private ITimeDataProvider _timeProvider;\r
+ private boolean _isInFocus = false;\r
+ private boolean _isDragCursor3 = false;\r
+ private boolean _isWaitCursor = true;\r
+ private boolean _mouseHover = false;\r
+ private int _itemHeightDefault = 19;\r
+ private int _itemHeight = _itemHeightDefault;\r
+ private int _topItem = 0;\r
+ private int _dragState = 0;\r
+ private int _hitIdx = 0;\r
+ private int _dragX0 = 0;\r
+ private int _dragX = 0;\r
+ private int _idealNameWidth = 0;\r
+ // private double _timeStep = 10000000;\r
+ private long _time0bak;\r
+ private long _time1bak;\r
+ private TmfTimeAnalysisProvider utilImpl = null;\r
+ private ItemData _data = null;\r
+ private List<SelectionListener> _selectionListeners;\r
+ private List<ISelectionChangedListener> _selectionChangedListeners = new ArrayList<ISelectionChangedListener>();\r
+ private Rectangle _rect0 = new Rectangle(0, 0, 0, 0);\r
+ private Rectangle _rect1 = new Rectangle(0, 0, 0, 0);\r
+ private Cursor _dragCursor3;\r
+ private Cursor _WaitCursor;\r
+ private boolean drawTracesInteraction = false;\r
+ private boolean drawTraceJoins = DEFAULT_DRAW_THREAD_JOIN;\r
+ private boolean drawTraceWaits = DEFAULT_DRAW_THREAD_WAIT;\r
+ private boolean drawTraceReleases = DEFAULT_DRAW_THREAD_RELEASE;\r
+\r
+ // Vertical formatting formatting for the state control view\r
+ private boolean _visibleVerticalScroll = true;\r
+ private int _borderWidth = 0;\r
+ private int _headerHeight = 0;\r
+\r
+ private Listener mouseScrollFilterListener;\r
+\r
+ public TmfTimeStatesCtrl(Composite parent, TraceColorScheme colors,\r
+ TmfTimeAnalysisProvider rutilImp) {\r
+\r
+ super(parent, colors, SWT.NO_BACKGROUND | SWT.V_SCROLL | SWT.H_SCROLL\r
+ | SWT.DOUBLE_BUFFERED);\r
+\r
+ this.utilImpl = rutilImp;\r
+ _data = new ItemData(utilImpl);\r
+\r
+ addFocusListener(this);\r
+ addMouseListener(this);\r
+ addMouseMoveListener(this);\r
+ addMouseTrackListener(this);\r
+ addMouseWheelListener(this);\r
+ addTraverseListener(this);\r
+ addKeyListener(this);\r
+ addControlListener(this);\r
+ ScrollBar scrollVer = getVerticalBar();\r
+ ScrollBar scrollHor = getHorizontalBar();\r
+ if (scrollVer != null) {\r
+ scrollVer.addSelectionListener(this);\r
+ scrollVer.setVisible(_visibleVerticalScroll);\r
+ }\r
+\r
+ if (scrollHor != null) {\r
+ scrollHor.addSelectionListener(this);\r
+ }\r
+ mouseScrollFilterListener = new Listener() {\r
+ // This filter is used to prevent scrolling of the view when the\r
+ // mouse wheel is used to zoom\r
+ public void handleEvent(Event event) {\r
+ event.doit = false;\r
+ }\r
+ };\r
+\r
+ _dragCursor3 = new Cursor(super.getDisplay(), SWT.CURSOR_SIZEWE);\r
+ _WaitCursor = new Cursor(super.getDisplay(), SWT.CURSOR_WAIT);\r
+ }\r
+\r
+ @Override\r
+ public void dispose() {\r
+ super.dispose();\r
+ _dragCursor3.dispose();\r
+ _WaitCursor.dispose();\r
+ }\r
+\r
+ public void setTimeProvider(ITimeDataProvider timeProvider) {\r
+ _timeProvider = timeProvider;\r
+ adjustScrolls();\r
+ redraw();\r
+ }\r
+\r
+ public void addSelectionListener(SelectionListener listener) {\r
+ if (listener == null)\r
+ SWT.error(SWT.ERROR_NULL_ARGUMENT);\r
+ if (null == _selectionListeners)\r
+ _selectionListeners = new ArrayList<SelectionListener>();\r
+ _selectionListeners.add(listener);\r
+ }\r
+\r
+ public void removeSelectionListener(SelectionListener listener) {\r
+ if (null != _selectionListeners)\r
+ _selectionListeners.remove(listener);\r
+ }\r
+\r
+ public void fireSelectionChanged() {\r
+ if (null != _selectionListeners) {\r
+ Iterator<SelectionListener> it = _selectionListeners.iterator();\r
+ while (it.hasNext()) {\r
+ SelectionListener listener = it.next();\r
+ listener.widgetSelected(null);\r
+ }\r
+ }\r
+ }\r
+\r
+ public void fireDefaultSelection() {\r
+ if (null != _selectionListeners) {\r
+ Iterator<SelectionListener> it = _selectionListeners.iterator();\r
+ while (it.hasNext()) {\r
+ SelectionListener listener = it.next();\r
+ listener.widgetDefaultSelected(null);\r
+ }\r
+ }\r
+ }\r
+\r
+ public Object[] getTraces() {\r
+ return _data.getTraces();\r
+ }\r
+\r
+ public boolean[] getTraceFilter() {\r
+ return _data.getTraceFilter();\r
+ }\r
+\r
+ public void refreshData() {\r
+ _data.refreshData();\r
+ adjustScrolls();\r
+ redraw();\r
+ }\r
+\r
+ public void refreshData(Object traces[]) {\r
+ _data.refreshData(traces);\r
+ adjustScrolls();\r
+ redraw();\r
+ }\r
+\r
+ public void refreshPartial(ITmfTimeAnalysisEntry parent, TimeEvent item) {\r
+ _data.refreshPartial(parent, item);\r
+ adjustScrolls();\r
+ redraw();\r
+ }\r
+\r
+ public void adjustScrolls() {\r
+ if (null == _timeProvider) {\r
+ getVerticalBar().setValues(0, 1, 1, 1, 1, 1);\r
+ getHorizontalBar().setValues(0, 1, 1, 1, 1, 1);\r
+ return;\r
+ }\r
+\r
+ // Vertical scroll bar\r
+ int page = countPerPage();\r
+ if (_topItem + page > _data._items.length)\r
+ _topItem = _data._items.length - page;\r
+ if (_topItem < 0)\r
+ _topItem = 0;\r
+ getVerticalBar().setValues(_topItem, 0, _data._items.length, page, 1,\r
+ page);\r
+\r
+ // HORIZONTAL BAR\r
+ // Visible window\r
+ long time0 = _timeProvider.getTime0();\r
+ long time1 = _timeProvider.getTime1();\r
+ // Time boundaries\r
+ long timeMin = _timeProvider.getMinTime();\r
+ long timeMax = _timeProvider.getMaxTime();\r
+\r
+ long delta = timeMax - timeMin;\r
+\r
+ int timePos = 0;\r
+ int thumb = H_SCROLLBAR_MAX;\r
+\r
+ if (delta != 0) {\r
+ // Thumb size (page size)\r
+ thumb = Math.max(1, (int) (H_SCROLLBAR_MAX * ((double) (time1 - time0) / delta)));\r
+ // At the beginning of visible window\r
+ timePos = (int) (H_SCROLLBAR_MAX * ((double) (time0 - timeMin) / delta));\r
+ }\r
+\r
+ // position, minimum, maximum, thumb size, increment (half page)t, page\r
+ // increment size (full page)\r
+ getHorizontalBar().setValues(timePos, 0, H_SCROLLBAR_MAX, thumb,\r
+ Math.max(1, thumb / 2), Math.max(2, thumb));\r
+ }\r
+\r
+ boolean ensureVisibleItem(int idx, boolean redraw) {\r
+ boolean changed = false;\r
+ if (idx < 0) {\r
+ for (idx = 0; idx < _data._items.length; idx++) {\r
+ if (((Item) _data._items[idx])._selected)\r
+ break;\r
+ }\r
+ }\r
+ if (idx >= _data._items.length)\r
+ return changed;\r
+ if (idx < _topItem) {\r
+ _topItem = idx;\r
+ getVerticalBar().setSelection(_topItem);\r
+ if (redraw)\r
+ redraw();\r
+ changed = true;\r
+ } else {\r
+ int page = countPerPage();\r
+ if (idx >= _topItem + page) {\r
+ _topItem = idx - page + 1;\r
+ getVerticalBar().setSelection(_topItem);\r
+ if (redraw)\r
+ redraw();\r
+ changed = true;\r
+ }\r
+ }\r
+ return changed;\r
+ }\r
+\r
+ public ISelection getSelection() {\r
+ PlainSelection sel = new PlainSelection();\r
+ ITmfTimeAnalysisEntry trace = getSelectedTrace();\r
+ if (null != trace && null != _timeProvider) {\r
+ long selectedTime = _timeProvider.getSelectedTime();\r
+ ITimeEvent event = Utils.findEvent(trace, selectedTime, 0);\r
+ if (event != null)\r
+ sel.add(event);\r
+ else\r
+ sel.add(trace);\r
+ }\r
+ return sel;\r
+ }\r
+\r
+ public ISelection getSelectionTrace() {\r
+ PlainSelection sel = new PlainSelection();\r
+ ITmfTimeAnalysisEntry trace = getSelectedTrace();\r
+ if (null != trace) {\r
+ sel.add(trace);\r
+ }\r
+ return sel;\r
+ }\r
+\r
+ public void selectTrace(int n) {\r
+ if (n != 1 && n != -1)\r
+ return;\r
+ boolean changed = false;\r
+ int lastSelection = -1;\r
+ for (int i = 0; i < _data._items.length; i++) {\r
+ Item item = (Item) _data._items[i];\r
+ if (item._selected) {\r
+ lastSelection = i;\r
+ if (1 == n && i < _data._items.length - 1) {\r
+ item._selected = false;\r
+ if (item._hasChildren)\r
+ _data.expandItem(i, true);\r
+ item = (Item) _data._items[i + 1];\r
+ if (item._hasChildren) {\r
+ _data.expandItem(i + 1, true);\r
+ item = (Item) _data._items[i + 2];\r
+ }\r
+ item._selected = true;\r
+ changed = true;\r
+ } else if (-1 == n && i > 0) {\r
+ i--;\r
+ Item prevItem = (Item) _data._items[i];\r
+ if (prevItem._hasChildren) {\r
+ if (prevItem._expanded) {\r
+ if (i > 0) {\r
+ i--;\r
+ prevItem = (Item) _data._items[i];\r
+ }\r
+ }\r
+ if (!prevItem._expanded) {\r
+ int added = _data.expandItem(i, true);\r
+ prevItem = (Item) _data._items[i + added];\r
+ item._selected = false;\r
+ prevItem._selected = true;\r
+ changed = true;\r
+ }\r
+ } else {\r
+ item._selected = false;\r
+ prevItem._selected = true;\r
+ changed = true;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if (lastSelection < 0 && _data._items.length > 0) {\r
+ Item item = (Item) _data._items[0];\r
+ if (item._hasChildren) {\r
+ _data.expandItem(0, true);\r
+ item = (Item) _data._items[1];\r
+ item._selected = true;\r
+ changed = true;\r
+ } else {\r
+ item._selected = true;\r
+ changed = true;\r
+ }\r
+ }\r
+ if (changed) {\r
+ ensureVisibleItem(-1, false);\r
+ redraw();\r
+ fireSelectionChanged();\r
+ }\r
+ }\r
+\r
+ public void selectEvent(int n) {\r
+ if (null == _timeProvider)\r
+ return;\r
+ ITmfTimeAnalysisEntry trace = getSelectedTrace();\r
+ if (trace == _timeProvider || trace == null)\r
+ return;\r
+ long selectedTime = _timeProvider.getSelectedTime();\r
+ long endTime = _timeProvider.getEndTime();\r
+ ITimeEvent nextEvent;\r
+ if (-1 == n && selectedTime > endTime)\r
+ nextEvent = Utils.findEvent(trace, selectedTime, 0);\r
+ else\r
+ nextEvent = Utils.findEvent(trace, selectedTime, n);\r
+ if (null == nextEvent && -1 == n)\r
+ nextEvent = Utils.getFirstEvent(trace);\r
+ if (null != nextEvent) {\r
+ _timeProvider.setSelectedTimeInt(nextEvent.getTime(), true);\r
+ fireSelectionChanged();\r
+ } else if (1 == n) {\r
+ _timeProvider.setSelectedTimeInt(endTime, true);\r
+ fireSelectionChanged();\r
+ }\r
+ }\r
+\r
+ public void selectNextEvent() {\r
+ selectEvent(1);\r
+ }\r
+\r
+ public void selectPrevEvent() {\r
+ selectEvent(-1);\r
+ }\r
+\r
+ public void selectNextTrace() {\r
+ selectTrace(1);\r
+ }\r
+\r
+ public void selectPrevTrace() {\r
+ selectTrace(-1);\r
+ }\r
+\r
+ /**\r
+ * Zooming based on mouse cursor location with mouse scrolling\r
+ * \r
+ * @param zoomIn\r
+ */\r
+ public void zoom(boolean zoomIn) {\r
+ int globalX = getDisplay().getCursorLocation().x;\r
+ Point p = toControl(globalX, 0);\r
+ int nameSpace = _timeProvider.getNameSpace();\r
+ int timeSpace = _timeProvider.getTimeSpace();\r
+ int xPos = Math.max(nameSpace, Math.min(nameSpace + timeSpace, p.x));\r
+ long time0 = _timeProvider.getTime0();\r
+ long time1 = _timeProvider.getTime1();\r
+ long interval = time1 - time0;\r
+ if (interval == 0) {\r
+ interval = 1;\r
+ } // to allow getting out of single point interval\r
+ long newInterval;\r
+ if (zoomIn) {\r
+ newInterval = Math.max(Math.round((double) interval * 0.8), _timeProvider.getMinTimeInterval());\r
+ } else {\r
+ newInterval = Math.round((double) interval * 1.25);\r
+ }\r
+ long center = time0 + Math.round(((double) (xPos - nameSpace) / timeSpace * interval));\r
+ long newTime0 = center - Math.round((double) newInterval * (center - time0) / interval);\r
+ long newTime1 = newTime0 + newInterval;\r
+ _timeProvider.setStartFinishTime(newTime0, newTime1);\r
+ }\r
+\r
+ /**\r
+ * zoom in using single click\r
+ */\r
+ public void zoomIn() {\r
+ long _time0 = _timeProvider.getTime0();\r
+ long _time1 = _timeProvider.getTime1();\r
+ long _range = _time1 - _time0;\r
+ long selTime = _timeProvider.getSelectedTime();\r
+ if (selTime <= _time0 || selTime >= _time1) {\r
+ selTime = (_time0 + _time1) / 2;\r
+ }\r
+ long time0 = selTime - (long) ((selTime - _time0) / zoomCoeff);\r
+ long time1 = selTime + (long) ((_time1 - selTime) / zoomCoeff);\r
+\r
+ long inaccuracy = (_timeProvider.getMaxTime() - _timeProvider\r
+ .getMinTime())\r
+ - (time1 - time0);\r
+\r
+ // Trace.debug("selTime:" + selTime + " time0:" + time0 + " time1:"\r
+ // + time1 + " inaccuracy:" + inaccuracy);\r
+\r
+ if (inaccuracy > 0 && inaccuracy < 100) {\r
+ _timeProvider.setStartFinishTimeNotify(_timeProvider.getMinTime(),\r
+ _timeProvider.getMaxTime());\r
+ return;\r
+ }\r
+\r
+ long m = _timeProvider.getMinTimeInterval();\r
+ if ((time1 - time0) < m) {\r
+ time0 = selTime - (long) ((selTime - _time0) * m / _range);\r
+ time1 = time0 + m;\r
+ }\r
+\r
+ _timeProvider.setStartFinishTimeNotify(time0, time1);\r
+ }\r
+\r
+ /**\r
+ * zoom out using single click\r
+ */\r
+ public void zoomOut() {\r
+ long _time0 = _timeProvider.getTime0();\r
+ long _time1 = _timeProvider.getTime1();\r
+ long selTime = _timeProvider.getSelectedTime();\r
+ if (selTime <= _time0 || selTime >= _time1) {\r
+ selTime = (_time0 + _time1) / 2;\r
+ }\r
+ long time0 = (long) (selTime - (selTime - _time0) * zoomCoeff);\r
+ long time1 = (long) (selTime + (_time1 - selTime) * zoomCoeff);\r
+\r
+ long inaccuracy = (_timeProvider.getMaxTime() - _timeProvider\r
+ .getMinTime())\r
+ - (time1 - time0);\r
+ if (inaccuracy > 0 && inaccuracy < 100) {\r
+ _timeProvider.setStartFinishTimeNotify(_timeProvider.getMinTime(),\r
+ _timeProvider.getMaxTime());\r
+ return;\r
+ }\r
+\r
+ _timeProvider.setStartFinishTimeNotify(time0, time1);\r
+ }\r
+\r
+ public void groupTraces(boolean on) {\r
+ _data.groupTraces(on);\r
+ adjustScrolls();\r
+ redraw();\r
+ }\r
+\r
+ public void toggleTraceInteractionDrawing() {\r
+ drawTracesInteraction = !drawTracesInteraction;\r
+ redraw();\r
+ }\r
+\r
+ public void setTraceJoinDrawing(boolean on) {\r
+ drawTraceJoins = on;\r
+ drawTracesInteraction = true;\r
+ redraw();\r
+ }\r
+\r
+ public void setTraceWaitDrawing(boolean on) {\r
+ drawTraceWaits = on;\r
+ drawTracesInteraction = true;\r
+ redraw();\r
+ }\r
+\r
+ public void setTraceReleaseDrawing(boolean on) {\r
+ drawTraceReleases = on;\r
+ drawTracesInteraction = true;\r
+ redraw();\r
+ }\r
+\r
+ public boolean getTracesInteractionDrawing() {\r
+ return drawTracesInteraction;\r
+ }\r
+\r
+ public boolean getTraceJoinDrawing() {\r
+ return drawTraceJoins;\r
+ }\r
+\r
+ public boolean getTraceWaitDrawing() {\r
+ return drawTraceWaits;\r
+ }\r
+\r
+ public boolean getTraceReleaseDrawing() {\r
+ return drawTraceReleases;\r
+ }\r
+\r
+ public ITmfTimeAnalysisEntry getSelectedTrace() {\r
+ ITmfTimeAnalysisEntry trace = null;\r
+ int idx = getSelectedIndex();\r
+ if (idx >= 0 && _data._items[idx] instanceof TraceItem)\r
+ trace = ((TraceItem) _data._items[idx])._trace;\r
+ return trace;\r
+ }\r
+\r
+ public int getSelectedIndex() {\r
+ int idx = -1;\r
+ for (int i = 0; i < _data._items.length; i++) {\r
+ Item item = (Item) _data._items[i];\r
+ if (item._selected) {\r
+ idx = i;\r
+ break;\r
+ }\r
+ }\r
+ return idx;\r
+ }\r
+\r
+ boolean toggle(int idx) {\r
+ boolean toggled = false;\r
+ if (idx >= 0 && idx < _data._items.length) {\r
+ Item item = (Item) _data._items[idx];\r
+ if (item._hasChildren) {\r
+ item._expanded = !item._expanded;\r
+ _data.updateItems();\r
+ adjustScrolls();\r
+ redraw();\r
+ toggled = true;\r
+ }\r
+ }\r
+ return toggled;\r
+ }\r
+\r
+ int hitTest(int x, int y) {\r
+ if (x < 0 || y < 0)\r
+ return -1;\r
+ int hit = -1;\r
+ int idx = y / _itemHeight;\r
+ idx += _topItem;\r
+ if (idx < _data._items.length)\r
+ hit = idx;\r
+ return hit;\r
+ }\r
+\r
+ int hitSplitTest(int x, int y) {\r
+ if (x < 0 || y < 0 || null == _timeProvider)\r
+ return -1;\r
+ int w = 4;\r
+ int hit = -1;\r
+ int nameWidth = _timeProvider.getNameSpace();\r
+ if (x > nameWidth - w && x < nameWidth + w)\r
+ hit = 1;\r
+ return hit;\r
+ }\r
+\r
+ public Item getItem(Point pt) {\r
+ int idx = hitTest(pt.x, pt.y);\r
+ return idx >= 0 ? (Item) _data._items[idx] : null;\r
+ }\r
+\r
+ long hitTimeTest(int x, int y) {\r
+ if (null == _timeProvider)\r
+ return -1;\r
+ long hitTime = -1;\r
+ Point size = getCtrlSize();\r
+ long time0 = _timeProvider.getTime0();\r
+ long time1 = _timeProvider.getTime1();\r
+ int nameWidth = _timeProvider.getNameSpace();\r
+ x -= nameWidth;\r
+ if (x >= 0 && size.x >= nameWidth) {\r
+ if (time1 - time0 > size.x - nameWidth - RIGHT_MARGIN) {\r
+ // get the last possible time represented by the pixel position\r
+ // by taking the time of the next pixel position minus 1 nanosecond\r
+ hitTime = time0 + (long) ((time1 - time0) * ((double) (x + 1) / (size.x - nameWidth - RIGHT_MARGIN))) - 1;\r
+ } else {\r
+ hitTime = time0 + (long) ((time1 - time0) * ((double) (x) / (size.x - nameWidth - RIGHT_MARGIN)));\r
+ }\r
+ }\r
+ return hitTime;\r
+ }\r
+\r
+ void selectItem(int idx, boolean addSelection) {\r
+ if (addSelection) {\r
+ if (idx >= 0 && idx < _data._items.length) {\r
+ Item item = (Item) _data._items[idx];\r
+ item._selected = true;\r
+ }\r
+ } else {\r
+ for (int i = 0; i < _data._items.length; i++) {\r
+ Item item = (Item) _data._items[i];\r
+ item._selected = i == idx;\r
+ }\r
+ }\r
+ boolean changed = ensureVisibleItem(idx, true);\r
+ if (!changed)\r
+ redraw();\r
+ }\r
+\r
+ public void selectItem(ITmfTimeAnalysisEntry trace, boolean addSelection) {\r
+ Integer idx = _data.findTraceItemIndex(trace);\r
+ selectItem(idx, addSelection);\r
+ }\r
+\r
+ public int countPerPage() {\r
+ int height = getCtrlSize().y;\r
+ int count = 0;\r
+ if (height > 0)\r
+ count = height / _itemHeight;\r
+ return count;\r
+ }\r
+\r
+ public int getTopIndex() {\r
+ int idx = -1;\r
+ if (_data._items.length > 0)\r
+ idx = 0;\r
+ return idx;\r
+ }\r
+\r
+ public int getBottomIndex() {\r
+ int idx = _data._items.length - 1;\r
+ return idx;\r
+ }\r
+\r
+ Point getCtrlSize() {\r
+ Point size = getSize();\r
+ if (getVerticalBar().isVisible()) {\r
+ size.x -= getVerticalBar().getSize().x;\r
+ }\r
+ if (getHorizontalBar().isVisible()) {\r
+ size.y -= getHorizontalBar().getSize().y;\r
+ }\r
+ return size;\r
+ }\r
+\r
+ void getNameRect(Rectangle rect, Rectangle bound, int idx, int nameWidth) {\r
+ idx -= _topItem;\r
+ rect.x = bound.x;\r
+ rect.y = bound.y + idx * _itemHeight;\r
+ rect.width = nameWidth;\r
+ rect.height = _itemHeight;\r
+ }\r
+\r
+ void getStatesRect(Rectangle rect, Rectangle bound, int idx, int nameWidth) {\r
+ idx -= _topItem;\r
+ rect.x = bound.x + nameWidth;\r
+ rect.y = bound.y + idx * _itemHeight;\r
+ rect.width = bound.width - rect.x;\r
+ rect.height = _itemHeight;\r
+ }\r
+\r
+ // private int getTraceNumber(int tid) {\r
+ // int num = -1;\r
+ //\r
+ // Object[] items = _data._items;\r
+ // for (int i = _topItem; i < items.length; i++) {\r
+ // Item item = (Item) items[i];\r
+ // if ((item instanceof TraceItem)) {\r
+ // TsfTmTrace trace = ((TraceItem) item)._trace;\r
+ // if (trace != null && trace.getId() == tid) {\r
+ // num = i;\r
+ // break;\r
+ // }\r
+ // }\r
+ // }\r
+ //\r
+ // return num;\r
+ // }\r
+\r
+ // private void drawArrow(GC gc, int x0, int y0, int x1, int y1, Color c) {\r
+ // gc.setForeground(c);\r
+ // gc.drawLine(x0, y0, x1, y1);\r
+ //\r
+ // if (y1 > y0) {\r
+ // gc.drawLine(x1 - 3, y1 - 3, x1, y1);\r
+ // gc.drawLine(x1 + 3, y1 - 3, x1, y1);\r
+ // } else {\r
+ // gc.drawLine(x1 - 3, y1 + 3, x1, y1);\r
+ // gc.drawLine(x1 + 3, y1 + 3, x1, y1);\r
+ // }\r
+ // }\r
+\r
+ // TODO: CC: used in the removed functionality to draw thread interactions.\r
+ // private void drawTraceThreadEvent(Rectangle bound, TsfTmEvent e,\r
+ // TsfTmTrace trace, int nItem, int color, GC gc) {\r
+ // if (trace == null)\r
+ // return;\r
+ //\r
+ // int tid = trace.getId();\r
+ // if (tid < 0 || getTraceNumber(tid) == -1)\r
+ // return;\r
+ //\r
+ // int nameWidth = _timeProvider.getNameSpace();\r
+ //\r
+ // double time0 = _timeProvider.getTime0();\r
+ // double time1 = _timeProvider.getTime1();\r
+ // if (time0 == time1)\r
+ // return;\r
+ //\r
+ // int xr = bound.x + nameWidth;\r
+ // double K = (double) (bound.width - xr) / (time1 - time0);\r
+ //\r
+ // int x0 = xr + (int) ((e.getTime() - time0) * K);\r
+ // if (x0 < xr)\r
+ // x0 = xr;\r
+ //\r
+ // int x1 = xr + (int) ((trace.getStartTime() - time0) * K);\r
+ // if (x1 < xr)\r
+ // return;\r
+ //\r
+ // int y0 = bound.y + (nItem - _topItem) * _itemHeight + 3\r
+ // + (_itemHeight - 6) / 2;\r
+ // int y1 = bound.y + (getTraceNumber(tid) - _topItem) * _itemHeight + 3\r
+ // + (_itemHeight - 6) / 2;\r
+ //\r
+ // drawArrow(gc, x0, y0, x1, y1, _colors.getColor(color));\r
+ // }\r
+\r
+ public void drawTraceEvent(Rectangle bound, ITimeEvent e, int nItem,\r
+ int color, GC gc) {\r
+ int nameWidth = _timeProvider.getNameSpace();\r
+\r
+ long time0 = _timeProvider.getTime0();\r
+ long time1 = _timeProvider.getTime1();\r
+ if (time0 == time1)\r
+ return;\r
+\r
+ int xr = bound.x + nameWidth;\r
+ double pixelsPerNanoSec = (bound.width - xr <= RIGHT_MARGIN) ? 0\r
+ : (double) (bound.width - xr - RIGHT_MARGIN) / (time1 - time0);\r
+\r
+ int x0 = xr + (int) ((e.getTime() - time0) * pixelsPerNanoSec);\r
+ if (x0 < xr)\r
+ return;\r
+\r
+ int y0 = bound.y + (nItem - _topItem) * _itemHeight + 3;\r
+\r
+ gc.setBackground(_colors.getColor(color));\r
+ int c[] = { x0 - 3, y0 - 3, x0, y0, x0 + 3, y0 - 3 };\r
+ gc.fillPolygon(c);\r
+ }\r
+\r
+ // TODO: CC:\r
+ // private void drawExecEvent(Rectangle bound, TsfTmTraceExecEventImpl e,\r
+ // int nitem, int color, GC gc) {\r
+ // List runnings = e.getRunningEvents();\r
+ // if (runnings == null)\r
+ // return;\r
+ //\r
+ // int nameWidth = _timeProvider.getNameSpace();\r
+ //\r
+ // double time0 = _timeProvider.getTime0();\r
+ // double time1 = _timeProvider.getTime1();\r
+ // if (time0 == time1)\r
+ // return;\r
+ //\r
+ // int xr = bound.x + nameWidth;\r
+ // double K = (double) (bound.width - xr) / (time1 - time0);\r
+ //\r
+ // int x0 = xr + (int) ((e.getTime() - time0) * K);\r
+ // if (x0 < xr)\r
+ // x0 = xr;\r
+ //\r
+ // Iterator it = runnings.iterator();\r
+ // while (it.hasNext()) {\r
+ // TsfTmTraceRunningEventImpl re = (TsfTmTraceRunningEventImpl) it\r
+ // .next();\r
+ // int tid = re.getThread().getId();\r
+ // if (tid < 0 || getThreadNumber(tid) == -1)\r
+ // continue;\r
+ //\r
+ // int x1 = xr + (int) ((re.getTime() - time0) * K);\r
+ // if (x1 < xr)\r
+ // continue;\r
+ //\r
+ // int y0 = bound.y + (nitem - _topItem) * _itemHeight + 3\r
+ // + (_itemHeight - 6) / 2;\r
+ // int y1 = bound.y + (getThreadNumber(tid) - _topItem) * _itemHeight\r
+ // + 3 + (_itemHeight - 6) / 2;\r
+ //\r
+ // drawArrow(gc, x0, y0, x1, y1, _colors.getColor(color));\r
+ // }\r
+ // }\r
+\r
+ public void drawTraceInteractions(Rectangle bound, GC gc) {\r
+ // int nameWidth = _timeProvider.getNameSpace();\r
+ // Object[] items = _data._items;\r
+ //\r
+ // double time0 = _timeProvider.getTime0();\r
+ // double time1 = _timeProvider.getTime1();\r
+ //\r
+ // if (time0 == time1)\r
+ // return;\r
+ //\r
+ // int xr = bound.x + nameWidth;\r
+ // double K = (double) (bound.width - xr) / (time1 - time0);\r
+\r
+ // for (int i = 0; i < items.length; i++) {\r
+ // Item item = (Item) items[i];\r
+ // if (!(item instanceof TraceItem))\r
+ // continue;\r
+ //\r
+ // TsfTmTrace trace = ((TraceItem) item)._trace;\r
+ // if (trace == null)\r
+ // continue;\r
+ //\r
+ // List<TsfTmEvent> list = trace.getTraceEvents();\r
+ // Iterator<TsfTmEvent> it = list.iterator();\r
+ // while (it.hasNext()) {\r
+ // TsfTmEvent te = (TsfTmEvent) it.next();\r
+ // TODO: CC: Thread Interactions,\r
+ // This needs to be accessed externally via a specific\r
+ // implementation.\r
+ // if (te instanceof TsfTmTraceStartThreadEventImpl) {\r
+ // TsfTmTrace child = ((TsfTmTraceStartThreadEventImpl) te)\r
+ // .getStartedThread();\r
+ // drawThreadThreadEvent(bound, te, child, i,\r
+ // TraceColorScheme.TI_START_THREAD, gc);\r
+ // } else if (te instanceof TsfTmTraceHandoffLockEventImpl) {\r
+ // if (drawThreadReleases)\r
+ // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
+ // TraceColorScheme.TI_HANDOFF_LOCK, gc);\r
+ // } else if (te instanceof TsfTmTraceNotifyAllEventImpl) {\r
+ // if (drawThreadWaits)\r
+ // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
+ // TraceColorScheme.TI_NOTIFY_ALL, gc);\r
+ // } else if (te instanceof TsfTmTraceNotifyEventImpl) {\r
+ // if (drawThreadWaits)\r
+ // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
+ // TraceColorScheme.TI_NOTIFY, gc);\r
+ // } else if (te instanceof\r
+ // TsfTmTraceDeadAndNotifyJoinedEventImpl) {\r
+ // if (drawThreadJoins)\r
+ // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
+ // TraceColorScheme.TI_NOTIFY_JOINED, gc);\r
+ // } else if (te instanceof TsfTmTraceInterruptThreadEventImpl)\r
+ // {\r
+ // if (drawThreadWaits)\r
+ // drawExecEvent(bound, (TsfTmTraceExecEventImpl) te, i,\r
+ // TraceColorScheme.TI_INTERRUPT, gc);\r
+ // } else if (te instanceof\r
+ // TsfTmTraceWaitTimeoutExceedEventImpl) {\r
+ // drawThreadEvent(bound, te, i,\r
+ // TraceColorScheme.TI_WAIT_EXCEEDED, gc);\r
+ // }\r
+ // }\r
+ // }\r
+ }\r
+\r
+ @Override\r
+ void paint(Rectangle bound, PaintEvent e) {\r
+ GC gc = e.gc;\r
+ gc.setBackground(_colors.getColor(TraceColorScheme.BACKGROUND));\r
+ drawBackground(gc, bound.x, bound.y, bound.width, bound.height);\r
+\r
+ if (bound.width < 2 || bound.height < 2 || null == _timeProvider)\r
+ return;\r
+\r
+ _idealNameWidth = 0;\r
+ int nameWidth = _timeProvider.getNameSpace();\r
+ long time0 = _timeProvider.getTime0();\r
+ long time1 = _timeProvider.getTime1();\r
+ long endTime = _timeProvider.getEndTime();\r
+ long selectedTime = _timeProvider.getSelectedTime();\r
+ // draw trace states\r
+ Object[] items = _data._items;\r
+ for (int i = _topItem; i < items.length; i++) {\r
+ Item item = (Item) items[i];\r
+ \r
+ getNameRect(_rect0, bound, i, nameWidth);\r
+ if (_rect0.y >= bound.y + bound.height)\r
+ break;\r
+\r
+ if (item instanceof GroupItem) {\r
+ getStatesRect(_rect1, bound, i, nameWidth);\r
+ _rect0.width += _rect1.width;\r
+ drawName(item, _rect0, gc);\r
+ } else {\r
+ drawName(item, _rect0, gc);\r
+ }\r
+ getStatesRect(_rect0, bound, i, nameWidth);\r
+ drawItemDataDurations(item, _rect0, time0, time1, endTime,\r
+ selectedTime, gc);\r
+ }\r
+\r
+ if (drawTracesInteraction)\r
+ drawTraceInteractions(bound, e.gc);\r
+\r
+ // draw drag line, no line if name space is 0.\r
+ if (3 == _dragState) {\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.BLACK));\r
+ gc.drawLine(bound.x + nameWidth, bound.y, bound.x + nameWidth,\r
+ bound.y + bound.height - 1);\r
+ } else if (0 == _dragState && _mouseHover\r
+ && _timeProvider.getNameSpace() > 0) {\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.RED));\r
+ gc.drawLine(bound.x + nameWidth, bound.y, bound.x + nameWidth,\r
+ bound.y + bound.height - 1);\r
+ }\r
+ }\r
+\r
+ void drawName(Item item, Rectangle rect, GC gc) {\r
+ // No name to be drawn\r
+ if (_timeProvider.getNameSpace() == 0)\r
+ return;\r
+ boolean group = item instanceof GroupItem;\r
+\r
+ int elemHeight = rect.height / 2;\r
+ int elemWidth = elemHeight;\r
+ String name = item._name;\r
+ if (group) {\r
+ gc.setBackground(_colors\r
+ .getBkColorGroup(item._selected, _isInFocus));\r
+ gc.fillRectangle(rect);\r
+ if (item._selected && _isInFocus) {\r
+ gc.setForeground(_colors.getBkColor(item._selected, _isInFocus,\r
+ false));\r
+ gc.drawRectangle(rect.x, rect.y, rect.width - 2,\r
+ rect.height - 2);\r
+ }\r
+ gc.setForeground(_colors.getBkColor(false, false, false));\r
+ gc.drawLine(rect.x, rect.y + rect.height - 1, rect.width - 1,\r
+ rect.y + rect.height - 1);\r
+ gc.setForeground(_colors.getFgColorGroup(false, false));\r
+ gc.setBackground(_colors.getBkColor(false, false, false));\r
+ Utils.init(_rect1, rect);\r
+ _rect1.x += MARGIN;\r
+ _rect1.y += (rect.height - elemHeight) / 2;\r
+ _rect1.width = elemWidth;\r
+ _rect1.height = elemHeight;\r
+ // Get the icon rectangle in the group items\r
+ gc.fillRectangle(_rect1);\r
+ gc.drawRectangle(_rect1.x, _rect1.y, _rect1.width - 1,\r
+ _rect1.height - 1);\r
+ int p = _rect1.y + _rect1.height / 2;\r
+ gc.drawLine(_rect1.x + 2, p, _rect1.x + _rect1.width - 3, p);\r
+ if (!item._expanded) {\r
+ p = _rect1.x + _rect1.width / 2;\r
+ gc.drawLine(p, _rect1.y + 2, p, _rect1.y + _rect1.height - 3);\r
+ }\r
+ gc.setForeground(_colors\r
+ .getFgColorGroup(item._selected, _isInFocus));\r
+ elemWidth += MARGIN;\r
+ } else {\r
+ gc.setBackground(_colors.getBkColor(item._selected, _isInFocus,\r
+ true));\r
+ gc.setForeground(_colors.getFgColor(item._selected, _isInFocus));\r
+ gc.fillRectangle(rect);\r
+ Utils.init(_rect1, rect);\r
+ _rect1.x += MARGIN;\r
+ // draw icon\r
+ ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
+ Image img = utilImpl.getItemImage(trace);\r
+ if (null != img) {\r
+ _rect1.y += (rect.height - img.getImageData().height) / 2;\r
+ gc.drawImage(img, _rect1.x, _rect1.y);\r
+ }\r
+ elemWidth = SMALL_ICON_SIZE;\r
+ // cut long string with "..."\r
+ Point size = gc.stringExtent(name);\r
+ if (_idealNameWidth < size.x)\r
+ _idealNameWidth = size.x;\r
+ int width = rect.width - MARGIN - MARGIN - elemWidth;\r
+ int cuts = 0;\r
+ while (size.x > width && name.length() > 1) {\r
+ cuts++;\r
+ name = name.substring(0, name.length() - 1);\r
+ size = gc.stringExtent(name + "...");\r
+ }\r
+ if (cuts > 0)\r
+ name += "...";\r
+ elemWidth += MARGIN;\r
+ }\r
+ Utils.init(_rect1, rect);\r
+ int leftMargin = MARGIN + elemWidth;\r
+ _rect1.x += leftMargin;\r
+ _rect1.width -= leftMargin;\r
+ int textWidth = 0;\r
+ // draw text\r
+ if (_rect1.width > 0) {\r
+ _rect1.y += 2;\r
+ textWidth = Utils.drawText(gc, name, _rect1, true) + 8;\r
+ _rect1.y -= 2;\r
+ }\r
+ // draw middle line\r
+ if (_rect1.width > 0 && !group) {\r
+ Utils.init(_rect1, rect);\r
+ _rect1.x += leftMargin + textWidth;\r
+ _rect1.width -= textWidth;\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.MID_LINE));\r
+ int midy = _rect1.y + _rect1.height / 2;\r
+ gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
+ }\r
+ // gc.drawLine(_rect1.x + _rect1.width - 1, _rect1.y, _rect1.x +\r
+ // _rect1.width - 1, _rect1.y + _rect1.height);\r
+ }\r
+\r
+ void drawItemData(Item item, Rectangle rect, long time0, long time1,\r
+ long endTime, long selectedTime, GC gc) {\r
+ if (rect.isEmpty())\r
+ return;\r
+ if (time1 <= time0) {\r
+ gc.setBackground(_colors.getBkColor(false, false, false));\r
+ gc.fillRectangle(rect);\r
+ return;\r
+ }\r
+\r
+ Utils.init(_rect1, rect);\r
+ boolean selected = item._selected;\r
+ double pixelsPerNanoSec = (rect.width <= RIGHT_MARGIN) ? 0\r
+ : (double) (rect.width - RIGHT_MARGIN) / (time1 - time0);\r
+ boolean group = item instanceof GroupItem;\r
+\r
+ if (group) {\r
+ // gc.setBackground(_colors.getBkColorGroup(selected, _isInFocus));\r
+ // gc.fillRectangle(rect);\r
+ } else if (item instanceof TraceItem) {\r
+ ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
+\r
+ int x0 = rect.x;\r
+ List<TimeEvent> list = trace.getTraceEvents();\r
+ // Iterator it = list.iterator();\r
+ int count = list.size();\r
+ ITimeEvent lastEvent = null;\r
+ if (count > 0) {\r
+ ITimeEvent currEvent = list.get(0);\r
+ ITimeEvent nextEvent = null;\r
+ long currEventTime = currEvent.getTime();\r
+ long nextEventTime = currEventTime;\r
+ x0 = rect.x + (int) ((currEventTime - time0) * pixelsPerNanoSec);\r
+ int xEnd = rect.x + (int) ((time1 - time0) * pixelsPerNanoSec);\r
+ int x1 = -1;\r
+ int idx = 1;\r
+\r
+ // reduce rect\r
+ _rect1.y += 3;\r
+ _rect1.height -= 6;\r
+ fillSpace(rect, gc, selected, _rect1.x, x0, xEnd);\r
+\r
+ // draw event states\r
+ while (x0 <= xEnd && null != currEvent) {\r
+ boolean stopped = false;// currEvent instanceof\r
+ // TsfTmTraceDeadEvent;\r
+ if (idx < count) {\r
+ nextEvent = list.get(idx);\r
+ nextEventTime = nextEvent.getTime();\r
+ idx++;\r
+ } else if (stopped) {\r
+ nextEvent = null;\r
+ nextEventTime = time1;\r
+ } else {\r
+ nextEvent = null;\r
+ nextEventTime = endTime;\r
+ }\r
+ x1 = rect.x + (int) ((nextEventTime - time0) * pixelsPerNanoSec);\r
+ if (x1 >= rect.x) {\r
+ _rect1.x = x0 >= rect.x ? x0 : rect.x;\r
+ _rect1.width = (x1 <= xEnd ? x1 : xEnd) - _rect1.x;\r
+ boolean timeSelected = currEventTime <= selectedTime\r
+ && selectedTime < nextEventTime;\r
+ // Trace.debug("Drawing rectangle: " + _rect1.x + ","\r
+ // + _rect1.y + "," + _rect1.height + ", "\r
+ // + _rect1.width + "-->"\r
+ // + ((int) _rect1.x + (int) _rect1.width));\r
+ utilImpl.drawState(_colors, currEvent, _rect1, gc,\r
+ selected, false, timeSelected);\r
+ }\r
+ lastEvent = currEvent;\r
+ currEvent = nextEvent;\r
+ currEventTime = nextEventTime;\r
+ x0 = x1;\r
+ }\r
+ }\r
+\r
+ // fill space after last event\r
+ int xEnd = rect.x + rect.width;\r
+ if (x0 < xEnd) {\r
+ _rect1.x = x0 >= rect.x ? x0 : rect.x;\r
+ _rect1.width = xEnd - _rect1.x;\r
+ gc.setBackground(_colors\r
+ .getBkColor(selected, _isInFocus, false));\r
+ gc.fillRectangle(_rect1);\r
+ // draw middle line\r
+ gc.setForeground(_colors.getColor(utilImpl\r
+ .getEventColorVal(lastEvent)));\r
+ int midy = _rect1.y + _rect1.height / 2;\r
+ int lw = gc.getLineWidth();\r
+ gc.setLineWidth(2);\r
+ gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
+ gc.setLineWidth(lw);\r
+ }\r
+\r
+ // draw focus ares\r
+ Utils.init(_rect1, rect);\r
+ gc.setForeground(_colors.getBkColor(selected, _isInFocus, false));\r
+ int y = _rect1.y;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y++;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y++;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y = _rect1.y + _rect1.height - 1;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y--;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y--;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ }\r
+\r
+ // draw selected time\r
+ int x = rect.x + (int) ((selectedTime - time0) * pixelsPerNanoSec);\r
+ if (x >= rect.x && x < rect.x + rect.width) {\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.SELECTED_TIME));\r
+ if (group)\r
+ gc.drawLine(x, rect.y + rect.height - 1, x, rect.y\r
+ + rect.height);\r
+ else\r
+ gc.drawLine(x, rect.y, x, rect.y + rect.height);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Represent the event in series of bursts rather than sequence of states\r
+ * \r
+ * @param item\r
+ * @param rect\r
+ * - The container rectangle to be colored to different states\r
+ * @param time0\r
+ * - Base time of all events\r
+ * @param time1\r
+ * - End time of all events\r
+ * @param endTime\r
+ * @param selectedTime\r
+ * @param gc\r
+ */\r
+ void drawItemDataBurst(Item item, Rectangle rect, long time0, long time1,\r
+ long endTime, long selectedTime, GC gc) {\r
+ if (rect.isEmpty())\r
+ return;\r
+ if (time1 <= time0) {\r
+ gc.setBackground(_colors.getBkColor(false, false, false));\r
+ gc.fillRectangle(rect);\r
+ return;\r
+ }\r
+\r
+ // Initialize _rect1 to same values as enclosing rectangle rect\r
+ Utils.init(_rect1, rect);\r
+ boolean selected = item._selected;\r
+ // K pixels per second\r
+ double pixelsPerNanoSec = (rect.width <= RIGHT_MARGIN) ? 0\r
+ : (double) (rect.width - RIGHT_MARGIN) / (time1 - time0);\r
+ // Trace.debug("Value of K: " + K + " width:" + rect.width + " time0: "\r
+ // + time0 + " time1:" + time1 + " endTime: " + endTime);\r
+\r
+ boolean group = item instanceof GroupItem;\r
+\r
+ if (group) {\r
+ // gc.setBackground(_colors.getBkColorGroup(selected, _isInFocus));\r
+ // gc.fillRectangle(rect);\r
+ // if (Trace.isDEBUG()) {\r
+ // Trace.debug("Group");\r
+ // }\r
+ } else if (item instanceof TraceItem) {\r
+ ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
+\r
+ double x0 = rect.x;\r
+ List<TimeEvent> list = trace.getTraceEvents();\r
+ // Iterator it = list.iterator();\r
+ int count = list.size();\r
+ ITimeEvent lastEvent = null;\r
+ // Trace.debug("count is: " + count);\r
+ if (count > 0) {\r
+ ITimeEvent currEvent = list.get(0);\r
+ ITimeEvent nextEvent = null;\r
+ long currEventTime = currEvent.getTime();\r
+ long nextEventTime = currEventTime;\r
+ // x0 - Points to the beginning of the event being drawn\r
+ double step = (double) ((currEventTime - time0) * pixelsPerNanoSec);\r
+ x0 = rect.x + step;\r
+ // xEnd - Points to the end of the events rectangle\r
+ double xEnd = rect.x + (double) ((time1 - time0) * pixelsPerNanoSec);\r
+ double x1 = -1;\r
+ int idx = 1;\r
+ double xNext = 0;\r
+\r
+ // Drawing rectangle is smaller than reserved space\r
+ _rect1.y += 3;\r
+ _rect1.height -= 6;\r
+\r
+ // Clean up to empty line to draw on top\r
+ fillSpace(rect, gc, selected, _rect1.x, xEnd, xEnd);\r
+ // draw event states\r
+ while (x0 <= xEnd && null != currEvent) {\r
+ boolean stopped = false;// currEvent instanceof\r
+ // TsfTmTraceDeadEvent;\r
+ if (idx < count) {\r
+ nextEvent = list.get(idx);\r
+ nextEventTime = nextEvent.getTime();\r
+ idx++;\r
+ } else if (stopped) {\r
+ nextEvent = null;\r
+ nextEventTime = time1;\r
+ } else {\r
+ nextEvent = null;\r
+ nextEventTime = endTime;\r
+ // Trace\r
+ // .debug("nexEventTime is endTime: "\r
+ // + nextEventTime);\r
+ }\r
+\r
+ // Draw it as a burst, one unit of width.\r
+ x1 = x0 + (int) 2;\r
+ if (x1 >= rect.x && x0 <= xEnd) {\r
+ // Fill with space until x0\r
+ _rect1.x = (int) (x0 >= rect.x ? x0 : rect.x);\r
+ _rect1.width = (int) ((x1 <= xEnd ? x1 : xEnd) - _rect1.x);\r
+ boolean timeSelected = currEventTime <= selectedTime\r
+ && selectedTime < nextEventTime;\r
+ utilImpl.drawState(_colors, currEvent, _rect1, gc,\r
+ selected, false, timeSelected);\r
+ // Trace.debug("Drawing rectangle: " + _rect1.x + ","\r
+ // + _rect1.y + "," + _rect1.height + ", "\r
+ // + _rect1.width + "-->"\r
+ // + ((int) _rect1.x + (int) _rect1.width));\r
+ // Advance rectangle to next start position and Fill\r
+ // with space until next event\r
+ _rect1.x += _rect1.width;\r
+ x0 = x1;\r
+ xNext = rect.x + (double) ((nextEventTime - time0) * pixelsPerNanoSec);\r
+ }\r
+ // Fill space till next event\r
+ fillSpace(rect, gc, selected, x0, xNext, xEnd);\r
+\r
+ lastEvent = currEvent;\r
+ currEvent = nextEvent;\r
+ currEventTime = nextEventTime;\r
+ // Move x0 to the beginning of next event\r
+ x0 = rect.x + (double) ((nextEventTime - time0) * pixelsPerNanoSec);\r
+ // Trace.debug("rect.x: " + rect.x + " + " +\r
+ // "(nextEvenTime: "\r
+ // + nextEventTime + "- time0: " + time0 + ") * K: "\r
+ // + K + " = " + x0);\r
+ }\r
+ }\r
+\r
+ // fill space after last event\r
+ int xEnd = rect.x + rect.width;\r
+ if (x0 < xEnd) {\r
+ // Trace.debug("Space after last event, x0: " + x0 + ", xEnd: "\r
+ // + xEnd);\r
+ _rect1.x = (int) (x0 >= rect.x ? x0 : rect.x);\r
+ _rect1.width = xEnd - _rect1.x;\r
+ gc.setBackground(_colors\r
+ .getBkColor(selected, _isInFocus, false));\r
+ gc.fillRectangle(_rect1);\r
+ // draw middle line\r
+ gc.setForeground(_colors.getColor(utilImpl\r
+ .getEventColorVal(lastEvent)));\r
+ int midy = _rect1.y + _rect1.height / 2;\r
+ int lw = gc.getLineWidth();\r
+ gc.setLineWidth(2);\r
+ gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
+ gc.setLineWidth(lw);\r
+ }\r
+\r
+ // draw focus area\r
+ Utils.init(_rect1, rect);\r
+ gc.setForeground(_colors.getBkColor(selected, _isInFocus, false));\r
+ int y = _rect1.y;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y++;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y++;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y = _rect1.y + _rect1.height - 1;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y--;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y--;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ }\r
+\r
+ // draw selected time\r
+ int x = rect.x + (int) ((selectedTime - time0) * pixelsPerNanoSec);\r
+ if (x >= rect.x && x < rect.x + rect.width) {\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.SELECTED_TIME));\r
+ if (group)\r
+ gc.drawLine(x, rect.y + rect.height - 1, x, rect.y\r
+ + rect.height);\r
+ else\r
+ gc.drawLine(x, rect.y, x, rect.y + rect.height);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Represent the series of events with specified durations\r
+ * \r
+ * @param item\r
+ * @param rect\r
+ * - The container rectangle to be colored to different states\r
+ * @param time0\r
+ * - Base time of all events - start of visible window\r
+ * @param time1\r
+ * - End time of visible events - end time of visible window\r
+ * @param endTime\r
+ * - End time of all events - may not be visible in selected\r
+ * visible window\r
+ * @param selectedTime\r
+ * @param gc\r
+ */\r
+ void drawItemDataDurations(Item item, Rectangle rect, long time0,\r
+ long time1, long endTime, long selectedTime, GC gc) {\r
+ if (rect.isEmpty())\r
+ return;\r
+ if (time1 <= time0) {\r
+ gc.setBackground(_colors.getBkColor(false, false, false));\r
+ gc.fillRectangle(rect);\r
+ return;\r
+ }\r
+\r
+ // Initialize _rect1 to same values as enclosing rectangle rect\r
+ Utils.init(_rect1, rect);\r
+ boolean selected = item._selected;\r
+ // K pixels per second\r
+ double pixelsPerNanoSec = (rect.width <= RIGHT_MARGIN) ? 0\r
+ : (double) (rect.width - RIGHT_MARGIN) / (time1 - time0);\r
+ // Trace.debug("Value of K: " + K + " width:" + rect.width + " time0: "\r
+ // + time0 + " time1:" + time1 + " endTime: " + endTime);\r
+\r
+ boolean group = item instanceof GroupItem;\r
+\r
+ if (group) {\r
+ // gc.setBackground(_colors.getBkColorGroup(selected, _isInFocus));\r
+ // gc.fillRectangle(rect);\r
+ } else if (item instanceof TraceItem) {\r
+ ITmfTimeAnalysisEntry trace = ((TraceItem) item)._trace;\r
+\r
+ double x0 = rect.x;\r
+ List<TimeEvent> list = trace.getTraceEvents();\r
+ // Iterator it = list.iterator();\r
+ int count = list.size();\r
+ // ITimeEvent lastEvent = null;\r
+ // if (Trace.isDEBUG()) {\r
+ // Trace.debug("\n\t\t\tTrace: " + trace.getName()\r
+ // + utilImpl.getTraceClassName(trace));\r
+ // }\r
+ // Trace.debug("count is: " + count);\r
+ // Drawing rectangle is smaller than reserved space\r
+ _rect1.y += 3;\r
+ _rect1.height -= 6;\r
+\r
+ // Clean up to empty line to draw on top\r
+ int xEnd = rect.x + rect.width;\r
+ fillSpace(rect, gc, selected, _rect1.x, xEnd, xEnd);\r
+ if (count > 0) {\r
+ ITimeEvent currEvent = list.get(0);\r
+ ITimeEvent nextEvent = null;\r
+ long currEventTime = currEvent.getTime();\r
+ long currEventDuration = currEvent.getDuration();\r
+ // initial value\r
+ long nextEventTime = currEventTime;\r
+ // x0 - Points to the beginning of the event being drawn\r
+ double step = (double) ((currEventTime - time0) * pixelsPerNanoSec);\r
+ x0 = rect.x + step;\r
+ // xEnd - Points to the end of the events rectangle\r
+ double x1 = -1;\r
+ int idx = 1;\r
+ double xNext = 0;\r
+\r
+ // draw event states\r
+ while (/* x0 <= xEnd &&*/ null != currEvent) {\r
+ boolean stopped = false;// currEvent instanceof\r
+ // refresh current event duration as the loop moves\r
+ currEventDuration = currEvent.getDuration();\r
+ // TsfTmTraceDeadEvent;\r
+ if (idx < count) {\r
+ nextEvent = list.get(idx);\r
+ nextEventTime = nextEvent.getTime();\r
+ idx++;\r
+ } else if (stopped) {\r
+ nextEvent = null;\r
+ nextEventTime = time1;\r
+ } else {\r
+ nextEvent = null;\r
+ nextEventTime = endTime;\r
+ // Trace\r
+ // .debug("nexEventTime is endTime: "\r
+ // + nextEventTime);\r
+ }\r
+\r
+ // Calculate position to next event\r
+ xNext = rect.x + (double) ((nextEventTime - time0) * pixelsPerNanoSec);\r
+\r
+ // Calculate end position of current event\r
+ if (currEventDuration < 0) {\r
+ x1 = rect.x + (double) ((nextEventTime - time0) * pixelsPerNanoSec);\r
+ } else if (currEventDuration == 0) {\r
+ x1 = x0;\r
+ } else {\r
+ x1 = x0 + (double) ((currEventDuration) * pixelsPerNanoSec);\r
+ }\r
+\r
+ // If event end position x1 further away than start position\r
+ // of\r
+ // next event, cut width till next event\r
+ // Trace.debug("Next Event Pos: " + xNext\r
+ // + " End Of Current at: " + x1 + " Event Duration: "\r
+ // + currEventDuration);\r
+ if (currEventDuration != 0) {\r
+ x1 = x1 > xNext ? xNext : x1;\r
+ }\r
+ // if event end boundary is within time range\r
+ if (x1 >= rect.x && x0 <= xEnd) {\r
+ if (currEventDuration != 0) {\r
+ x0 = (double) (x0 >= rect.x ? x0 : rect.x);\r
+ _rect1.width = (int) ((x1 <= xEnd ? x1 : xEnd) - x0);\r
+ } else {\r
+ _rect1.width = 2; // make punctual events 2 pixels wide\r
+ }\r
+ _rect1.x = (int) x0;\r
+ boolean timeSelected = currEventTime <= selectedTime\r
+ && selectedTime < nextEventTime;\r
+ utilImpl.drawState(_colors, currEvent, _rect1, gc,\r
+ selected, false, timeSelected);\r
+ // Trace.debug("Drawing rectangle: " + _rect1.x + ","\r
+ // + _rect1.y + "," + _rect1.height + ", "\r
+ // + _rect1.width + "-->"\r
+ // + ((int) _rect1.x + (int) _rect1.width));\r
+ // Advance rectangle to next start position and Fill\r
+ // with space until next event\r
+ _rect1.x += _rect1.width;\r
+ x0 = _rect1.x;\r
+ }\r
+\r
+ // Fill space till next event\r
+ // fillSpace(rect, gc, selected, x0, xNext, xEnd);\r
+\r
+ // lastEvent = currEvent;\r
+ currEvent = nextEvent;\r
+ currEventTime = nextEventTime;\r
+ // Move x0 to the beginning of next event\r
+ x0 = rect.x + (double) ((nextEventTime - time0) * pixelsPerNanoSec);\r
+ // Trace.debug("rect.x: " + rect.x + " + " +\r
+ // "(nextEvenTime: "\r
+ // + nextEventTime + "- time0: " + time0 + ") * K: "\r
+ // + K + " = " + x0);\r
+ }\r
+ }\r
+\r
+ // draw focus area\r
+ Utils.init(_rect1, rect);\r
+ gc.setForeground(_colors.getBkColor(selected, _isInFocus, false));\r
+ int y = _rect1.y;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y++;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y++;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y = _rect1.y + _rect1.height - 1;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y--;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ y--;\r
+ gc.drawLine(_rect1.x, y, _rect1.x + _rect1.width, y);\r
+ }\r
+\r
+ // draw selected time\r
+ int x = rect.x + (int) ((double) (selectedTime - time0) * pixelsPerNanoSec);\r
+ if (x >= rect.x && x < rect.x + rect.width) {\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.SELECTED_TIME));\r
+ if (group)\r
+ gc.drawLine(x, rect.y + rect.height - 1, x, rect.y\r
+ + rect.height);\r
+ else\r
+ gc.drawLine(x, rect.y, x, rect.y + rect.height);\r
+ }\r
+ }\r
+\r
+ private void fillSpace(Rectangle rect, GC gc, boolean selected, double x0,\r
+ double x1, double xEnd) {\r
+ // fill space before first event\r
+ if (x0 >= rect.x && x0 < xEnd) {\r
+ // _rect1.width = (int) ((x1 <= xEnd ? x1 : xEnd) - x0);\r
+ // Trace.debug("Drawing Space: " + _rect1.x + "," + _rect1.y + ","\r
+ // + _rect1.height + ", " + _rect1.width + "--> "\r
+ // + ((int) _rect1.x + (int) _rect1.width));\r
+\r
+ // if (_rect1.width < 0) {\r
+ // Trace.debug("Incorrect width:" + _rect1.width);\r
+ // }\r
+ gc.setBackground(_colors.getBkColor(selected, _isInFocus, false));\r
+ gc.fillRectangle(_rect1);\r
+ // draw middle line\r
+ gc.setForeground(_colors.getColor(TraceColorScheme.MID_LINE));\r
+ int midy = _rect1.y + _rect1.height / 2;\r
+ gc.drawLine(_rect1.x, midy, _rect1.x + _rect1.width, midy);\r
+ } else {\r
+ // Trace.debug("No space added since, x0 is out of range " + x0\r
+ // + " rect.x: " + rect.x + " xEnd: " + xEnd);\r
+ }\r
+ }\r
+\r
+ public void keyTraversed(TraverseEvent e) {\r
+ if ((e.detail == SWT.TRAVERSE_TAB_NEXT)\r
+ || (e.detail == SWT.TRAVERSE_TAB_PREVIOUS))\r
+ e.doit = true;\r
+ }\r
+\r
+ public void keyPressed(KeyEvent e) {\r
+ int idx = -1;\r
+ if (SWT.HOME == e.keyCode) {\r
+ idx = getTopIndex();\r
+ } else if (SWT.END == e.keyCode) {\r
+ idx = getBottomIndex();\r
+ } else if (SWT.ARROW_DOWN == e.keyCode) {\r
+ idx = getSelectedIndex();\r
+ if (idx < 0)\r
+ idx = 0;\r
+ else if (idx < _data._items.length - 1)\r
+ idx++;\r
+ } else if (SWT.ARROW_UP == e.keyCode) {\r
+ idx = getSelectedIndex();\r
+ if (idx < 0)\r
+ idx = 0;\r
+ else if (idx > 0)\r
+ idx--;\r
+ } else if (SWT.ARROW_LEFT == e.keyCode) {\r
+ selectPrevEvent();\r
+ } else if (SWT.ARROW_RIGHT == e.keyCode) {\r
+ selectNextEvent();\r
+ } else if (SWT.PAGE_DOWN == e.keyCode) {\r
+ int page = countPerPage();\r
+ idx = getSelectedIndex();\r
+ if (idx < 0)\r
+ idx = 0;\r
+ idx += page;\r
+ if (idx >= _data._items.length)\r
+ idx = _data._items.length - 1;\r
+ } else if (SWT.PAGE_UP == e.keyCode) {\r
+ int page = countPerPage();\r
+ idx = getSelectedIndex();\r
+ if (idx < 0)\r
+ idx = 0;\r
+ idx -= page;\r
+ if (idx < 0)\r
+ idx = 0;\r
+ } else if (SWT.CR == e.keyCode) {\r
+ idx = getSelectedIndex();\r
+ if (idx >= 0) {\r
+ if (_data._items[idx] instanceof TraceItem)\r
+ fireDefaultSelection();\r
+ else if (_data._items[idx] instanceof GroupItem)\r
+ toggle(idx);\r
+ }\r
+ idx = -1;\r
+ }\r
+ if (idx >= 0) {\r
+ selectItem(idx, false);\r
+ fireSelectionChanged();\r
+ }\r
+ }\r
+\r
+ public void keyReleased(KeyEvent e) {\r
+ }\r
+\r
+ public void focusGained(FocusEvent e) {\r
+ _isInFocus = true;\r
+ redraw();\r
+ getDisplay().addFilter(SWT.MouseWheel, mouseScrollFilterListener);\r
+ }\r
+\r
+ public void focusLost(FocusEvent e) {\r
+ _isInFocus = false;\r
+ if (0 != _dragState) {\r
+ setCapture(false);\r
+ _dragState = 0;\r
+ }\r
+ redraw();\r
+ getDisplay().removeFilter(SWT.MouseWheel, mouseScrollFilterListener);\r
+ }\r
+\r
+ public boolean isInFocus() {\r
+ return _isInFocus;\r
+ }\r
+\r
+ public void mouseMove(MouseEvent e) {\r
+ if (null == _timeProvider)\r
+ return;\r
+ Point size = getCtrlSize();\r
+ if (1 == _dragState) {\r
+ int nameWidth = _timeProvider.getNameSpace();\r
+ int x = e.x - nameWidth;\r
+ if (x > 0 && size.x > nameWidth && _dragX != x) {\r
+ _dragX = x;\r
+ double pixelsPerNanoSec = (size.x - nameWidth <= RIGHT_MARGIN) ? 0\r
+ : (double) (size.x - nameWidth - RIGHT_MARGIN) / (_time1bak - _time0bak);\r
+ long timeDelta = (long) ((pixelsPerNanoSec == 0) ? 0 : ((_dragX - _dragX0) / pixelsPerNanoSec));\r
+ long time1 = _time1bak - timeDelta;\r
+ long maxTime = _timeProvider.getMaxTime();\r
+ if (time1 > maxTime)\r
+ time1 = maxTime;\r
+ long time0 = time1 - (_time1bak - _time0bak);\r
+ if (time0 < _timeProvider.getMinTime()) {\r
+ time0 = _timeProvider.getMinTime();\r
+ time1 = time0 + (_time1bak - _time0bak);\r
+ }\r
+ _timeProvider.setStartFinishTime(time0, time1);\r
+ }\r
+ } else if (3 == _dragState) {\r
+ _dragX = e.x;\r
+ _timeProvider.setNameSpace(_hitIdx + _dragX - _dragX0);\r
+ } else if (0 == _dragState) {\r
+ boolean mouseHover = hitSplitTest(e.x, e.y) > 0;\r
+ if (_mouseHover != mouseHover)\r
+ redraw();\r
+ _mouseHover = mouseHover;\r
+ // Make sure any time changes are notified to the application e.g.\r
+ // getting back from the horizontal scroll bar or zoomed using the\r
+ // mouse wheel\r
+ _timeProvider.notifyStartFinishTime();\r
+ }\r
+ updateCursor(e.x, e.y);\r
+ }\r
+\r
+ public void mouseDoubleClick(MouseEvent e) {\r
+ if (null == _timeProvider)\r
+ return;\r
+ if (1 == e.button) {\r
+ int idx = hitSplitTest(e.x, e.y);\r
+ if (idx >= 0) {\r
+ _timeProvider.setNameSpace(_idealNameWidth + 3 * MARGIN\r
+ + SMALL_ICON_SIZE);\r
+ return;\r
+ }\r
+ idx = hitTest(e.x, e.y);\r
+ if (idx >= 0) {\r
+ selectItem(idx, false);\r
+ if (_data._items[idx] instanceof TraceItem) {\r
+ fireDefaultSelection();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * <p>\r
+ * If the x, y position is over the vertical split line (name to time\r
+ * ranges), then change the cursor to a drag cursor to indicate the user the\r
+ * possibility of resizing\r
+ * </p>\r
+ * \r
+ * @param x\r
+ * @param y\r
+ */\r
+ void updateCursor(int x, int y) {\r
+ // if Wait cursor not active, check for the need to change to a drag\r
+ // cursor\r
+ if (_isWaitCursor == false) {\r
+ int idx = hitSplitTest(x, y);\r
+ // No dragcursor is name space is fixed to zero\r
+ if (idx > 0 && !_isDragCursor3 && _timeProvider.getNameSpace() > 0) {\r
+ setCursor(_dragCursor3);\r
+ _isDragCursor3 = true;\r
+ } else if (idx <= 0 && _isDragCursor3) {\r
+ setCursor(null);\r
+ _isDragCursor3 = false;\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Provide the possibilty to control the wait cursor externally e.g. data\r
+ * requests in progress\r
+ * \r
+ * @param waitInd\r
+ */\r
+ public void waitCursor(boolean waitInd) {\r
+ // Update cursor as indicated\r
+ if (waitInd) {\r
+ setCursor(_WaitCursor);\r
+ _isWaitCursor = true;\r
+ } else {\r
+ setCursor(null);\r
+ _isWaitCursor = false;\r
+ }\r
+\r
+ // Get ready for next mouse move\r
+ _isDragCursor3 = false;\r
+ }\r
+\r
+ public void mouseDown(MouseEvent e) {\r
+ if (null == _timeProvider)\r
+ return;\r
+ int idx;\r
+ if (1 == e.button) {\r
+ int namewidth = _timeProvider.getNameSpace();\r
+ if (namewidth != 0) {\r
+ idx = hitSplitTest(e.x, e.y);\r
+ if (idx > 0) {\r
+ _dragState = 3;\r
+ _dragX = _dragX0 = e.x;\r
+ _hitIdx = _timeProvider.getNameSpace();\r
+ ;\r
+ _time0bak = _timeProvider.getTime0();\r
+ _time1bak = _timeProvider.getTime1();\r
+ redraw();\r
+ return;\r
+ }\r
+ }\r
+\r
+ idx = hitTest(e.x, e.y);\r
+ if (idx >= 0) {\r
+ if (_data._items[idx] instanceof TraceItem) {\r
+ long hitTime = hitTimeTest(e.x, e.y);\r
+ if (hitTime >= 0) {\r
+ _timeProvider.setSelectedTimeInt(hitTime, false);\r
+ setCapture(true);\r
+ _dragState = 1;\r
+ _dragX = _dragX0 = e.x - _timeProvider.getNameSpace();\r
+ _time0bak = _timeProvider.getTime0();\r
+ _time1bak = _timeProvider.getTime1();\r
+ }\r
+ } else if (_data._items[idx] instanceof GroupItem) {\r
+ _hitIdx = idx;\r
+ _dragState = 2;\r
+ }\r
+ selectItem(idx, false);\r
+ fireSelectionChanged();\r
+ } else {\r
+ selectItem(idx, false); // clear selection\r
+ }\r
+ }\r
+ }\r
+\r
+ public void mouseUp(MouseEvent e) {\r
+ if (0 != _dragState) {\r
+ setCapture(false);\r
+ if (1 == _dragState) {\r
+ // Notify time provider to check the need for listener notification\r
+ _timeProvider.notifyStartFinishTime();\r
+ } else if (2 == _dragState) {\r
+ if (hitTest(e.x, e.y) == _hitIdx)\r
+ toggle(_hitIdx);\r
+ } else if (3 == _dragState) {\r
+ redraw();\r
+ }\r
+ _dragState = 0;\r
+ }\r
+ }\r
+\r
+ public void controlMoved(ControlEvent e) {\r
+ }\r
+\r
+ public void controlResized(ControlEvent e) {\r
+ adjustScrolls();\r
+ }\r
+\r
+ public void widgetDefaultSelected(SelectionEvent e) {\r
+ }\r
+\r
+ public void widgetSelected(SelectionEvent e) {\r
+ if (e.widget == getVerticalBar()) {\r
+ _topItem = getVerticalBar().getSelection();\r
+ if (_topItem < 0)\r
+ _topItem = 0;\r
+ redraw();\r
+ } else if (e.widget == getHorizontalBar() && null != _timeProvider) {\r
+ int start = getHorizontalBar().getSelection();\r
+ long time0 = _timeProvider.getTime0();\r
+ long time1 = _timeProvider.getTime1();\r
+ long timeMin = _timeProvider.getMinTime();\r
+ long timeMax = _timeProvider.getMaxTime();\r
+ long delta = timeMax - timeMin;\r
+\r
+ long range = time1 - time0;\r
+ // _timeRangeFixed = true;\r
+ time0 = timeMin + (long) (delta * ((double) start / H_SCROLLBAR_MAX));\r
+ time1 = time0 + range;\r
+\r
+ // TODO: Follow-up with Bug 310310\r
+ // In Linux SWT.DRAG is the only value received\r
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=310310\r
+ if (e.detail == SWT.DRAG) {\r
+ _timeProvider.setStartFinishTime(time0, time1);\r
+ } else {\r
+ _timeProvider.setStartFinishTimeNotify(time0, time1);\r
+ }\r
+ }\r
+ }\r
+\r
+ public void mouseEnter(MouseEvent e) {\r
+ }\r
+\r
+ public void mouseExit(MouseEvent e) {\r
+ if (_mouseHover) {\r
+ _mouseHover = false;\r
+ redraw();\r
+ }\r
+ }\r
+\r
+ public void mouseHover(MouseEvent e) {\r
+ }\r
+\r
+ public void mouseScrolled(MouseEvent e) {\r
+ if (!_isInFocus)\r
+ return;\r
+ if (e.count > 0) {\r
+ zoom(true);\r
+ } else if (e.count < 0) {\r
+ zoom(false);\r
+ }\r
+ }\r
+\r
+ public boolean isVisibleVerticalScroll() {\r
+ return _visibleVerticalScroll;\r
+ }\r
+\r
+ public void setVisibleVerticalScroll(boolean visibleVerticalScroll) {\r
+ ScrollBar scrollVer = getVerticalBar();\r
+ if (scrollVer != null) {\r
+ scrollVer.setVisible(visibleVerticalScroll);\r
+ }\r
+ this._visibleVerticalScroll = visibleVerticalScroll;\r
+ }\r
+\r
+ @Override\r
+ public int getBorderWidth() {\r
+ return _borderWidth;\r
+ }\r
+\r
+ public void setBorderWidth(int borderWidth) {\r
+ this._borderWidth = borderWidth;\r
+ }\r
+\r
+ public int getHeaderHeight() {\r
+ return _headerHeight;\r
+ }\r
+\r
+ public void setHeaderHeight(int headerHeight) {\r
+ this._headerHeight = headerHeight;\r
+ }\r
+\r
+ public int getItemHeight() {\r
+ return _itemHeight;\r
+ }\r
+\r
+ public void setItemHeight(int rowHeight) {\r
+ this._itemHeight = rowHeight;\r
+ }\r
+\r
+ public Vector<ITmfTimeAnalysisEntry> getFilteredOut() {\r
+ return _data.getFilteredOut();\r
+ }\r
+\r
+// @Override\r
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {\r
+ if (listener != null) {\r
+ if (!_selectionChangedListeners.contains(listener)) {\r
+ _selectionChangedListeners.add(listener);\r
+ }\r
+ }\r
+ }\r
+\r
+// @Override\r
+ public void removeSelectionChangedListener(\r
+ ISelectionChangedListener listener) {\r
+ if (listener != null) {\r
+ _selectionChangedListeners.remove(listener);\r
+ }\r
+ }\r
+\r
+// @Override\r
+ public void setSelection(ISelection selection) {\r
+ if (selection instanceof PlainSelection) {\r
+ PlainSelection sel = (PlainSelection) selection;\r
+ Object ob = sel.getFirstElement();\r
+ if (ob instanceof ITmfTimeAnalysisEntry) {\r
+ ITmfTimeAnalysisEntry trace = (ITmfTimeAnalysisEntry) ob;\r
+ selectItem(trace, false);\r
+ }\r
+ }\r
+\r
+ }\r
+}\r
+\r
+class Item {\r
+ public boolean _expanded;\r
+ public boolean _selected;\r
+ public boolean _hasChildren;\r
+ public String _name;\r
+\r
+ Item(String name) {\r
+ _name = name;\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ return _name;\r
+ }\r
+}\r
+\r
+class TraceItem extends Item {\r
+ public ITmfTimeAnalysisEntry _trace;\r
+\r
+ TraceItem(ITmfTimeAnalysisEntry trace, String name) {\r
+ super(name);\r
+ _trace = trace;\r
+ }\r
+}\r
+\r
+class GroupItem extends Item {\r
+ public List<ITmfTimeAnalysisEntry> _traces;\r
+\r
+ GroupItem(String name) {\r
+ super(name);\r
+ _traces = new ArrayList<ITmfTimeAnalysisEntry>();\r
+ _hasChildren = true;\r
+ }\r
+\r
+ void add(ITmfTimeAnalysisEntry trace) {\r
+ _traces.add(trace);\r
+ }\r
+}\r
+\r
+class ItemData {\r
+ public Object[] _items = new Object[0];\r
+ private Object _traces[] = new Object[0];\r
+ private boolean traceFilter[] = new boolean[0];\r
+ private Map<String, GroupItem> _groupTable = new HashMap<String, GroupItem>();\r
+ private boolean _flatList = false;\r
+ private TmfTimeAnalysisProvider utilsImp;\r
+ private Vector<ITmfTimeAnalysisEntry> filteredOut = new Vector<ITmfTimeAnalysisEntry>();\r
+\r
+ public ItemData(TmfTimeAnalysisProvider utils) {\r
+ this.utilsImp = utils;\r
+ }\r
+\r
+ protected void groupTraces(boolean on) {\r
+ if (_flatList == on) {\r
+ _flatList = !on;\r
+ updateItems();\r
+ }\r
+ }\r
+\r
+ void clearGroups() {\r
+ Iterator<GroupItem> it = _groupTable.values().iterator();\r
+ while (it.hasNext()) {\r
+ GroupItem group = it.next();\r
+ group._traces.clear();\r
+ }\r
+ }\r
+\r
+ void deleteEmptyGroups() {\r
+ Iterator<GroupItem> it = _groupTable.values().iterator();\r
+ while (it.hasNext()) {\r
+ GroupItem group = it.next();\r
+ if (group._traces.size() == 0)\r
+ it.remove();\r
+ }\r
+ }\r
+\r
+ TraceItem findTraceItem(ITmfTimeAnalysisEntry trace) {\r
+ if (trace == null)\r
+ return null;\r
+\r
+ int traceId = trace.getId();\r
+ TraceItem traceItem = null;\r
+\r
+ for (int i = 0; i < _items.length; i++) {\r
+ Object item = _items[i];\r
+ if (item instanceof TraceItem) {\r
+ TraceItem ti = (TraceItem) item;\r
+ if (ti._trace.getId() == traceId) {\r
+ traceItem = ti;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return traceItem;\r
+ }\r
+\r
+ Integer findTraceItemIndex(ITmfTimeAnalysisEntry trace) {\r
+ if (trace == null)\r
+ return null;\r
+\r
+ int traceId = trace.getId();\r
+\r
+ Integer idx = null;\r
+ for (int i = 0; i < _items.length; i++) {\r
+ idx = i;\r
+ Object item = _items[i];\r
+ if (item instanceof TraceItem) {\r
+ TraceItem ti = (TraceItem) item;\r
+ if (ti._trace.getId() == traceId) {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return idx;\r
+ }\r
+\r
+ public void updateItems() {\r
+ List<Item> itemList = new ArrayList<Item>();\r
+ String name = "";\r
+\r
+ Iterator<GroupItem> it = _groupTable.values().iterator();\r
+ while (it.hasNext()) {\r
+ GroupItem group = it.next();\r
+ if (!_flatList)\r
+ itemList.add(group);\r
+\r
+ if (_flatList || group._expanded) {\r
+ Iterator<ITmfTimeAnalysisEntry> it2 = group._traces.iterator();\r
+ while (it2.hasNext()) {\r
+ ITmfTimeAnalysisEntry trace = it2.next();\r
+ TraceItem traceItem = findTraceItem(trace);\r
+ name = utilsImp.composeTraceName(trace, false);\r
+ traceItem = new TraceItem(trace, name);\r
+ itemList.add(traceItem);\r
+ }\r
+ }\r
+ }\r
+ _items = itemList.toArray();\r
+ }\r
+\r
+ public int expandItem(int idx, boolean expand) {\r
+ if (idx < 0 || idx >= _items.length)\r
+ return 0;\r
+ int ret = 0;\r
+ Item item = (Item) _items[idx];\r
+ if (item._hasChildren && !item._expanded) {\r
+ item._expanded = expand;\r
+ ret = _items.length;\r
+ updateItems();\r
+ ret = _items.length - ret;\r
+ }\r
+ return ret;\r
+ }\r
+\r
+ public void refreshData(Object traces[]) {\r
+ if (traces == null || traces.length == 0) {\r
+ traceFilter = null;\r
+ } else if (traceFilter == null || traces.length != traceFilter.length) {\r
+ traceFilter = new boolean[traces.length];\r
+ java.util.Arrays.fill(traceFilter, true);\r
+ }\r
+\r
+ _traces = traces;\r
+ refreshData();\r
+ }\r
+\r
+ /**\r
+ * Allows to update the GUI from a stream of events handling addition one by\r
+ * one over known TmfTaTrace parents.\r
+ * \r
+ * @param parent\r
+ * @param childItem\r
+ */\r
+ public void refreshPartial(ITmfTimeAnalysisEntry parent, TimeEvent childItem) {\r
+ // Find the Trace item within the current list\r
+ TraceItem item = findTraceItem(parent);\r
+\r
+// This method is not used (yet) so this code can be commented out for now\r
+// FIXME: Arrays.copyOf is a Java6 feature\r
+// if (item == null) {\r
+// // If the parent item is not found, make room for it in the current\r
+// // array\r
+// int length = 1;\r
+// Object[] traces;\r
+// if (_traces != null) {\r
+// length = _traces.length + 1;\r
+// traces = Arrays.copyOf(_traces, length);\r
+// } else {\r
+// traces = new Object[length];\r
+// }\r
+//\r
+// // Add the new parent element to the end of the array.\r
+// traces[length - 1] = parent;\r
+//\r
+// // update the filter array to accomodate a postion to the new\r
+// // element\r
+// traceFilter = new boolean[traces.length];\r
+// java.util.Arrays.fill(traceFilter, true);\r
+//\r
+// // rebuild internal data\r
+// _traces = traces;\r
+// refreshData();\r
+//\r
+// // item must be there\r
+// item = findTraceItem(parent);\r
+// }\r
+\r
+ ITmfTimeAnalysisEntry localTraceItem = item._trace;\r
+ // Local trace found\r
+ Vector<TimeEvent> children = localTraceItem.getTraceEvents();\r
+ TimeEvent lastChildIn = children.lastElement();\r
+ long lastChildSTime = lastChildIn.getTime();\r
+ long newChildSTime = childItem.getTime();\r
+ if (newChildSTime < lastChildSTime) {\r
+ // The children are expected to arrive sorted by time\r
+ // since the new time is earlier than the last child\r
+ // The infomation is being refreshed from start, remove all\r
+ // children and start over\r
+ children.clear();\r
+ }\r
+ // Add the new item\r
+ children.add(childItem);\r
+\r
+ }\r
+\r
+ public void refreshData() {\r
+ clearGroups();\r
+ filteredOut.clear();\r
+ String undef = Messages._UNDEFINED_GROUP;\r
+ List<GroupItem> groupList = new ArrayList<GroupItem>();\r
+ for (int i = 0; i < _traces.length; i++) {\r
+ ITmfTimeAnalysisEntry trace = (ITmfTimeAnalysisEntry) _traces[i];\r
+ if (!traceFilter[i]) {\r
+ filteredOut.add(trace);\r
+ continue;\r
+ }\r
+\r
+ String groupName = trace.getGroupName();\r
+ if (null == groupName)\r
+ groupName = undef;\r
+\r
+ GroupItem group = _groupTable.get(groupName);\r
+ if (null == group) {\r
+ group = new GroupItem(NLS.bind(Messages._TRACE_GROUP_LABEL,\r
+ groupName));\r
+ group._expanded = !groupName.equalsIgnoreCase("system")\r
+ && !groupName.equalsIgnoreCase(undef);\r
+ _groupTable.put(groupName, group);\r
+ groupList.add(group);\r
+ }\r
+ group.add(trace);\r
+ }\r
+\r
+ deleteEmptyGroups();\r
+ updateItems();\r
+ }\r
+\r
+ public Object[] getTraces() {\r
+ return _traces;\r
+ }\r
+\r
+ public boolean[] getTraceFilter() {\r
+ return traceFilter;\r
+ }\r
+\r
+ public Vector<ITmfTimeAnalysisEntry> getFilteredOut() {\r
+ return filteredOut;\r
+ }\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007, Intel Corporation.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Vitaly A. Provodin, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Udpated for TMF\r
+ *\r
+ * $Id: ThreadsTipHandler.java,v 1.5 2007/06/06 19:16:16 gnagarajan Exp $\r
+ *****************************************************************************/\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+import java.util.Iterator;\r
+import java.util.Map;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.Messages;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer.TimeFormat;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets.Utils.Resolution;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.MouseAdapter;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.events.MouseTrackAdapter;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.layout.GridLayout;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.swt.widgets.Table;\r
+import org.eclipse.swt.widgets.TableColumn;\r
+import org.eclipse.swt.widgets.TableItem;\r
+import org.eclipse.swt.widgets.Widget;\r
+\r
+\r
+public class TmfTimeTipHandler {\r
+\r
+ private Shell _tipShell;\r
+ private Table _tipTable;\r
+ private Item _tipItem;\r
+ private Point _tipPosition;\r
+ private ITimeDataProvider _timeDataProvider;\r
+ TmfTimeAnalysisProvider _utilImp = null;\r
+\r
+ public TmfTimeTipHandler(Shell parent, TmfTimeAnalysisProvider rUtilImpl,\r
+ ITimeDataProvider timeProv) {\r
+ final Display display = parent.getDisplay();\r
+\r
+ this._utilImp = rUtilImpl;\r
+ this._timeDataProvider = timeProv;\r
+ _tipShell = new Shell(parent, SWT.ON_TOP | SWT.TOOL);\r
+ GridLayout gridLayout = new GridLayout();\r
+ gridLayout.numColumns = 2;\r
+ gridLayout.marginWidth = 2;\r
+ gridLayout.marginHeight = 2;\r
+ _tipShell.setLayout(gridLayout);\r
+ GridData data = new GridData(GridData.BEGINNING, GridData.BEGINNING,\r
+ true, true);\r
+ _tipShell.setLayoutData(data);\r
+ _tipShell.setBackground(display\r
+ .getSystemColor(SWT.COLOR_INFO_BACKGROUND));\r
+\r
+ _tipTable = new Table(_tipShell, SWT.NONE);\r
+ _tipTable.setForeground(display\r
+ .getSystemColor(SWT.COLOR_INFO_FOREGROUND));\r
+ _tipTable.setBackground(display\r
+ .getSystemColor(SWT.COLOR_INFO_BACKGROUND));\r
+ _tipTable.setHeaderVisible(false);\r
+ _tipTable.setLinesVisible(false);\r
+\r
+ // tipTable.setLayoutData(new GridData(GridData.FILL_HORIZONTAL\r
+ // | GridData.VERTICAL_ALIGN_CENTER));\r
+ }\r
+\r
+ public void activateHoverHelp(final Control control) {\r
+ control.addMouseListener(new MouseAdapter() {\r
+ @Override\r
+ public void mouseDown(MouseEvent e) {\r
+ if (_tipShell.isVisible())\r
+ _tipShell.setVisible(false);\r
+ }\r
+ });\r
+\r
+ control.addMouseTrackListener(new MouseTrackAdapter() {\r
+ @Override\r
+ public void mouseExit(MouseEvent e) {\r
+ if (_tipShell.isVisible())\r
+ _tipShell.setVisible(false);\r
+ _tipItem = null;\r
+\r
+ }\r
+\r
+ private void addItem(String name, String value) {\r
+ TableItem line = new TableItem(_tipTable, SWT.NONE);\r
+ line.setText(0, name);\r
+ line.setText(1, value);\r
+ }\r
+\r
+ private void fillValues(Point pt, TmfTimeStatesCtrl threadStates,\r
+ Item item) {\r
+ if (item instanceof TraceItem) {\r
+ ITmfTimeAnalysisEntry thrd = ((TraceItem) item)._trace;\r
+ ITimeEvent threadEvent = Utils.findEvent(thrd, threadStates\r
+ .hitTimeTest(pt.x, pt.y), 2);\r
+ ITimeEvent nextEvent = Utils.findEvent(thrd, threadStates\r
+ .hitTimeTest(pt.x, pt.y), 1);\r
+ // thread name\r
+ addItem(Messages._TRACE_NAME, thrd.getName());\r
+ // class name\r
+ addItem(Messages._TRACE_CLASS_NAME, _utilImp\r
+ .getTraceClassName(thrd));\r
+ // thread state\r
+ addItem(Messages._TRACE_STATE, _utilImp\r
+ .getEventName(threadEvent));\r
+\r
+ // This block receives a\r
+ // list of <String, String> values to be added to the tip\r
+ // table\r
+ Map<String, String> eventAddOns = _utilImp\r
+ .getEventHoverToolTipInfo(threadEvent);\r
+ for (Iterator<String> iter = eventAddOns.keySet()\r
+ .iterator(); iter.hasNext();) {\r
+ String message = (String) iter.next();\r
+ addItem(message, eventAddOns.get(message));\r
+ }\r
+\r
+ long eventStartTime = -1;\r
+ long eventDuration = -1;\r
+ long eventEndTime = -1;\r
+ \r
+ if (threadEvent != null) {\r
+ eventStartTime = threadEvent.getTime();\r
+ eventDuration = threadEvent.getDuration();\r
+ if (eventDuration < 0 && nextEvent != null) {\r
+ eventEndTime = nextEvent.getTime();\r
+ eventDuration = eventEndTime - eventStartTime;\r
+ } else {\r
+ eventEndTime = eventStartTime + eventDuration;\r
+ }\r
+ }\r
+\r
+// TODO: Check if we need "format" \r
+// TimeFormat format = TimeFormat.RELATIVE;\r
+ Resolution res = Resolution.NANOSEC;\r
+ if (_timeDataProvider.isCalendarFormat()) {\r
+// format = TimeFormat.ABSOLUTE; // Absolute format\r
+// // (calendar)\r
+ // Add Date\r
+ addItem(Messages._TRACE_DATE, eventStartTime > -1 ?\r
+ Utils.formatDate(eventStartTime)\r
+ : "?");\r
+ if (eventDuration > 0) {\r
+ addItem(Messages._TRACE_START_TIME, eventStartTime > -1 ?\r
+ Utils.formatTime(eventStartTime, TimeFormat.ABSOLUTE, res)\r
+ : "?");\r
+ \r
+ addItem(Messages._TRACE_STOP_TIME, eventEndTime > -1 ?\r
+ Utils.formatTime(eventEndTime, TimeFormat.ABSOLUTE, res)\r
+ : "?");\r
+ } else {\r
+ addItem(Messages._TRACE_EVENT_TIME, eventStartTime > -1 ?\r
+ Utils.formatTime(eventStartTime, TimeFormat.ABSOLUTE, res)\r
+ : "?");\r
+ }\r
+ } else {\r
+ if (eventDuration > 0) {\r
+ addItem(Messages._TRACE_START_TIME, eventStartTime > -1 ?\r
+ Utils.formatTime(eventStartTime, TimeFormat.RELATIVE, res)\r
+ : "?");\r
+ \r
+ addItem(Messages._TRACE_STOP_TIME, eventEndTime > -1 ?\r
+ Utils.formatTime(eventEndTime, TimeFormat.RELATIVE, res)\r
+ : "?");\r
+ } else {\r
+ addItem(Messages._TRACE_EVENT_TIME, eventStartTime > -1 ?\r
+ Utils.formatTime(eventStartTime, TimeFormat.RELATIVE, res)\r
+ : "?");\r
+ }\r
+ }\r
+\r
+ if (eventDuration > 0) {\r
+ // Duration in relative format in any case\r
+ addItem(Messages._DURATION, eventDuration > -1 ?\r
+ Utils.formatTime(eventDuration, TimeFormat.RELATIVE, res)\r
+ : "?");\r
+ }\r
+\r
+ } else if (item instanceof GroupItem) {\r
+ addItem(Messages._TRACE_GROUP_NAME, item.toString());\r
+ addItem(Messages._NUMBER_OF_TRACES, ""\r
+ + ((GroupItem) item)._traces.size());\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void mouseHover(MouseEvent event) {\r
+ Point pt = new Point(event.x, event.y);\r
+ Widget widget = event.widget;\r
+ Item item = null;\r
+ if (widget instanceof TmfTimeStatesCtrl) {\r
+ TmfTimeStatesCtrl threadStates = (TmfTimeStatesCtrl) widget;\r
+ item = (Item) threadStates.getItem(pt);\r
+ _tipTable.remove(0, _tipTable.getItemCount() - 1);\r
+ new TableColumn(_tipTable, SWT.NONE);\r
+ new TableColumn(_tipTable, SWT.NONE);\r
+ fillValues(pt, threadStates, item);\r
+ _tipTable.getColumn(0).setWidth(200);\r
+ _tipTable.getColumn(1).pack();\r
+ _tipTable.setSize(_tipTable.computeSize(SWT.DEFAULT, 200));\r
+ _tipShell.pack();\r
+ } else if (widget == null) {\r
+ _tipShell.setVisible(false);\r
+ _tipItem = null;\r
+ return;\r
+ }\r
+ if (item == _tipItem)\r
+ return;\r
+ _tipItem = item;\r
+ _tipPosition = control.toDisplay(pt);\r
+ _tipShell.pack();\r
+ setHoverLocation(_tipShell, _tipPosition);\r
+ _tipShell.setVisible(true);\r
+ }\r
+ });\r
+ }\r
+\r
+ private void setHoverLocation(Shell shell, Point position) {\r
+ Rectangle displayBounds = shell.getDisplay().getBounds();\r
+ Rectangle shellBounds = shell.getBounds();\r
+ shellBounds.x = Math.max(Math.min(position.x, displayBounds.width\r
+ - shellBounds.width), 0);\r
+ shellBounds.y = Math.max(Math.min(position.y + 16, displayBounds.height\r
+ - shellBounds.height), 0);\r
+ shell.setBounds(shellBounds);\r
+ }\r
+\r
+}
\ No newline at end of file
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2008 Intel Corporation.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Udpated for TMF\r
+ *\r
+ * $Id: TraceColorScheme.java,v 1.3 2008/05/09 16:11:24 jkubasta Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider.StateColor;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Color;\r
+\r
+\r
+public class TraceColorScheme {\r
+\r
+ // elements color indices\r
+ static public final int BLACK_STATE = 0;\r
+ static public final int GREEN_STATE = 1;\r
+ static public final int DARK_BLUE_STATE = 2;\r
+ static public final int ORANGE_STATE = 3;\r
+ static public final int GOLD_STATE = 4;\r
+ static public final int RED_STATE = 5;\r
+ static public final int GRAY_STATE = 6;\r
+ static public final int DARK_GREEN_STATE = 7;\r
+ static public final int DARK_YELLOW_STATE = 8;\r
+ static public final int MAGENTA3_STATE = 9;\r
+ static public final int PURPLE1_STATE = 10;\r
+ static public final int PINK1_STATE = 11;\r
+ static public final int AQUAMARINE_STATE = 12;\r
+ static public final int LIGHT_BLUE_STATE = 13;\r
+ static public final int CADET_BLUE_STATE = 14;\r
+ static public final int OLIVE_STATE = 15;\r
+ \r
+ static public final int STATES0 = 0;\r
+ static public final int STATES1 = 15;\r
+ \r
+ // State element index to name mapping, must keep the same order as above\r
+ public static final StateColor stateColors[] = { StateColor.BLACK,\r
+ StateColor.GREEN, StateColor.DARK_BLUE, StateColor.ORANGE,\r
+ StateColor.GOLD, StateColor.RED, StateColor.GRAY, StateColor.DARK_GREEN, StateColor.DARK_YELLOW, StateColor.MAGENTA3, StateColor.PURPLE1, \r
+ StateColor.PINK1, StateColor.AQUAMARINE, StateColor.LIGHT_BLUE, StateColor.CADET_BLUE, StateColor.OLIVE\r
+ };\r
+\r
+ // selected state elements color indices\r
+ static public final int BLACK_STATE_SEL = 16;\r
+ static public final int GREEN_STATE_SEL = 17;\r
+ static public final int DARK_BLUE_STATE_SEL = 18;\r
+ static public final int ORANGE_STATE_SEL = 19;\r
+ static public final int GOLD_STATE_SEL = 20;\r
+ static public final int RED_STATE_SEL = 21;\r
+ static public final int GRAY_STATE_SEL = 22;\r
+ static public final int DARK_GREEN_STATE_SEL = 23;\r
+ static public final int DARK_YELLOW_STATE_SEL = 24;\r
+ static public final int MAGENTA3_STATE_SEL = 25;\r
+ static public final int PURPLE1_STATE_SEL = 26;\r
+ static public final int PINK1_STATE_SEL = 27;\r
+ static public final int AQUAMARINE_STATE_SEL = 28;\r
+ static public final int LIGHT_BLUE_STATE_SEL = 29;\r
+ static public final int CADET_BLUE_STATE_SEL = 30;\r
+ static public final int OLIVE_STATE_SEL = 31;\r
+ \r
+ static public final int STATES_SEL0 = 16;\r
+ static public final int STATES_SEL1 = 31;\r
+\r
+ // colors indices for viewer controls\r
+ static public final int BACKGROUND = 32;\r
+ static public final int FOREGROUND = 33;\r
+ static public final int BACKGROUND_SEL = 34;\r
+ static public final int FOREGROUND_SEL = 35;\r
+ static public final int BACKGROUND_SEL_NOFOCUS = 36;\r
+ static public final int FOREGROUND_SEL_NOFOCUS = 37;\r
+ static public final int TOOL_BACKGROUND = 38;\r
+ static public final int TOOL_FOREGROUND = 39;\r
+\r
+ // misc colors\r
+ static public final int FIX_COLOR = 40;\r
+ static public final int WHITE = 41;\r
+ static public final int GRAY = 42;\r
+ static public final int BLACK = 43;\r
+ static public final int DARK_GRAY = 44;\r
+\r
+ // selected border color indices\r
+ static public final int BLACK_BORDER = 45;\r
+ static public final int GREEN_BORDER = 46;\r
+ static public final int DARK_BLUE_BORDER = 47;\r
+ static public final int ORANGE_BORDER = 48;\r
+ static public final int GOLD_BORDER = 49;\r
+ static public final int RED_BORDER = 50;\r
+ static public final int GRAY_BORDER = 51;\r
+ static public final int DARK_GREEN_BORDER1 = 52;\r
+ static public final int DARK_YELLOW_BORDER1 = 53;\r
+ static public final int MAGENTA3_BORDER1 = 54;\r
+ static public final int PURPLE1_BORDER1 = 55;\r
+ static public final int PINK1_BORDER1 = 56;\r
+ static public final int AQUAMARINE_BORDER1 = 57;\r
+ static public final int LIGHT_BLUE_BORDER1 = 58;\r
+ static public final int CADET_BLUE_STATE_BORDER = 59;\r
+ static public final int OLIVE_BORDER2 = 60;\r
+ \r
+ static public final int STATES_BORDER0 = 45;\r
+ static public final int STATES_BORDER1 = 60;\r
+\r
+ static public final int MID_LINE = 61;\r
+ static public final int RED = 62;\r
+ static public final int GREEN = 63;\r
+ static public final int BLUE = 64;\r
+ static public final int YELLOW = 65;\r
+ static public final int CYAN = 66;\r
+ static public final int MAGENTA = 67;\r
+\r
+ static public final int SELECTED_TIME = 68;\r
+ static public final int LEGEND_BACKGROUND = 69;\r
+ static public final int LEGEND_FOREGROUND = 70;\r
+\r
+ // group items' colors\r
+ static public final int GR_BACKGROUND = 71;\r
+ static public final int GR_FOREGROUND = 72;\r
+ static public final int GR_BACKGROUND_SEL = 73;\r
+ static public final int GR_FOREGROUND_SEL = 74;\r
+ static public final int GR_BACKGROUND_SEL_NOFOCUS = 75;\r
+ static public final int GR_FOREGROUND_SEL_NOFOCUS = 76;\r
+\r
+ static public final int LIGHT_LINE = 77;\r
+ static public final int BACKGROUND_NAME = 78;\r
+ static public final int BACKGROUND_NAME_SEL = 79;\r
+ static public final int BACKGROUND_NAME_SEL_NOFOCUS = 80;\r
+\r
+ // Interraction's colors\r
+ static public final int TI_START_THREAD = BLACK;\r
+ static public final int TI_HANDOFF_LOCK = BLUE;\r
+ static public final int TI_NOTIFY_ALL = GREEN;\r
+ static public final int TI_NOTIFY = GREEN;\r
+ static public final int TI_NOTIFY_JOINED = DARK_GRAY;\r
+ static public final int TI_INTERRUPT = RED;\r
+ static public final int TI_WAIT_EXCEEDED = BLUE;\r
+\r
+ static interface IColorProvider {\r
+ public Color get();\r
+ }\r
+\r
+ static class SysCol implements IColorProvider {\r
+ int syscol;\r
+\r
+ SysCol(int syscol) {\r
+ this.syscol = syscol;\r
+ }\r
+\r
+ public Color get() {\r
+ return Utils.getSysColor(syscol);\r
+ }\r
+ }\r
+\r
+ static class RGB implements IColorProvider {\r
+ int r;\r
+ int g;\r
+ int b;\r
+\r
+ RGB(int r, int g, int b) {\r
+ this.r = r;\r
+ this.g = g;\r
+ this.b = b;\r
+ }\r
+\r
+ public Color get() {\r
+ return new Color(null, r, g, b);\r
+ }\r
+ }\r
+\r
+ static class Mix implements IColorProvider {\r
+ IColorProvider cp1;\r
+ IColorProvider cp2;\r
+ int w1;\r
+ int w2;\r
+\r
+ Mix(IColorProvider cp1, IColorProvider cp2, int w1, int w2) {\r
+ this.cp1 = cp1;\r
+ this.cp2 = cp2;\r
+ this.w1 = w1;\r
+ this.w2 = w2;\r
+ }\r
+\r
+ Mix(IColorProvider cp1, IColorProvider cp2) {\r
+ this.cp1 = cp1;\r
+ this.cp2 = cp2;\r
+ this.w1 = 1;\r
+ this.w2 = 1;\r
+ }\r
+\r
+ public Color get() {\r
+ Color col1 = cp1.get();\r
+ Color col2 = cp2.get();\r
+ Color col = Utils.mixColors(col1, col2, w1, w2);\r
+ return col;\r
+ }\r
+ }\r
+\r
+ static private final IColorProvider _providersMap[] = {\r
+ //\r
+ new RGB(100, 100, 100), // UNKNOWN\r
+ new RGB(174, 200, 124), // RUNNING\r
+ new Mix(new SysCol(SWT.COLOR_BLUE), new SysCol(SWT.COLOR_GRAY), 1, 3), // SLEEPING\r
+ new RGB(210, 150, 60), // WAITING\r
+ new RGB(242, 225, 168), // BLOCKED\r
+ new Mix(new SysCol(SWT.COLOR_RED), new SysCol(SWT.COLOR_GRAY), 1, 3), // DEADLOCK\r
+ new RGB(200, 200, 200), // STOPPED\r
+ new RGB(35, 107, 42), // STEEL BLUE\r
+ new RGB(205,205,0), // DARK YELLOW\r
+ new RGB(205, 0, 205), // MAGENTA\r
+ new RGB(171, 130, 255), // PURPLE\r
+ new RGB(255, 181, 197), // PINK\r
+ new RGB(112, 219, 147), // AQUAMARINE\r
+ new RGB(198, 226, 255), // SLATEGRAY\r
+ new RGB(95, 158, 160), // CADET BLUE\r
+ new RGB(107, 142, 35), // OLIVE\r
+ \r
+ \r
+ //TODO: Does not seem to be used, check during clean-up\r
+ new SysCol(SWT.COLOR_WHITE), // UNKNOWN_SEL\r
+ new SysCol(SWT.COLOR_GREEN), // RUNNING_SEL\r
+ new SysCol(SWT.COLOR_BLUE), // SLEEPING_SEL\r
+ new SysCol(SWT.COLOR_CYAN), // WAITING_SEL\r
+ new SysCol(SWT.COLOR_YELLOW), // BLOCKED_SEL\r
+ new SysCol(SWT.COLOR_RED), // DEADLOCK_SEL\r
+ new SysCol(SWT.COLOR_DARK_GRAY), // STOPPED_SEL\r
+ new SysCol(SWT.COLOR_WHITE), \r
+ new SysCol(SWT.COLOR_GREEN), \r
+ new SysCol(SWT.COLOR_BLUE), \r
+ new SysCol(SWT.COLOR_CYAN), \r
+ new SysCol(SWT.COLOR_YELLOW), \r
+ new SysCol(SWT.COLOR_RED), \r
+ new SysCol(SWT.COLOR_DARK_GRAY), \r
+ new SysCol(SWT.COLOR_WHITE), \r
+ new SysCol(SWT.COLOR_GREEN), \r
+ \r
+\r
+ new SysCol(SWT.COLOR_LIST_BACKGROUND), // BACKGROUND\r
+ new SysCol(SWT.COLOR_LIST_FOREGROUND), // FOREGROUND\r
+ new RGB(232, 242, 254), // BACKGROUND_SEL\r
+ new SysCol(SWT.COLOR_LIST_FOREGROUND), // FOREGROUND_SEL\r
+ new SysCol(SWT.COLOR_WIDGET_BACKGROUND), // BACKGROUND_SEL_NOFOCUS\r
+ new SysCol(SWT.COLOR_WIDGET_FOREGROUND), // FOREGROUND_SEL_NOFOCUS\r
+ new SysCol(SWT.COLOR_WIDGET_BACKGROUND), // TOOL_BACKGROUND\r
+ new SysCol(SWT.COLOR_WIDGET_DARK_SHADOW), // TOOL_FOREGROUND\r
+\r
+ new SysCol(SWT.COLOR_GRAY), // FIX_COLOR\r
+ new SysCol(SWT.COLOR_WHITE), // WHITE\r
+ new SysCol(SWT.COLOR_GRAY), // GRAY\r
+ new SysCol(SWT.COLOR_BLACK), // BLACK\r
+ new SysCol(SWT.COLOR_DARK_GRAY), // DARK_GRAY\r
+\r
+ new SysCol(SWT.COLOR_DARK_GRAY), // BLACK_BORDER\r
+ new RGB(75, 115, 120), // GREEN_BORDER\r
+ new SysCol(SWT.COLOR_DARK_BLUE), // DARK_BLUE_BORDER\r
+ new RGB(242, 225, 168), // ORANGE_BORDER\r
+ new RGB(210, 150, 60), // GOLD_BORDER\r
+ new SysCol(SWT.COLOR_DARK_RED), // RED_BORDER\r
+ new SysCol(SWT.COLOR_BLACK), // GRAY_BORDER\r
+ new SysCol(SWT.COLOR_DARK_GRAY), // DARK_GREEN_BORDER\r
+ new RGB(75, 115, 120), // DARK_YELLOW_BORDER\r
+ new SysCol(SWT.COLOR_DARK_BLUE), // MAGENTA3_BORDER\r
+ new RGB(242, 225, 168), // PURPLE1_BORDER\r
+ new RGB(210, 150, 60), // PINK1_BORDER\r
+ new SysCol(SWT.COLOR_DARK_RED), // AQUAMARINE_BORDER\r
+ new SysCol(SWT.COLOR_BLACK), // LIGHT_BLUE_BORDER\r
+ new SysCol(SWT.COLOR_DARK_GRAY), // BLUE_BORDER\r
+ new RGB(75, 115, 120), // OLIVE_BORDER\r
+ \r
+\r
+ new SysCol(SWT.COLOR_GRAY), // MID_LINE\r
+ new SysCol(SWT.COLOR_RED), // RED\r
+ new SysCol(SWT.COLOR_GREEN), // GREEN\r
+ new SysCol(SWT.COLOR_BLUE), // BLUE\r
+ new SysCol(SWT.COLOR_YELLOW), // YELLOW\r
+ new SysCol(SWT.COLOR_CYAN), // CYAN\r
+ new SysCol(SWT.COLOR_MAGENTA), // MAGENTA\r
+\r
+ new SysCol(SWT.COLOR_BLUE), // SELECTED_TIME\r
+ new SysCol(SWT.COLOR_WIDGET_BACKGROUND), // LEGEND_BACKGROUND\r
+ new SysCol(SWT.COLOR_WIDGET_DARK_SHADOW), // LEGEND_FOREGROUND\r
+\r
+ new Mix(new RGB(150, 200, 240), new SysCol(\r
+ SWT.COLOR_LIST_BACKGROUND)),// GR_BACKGROUND\r
+ new RGB(0, 0, 50), // GR_FOREGROUND\r
+ new Mix(new RGB(200, 200, 100),\r
+ new SysCol(SWT.COLOR_LIST_SELECTION)), // GR_BACKGROUND_SEL\r
+ new Mix(new RGB(150, 200, 240), new SysCol(\r
+ SWT.COLOR_LIST_SELECTION_TEXT)), // GR_FOREGROUND_SEL\r
+ new Mix(new RGB(222, 222, 155), new SysCol(\r
+ SWT.COLOR_WIDGET_BACKGROUND)), // GR_BACKGROUND_SEL_NOFOCUS\r
+ new RGB(0, 0, 50), // GR_FOREGROUND_SEL_NOFOCUS\r
+\r
+ new Mix(new SysCol(SWT.COLOR_GRAY), new SysCol(\r
+ SWT.COLOR_LIST_BACKGROUND), 1, 3), // LIGHT_LINE\r
+\r
+ new Mix(new SysCol(SWT.COLOR_GRAY), new SysCol(SWT.COLOR_LIST_BACKGROUND), 1, 6), // BACKGROUND_NAME\r
+ new Mix(new SysCol(SWT.COLOR_GRAY), new RGB(232, 242, 254), 1, 6), // BACKGROUND_NAME_SEL\r
+ new Mix(new SysCol(SWT.COLOR_GRAY), new SysCol(SWT.COLOR_WIDGET_BACKGROUND), 1, 6), // BACKGROUND_NAME_SEL_NOFOCUS\r
+ };\r
+\r
+ private Color _colors[];\r
+\r
+ public TraceColorScheme() {\r
+ _colors = new Color[_providersMap.length];\r
+ }\r
+\r
+ public void dispose() {\r
+ for (int i = 0; i < _colors.length; i++) {\r
+ Utils.dispose(_colors[i]);\r
+ _colors[i] = null;\r
+ }\r
+ }\r
+\r
+ public Color getColor(int idx) {\r
+ if (null == _colors[idx]) {\r
+ if (idx >= STATES_SEL0 && idx <= STATES_SEL1) {\r
+ Color col1 = getColor(idx - STATES_SEL0);\r
+ Color col2 = getColor(BACKGROUND_SEL);\r
+ _colors[idx] = Utils.mixColors(col1, col2, 3, 1);\r
+ } else {\r
+ _colors[idx] = _providersMap[idx].get();\r
+ }\r
+ }\r
+ return _colors[idx];\r
+ }\r
+\r
+ public Color getBkColor(boolean selected, boolean focused, boolean name) {\r
+ if (name) {\r
+ if (selected && focused)\r
+ return getColor(BACKGROUND_NAME_SEL);\r
+ if (selected)\r
+ return getColor(BACKGROUND_NAME_SEL_NOFOCUS);\r
+ return getColor(BACKGROUND_NAME);\r
+ } else {\r
+ if (selected && focused)\r
+ return getColor(BACKGROUND_SEL);\r
+ if (selected)\r
+ return getColor(BACKGROUND_SEL_NOFOCUS);\r
+ return getColor(BACKGROUND);\r
+ }\r
+ }\r
+\r
+ public Color getFgColor(boolean selected, boolean focused) {\r
+ if (selected && focused)\r
+ return getColor(FOREGROUND_SEL);\r
+ if (selected)\r
+ return getColor(FOREGROUND_SEL_NOFOCUS);\r
+ return getColor(FOREGROUND);\r
+ }\r
+\r
+ public Color getBkColorGroup(boolean selected, boolean focused) {\r
+ if (selected && focused)\r
+ return getColor(GR_BACKGROUND_SEL);\r
+ if (selected)\r
+ return getColor(GR_BACKGROUND_SEL_NOFOCUS);\r
+ return getColor(GR_BACKGROUND);\r
+ }\r
+\r
+ public Color getFgColorGroup(boolean selected, boolean focused) {\r
+ if (selected && focused)\r
+ return getColor(GR_FOREGROUND_SEL);\r
+ if (selected)\r
+ return getColor(GR_FOREGROUND_SEL_NOFOCUS);\r
+ return getColor(GR_FOREGROUND);\r
+ }\r
+\r
+ public static StateColor[] getStateColors() {\r
+ return stateColors;\r
+ }\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007, Intel Corporation.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Udpated for TMF\r
+ *\r
+ * $Id: TraceCtrl.java,v 1.2 2007/02/27 18:37:36 ewchan Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.PaintEvent;\r
+import org.eclipse.swt.events.PaintListener;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.widgets.Canvas;\r
+import org.eclipse.swt.widgets.Composite;\r
+\r
+public abstract class TraceCtrl extends Canvas implements PaintListener {\r
+\r
+ static public final int MARGIN = 4;\r
+ static public final int RIGHT_MARGIN = 2; // 2 pixels less to make sure end time is visible\r
+ static public final int SMALL_ICON_SIZE = 16;\r
+\r
+ protected TraceColorScheme _colors;\r
+ protected int _fontHeight = 0;\r
+\r
+ public TraceCtrl(Composite parent, TraceColorScheme colors) {\r
+ this(parent, colors, SWT.NO_BACKGROUND | SWT.NO_FOCUS);\r
+ }\r
+\r
+ public TraceCtrl(Composite parent, TraceColorScheme colors, int style) {\r
+ super(parent, style);\r
+ _colors = colors;\r
+ addPaintListener(this);\r
+ }\r
+\r
+ @Override\r
+ public void dispose() {\r
+ super.dispose();\r
+ }\r
+\r
+ public void paintControl(PaintEvent e) {\r
+ if (e.widget != this)\r
+ return;\r
+ _fontHeight = e.gc.getFontMetrics().getHeight();\r
+ Rectangle bound = getClientArea();\r
+ if (!bound.isEmpty()) {\r
+ Color colBackup = e.gc.getBackground();\r
+ paint(bound, e);\r
+ e.gc.setBackground(colBackup);\r
+ }\r
+ }\r
+\r
+ public int getFontHeight() {\r
+ return _fontHeight;\r
+ }\r
+\r
+ abstract void paint(Rectangle bound, PaintEvent e);\r
+}\r
--- /dev/null
+/*****************************************************************************\r
+ * Copyright (c) 2007, 2008 Intel Corporation and others.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * Intel Corporation - Initial API and implementation\r
+ * Ruslan A. Scherbakov, Intel - Initial API and implementation\r
+ * Alvaro Sanchex-Leon - Udpated for TMF\r
+ *\r
+ * $Id: Utils.java,v 1.11 2008/06/16 21:04:49 jkubasta Exp $ \r
+ *****************************************************************************/\r
+\r
+package org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.widgets;\r
+\r
+import java.text.SimpleDateFormat;\r
+import java.util.Date;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.TimeZone;\r
+import java.util.Vector;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer.TimeFormat;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
+import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.TimeEvent;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Device;\r
+import org.eclipse.swt.graphics.GC;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.graphics.Rectangle;\r
+import org.eclipse.swt.widgets.Display;\r
+\r
+public class Utils {\r
+\r
+ static public final int IMG_THREAD_RUNNING = 0;\r
+ static public final int IMG_THREAD_SUSPENDED = 1;\r
+ static public final int IMG_THREAD_STOPPED = 2;\r
+ static public final int IMG_METHOD_RUNNING = 3;\r
+ static public final int IMG_METHOD = 4;\r
+ static public final int IMG_NUM = 5;\r
+\r
+ static public final Object[] _empty = new Object[0];\r
+\r
+ static enum Resolution {\r
+ SECONDS, MILLISEC, MICROSEC, NANOSEC\r
+ };\r
+\r
+ static private final SimpleDateFormat stimeformat = new SimpleDateFormat("HH:mm:ss");\r
+ static private final SimpleDateFormat sdateformat = new SimpleDateFormat("yyyy-MM-dd");\r
+ static {\r
+ stimeformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ sdateformat.setTimeZone(TimeZone.getTimeZone("GMT"));\r
+ }\r
+\r
+// static private String _externalPlugin[] = { "org.eclipse.debug.ui",\r
+// "org.eclipse.debug.ui", "org.eclipse.debug.ui",\r
+// "org.eclipse.debug.ui", "org.eclipse.debug.ui", };\r
+//\r
+// static private String _externalPath[] = {\r
+// "icons/full/obj16/thread_obj.gif", // running thread\r
+// "icons/full/obj16/threads_obj.gif", // suspended\r
+// "icons/full/obj16/threadt_obj.gif", // stopped\r
+// "icons/full/obj16/stckframe_running_obj.gif", // running stack frame\r
+// "icons/full/obj16/stckframe_obj.gif", // stack frame\r
+// };\r
+\r
+// static public Image getImage(int idx) {\r
+// if (idx < 0 || idx >= IMG_NUM)\r
+// SWT.error(SWT.ERROR_INVALID_ARGUMENT);\r
+// String key = "trace.img." + idx;\r
+// Image img = TimeAnalysisPlugin.getDefault().getImageRegistry().get(key);\r
+// if (null == img) {\r
+// ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin(\r
+// _externalPlugin[idx], _externalPath[idx]);\r
+// TimeAnalysisPlugin.getDefault().getImageRegistry().put(key, desc);\r
+// img = TimeAnalysisPlugin.getDefault().getImageRegistry().get(key);\r
+// }\r
+// return img;\r
+// }\r
+\r
+ static public void init(Rectangle rect) {\r
+ rect.x = 0;\r
+ rect.y = 0;\r
+ rect.width = 0;\r
+ rect.height = 0;\r
+ }\r
+\r
+ static public void init(Rectangle rect, int x, int y, int width, int height) {\r
+ rect.x = x;\r
+ rect.y = y;\r
+ rect.width = width;\r
+ rect.height = height;\r
+ }\r
+\r
+ static public void init(Rectangle rect, Rectangle source) {\r
+ rect.x = source.x;\r
+ rect.y = source.y;\r
+ rect.width = source.width;\r
+ rect.height = source.height;\r
+ }\r
+\r
+ static public void deflate(Rectangle rect, int x, int y) {\r
+ rect.x += x;\r
+ rect.y += y;\r
+ rect.width -= x + x;\r
+ rect.height -= y + y;\r
+ }\r
+\r
+ static public void inflate(Rectangle rect, int x, int y) {\r
+ rect.x -= x;\r
+ rect.y -= y;\r
+ rect.width += x + x;\r
+ rect.height += y + y;\r
+ }\r
+\r
+ static void dispose(Color col) {\r
+ if (null != col)\r
+ col.dispose();\r
+ }\r
+\r
+ static public Color mixColors(Device display, Color c1, Color c2, int w1,\r
+ int w2) {\r
+ return new Color(display, (w1 * c1.getRed() + w2 * c2.getRed())\r
+ / (w1 + w2), (w1 * c1.getGreen() + w2 * c2.getGreen())\r
+ / (w1 + w2), (w1 * c1.getBlue() + w2 * c2.getBlue())\r
+ / (w1 + w2));\r
+ }\r
+\r
+ static public Color getSysColor(int id) {\r
+ Color col = Display.getCurrent().getSystemColor(id);\r
+ return new Color(col.getDevice(), col.getRGB());\r
+ }\r
+\r
+ static public Color mixColors(Color col1, Color col2, int w1, int w2) {\r
+ return mixColors(Display.getCurrent(), col1, col2, w1, w2);\r
+ }\r
+\r
+ static public int drawText(GC gc, String text, Rectangle rect,\r
+ boolean transp) {\r
+ Point size = gc.stringExtent(text);\r
+ gc.drawText(text, rect.x, rect.y, transp);\r
+ return size.x;\r
+ }\r
+\r
+ static public int drawText(GC gc, String text, int x, int y, boolean transp) {\r
+ Point size = gc.stringExtent(text);\r
+ gc.drawText(text, x, y, transp);\r
+ return size.x;\r
+ }\r
+\r
+ /**\r
+ * Formats time in format: MM:SS:NNN\r
+ * \r
+ * @param v\r
+ * @param option\r
+ * 0: MMMM:ss:nnnnnnnnn, 1: HH:MM:ss MMM.mmmm.nnn\r
+ * @return\r
+ */\r
+ static public String formatTime(long v, TimeFormat format, Resolution res) {\r
+ // if format is absolute (Calendar)\r
+ if (format == TimeFormat.ABSOLUTE) {\r
+ return formatTimeAbs(v, res);\r
+ }\r
+\r
+ StringBuffer str = new StringBuffer();\r
+ boolean neg = v < 0;\r
+ if (neg) {\r
+ v = -v;\r
+ str.append('-');\r
+ }\r
+\r
+ long sec = (long) (v * 1E-9);\r
+ // TODO: Expand to make it possible to select the minute, second, nanosecond format\r
+ //printing minutes is suppressed just sec and ns\r
+ // if (sec / 60 < 10)\r
+ // str.append('0');\r
+ // str.append(sec / 60);\r
+ // str.append(':');\r
+ // sec %= 60;\r
+ // if (sec < 10)\r
+ // str.append('0');\r
+ str.append(sec);\r
+ String ns = formatNs(v, res);\r
+ if (!ns.equals("")) {\r
+ str.append(':');\r
+ str.append(ns);\r
+ }\r
+\r
+ return str.toString();\r
+ }\r
+\r
+ /**\r
+ * From input time in nanoseconds, convert to Date format YYYY-MM-dd\r
+ * \r
+ * @param absTime\r
+ * @return\r
+ */\r
+ public static String formatDate(long absTime) {\r
+ String sdate = sdateformat.format(new Date((long) (absTime * 1E-6)));\r
+ return sdate;\r
+ }\r
+\r
+ /**\r
+ * Formats time in ns to Calendar format: HH:MM:SS MMM.mmm.nnn\r
+ * \r
+ * @param time\r
+ * @return\r
+ */\r
+ static public String formatTimeAbs(long time, Resolution res) {\r
+ StringBuffer str = new StringBuffer();\r
+\r
+ // format time from nanoseconds to calendar time HH:MM:SS\r
+ String stime = stimeformat.format(new Date((long) (time * 1E-6)));\r
+ str.append(stime + " ");\r
+ // append the Milliseconds, MicroSeconds and NanoSeconds as specified in\r
+ // the Resolution\r
+ str.append(formatNs(time, res));\r
+ return str.toString();\r
+ }\r
+\r
+ /**\r
+ * Obtains the remainder fraction on unit Seconds of the entered value in\r
+ * nanoseconds. e.g. input: 1241207054171080214 ns The number of fraction\r
+ * seconds can be obtained by removing the last 9 digits: 1241207054 the\r
+ * fractional portion of seconds, expressed in ns is: 171080214\r
+ * \r
+ * @param time\r
+ * @param res\r
+ * @return\r
+ */\r
+ public static String formatNs(long time, Resolution res) {\r
+ StringBuffer temp = new StringBuffer();\r
+ boolean neg = time < 0;\r
+ if (neg) {\r
+ time = -time;\r
+ }\r
+\r
+ // The following approach could be used although performance\r
+ // decreases in half.\r
+ // String strVal = String.format("%09d", time);\r
+ // String tmp = strVal.substring(strVal.length() - 9);\r
+\r
+ // number of segments to be included\r
+ int segments = 0;\r
+ switch (res) {\r
+ case MILLISEC:\r
+ segments = 1;\r
+ break;\r
+ case MICROSEC:\r
+ segments = 2;\r
+ break;\r
+ case NANOSEC:\r
+ segments = 3;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ long ns = time;\r
+ ns %= 1000000000;\r
+ if (ns < 10) {\r
+ temp.append("00000000");\r
+ } else if (ns < 100) {\r
+ temp.append("0000000");\r
+ } else if (ns < 1000) {\r
+ temp.append("000000");\r
+ } else if (ns < 10000) {\r
+ temp.append("00000");\r
+ } else if (ns < 100000) {\r
+ temp.append("0000");\r
+ } else if (ns < 1000000) {\r
+ temp.append("000");\r
+ } else if (ns < 10000000) {\r
+ temp.append("00");\r
+ } else if (ns < 100000000) {\r
+ temp.append("0");\r
+ }\r
+ temp.append(ns);\r
+\r
+ StringBuffer str = new StringBuffer();\r
+ if (segments > 0) {\r
+ // append ms\r
+ str.append(temp.substring(0, 3));\r
+ }\r
+ if (segments > 1) {\r
+ // append Micro secs\r
+ str.append(".");\r
+ str.append(temp.substring(3, 6));\r
+ }\r
+ if (segments > 2) {\r
+ // append Nano seconds\r
+ str.append(".");\r
+ str.append(temp.substring(6));\r
+ }\r
+\r
+ return str.toString();\r
+ }\r
+\r
+ static public int loadIntOption(String opt, int def, int min, int max) {\r
+ // int val =\r
+ // TraceUIPlugin.getDefault().getPreferenceStore().getInt(opt);\r
+ // if (0 == val)\r
+ // val = def;\r
+ // if (val < min)\r
+ // val = min;\r
+ // if (val > max)\r
+ // val = max;\r
+ return def;\r
+ }\r
+\r
+ // static public int loadIntOption(String opt) {\r
+ // int val = TraceUIPlugin.getDefault().getPreferenceStore().getInt(opt);\r
+ // return val;\r
+ // }\r
+\r
+ static public void saveIntOption(String opt, int val) {\r
+ // TraceUIPlugin.getDefault().getPreferenceStore().setValue(opt, val);\r
+ }\r
+\r
+ static ITimeEvent getFirstEvent(ITmfTimeAnalysisEntry thread) {\r
+ if (null == thread)\r
+ return null;\r
+ Vector<TimeEvent> list = thread.getTraceEvents();\r
+ ITimeEvent event = null;\r
+ if (!list.isEmpty())\r
+ event = (ITimeEvent) list.get(0);\r
+ return event;\r
+ }\r
+\r
+ /**\r
+ * N means: <list> <li>-1: Previous Event</li> <li>0: Current Event</li> <li>\r
+ * 1: Next Event</li> <li>2: Previous Event when located in a non Event Area\r
+ * </list>\r
+ * \r
+ * @param thread\r
+ * @param time\r
+ * @param n\r
+ * @return\r
+ */\r
+ static ITimeEvent findEvent(ITmfTimeAnalysisEntry thread, long time, int n) {\r
+ if (null == thread)\r
+ return null;\r
+ List<TimeEvent> list = thread.getTraceEvents();\r
+ Iterator<TimeEvent> it = list.iterator();\r
+ ITimeEvent nextEvent = null;\r
+ ITimeEvent currEvent = null;\r
+ ITimeEvent prevEvent = null;\r
+\r
+ while (it.hasNext()) {\r
+ nextEvent = (ITimeEvent) it.next();\r
+ long nextStartTime = nextEvent.getTime();\r
+ \r
+ if (nextStartTime > time) {\r
+ break;\r
+ }\r
+ \r
+ if (currEvent == null || currEvent.getTime() != nextStartTime) {\r
+ prevEvent = currEvent;\r
+ currEvent = nextEvent;\r
+ }\r
+ }\r
+ \r
+ if (n == -1) { //previous\r
+ if (currEvent != null && currEvent.getTime() + currEvent.getDuration() >= time) {\r
+ return prevEvent;\r
+ } else {\r
+ return currEvent;\r
+ }\r
+ } else if (n == 0) { //current\r
+ if (currEvent != null && currEvent.getTime() + currEvent.getDuration() >= time) {\r
+ return currEvent;\r
+ } else {\r
+ return null;\r
+ }\r
+ } else if (n == 1) { //next\r
+ return nextEvent;\r
+ } else if (n == 2) { //current or previous when in empty space\r
+ return currEvent;\r
+ }\r
+ \r
+ return null;\r
+ }\r
+\r
+ // static public TRCPackage getPackage(Object element) {\r
+ // if (element instanceof TRCPackage)\r
+ // return (TRCPackage) element;\r
+ // if (element instanceof TRCClass)\r
+ // return ((TRCClass) element).getPackage();\r
+ // return null;\r
+ // }\r
+\r
+ // static public TRCObjectAllocationAnnotation getAllocationAnnotation(\r
+ // TRCClass cls) {\r
+ // TRCObjectAllocationAnnotation aa = null;\r
+ // EList list = cls.getAnnotations();\r
+ // int len = list.size();\r
+ // for (int i = 0; i < len; i++) {\r
+ // TRCAnnotation annotation = (TRCAnnotation) list.get(i);\r
+ // if (annotation instanceof TRCObjectAllocationAnnotation)\r
+ // aa = (TRCObjectAllocationAnnotation) annotation;\r
+ // }\r
+ // return aa;\r
+ // }\r
+\r
+ static public String fixMethodSignature(String sig) {\r
+ int pos = sig.indexOf('(');\r
+ if (pos >= 0) {\r
+ String ret = sig.substring(0, pos);\r
+ sig = sig.substring(pos);\r
+ sig = sig + " " + ret;\r
+ }\r
+ return sig;\r
+ }\r
+\r
+ static public String restoreMethodSignature(String sig) {\r
+ String ret = "";\r
+ int pos = sig.indexOf('(');\r
+ if (pos >= 0) {\r
+ ret = sig.substring(0, pos);\r
+ sig = sig.substring(pos + 1);\r
+ }\r
+ pos = sig.indexOf(')');\r
+ if (pos >= 0) {\r
+ sig = sig.substring(0, pos);\r
+ }\r
+ String args[] = sig.split(",");\r
+ sig = "(";\r
+ for (int i = 0; i < args.length; i++) {\r
+ String arg = args[i].trim();\r
+ if (arg.length() == 0 && args.length == 1)\r
+ break;\r
+ sig += getTypeSignature(arg);\r
+ }\r
+ sig += ")" + getTypeSignature(ret);\r
+ return sig;\r
+ }\r
+\r
+ static public String getTypeSignature(String type) {\r
+ int dim = 0;\r
+ for (int j = 0; j < type.length(); j++) {\r
+ if (type.charAt(j) == '[')\r
+ dim++;\r
+ }\r
+ int pos = type.indexOf('[');\r
+ if (pos >= 0)\r
+ type = type.substring(0, pos);\r
+ String sig = "";\r
+ for (int j = 0; j < dim; j++)\r
+ sig += "[";\r
+ if (type.equals("boolean"))\r
+ sig += "Z";\r
+ else if (type.equals("byte"))\r
+ sig += "B";\r
+ else if (type.equals("char"))\r
+ sig += "C";\r
+ else if (type.equals("short"))\r
+ sig += "S";\r
+ else if (type.equals("int"))\r
+ sig += "I";\r
+ else if (type.equals("long"))\r
+ sig += "J";\r
+ else if (type.equals("float"))\r
+ sig += "F";\r
+ else if (type.equals("double"))\r
+ sig += "D";\r
+ else if (type.equals("void"))\r
+ sig += "V";\r
+ else\r
+ sig += "L" + type.replace('.', '/') + ";";\r
+ return sig;\r
+ }\r
+\r
+ // static public boolean openSource(Object element) {\r
+ // if (element instanceof String) {\r
+ // final String pattern = (String) element;\r
+ // final int javaType = IJavaSearchConstants.METHOD;\r
+ // BusyIndicator.showWhile(Display.getDefault(), new Runnable() {\r
+ // public void run() {\r
+ // if (!OpenJavaSource.openSource(pattern, javaType,\r
+ // SearchEngine.createWorkspaceScope(), true)) {\r
+ // MessageDialog.openInformation(UIPlugin.getDefault()\r
+ // .getWorkbench().getActiveWorkbenchWindow()\r
+ // .getShell(), TraceMessages.TRC_MSGT, NLS.bind(\r
+ // TraceUIMessages._68, pattern));\r
+ // }\r
+ // }\r
+ // });\r
+ // }\r
+ // OpenSource.openSource(element);\r
+ // return true;\r
+ // }\r
+\r
+ // static public int getObjAge(TRCFullTraceObject obj, EList listGC) {\r
+ // int age = 0;\r
+ // double t0 = obj.getCreateTime();\r
+ // double t1 = obj.getCollectTime();\r
+ // int len = listGC.size();\r
+ // for (int j = 0; j < len; j++) {\r
+ // TRCGCEvent gcEvent = (TRCGCEvent) listGC.get(j);\r
+ // if (gcEvent.getType().equals("finish")) {\r
+ // double time = gcEvent.getTime();\r
+ // if (time <= t0)\r
+ // continue;\r
+ // if (t1 > 0 && time >= t1)\r
+ // break;\r
+ // age++;\r
+ // }\r
+ // }\r
+ // return age;\r
+ // }\r
+\r
+ static public int compare(double d1, double d2) {\r
+ if (d1 > d2)\r
+ return 1;\r
+ if (d1 < d2)\r
+ return 1;\r
+ return 0;\r
+ }\r
+\r
+ static public int compare(String s1, String s2) {\r
+ if (s1 != null && s2 != null)\r
+ return s1.compareToIgnoreCase(s2);\r
+ if (s1 != null)\r
+ return 1;\r
+ if (s2 != null)\r
+ return -1;\r
+ return 0;\r
+ }\r
+\r
+ // static public String formatPercent(int val, int max) {\r
+ // String s = max > 0 && max >= val ? TString\r
+ // .formatAsPercentage((double) val / (double) max) : "";\r
+ // return s;\r
+ // }\r
+}\r
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views;
+
+import org.eclipse.linuxtools.tmf.event.TmfEvent;
+import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
+import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
+import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
+import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * <b><u>TmfEventsView</u></b>
+ * <p>
+ *
+ * TODO: Implement me. Please.
+ * TODO: Handle column selection, sort, ... generically (nothing less...)
+ * TODO: Implement hide/display columns
+ */
+public class TmfEventsView extends TmfView {
+
+ public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.events";
+
+ private TmfExperiment<TmfEvent> fExperiment;
+ private String fTitlePrefix;
+
+ // ------------------------------------------------------------------------
+ // Table data
+ // ------------------------------------------------------------------------
+
+ private Table fTable;
+
+ // Table column names
+ private final String TIMESTAMP_COLUMN = "Timestamp";
+ private final String SOURCE_COLUMN = "Source";
+ private final String TYPE_COLUMN = "Type";
+ private final String REFERENCE_COLUMN = "File";
+ private final String CONTENT_COLUMN = "Content";
+ private final String[] columnProperties = new String[] {
+ TIMESTAMP_COLUMN,
+ SOURCE_COLUMN,
+ TYPE_COLUMN,
+ REFERENCE_COLUMN,
+ CONTENT_COLUMN
+ };
+
+ // Column data
+ private class ColumnData {
+ public final String header;
+ public final int width;
+ public final int alignment;
+
+ public ColumnData(String h, int w, int a) {
+ header = h;
+ width = w;
+ alignment = a;
+ }
+ };
+
+ private ColumnData[] columnData = new ColumnData[] {
+ new ColumnData(columnProperties[0], 100, SWT.LEFT),
+ new ColumnData(columnProperties[1], 100, SWT.LEFT),
+ new ColumnData(columnProperties[2], 100, SWT.LEFT),
+ new ColumnData(columnProperties[3], 100, SWT.LEFT),
+ new ColumnData(columnProperties[4], 100, SWT.LEFT)
+ };
+
+ // ------------------------------------------------------------------------
+ // Event cache
+ // ------------------------------------------------------------------------
+
+ private static final int DEFAULT_CACHE_SIZE = 1000;
+ private final int fCacheSize;
+ private TmfEvent[] cache = new TmfEvent[1];
+ private int cacheStartIndex = 0;
+ private int cacheEndIndex = 0;
+
+ // ------------------------------------------------------------------------
+ // Constructor
+ // ------------------------------------------------------------------------
+
+ public TmfEventsView(int cacheSize) {
+ super("TmfEventsView");
+ fCacheSize = cacheSize;
+ }
+
+ public TmfEventsView() {
+ this(DEFAULT_CACHE_SIZE);
+ }
+
+ // ------------------------------------------------------------------------
+ // ViewPart
+ // ------------------------------------------------------------------------
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void createPartControl(Composite parent) {
+
+ // Create a virtual table
+ // TODO: change SINGLE to MULTI line selection and adjust the selection listener
+ final int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.VIRTUAL;
+ fTable = new Table(parent, style);
+
+ // Set the table layout
+ GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ fTable.setLayoutData(layoutData);
+
+ // Some cosmetic enhancements
+ fTable.setHeaderVisible(true);
+ fTable.setLinesVisible(true);
+
+ // Set the columns
+ createColumnHeaders(fTable);
+
+ // Handle the table item requests
+ fTable.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ TmfTimestamp ts = (TmfTimestamp) fTable.getSelection()[0].getData();
+ broadcast(new TmfTimeSynchSignal(fTable, ts));
+ }
+ });
+
+ // Handle the table item requests
+ fTable.addListener(SWT.SetData, new Listener() {
+
+ public void handleEvent(Event event) {
+
+ TableItem item = (TableItem) event.item;
+ final int index = fTable.indexOf(item);
+
+ // Note: this works because handleEvent() is called once for each row, in sequence
+ if ((index >= cacheStartIndex ) && (index < cacheEndIndex)) {
+ int i = index - cacheStartIndex;
+ item.setText(extractItemFields(cache[i]));
+ item.setData(new TmfTimestamp(cache[i].getTimestamp()));
+ return;
+ }
+
+ TmfDataRequest<TmfEvent> request = new TmfDataRequest<TmfEvent>(TmfEvent.class, index, fCacheSize) {
+ @Override
+ public void handleData() {
+ TmfEvent[] tmpEvent = getData();
+ if ((tmpEvent != null) && (tmpEvent.length > 0)) {
+ cache = tmpEvent;
+ cacheStartIndex = index;
+ cacheEndIndex = index + tmpEvent.length;
+ }
+ }
+ };
+ fExperiment.sendRequest(request);
+ try {
+ request.waitForCompletion();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ if (cache[0] != null && cacheStartIndex == index) {
+ item.setText(extractItemFields(cache[0]));
+ item.setData(new TmfTimestamp(cache[0].getTimestamp()));
+ }
+
+ }
+ });
+
+ fTable.setItemCount(0);
+ fTitlePrefix = getTitle();
+
+ // If an experiment is already selected, update the table
+ fExperiment = (TmfExperiment<TmfEvent>) TmfExperiment.getCurrentExperiment();
+ if (fExperiment != null) {
+ experimentSelected(new TmfExperimentSelectedSignal<TmfEvent>(fTable, fExperiment));
+ }
+ }
+
+ /**
+ * @param table
+ *
+ * FIXME: Add support for column selection
+ */
+ protected void createColumnHeaders(Table table) {
+ for (int i = 0; i < columnData.length; i++) {
+ TableColumn column = new TableColumn(table, columnData[i].alignment, i);
+ column.setText(columnData[i].header);
+ column.setWidth(columnData[i].width);
+ }
+ }
+
+ /**
+ * @param event
+ * @return
+ *
+ * FIXME: Add support for column selection
+ */
+ protected String[] extractItemFields(TmfEvent event) {
+ String[] fields = new String[0];
+ if (event != null) {
+ fields = new String[] {
+ new Long(event.getTimestamp().getValue()).toString(),
+ event.getSource().getSourceId().toString(),
+ event.getType().getTypeId().toString(),
+ event.getReference().getReference().toString(),
+ event.getContent().toString()
+ };
+ }
+ return fields;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
+ */
+ @Override
+ public void setFocus() {
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "[TmfEventsView]";
+ }
+
+ // ------------------------------------------------------------------------
+ // Signal handlers
+ // ------------------------------------------------------------------------
+
+ @SuppressWarnings("unchecked")
+ @TmfSignalHandler
+ public void experimentSelected(TmfExperimentSelectedSignal<TmfEvent> signal) {
+ // Update the trace reference
+ fExperiment = (TmfExperiment<TmfEvent>) signal.getExperiment();
+ setPartName(fTitlePrefix + " - " + fExperiment.getName());
+
+ // Perform the updates on the UI thread
+ fTable.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ // TODO: Potentially long operation. Add some feedback for the user
+ fTable.setSelection(0);
+ fTable.clearAll();
+ cacheStartIndex = cacheEndIndex = 0; // Clear the cache
+ fTable.setItemCount((int) fExperiment.getNbEvents());
+ }
+ });
+ }
+
+ @TmfSignalHandler
+ public void experimentUpdated(TmfExperimentUpdatedSignal signal) {
+ // Perform the refresh on the UI thread
+ fTable.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (!fTable.isDisposed() && fExperiment != null) {
+ fTable.setItemCount((int) fExperiment.getNbEvents());
+ }
+ }
+ });
+ }
+
+// @TmfSignalHandler
+// public void currentTimeUpdated(TmfTimeSynchSignal signal) {
+// if (signal.getSource() != fTable && fExperiment != null) {
+// final int index = (int) fExperiment.getRank(signal.getCurrentTime());
+// // Perform the updates on the UI thread
+// fTable.getDisplay().asyncExec(new Runnable() {
+// public void run() {
+// fTable.setSelection(index);
+// // The timestamp might not correspond to an actual event
+// // and the selection will point to the next experiment event.
+// // But we would like to display both the event before and
+// // after the selected timestamp.
+// // This works fine by default except when the selected event
+// // is the top displayed event. The following ensures that we
+// // always see both events.
+// if ((index > 0) && (index == fTable.getTopIndex())) {
+// fTable.setTopIndex(index - 1);
+// }
+// }
+// });
+// }
+// }
+
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views;
+
+import org.eclipse.linuxtools.tmf.component.ITmfComponent;
+import org.eclipse.linuxtools.tmf.signal.TmfSignal;
+import org.eclipse.linuxtools.tmf.signal.TmfSignalManager;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * <b><u>TmfView</u></b>
+ * <p>
+ * TODO: Implement me. Please.
+ */
+public abstract class TmfView extends ViewPart implements ITmfComponent {
+
+ private final String fName;
+
+ // ------------------------------------------------------------------------
+ // Constructor
+ // ------------------------------------------------------------------------
+
+ public TmfView(String viewName) {
+ super();
+ fName = viewName;
+ TmfSignalManager.register(this);
+ }
+
+ @Override
+ public void dispose() {
+ TmfSignalManager.deregister(this);
+ super.dispose();
+ }
+
+ // ------------------------------------------------------------------------
+ // ITmfComponent
+ // ------------------------------------------------------------------------
+
+ public String getName() {
+ return fName;
+ }
+
+ public void broadcast(TmfSignal signal) {
+ TmfSignalManager.dispatchSignal(signal);
+ }
+
+ // ------------------------------------------------------------------------
+ // ViewPart
+ // ------------------------------------------------------------------------
+
+ @Override
+ public void createPartControl(Composite parent) {
+ // TODO Auto-generated method stub
+ }
+
+ @Override
+ public void setFocus() {
+ // TODO Auto-generated method stub
+ }
+
+}
\ No newline at end of file