/**********************************************************************
- * Copyright (c) 2012 Ericsson
- *
+ * Copyright (c) 2012, 2014 Ericsson
+ *
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
+ *
+ * Contributors:
* Bernd Hufmann - Initial API and implementation
+ * Bernd Hufmann - Updated for support of LTTng Tools 2.1
+ * Marc-Andre Laperle - Add filtering textbox
**********************************************************************/
package org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.Messages;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.TraceControlContentProvider;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.TraceControlLabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.LogLevelType;
+import org.eclipse.linuxtools.internal.lttng2.core.control.model.TraceLogLevel;
+import org.eclipse.linuxtools.internal.lttng2.ui.views.control.messages.Messages;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.ITraceControlComponent;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.LogLevelType;
-import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.TraceLogLevel;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.BaseEventComponent;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TargetNodeComponent;
+import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceControlContentProvider;
+import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceControlLabelProvider;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.TraceProviderGroup;
import org.eclipse.linuxtools.internal.lttng2.ui.views.control.model.impl.UstProviderComponent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
/**
- * <b><u>EnableUstEventsComposite</u></b>
* <p>
* A composite for collecting information about UST events to be enabled.
* </p>
+ *
+ * @author Bernd Hufmann
*/
public class EnableUstEventsComposite extends Composite implements IEnableUstEvents {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
-
- private enum GroupEnum { TRACEPOINTS, WILDCARD, LOGLEVEL };
-
+
+ private enum GroupEnum { TRACEPOINTS, WILDCARD, LOGLEVEL }
+
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
-
+
/**
* A button to enable/disable the tracepoints group
*/
*/
private Button fLogLevelOnlyButton;
/**
- * The referenced trace provider group containing the UST providers
+ * The filter text
+ */
+ private Text fFilterText;
+
+ /**
+ * The referenced trace provider group containing the UST providers
* component which contains a list of available tracepoints.
*/
- private TraceProviderGroup fProviderGroup;
+ private final TraceProviderGroup fProviderGroup;
/**
* The flag indicating that tracepoints are selected.
*/
*/
private List<String> fSelectedEvents;
/**
- * The flag indicating that all wildcard are selected..
+ * The flag indicating that all wildcard are selected..
*/
private boolean fIsWildcard;
/**
- * The wildcard if wildcard is selected.
+ * The wildcard if wildcard is selected.
*/
private String fWildcard;
/**
- *The flag indicating that all log level are selected.
+ *The flag indicating that all log level are selected.
*/
private boolean fIsLogLevel;
/**
* The actual selected log level.
*/
private TraceLogLevel fLogLevel;
+ /**
+ * The filter expression
+ */
+ private String fFilterExpression;
// ------------------------------------------------------------------------
// Constructors
/**
* Constructor
* @param parent - a parent composite
- * @Param style - a compsite style
+ * @param style - a composite style
* @param providerGroup - the trace provider group
*/
public EnableUstEventsComposite(Composite parent, int style, TraceProviderGroup providerGroup) {
// Accessors
// ------------------------------------------------------------------------
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isTracepoints()
- */
@Override
public boolean isTracepoints() {
return fIsTracepoints;
}
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isAllTracePoints()
- */
+
@Override
public boolean isAllTracePoints() {
return fIsAllTracepoints;
}
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getEventNames()
- */
+
@Override
public List<String> getEventNames() {
- return new ArrayList<String>(fSelectedEvents);
+ return new ArrayList<>(fSelectedEvents);
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isWildcard()
- */
@Override
public boolean isWildcard() {
return fIsWildcard;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getWildcard()
- */
@Override
public String getWildcard() {
- return "\"" + fWildcard + "\""; //$NON-NLS-1$//$NON-NLS-2$
+ return fWildcard;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#isLogLevel()
- */
@Override
public boolean isLogLevel() {
return fIsLogLevel;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getLogLevelType()
- */
@Override
public LogLevelType getLogLevelType() {
return fLogLevelType;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getLogLevel()
- */
@Override
public TraceLogLevel getLogLevel() {
return fLogLevel;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.linuxtools.internal.lttng2.ui.views.control.dialogs.IEnableUstEvents#getLogLevelEventName()
- */
@Override
public String getLogLevelEventName() {
return fLogLevelEventName;
}
-
+
+ @Override
+ public String getFilterExpression() {
+ return fFilterExpression;
+ }
+
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
+ /**
+ * Create the contents of this event composite
+ */
public void createContent() {
-
- // Tracepoints Group
+
+ // Tracepoints Group
createTracepointsGroup();
- // Wildcard Group
+ // Wildcard Group
createWildCardGroup();
- // Log Level Group
+ // Log Level Group
createLogLevelGroup();
-
+
+ // Filter Group
+ createFilterGroup();
+
// Set default enablements
setEnablements(GroupEnum.TRACEPOINTS);
}
/**
- * Validates the UST composite input data.
- * @return true if configured data is valid and can be retrieved.
- */
+ * Validates the UST composite input data.
+ *
+ * @return true if configured data is valid and can be retrieved.
+ */
public boolean isValid() {
-
+
fIsTracepoints = fTracepointsActivateButton.getSelection();
fIsWildcard = fWildcardActivateButton.getSelection();
fIsLogLevel = fLogLevelActivateButton.getSelection();
-
- fIsAllTracepoints = fTracepointsViewer.getChecked(fProviderGroup);
-
- Set<String> set = new HashSet<String>();
- Object[] checkedElements = fTracepointsViewer.getCheckedElements();
- fSelectedEvents = new ArrayList<String>();
- for (int i = 0; i < checkedElements.length; i++) {
- ITraceControlComponent component = (ITraceControlComponent)checkedElements[i];
- if (!set.contains(component.getName()) && (component instanceof BaseEventComponent)) {
- set.add(component.getName());
- fSelectedEvents.add(component.getName());
- }
- }
- if (fLogLevelButton.getSelection()) {
- fLogLevelType = LogLevelType.LOGLEVEL;
- } else if (fLogLevelOnlyButton.getSelection()) {
- fLogLevelType = LogLevelType.LOGLEVEL_ONLY;
- } else {
- fLogLevelType = LogLevelType.LOGLEVEL_NONE;
+ // initialize tracepoint fields
+ fIsAllTracepoints = false;
+ fSelectedEvents = new ArrayList<>();
+ if (fIsTracepoints) {
+ fIsAllTracepoints = fTracepointsViewer.getChecked(fProviderGroup);
+ Set<String> set = new HashSet<>();
+ Object[] checkedElements = fTracepointsViewer.getCheckedElements();
+ for (int i = 0; i < checkedElements.length; i++) {
+ ITraceControlComponent component = (ITraceControlComponent)checkedElements[i];
+ if (!set.contains(component.getName()) && (component instanceof BaseEventComponent)) {
+ set.add(component.getName());
+ fSelectedEvents.add(component.getName());
+ }
+ }
}
// initialize log level event name string
+ fLogLevelType = LogLevelType.LOGLEVEL_NONE;
fLogLevelEventName = null;
- String temp = fLogLevelEventNameText.getText();
- if (!temp.matches("^[\\s]{0,}$") && !temp.matches("^[a-zA-Z0-9\\-\\_]{1,}$")) { //$NON-NLS-1$ //$NON-NLS-2$
- MessageDialog.openError(getShell(),
- Messages.TraceControl_EnableEventsDialogTitle,
- Messages.TraceControl_InvalidLogLevelEventNameError + " (" + temp + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
- return false;
- }
+ if (fIsLogLevel) {
+ if (fLogLevelButton.getSelection()) {
+ fLogLevelType = LogLevelType.LOGLEVEL;
+ } else if (fLogLevelOnlyButton.getSelection()) {
+ fLogLevelType = LogLevelType.LOGLEVEL_ONLY;
+ }
- if(!temp.matches("\\s*")) { //$NON-NLS-1$
- fLogLevelEventName = temp;
- }
+ String temp = fLogLevelEventNameText.getText();
+ if (temp.isEmpty() ||
+ temp.matches("\\s*") || //$NON-NLS-1$
+ (!temp.matches("^[\\s]{0,}$") && !temp.matches("^[a-zA-Z0-9\\-\\_]{1,}$"))) { //$NON-NLS-1$ //$NON-NLS-2$
+ MessageDialog.openError(getShell(),
+ Messages.TraceControl_EnableEventsDialogTitle,
+ Messages.TraceControl_InvalidLogLevelEventNameError + " (" + temp + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
- TraceLogLevel[] levels = TraceLogLevel.values();
- int id = fLogLevelCombo.getSelectionIndex();
- if ((id < 0) && fIsLogLevel) {
- MessageDialog.openError(getShell(),
- Messages.TraceControl_EnableEventsDialogTitle,
- Messages.TraceControl_InvalidLogLevel + " (" + temp + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
-
- return false;
- } else {
+ return false;
+ }
+
+ fLogLevelEventName = temp;
+
+ TraceLogLevel[] levels = TraceLogLevel.values();
+ int id = fLogLevelCombo.getSelectionIndex();
+
+ if (id < 0) {
+ MessageDialog.openError(getShell(),
+ Messages.TraceControl_EnableEventsDialogTitle,
+ Messages.TraceControl_InvalidLogLevel + " (" + temp + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ return false;
+ }
fLogLevel = levels[id];
}
- // initialize log level event name string
+ // initialize wildcard with null
fWildcard = null;
- temp = fWildcardText.getText();
- if (!temp.matches("^[\\s]{0,}$") && !temp.matches("^[a-zA-Z0-9\\-\\_\\*]{1,}$")) { //$NON-NLS-1$ //$NON-NLS-2$
- MessageDialog.openError(getShell(),
- Messages.TraceControl_EnableEventsDialogTitle,
- Messages.TraceControl_InvalidWildcardError + " (" + temp + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (fIsWildcard) {
+ String tempWildcard = fWildcardText.getText();
+ if (tempWildcard.isEmpty() ||
+ tempWildcard.matches("\\s*") || //$NON-NLS-1$
+ (!tempWildcard.matches("^[\\s]{0,}$") && !tempWildcard.matches("^[a-zA-Z0-9\\-\\_\\*]{1,}$"))) { //$NON-NLS-1$ //$NON-NLS-2$
+ MessageDialog.openError(getShell(),
+ Messages.TraceControl_EnableEventsDialogTitle,
+ Messages.TraceControl_InvalidWildcardError + " (" + tempWildcard + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ return false;
+ }
- return false;
+ fWildcard = tempWildcard;
}
-
- if(!temp.matches("\\s*")) { //$NON-NLS-1$
- fWildcard = temp;
+
+ // initialize filter with null
+ fFilterExpression = null;
+ if (fProviderGroup.isEventFilteringSupported()) {
+ String tempFilter = fFilterText.getText();
+
+ if(!tempFilter.isEmpty() && !tempFilter.matches("\\s*")) { //$NON-NLS-1$
+ fFilterExpression = tempFilter;
+ }
}
-
+
// validation successful -> call super.okPressed()
return true;
}
-
+
// ------------------------------------------------------------------------
// Helper methods
// ------------------------------------------------------------------------
-
+
/**
* Creates tracepoints group.
*/
tpMainGroup.setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH);
tpMainGroup.setLayoutData(data);
-
+
Composite buttonComposite = new Composite(tpMainGroup, SWT.NONE);
layout = new GridLayout(1, true);
buttonComposite.setLayout(layout);
setEnablements(GroupEnum.TRACEPOINTS);
}
});
-
+
Group tpGroup = new Group(tpMainGroup, SWT.SHADOW_NONE);
layout = new GridLayout(1, true);
tpGroup.setLayout(layout);
data = new GridData(GridData.FILL_BOTH);
tpGroup.setLayoutData(data);
-
- fTracepointsViewer = new CheckboxTreeViewer(tpGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
- fTracepointsViewer.getTree().setToolTipText(Messages.TraceControl_EnableEventsTracepointTreeTooltip);
- fTracepointsViewer.setContentProvider(new UstContentProvider());
+ new FilteredTree(tpGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter(), true) {
+ @Override
+ protected TreeViewer doCreateTreeViewer(Composite aparent, int style) {
+ fTracepointsViewer = new CheckboxTreeViewer(aparent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ fTracepointsViewer.getTree().setToolTipText(Messages.TraceControl_EnableEventsTracepointTreeTooltip);
+ fTracepointsViewer.setContentProvider(new UstContentProvider());
- fTracepointsViewer.setLabelProvider(new UstLabelProvider());
- fTracepointsViewer.addCheckStateListener(new UstCheckStateListener());
+ fTracepointsViewer.setLabelProvider(new UstLabelProvider());
+ fTracepointsViewer.addCheckStateListener(new UstCheckStateListener());
- fTracepointsViewer.setInput(fProviderGroup.getParent());
- fTracepointsViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ fTracepointsViewer.setInput(fProviderGroup.getParent());
+ fTracepointsViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ return fTracepointsViewer;
+ }
+ };
}
-
+
/**
* Creates wildcard group.
*/
wildcardMainGroup.setLayout(layout);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
wildcardMainGroup.setLayoutData(data);
-
+
Composite buttonComposite = new Composite(wildcardMainGroup, SWT.NONE);
layout = new GridLayout(1, false);
buttonComposite.setLayout(layout);
setEnablements(GroupEnum.WILDCARD);
}
});
-
+
Group wildcardGroup = new Group(wildcardMainGroup, SWT.SHADOW_NONE);
layout = new GridLayout(3, true);
wildcardGroup.setLayout(layout);
data = new GridData(GridData.FILL_HORIZONTAL);
wildcardGroup.setLayoutData(data);
-
+
Label wildcardLabel = new Label(wildcardGroup, SWT.LEFT);
wildcardLabel.setText(Messages.TraceControl_EnableEventsWildcardLabel);
data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 1;
wildcardLabel.setLayoutData(data);
-
+
fWildcardText = new Text(wildcardGroup, SWT.LEFT);
fWildcardText.setToolTipText(Messages.TraceControl_EnableEventsWildcardTooltip);
data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
fWildcardText.setLayoutData(data);
}
-
+
/**
* Creates log level group.
*/
logLevelMainGroup.setLayout(layout);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
logLevelMainGroup.setLayoutData(data);
-
+
Composite buttonComposite = new Composite(logLevelMainGroup, SWT.NONE);
layout = new GridLayout(1, false);
buttonComposite.setLayout(layout);
fLogLevelEventNameText.setLayoutData(data);
TraceLogLevel[] levels = TraceLogLevel.values();
-
+
String[] levelNames = new String[levels.length - 1];
int k = 0;
for (int i = 0; i < levels.length; i++) {
fLogLevelButton.setToolTipText(Messages.TraceControl_EnableEventsLogLevelTypeTooltip);
data = new GridData(GridData.FILL_BOTH);
fLogLevelButton.setLayoutData(data);
+ fLogLevelButton.setSelection(true);
fLogLevelOnlyButton = new Button(logLevelGroup, SWT.RADIO);
fLogLevelOnlyButton.setText(Messages.TraceControl_EnableEventsLogLevelOnlyTypeName);
data = new GridData(GridData.FILL_BOTH);
fLogLevelButton.setLayoutData(data);
}
-
+
+ void createFilterGroup() {
+ if (fProviderGroup.isEventFilteringSupported()) {
+ Group filterMainGroup = new Group(this, SWT.SHADOW_NONE);
+ filterMainGroup.setText(Messages.TraceControl_EnableEventsFilterGroupName);
+ GridLayout layout = new GridLayout(3, false);
+ filterMainGroup.setLayout(layout);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ filterMainGroup.setLayoutData(data);
+
+ fFilterText = new Text(filterMainGroup, SWT.LEFT);
+ fFilterText.setToolTipText(Messages.TraceControl_EnableEventsFilterTooltip);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ fFilterText.setLayoutData(data);
+ }
+ }
+
/**
* Enable/selects widgets depending on the group specified.
* @param group - group to enable.
*/
private void setEnablements(GroupEnum group) {
-
+
// Enable/disable trace point items
fTracepointsActivateButton.setSelection(group == GroupEnum.TRACEPOINTS);
fTracepointsViewer.getTree().setEnabled(group == GroupEnum.TRACEPOINTS);
-
+
// Enable/disable wildcard items
fWildcardActivateButton.setSelection(group == GroupEnum.WILDCARD);
fWildcardText.setEnabled(group == GroupEnum.WILDCARD);
// Local classes
// ------------------------------------------------------------------------
/**
- * Content provider for the tracepoints tree.
+ * Content provider for the tracepoints tree.
*/
- final static public class UstContentProvider extends TraceControlContentProvider {
+ public static final class UstContentProvider extends TraceControlContentProvider {
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof TargetNodeComponent) {
List<ITraceControlComponent> children = ((ITraceControlComponent)parentElement).getChildren(TraceProviderGroup.class);
- return (ITraceControlComponent[]) children.toArray(new ITraceControlComponent[children.size()]);
+ return children.toArray(new ITraceControlComponent[children.size()]);
}
if (parentElement instanceof TraceProviderGroup) {
List<ITraceControlComponent> children = ((ITraceControlComponent)parentElement).getChildren(UstProviderComponent.class);
- return (ITraceControlComponent[]) children.toArray(new ITraceControlComponent[children.size()]);
+ return children.toArray(new ITraceControlComponent[children.size()]);
}
if (parentElement instanceof ITraceControlComponent) {
return ((ITraceControlComponent)parentElement).getChildren();
return new Object[0];
}
}
-
+
/**
- * Content label for the tracepoints tree.
+ * Content label for the tracepoints tree.
*/
- final static public class UstLabelProvider extends TraceControlLabelProvider {
+ public static final class UstLabelProvider extends TraceControlLabelProvider {
@Override
public Image getImage(Object element) {
return null;
}
/**
- * Check state listener for the tracepoints tree.
+ * Check state listener for the tracepoints tree.
*/
- final public class UstCheckStateListener implements ICheckStateListener {
+ public final class UstCheckStateListener implements ICheckStateListener {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
}
if (event.getElement() instanceof UstProviderComponent) {
fTracepointsViewer.setSubtreeChecked(event.getElement(), true);
- }
+ }
} else {
if (event.getElement() instanceof TraceProviderGroup) {
fTracepointsViewer.setSubtreeChecked(event.getElement(), true);