1 /*******************************************************************************
2 * Copyright (c) 2011, 2014 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
.tmf
.ui
.project
.handlers
;
15 import java
.util
.HashMap
;
16 import java
.util
.HashSet
;
17 import java
.util
.LinkedList
;
18 import java
.util
.List
;
22 import org
.eclipse
.core
.runtime
.IConfigurationElement
;
23 import org
.eclipse
.core
.runtime
.Platform
;
24 import org
.eclipse
.jface
.action
.IContributionItem
;
25 import org
.eclipse
.jface
.action
.MenuManager
;
26 import org
.eclipse
.jface
.resource
.ImageDescriptor
;
27 import org
.eclipse
.jface
.viewers
.ISelection
;
28 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
29 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.Activator
;
30 import org
.eclipse
.linuxtools
.tmf
.core
.parsers
.custom
.CustomTxtTrace
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.parsers
.custom
.CustomTxtTraceDefinition
;
32 import org
.eclipse
.linuxtools
.tmf
.core
.parsers
.custom
.CustomXmlTrace
;
33 import org
.eclipse
.linuxtools
.tmf
.core
.parsers
.custom
.CustomXmlTraceDefinition
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.project
.model
.TmfTraceType
;
35 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
36 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceTypeUIUtils
;
37 import org
.eclipse
.ui
.IWorkbenchPage
;
38 import org
.eclipse
.ui
.IWorkbenchWindow
;
39 import org
.eclipse
.ui
.PlatformUI
;
40 import org
.eclipse
.ui
.actions
.CompoundContributionItem
;
41 import org
.eclipse
.ui
.menus
.CommandContributionItem
;
42 import org
.eclipse
.ui
.menus
.CommandContributionItemParameter
;
45 * ContributionItem for the trace type selection.
47 * @author Patrick Tassé
49 public class SelectTraceTypeContributionItem
extends CompoundContributionItem
{
51 //private static final ImageDescriptor SELECTED_ICON = ImageDescriptor.createFromImage(TmfUiPlugin.getDefault().getImageFromPath("icons/elcl16/bullet.gif")); //$NON-NLS-1$
52 private static final ImageDescriptor SELECTED_ICON
= Activator
.getDefault().getImageDescripterFromPath(
53 "icons/elcl16/bullet.gif"); //$NON-NLS-1$
54 private static final String BUNDLE_PARAMETER
= "org.eclipse.linuxtools.tmf.ui.commandparameter.select_trace_type.bundle"; //$NON-NLS-1$
55 private static final String TYPE_PARAMETER
= "org.eclipse.linuxtools.tmf.ui.commandparameter.select_trace_type.type"; //$NON-NLS-1$
56 private static final String ICON_PARAMETER
= "org.eclipse.linuxtools.tmf.ui.commandparameter.select_trace_type.icon"; //$NON-NLS-1$
57 private static final String SELECT_TRACE_TYPE_COMMAND_ID
= "org.eclipse.linuxtools.tmf.ui.command.select_trace_type"; //$NON-NLS-1$
58 private static final String CUSTOM_TXT_CATEGORY
= "Custom Text"; //$NON-NLS-1$
59 private static final String CUSTOM_XML_CATEGORY
= "Custom XML"; //$NON-NLS-1$
60 private static final String DEFAULT_TRACE_ICON_PATH
= "icons/elcl16/trace.gif"; //$NON-NLS-1$
63 protected IContributionItem
[] getContributionItems() {
65 Set
<String
> selectedTraceTypes
= new HashSet
<>();
66 IWorkbenchWindow window
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow();
67 IWorkbenchPage page
= window
.getActivePage();
68 ISelection selection
= page
.getSelection();
69 if (selection
instanceof StructuredSelection
) {
70 for (Object element
: ((StructuredSelection
) selection
).toList()) {
71 if (element
instanceof TmfTraceElement
) {
72 TmfTraceElement trace
= (TmfTraceElement
) element
;
73 selectedTraceTypes
.add(trace
.getTraceType());
78 List
<IContributionItem
> list
= new LinkedList
<>();
80 Map
<String
, MenuManager
> categoriesMap
= new HashMap
<>();
81 IConfigurationElement
[] config
= Platform
.getExtensionRegistry().getConfigurationElementsFor(
82 TmfTraceType
.TMF_TRACE_TYPE_ID
);
83 for (IConfigurationElement ce
: config
) {
84 if (ce
.getName().equals(TmfTraceType
.CATEGORY_ELEM
)) {
85 String categoryId
= ce
.getAttribute(TmfTraceType
.ID_ATTR
);
86 ImageDescriptor icon
= isSelectedCategory(categoryId
, config
, selectedTraceTypes
) ? SELECTED_ICON
: null;
87 MenuManager subMenu
= new MenuManager(ce
.getAttribute(TmfTraceType
.NAME_ATTR
), icon
, null);
88 categoriesMap
.put(categoryId
, subMenu
);
92 CustomTxtTraceDefinition
[] customTxtTraceDefinitions
= CustomTxtTraceDefinition
.loadAll();
93 if (customTxtTraceDefinitions
.length
> 0) {
94 ImageDescriptor icon
= isSelectedCategory(customTxtTraceDefinitions
, selectedTraceTypes
) ? SELECTED_ICON
: null;
95 MenuManager subMenu
= new MenuManager(CUSTOM_TXT_CATEGORY
, icon
, null);
96 categoriesMap
.put(CUSTOM_TXT_CATEGORY
, subMenu
);
99 CustomXmlTraceDefinition
[] customXmlTraceDefinitions
= CustomXmlTraceDefinition
.loadAll();
100 if (customXmlTraceDefinitions
.length
> 0) {
101 ImageDescriptor icon
= isSelectedCategory(customXmlTraceDefinitions
, selectedTraceTypes
) ? SELECTED_ICON
: null;
102 MenuManager subMenu
= new MenuManager(CUSTOM_XML_CATEGORY
, icon
, null);
103 categoriesMap
.put(CUSTOM_XML_CATEGORY
, subMenu
);
107 for (IConfigurationElement ce
: config
) {
108 if (ce
.getName().equals(TmfTraceType
.TYPE_ELEM
)) {
109 String traceBundle
= ce
.getContributor().getName();
110 String traceTypeId
= ce
.getAttribute(TmfTraceType
.ID_ATTR
);
111 String label
= ce
.getAttribute(TmfTraceType
.NAME_ATTR
).replaceAll("&", "&&"); //$NON-NLS-1$ //$NON-NLS-2$
112 boolean selected
= selectedTraceTypes
.contains(traceTypeId
);
113 MenuManager subMenu
= categoriesMap
.get(ce
.getAttribute(TmfTraceType
.CATEGORY_ATTR
));
115 /* Get the icon from the tmftracetypeui extension, if it exists */
116 String traceIcon
= null;
117 IConfigurationElement uiCE
= TmfTraceTypeUIUtils
.getTraceUIAttributes(traceTypeId
);
119 traceIcon
= uiCE
.getAttribute(TmfTraceTypeUIUtils
.ICON_ATTR
);
122 addContributionItem(list
, traceBundle
, traceTypeId
, traceIcon
, label
, selected
, subMenu
);
126 // add the custom trace types
127 for (CustomTxtTraceDefinition def
: customTxtTraceDefinitions
) {
128 String traceBundle
= Activator
.getDefault().getBundle().getSymbolicName();
129 String traceTypeId
= CustomTxtTrace
.class.getCanonicalName() + ":" + def
.definitionName
; //$NON-NLS-1$
130 String traceIcon
= DEFAULT_TRACE_ICON_PATH
;
131 String label
= def
.definitionName
;
132 boolean selected
= selectedTraceTypes
.contains(traceTypeId
);
133 MenuManager subMenu
= categoriesMap
.get(CUSTOM_TXT_CATEGORY
);
135 addContributionItem(list
, traceBundle
, traceTypeId
, traceIcon
, label
, selected
, subMenu
);
137 for (CustomXmlTraceDefinition def
: customXmlTraceDefinitions
) {
138 String traceBundle
= Activator
.getDefault().getBundle().getSymbolicName();
139 String traceTypeId
= CustomXmlTrace
.class.getCanonicalName() + ":" + def
.definitionName
; //$NON-NLS-1$
140 String traceIcon
= DEFAULT_TRACE_ICON_PATH
;
141 String label
= def
.definitionName
;
142 boolean selected
= selectedTraceTypes
.contains(traceTypeId
);
143 MenuManager subMenu
= categoriesMap
.get(CUSTOM_XML_CATEGORY
);
145 addContributionItem(list
, traceBundle
, traceTypeId
, traceIcon
, label
, selected
, subMenu
);
148 return list
.toArray(new IContributionItem
[list
.size()]);
151 private static void addContributionItem(List
<IContributionItem
> list
,
152 String traceBundle
, String traceTypeId
, String traceIcon
,
153 String label
, boolean selected
,
154 MenuManager subMenu
) {
155 Map
<String
, String
> params
;
157 params
= new HashMap
<>();
158 params
.put(BUNDLE_PARAMETER
, traceBundle
);
159 params
.put(TYPE_PARAMETER
, traceTypeId
);
160 params
.put(ICON_PARAMETER
, traceIcon
);
162 ImageDescriptor icon
= null;
164 icon
= SELECTED_ICON
;
167 CommandContributionItemParameter param
= new CommandContributionItemParameter(
168 PlatformUI
.getWorkbench().getActiveWorkbenchWindow(), // serviceLocator
169 "my.parameterid", // id //$NON-NLS-1$
170 SELECT_TRACE_TYPE_COMMAND_ID
, // commandId
171 CommandContributionItem
.STYLE_PUSH
// style
173 param
.parameters
= params
;
175 param
.disabledIcon
= icon
;
176 param
.hoverIcon
= icon
;
178 param
.visibleEnabled
= true;
180 if (subMenu
!= null) {
181 subMenu
.add(new CommandContributionItem(param
));
183 list
.add(new CommandContributionItem(param
));
187 private static boolean isSelectedCategory(String categoryId
, IConfigurationElement
[] config
, Set
<String
> selectedTraceTypes
) {
188 for (IConfigurationElement ce
: config
) {
189 if (ce
.getName().equals(TmfTraceType
.TYPE_ELEM
)) {
190 String traceTypeId
= ce
.getAttribute(TmfTraceType
.ID_ATTR
);
191 if (selectedTraceTypes
.contains(traceTypeId
)) {
192 if (categoryId
.equals(ce
.getAttribute(TmfTraceType
.CATEGORY_ATTR
))) {
201 private static boolean isSelectedCategory(CustomTxtTraceDefinition
[] customTxtTraceDefinitions
, Set
<String
> selectedTraceTypes
) {
202 for (CustomTxtTraceDefinition def
: customTxtTraceDefinitions
) {
203 String traceTypeId
= CustomTxtTrace
.class.getCanonicalName() + ":" + def
.definitionName
; //$NON-NLS-1$
204 if (selectedTraceTypes
.contains(traceTypeId
)) {
211 private static boolean isSelectedCategory(CustomXmlTraceDefinition
[] customXmlTraceDefinitions
, Set
<String
> selectedTraceTypes
) {
212 for (CustomXmlTraceDefinition def
: customXmlTraceDefinitions
) {
213 String traceTypeId
= CustomXmlTrace
.class.getCanonicalName() + ":" + def
.definitionName
; //$NON-NLS-1$
214 if (selectedTraceTypes
.contains(traceTypeId
)) {