import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGBA;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.MarkerEvent;
+import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.IMarkerAxisListener;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.ITimeDataProvider;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeDataProviderCyclesConverter;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphColorScheme;
*
* @author Patrick Tasse, and others
*/
-public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
+public class TimeGraphViewer implements ITimeDataProvider, IMarkerAxisListener, SelectionListener {
/** Constant indicating that all levels of the time graph should be expanded */
public static final int ALL_LEVELS = AbstractTreeViewer.ALL_LEVELS;
* Sets the tree columns for this time graph combo's filter dialog.
*
* @param columnNames the tree column names
- * @since 2.0
+ * @since 1.2
*/
public void setFilterColumns(String[] columnNames) {
getShowFilterDialogAction().getFilterDialog().setColumnNames(columnNames);
* Sets the tree content provider used by the filter dialog
*
* @param contentProvider the tree content provider
- * @since 2.0
+ * @since 1.2
*/
public void setFilterContentProvider(ITreeContentProvider contentProvider) {
getShowFilterDialogAction().getFilterDialog().setContentProvider(contentProvider);
* Sets the tree label provider used by the filter dialog
*
* @param labelProvider the tree label provider
- * @since 2.0
+ * @since 1.2
*/
public void setFilterLabelProvider(ITableLabelProvider labelProvider) {
getShowFilterDialogAction().getFilterDialog().setLabelProvider(labelProvider);
super.redraw();
}
};
- fDataViewer.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent e) {
- if (fMarkersMenu != null) {
- fMarkersMenu.dispose();
- }
+ fDataViewer.addDisposeListener((e) -> {
+ if (fMarkersMenu != null) {
+ fMarkersMenu.dispose();
}
});
GridLayout gl = new GridLayout(2, false);
fTimeScaleCtrl.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseScrolled(MouseEvent e) {
- fTimeGraphCtrl.zoom(e.count > 0);
+ if (e.count == 0) {
+ return;
+ }
+ if ((e.stateMask & SWT.CTRL) != 0) {
+ fTimeGraphCtrl.zoom(e.count > 0);
+ } else {
+ fTimeGraphCtrl.horizontalScroll(e.count > 0);
+ }
}
});
fTimeGraphCtrl.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseScrolled(MouseEvent e) {
- adjustVerticalScrollBar();
+ if (e.count == 0) {
+ return;
+ }
+ /*
+ * On some platforms the mouse scroll event is sent to the
+ * control that has focus even if it is not under the cursor.
+ * Handle the event only if not over the time graph control.
+ */
+ Point ctrlParentCoords = fTimeAlignedComposite.toControl(fTimeGraphCtrl.toDisplay(e.x, e.y));
+ Point scrollBarParentCoords = fDataViewer.toControl(fTimeGraphCtrl.toDisplay(e.x, e.y));
+ if (fTimeGraphCtrl.getBounds().contains(ctrlParentCoords)) {
+ /* the time graph control handles the event */
+ adjustVerticalScrollBar();
+ } else if (fTimeScaleCtrl.getBounds().contains(ctrlParentCoords)
+ || fMarkerAxisCtrl.getBounds().contains(ctrlParentCoords)
+ || fHorizontalScrollBar.getBounds().contains(scrollBarParentCoords)) {
+ if ((e.stateMask & SWT.CTRL) != 0) {
+ fTimeGraphCtrl.zoom(e.count > 0);
+ } else {
+ fTimeGraphCtrl.horizontalScroll(e.count > 0);
+ }
+ } else {
+ /* over the vertical scroll bar or outside of the viewer */
+ setTopIndex(getTopIndex() - e.count);
+ }
}
});
fTimeGraphCtrl.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
- if ((e.character == '+' || e.character == '=') && ((e.stateMask & SWT.CTRL) == 0)) {
- zoomIn();
- } else if (e.character == '-' && ((e.stateMask & SWT.CTRL) == 0)) {
- zoomOut();
- } else if (e.keyCode == '.') {
+ if (e.keyCode == '.') {
boolean extend = (e.stateMask & SWT.SHIFT) != 0;
if (extend) {
extendToNextMarker();
fMarkerAxisCtrl = createTimeGraphMarkerAxis(fTimeAlignedComposite, fColorScheme, this);
fMarkerAxisCtrl.setLayoutData(new GridData(SWT.FILL, SWT.DEFAULT, true, false));
+ fMarkerAxisCtrl.addMarkerAxisListener(this);
fMarkerAxisCtrl.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseScrolled(MouseEvent e) {
- fTimeGraphCtrl.zoom(e.count > 0);
+ if (e.count == 0) {
+ return;
+ }
+ if ((e.stateMask & SWT.CTRL) != 0) {
+ fTimeGraphCtrl.zoom(e.count > 0);
+ } else {
+ fTimeGraphCtrl.horizontalScroll(e.count > 0);
+ }
}
});
fHorizontalScrollBar.addListener(SWT.MouseWheel, new Listener() {
@Override
public void handleEvent(Event event) {
- if ((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL) {
- getTimeGraphControl().zoom(event.count > 0);
- } else {
- getTimeGraphControl().horizontalScroll(event.count > 0);
- }
// don't handle the immediately following SWT.Selection event
event.doit = false;
+ if (event.count == 0) {
+ return;
+ }
+ if ((event.stateMask & SWT.CTRL) != 0) {
+ fTimeGraphCtrl.zoom(event.count > 0);
+ } else {
+ fTimeGraphCtrl.horizontalScroll(event.count > 0);
+ }
}
});
fHorizontalScrollBar.addListener(SWT.Selection, new Listener() {
fDataViewer.update();
adjustHorizontalScrollBar();
adjustVerticalScrollBar();
+
+ fDataViewer.addDisposeListener((e) -> {
+ saveOptions();
+ fColorScheme.dispose();
+ });
+
return fDataViewer;
}
/**
- * Dispose the view.
+ * Dispose the time graph viewer.
*/
public void dispose() {
- saveOptions();
- fTimeGraphCtrl.dispose();
fDataViewer.dispose();
- fColorScheme.dispose();
}
/**
fTimeRangeFixed = false;
}
+ /**
+ * @since 2.0
+ */
+ @Override
+ public void resetStartFinishTime(boolean notify) {
+ if (notify) {
+ setStartFinishTimeNotify(fTime0Bound, fTime1Bound);
+ } else {
+ setStartFinishTime(fTime0Bound, fTime1Bound);
+ }
+ fTimeRangeFixed = false;
+ }
+
@Override
public void setSelectedTimeNotify(long time, boolean ensureVisible) {
setSelectedTimeInt(time, ensureVisible, true);
}
/**
- * @since 2.0
+ * @since 1.2
*/
@Override
public void setSelectionRangeNotify(long beginTime, long endTime, boolean ensureVisible) {
}
/**
- * @since 2.0
+ * @since 1.2
*/
@Override
public void setSelectionRange(long beginTime, long endTime, boolean ensureVisible) {
fMarkerAxisCtrl.setMarkerCategories(fMarkerCategories);
}
+ /**
+ * @since 2.0
+ */
+ @Override
+ public void setMarkerCategoryVisible(String category, boolean visible) {
+ boolean changed = false;
+ if (visible) {
+ changed = fHiddenMarkerCategories.remove(category);
+ } else {
+ changed = fHiddenMarkerCategories.add(category);
+ }
+ if (changed) {
+ updateMarkerList();
+ updateMarkerActions();
+ getControl().redraw();
+ }
+ }
+
/**
* Set the markers list.
*
adjustVerticalScrollBar();
}
+ /**
+ * Select an entry and reveal it
+ *
+ * @param entry
+ * The entry to select
+ * @since 2.0
+ */
+ public void selectAndReveal(@NonNull ITimeGraphEntry entry) {
+ final ITimeGraphEntry parent = entry.getParent();
+ if (parent != null) {
+ fTimeGraphCtrl.setExpandedState(parent, true);
+ }
+ fSelectedEntry = entry;
+ fTimeGraphCtrl.selectItem(entry, false);
+ adjustVerticalScrollBar();
+ }
+
/**
* Get the number of expanded (visible) time graph entries. This includes
* leafs and does not include filtered-out entries.
}
};
- fNextEventAction.setText(Messages.TmfTimeGraphViewer_NextEventActionNameText);
- fNextEventAction.setToolTipText(Messages.TmfTimeGraphViewer_NextEventActionToolTipText);
- fNextEventAction.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_NEXT_EVENT));
+ fNextEventAction.setText(Messages.TmfTimeGraphViewer_NextStateChangeActionNameText);
+ fNextEventAction.setToolTipText(Messages.TmfTimeGraphViewer_NextStateChangeActionToolTipText);
+ fNextEventAction.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_NEXT_STATE_CHANGE));
}
return fNextEventAction;
}
};
- fPrevEventAction.setText(Messages.TmfTimeGraphViewer_PreviousEventActionNameText);
- fPrevEventAction.setToolTipText(Messages.TmfTimeGraphViewer_PreviousEventActionToolTipText);
- fPrevEventAction.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_PREV_EVENT));
+ fPrevEventAction.setText(Messages.TmfTimeGraphViewer_PreviousStateChangeActionNameText);
+ fPrevEventAction.setToolTipText(Messages.TmfTimeGraphViewer_PreviousStateChangeActionToolTipText);
+ fPrevEventAction.setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_PREV_STATE_CHANGE));
}
return fPrevEventAction;
* Get the show filter dialog action.
*
* @return The Action object
- * @since 2.0
+ * @since 1.2
*/
public ShowFilterDialogAction getShowFilterDialogAction() {
if (fShowFilterDialogAction == null) {
final Action action = new Action(category, IAction.AS_CHECK_BOX) {
@Override
public void runWithEvent(Event event) {
- if (isChecked()) {
- fHiddenMarkerCategories.remove(getText());
- } else {
- fHiddenMarkerCategories.add(getText());
- }
- updateMarkerList();
- updateMarkerActions();
- getControl().redraw();
+ setMarkerCategoryVisible(getText(), isChecked());
}
};
action.setChecked(!fHiddenMarkerCategories.contains(category));
if ((marker.getTime() > time ||
(marker.getTime() == time && marker.getDuration() > duration))
&& !fSkippedMarkerCategories.contains(marker.getCategory())) {
- setSelectionRangeNotify(marker.getTime(), marker.getTime() + marker.getDuration(), true);
+ setSelectionRangeNotify(marker.getTime(), marker.getTime() + marker.getDuration(), false);
+ ensureVisible(marker.getTime());
+ notifyRangeListeners();
fTimeGraphCtrl.updateStatusLine();
return;
}
if ((marker.getTime() < time ||
(marker.getTime() == time && marker.getDuration() < duration))
&& !fSkippedMarkerCategories.contains(marker.getCategory())) {
- setSelectionRangeNotify(marker.getTime(), marker.getTime() + marker.getDuration(), true);
+ setSelectionRangeNotify(marker.getTime(), marker.getTime() + marker.getDuration(), false);
+ ensureVisible(marker.getTime());
+ notifyRangeListeners();
fTimeGraphCtrl.updateStatusLine();
return;
}
* Returns this viewer's filters.
*
* @return an array of viewer filters
- * @since 2.0
+ * @since 1.2
*/
public @NonNull ViewerFilter[] getFilters() {
return fTimeGraphCtrl.getFilters();
*
* @param filters
* an array of viewer filters, or null
- * @since 2.0
+ * @since 1.2
*/
public void setFilters(@NonNull ViewerFilter[] filters) {
fTimeGraphCtrl.setFilters(filters);