Commit | Line | Data |
---|---|---|
90e2b925 FC |
1 | /*******************************************************************************\r |
2 | * Copyright (c) 2010 Ericsson\r | |
013a5f1c | 3 | *\r |
90e2b925 FC |
4 | * All rights reserved. This program and the accompanying materials are\r |
5 | * made available under the terms of the Eclipse Public License v1.0 which\r | |
6 | * accompanies this distribution, and is available at\r | |
7 | * http://www.eclipse.org/legal/epl-v10.html\r | |
013a5f1c | 8 | *\r |
90e2b925 FC |
9 | * Contributors:\r |
10 | * Yuriy Vashchuk - Initial API and implementation\r | |
11 | * based on Francois Chouinard ProjectView code.\r | |
12 | */\r | |
13 | \r | |
14 | package org.eclipse.linuxtools.tmf.ui.views.filter;\r | |
15 | \r | |
16 | import java.io.IOException;\r | |
17 | \r | |
18 | import javax.xml.parsers.ParserConfigurationException;\r | |
19 | \r | |
20 | import org.eclipse.core.resources.IResource;\r | |
21 | import org.eclipse.core.resources.IWorkspace;\r | |
22 | import org.eclipse.core.resources.ResourcesPlugin;\r | |
23 | import org.eclipse.core.runtime.CoreException;\r | |
24 | import org.eclipse.jface.action.Action;\r | |
25 | import org.eclipse.jface.action.IToolBarManager;\r | |
26 | import org.eclipse.jface.action.Separator;\r | |
27 | import org.eclipse.jface.resource.ImageDescriptor;\r | |
28 | import org.eclipse.jface.viewers.ISelectionChangedListener;\r | |
29 | import org.eclipse.jface.viewers.IStructuredSelection;\r | |
30 | import org.eclipse.jface.viewers.SelectionChangedEvent;\r | |
8fd82db5 | 31 | import org.eclipse.linuxtools.internal.tmf.ui.Activator;\r |
013a5f1c | 32 | import org.eclipse.linuxtools.internal.tmf.ui.Messages;\r |
6c13869b FC |
33 | import org.eclipse.linuxtools.tmf.core.filter.model.ITmfFilterTreeNode;\r |
34 | import org.eclipse.linuxtools.tmf.core.filter.model.TmfFilterNode;\r | |
35 | import org.eclipse.linuxtools.tmf.core.filter.model.TmfFilterRootNode;\r | |
36 | import org.eclipse.linuxtools.tmf.core.filter.xml.TmfFilterXMLParser;\r | |
37 | import org.eclipse.linuxtools.tmf.core.filter.xml.TmfFilterXMLWriter;\r | |
90e2b925 FC |
38 | import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r |
39 | import org.eclipse.swt.SWT;\r | |
40 | import org.eclipse.swt.graphics.Image;\r | |
41 | import org.eclipse.swt.widgets.Composite;\r | |
42 | import org.eclipse.swt.widgets.FileDialog;\r | |
43 | import org.eclipse.swt.widgets.Shell;\r | |
44 | import org.eclipse.ui.IActionBars;\r | |
45 | import org.xml.sax.SAXException;\r | |
46 | \r | |
47 | /**\r | |
90e2b925 | 48 | * View that contain UI to the TMF filter.\r |
013a5f1c AM |
49 | *\r |
50 | * @version 1.0\r | |
51 | * @author Yuriy Vashchuk\r | |
90e2b925 FC |
52 | */\r |
53 | public class FilterView extends TmfView {\r | |
54 | \r | |
20ff3b75 AM |
55 | /** ID for the Filter view */\r |
56 | public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.filter"; //$NON-NLS-1$\r | |
90e2b925 | 57 | \r |
20ff3b75 | 58 | private static final Image SAVE_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/save_button.gif"); //$NON-NLS-1$\r |
8fd82db5 FC |
59 | private static final Image ADD_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/add_button.gif"); //$NON-NLS-1$\r |
60 | private static final Image DELETE_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/delete_button.gif"); //$NON-NLS-1$\r | |
61 | private static final Image IMPORT_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/import_button.gif"); //$NON-NLS-1$\r | |
62 | private static final Image EXPORT_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/export_button.gif"); //$NON-NLS-1$\r | |
013a5f1c | 63 | \r |
90e2b925 FC |
64 | // ------------------------------------------------------------------------\r |
65 | // Main data structures\r | |
66 | // ------------------------------------------------------------------------\r | |
67 | \r | |
20ff3b75 | 68 | private FilterViewer fViewer;\r |
013a5f1c | 69 | private final ITmfFilterTreeNode fRoot;\r |
90e2b925 | 70 | \r |
013a5f1c | 71 | private final IWorkspace fWorkspace;\r |
90e2b925 FC |
72 | \r |
73 | private SaveAction fSaveAction;\r | |
20ff3b75 AM |
74 | private AddAction fAddAction;\r |
75 | private DeleteAction fDeleteAction;\r | |
76 | private ExportAction fExportAction;\r | |
77 | private ImportAction fImportAction;\r | |
90e2b925 FC |
78 | \r |
79 | /**\r | |
80 | * Getter for the Filter Tree Root\r | |
013a5f1c | 81 | *\r |
90e2b925 FC |
82 | * @return The root of builded tree\r |
83 | */\r | |
84 | public ITmfFilterTreeNode getFilterRoot() {\r | |
85 | return fRoot;\r | |
86 | }\r | |
87 | \r | |
013a5f1c | 88 | \r |
90e2b925 FC |
89 | // ------------------------------------------------------------------------\r |
90 | // Constructor\r | |
91 | // ------------------------------------------------------------------------\r | |
92 | \r | |
93 | /**\r | |
20ff3b75 | 94 | * Default Constructor\r |
90e2b925 | 95 | */\r |
20ff3b75 AM |
96 | public FilterView() {\r |
97 | super("Filter"); //$NON-NLS-1$\r | |
013a5f1c | 98 | \r |
20ff3b75 AM |
99 | fWorkspace = ResourcesPlugin.getWorkspace();\r |
100 | try {\r | |
90e2b925 FC |
101 | fWorkspace.getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);\r |
102 | } catch (CoreException e) {\r | |
8fd82db5 | 103 | Activator.getDefault().logError("Error refreshing workspace", e); //$NON-NLS-1$\r |
90e2b925 | 104 | }\r |
013a5f1c | 105 | \r |
90e2b925 FC |
106 | fRoot = new TmfFilterRootNode();\r |
107 | for (ITmfFilterTreeNode node : FilterManager.getSavedFilters()) {\r | |
108 | fRoot.addChild(node);\r | |
109 | }\r | |
110 | }\r | |
111 | \r | |
013a5f1c | 112 | \r |
90e2b925 FC |
113 | /**\r |
114 | * Refresh the tree widget\r | |
115 | */\r | |
116 | public void refresh() {\r | |
117 | fViewer.refresh();\r | |
118 | }\r | |
013a5f1c | 119 | \r |
90e2b925 FC |
120 | /**\r |
121 | * Setter for selection\r | |
013a5f1c | 122 | *\r |
90e2b925 FC |
123 | * @param node The node to select\r |
124 | */\r | |
125 | public void setSelection(ITmfFilterTreeNode node) {\r | |
126 | fViewer.setSelection(node, true);\r | |
127 | }\r | |
128 | \r | |
fb5cad3d PT |
129 | // ------------------------------------------------------------------------\r |
130 | // ViewPart\r | |
131 | // ------------------------------------------------------------------------\r | |
132 | \r | |
133 | /* (non-Javadoc)\r | |
134 | * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(Composite)\r | |
135 | */\r | |
90e2b925 FC |
136 | @Override\r |
137 | public void createPartControl(Composite parent) {\r | |
138 | \r | |
139 | fViewer = new FilterViewer(parent, SWT.NONE);\r | |
140 | fViewer.setInput(fRoot);\r | |
013a5f1c | 141 | \r |
90e2b925 | 142 | contributeToActionBars();\r |
013a5f1c | 143 | \r |
90e2b925 FC |
144 | fViewer.addSelectionChangedListener(new ISelectionChangedListener() {\r |
145 | @Override\r | |
146 | public void selectionChanged(SelectionChangedEvent event) {\r | |
147 | if (!(event.getSelection().isEmpty()) && event.getSelection() instanceof IStructuredSelection) {\r | |
148 | fDeleteAction.setEnabled(true);\r | |
149 | fExportAction.setEnabled(true);\r | |
150 | } else {\r | |
151 | fDeleteAction.setEnabled(false);\r | |
152 | fExportAction.setEnabled(false);\r | |
153 | }\r | |
154 | }\r | |
155 | });\r | |
156 | }\r | |
157 | \r | |
fb5cad3d PT |
158 | /* (non-Javadoc)\r |
159 | * @see org.eclipse.ui.part.WorkbenchPart#setFocus()\r | |
160 | */\r | |
161 | @Override\r | |
162 | public void setFocus() {\r | |
163 | fViewer.setFocus();\r | |
164 | }\r | |
165 | \r | |
90e2b925 FC |
166 | /*\r |
167 | * (non-Javadoc)\r | |
168 | * @see java.lang.Object#toString()\r | |
169 | */\r | |
170 | @Override\r | |
171 | public String toString() {\r | |
172 | return "[FilterView]"; //$NON-NLS-1$\r | |
013a5f1c AM |
173 | }\r |
174 | \r | |
90e2b925 | 175 | \r |
90e2b925 FC |
176 | /**\r |
177 | * Builds the menu toolbar\r | |
178 | */\r | |
179 | private void contributeToActionBars() {\r | |
180 | IActionBars bars = getViewSite().getActionBars();\r | |
181 | //fillLocalPullDown(bars.getMenuManager());\r | |
182 | fillLocalToolBar(bars.getToolBarManager());\r | |
183 | }\r | |
184 | \r | |
013a5f1c | 185 | \r |
90e2b925 FC |
186 | /**\r |
187 | * Build the popup menu\r | |
013a5f1c | 188 | *\r |
90e2b925 FC |
189 | * @param manager The manager to build\r |
190 | */\r | |
191 | private void fillLocalToolBar(IToolBarManager manager) {\r | |
013a5f1c | 192 | \r |
90e2b925 FC |
193 | fSaveAction = new SaveAction();\r |
194 | fSaveAction.setImageDescriptor(ImageDescriptor.createFromImage(SAVE_IMAGE));\r | |
195 | fSaveAction.setToolTipText(Messages.FilterView_SaveActionToolTipText);\r | |
013a5f1c | 196 | \r |
90e2b925 FC |
197 | fAddAction = new AddAction();\r |
198 | fAddAction.setImageDescriptor(ImageDescriptor.createFromImage(ADD_IMAGE));\r | |
013a5f1c | 199 | fAddAction.setToolTipText(Messages.FilterView_AddActionToolTipText);\r |
90e2b925 FC |
200 | \r |
201 | fDeleteAction = new DeleteAction();\r | |
202 | fDeleteAction.setImageDescriptor(ImageDescriptor.createFromImage(DELETE_IMAGE));\r | |
203 | fDeleteAction.setToolTipText(Messages.FilterView_DeleteActionToolTipText);\r | |
204 | fDeleteAction.setEnabled(false);\r | |
205 | \r | |
206 | fExportAction = new ExportAction();\r | |
207 | fExportAction.setImageDescriptor(ImageDescriptor.createFromImage(EXPORT_IMAGE));\r | |
208 | fExportAction.setToolTipText(Messages.FilterView_ExportActionToolTipText);\r | |
209 | \r | |
210 | fImportAction = new ImportAction();\r | |
211 | fImportAction.setImageDescriptor(ImageDescriptor.createFromImage(IMPORT_IMAGE));\r | |
212 | fImportAction.setToolTipText(Messages.FilterView_ImportActionToolTipText);\r | |
213 | \r | |
214 | manager.add(fSaveAction);\r | |
215 | manager.add(new Separator());\r | |
216 | manager.add(fAddAction);\r | |
217 | manager.add(fDeleteAction);\r | |
218 | manager.add(new Separator());\r | |
219 | manager.add(fExportAction);\r | |
220 | manager.add(fImportAction);\r | |
221 | }\r | |
222 | \r | |
223 | private class SaveAction extends Action {\r | |
224 | @Override\r | |
225 | public void run() {\r | |
226 | FilterManager.setSavedFilters(fRoot.getChildren());\r | |
227 | }\r | |
228 | }\r | |
013a5f1c | 229 | \r |
90e2b925 FC |
230 | private class AddAction extends Action {\r |
231 | @Override\r | |
232 | public void run() {\r | |
013a5f1c | 233 | \r |
90e2b925 FC |
234 | TmfFilterNode newNode = new TmfFilterNode(fRoot, ""); //$NON-NLS-1$\r |
235 | refresh();\r | |
236 | setSelection(newNode);\r | |
237 | }\r | |
238 | }\r | |
013a5f1c | 239 | \r |
90e2b925 FC |
240 | private class DeleteAction extends Action {\r |
241 | @Override\r | |
242 | public void run() {\r | |
243 | ITmfFilterTreeNode node = fViewer.getSelection();\r | |
244 | if (node != null) {\r | |
245 | node.remove();\r | |
246 | }\r | |
247 | refresh();\r | |
248 | }\r | |
249 | }\r | |
013a5f1c | 250 | \r |
90e2b925 FC |
251 | private class ExportAction extends Action {\r |
252 | @Override\r | |
253 | public void run() {\r | |
254 | try {\r | |
255 | FileDialog dlg = new FileDialog(new Shell(), SWT.SAVE);\r | |
256 | dlg.setFilterNames(new String[] {Messages.FilterView_FileDialogFilterName + " (*.filter.xml)"}); //$NON-NLS-1$\r | |
257 | dlg.setFilterExtensions(new String[] {"*.filter.xml"}); //$NON-NLS-1$\r | |
013a5f1c | 258 | \r |
90e2b925 FC |
259 | String fn = dlg.open();\r |
260 | if (fn != null) {\r | |
261 | TmfFilterXMLWriter writerXML = new TmfFilterXMLWriter(fRoot);\r | |
262 | writerXML.saveTree(fn);\r | |
263 | }\r | |
013a5f1c | 264 | \r |
90e2b925 | 265 | } catch (ParserConfigurationException e) {\r |
8fd82db5 | 266 | Activator.getDefault().logError("Error parsing filter xml file", e); //$NON-NLS-1$\r |
90e2b925 FC |
267 | }\r |
268 | }\r | |
269 | }\r | |
013a5f1c | 270 | \r |
90e2b925 FC |
271 | private class ImportAction extends Action {\r |
272 | @Override\r | |
273 | public void run() {\r | |
274 | if (fViewer != null) {\r | |
275 | ITmfFilterTreeNode root = null;\r | |
276 | try {\r | |
277 | FileDialog dlg = new FileDialog(new Shell(), SWT.OPEN);\r | |
278 | dlg.setFilterNames(new String[] {Messages.FilterView_FileDialogFilterName + " (*.filter.xml)"}); //$NON-NLS-1$\r | |
279 | dlg.setFilterExtensions(new String[] {"*.filter.xml"}); //$NON-NLS-1$\r | |
013a5f1c | 280 | \r |
90e2b925 FC |
281 | TmfFilterXMLParser parserXML = null;\r |
282 | String fn = dlg.open();\r | |
283 | if (fn != null) {\r | |
284 | parserXML = new TmfFilterXMLParser(fn);\r | |
285 | root = parserXML.getTree();\r | |
286 | }\r | |
013a5f1c | 287 | \r |
90e2b925 | 288 | } catch (SAXException e) {\r |
8fd82db5 | 289 | Activator.getDefault().logError("Error importing filter xml file", e); //$NON-NLS-1$\r |
90e2b925 | 290 | } catch (IOException e) {\r |
8fd82db5 | 291 | Activator.getDefault().logError("Error importing filter xml file", e); //$NON-NLS-1$\r |
90e2b925 FC |
292 | }\r |
293 | \r | |
294 | if (root != null) {\r | |
295 | for (ITmfFilterTreeNode node : root.getChildren()) {\r | |
296 | if (node instanceof TmfFilterNode) {\r | |
297 | fRoot.addChild(node);\r | |
298 | refresh();\r | |
299 | fViewer.setSelection(node);\r | |
300 | }\r | |
301 | }\r | |
302 | }\r | |
303 | }\r | |
304 | }\r | |
305 | }\r | |
013a5f1c | 306 | \r |
90e2b925 | 307 | } |