Merge branch 'master' into lttng-kepler
authorPatrick Tasse <patrick.tasse@gmail.com>
Tue, 23 Oct 2012 14:47:15 +0000 (10:47 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Tue, 23 Oct 2012 14:47:15 +0000 (10:47 -0400)
Conflicts:
gcov/org.eclipse.linuxtools.gcov.core/src/org/eclipse/linuxtools/gcov/Activator.java
lttng/org.eclipse.linuxtools.tmf.core.tests/stubs/org/eclipse/linuxtools/tmf/tests/stubs/trace/TmfTraceStub.java
lttng/org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/ctfadaptor/CtfTmfTrace.java

Change-Id: Ifd5503a8abd3250f9c117f369de7fb9745507b8e

14 files changed:
org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/dialogs/GetEventInfoDialog.java
org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/remote/RemoteSystemProxy.java
org.eclipse.linuxtools.tmf.core.tests/stubs/org/eclipse/linuxtools/tmf/tests/stubs/trace/TmfTraceStub.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/internal/tmf/core/trace/TmfExperimentContext.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/ctfadaptor/CtfTmfTrace.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfExperiment.java
org.eclipse.linuxtools.tmf.core/src/org/eclipse/linuxtools/tmf/core/trace/TmfTrace.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/parsers/custom/CustomTxtTrace.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/parsers/custom/CustomXmlTrace.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/events/TmfEventsTable.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/uml2sd/loader/TmfUml2SDSyncLoader.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/TimeGraphViewer.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/virtualtable/TmfVirtualTable.java

index 9410c2d596880345a3edbd3a0a0869ad29edbb3a..36568a56e621b7fb72a54c8eb1c7efb4dcfd9505 100644 (file)
@@ -1,12 +1,12 @@
 /**********************************************************************
  * Copyright (c) 2012 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: 
+ *
+ * Contributors:
  *   Bernd Hufmann - Initial API and implementation
  **********************************************************************/
 package org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs;
@@ -37,7 +37,7 @@ import org.eclipse.swt.widgets.Shell;
  * <p>
  * Dialog box for collecting information about the events to enable.
  * </p>
- * 
+ *
  * @author Bernd Hufmann
  */
 public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
@@ -48,7 +48,7 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
     /**
      * The icon file for this dialog box.
      */
-    public static final String TARGET_NEW_CONNECTION_ICON_FILE = "icons/elcl16/enable_event.gif"; //$NON-NLS-1$ 
+    public static final String TARGET_NEW_CONNECTION_ICON_FILE = "icons/elcl16/enable_event.gif"; //$NON-NLS-1$
 
     // ------------------------------------------------------------------------
     // Attributes
@@ -86,7 +86,7 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
      */
     private int fSessionIndex = 0;
     /**
-     * The Channel where the events should be enabled. 
+     * The Channel where the events should be enabled.
      */
     private TraceChannelComponent fChannel;
     /**
@@ -135,7 +135,7 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
     public void setIsKernel(boolean isKernel) {
         fIsKernel = isKernel;
     }
-    
+
     /*
      * (non-Javadoc)
      * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IGetEventInfoDialog#setSessions(org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceSessionComponent[])
@@ -165,24 +165,24 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
      */
     @Override
     protected Control createDialogArea(Composite parent) {
-        
+
         // Main dialog panel
         fDialogComposite = new Composite(parent, SWT.NONE);
         GridLayout layout = new GridLayout(1, true);
         fDialogComposite.setLayout(layout);
         fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-        
+
         fSessionsGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
         fSessionsGroup.setText(Messages.TraceControl_EnableEventsSessionGroupName);
         layout = new GridLayout(1, true);
-        fSessionsGroup.setLayout(layout); 
+        fSessionsGroup.setLayout(layout);
         GridData data = new GridData(GridData.FILL_HORIZONTAL);
         fSessionsGroup.setLayoutData(data);
 
         fSessionsCombo = new CCombo(fSessionsGroup, SWT.READ_ONLY);
         fSessionsCombo.setToolTipText(Messages.TraceControl_EnableEventsSessionsTooltip);
         fSessionsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-        
+
         String items[] = new String[fSessions.length];
         for (int i = 0; i < items.length; i++) {
             items[i] = String.valueOf(fSessions[i].getName());
@@ -190,14 +190,14 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
 
         fSessionsCombo.setItems(items);
         fSessionsCombo.setEnabled(fSessions.length > 0);
-        
+
         fChannelsGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
         fChannelsGroup.setText(Messages.TraceControl_EnableEventsChannelGroupName);
         layout = new GridLayout(1, true);
         fChannelsGroup.setLayout(layout);
         data = new GridData(GridData.FILL_HORIZONTAL);
         fChannelsGroup.setLayoutData(data);
-        
+
         fChannelsCombo = new CCombo(fChannelsGroup, SWT.READ_ONLY);
         fChannelsCombo.setToolTipText(Messages.TraceControl_EnableEventsChannelsTooltip);
         fChannelsCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@@ -207,7 +207,7 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
             @Override
             public void widgetSelected(SelectionEvent e) {
                 fSessionIndex = fSessionsCombo.getSelectionIndex();
-                
+
                 if (fSessionIndex >= 0) {
                     TraceDomainComponent domain = null;
                     TraceDomainComponent[] domains = fSessions[fSessionIndex].getDomains();
@@ -227,7 +227,7 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
                         }
                         fChannelsCombo.setItems(selectionItems);
                         fChannelsCombo.setEnabled(fChannels.length > 0);
-                    } else { 
+                    } else {
                         fChannelsCombo.setItems(new String[0]);
                         fChannelsCombo.setEnabled(false);
                         fChannels = null;
@@ -240,9 +240,9 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
             public void widgetDefaultSelected(SelectionEvent e) {
             }
         });
-        
+
         getShell().setMinimumSize(new Point(300, 200));
-        
+
         return fDialogComposite;
     }
 
@@ -262,11 +262,11 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
      */
     @Override
     protected void okPressed() {
-        
+
         if (fSessionsCombo.getSelectionIndex() < 0) {
             MessageDialog.openError(getShell(),
                   Messages.TraceControl_EnableEventsDialogTitle,
-                  Messages.TraceControl_EnableEventsNoSessionError);  
+                  Messages.TraceControl_EnableEventsNoSessionError);
             return;
         }
 
@@ -275,10 +275,11 @@ public class GetEventInfoDialog extends Dialog implements IGetEventInfoDialog {
         if ((fChannels != null) && (fChannels.length > 0) && (fChannelsCombo.getSelectionIndex() < 0)) {
             MessageDialog.openError(getShell(),
                     Messages.TraceControl_EnableEventsDialogTitle,
-                    Messages.TraceControl_EnableEventsNoChannelError);  
+                    Messages.TraceControl_EnableEventsNoChannelError);
               return;
         }
-        
+        // Initialize fChannel to null
+        fChannel = null;
         if ((fChannels != null) && (fChannels.length > 0)) {
             fChannel = fChannels[fChannelsCombo.getSelectionIndex()];
         }
index fa2a964da05d9c21c6382d2b7dcd16f1937fc400..4666d8d4ac5faa92fe91aefeda1246f857ff180e 100644 (file)
@@ -12,6 +12,7 @@
 package org.eclipse.linuxtools.internal.lttng2.ui.views.control.remote;
 
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.rse.core.model.IHost;
 import org.eclipse.rse.core.model.IRSECallback;
@@ -150,7 +151,10 @@ public class RemoteSystemProxy implements IRemoteSystemProxy {
             if (!shellSubSystem.isConnected()) {
                 try {
                     shellSubSystem.connect(false, callback);
-                } catch (Exception e) {
+                } catch (OperationCanceledException e) {
+                    callback.done(Status.CANCEL_STATUS, null);
+                }
+                catch (Exception e) {
                     throw new ExecutionException(e.toString(), e);
                 }
             } else {
index e6639cae2f99d89700ba3632a23404ad146074a8..e0be954fabae02f9ff003842644168da870acf27 100644 (file)
@@ -251,7 +251,7 @@ public class TmfTraceStub extends TmfTrace implements ITmfEventParser {
         fLock.lock();
         try {
             if (fTrace != null) {
-                final ITmfLocation location = new TmfLongLocation(Long.valueOf((long) (ratio * fTrace.length())));
+                final ITmfLocation location = new TmfLongLocation(Long.valueOf(Math.round(ratio * fTrace.length())));
                 final TmfContext context = seekEvent(location);
                 context.setRank(ITmfContext.UNKNOWN_RANK);
                 return context;
index deda088286a57247012fc34c591ca0ee202d1a9e..e000140c69f726869d8d5229e0c22e076e90f149 100644 (file)
@@ -100,6 +100,17 @@ public class TmfExperimentContext extends TmfContext {
         setLastTrace(other.fLastTraceRead);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.core.trace.TmfContext#dispose()
+     */
+    @Override
+    public void dispose() {
+        for (ITmfContext context : fContexts) {
+            context.dispose();
+        }
+        super.dispose();
+    }
+
     /* (non-Javadoc)
      * @see org.eclipse.linuxtools.tmf.core.trace.TmfContext#clone()
      */
index 8d9bf4f9687770e29e96d301617f79a6eeb37e88..0cff29b22dd6a84608d29c363a386a5a78e86e37 100644 (file)
@@ -17,8 +17,8 @@ import org.eclipse.core.runtime.CoreException;
 import org.eclipse.linuxtools.ctf.core.trace.CTFReaderException;
 import org.eclipse.linuxtools.ctf.core.trace.CTFTrace;
 import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp.TimestampType;
-import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
+import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
 import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
 import org.eclipse.linuxtools.tmf.core.statesystem.ITmfStateSystem;
@@ -234,7 +234,7 @@ public class CtfTmfTrace extends TmfTrace implements ITmfEventParser {
         final long end = this.getEndTime().getValue();
         final long start = this.getStartTime().getValue();
         final long diff = end - start;
-        final long ratioTs = (long) (diff * ratio) + start;
+        final long ratioTs = Math.round(diff * ratio) + start;
         context.seek(ratioTs);
         context.setRank(ITmfContext.UNKNOWN_RANK);
         return context;
index 20ac701cb48934a9725bce887a3a7aacbb1369f3..7fdbb8460eb92c6a0f4ef97e9d34aa0040a4054f 100644 (file)
@@ -77,10 +77,6 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
      */
     private IFile fBookmarksFile;
 
-
-    // Saved experiment context (optimization)
-    private TmfExperimentContext fExperimentContext;
-
     // ------------------------------------------------------------------------
     // Construction
     // ------------------------------------------------------------------------
@@ -212,6 +208,7 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
     public ITmfTimestamp getTimestamp(final int index) {
         final ITmfContext context = seekEvent(index);
         final ITmfEvent event = getNext(context);
+        context.dispose();
         return (event != null) ? event.getTimestamp() : null;
     }
 
@@ -258,11 +255,6 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
 
         }
 
-        // Check if we are already at the right index
-        if ((fExperimentContext != null) && fExperimentContext.getRank() == request.getIndex()) {
-            return fExperimentContext;
-        }
-
         return seekEvent(request.getIndex());
     }
 
@@ -315,7 +307,6 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
         context.setLastTrace(TmfExperimentContext.NO_TRACE);
         context.setRank((location == null) ? 0 : ITmfContext.UNKNOWN_RANK);
 
-        fExperimentContext = context;
         return context;
     }
 
@@ -328,7 +319,7 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
      */
     @Override
     public ITmfContext seekEvent(final double ratio) {
-        final ITmfContext context = seekEvent((long) (ratio * getNbEvents()));
+        final ITmfContext context = seekEvent(Math.round(ratio * getNbEvents()));
         return context;
     }
 
@@ -422,7 +413,6 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
                         (TmfExperimentLocation) expContext.getLocation(),
                         trace, traceContext.getLocation()));
 
-                fExperimentContext = expContext.clone();
                 processEvent(event);
             }
         }
@@ -453,6 +443,7 @@ public class TmfExperiment extends TmfTrace implements ITmfEventParser {
         if (getStreamingInterval() == 0) {
             final ITmfContext context = seekEvent(0);
             final ITmfEvent event = getNext(context);
+            context.dispose();
             if (event == null) {
                 return;
             }
index a90ce1dd7e240f870d61d788611483e4a8320f4a..1c29a40d63d026e87bcc0a8412b39dcd66ac09c6 100644 (file)
@@ -520,9 +520,11 @@ public abstract class TmfTrace extends TmfEventProvider implements ITmfTrace {
         final ITmfContext nextEventContext = context.clone(); // Must use clone() to get the right subtype...
         ITmfEvent event = getNext(nextEventContext);
         while (event != null && event.getTimestamp().compareTo(timestamp, false) < 0) {
+            context.dispose();
             context = nextEventContext.clone();
             event = getNext(nextEventContext);
         }
+        nextEventContext.dispose();
         if (event == null) {
             context.setLocation(null);
             context.setRank(ITmfContext.UNKNOWN_RANK);
index 9e06206c094687aec92de470adbd4d19e4cb6103..f216591bfb746ce2594be5bfd5b2ad01991ab6f8 100644 (file)
@@ -125,7 +125,7 @@ public class CustomTxtTrace extends TmfTrace implements ITmfEventParser {
             return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);
         }
         try {
-            long pos = (long) (ratio * fFile.length());
+            long pos = Math.round(ratio * fFile.length());
             while (pos > 0) {
                 fFile.seek(pos - 1);
                 if (fFile.read() == '\n') {
@@ -172,7 +172,7 @@ public class CustomTxtTrace extends TmfTrace implements ITmfEventParser {
 
     @Override
     public synchronized CustomTxtEvent getNext(final ITmfContext context) {
-        final ITmfContext savedContext = context.clone();
+        final ITmfContext savedContext = new TmfContext(context.getLocation(), context.getRank());
         final CustomTxtEvent event = parse(context);
         if (event != null) {
             updateAttributes(savedContext, event.getTimestamp());
index 338c0315a6d7898f41980e6369bf903876fb1f85..a18cb4de8acd5ccaa0933de904cab436c9881126 100644 (file)
@@ -130,7 +130,7 @@ public class CustomXmlTrace extends TmfTrace implements ITmfEventParser {
             return new CustomTxtTraceContext(NULL_LOCATION, ITmfContext.UNKNOWN_RANK);
         }
         try {
-            long pos = (long) (ratio * fFile.length());
+            long pos = Math.round(ratio * fFile.length());
             while (pos > 0) {
                 fFile.seek(pos - 1);
                 if (fFile.read() == '\n') {
@@ -177,7 +177,7 @@ public class CustomXmlTrace extends TmfTrace implements ITmfEventParser {
 
     @Override
     public synchronized CustomXmlEvent getNext(final ITmfContext context) {
-        final ITmfContext savedContext = context.clone();
+        final ITmfContext savedContext = new TmfContext(context.getLocation(), context.getRank());
         final CustomXmlEvent event = parse(context);
         if (event != null) {
             updateAttributes(savedContext, event.getTimestamp());
index cd7a6a13a156e6209680b3be11dc450474ae8170..3278d48b6f4ed71103a7f0d993548ca02622db5d 100644 (file)
@@ -1942,6 +1942,7 @@ public class TmfEventsTable extends TmfComponent implements IGotoMarker,
                     // Get the rank of the selected event in the table
                     final ITmfContext context = fTrace.seekEvent(timestamp);
                     final long rank = context.getRank();
+                    context.dispose();
                     fSelectedRank = rank;
 
                     fTable.getDisplay().asyncExec(new Runnable() {
index a5c06729a7fe83b5065016614ebdbb696735dd4c..ab528339dcfa49cd4e4443e89ba821be40eae4df 100644 (file)
@@ -428,8 +428,7 @@ public class TmfUml2SDSyncLoader extends TmfComponent implements IUml2SDLoader,
     public void synchToTime(TmfTimeSynchSignal signal) {
         fLock.lock();
         try {
-            if ((signal.getSource() != this) && (fFrame != null)) {
-
+            if ((signal.getSource() != this) && (fFrame != null) && (fCheckPoints.size() > 0)) {
                 fCurrentTime = signal.getCurrentTime();
                 fIsSelect = true;
                 moveToMessage();
@@ -450,7 +449,7 @@ public class TmfUml2SDSyncLoader extends TmfComponent implements IUml2SDLoader,
     public void synchToTimeRange(TmfRangeSynchSignal signal) {
         fLock.lock();
         try {
-            if ((signal.getSource() != this) && (fFrame != null) && !fIsSignalSent) {
+            if ((signal.getSource() != this) && (fFrame != null) && !fIsSignalSent && (fCheckPoints.size() > 0)) {
                 TmfTimeRange newTimeRange = signal.getCurrentRange();
                 ITmfTimestamp delta = newTimeRange.getEndTime().getDelta(newTimeRange.getStartTime());
                 fInitialWindow = delta.getValue();
@@ -655,8 +654,12 @@ public class TmfUml2SDSyncLoader extends TmfComponent implements IUml2SDLoader,
         try {
             cancelOngoingRequests();
 
-            List<FilterCriteria> list = (List<FilterCriteria>)filters;
-            fFilterCriteria =  new ArrayList<FilterCriteria>(list);
+            if (filters == null) {
+                fFilterCriteria =  new ArrayList<FilterCriteria>();
+            } else {
+                List<FilterCriteria> list = (List<FilterCriteria>)filters;
+                fFilterCriteria =  new ArrayList<FilterCriteria>(list);
+            }
 
             fillCurrentPage(fEvents);
 
index d3e9151ce1dbf69c05def0d23ed27f05fcb2a490..55a3f544b61310698800b39d99447f84b57d9005 100644 (file)
@@ -37,6 +37,7 @@ import org.eclipse.swt.events.ControlAdapter;
 import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MenuDetectListener;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.MouseWheelListener;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -1355,6 +1356,42 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
         _verticalScrollBar.setValues(selection, min, max, thumb, increment, pageIncrement);
     }
 
+    /**
+     * @param listener a {@link MenuDetectListener}
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphControl#addTimeGraphEntryMenuListener(org.eclipse.swt.events.MenuDetectListener)
+     * @since 1.2
+     */
+    public void addTimeGraphEntryMenuListener(MenuDetectListener listener) {
+        _stateCtrl.addTimeGraphEntryMenuListener(listener);
+    }
+
+    /**
+     * @param listener a {@link MenuDetectListener}
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphControl#removeTimeGraphEntryMenuListener(org.eclipse.swt.events.MenuDetectListener)
+     * @since 1.2
+     */
+    public void removeTimeGraphEntryMenuListener(MenuDetectListener listener) {
+        _stateCtrl.removeTimeGraphEntryMenuListener(listener);
+    }
+
+    /**
+     * @param listener a {@link MenuDetectListener}
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphControl#addTimeEventMenuListener(org.eclipse.swt.events.MenuDetectListener)
+     * @since 1.2
+     */
+    public void addTimeEventMenuListener(MenuDetectListener listener) {
+        _stateCtrl.addTimeEventMenuListener(listener);
+    }
+
+    /**
+     * @param listener a {@link MenuDetectListener}
+     * @see org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.TimeGraphControl#removeTimeEventMenuListener(org.eclipse.swt.events.MenuDetectListener)
+     * @since 1.2
+     */
+    public void removeTimeEventMenuListener(MenuDetectListener listener) {
+        _stateCtrl.removeTimeEventMenuListener(listener);
+    }
+
 
 
 }
index b7b1da3b063da0f19f2dd37ca67d785d82cee75e..6ac539156d01377448fb9cf76fcbad1618df0b3d 100644 (file)
@@ -38,6 +38,8 @@ import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MenuDetectEvent;
+import org.eclipse.swt.events.MenuDetectListener;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.MouseListener;
 import org.eclipse.swt.events.MouseMoveListener;
@@ -48,6 +50,7 @@ import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.events.TraverseEvent;
 import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.events.TypedEvent;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Cursor;
 import org.eclipse.swt.graphics.GC;
@@ -67,7 +70,7 @@ import org.eclipse.swt.widgets.ScrollBar;
  * @author Alvaro Sanchez-Leon
  * @author Patrick Tasse
  */
-public class TimeGraphControl extends TimeGraphBaseControl implements FocusListener, KeyListener, MouseMoveListener, MouseListener, MouseWheelListener, ControlListener, SelectionListener, MouseTrackListener, TraverseListener, ISelectionProvider {
+public class TimeGraphControl extends TimeGraphBaseControl implements FocusListener, KeyListener, MouseMoveListener, MouseListener, MouseWheelListener, ControlListener, SelectionListener, MouseTrackListener, TraverseListener, ISelectionProvider, MenuDetectListener {
 
     private static final int DRAG_NONE = 0;
     private static final int DRAG_TRACE_ITEM = 1;
@@ -101,6 +104,8 @@ public class TimeGraphControl extends TimeGraphBaseControl implements FocusListe
     private List<SelectionListener> _selectionListeners;
     private final List<ISelectionChangedListener> _selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
     private final List<ITimeGraphTreeListener> _treeListeners = new ArrayList<ITimeGraphTreeListener>();
+    private final List<MenuDetectListener> _timeGraphEntryMenuListeners = new ArrayList<MenuDetectListener>();
+    private final List<MenuDetectListener> _timeEventMenuListeners = new ArrayList<MenuDetectListener>();
     private final Cursor _dragCursor3;
     private final Cursor _WaitCursor;
 
@@ -173,6 +178,7 @@ public class TimeGraphControl extends TimeGraphBaseControl implements FocusListe
         addTraverseListener(this);
         addKeyListener(this);
         addControlListener(this);
+        addMenuDetectListener(this);
         ScrollBar scrollHor = getHorizontalBar();
 
         if (scrollHor != null) {
@@ -487,6 +493,81 @@ public class TimeGraphControl extends TimeGraphBaseControl implements FocusListe
         }
     }
 
+    /**
+     * Add a menu listener on {@link ITimeGraphEntry}s
+     * @param listener
+     *            The listener to add
+     * @since 1.2
+     */
+    public void addTimeGraphEntryMenuListener(MenuDetectListener listener) {
+        if (!_timeGraphEntryMenuListeners.contains(listener)) {
+            _timeGraphEntryMenuListeners.add(listener);
+        }
+    }
+
+    /**
+     * Remove a menu listener on {@link ITimeGraphEntry}s
+     *
+     * @param listener
+     *            The listener to remove
+     * @since 1.2
+     */
+    public void removeTimeGraphEntryMenuListener(MenuDetectListener listener) {
+        if (_timeGraphEntryMenuListeners.contains(listener)) {
+            _timeGraphEntryMenuListeners.remove(listener);
+        }
+    }
+
+    /**
+     * Menu event callback on {@link ITimeGraphEntry}s
+     *
+     * @param event
+     *            The MenuDetectEvent, with field {@link TypedEvent#data} set to the selected {@link ITimeGraphEntry}
+     */
+    private void fireMenuEventOnTimeGraphEntry(MenuDetectEvent event) {
+        for (MenuDetectListener listener : _timeGraphEntryMenuListeners) {
+            listener.menuDetected(event);
+        }
+    }
+
+    /**
+     * Add a menu listener on {@link ITimeEvent}s
+     *
+     * @param listener
+     *            The listener to add
+     * @since 1.2
+     */
+    public void addTimeEventMenuListener(MenuDetectListener listener) {
+        if (!_timeEventMenuListeners.contains(listener)) {
+            _timeEventMenuListeners.add(listener);
+        }
+    }
+
+    /**
+     * Remove a menu listener on {@link ITimeEvent}s
+     *
+     * @param listener
+     *            The listener to remove
+     * @since 1.2
+     */
+    public void removeTimeEventMenuListener(MenuDetectListener listener) {
+        if (_timeEventMenuListeners.contains(listener)) {
+            _timeEventMenuListeners.remove(listener);
+        }
+    }
+
+    /**
+     * Menu event callback on {@link ITimeEvent}s
+     *
+     * @param event
+     *            The MenuDetectEvent, with field {@link TypedEvent#data} set to the selected {@link ITimeEvent}
+     */
+    private void fireMenuEventOnTimeEvent(MenuDetectEvent event) {
+        for (MenuDetectListener listener : _timeEventMenuListeners) {
+            listener.menuDetected(event);
+        }
+    }
+
     @Override
     public ISelection getSelection() {
         TimeGraphSelection sel = new TimeGraphSelection();
@@ -1963,5 +2044,32 @@ public class TimeGraphControl extends TimeGraphBaseControl implements FocusListe
         }
     }
 
+    /**
+     * @since 1.2
+     */
+    @Override
+    public void menuDetected(MenuDetectEvent e) {
+        if (null == _timeProvider) {
+            return;
+        }
+        Point p = toControl(e.x, e.y);
+        int idx = getItemIndexAtY(p.y);
+        if (idx >= 0 && idx < _data._expandedItems.length) {
+            Item item = _data._expandedItems[idx];
+            ITimeGraphEntry entry = item._trace;
+            if (entry.hasTimeEvents()) {
+                ITimeEvent event = Utils.findEvent(entry, getTimeAtX(p.x), 2);
+                if (event != null) {
+                    e.data = event;
+                    fireMenuEventOnTimeEvent(e);
+                    return;
+                }
+            }
+            e.data = entry;
+            fireMenuEventOnTimeGraphEntry(e);
+        }
+    }
+
 }
 
+
index 61ebda9fbb393dcefd506e9154038dd69b3572d7..e7599d6dfa183b66aa653a67dda239b9a31a86f2 100644 (file)
@@ -429,9 +429,12 @@ public class TmfVirtualTable extends Composite {
             if (fSelectedEventRank < lastEventRank) {
                 fSelectedEventRank++;
                 selectedRow = fSelectedEventRank - fTableTopEventRank;
-                if (selectedRow >= fFullyVisibleRows) {
+                if (selectedRow == fFullyVisibleRows) {
                     fTableTopEventRank++;
                     needsRefresh = true;
+                } else if (selectedRow < fFrozenRowCount || selectedRow > fFullyVisibleRows) {
+                    fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank));
+                    needsRefresh = true;
                 }
             }
             break;
@@ -442,9 +445,12 @@ public class TmfVirtualTable extends Composite {
             if (fSelectedEventRank > 0) {
                 fSelectedEventRank--;
                 selectedRow = fSelectedEventRank - fTableTopEventRank;
-                if (selectedRow < fFrozenRowCount && fTableTopEventRank > 0) {
+                if (selectedRow == fFrozenRowCount - 1 && fTableTopEventRank > 0) {
                     fTableTopEventRank--;
                     needsRefresh = true;
+                } else if (selectedRow < fFrozenRowCount || selectedRow > fFullyVisibleRows) {
+                    fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank));
+                    needsRefresh = true;
                 }
             }
             break;
@@ -474,12 +480,15 @@ public class TmfVirtualTable extends Composite {
                     fSelectedEventRank = lastEventRank;
                 }
                 selectedRow = fSelectedEventRank - fTableTopEventRank;
-                if (selectedRow > fFullyVisibleRows - 1) {
+                if (selectedRow > fFullyVisibleRows + fFrozenRowCount - 1 && selectedRow < 2 * fFullyVisibleRows) {
                     fTableTopEventRank += fFullyVisibleRows;
                     if (fTableTopEventRank > lastPageTopEntryRank) {
                         fTableTopEventRank = lastPageTopEntryRank;
                     }
                     needsRefresh = true;
+                } else if (selectedRow < fFrozenRowCount || selectedRow >= 2 * fFullyVisibleRows) {
+                    fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank));
+                    needsRefresh = true;
                 }
             }
             break;
@@ -493,12 +502,15 @@ public class TmfVirtualTable extends Composite {
                     fSelectedEventRank = fFrozenRowCount;
                 }
                 selectedRow = fSelectedEventRank - fTableTopEventRank;
-                if (selectedRow < 0) {
+                if (selectedRow < fFrozenRowCount && selectedRow > -fFullyVisibleRows) {
                     fTableTopEventRank -= fFullyVisibleRows;
                     if (fTableTopEventRank < 0) {
                         fTableTopEventRank = 0;
                     }
                     needsRefresh = true;
+                } else if (selectedRow <= -fFullyVisibleRows || selectedRow >= fFullyVisibleRows) {
+                    fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank));
+                    needsRefresh = true;
                 }
             }
             break;
This page took 0.039283 seconds and 5 git commands to generate.