2010-11-09 Francois Chouinard <fchouinard@gmail.com> Contribution for Bug315307
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng.ui / src / org / eclipse / linuxtools / lttng / ui / views / project / ProjectView.java
CommitLineData
6e512b93 1/*******************************************************************************
2fbfb67b 2 * Copyright (c) 2009, 2010 Ericsson
6e512b93
ASL
3 *
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
8 *
9 * Contributors:
10 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
12
13package org.eclipse.linuxtools.lttng.ui.views.project;
14
8d2e2848
FC
15import java.io.FileNotFoundException;
16
62d1696a 17import org.eclipse.core.resources.IResource;
6e512b93
ASL
18import org.eclipse.core.resources.IResourceChangeEvent;
19import org.eclipse.core.resources.IResourceChangeListener;
20import org.eclipse.core.resources.IWorkspace;
21import org.eclipse.core.resources.ResourcesPlugin;
22import org.eclipse.jface.action.MenuManager;
2fbfb67b 23import org.eclipse.jface.viewers.StructuredSelection;
6e512b93
ASL
24import org.eclipse.jface.viewers.TreeSelection;
25import org.eclipse.jface.viewers.TreeViewer;
2fbfb67b 26import org.eclipse.jface.viewers.ViewerSorter;
e31e01e8 27import org.eclipse.linuxtools.lttng.event.LttngEvent;
8827c197 28import org.eclipse.linuxtools.lttng.state.experiment.StateManagerFactory;
82e04272 29import org.eclipse.linuxtools.lttng.trace.LTTngExperiment;
6d848cce 30import org.eclipse.linuxtools.lttng.trace.LTTngTrace;
2fbfb67b
FC
31import org.eclipse.linuxtools.lttng.ui.views.project.model.ILTTngProjectTreeNode;
32import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngExperimentNode;
33import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngProjectContentProvider;
34import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngProjectLabelProvider;
35import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngProjectRoot;
36import org.eclipse.linuxtools.lttng.ui.views.project.model.LTTngTraceNode;
e31e01e8 37import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
ff4ed569 38import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
62d1696a 39import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
8d2e2848 40import org.eclipse.linuxtools.tmf.ui.views.TmfView;
6e512b93
ASL
41import org.eclipse.swt.SWT;
42import org.eclipse.swt.events.MouseAdapter;
43import org.eclipse.swt.events.MouseEvent;
44import org.eclipse.swt.widgets.Composite;
45import org.eclipse.swt.widgets.Menu;
46import org.eclipse.swt.widgets.Tree;
47
48/**
49 * <b><u>ProjectView</u></b>
50 * <p>
51 * The ProjectView keeps track of the LTTng projects in the workspace.
52 */
8d2e2848 53public class ProjectView extends TmfView {
6e512b93 54
3b38ea61 55 public static final String ID = "org.eclipse.linuxtools.lttng.ui.views.project"; //$NON-NLS-1$
6e512b93 56
2fbfb67b
FC
57 // ------------------------------------------------------------------------
58 // Main data structures
59 // ------------------------------------------------------------------------
60
6e512b93 61 private TreeViewer fViewer;
2fbfb67b 62 private LTTngProjectRoot fProjectRoot;
82e04272 63 private LTTngExperiment<LttngEvent> fSelectedExperiment = null;
2fbfb67b
FC
64
65 private IWorkspace fWorkspace;
66 private IResourceChangeListener fResourceChangeListener;
67
68 // ------------------------------------------------------------------------
69 // View refresher
70 // ------------------------------------------------------------------------
6e512b93 71
2fbfb67b 72 // Perform updates on the UI thread
6e512b93 73 private Runnable fViewRefresher = new Runnable() {
d4011df2
FC
74 @Override
75 public void run() {
db1ea19b 76 if ((fViewer != null) && (!fViewer.getTree().isDisposed())) {
2fbfb67b 77 Object[] elements = fViewer.getExpandedElements();
6e512b93 78 fViewer.refresh();
2fbfb67b
FC
79 fViewer.setExpandedElements(elements);
80 }
6e512b93
ASL
81 }
82 };
83
97bf4cb7
FC
84 public LTTngProjectRoot getRoot() {
85 return fProjectRoot;
86 }
87
2fbfb67b
FC
88 // ------------------------------------------------------------------------
89 // Constructor
90 // ------------------------------------------------------------------------
6e512b93
ASL
91
92 public ProjectView() {
2fbfb67b 93
3b38ea61 94 super("ProjectView"); //$NON-NLS-1$
2fbfb67b 95 fProjectRoot = new LTTngProjectRoot(this);
98029bc9
FC
96
97 fWorkspace = ResourcesPlugin.getWorkspace();
2fbfb67b 98 fResourceChangeListener = new IResourceChangeListener() {
d4011df2
FC
99 @Override
100 public void resourceChanged(IResourceChangeEvent event) {
6e512b93 101 if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
2fbfb67b
FC
102 fProjectRoot.refreshChildren();
103 refresh();
6e512b93
ASL
104 }
105 }
106 };
107 fWorkspace.addResourceChangeListener(fResourceChangeListener);
108 }
109
2fbfb67b
FC
110 public void refresh() {
111 Tree tree = fViewer.getTree();
112 if (tree != null && !tree.isDisposed())
113 tree.getDisplay().asyncExec(fViewRefresher);
114 }
115
116 public void setSelection(ILTTngProjectTreeNode node) {
117 fViewer.setSelection(new StructuredSelection(node), true);
118 }
119
6e512b93
ASL
120 @Override
121 public void dispose() {
2fbfb67b 122 fWorkspace.removeResourceChangeListener(fResourceChangeListener);
6e512b93
ASL
123 }
124
125 @Override
126 public void createPartControl(Composite parent) {
5e7ce884
FC
127
128 fViewer = new TreeViewer(parent, SWT.SINGLE);
5e7ce884 129 fViewer.setContentProvider(new LTTngProjectContentProvider());
2fbfb67b
FC
130 fViewer.setSorter(new ViewerSorter());
131 fViewer.setLabelProvider(new LTTngProjectLabelProvider());
132 fViewer.setInput(fProjectRoot);
6e512b93 133
2fbfb67b 134 getSite().setSelectionProvider(fViewer);
6e512b93 135 hookMouse();
2fbfb67b 136
6e512b93
ASL
137 createContextMenu();
138 }
139
2fbfb67b
FC
140 // ------------------------------------------------------------------------
141 // ViewPart
142 // ------------------------------------------------------------------------
143
144 @Override
3b38ea61 145 @SuppressWarnings("nls")
2fbfb67b
FC
146 public String toString() {
147 return "[ProjectView]";
148 }
149
150 // ------------------------------------------------------------------------
151 // hookMouse
152 // ------------------------------------------------------------------------
153
6e512b93
ASL
154 private void hookMouse() {
155 fViewer.getTree().addMouseListener(new MouseAdapter() {
5e7ce884 156 @Override
6e512b93
ASL
157 public void mouseDoubleClick(MouseEvent event) {
158 TreeSelection selection = (TreeSelection) fViewer.getSelection();
159 Object element = selection.getFirstElement();
2fbfb67b
FC
160 if (element instanceof LTTngExperimentNode) {
161 LTTngExperimentNode experiment = (LTTngExperimentNode) element;
5e7ce884 162 selectExperiment(experiment);
83e13355
FC
163 } else {
164 if (element instanceof LTTngTraceNode) {
165 LTTngTraceNode trace = (LTTngTraceNode) element;
166 selectTrace(trace);
167 }
6e512b93
ASL
168 }
169 }
170 });
171 }
172
83e13355
FC
173 private void selectTrace(LTTngTraceNode traceNode) {
174 if (fSelectedExperiment != null) {
175 fSelectedExperiment.dispose();
176 }
177
178 try {
179 ITmfTrace[] traces = new ITmfTrace[1];
180 IResource res = traceNode.getFolder();
181 String location = res.getLocation().toOSString();
182 ITmfTrace trace = new LTTngTrace(location, waitForCompletion);
183 traces[0] = trace;
184 fSelectedExperiment = new LTTngExperiment<LttngEvent>(LttngEvent.class, traceNode.getName(), traces);
185 TmfExperiment.setCurrentExperiment(fSelectedExperiment);
186
187 // Make sure the lttng-core, experiment selection context is ready
188 // for an event request from any view
189 StateManagerFactory.getExperimentManager().experimentSelected_prep(
190 (TmfExperiment<LttngEvent>) fSelectedExperiment);
191
192 broadcast(new TmfExperimentSelectedSignal<LttngEvent>(this, fSelectedExperiment));
193 } catch (FileNotFoundException e) {
194 return;
195 } catch (Exception e) {
196 e.printStackTrace();
197 }
198 }
199
8827c197 200 private boolean waitForCompletion = true;
98029bc9 201
8827c197
FC
202 /**
203 * @param experiment
204 */
f0fb9602 205 public void selectExperiment(LTTngExperimentNode experiment) {
5e7ce884 206 String expId = experiment.getName();
550d787e
FC
207 if (fSelectedExperiment != null) {
208// System.out.println(fSelectedExperiment.getName() + ": nbEvents=" + fSelectedExperiment.getNbEvents() +
209// ", nbReads=" + ((LTTngTrace) fSelectedExperiment.getTraces()[0]).nbEventsRead);
2fb2eb37 210 fSelectedExperiment.dispose();
550d787e 211 }
6e512b93 212 try {
2fbfb67b 213 LTTngTraceNode[] traceEntries = experiment.getTraces();
5e7ce884
FC
214 int nbTraces = traceEntries.length;
215 ITmfTrace[] traces = new ITmfTrace[nbTraces];
216 for (int i = 0; i < nbTraces; i++) {
2fbfb67b 217 IResource res = traceEntries[i].getFolder();
5e7ce884
FC
218 String location = res.getLocation().toOSString();
219 ITmfTrace trace = new LTTngTrace(location, waitForCompletion);
0546c023 220 traces[i] = trace;
62d1696a 221 }
82e04272 222 fSelectedExperiment = new LTTngExperiment<LttngEvent>(LttngEvent.class, expId, traces);
c1c69938
FC
223 TmfExperiment.setCurrentExperiment(fSelectedExperiment);
224
8827c197
FC
225 // Make sure the lttng-core, experiment selection context is ready
226 // for an event request from any view
227 StateManagerFactory.getExperimentManager().experimentSelected_prep(
228 (TmfExperiment<LttngEvent>) fSelectedExperiment);
229
9b635e61 230// System.out.println(System.currentTimeMillis() + ": Experiment selected");
951d134a 231 broadcast(new TmfExperimentSelectedSignal<LttngEvent>(this, fSelectedExperiment));
8d2e2848 232 } catch (FileNotFoundException e) {
8d2e2848 233 return;
6e512b93
ASL
234 } catch (Exception e) {
235 e.printStackTrace();
236 }
237 }
238
2fbfb67b
FC
239 // ------------------------------------------------------------------------
240 // createContextMenu
241 // ------------------------------------------------------------------------
242
243 // Populated from the plug-in
6e512b93 244 private void createContextMenu() {
3b38ea61 245 MenuManager menuManager = new MenuManager("#PopupMenu"); //$NON-NLS-1$
6e512b93
ASL
246 menuManager.setRemoveAllWhenShown(true);
247 Menu menu = menuManager.createContextMenu(fViewer.getControl());
248 fViewer.getControl().setMenu(menu);
249 getSite().registerContextMenu(menuManager, fViewer);
250 }
2fbfb67b 251
e31e01e8 252}
This page took 0.046158 seconds and 5 git commands to generate.