1 /*******************************************************************************
2 * Copyright (c) 2012 Ericsson
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 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.internal
.lttng2
.kernel
.ui
.views
.controlflow
;
15 import java
.util
.ArrayList
;
16 import java
.util
.Arrays
;
17 import java
.util
.List
;
19 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
20 import org
.eclipse
.core
.runtime
.NullProgressMonitor
;
21 import org
.eclipse
.jface
.action
.Action
;
22 import org
.eclipse
.jface
.action
.IToolBarManager
;
23 import org
.eclipse
.jface
.action
.Separator
;
24 import org
.eclipse
.jface
.viewers
.ILabelProviderListener
;
25 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
26 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
27 import org
.eclipse
.jface
.viewers
.Viewer
;
28 import org
.eclipse
.linuxtools
.internal
.lttng2
.kernel
.ui
.Messages
;
29 import org
.eclipse
.linuxtools
.lttng2
.kernel
.core
.trace
.Attributes
;
30 import org
.eclipse
.linuxtools
.lttng2
.kernel
.core
.trace
.CtfKernelTrace
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
.CtfTmfTimestamp
;
32 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
33 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimeRange
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimestamp
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.AttributeNotFoundException
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.StateValueTypeException
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.TimeRangeException
;
38 import org
.eclipse
.linuxtools
.tmf
.core
.interval
.ITmfStateInterval
;
39 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentSelectedSignal
;
40 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfRangeSynchSignal
;
41 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
42 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimeSynchSignal
;
43 import org
.eclipse
.linuxtools
.tmf
.core
.statesystem
.IStateSystemQuerier
;
44 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
45 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfExperiment
;
46 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.TmfView
;
47 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphRangeListener
;
48 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphSelectionListener
;
49 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.ITimeGraphTimeListener
;
50 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphCombo
;
51 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphRangeUpdateEvent
;
52 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphSelectionEvent
;
53 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.TimeGraphTimeEvent
;
54 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.model
.ITimeEvent
;
55 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.model
.ITimeGraphEntry
;
56 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.model
.TimeEvent
;
57 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.widgets
.Utils
;
58 import org
.eclipse
.linuxtools
.tmf
.ui
.widgets
.timegraph
.widgets
.Utils
.Resolution
;
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
;
67 public class ControlFlowView
extends TmfView
{
69 // ------------------------------------------------------------------------
71 // ------------------------------------------------------------------------
76 public static final String ID
= "org.eclipse.linuxtools.lttng2.kernel.ui.views.controlflow"; //$NON-NLS-1$
81 private static final long INITIAL_WINDOW_OFFSET
= (1L * 100 * 1000 * 1000); // .1sec
83 private static final String PROCESS_COLUMN
= Messages
.ControlFlowView_processColumn
;
84 private static final String TID_COLUMN
= Messages
.ControlFlowView_tidColumn
;
85 private static final String PPID_COLUMN
= Messages
.ControlFlowView_ppidColumn
;
86 private static final String BIRTH_TIME_COLUMN
= Messages
.ControlFlowView_birthTimeColumn
;
87 private static final String TRACE_COLUMN
= Messages
.ControlFlowView_traceColumn
;
89 private final String
[] COLUMN_NAMES
= new String
[] {
97 // ------------------------------------------------------------------------
99 // ------------------------------------------------------------------------
101 // The timegraph combo
102 private TimeGraphCombo fTimeGraphCombo
;
104 // The selected experiment
105 private TmfExperiment
<ITmfEvent
> fSelectedExperiment
;
107 // The timegraph entry list
108 private ArrayList
<ControlFlowEntry
> fEntryList
;
111 private long fStartTime
;
114 private long fEndTime
;
117 private int fDisplayWidth
;
120 private ZoomThread fZoomThread
;
122 // The next resource action
123 private Action fNextResourceAction
;
125 // The previous resource action
126 private Action fPreviousResourceAction
;
128 // ------------------------------------------------------------------------
130 // ------------------------------------------------------------------------
132 private class TreeContentProvider
implements ITreeContentProvider
{
135 public void dispose() {
139 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
143 public Object
[] getElements(Object inputElement
) {
144 return (ITimeGraphEntry
[]) inputElement
;
148 public Object
[] getChildren(Object parentElement
) {
149 ITimeGraphEntry entry
= (ITimeGraphEntry
) parentElement
;
150 return entry
.getChildren();
154 public Object
getParent(Object element
) {
155 ITimeGraphEntry entry
= (ITimeGraphEntry
) element
;
156 return entry
.getParent();
160 public boolean hasChildren(Object element
) {
161 ITimeGraphEntry entry
= (ITimeGraphEntry
) element
;
162 return entry
.hasChildren();
167 private class TreeLabelProvider
implements ITableLabelProvider
{
170 public void addListener(ILabelProviderListener listener
) {
174 public void dispose() {
178 public boolean isLabelProperty(Object element
, String property
) {
183 public void removeListener(ILabelProviderListener listener
) {
187 public Image
getColumnImage(Object element
, int columnIndex
) {
192 public String
getColumnText(Object element
, int columnIndex
) {
193 ControlFlowEntry entry
= (ControlFlowEntry
) element
;
194 if (columnIndex
== 0) {
195 return entry
.getName();
196 } else if (columnIndex
== 1) {
197 return Integer
.toString(entry
.getThreadId());
198 } else if (columnIndex
== 2) {
199 if (entry
.getPPID() > 0) {
200 return Integer
.toString(entry
.getPPID());
202 } else if (columnIndex
== 3) {
203 return Utils
.formatTime(entry
.getBirthTime(), TimeFormat
.ABSOLUTE
, Resolution
.NANOSEC
);
204 } else if (columnIndex
== 4) {
205 return entry
.getTrace().getName();
207 return ""; //$NON-NLS-1$
212 private class ZoomThread
extends Thread
{
213 private long fZoomStartTime
;
214 private long fZoomEndTime
;
215 private long fResolution
;
216 private IProgressMonitor fMonitor
;
218 public ZoomThread(long startTime
, long endTime
) {
219 super("ControlFlowView zoom"); //$NON-NLS-1$
220 fZoomStartTime
= startTime
;
221 fZoomEndTime
= endTime
;
222 fResolution
= Math
.max(1, (fZoomEndTime
- fZoomStartTime
) / fDisplayWidth
);
223 fMonitor
= new NullProgressMonitor();
228 if (fEntryList
== null) {
231 for (ControlFlowEntry entry
: fEntryList
) {
232 if (fMonitor
.isCanceled()) {
235 zoom(entry
, fMonitor
);
240 private void zoom(ControlFlowEntry entry
, IProgressMonitor monitor
) {
241 List
<ITimeEvent
> zoomedEventList
= getEventList(entry
, fZoomStartTime
, fZoomEndTime
, fResolution
, monitor
);
242 if (fMonitor
.isCanceled()) {
245 entry
.setZoomedEventList(zoomedEventList
);
246 for (ControlFlowEntry child
: entry
.getChildren()) {
247 if (fMonitor
.isCanceled()) {
250 zoom(child
, monitor
);
254 public void cancel() {
255 fMonitor
.setCanceled(true);
259 // ------------------------------------------------------------------------
261 // ------------------------------------------------------------------------
263 public ControlFlowView() {
265 fDisplayWidth
= Display
.getDefault().getBounds().width
;
268 // ------------------------------------------------------------------------
270 // ------------------------------------------------------------------------
273 * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite)
276 public void createPartControl(Composite parent
) {
277 fTimeGraphCombo
= new TimeGraphCombo(parent
, SWT
.NONE
);
279 fTimeGraphCombo
.setTreeContentProvider(new TreeContentProvider());
281 fTimeGraphCombo
.setTreeLabelProvider(new TreeLabelProvider());
283 fTimeGraphCombo
.setTimeGraphProvider(new ControlFlowPresentationProvider());
285 fTimeGraphCombo
.setTreeColumns(COLUMN_NAMES
);
287 fTimeGraphCombo
.getTimeGraphViewer().addRangeListener(new ITimeGraphRangeListener() {
289 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event
) {
290 final long startTime
= event
.getStartTime();
291 final long endTime
= event
.getEndTime();
292 TmfTimeRange range
= new TmfTimeRange(new CtfTmfTimestamp(startTime
), new CtfTmfTimestamp(endTime
));
293 TmfTimestamp time
= new CtfTmfTimestamp(fTimeGraphCombo
.getTimeGraphViewer().getSelectedTime());
294 broadcast(new TmfRangeSynchSignal(ControlFlowView
.this, range
, time
));
295 if (fZoomThread
!= null) {
296 fZoomThread
.cancel();
298 startZoomThread(startTime
, endTime
);
302 fTimeGraphCombo
.getTimeGraphViewer().addTimeListener(new ITimeGraphTimeListener() {
304 public void timeSelected(TimeGraphTimeEvent event
) {
305 long time
= event
.getTime();
306 broadcast(new TmfTimeSynchSignal(ControlFlowView
.this, new CtfTmfTimestamp(time
)));
310 fTimeGraphCombo
.addSelectionListener(new ITimeGraphSelectionListener() {
312 public void selectionChanged(TimeGraphSelectionEvent event
) {
313 //ITimeGraphEntry selection = event.getSelection();
317 fTimeGraphCombo
.getTimeGraphViewer().setTimeCalendarFormat(true);
319 final Thread thread
= new Thread("ControlFlowView build") { //$NON-NLS-1$
322 if (TmfExperiment
.getCurrentExperiment() != null) {
323 selectExperiment(TmfExperiment
.getCurrentExperiment());
329 // View Action Handling
331 contributeToActionBars();
335 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
338 public void setFocus() {
339 fTimeGraphCombo
.setFocus();
342 // ------------------------------------------------------------------------
344 // ------------------------------------------------------------------------
347 public void experimentSelected(final TmfExperimentSelectedSignal
<?
extends ITmfEvent
> signal
) {
348 if (signal
.getExperiment().equals(fSelectedExperiment
)) {
352 final Thread thread
= new Thread("ControlFlowView build") { //$NON-NLS-1$
355 selectExperiment(signal
.getExperiment());
362 public void synchToTime(final TmfTimeSynchSignal signal
) {
363 if (signal
.getSource() == this) {
366 final long time
= signal
.getCurrentTime().normalize(0, -9).getValue();
369 for (ITmfTrace
<?
> trace
: fSelectedExperiment
.getTraces()) {
373 if (trace
instanceof CtfKernelTrace
) {
374 CtfKernelTrace ctfKernelTrace
= (CtfKernelTrace
) trace
;
375 IStateSystemQuerier ssq
= ctfKernelTrace
.getStateSystem();
376 if (time
>= ssq
.getStartTime() && time
<= ssq
.getCurrentEndTime()) {
377 List
<Integer
> currentThreadQuarks
= ssq
.getQuarks(Attributes
.CPUS
, "*", Attributes
.CURRENT_THREAD
); //$NON-NLS-1$
378 for (int currentThreadQuark
: currentThreadQuarks
) {
380 ITmfStateInterval currentThreadInterval
= ssq
.querySingleState(time
, currentThreadQuark
);
381 int currentThread
= currentThreadInterval
.getStateValue().unboxInt();
382 if (currentThread
> 0) {
383 int statusQuark
= ssq
.getQuarkAbsolute(Attributes
.THREADS
, Integer
.toString(currentThread
), Attributes
.STATUS
);
384 ITmfStateInterval statusInterval
= ssq
.querySingleState(time
, statusQuark
);
385 if (statusInterval
.getStartTime() == time
) {
386 thread
= currentThread
;
390 } catch (AttributeNotFoundException e
) {
392 } catch (TimeRangeException e
) {
394 } catch (StateValueTypeException e
) {
401 final int selectedThread
= thread
;
403 Display
.getDefault().asyncExec(new Runnable() {
406 if (fTimeGraphCombo
.isDisposed()) {
409 fTimeGraphCombo
.getTimeGraphViewer().setSelectedTime(time
, true);
410 startZoomThread(fTimeGraphCombo
.getTimeGraphViewer().getTime0(), fTimeGraphCombo
.getTimeGraphViewer().getTime1());
412 if (selectedThread
> 0) {
413 for (Object element
: fTimeGraphCombo
.getTimeGraphViewer().getExpandedElements()) {
414 if (element
instanceof ControlFlowEntry
) {
415 ControlFlowEntry entry
= (ControlFlowEntry
) element
;
416 if (entry
.getThreadId() == selectedThread
) {
417 fTimeGraphCombo
.setSelection(entry
);
427 public void synchToRange(final TmfRangeSynchSignal signal
) {
428 if (signal
.getSource() == this) {
431 final long startTime
= signal
.getCurrentRange().getStartTime().normalize(0, -9).getValue();
432 final long endTime
= signal
.getCurrentRange().getEndTime().normalize(0, -9).getValue();
433 final long time
= signal
.getCurrentTime().normalize(0, -9).getValue();
434 Display
.getDefault().asyncExec(new Runnable() {
437 if (fTimeGraphCombo
.isDisposed()) {
440 fTimeGraphCombo
.getTimeGraphViewer().setStartFinishTime(startTime
, endTime
);
441 fTimeGraphCombo
.getTimeGraphViewer().setSelectedTime(time
, false);
442 startZoomThread(startTime
, endTime
);
447 // ------------------------------------------------------------------------
449 // ------------------------------------------------------------------------
451 @SuppressWarnings("unchecked")
452 private void selectExperiment(TmfExperiment
<?
> experiment
) {
453 fStartTime
= Long
.MAX_VALUE
;
454 fEndTime
= Long
.MIN_VALUE
;
455 fSelectedExperiment
= (TmfExperiment
<ITmfEvent
>) experiment
;
456 fEntryList
= new ArrayList
<ControlFlowEntry
>();
457 for (ITmfTrace
<?
> trace
: experiment
.getTraces()) {
458 if (trace
instanceof CtfKernelTrace
) {
459 CtfKernelTrace ctfKernelTrace
= (CtfKernelTrace
) trace
;
460 IStateSystemQuerier ssq
= ctfKernelTrace
.getStateSystem();
461 long start
= ssq
.getStartTime();
462 long end
= ssq
.getCurrentEndTime();
463 fStartTime
= Math
.min(fStartTime
, start
);
464 fEndTime
= Math
.max(fEndTime
, end
);
465 List
<Integer
> threadQuarks
= ssq
.getQuarks(Attributes
.THREADS
, "*"); //$NON-NLS-1$
466 for (int threadQuark
: threadQuarks
) {
467 String threadName
= ssq
.getAttributeName(threadQuark
);
470 threadId
= Integer
.parseInt(threadName
);
471 } catch (NumberFormatException e1
) {
474 if (threadId
== 0) { // ignore the swapper thread
477 int execNameQuark
= -1;
480 execNameQuark
= ssq
.getQuarkRelative(threadQuark
, Attributes
.EXEC_NAME
);
481 } catch (AttributeNotFoundException e
) {
484 int ppidQuark
= ssq
.getQuarkRelative(threadQuark
, Attributes
.PPID
);
485 List
<ITmfStateInterval
> execNameIntervals
= ssq
.queryHistoryRange(execNameQuark
, start
, end
);
487 for (ITmfStateInterval execNameInterval
: execNameIntervals
) {
488 if (!execNameInterval
.getStateValue().isNull() && execNameInterval
.getStateValue().getType() == 1) {
489 String execName
= execNameInterval
.getStateValue().unboxStr();
490 long startTime
= execNameInterval
.getStartTime();
491 long endTime
= execNameInterval
.getEndTime() + 1;
492 if (birthTime
== -1) {
493 birthTime
= startTime
;
496 if (ppidQuark
!= -1) {
497 ITmfStateInterval ppidInterval
= ssq
.querySingleState(startTime
, ppidQuark
);
498 ppid
= ppidInterval
.getStateValue().unboxInt();
500 ControlFlowEntry entry
= new ControlFlowEntry(threadQuark
, ctfKernelTrace
, execName
, threadId
, ppid
, birthTime
, startTime
, endTime
);
501 fEntryList
.add(entry
);
502 entry
.addEvent(new TimeEvent(entry
, startTime
, endTime
- startTime
));
507 } catch (AttributeNotFoundException e
) {
509 } catch (TimeRangeException e
) {
511 } catch (StateValueTypeException e
) {
517 refresh(INITIAL_WINDOW_OFFSET
);
518 ControlFlowEntry
[] entries
= fEntryList
.toArray(new ControlFlowEntry
[0]);
519 Arrays
.sort(entries
);
520 for (ControlFlowEntry entry
: entries
) {
521 buildStatusEvents(entry
);
526 private void buildTree() {
527 ArrayList
<ControlFlowEntry
> rootList
= new ArrayList
<ControlFlowEntry
>();
528 for (ControlFlowEntry entry
: fEntryList
) {
530 if (entry
.getPPID() > 0) {
531 for (ControlFlowEntry parent
: fEntryList
) {
532 if (parent
.getThreadId() == entry
.getPPID() &&
533 entry
.getStartTime() >= parent
.getStartTime() &&
534 entry
.getStartTime() <= parent
.getEndTime()) {
535 parent
.addChild(entry
);
545 fEntryList
= rootList
;
548 private void buildStatusEvents(ControlFlowEntry entry
) {
549 IStateSystemQuerier ssq
= entry
.getTrace().getStateSystem();
550 long start
= ssq
.getStartTime();
551 long end
= ssq
.getCurrentEndTime();
552 long resolution
= Math
.max(1, (end
- start
) / fDisplayWidth
);
553 List
<ITimeEvent
> eventList
= getEventList(entry
, entry
.getStartTime(), entry
.getEndTime(), resolution
, new NullProgressMonitor());
554 entry
.setEventList(eventList
);
556 for (ITimeGraphEntry child
: entry
.getChildren()) {
557 buildStatusEvents((ControlFlowEntry
) child
);
561 private List
<ITimeEvent
> getEventList(ControlFlowEntry entry
, long startTime
, long endTime
, long resolution
, IProgressMonitor monitor
) {
562 startTime
= Math
.max(startTime
, entry
.getStartTime());
563 endTime
= Math
.min(endTime
, entry
.getEndTime());
564 if (endTime
<= startTime
) {
567 IStateSystemQuerier ssq
= entry
.getTrace().getStateSystem();
568 List
<ITimeEvent
> eventList
= null;
570 int statusQuark
= ssq
.getQuarkRelative(entry
.getThreadQuark(), Attributes
.STATUS
);
571 List
<ITmfStateInterval
> statusIntervals
= ssq
.queryHistoryRange(statusQuark
, startTime
, endTime
- 1, resolution
);
572 eventList
= new ArrayList
<ITimeEvent
>(statusIntervals
.size());
573 long lastEndTime
= -1;
574 for (ITmfStateInterval statusInterval
: statusIntervals
) {
575 if (monitor
.isCanceled()) {
578 long time
= statusInterval
.getStartTime();
579 long duration
= statusInterval
.getEndTime() - time
+ 1;
582 status
= statusInterval
.getStateValue().unboxInt();
583 } catch (StateValueTypeException e
) {
586 if (lastEndTime
!= time
&& lastEndTime
!= -1) {
587 eventList
.add(new ControlFlowEvent(entry
, lastEndTime
, time
- lastEndTime
, 0));
589 eventList
.add(new ControlFlowEvent(entry
, time
, duration
, status
));
590 lastEndTime
= time
+ duration
;
592 } catch (AttributeNotFoundException e
) {
594 } catch (TimeRangeException e
) {
600 private void refresh(final long windowRange
) {
601 Display
.getDefault().asyncExec(new Runnable() {
604 if (fTimeGraphCombo
.isDisposed()) {
607 ITimeGraphEntry
[] entries
= fEntryList
.toArray(new ITimeGraphEntry
[0]);
608 Arrays
.sort(entries
);
609 fTimeGraphCombo
.setInput(entries
);
610 fTimeGraphCombo
.getTimeGraphViewer().setTimeBounds(fStartTime
, fEndTime
);
612 long endTime
= fStartTime
+ windowRange
;
614 if (fEndTime
< endTime
) {
617 fTimeGraphCombo
.getTimeGraphViewer().setStartFinishTime(fStartTime
, endTime
);
618 for (TreeColumn column
: fTimeGraphCombo
.getTreeViewer().getTree().getColumns()) {
622 startZoomThread(fStartTime
, endTime
);
627 private void redraw() {
628 Display
.getDefault().asyncExec(new Runnable() {
631 if (fTimeGraphCombo
.isDisposed()) {
634 fTimeGraphCombo
.redraw();
635 fTimeGraphCombo
.update();
640 private void startZoomThread(long startTime
, long endTime
) {
641 if (fZoomThread
!= null) {
642 fZoomThread
.cancel();
644 fZoomThread
= new ZoomThread(startTime
, endTime
);
648 private void makeActions() {
649 fPreviousResourceAction
= fTimeGraphCombo
.getTimeGraphViewer().getPreviousItemAction();
650 fPreviousResourceAction
.setText(Messages
.ControlFlowView_previousProcessActionNameText
);
651 fPreviousResourceAction
.setToolTipText(Messages
.ControlFlowView_previousProcessActionToolTipText
);
652 fNextResourceAction
= fTimeGraphCombo
.getTimeGraphViewer().getNextItemAction();
653 fNextResourceAction
.setText(Messages
.ControlFlowView_nextProcessActionNameText
);
654 fNextResourceAction
.setToolTipText(Messages
.ControlFlowView_nextProcessActionToolTipText
);
657 private void contributeToActionBars() {
658 IActionBars bars
= getViewSite().getActionBars();
659 fillLocalToolBar(bars
.getToolBarManager());
662 private void fillLocalToolBar(IToolBarManager manager
) {
663 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getShowLegendAction());
664 manager
.add(new Separator());
665 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getResetScaleAction());
666 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getPreviousEventAction());
667 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getNextEventAction());
668 manager
.add(fPreviousResourceAction
);
669 manager
.add(fNextResourceAction
);
670 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getZoomInAction());
671 manager
.add(fTimeGraphCombo
.getTimeGraphViewer().getZoomOutAction());
672 manager
.add(new Separator());