1 /*******************************************************************************
2 * Copyright (c) 2011, 2014 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 * Francois Chouinard - Initial API and implementation
11 * Patrick Tasse - Fix propagation to experiment traces
12 * Geneviève Bastien - Add support of experiment types
13 *******************************************************************************/
15 package org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.handlers
;
17 import java
.util
.ArrayList
;
18 import java
.util
.HashSet
;
19 import java
.util
.Iterator
;
20 import java
.util
.List
;
23 import org
.eclipse
.core
.commands
.AbstractHandler
;
24 import org
.eclipse
.core
.commands
.ExecutionEvent
;
25 import org
.eclipse
.core
.commands
.ExecutionException
;
26 import org
.eclipse
.core
.resources
.IResource
;
27 import org
.eclipse
.core
.runtime
.CoreException
;
28 import org
.eclipse
.core
.runtime
.IStatus
;
29 import org
.eclipse
.core
.runtime
.MultiStatus
;
30 import org
.eclipse
.core
.runtime
.Status
;
31 import org
.eclipse
.jface
.dialogs
.ErrorDialog
;
32 import org
.eclipse
.jface
.viewers
.ISelection
;
33 import org
.eclipse
.jface
.viewers
.ISelectionProvider
;
34 import org
.eclipse
.jface
.viewers
.TreeSelection
;
35 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.Activator
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.project
.model
.TmfTraceType
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.project
.model
.TraceTypeHelper
;
38 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfCommonProjectElement
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfExperimentElement
;
40 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfExperimentFolder
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfProjectElement
;
42 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceTypeUIUtils
;
44 import org
.eclipse
.swt
.widgets
.Shell
;
45 import org
.eclipse
.ui
.IWorkbenchPage
;
46 import org
.eclipse
.ui
.IWorkbenchPart
;
47 import org
.eclipse
.ui
.IWorkbenchWindow
;
48 import org
.eclipse
.ui
.PlatformUI
;
51 * <b><u>SetTraceTypeHandler</u></b>
54 public class SelectTraceTypeHandler
extends AbstractHandler
{
56 // ------------------------------------------------------------------------
58 // ------------------------------------------------------------------------
60 private static final String TYPE_PARAMETER
= "org.eclipse.linuxtools.tmf.ui.commandparameter.select_trace_type.type"; //$NON-NLS-1$
62 // ------------------------------------------------------------------------
64 // ------------------------------------------------------------------------
66 private TreeSelection fSelection
= null;
68 // ------------------------------------------------------------------------
70 // ------------------------------------------------------------------------
73 public boolean isEnabled() {
75 // Check if we are closing down
76 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
82 IWorkbenchPage page
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage();
83 IWorkbenchPart part
= page
.getActivePart();
87 ISelectionProvider selectionProvider
= part
.getSite().getSelectionProvider();
88 if (selectionProvider
== null) {
91 ISelection selection
= selectionProvider
.getSelection();
93 // Make sure selection contains only traces
95 if (selection
instanceof TreeSelection
) {
96 fSelection
= (TreeSelection
) selection
;
97 Iterator
<Object
> iterator
= fSelection
.iterator();
98 while (iterator
.hasNext()) {
99 Object element
= iterator
.next();
100 if (!(element
instanceof TmfCommonProjectElement
)) {
106 // If we get here, either nothing is selected or everything is a trace
107 return !selection
.isEmpty();
110 // ------------------------------------------------------------------------
112 // ------------------------------------------------------------------------
115 public Object
execute(ExecutionEvent event
) throws ExecutionException
{
117 // Check if we are closing down
118 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
119 if (window
== null) {
122 List
<IStatus
> statuses
= new ArrayList
<>();
123 Set
<TmfProjectElement
> projects
= new HashSet
<>();
125 for (Object element
: fSelection
.toList()) {
126 TmfCommonProjectElement trace
= (TmfCommonProjectElement
) element
;
127 if (trace
instanceof TmfTraceElement
) {
128 trace
= ((TmfTraceElement
) trace
).getElementUnderTraceFolder();
130 IResource resource
= trace
.getResource();
131 if (resource
!= null) {
133 // Set the trace type for this resource
134 String traceType
= event
.getParameter(TYPE_PARAMETER
);
135 String previousTraceType
= trace
.getTraceType();
136 IStatus status
= propagateProperties(trace
, traceType
);
140 if ((previousTraceType
!= null) && (!traceType
.equals(previousTraceType
))) {
141 // Close the trace if open
142 trace
.closeEditors();
143 // Delete all supplementary resources
144 trace
.deleteSupplementaryResources();
147 statuses
.add(status
);
149 projects
.add(trace
.getProject());
150 } catch (CoreException e
) {
151 Activator
.getDefault().logError(Messages
.SelectTraceTypeHandler_ErrorSelectingTrace
+ trace
.getName(), e
);
156 for (TmfProjectElement project
: projects
) {
161 final Shell shell
= window
.getShell();
162 MultiStatus info
= new MultiStatus(Activator
.PLUGIN_ID
, 1, Messages
.SelectTraceTypeHandler_TraceFailedValidation
, null);
163 if (statuses
.size() > 1)
165 info
= new MultiStatus(Activator
.PLUGIN_ID
, 1, Messages
.SelectTraceTypeHandler_TracesFailedValidation
, null);
167 for (IStatus status
: statuses
) {
170 ErrorDialog
.openError(shell
, Messages
.SelectTraceTypeHandler_Title
, Messages
.SelectTraceTypeHandler_InvalidTraceType
, info
);
175 private static IStatus
propagateProperties(TmfCommonProjectElement element
, String traceType
)
176 throws CoreException
{
178 TraceTypeHelper traceTypeHelper
= TmfTraceType
.getTraceType(traceType
);
179 if (traceTypeHelper
== null) {
180 return Status
.CANCEL_STATUS
;
182 final IStatus validateTraceType
= traceTypeHelper
.validate(element
.getResource().getLocation().toOSString());
183 if (!validateTraceType
.isOK()) {
184 return validateTraceType
;
187 IResource resource
= element
.getResource();
188 TmfTraceTypeUIUtils
.setTraceType(resource
, traceTypeHelper
);
190 TmfExperimentFolder experimentFolder
= element
.getProject().getExperimentsFolder();
191 for (final TmfExperimentElement experiment
: experimentFolder
.getExperiments()) {
192 for (final TmfTraceElement child
: experiment
.getTraces()) {
193 if (child
.getName().equals(element
.getName())) {
194 TmfTraceTypeUIUtils
.setTraceType(child
.getResource(), traceTypeHelper
);
200 return Status
.OK_STATUS
;