Merge branch 'master' into TmfTraceModel-new
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.ui / src / org / eclipse / linuxtools / internal / lttng2 / ui / views / control / dialogs / AddContextDialog.java
1 /**********************************************************************
2 * Copyright (c) 2012 Ericsson
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 * Bernd Hufmann - Initial API and implementation
11 **********************************************************************/
12 package org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs;
13
14 import java.util.ArrayList;
15 import java.util.Iterator;
16 import java.util.List;
17
18 import org.eclipse.jface.dialogs.Dialog;
19 import org.eclipse.jface.dialogs.IDialogConstants;
20 import org.eclipse.jface.viewers.CheckStateChangedEvent;
21 import org.eclipse.jface.viewers.CheckboxTreeViewer;
22 import org.eclipse.jface.viewers.ColumnLabelProvider;
23 import org.eclipse.jface.viewers.ICheckStateListener;
24 import org.eclipse.jface.viewers.ITreeContentProvider;
25 import org.eclipse.jface.viewers.Viewer;
26 import org.eclipse.linuxtools.internal.lttng2.ui.Activator;
27 import org.eclipse.linuxtools.internal.lttng2.ui.views.control.Messages;
28 import org.eclipse.swt.SWT;
29 import org.eclipse.swt.graphics.Point;
30 import org.eclipse.swt.layout.GridData;
31 import org.eclipse.swt.layout.GridLayout;
32 import org.eclipse.swt.widgets.Composite;
33 import org.eclipse.swt.widgets.Control;
34 import org.eclipse.swt.widgets.Group;
35 import org.eclipse.swt.widgets.Shell;
36
37 /**
38 * <b><u>AddContextDialog</u></b>
39 * <p>
40 * Dialog box for collecting information about contexts to be added to channels/events.
41 * </p>
42 */
43 public class AddContextDialog extends Dialog implements IAddContextDialog {
44
45 // ------------------------------------------------------------------------
46 // Constants
47 // ------------------------------------------------------------------------
48
49 /**
50 * The icon file for this dialog box.
51 */
52 public static final String ADD_CONTEXT_ICON_FILE = "icons/elcl16/add-context.gif"; //$NON-NLS-1$
53
54 // ------------------------------------------------------------------------
55 // Attributes
56 // ------------------------------------------------------------------------
57 /**
58 * The dialog composite.
59 */
60 private Composite fDialogComposite;
61 /**
62 * A tree viewer for displaying and selection of available contexts.
63 */
64 private CheckboxTreeViewer fContextsViewer;
65 /**
66 * A Tree model for the checkbox tree viewer.
67 */
68 private ContextModel fContextModel = new ContextModel();
69 /**
70 * The contexts to add.
71 */
72 private List<String> fSelectedContexts = new ArrayList<String>();
73
74 // ------------------------------------------------------------------------
75 // Constructors
76 // ------------------------------------------------------------------------
77 /**
78 * Constructor
79 * @param shell - a shell for the display of the dialog
80 */
81 public AddContextDialog(Shell shell) {
82 super(shell);
83 setShellStyle(SWT.RESIZE);
84 }
85
86 // ------------------------------------------------------------------------
87 // Accessors
88 // ------------------------------------------------------------------------
89
90 /*
91 * (non-Javadoc)
92 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IAddContextDialog#setAvalibleContexts(java.util.List)
93 */
94 @Override
95 public void setAvalibleContexts(List<String> contexts) {
96 fContextModel.setAvalibleContexts(contexts);
97 }
98
99 /*
100 * (non-Javadoc)
101 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IAddContextDialog#getContexts()
102 */
103 @Override
104 public List<String> getContexts() {
105 List<String> ret = new ArrayList<String>();
106 ret.addAll(fSelectedContexts);
107 return ret;
108 }
109
110 // ------------------------------------------------------------------------
111 // Operations
112 // ------------------------------------------------------------------------
113 /*
114 * (non-Javadoc)
115 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
116 */
117 @Override
118 protected void configureShell(Shell newShell) {
119 super.configureShell(newShell);
120 newShell.setText(Messages.TraceControl_AddContextDialogTitle);
121 newShell.setImage(Activator.getDefault().loadIcon(ADD_CONTEXT_ICON_FILE));
122 }
123
124 /*
125 * (non-Javadoc)
126 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
127 */
128 @Override
129 protected Control createDialogArea(Composite parent) {
130
131 // Main dialog panel
132 fDialogComposite = new Composite(parent, SWT.NONE);
133 GridLayout layout = new GridLayout(1, true);
134 fDialogComposite.setLayout(layout);
135 fDialogComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
136
137 // Contexts list
138 Group contextGroup = new Group(fDialogComposite, SWT.SHADOW_NONE);
139 contextGroup.setText(Messages.TraceControl_AddContextAvailableContextsLabel);
140 layout = new GridLayout(1, true);
141 contextGroup.setLayout(layout);
142 contextGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
143
144 fContextsViewer = new CheckboxTreeViewer(contextGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
145 fContextsViewer.getTree().setToolTipText(Messages.TraceControl_AddContextAvailableContextsTooltip);
146
147 fContextsViewer.setContentProvider(new ContextsContentProvider());
148 fContextsViewer.setLabelProvider(new ContextsLabelProvider());
149 fContextsViewer.addCheckStateListener(new ContextCheckListener());
150 fContextsViewer.setInput(fContextModel);
151 fContextsViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
152
153 getShell().setMinimumSize(new Point(500, 450));
154
155 return fDialogComposite;
156 }
157
158 /*
159 * (non-Javadoc)
160 * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
161 */
162 @Override
163 protected void createButtonsForButtonBar(Composite parent) {
164 createButton(parent, IDialogConstants.CANCEL_ID, "&Cancel", true); //$NON-NLS-1$
165 createButton(parent, IDialogConstants.OK_ID, "&Ok", true); //$NON-NLS-1$
166 }
167
168 /*
169 * (non-Javadoc)
170 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
171 */
172 @Override
173 protected void okPressed() {
174 fSelectedContexts.clear();
175
176 Object[] checkedElements = fContextsViewer.getCheckedElements();
177 for (int i = 0; i < checkedElements.length; i++) {
178 IContextModelComponent component = (IContextModelComponent)checkedElements[i];
179 if (!Messages.TraceControl_AddContextAllLabel.equals(component.getName())) {
180 fSelectedContexts.add(component.getName());
181 }
182 }
183
184 // validation successful -> call super.okPressed()
185 super.okPressed();
186 }
187
188 // ------------------------------------------------------------------------
189 // Helper classes and methods
190 // ------------------------------------------------------------------------
191 /**
192 * Content provider for the contexts tree
193 */
194 final public static class ContextsContentProvider implements ITreeContentProvider {
195
196 @Override
197 public void dispose() {
198 }
199
200 @Override
201 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
202 }
203
204 @Override
205 public Object[] getElements(Object inputElement) {
206 return getChildren(inputElement);
207 }
208
209 @Override
210 public Object[] getChildren(Object parentElement) {
211 if (parentElement instanceof IContextModelComponent) {
212 return ((IContextModelComponent)parentElement).getChildren();
213 }
214 return null;
215 }
216
217 @Override
218 public Object getParent(Object element) {
219 if (element instanceof IContextModelComponent) {
220 return ((IContextModelComponent)element).getParent();
221 }
222 return null;
223 }
224
225 @Override
226 public boolean hasChildren(Object element) {
227 if (element instanceof IContextModelComponent) {
228 return ((IContextModelComponent)element).hasChildren();
229 }
230 return false;
231 }
232 }
233
234 /**
235 * Label provider for the contexts tree
236 */
237 final public static class ContextsLabelProvider extends ColumnLabelProvider {
238 @Override
239 public String getText(Object element) {
240
241 if ((element != null) && (element instanceof IContextModelComponent)) {
242 return ((IContextModelComponent)element).getName();
243 }
244
245 return "";//$NON-NLS-1$
246 }
247 }
248
249 /**
250 * Check state listener for the contexts tree.
251 */
252 final public class ContextCheckListener implements ICheckStateListener {
253 @Override
254 public void checkStateChanged(CheckStateChangedEvent event) {
255 if (event.getChecked()) {
256 if (event.getElement() instanceof AllContexts) {
257 fContextsViewer.setSubtreeChecked(event.getElement(), true);
258 }
259 } else {
260 if (event.getElement() instanceof AllContexts) {
261 fContextsViewer.setSubtreeChecked(event.getElement(), false);
262 } else {
263 IContextModelComponent component = (IContextModelComponent) event.getElement();
264 fContextsViewer.setChecked(component.getParent(), false);
265 }
266 }
267 }
268 }
269
270 /**
271 * Model for the context tree viewer (root component)
272 */
273 public static class ContextModel implements IContextModelComponent {
274
275 private AllContexts fAllContexts;
276
277 public ContextModel() {
278 fAllContexts = new AllContexts(this);
279 }
280
281 public void setAvalibleContexts(List<String> contexts) {
282 fAllContexts.setAvalibleContexts(contexts);
283 }
284
285 @Override
286 public String getName() {
287 return "root"; //$NON-NLS-1$
288 }
289
290 @Override
291 public Object getParent() {
292 return null;
293 }
294
295 @Override
296 public Object[] getChildren() {
297 Object[] ret = new Object[1];
298 ret[0] = fAllContexts;
299 return ret;
300 }
301
302 @Override
303 public boolean hasChildren() {
304 return true;
305 }
306 }
307
308 /**
309 * Model element (to select/deselect) all contexts) for the context tree viewer
310 */
311 public static class AllContexts implements IContextModelComponent {
312 /**
313 * The available list of contexts.
314 */
315 private List<Context> fAvailableContexts;
316
317 private IContextModelComponent fParent;
318
319 public AllContexts(IContextModelComponent parent) {
320 fParent = parent;
321 }
322
323 public void setAvalibleContexts(List<String> contexts) {
324 fAvailableContexts = new ArrayList<Context>();
325 if (contexts != null) {
326 for (Iterator<String> iterator = contexts.iterator(); iterator.hasNext();) {
327 String name = (String) iterator.next();
328 fAvailableContexts.add(new Context(this, name));
329 }
330 }
331 }
332
333 @Override
334 public String getName() {
335 return Messages.TraceControl_AddContextAllLabel;
336 }
337
338 @Override
339 public Object[] getChildren() {
340 return fAvailableContexts.toArray();
341 }
342
343 @Override
344 public Object getParent() {
345 return fParent;
346 }
347
348 @Override
349 public boolean hasChildren() {
350 return true;
351 }
352 }
353
354 /**
355 * Model element (the context) for the context tree viewer
356 */
357 public static class Context implements IContextModelComponent {
358
359 private String fContextName;
360 private IContextModelComponent fParent;
361
362 public Context(IContextModelComponent parent, String name) {
363 fParent = parent;
364 fContextName = name;
365 }
366
367 @Override
368 public String getName() {
369 return fContextName;
370 }
371
372 @Override
373 public Object getParent() {
374 return fParent;
375 }
376
377 @Override
378 public Object[] getChildren() {
379 return null;
380 }
381
382 @Override
383 public boolean hasChildren() {
384 return false;
385 }
386 }
387
388 /**
389 * Interface for the tree model used for the context tree viewer.
390 */
391 public interface IContextModelComponent {
392 public String getName();
393 public Object getParent();
394 public Object[] getChildren();
395 public boolean hasChildren();
396 }
397 }
This page took 0.043743 seconds and 6 git commands to generate.