/********************************************************************** * 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: * Bernd Hufmann - Initial API and implementation * Marc-Andre Laperle - Add filtering textbox **********************************************************************/ package org.eclipse.tracecompass.internal.lttng2.control.ui.views.dialogs; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceDomainType; import org.eclipse.tracecompass.internal.lttng2.control.core.model.TraceEventType; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.messages.Messages; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.ITraceControlComponent; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.BaseEventComponent; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.KernelProviderComponent; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceControlContentProvider; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceControlLabelProvider; import org.eclipse.tracecompass.internal.lttng2.control.ui.views.model.impl.TraceProviderGroup; import org.eclipse.ui.dialogs.FilteredTree; import org.eclipse.ui.dialogs.PatternFilter; /** * <p> * A composite for collecting information about kernel events to be enabled. * </p> * * @author Bernd Hufmann */ public class EnableKernelEventComposite extends Composite implements IEnableKernelEvents { // ------------------------------------------------------------------------ // Constants // ------------------------------------------------------------------------ private enum KernelGroupEnum { ALL, TRACEPOINTS, SYSCALLS, PROBE, FUNCTION } // ------------------------------------------------------------------------ // Attributes // ------------------------------------------------------------------------ /** * A button to enable/disable the all tracepoints&sycalls group */ private Button fAllActivateButton; /** * A button to enable/disable the tracepoints group */ private Button fTracepointsActivateButton; /** * A tree viewer for displaying and selection of available tracepoints. */ private CheckboxTreeViewer fTracepointsViewer; /** * A tree viewer for displaying and selection of available syscalls. */ private CheckboxTreeViewer fSyscallsViewer; /** * A button to enable/disable the syscalls group */ private Button fSyscallsActivateButton; /** * A Text field for the specific event name. */ private Text fSpecificEventText; /** * A button to enable or disable the dynamic probe group. */ private Button fProbeActivateButton; /** * The text field for the event name for the dynamic probe. */ private Text fProbeEventNameText; /** * The text field for the dynamic probe. */ private Text fProbeText; /** * A button to enable or disable the dynamic function probe group. */ private Button fFunctionActivateButton; /** * The text field for the event name for the dynamic probe. */ private Text fFunctionEventNameText; /** * The text field for the dynamic function entry/return probe. */ private Text fFunctionText; /** * The filter text */ private Text fFilterText; /** * The referenced trace provider group containing the kernel provider * component which contains a list of available tracepoints. */ private final TraceProviderGroup fProviderGroup; /** * The flag indicating that all tracepoints/syscalls are selected. */ private boolean fIsAllTracepointsAndSyscalls; /** * The flag indicating that tracepoints are selected. */ private boolean fIsTracepoints; /** * The flag indicating that all tracepoints are selected. */ private boolean fIsAllTracepoints; /** * The flag indicating that syscalls are selected. */ private boolean fIsSyscalls; /** * The flag indicating that all syscalls are selected. */ private boolean fIsAllSyscalls; /** * The list of tracepoints to be enabled. */ private List<String> fSelectedEvents; /** * The flag indicating that dynamic probe is selected. */ private boolean fIsDynamicProbe; /** * The event name of the dynamic probe. */ private String fProbeEventName; /** * The dynamic probe. */ private String fProbeString; /** * The flag indicating that the dynamic function probe is selected. */ private boolean fIsDynamicFunctionProbe; /** * The event name of the dynamic function entry/return probe. */ private String fFunctionEventName; /** * The dynamic function entry/return probe. */ private String fFunctionString; /** * The filter expression */ private String fFilterExpression; // ------------------------------------------------------------------------ // Constructors // ------------------------------------------------------------------------ /** * Constructor * * @param parent * The parent composite * @param style * The index of the style for this event composite * @param providerGroup * The trace provider group */ public EnableKernelEventComposite(Composite parent, int style, TraceProviderGroup providerGroup) { super(parent, style); fProviderGroup = providerGroup; } // ------------------------------------------------------------------------ // Acessors // ------------------------------------------------------------------------ @Override public boolean isAllEvents() { return fIsAllTracepointsAndSyscalls; } @Override public boolean isTracepoints() { return fIsTracepoints; } @Override public boolean isAllTracePoints() { return fIsAllTracepoints; } @Override public boolean isSyscalls() { return fIsSyscalls; } @Override public boolean isAllSyscalls() { return fIsAllSyscalls; } @Override public List<String> getEventNames() { return new ArrayList<>(fSelectedEvents); } @Override public boolean isDynamicProbe() { return fIsDynamicProbe; } @Override public String getProbeName() { return fProbeString; } @Override public String getProbeEventName() { return fProbeEventName; } @Override public boolean isDynamicFunctionProbe() { return fIsDynamicFunctionProbe; } @Override public String getFunctionEventName() { return fFunctionEventName; } @Override public String getFunction() { return fFunctionString; } @Override public String getFilterExpression() { return fFilterExpression; } // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ /** * Creates the composite content */ public void createContent() { // All Tracepoints/syscalls Group createAllTracepointsSyscallGroup(); // Tracepoints Group createTracepointsGroup(); // Syscalls Group createSyscallsGroup(); // Dynamic Probe Group createDynamicProbeGroup(); // Dynamic Function Probe Group createDynamicFunctionPropeGroup(); // Filter Group createFilterGroup(); // Set default enablements setKernelEnablements(KernelGroupEnum.ALL); } /** * Validates the kernel composite input data. * @return true if configured data is valid and can be retrieved. */ public boolean isValid() { fIsAllTracepointsAndSyscalls = fAllActivateButton.getSelection(); fIsTracepoints = fTracepointsActivateButton.getSelection(); fIsSyscalls = fSyscallsActivateButton.getSelection(); fIsDynamicProbe = fProbeActivateButton.getSelection(); fIsDynamicFunctionProbe = fFunctionActivateButton.getSelection(); // initialize tracepoint fields fIsAllTracepoints = false; fSelectedEvents = new ArrayList<>(); if (fIsTracepoints) { Object[] checkedElements = fTracepointsViewer.getCheckedElements(); for (int i = 0; i < checkedElements.length; i++) { ITraceControlComponent component = (ITraceControlComponent)checkedElements[i]; if (component instanceof BaseEventComponent) { fSelectedEvents.add(component.getName()); } } // verify if all events are selected int nbEvents = 0; List<ITraceControlComponent> comps = fProviderGroup.getChildren(KernelProviderComponent.class); for (ITraceControlComponent comp : comps) { for (ITraceControlComponent event : comp.getChildren()) { if (event instanceof BaseEventComponent && ((BaseEventComponent) event).getEventType() == TraceEventType.TRACEPOINT) { nbEvents++; } } } fIsAllTracepoints = (nbEvents == fSelectedEvents.size()); String tmpSpecificEvent = fSpecificEventText.getText(); if (!fIsAllTracepoints && !tmpSpecificEvent.trim().isEmpty()) { // Format the text to a List<String> // Removing all non visible characters tmpSpecificEvent = tmpSpecificEvent.replaceAll("\\s", ""); //$NON-NLS-1$ //$NON-NLS-2$ // Splitting the different events that are separated by commas List<String> list = Arrays.asList(tmpSpecificEvent.split(",")); //$NON-NLS-1$ fSelectedEvents.addAll(list); fSelectedEvents = fSelectedEvents.stream().distinct().collect(Collectors.toList()); } } fIsAllSyscalls = false; if (fIsSyscalls) { if (fSyscallsViewer != null) { Object[] checkedElements = fSyscallsViewer.getCheckedElements(); for (int i = 0; i < checkedElements.length; i++) { ITraceControlComponent component = (ITraceControlComponent)checkedElements[i]; if (component instanceof BaseEventComponent) { fSelectedEvents.add(component.getName()); } } // verify if all events are selected int nbSyscalls = 0; List<ITraceControlComponent> comps = fProviderGroup.getChildren(KernelProviderComponent.class); for (ITraceControlComponent comp : comps) { for (ITraceControlComponent syscall : comp.getChildren()) { if (syscall instanceof BaseEventComponent && ((BaseEventComponent) syscall).getEventType() == TraceEventType.SYSCALL) { nbSyscalls++; } } } fIsAllSyscalls = (nbSyscalls == fSelectedEvents.size()); if (!fIsAllSyscalls) { fSelectedEvents = fSelectedEvents.stream().distinct().collect(Collectors.toList()); } } else { // for version < LTTng 2.6.0 only all syscalls could be enabled fIsAllSyscalls = true; } } if (fIsDynamicProbe) { String temp = fProbeEventNameText.getText(); if (temp.trim().isEmpty() || (!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_InvalidProbeNameError + " (" + temp + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ return false; } fProbeEventName = temp; // fProbeString will be validated by lttng-tools fProbeString = fProbeText.getText(); } // initialize function string fFunctionEventName = null; fFunctionString = null; if (fIsDynamicFunctionProbe) { String functionTemp = fFunctionEventNameText.getText(); if (functionTemp.trim().isEmpty() || (!functionTemp.matches("^[\\s]{0,}$") && !functionTemp.matches("^[a-zA-Z0-9\\-\\_]{1,}$"))) { //$NON-NLS-1$ //$NON-NLS-2$ MessageDialog.openError(getShell(), Messages.TraceControl_EnableEventsDialogTitle, Messages.TraceControl_InvalidProbeNameError + " (" + functionTemp + ") \n"); //$NON-NLS-1$ //$NON-NLS-2$ return false; } fFunctionEventName = functionTemp; // fFunctionString will be validated by lttng-tools fFunctionString = fFunctionText.getText(); } // initialize filter with null fFilterExpression = null; if (fProviderGroup.isEventFilteringSupported(TraceDomainType.KERNEL)) { String tempFilter = fFilterText.getText(); if(!tempFilter.trim().isEmpty()) { fFilterExpression = tempFilter; } } return true; } /** * Creates all tracepoints/syscalls group. */ private void createAllTracepointsSyscallGroup() { GridLayout layout; GridData data; Group tpMainGroup = new Group(this, SWT.SHADOW_NONE); tpMainGroup.setText(Messages.TraceControl_EnableEventsAllEventsLabel); layout = new GridLayout(2, false); tpMainGroup.setLayout(layout); data = new GridData(GridData.FILL_HORIZONTAL); tpMainGroup.setLayoutData(data); Composite buttonComposite = new Composite(tpMainGroup, SWT.NONE); layout = new GridLayout(1, true); buttonComposite.setLayout(layout); data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true); buttonComposite.setLayoutData(data); fAllActivateButton = new Button(buttonComposite, SWT.RADIO); fAllActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName); fAllActivateButton.setToolTipText(Messages.TraceControl_EnableEventsAllEventsTooltip); data = new GridData(GridData.FILL_HORIZONTAL); fAllActivateButton.setLayoutData(data); fAllActivateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setKernelEnablements(KernelGroupEnum.ALL); } }); } /** * Creates tracepoints group. */ private void createTracepointsGroup() { GridLayout layout; GridData data; Group tpMainGroup = new Group(this, SWT.SHADOW_NONE); tpMainGroup.setText(Messages.TraceControl_EnableEventsTracepointGroupName); layout = new GridLayout(2, false); tpMainGroup.setLayout(layout); data = new GridData(GridData.FILL_BOTH); tpMainGroup.setLayoutData(data); Composite buttonComposite = new Composite(tpMainGroup, SWT.NONE); layout = new GridLayout(1, true); buttonComposite.setLayout(layout); data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true); buttonComposite.setLayoutData(data); fTracepointsActivateButton = new Button(buttonComposite, SWT.RADIO); fTracepointsActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName); data = new GridData(GridData.FILL_HORIZONTAL); fTracepointsActivateButton.setLayoutData(data); fTracepointsActivateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setKernelEnablements(KernelGroupEnum.TRACEPOINTS); } }); Group tracepointsGroup = new Group(tpMainGroup, SWT.SHADOW_NONE); layout = new GridLayout(1, true); tracepointsGroup.setLayout(layout); data = new GridData(GridData.FILL_BOTH); tracepointsGroup.setLayoutData(data); new FilteredTree(tracepointsGroup, 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 KernelContentProvider(TraceEventType.TRACEPOINT)); fTracepointsViewer.setLabelProvider(new KernelLabelProvider()); fTracepointsViewer.addCheckStateListener(new KernelCheckListener(fTracepointsViewer)); fTracepointsViewer.setInput(fProviderGroup); fTracepointsViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); return fTracepointsViewer; } @Override protected void updateToolbar(boolean visible) { super.updateToolbar(visible); treeViewer.expandAll(); } }; Group specificEventGroup = new Group(tracepointsGroup, SWT.SHADOW_NONE); specificEventGroup.setText(Messages.TraceControl_EnableEventsSpecificEventGroupName); layout = new GridLayout(4, true); specificEventGroup.setLayout(layout); specificEventGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label specificEventLabel = new Label(specificEventGroup, SWT.LEFT); specificEventLabel.setText(Messages.TraceControl_EnableEventsNameLabel); data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 1; specificEventLabel.setLayoutData(data); fSpecificEventText = new Text(specificEventGroup, SWT.LEFT); fSpecificEventText.setToolTipText(Messages.TraceControl_EnableEventsSpecificEventTooltip); data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 3; fSpecificEventText.setLayoutData(data); } /** * Creates syscalls group. */ private void createSyscallsGroup() { GridLayout layout; GridData data; Group syscallMainGroup = new Group(this, SWT.SHADOW_NONE); syscallMainGroup.setText(Messages.TraceControl_EnableEventsSyscallName); layout = new GridLayout(2, false); syscallMainGroup.setLayout(layout); data = new GridData(GridData.FILL_BOTH); syscallMainGroup.setLayoutData(data); Composite buttonComposite = new Composite(syscallMainGroup, SWT.NONE); layout = new GridLayout(1, true); buttonComposite.setLayout(layout); data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true); buttonComposite.setLayoutData(data); fSyscallsActivateButton = new Button(buttonComposite, SWT.RADIO); fSyscallsActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName); fSyscallsActivateButton.setSelection(false); data = new GridData(GridData.FILL_HORIZONTAL); fSyscallsActivateButton.setLayoutData(data); fSyscallsActivateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setKernelEnablements(KernelGroupEnum.SYSCALLS); } }); if (fProviderGroup.isPerSyscallEventsSupported()) { Group syscallGroup = new Group(syscallMainGroup, SWT.SHADOW_NONE); layout = new GridLayout(1, true); syscallGroup.setLayout(layout); data = new GridData(GridData.FILL_BOTH); syscallGroup.setLayoutData(data); new FilteredTree(syscallGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER, new PatternFilter(), true) { @Override protected TreeViewer doCreateTreeViewer(Composite aparent, int style) { fSyscallsViewer = new CheckboxTreeViewer(aparent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); fSyscallsViewer.getTree().setToolTipText(Messages.TraceControl_EnableEventsSyscallTooltip); fSyscallsViewer.setContentProvider(new KernelContentProvider(TraceEventType.SYSCALL)); fSyscallsViewer.setLabelProvider(new KernelLabelProvider()); fSyscallsViewer.addCheckStateListener(new KernelCheckListener(fSyscallsViewer)); fSyscallsViewer.setInput(fProviderGroup); fSyscallsViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); return fSyscallsViewer; } @Override protected void updateToolbar(boolean visible) { super.updateToolbar(visible); treeViewer.expandAll(); } }; } } /** * Creates dynamic probe group. */ private void createDynamicProbeGroup() { GridLayout layout; GridData data; Group probeMainGroup = new Group(this, SWT.SHADOW_NONE); probeMainGroup.setText(Messages.TraceControl_EnableEventsProbeGroupName); layout = new GridLayout(2, false); probeMainGroup.setLayout(layout); data = new GridData(GridData.FILL_HORIZONTAL); probeMainGroup.setLayoutData(data); Composite buttonComposite = new Composite(probeMainGroup, SWT.NONE); layout = new GridLayout(1, false); buttonComposite.setLayout(layout); data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true); buttonComposite.setLayoutData(data); fProbeActivateButton = new Button(buttonComposite, SWT.RADIO); fProbeActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName); fProbeActivateButton.setSelection(false); data = new GridData(GridData.FILL_HORIZONTAL); fProbeActivateButton.setLayoutData(data); fProbeActivateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setKernelEnablements(KernelGroupEnum.PROBE); } }); Group probeGroup = new Group(probeMainGroup, SWT.SHADOW_NONE); layout = new GridLayout(4, true); probeGroup.setLayout(layout); probeGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label probeNameLabel = new Label(probeGroup, SWT.LEFT); probeNameLabel.setText(Messages.TraceControl_EnableEventsNameLabel); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 1; probeNameLabel.setLayoutData(data); fProbeEventNameText = new Text(probeGroup, SWT.LEFT); fProbeEventNameText.setToolTipText(Messages.TraceControl_EnableEventsProbeEventNameTooltip); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 3; fProbeEventNameText.setLayoutData(data); Label probeLabel = new Label(probeGroup, SWT.LEFT); probeLabel.setText(Messages.TraceControl_EnableEventsProbeNameLabel); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 1; probeLabel.setLayoutData(data); fProbeText = new Text(probeGroup, SWT.LEFT); fProbeText.setToolTipText(Messages.TraceControl_EnableEventsProbeNameTooltip); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 3; fProbeText.setLayoutData(data); } /** * Creates dynamic function entry/return probe group. */ private void createDynamicFunctionPropeGroup() { GridLayout layout; GridData data; Group functionMainGroup = new Group(this, SWT.SHADOW_NONE); functionMainGroup.setText(Messages.TraceControl_EnableEventsFucntionGroupName); layout = new GridLayout(2, false); functionMainGroup.setLayout(layout); data = new GridData(GridData.FILL_HORIZONTAL); functionMainGroup.setLayoutData(data); Composite buttonComposite = new Composite(functionMainGroup, SWT.NONE); layout = new GridLayout(1, false); buttonComposite.setLayout(layout); data = new GridData(SWT.BEGINNING, SWT.CENTER, false, true); buttonComposite.setLayoutData(data); fFunctionActivateButton = new Button(buttonComposite, SWT.RADIO); fFunctionActivateButton.setText(Messages.TraceControl_EnableGroupSelectionName); fFunctionActivateButton.setSelection(false); data = new GridData(GridData.FILL_HORIZONTAL); fFunctionActivateButton.setLayoutData(data); fFunctionActivateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setKernelEnablements(KernelGroupEnum.FUNCTION); } }); Group functionGroup = new Group(functionMainGroup, SWT.SHADOW_NONE); layout = new GridLayout(4, true); functionGroup.setLayout(layout); functionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); Label functionNameLabel = new Label(functionGroup, SWT.LEFT); functionNameLabel.setText(Messages.TraceControl_EnableEventsNameLabel); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 1; functionNameLabel.setLayoutData(data); fFunctionEventNameText = new Text(functionGroup, SWT.LEFT); fFunctionEventNameText.setToolTipText(Messages.TraceControl_EnableEventsFunctionEventNameTooltip); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 3; fFunctionEventNameText.setLayoutData(data); Label functionLabel = new Label(functionGroup, SWT.LEFT); functionLabel.setText(Messages.TraceControl_EnableEventsFunctionNameLabel); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 1; functionLabel.setLayoutData(data); fFunctionText = new Text(functionGroup, SWT.LEFT); fFunctionText.setToolTipText(Messages.TraceControl_EnableEventsProbeNameTooltip); data = new GridData(GridData.FILL_BOTH); data.horizontalSpan = 3; fFunctionText.setLayoutData(data); } /** * Enable/selects widgets depending on the group specified. * @param group - group to enable. */ private void setKernelEnablements(KernelGroupEnum group) { fAllActivateButton.setSelection(group == KernelGroupEnum.ALL); fTracepointsActivateButton.setSelection(group == KernelGroupEnum.TRACEPOINTS); fTracepointsViewer.getTree().setEnabled(group == KernelGroupEnum.TRACEPOINTS); fSpecificEventText.setEnabled(group == KernelGroupEnum.TRACEPOINTS); fSyscallsActivateButton.setSelection(group == KernelGroupEnum.SYSCALLS); if (fProviderGroup.isPerSyscallEventsSupported()) { fSyscallsViewer.getTree().setEnabled(group == KernelGroupEnum.SYSCALLS); } fProbeActivateButton.setSelection(group == KernelGroupEnum.PROBE); fProbeEventNameText.setEnabled(group == KernelGroupEnum.PROBE); fProbeText.setEnabled(group == KernelGroupEnum.PROBE); fFunctionActivateButton.setSelection(group == KernelGroupEnum.FUNCTION); fFunctionEventNameText.setEnabled(group == KernelGroupEnum.FUNCTION); fFunctionText.setEnabled(group == KernelGroupEnum.FUNCTION); } private void createFilterGroup() { if (fProviderGroup.isEventFilteringSupported(TraceDomainType.KERNEL)) { 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); } } // ------------------------------------------------------------------------ // Local classes // ------------------------------------------------------------------------ /** * Content provider for the tracepoints and syscalls tree. */ public static final class KernelContentProvider extends TraceControlContentProvider { /** * The type of event ({@link TraceEventType}) */ private final TraceEventType fEventType; /** * Constructor * * @param eventType * the type of event ({@link TraceEventType}) */ public KernelContentProvider(TraceEventType eventType) { fEventType = eventType; } @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof TraceProviderGroup) { List<ITraceControlComponent> children = ((ITraceControlComponent)parentElement).getChildren(KernelProviderComponent.class); return children.toArray(new ITraceControlComponent[children.size()]); } if (parentElement instanceof ITraceControlComponent) { List<ITraceControlComponent> events = new ArrayList<>(); for (ITraceControlComponent event : ((ITraceControlComponent)parentElement).getChildren()) { if (event instanceof BaseEventComponent && ((BaseEventComponent) event).getEventType() == fEventType) { events.add(event); } } return events.toArray(new ITraceControlComponent[events.size()]); } return new Object[0]; } } /** * Content label for the tracepoints and syscalls tree. */ public static final class KernelLabelProvider extends TraceControlLabelProvider { @Override public Image getImage(Object element) { return null; } @Override public String getText(Object element) { if ((element != null) && (element instanceof KernelProviderComponent)) { return Messages.TraceControl_EnableEventsTreeAllLabel; } return super.getText(element); } } /** * Check state listener for the tracepoints and syscalls tree. */ public final class KernelCheckListener implements ICheckStateListener { /** * The check box tree viewer. */ private final CheckboxTreeViewer fCheckBoxTreeViewer; /** * Constructor * * @param checkBoxTreeViewer * the check box tree viewer. */ public KernelCheckListener(CheckboxTreeViewer checkBoxTreeViewer) { fCheckBoxTreeViewer = checkBoxTreeViewer; } @Override public void checkStateChanged(CheckStateChangedEvent event) { if (event.getChecked()) { if (event.getElement() instanceof KernelProviderComponent) { fCheckBoxTreeViewer.setSubtreeChecked(event.getElement(), true); } } else { if (event.getElement() instanceof KernelProviderComponent) { fCheckBoxTreeViewer.setSubtreeChecked(event.getElement(), false); } else { ITraceControlComponent component = (ITraceControlComponent) event.getElement(); fCheckBoxTreeViewer.setChecked(component.getParent(), false); } } } } }