/**********************************************************************
* 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;
* <p>
* Dialog box for collecting information about the events to enable.
* </p>
- *
+ *
* @author Bernd Hufmann
*/
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
*/
private int fSessionIndex = 0;
/**
- * The Channel where the events should be enabled.
+ * The Channel where the events should be enabled.
*/
private TraceChannelComponent fChannel;
/**
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[])
*/
@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());
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));
@Override
public void widgetSelected(SelectionEvent e) {
fSessionIndex = fSessionsCombo.getSelectionIndex();
-
+
if (fSessionIndex >= 0) {
TraceDomainComponent domain = null;
TraceDomainComponent[] domains = fSessions[fSessionIndex].getDomains();
}
fChannelsCombo.setItems(selectionItems);
fChannelsCombo.setEnabled(fChannels.length > 0);
- } else {
+ } else {
fChannelsCombo.setItems(new String[0]);
fChannelsCombo.setEnabled(false);
fChannels = null;
public void widgetDefaultSelected(SelectionEvent e) {
}
});
-
+
getShell().setMinimumSize(new Point(300, 200));
-
+
return fDialogComposite;
}
*/
@Override
protected void okPressed() {
-
+
if (fSessionsCombo.getSelectionIndex() < 0) {
MessageDialog.openError(getShell(),
Messages.TraceControl_EnableEventsDialogTitle,
- Messages.TraceControl_EnableEventsNoSessionError);
+ Messages.TraceControl_EnableEventsNoSessionError);
return;
}
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()];
}
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;
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 {
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;
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()
*/
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;
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;
*/
private IFile fBookmarksFile;
-
- // Saved experiment context (optimization)
- private TmfExperimentContext fExperimentContext;
-
// ------------------------------------------------------------------------
// Construction
// ------------------------------------------------------------------------
public ITmfTimestamp getTimestamp(final int index) {
final ITmfContext context = seekEvent(index);
final ITmfEvent event = getNext(context);
+ context.dispose();
return (event != null) ? event.getTimestamp() : null;
}
}
- // Check if we are already at the right index
- if ((fExperimentContext != null) && fExperimentContext.getRank() == request.getIndex()) {
- return fExperimentContext;
- }
-
return seekEvent(request.getIndex());
}
context.setLastTrace(TmfExperimentContext.NO_TRACE);
context.setRank((location == null) ? 0 : ITmfContext.UNKNOWN_RANK);
- fExperimentContext = context;
return context;
}
*/
@Override
public ITmfContext seekEvent(final double ratio) {
- final ITmfContext context = seekEvent((long) (ratio * getNbEvents()));
+ final ITmfContext context = seekEvent(Math.round(ratio * getNbEvents()));
return context;
}
(TmfExperimentLocation) expContext.getLocation(),
trace, traceContext.getLocation()));
- fExperimentContext = expContext.clone();
processEvent(event);
}
}
if (getStreamingInterval() == 0) {
final ITmfContext context = seekEvent(0);
final ITmfEvent event = getNext(context);
+ context.dispose();
if (event == null) {
return;
}
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);
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') {
@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());
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') {
@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());
// 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() {
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();
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();
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);
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;
_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);
+ }
+
}
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;
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;
* @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;
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;
addTraverseListener(this);
addKeyListener(this);
addControlListener(this);
+ addMenuDetectListener(this);
ScrollBar scrollHor = getHorizontalBar();
if (scrollHor != null) {
}
}
+ /**
+ * 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();
}
}
+ /**
+ * @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);
+ }
+ }
+
}
+
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;
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;
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;
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;