1 /*******************************************************************************
2 * Copyright (c) 2012, 2013 Ericsson, École Polytechnique de Montréal
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Patrick Tasse - Initial API and implementation
11 * Bernd Hufmann - Updated signal handling
12 * Geneviève Bastien - Move code to provide base classes for time graph view
13 * Marc-Andre Laperle - Add time zone preference
14 *******************************************************************************/
16 package org
.eclipse
.linuxtools
.tmf
.ui
.views
.timegraph
;
18 import java
.util
.ArrayList
;
19 import java
.util
.Arrays
;
20 import java
.util
.Collections
;
21 import java
.util
.Comparator
;
22 import java
.util
.HashMap
;
23 import java
.util
.List
;
26 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
27 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
28 import org
.eclipse
.jface
.action
.Action
;
29 import org
.eclipse
.jface
.action
.IToolBarManager
;
30 import org
.eclipse
.jface
.action
.Separator
;
31 import org
.eclipse
.jface
.viewers
.ILabelProviderListener
;
32 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
33 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
34 import org
.eclipse
.jface
.viewers
.Viewer
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
.CtfTmfTimestamp
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfRangeSynchSignal
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
38 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimeSynchSignal
;
39 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimestampFormatUpdateSignal
;
40 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceClosedSignal
;
41 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceOpenedSignal
;
42 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
43 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.ITmfTimestamp
;
44 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimeRange
;
45 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimestamp
;
46 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
47 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.TmfView
;
48 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphRangeListener
;
49 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphSelectionListener
;
50 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphTimeListener
;
51 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphCombo
;
52 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphPresentationProvider
;
53 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphRangeUpdateEvent
;
54 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphSelectionEvent
;
55 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphTimeEvent
;
56 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.model
.ITimeEvent
;
57 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.model
.ITimeGraphEntry
;
58 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.model
.TimeGraphEntry
;
59 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.widgets
.Utils
.TimeFormat
;
60 import org
.eclipse
.swt
.SWT
;
61 import org
.eclipse
.swt
.graphics
.Image
;
62 import org
.eclipse
.swt
.widgets
.Composite
;
63 import org
.eclipse
.swt
.widgets
.Display
;
64 import org
.eclipse
.swt
.widgets
.TreeColumn
;
65 import org
.eclipse
.ui
.IActionBars
;
68 * An abstract view all time graph views can inherit
70 * This view contains a time graph combo, divided between a treeview on the
71 * left, showing entries and a canvas on the right to draw something for these
76 public abstract class AbstractTimeGraphView
extends TmfView
{
78 private final String
[] fColumns
;
79 private final String
[] fFilterColumns
;
88 // ------------------------------------------------------------------------
90 // ------------------------------------------------------------------------
92 /** The timegraph combo */
93 private TimeGraphCombo fTimeGraphCombo
;
95 /** The selected trace */
96 private ITmfTrace fTrace
;
98 /** The timegraph entry list */
99 private List
<TimeGraphEntry
> fEntryList
;
101 /** The trace to entry list hash map */
102 private final Map
<ITmfTrace
, List
<TimeGraphEntry
>> fEntryListMap
= new HashMap
<ITmfTrace
, List
<TimeGraphEntry
>>();
104 /* The trace to build thread hash map */
105 private final Map
<ITmfTrace
, BuildThread
> fBuildThreadMap
= new HashMap
<ITmfTrace
, BuildThread
>();
107 /** The start time */
108 private long fStartTime
;
111 private long fEndTime
;
113 /** The display width */
114 private final int fDisplayWidth
;
116 /** The zoom thread */
117 private ZoomThread fZoomThread
;
119 /** The next resource action */
120 private Action fNextResourceAction
;
122 /** The previous resource action */
123 private Action fPreviousResourceAction
;
125 /** The relative weight of the sash */
126 private int[] fWeight
= { 1, 1 };
128 /** A comparator class */
129 private Comparator
<ITimeGraphEntry
> fEntryComparator
= null;
131 /** The redraw state used to prevent unnecessary queuing of display runnables */
132 private State fRedrawState
= State
.IDLE
;
134 /** The redraw synchronization object */
135 private final Object fSyncObj
= new Object();
137 /** The presentation provider for this view */
138 private final TimeGraphPresentationProvider fPresentation
;
140 private TreeLabelProvider fLabelProvider
= new TreeLabelProvider();
142 // ------------------------------------------------------------------------
143 // Getters and setters
144 // ------------------------------------------------------------------------
147 * Getter for the time graph combo
149 * @return The Time graph combo
151 protected TimeGraphCombo
getTimeGraphCombo() {
152 return fTimeGraphCombo
;
156 * Sets the tree label provider
159 * The tree label provider
161 protected void setTreeLabelProvider(final TreeLabelProvider tlp
) {
162 fLabelProvider
= tlp
;
166 * Sets the relative weight of each part of the time graph combo
169 * The array of relative weights of each part of the combo
171 protected void setWeight(final int[] weights
) {
176 * Gets the display width
178 * @return the display width
180 protected int getDisplayWidth() {
181 return fDisplayWidth
;
185 * Gets the comparator for the entries
187 * @return The entry comparator
189 protected Comparator
<ITimeGraphEntry
> getEntryComparator() {
190 return fEntryComparator
;
194 * Sets the comparator class for the entries * Gets the display width
197 * A comparator object
199 protected void setEntryComparator(final Comparator
<ITimeGraphEntry
> comparator
) {
200 fEntryComparator
= comparator
;
204 * Gets the trace displayed in the view
208 protected ITmfTrace
getTrace() {
213 * Sets the trace to display
218 protected void setTrace(final ITmfTrace trace
) {
223 * Gets the start time
225 * @return The start time
227 protected long getStartTime() {
232 * Sets the start time
237 protected void setStartTime(long time
) {
244 * @return The end time
246 protected long getEndTime() {
256 protected void setEndTime(long time
) {
261 * Gets the entry list map
263 * @return the entry list map
265 protected Map
<ITmfTrace
, List
<TimeGraphEntry
>> getEntryListMap() {
266 return Collections
.unmodifiableMap(fEntryListMap
);
270 * Adds an entry to the entry list
275 * The list of time graph entries
277 protected void putEntryList(ITmfTrace trace
, List
<TimeGraphEntry
> list
) {
278 synchronized(fEntryListMap
) {
279 fEntryListMap
.put(trace
, list
);
284 * Text for the "next" button
286 * @return The "next" button text
288 protected String
getNextText() {
289 return Messages
.AbstractTimeGraphtView_NextText
;
293 * Tooltip for the "next" button
295 * @return Tooltip for the "next" button
297 protected String
getNextTooltip() {
298 return Messages
.AbstractTimeGraphView_NextTooltip
;
302 * Text for the "Previous" button
304 * @return The "Previous" button text
306 protected String
getPrevText() {
307 return Messages
.AbstractTimeGraphView_PreviousText
;
311 * Tooltip for the "previous" button
313 * @return Tooltip for the "previous" button
315 protected String
getPrevTooltip() {
316 return Messages
.AbstractTimeGraphView_PreviousTooltip
;
319 // ------------------------------------------------------------------------
321 // ------------------------------------------------------------------------
323 private class TreeContentProvider
implements ITreeContentProvider
{
326 public void dispose() {
330 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
334 public Object
[] getElements(Object inputElement
) {
335 return (ITimeGraphEntry
[]) inputElement
;
339 public Object
[] getChildren(Object parentElement
) {
340 ITimeGraphEntry entry
= (ITimeGraphEntry
) parentElement
;
341 List
<?
extends ITimeGraphEntry
> children
= entry
.getChildren();
342 return children
.toArray(new ITimeGraphEntry
[children
.size()]);
346 public Object
getParent(Object element
) {
347 ITimeGraphEntry entry
= (ITimeGraphEntry
) element
;
348 return entry
.getParent();
352 public boolean hasChildren(Object element
) {
353 ITimeGraphEntry entry
= (ITimeGraphEntry
) element
;
354 return entry
.hasChildren();
360 * Base class to provide the labels for the left tree view entry. Views
361 * extending this class typically need to override the getColumnText method
362 * if they have more than one column to display
364 protected static class TreeLabelProvider
implements ITableLabelProvider
{
367 public void addListener(ILabelProviderListener listener
) {
371 public void dispose() {
375 public boolean isLabelProperty(Object element
, String property
) {
380 public void removeListener(ILabelProviderListener listener
) {
384 public Image
getColumnImage(Object element
, int columnIndex
) {
389 public String
getColumnText(Object element
, int columnIndex
) {
390 TimeGraphEntry entry
= (TimeGraphEntry
) element
;
391 if (columnIndex
== 0) {
392 return entry
.getName();
394 return ""; //$NON-NLS-1$
399 private class BuildThread
extends Thread
{
400 private final ITmfTrace fBuildTrace
;
401 private final IProgressMonitor fMonitor
;
403 public BuildThread(final ITmfTrace trace
, final String name
) {
404 super(name
+ " build"); //$NON-NLS-1$
406 fMonitor
= new NullProgressMonitor();
411 buildEventList(fBuildTrace
, fMonitor
);
412 synchronized (fBuildThreadMap
) {
413 fBuildThreadMap
.remove(this);
417 public void cancel() {
418 fMonitor
.setCanceled(true);
422 private class ZoomThread
extends Thread
{
423 private final List
<TimeGraphEntry
> fZoomEntryList
;
424 private final long fZoomStartTime
;
425 private final long fZoomEndTime
;
426 private final long fResolution
;
427 private final IProgressMonitor fMonitor
;
429 public ZoomThread(List
<TimeGraphEntry
> entryList
, long startTime
, long endTime
, String name
) {
430 super(name
+ " zoom"); //$NON-NLS-1$
431 fZoomEntryList
= entryList
;
432 fZoomStartTime
= startTime
;
433 fZoomEndTime
= endTime
;
434 fResolution
= Math
.max(1, (fZoomEndTime
- fZoomStartTime
) / fDisplayWidth
);
435 fMonitor
= new NullProgressMonitor();
440 if (fZoomEntryList
== null) {
443 for (TimeGraphEntry entry
: fZoomEntryList
) {
444 if (fMonitor
.isCanceled()) {
447 zoom(entry
, fMonitor
);
451 private void zoom(TimeGraphEntry entry
, IProgressMonitor monitor
) {
452 if (fZoomStartTime
<= fStartTime
&& fZoomEndTime
>= fEndTime
) {
453 entry
.setZoomedEventList(null);
455 List
<ITimeEvent
> zoomedEventList
= getEventList(entry
, fZoomStartTime
, fZoomEndTime
, fResolution
, monitor
);
456 if (zoomedEventList
!= null) {
457 entry
.setZoomedEventList(zoomedEventList
);
461 for (TimeGraphEntry child
: entry
.getChildren()) {
462 if (fMonitor
.isCanceled()) {
465 zoom(child
, monitor
);
469 public void cancel() {
470 fMonitor
.setCanceled(true);
474 // ------------------------------------------------------------------------
476 // ------------------------------------------------------------------------
484 * The columns to display in the tree view on the left
486 * The columns list to filter the view
488 * The presentation provider
490 public AbstractTimeGraphView(String id
, String
[] cols
, String
[] filterCols
,
491 TimeGraphPresentationProvider pres
) {
494 fFilterColumns
= filterCols
;
495 fPresentation
= pres
;
496 fDisplayWidth
= Display
.getDefault().getBounds().width
;
499 // ------------------------------------------------------------------------
501 // ------------------------------------------------------------------------
504 public void createPartControl(Composite parent
) {
505 fTimeGraphCombo
= new TimeGraphCombo(parent
, SWT
.NONE
, fWeight
);
507 fTimeGraphCombo
.setTreeContentProvider(new TreeContentProvider());
509 fTimeGraphCombo
.setTreeLabelProvider(fLabelProvider
);
511 fTimeGraphCombo
.setTimeGraphProvider(fPresentation
);
513 fTimeGraphCombo
.setTreeColumns(fColumns
);
515 fTimeGraphCombo
.setFilterContentProvider(new TreeContentProvider());
517 fTimeGraphCombo
.setFilterLabelProvider(new TreeLabelProvider());
519 fTimeGraphCombo
.setFilterColumns(fFilterColumns
);
521 fTimeGraphCombo
.getTimeGraphViewer().addRangeListener(new ITimeGraphRangeListener() {
523 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event
) {
524 final long startTime
= event
.getStartTime();
525 final long endTime
= event
.getEndTime();
526 TmfTimeRange range
= new TmfTimeRange(new CtfTmfTimestamp(startTime
), new CtfTmfTimestamp(endTime
));
527 TmfTimestamp time
= new CtfTmfTimestamp(fTimeGraphCombo
.getTimeGraphViewer().getSelectedTime());
528 broadcast(new TmfRangeSynchSignal(AbstractTimeGraphView
.this, range
, time
));
529 if (fZoomThread
!= null) {
530 fZoomThread
.cancel();
532 startZoomThread(startTime
, endTime
);
536 fTimeGraphCombo
.getTimeGraphViewer().addTimeListener(new ITimeGraphTimeListener() {
538 public void timeSelected(TimeGraphTimeEvent event
) {
539 long time
= event
.getTime();
540 broadcast(new TmfTimeSynchSignal(AbstractTimeGraphView
.this, new CtfTmfTimestamp(time
)));
544 fTimeGraphCombo
.addSelectionListener(new ITimeGraphSelectionListener() {
546 public void selectionChanged(TimeGraphSelectionEvent event
) {
547 // ITimeGraphEntry selection = event.getSelection();
551 fTimeGraphCombo
.getTimeGraphViewer().setTimeFormat(TimeFormat
.CALENDAR
);
553 // View Action Handling
555 contributeToActionBars();
557 ITmfTrace trace
= getActiveTrace();
559 traceSelected(new TmfTraceSelectedSignal(this, trace
));
562 // make selection available to other views
563 getSite().setSelectionProvider(fTimeGraphCombo
.getTreeViewer());
567 public void setFocus() {
568 fTimeGraphCombo
.setFocus();
571 // ------------------------------------------------------------------------
573 // ------------------------------------------------------------------------
576 * Handler for the trace opened signal.
579 * The incoming signal
583 public void traceOpened(TmfTraceOpenedSignal signal
) {
584 fTrace
= signal
.getTrace();
589 * Handler for the trace selected signal
592 * The incoming signal
595 public void traceSelected(final TmfTraceSelectedSignal signal
) {
596 if (signal
.getTrace() == fTrace
) {
599 fTrace
= signal
.getTrace();
605 * Trace is closed: clear the data structures and the view
608 * the signal received
611 public void traceClosed(final TmfTraceClosedSignal signal
) {
612 synchronized (fBuildThreadMap
) {
613 BuildThread buildThread
= fBuildThreadMap
.remove(signal
.getTrace());
614 if (buildThread
!= null) {
615 buildThread
.cancel();
618 synchronized (fEntryListMap
) {
619 fEntryListMap
.remove(signal
.getTrace());
621 if (signal
.getTrace() == fTrace
) {
625 if (fZoomThread
!= null) {
626 fZoomThread
.cancel();
633 * Handler for the synch signal
636 * The signal that's received
639 public void synchToTime(final TmfTimeSynchSignal signal
) {
640 if (signal
.getSource() == this || fTrace
== null) {
643 final long time
= signal
.getCurrentTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
645 Display
.getDefault().asyncExec(new Runnable() {
648 if (fTimeGraphCombo
.isDisposed()) {
651 fTimeGraphCombo
.getTimeGraphViewer().setSelectedTime(time
, true);
652 startZoomThread(fTimeGraphCombo
.getTimeGraphViewer().getTime0(), fTimeGraphCombo
.getTimeGraphViewer().getTime1());
654 synchingToTime(time
);
660 * Handler for the range sync signal
663 * The signal that's received
666 public void synchToRange(final TmfRangeSynchSignal signal
) {
667 if (signal
.getSource() == this || fTrace
== null) {
670 if (signal
.getCurrentRange().getIntersection(fTrace
.getTimeRange()) == null) {
673 final long startTime
= signal
.getCurrentRange().getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
674 final long endTime
= signal
.getCurrentRange().getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
675 final long time
= signal
.getCurrentTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
676 Display
.getDefault().asyncExec(new Runnable() {
679 if (fTimeGraphCombo
.isDisposed()) {
682 fTimeGraphCombo
.getTimeGraphViewer().setStartFinishTime(startTime
, endTime
);
683 fTimeGraphCombo
.getTimeGraphViewer().setSelectedTime(time
, false);
684 startZoomThread(startTime
, endTime
);
690 * @param signal the format of the timestamps was updated.
693 public void updateTimeFormat( final TmfTimestampFormatUpdateSignal signal
){
694 this.fTimeGraphCombo
.refresh();
697 // ------------------------------------------------------------------------
699 // ------------------------------------------------------------------------
701 private void loadTrace() {
702 synchronized (fEntryListMap
) {
703 fEntryList
= fEntryListMap
.get(fTrace
);
704 if (fEntryList
== null) {
705 synchronized (fBuildThreadMap
) {
706 BuildThread buildThread
= new BuildThread(fTrace
, this.getName());
707 fBuildThreadMap
.put(fTrace
, buildThread
);
711 fStartTime
= fTrace
.getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
712 fEndTime
= fTrace
.getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
719 * Method called when synching to a given timestamp. Inheriting classes can
720 * perform actions here to update the view at the given timestamp.
723 * The currently selected time
725 protected void synchingToTime(long time
) {
730 * Build the entries list to show in this time graph
732 * Called from the BuildThread
735 * The trace being built
737 * The progress monitor object
739 protected abstract void buildEventList(final ITmfTrace trace
, IProgressMonitor monitor
);
742 * Gets the list of event for an entry in a given timerange
745 * The entry to get events for
747 * Start of the time range
749 * End of the time range
753 * The progress monitor object
754 * @return The list of events for the entry
756 protected abstract List
<ITimeEvent
> getEventList(TimeGraphEntry entry
,
757 long startTime
, long endTime
, long resolution
,
758 IProgressMonitor monitor
);
761 * Refresh the display
763 protected void refresh() {
764 Display
.getDefault().asyncExec(new Runnable() {
767 if (fTimeGraphCombo
.isDisposed()) {
770 ITimeGraphEntry
[] entries
= null;
771 synchronized (fEntryListMap
) {
772 fEntryList
= fEntryListMap
.get(fTrace
);
773 if (fEntryList
== null) {
774 fEntryList
= new ArrayList
<TimeGraphEntry
>();
776 entries
= fEntryList
.toArray(new ITimeGraphEntry
[0]);
778 if (fEntryComparator
!= null) {
779 Arrays
.sort(entries
, fEntryComparator
);
781 fTimeGraphCombo
.setInput(entries
);
782 fTimeGraphCombo
.getTimeGraphViewer().setTimeBounds(fStartTime
, fEndTime
);
784 long timestamp
= fTrace
== null ?
0 : fTraceManager
.getCurrentTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
785 long startTime
= fTrace
== null ?
0 : fTraceManager
.getCurrentRange().getStartTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
786 long endTime
= fTrace
== null ?
0 : fTraceManager
.getCurrentRange().getEndTime().normalize(0, ITmfTimestamp
.NANOSECOND_SCALE
).getValue();
787 startTime
= Math
.max(startTime
, fStartTime
);
788 endTime
= Math
.min(endTime
, fEndTime
);
789 fTimeGraphCombo
.getTimeGraphViewer().setSelectedTime(timestamp
, false);
790 fTimeGraphCombo
.getTimeGraphViewer().setStartFinishTime(startTime
, endTime
);
792 for (TreeColumn column
: fTimeGraphCombo
.getTreeViewer().getTree().getColumns()) {
796 startZoomThread(startTime
, endTime
);
804 protected void redraw() {
805 synchronized (fSyncObj
) {
806 if (fRedrawState
== State
.IDLE
) {
807 fRedrawState
= State
.BUSY
;
809 fRedrawState
= State
.PENDING
;
813 Display
.getDefault().asyncExec(new Runnable() {
816 if (fTimeGraphCombo
.isDisposed()) {
819 fTimeGraphCombo
.redraw();
820 fTimeGraphCombo
.update();
821 synchronized (fSyncObj
) {
822 if (fRedrawState
== State
.PENDING
) {
823 fRedrawState
= State
.IDLE
;
826 fRedrawState
= State
.IDLE
;
833 private void startZoomThread(long startTime
, long endTime
) {
834 if (fZoomThread
!= null) {
835 fZoomThread
.cancel();
837 fZoomThread
= new ZoomThread(fEntryList
, startTime
, endTime
, getName());
841 private void makeActions() {
842 fPreviousResourceAction
= fTimeGraphCombo
.getTimeGraphViewer().getPreviousItemAction();
843 fPreviousResourceAction
.setText(getPrevText());
844 fPreviousResourceAction
.setToolTipText(getPrevTooltip());
845 fNextResourceAction
= fTimeGraphCombo
.getTimeGraphViewer().getNextItemAction();
846 fNextResourceAction
.setText(getNextText());
847 fNextResourceAction
.setToolTipText(getNextTooltip());
850 private void contributeToActionBars() {
851 IActionBars bars
= getViewSite().getActionBars();
852 fillLocalToolBar(bars
.getToolBarManager());
855 private void fillLocalToolBar(IToolBarManager manager
) {
856 if (fFilterColumns
.length
> 0) {
857 manager
.add(fTimeGraphCombo
.getShowFilterAction());
859 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getShowLegendAction());
860 manager
.add(new Separator());
861 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getResetScaleAction());
862 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getPreviousEventAction());
863 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getNextEventAction());
864 manager
.add(fPreviousResourceAction
);
865 manager
.add(fNextResourceAction
);
866 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getZoomInAction());
867 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getZoomOutAction());
868 manager
.add(new Separator());