1 /**********************************************************************
2 * Copyright (c) 2012 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 * Bernd Hufmann - Initial API and implementation
11 **********************************************************************/
12 package org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.dialogs
;
14 import java
.util
.ArrayList
;
15 import java
.util
.HashSet
;
16 import java
.util
.List
;
19 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
20 import org
.eclipse
.jface
.viewers
.CheckStateChangedEvent
;
21 import org
.eclipse
.jface
.viewers
.CheckboxTreeViewer
;
22 import org
.eclipse
.jface
.viewers
.ICheckStateListener
;
23 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.Messages
;
24 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.TraceControlContentProvider
;
25 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.TraceControlLabelProvider
;
26 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.model
.ITraceControlComponent
;
27 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.model
.LogLevelType
;
28 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.model
.TraceLogLevel
;
29 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.model
.impl
.BaseEventComponent
;
30 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.model
.impl
.TargetNodeComponent
;
31 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.model
.impl
.TraceProviderGroup
;
32 import org
.eclipse
.linuxtools
.internal
.lttng2
.ui
.views
.control
.model
.impl
.UstProviderComponent
;
33 import org
.eclipse
.swt
.SWT
;
34 import org
.eclipse
.swt
.custom
.CCombo
;
35 import org
.eclipse
.swt
.events
.SelectionAdapter
;
36 import org
.eclipse
.swt
.events
.SelectionEvent
;
37 import org
.eclipse
.swt
.graphics
.Image
;
38 import org
.eclipse
.swt
.layout
.GridData
;
39 import org
.eclipse
.swt
.layout
.GridLayout
;
40 import org
.eclipse
.swt
.widgets
.Button
;
41 import org
.eclipse
.swt
.widgets
.Composite
;
42 import org
.eclipse
.swt
.widgets
.Group
;
43 import org
.eclipse
.swt
.widgets
.Label
;
44 import org
.eclipse
.swt
.widgets
.Text
;
47 * <b><u>EnableUstEventsComposite</u></b>
49 * A composite for collecting information about UST events to be enabled.
52 public class EnableUstEventsComposite
extends Composite
implements IEnableUstEvents
{
54 // ------------------------------------------------------------------------
56 // ------------------------------------------------------------------------
58 private enum GroupEnum
{ TRACEPOINTS
, WILDCARD
, LOGLEVEL
};
60 // ------------------------------------------------------------------------
62 // ------------------------------------------------------------------------
65 * A button to enable/disable the tracepoints group
67 private Button fTracepointsActivateButton
;
69 * A tree viewer for diplaying and selection of available tracepoints.
71 private CheckboxTreeViewer fTracepointsViewer
;
73 * A button to enable/disable the wildcard group
75 private Button fWildcardActivateButton
;
77 * A Text field for the event's wildcard.
79 private Text fWildcardText
;
81 * A button to enable/disable the log level group
83 private Button fLogLevelActivateButton
;
85 * A Text field for the event name for the log level enablement.
87 private Text fLogLevelEventNameText
;
89 * A Combo box for selecting the log level.
91 private CCombo fLogLevelCombo
;
93 * A button for selecting the log level (range 0 to level).
95 private Button fLogLevelButton
;
97 * A button for selecting the specified log level only.
99 private Button fLogLevelOnlyButton
;
101 * The referenced trace provider group containing the UST providers
102 * component which contains a list of available tracepoints.
104 private TraceProviderGroup fProviderGroup
;
106 * The flag indicating that tracepoints are selected.
108 private boolean fIsTracepoints
;
110 * The flag indicating that all tracepoints (across providers) are selected.
112 private boolean fIsAllTracepoints
;
114 * The list of tracepoints to be enabled.
116 private List
<String
> fSelectedEvents
;
118 * The flag indicating that all wildcard are selected..
120 private boolean fIsWildcard
;
122 * The wildcard if wildcard is selected.
124 private String fWildcard
;
126 *The flag indicating that all log level are selected.
128 private boolean fIsLogLevel
;
130 * The event name for the log level enablement.
132 private String fLogLevelEventName
;
134 * The type of the log level (loglevel or loglevel-only)
136 private LogLevelType fLogLevelType
;
138 * The actual selected log level.
140 private TraceLogLevel fLogLevel
;
142 // ------------------------------------------------------------------------
144 // ------------------------------------------------------------------------
147 * @param parent - a parent composite
148 * @Param style - a compsite style
149 * @param providerGroup - the trace provider group
151 public EnableUstEventsComposite(Composite parent
, int style
, TraceProviderGroup providerGroup
) {
152 super(parent
, style
);
153 fProviderGroup
= providerGroup
;
156 // ------------------------------------------------------------------------
158 // ------------------------------------------------------------------------
162 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isTracepoints()
165 public boolean isTracepoints() {
166 return fIsTracepoints
;
171 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isAllTracePoints()
174 public boolean isAllTracePoints() {
175 return fIsAllTracepoints
;
180 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getEventNames()
183 public List
<String
> getEventNames() {
184 return new ArrayList
<String
>(fSelectedEvents
);
189 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isWildcard()
192 public boolean isWildcard() {
198 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getWildcard()
201 public String
getWildcard() {
202 return "\"" + fWildcard
+ "\""; //$NON-NLS-1$//$NON-NLS-2$
207 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isLogLevel()
210 public boolean isLogLevel() {
216 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getLogLevelType()
219 public LogLevelType
getLogLevelType() {
220 return fLogLevelType
;
225 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getLogLevel()
228 public TraceLogLevel
getLogLevel() {
234 * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getLogLevelEventName()
237 public String
getLogLevelEventName() {
238 return fLogLevelEventName
;
241 // ------------------------------------------------------------------------
243 // ------------------------------------------------------------------------
245 public void createContent() {
248 createTracepointsGroup();
251 createWildCardGroup();
254 createLogLevelGroup();
256 // Set default enablements
257 setEnablements(GroupEnum
.TRACEPOINTS
);
261 * Validates the UST composite input data.
262 * @return true if configured data is valid and can be retrieved.
264 public boolean isValid() {
266 fIsTracepoints
= fTracepointsActivateButton
.getSelection();
267 fIsWildcard
= fWildcardActivateButton
.getSelection();
268 fIsLogLevel
= fLogLevelActivateButton
.getSelection();
270 fIsAllTracepoints
= fTracepointsViewer
.getChecked(fProviderGroup
);
272 Set
<String
> set
= new HashSet
<String
>();
273 Object
[] checkedElements
= fTracepointsViewer
.getCheckedElements();
274 fSelectedEvents
= new ArrayList
<String
>();
275 for (int i
= 0; i
< checkedElements
.length
; i
++) {
276 ITraceControlComponent component
= (ITraceControlComponent
)checkedElements
[i
];
277 if (!set
.contains(component
.getName()) && (component
instanceof BaseEventComponent
)) {
278 set
.add(component
.getName());
279 fSelectedEvents
.add(component
.getName());
283 if (fLogLevelButton
.getSelection()) {
284 fLogLevelType
= LogLevelType
.LOGLEVEL
;
285 } else if (fLogLevelOnlyButton
.getSelection()) {
286 fLogLevelType
= LogLevelType
.LOGLEVEL_ONLY
;
288 fLogLevelType
= LogLevelType
.LOGLEVEL_NONE
;
291 // initialize log level event name string
292 fLogLevelEventName
= null;
293 String temp
= fLogLevelEventNameText
.getText();
294 if (!temp
.matches("^[\\s]{0,}$") && !temp
.matches("^[a-zA-Z0-9\\-\\_]{1,}$")) { //$NON-NLS-1$ //$NON-NLS-2$
295 MessageDialog
.openError(getShell(),
296 Messages
.TraceControl_EnableEventsDialogTitle
,
297 Messages
.TraceControl_InvalidLogLevelEventNameError
+ " (" + temp
+ ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
302 if(!temp
.matches("\\s*")) { //$NON-NLS-1$
303 fLogLevelEventName
= temp
;
306 TraceLogLevel
[] levels
= TraceLogLevel
.values();
307 int id
= fLogLevelCombo
.getSelectionIndex();
308 if ((id
< 0) && fIsLogLevel
) {
309 MessageDialog
.openError(getShell(),
310 Messages
.TraceControl_EnableEventsDialogTitle
,
311 Messages
.TraceControl_InvalidLogLevel
+ " (" + temp
+ ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
315 fLogLevel
= levels
[id
];
318 // initialize log level event name string
320 temp
= fWildcardText
.getText();
321 if (!temp
.matches("^[\\s]{0,}$") && !temp
.matches("^[a-zA-Z0-9\\-\\_\\*]{1,}$")) { //$NON-NLS-1$ //$NON-NLS-2$
322 MessageDialog
.openError(getShell(),
323 Messages
.TraceControl_EnableEventsDialogTitle
,
324 Messages
.TraceControl_InvalidWildcardError
+ " (" + temp
+ ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
329 if(!temp
.matches("\\s*")) { //$NON-NLS-1$
333 // validation successful -> call super.okPressed()
337 // ------------------------------------------------------------------------
339 // ------------------------------------------------------------------------
342 * Creates tracepoints group.
344 private void createTracepointsGroup() {
345 Group tpMainGroup
= new Group(this, SWT
.SHADOW_NONE
);
346 tpMainGroup
.setText(Messages
.TraceControl_EnableEventsTracepointGroupName
);
347 GridLayout layout
= new GridLayout(2, false);
348 tpMainGroup
.setLayout(layout
);
349 GridData data
= new GridData(GridData
.FILL_BOTH
);
350 tpMainGroup
.setLayoutData(data
);
352 Composite buttonComposite
= new Composite(tpMainGroup
, SWT
.NONE
);
353 layout
= new GridLayout(1, true);
354 buttonComposite
.setLayout(layout
);
355 data
= new GridData(SWT
.BEGINNING
, SWT
.CENTER
, false, true);
356 buttonComposite
.setLayoutData(data
);
358 fTracepointsActivateButton
= new Button(buttonComposite
, SWT
.RADIO
);
359 fTracepointsActivateButton
.setText(Messages
.TraceControl_EnableGroupSelectionName
);
360 data
= new GridData(GridData
.FILL_HORIZONTAL
);
361 fTracepointsActivateButton
.setLayoutData(data
);
362 fTracepointsActivateButton
.addSelectionListener(new SelectionAdapter() {
364 public void widgetSelected(SelectionEvent e
) {
365 setEnablements(GroupEnum
.TRACEPOINTS
);
369 Group tpGroup
= new Group(tpMainGroup
, SWT
.SHADOW_NONE
);
370 layout
= new GridLayout(1, true);
371 tpGroup
.setLayout(layout
);
372 data
= new GridData(GridData
.FILL_BOTH
);
373 tpGroup
.setLayoutData(data
);
375 fTracepointsViewer
= new CheckboxTreeViewer(tpGroup
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
376 fTracepointsViewer
.getTree().setToolTipText(Messages
.TraceControl_EnableEventsTracepointTreeTooltip
);
377 fTracepointsViewer
.setContentProvider(new UstContentProvider());
379 fTracepointsViewer
.setLabelProvider(new UstLabelProvider());
380 fTracepointsViewer
.addCheckStateListener(new UstCheckStateListener());
382 fTracepointsViewer
.setInput(fProviderGroup
.getParent());
383 fTracepointsViewer
.getTree().setLayoutData(new GridData(GridData
.FILL_BOTH
));
387 * Creates wildcard group.
389 private void createWildCardGroup() {
390 Group wildcardMainGroup
= new Group(this, SWT
.SHADOW_NONE
);
391 wildcardMainGroup
.setText(Messages
.TraceControl_EnableEventsWildcardGroupName
);
392 GridLayout layout
= new GridLayout(2, false);
393 wildcardMainGroup
.setLayout(layout
);
394 GridData data
= new GridData(GridData
.FILL_HORIZONTAL
);
395 wildcardMainGroup
.setLayoutData(data
);
397 Composite buttonComposite
= new Composite(wildcardMainGroup
, SWT
.NONE
);
398 layout
= new GridLayout(1, false);
399 buttonComposite
.setLayout(layout
);
400 data
= new GridData(SWT
.BEGINNING
, SWT
.CENTER
, false, true);
401 buttonComposite
.setLayoutData(data
);
403 fWildcardActivateButton
= new Button(buttonComposite
, SWT
.RADIO
);
404 fWildcardActivateButton
.setText(Messages
.TraceControl_EnableGroupSelectionName
);
405 fWildcardActivateButton
.setSelection(false);
406 data
= new GridData(GridData
.FILL_HORIZONTAL
);
407 fWildcardActivateButton
.setLayoutData(data
);
408 fWildcardActivateButton
.addSelectionListener(new SelectionAdapter() {
410 public void widgetSelected(SelectionEvent e
) {
411 setEnablements(GroupEnum
.WILDCARD
);
415 Group wildcardGroup
= new Group(wildcardMainGroup
, SWT
.SHADOW_NONE
);
416 layout
= new GridLayout(3, true);
417 wildcardGroup
.setLayout(layout
);
418 data
= new GridData(GridData
.FILL_HORIZONTAL
);
419 wildcardGroup
.setLayoutData(data
);
421 Label wildcardLabel
= new Label(wildcardGroup
, SWT
.LEFT
);
422 wildcardLabel
.setText(Messages
.TraceControl_EnableEventsWildcardLabel
);
423 data
= new GridData(GridData
.FILL_HORIZONTAL
);
424 data
.horizontalSpan
= 1;
425 wildcardLabel
.setLayoutData(data
);
427 fWildcardText
= new Text(wildcardGroup
, SWT
.LEFT
);
428 fWildcardText
.setToolTipText(Messages
.TraceControl_EnableEventsWildcardTooltip
);
429 data
= new GridData(GridData
.FILL_HORIZONTAL
);
430 data
.horizontalSpan
= 2;
431 fWildcardText
.setLayoutData(data
);
435 * Creates log level group.
437 private void createLogLevelGroup() {
438 Group logLevelMainGroup
= new Group(this, SWT
.SHADOW_NONE
);
439 logLevelMainGroup
.setText(Messages
.TraceControl_EnableEventsLogLevelGroupName
);
440 GridLayout layout
= new GridLayout(2, false);
441 logLevelMainGroup
.setLayout(layout
);
442 GridData data
= new GridData(GridData
.FILL_HORIZONTAL
);
443 logLevelMainGroup
.setLayoutData(data
);
445 Composite buttonComposite
= new Composite(logLevelMainGroup
, SWT
.NONE
);
446 layout
= new GridLayout(1, false);
447 buttonComposite
.setLayout(layout
);
448 data
= new GridData(SWT
.BEGINNING
, SWT
.CENTER
, false, true);
449 buttonComposite
.setLayoutData(data
);
451 fLogLevelActivateButton
= new Button(buttonComposite
, SWT
.RADIO
);
452 fLogLevelActivateButton
.setText(Messages
.TraceControl_EnableGroupSelectionName
);
453 fLogLevelActivateButton
.setSelection(false);
454 data
= new GridData(GridData
.FILL_HORIZONTAL
);
455 fLogLevelActivateButton
.setLayoutData(data
);
456 fLogLevelActivateButton
.addSelectionListener(new SelectionAdapter() {
458 public void widgetSelected(SelectionEvent e
) {
459 setEnablements(GroupEnum
.LOGLEVEL
);
463 Group logLevelGroup
= new Group(logLevelMainGroup
, SWT
.SHADOW_NONE
);
464 layout
= new GridLayout(3, true);
465 logLevelGroup
.setLayout(layout
);
466 logLevelGroup
.setLayoutData(new GridData(GridData
.FILL_HORIZONTAL
));
468 Label logLevelEventNameLabel
= new Label(logLevelGroup
, SWT
.LEFT
);
469 logLevelEventNameLabel
.setText(Messages
.TraceControl_EnableEventsEventNameLabel
);
471 data
= new GridData(GridData
.FILL_BOTH
);
472 data
.horizontalSpan
= 1;
473 logLevelEventNameLabel
.setLayoutData(data
);
475 fLogLevelEventNameText
= new Text(logLevelGroup
, SWT
.LEFT
);
476 fLogLevelEventNameText
.setToolTipText(Messages
.TraceControl_EnableEventsLoglevelEventNameTooltip
);
477 data
= new GridData(GridData
.FILL_BOTH
);
478 data
.horizontalSpan
= 2;
479 fLogLevelEventNameText
.setLayoutData(data
);
481 TraceLogLevel
[] levels
= TraceLogLevel
.values();
483 String
[] levelNames
= new String
[levels
.length
- 1];
485 for (int i
= 0; i
< levels
.length
; i
++) {
486 if (levels
[i
] != TraceLogLevel
.LEVEL_UNKNOWN
) {
487 levelNames
[k
++] = levels
[i
].getInName();
491 fLogLevelCombo
= new CCombo(logLevelGroup
, SWT
.READ_ONLY
);
492 fLogLevelCombo
.setItems(levelNames
);
493 fLogLevelCombo
.setToolTipText(Messages
.TraceControl_EnableEventsLogLevelTooltip
);
494 data
= new GridData(GridData
.FILL_HORIZONTAL
);
495 data
.horizontalSpan
= 4;
496 fLogLevelCombo
.setLayoutData(data
);
498 fLogLevelButton
= new Button(logLevelGroup
, SWT
.RADIO
);
499 fLogLevelButton
.setText(Messages
.TraceControl_EnableEventsLogLevelTypeName
);
500 fLogLevelButton
.setToolTipText(Messages
.TraceControl_EnableEventsLogLevelTypeTooltip
);
501 data
= new GridData(GridData
.FILL_BOTH
);
502 fLogLevelButton
.setLayoutData(data
);
504 fLogLevelOnlyButton
= new Button(logLevelGroup
, SWT
.RADIO
);
505 fLogLevelOnlyButton
.setText(Messages
.TraceControl_EnableEventsLogLevelOnlyTypeName
);
506 fLogLevelOnlyButton
.setToolTipText(Messages
.TraceControl_EnableEventsLogLevelOnlyTypeTooltip
);
507 data
= new GridData(GridData
.FILL_BOTH
);
508 fLogLevelButton
.setLayoutData(data
);
512 * Enable/selects widgets depending on the group specified.
513 * @param group - group to enable.
515 private void setEnablements(GroupEnum group
) {
517 // Enable/disable trace point items
518 fTracepointsActivateButton
.setSelection(group
== GroupEnum
.TRACEPOINTS
);
519 fTracepointsViewer
.getTree().setEnabled(group
== GroupEnum
.TRACEPOINTS
);
521 // Enable/disable wildcard items
522 fWildcardActivateButton
.setSelection(group
== GroupEnum
.WILDCARD
);
523 fWildcardText
.setEnabled(group
== GroupEnum
.WILDCARD
);
525 // Enable/disable log level items
526 fLogLevelActivateButton
.setSelection(group
== GroupEnum
.LOGLEVEL
);
527 fLogLevelEventNameText
.setEnabled(group
== GroupEnum
.LOGLEVEL
);
528 fLogLevelCombo
.setEnabled(group
== GroupEnum
.LOGLEVEL
);
529 fLogLevelButton
.setEnabled(group
== GroupEnum
.LOGLEVEL
);
530 fLogLevelOnlyButton
.setEnabled(group
== GroupEnum
.LOGLEVEL
);
533 // ------------------------------------------------------------------------
535 // ------------------------------------------------------------------------
537 * Content provider for the tracepoints tree.
539 final static public class UstContentProvider
extends TraceControlContentProvider
{
541 public Object
[] getChildren(Object parentElement
) {
542 if (parentElement
instanceof TargetNodeComponent
) {
543 List
<ITraceControlComponent
> children
= ((ITraceControlComponent
)parentElement
).getChildren(TraceProviderGroup
.class);
544 return (ITraceControlComponent
[]) children
.toArray(new ITraceControlComponent
[children
.size()]);
546 if (parentElement
instanceof TraceProviderGroup
) {
547 List
<ITraceControlComponent
> children
= ((ITraceControlComponent
)parentElement
).getChildren(UstProviderComponent
.class);
548 return (ITraceControlComponent
[]) children
.toArray(new ITraceControlComponent
[children
.size()]);
550 if (parentElement
instanceof ITraceControlComponent
) {
551 return ((ITraceControlComponent
)parentElement
).getChildren();
553 return new Object
[0];
558 * Content label for the tracepoints tree.
560 final static public class UstLabelProvider
extends TraceControlLabelProvider
{
562 public Image
getImage(Object element
) {
566 public String
getText(Object element
) {
567 if ((element
!= null) && (element
instanceof TraceProviderGroup
)) {
568 return Messages
.TraceControl_EnableEventsTracepointTreeAllLabel
;
571 if ((element
!= null) && (element
instanceof UstProviderComponent
)) {
572 return Messages
.TraceControl_EnableEventsTracepointTreeAllLabel
+ " - " + ((UstProviderComponent
)element
).getName(); //$NON-NLS-1$
574 return super.getText(element
);
579 * Check state listener for the tracepoints tree.
581 final public class UstCheckStateListener
implements ICheckStateListener
{
583 public void checkStateChanged(CheckStateChangedEvent event
) {
584 if (event
.getChecked()) {
585 if (event
.getElement() instanceof TraceProviderGroup
) {
586 fTracepointsViewer
.setSubtreeChecked(event
.getElement(), true);
588 if (event
.getElement() instanceof UstProviderComponent
) {
589 fTracepointsViewer
.setSubtreeChecked(event
.getElement(), true);
592 if (event
.getElement() instanceof TraceProviderGroup
) {
593 fTracepointsViewer
.setSubtreeChecked(event
.getElement(), true);
595 if (event
.getElement() instanceof UstProviderComponent
) {
596 ITraceControlComponent component
= (ITraceControlComponent
) event
.getElement();
597 fTracepointsViewer
.setSubtreeChecked(event
.getElement(), false);
598 fTracepointsViewer
.setChecked(component
.getParent(), false);
600 ITraceControlComponent component
= (ITraceControlComponent
) event
.getElement();
601 fTracepointsViewer
.setChecked(component
.getParent(), false);
602 fTracepointsViewer
.setChecked(component
.getParent().getParent(), false);