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