/*******************************************************************************
* Copyright (c) 2010, 2015 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:
* Patrick Tasse - Initial API and implementation
* Xavier Raynaud - add cut/copy/paste/dnd support
* Vincent Perot - Add subfield filtering
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.views.filter;
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.tracecompass.internal.tmf.ui.Messages;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfBaseAspects;
import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfEventFieldAspect;
import org.eclipse.tracecompass.tmf.core.filter.model.ITmfFilterTreeNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterAndNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterAspectNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterCompareNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterCompareNode.Type;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterContainsNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterEqualsNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterMatchesNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterOrNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterRootNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterTraceTypeNode;
import org.eclipse.tracecompass.tmf.core.filter.model.TmfFilterTreeNode;
import org.eclipse.tracecompass.tmf.core.project.model.TmfTraceType;
import org.eclipse.tracecompass.tmf.core.project.model.TraceTypeHelper;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
class FilterViewer extends Composite {
private static class TraceTypeItem {
public String label;
public String traceTypeId;
public TraceTypeItem(String label, String traceTypeId) {
this.label = label;
this.traceTypeId = traceTypeId;
}
}
private static class AspectItem {
public String label;
public ITmfEventAspect<?> eventAspect;
public String traceTypeId;
public AspectItem(String label) {
this.label = label;
}
public AspectItem(String label, ITmfEventAspect<?> eventAspect, String traceTypeId) {
this.label = label;
this.eventAspect = eventAspect;
this.traceTypeId = traceTypeId;
}
}
private TreeViewer fViewer;
private Composite fComposite;
private MenuManager fMenuManager;
private boolean fIsDialog = false;
public FilterViewer(Composite parent, int style) {
this(parent, style, false);
}
public FilterViewer(Composite parent, int style, boolean isDialog) {
super(parent, style);
this.fIsDialog = isDialog;
setLayout(new FillLayout());
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
setLayoutData(gd);
final SashForm sash = new SashForm(this, SWT.HORIZONTAL);
// Create the tree viewer to display the filter tree
fViewer = new TreeViewer(sash, SWT.NONE);
fViewer.setContentProvider(new FilterTreeContentProvider());
fViewer.setLabelProvider(new FilterTreeLabelProvider());
fViewer.setInput(new TmfFilterRootNode());
// Create the empty filter node properties panel
fComposite = new Composite(sash, SWT.NONE);
GridLayout gl = new GridLayout();
gl.marginHeight = 0;
gl.marginWidth = 0;
fComposite.setLayout(gl);
createContextMenu();
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (!(event.getSelection().isEmpty()) && event.getSelection() instanceof IStructuredSelection) {
// Update the filter node properties panel to the selection
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
ITmfFilterTreeNode node = (ITmfFilterTreeNode) selection.getFirstElement();
updateFilterNodeComposite(node);
// Highlight the selection's children
highlightTreeItems(fViewer.getTree().getSelection()[0].getItems());
} else {
updateFilterNodeComposite(null);
}
}
});
fViewer.getTree().addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
TmfFilterTreeNode root = (TmfFilterTreeNode) fViewer.getInput();
if (root == null || root.getChildrenCount() == 0) {
e.gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
e.gc.drawText(Messages.FilterViewer_EmptyTreeHintText, 5, 0);
}
}
});
int operations = DND.DROP_MOVE | DND.DROP_COPY;
DragSource dragSource = new org.eclipse.swt.dnd.DragSource(fViewer.getTree(), operations);
dragSource.setTransfer(new Transfer[] { LocalSelectionTransfer.getTransfer() });
dragSource.addDragListener(new FilterDragSourceAdapter(this));
DropTarget dropTarget = new DropTarget(fViewer.getTree(), operations);
dropTarget.setTransfer(new Transfer[] { LocalSelectionTransfer.getTransfer() });
dropTarget.addDropListener(new FilterDropTargetAdapter(this));
}
/**
* Create the context menu for the tree viewer
*/
private void createContextMenu() {
// Adds root context menu
fMenuManager = new MenuManager();
fMenuManager.setRemoveAllWhenShown(true);
fMenuManager.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
fillContextMenu(manager);
}
});
// Context
Menu contextMenu = fMenuManager.createContextMenu(fViewer.getTree());
// Publish it
fViewer.getTree().setMenu(contextMenu);
}
public MenuManager getMenuManager() {
return fMenuManager;
}
/**
* Fill the context menu for the tree viewer.
*
* @param manager
* The menu manager
*/
protected void fillContextMenu(IMenuManager manager) {
final ISelection selection = fViewer.getSelection();
ITmfFilterTreeNode filterTreeNode = null;
if (selection instanceof StructuredSelection) {
Object element = ((StructuredSelection) selection).getFirstElement();
if (element instanceof ITmfFilterTreeNode) {
filterTreeNode = (ITmfFilterTreeNode) element;
}
}
final ITmfFilterTreeNode selectedNode = filterTreeNode;
if (selectedNode != null) {
fillContextMenuForNode(selectedNode, manager);
}
manager.add(new Separator("delete")); //$NON-NLS-1$
if (fIsDialog && (selectedNode != null)) {
Action deleteAction = new Action(Messages.FilterViewer_DeleteActionText) {
@Override
public void run() {
selectedNode.remove();
fViewer.refresh();
}
};
deleteAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
manager.add(deleteAction);
}
manager.add(new Separator("edit")); //$NON-NLS-1$
if (fViewer.getInput() instanceof TmfFilterRootNode || filterTreeNode == null) {
manager.add(new Separator());
ITmfFilterTreeNode root = (ITmfFilterTreeNode) fViewer.getInput();
fillContextMenuForNode(root, manager);
}
}
/**
* Fill the context menu with the valid children of the provided node
*
* @param node
* The target node
* @param manager
* The menu manager
*/
protected void fillContextMenuForNode(final ITmfFilterTreeNode node, IMenuManager manager) {
for (final String child : node.getValidChildren()) {
final Action action = new Action() {
@Override
public void run() {
ITmfFilterTreeNode newNode = null;
if (TmfFilterNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterNode(node, ""); //$NON-NLS-1$
} else if (TmfFilterTraceTypeNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterTraceTypeNode(node);
} else if (TmfFilterAndNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterAndNode(node);
} else if (TmfFilterOrNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterOrNode(node);
} else if (TmfFilterContainsNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterContainsNode(node);
} else if (TmfFilterEqualsNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterEqualsNode(node);
} else if (TmfFilterMatchesNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterMatchesNode(node);
} else if (TmfFilterCompareNode.NODE_NAME.equals(child)) {
newNode = new TmfFilterCompareNode(node);
}
if (newNode != null) {
fViewer.refresh();
fViewer.setSelection(new StructuredSelection(newNode), true);
}
}
};
if (TmfFilterNode.NODE_NAME.equals(child)) {
action.setText(Messages.FilterViewer_NewPrefix + " " + child); //$NON-NLS-1$
} else {
action.setText(child);
}
manager.add(action);
}
}
/**
* Create the appropriate filter node properties composite
*/
private void updateFilterNodeComposite(ITmfFilterTreeNode node) {
for (Control control : fComposite.getChildren()) {
control.dispose();
}
if (node instanceof TmfFilterNode) {
new FilterNodeComposite(fComposite, (TmfFilterNode) node);
} else if (node instanceof TmfFilterTraceTypeNode) {
new FilterTraceTypeNodeComposite(fComposite, (TmfFilterTraceTypeNode) node);
} else if (node instanceof TmfFilterAndNode) {
new FilterAndNodeComposite(fComposite, (TmfFilterAndNode) node);
} else if (node instanceof TmfFilterOrNode) {
new FilterOrNodeComposite(fComposite, (TmfFilterOrNode) node);
} else if (node instanceof TmfFilterContainsNode) {
new FilterContainsNodeComposite(fComposite, (TmfFilterContainsNode) node);
} else if (node instanceof TmfFilterEqualsNode) {
new FilterEqualsNodeComposite(fComposite, (TmfFilterEqualsNode) node);
} else if (node instanceof TmfFilterMatchesNode) {
new FilterMatchesNodeComposite(fComposite, (TmfFilterMatchesNode) node);
} else if (node instanceof TmfFilterCompareNode) {
new FilterCompareNodeComposite(fComposite, (TmfFilterCompareNode) node);
} else {
new FilterBaseNodeComposite(fComposite);
}
fComposite.layout();
}
/**
* Highlight the provided tree items
*/
private void highlightTreeItems(TreeItem[] items) {
resetTreeItems(fViewer.getTree().getItems());
for (TreeItem item : items) {
item.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLUE));
}
}
/**
* Reset the provided tree items (remove highlight)
*/
private void resetTreeItems(TreeItem[] items) {
for (TreeItem item : items) {
item.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
resetTreeItems(item.getItems());
}
}
public void setInput(ITmfFilterTreeNode root) {
fViewer.setInput(root);
fViewer.expandAll();
updateFilterNodeComposite(null);
}
public ITmfFilterTreeNode getInput() {
return (ITmfFilterTreeNode) fViewer.getInput();
}
public void refresh() {
fViewer.refresh();
}
public void setSelection(ITmfFilterTreeNode node, boolean reveal) {
fViewer.setSelection(new StructuredSelection(node), reveal);
}
public void setSelection(ITmfFilterTreeNode node) {
fViewer.setSelection(new StructuredSelection(node));
}
public ITmfFilterTreeNode getSelection() {
final ISelection selection = fViewer.getSelection();
ITmfFilterTreeNode filterTreeNode = null;
if (selection instanceof StructuredSelection) {
Object element = ((StructuredSelection) selection).getFirstElement();
if (element instanceof ITmfFilterTreeNode) {
filterTreeNode = (ITmfFilterTreeNode) element;
}
}
final ITmfFilterTreeNode selectedNode = filterTreeNode;
return selectedNode;
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
fViewer.addSelectionChangedListener(listener);
}
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
fViewer.removeSelectionChangedListener(listener);
}
@Override
public boolean setFocus() {
return fViewer.getControl().setFocus();
}
/**
* @return whether the tree is in focus or not
*/
public boolean isTreeInFocus() {
return fViewer.getControl().isFocusControl();
}
/**
* Gets the TreeViewer displaying filters
*
* @return a {@link TreeViewer}
*/
TreeViewer getTreeViewer() {
return fViewer;
}
private class FilterBaseNodeComposite extends Composite {
FilterBaseNodeComposite(Composite parent) {
super(parent, SWT.NONE);
setLayout(new GridLayout(2, false));
setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
}
protected Map<String, TraceTypeHelper> getTraceTypeMap() {
Map<String, TraceTypeHelper> traceTypeMap = new TreeMap<>();
for (TraceTypeHelper helper : TmfTraceType.getTraceTypeHelpers()) {
if (!helper.isExperimentType()) {
traceTypeMap.put(helper.getLabel(), helper);
}
}
return traceTypeMap;
}
}
private abstract class FilterAspectNodeComposite extends FilterBaseNodeComposite {
TmfFilterAspectNode fAspectNode;
Combo fTraceTypeCombo;
Combo fAspectCombo;
Label fFieldLabel;
Text fFieldText;
List<AspectItem> fAspectList = null;
FilterAspectNodeComposite(Composite parent, TmfFilterAspectNode node) {
super(parent);
fAspectNode = node;
}
protected void createAspectControls() {
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_TypeLabel);
final List<TraceTypeItem> traceTypeList = getTraceTypeList(fAspectNode);
fTraceTypeCombo = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
fTraceTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
for (TraceTypeItem traceType : traceTypeList) {
fTraceTypeCombo.add(traceType.label);
}
if (fAspectNode.getTraceTypeId() == null) {
fTraceTypeCombo.select(0);
fAspectNode.setTraceTypeId(traceTypeList.get(0).traceTypeId);
} else {
for (int i = 0; i < traceTypeList.size(); i++) {
TraceTypeItem traceType = traceTypeList.get(i);
if (fAspectNode.getTraceTypeId().equals(traceType.traceTypeId)) {
fTraceTypeCombo.select(i);
break;
}
}
}
fTraceTypeCombo.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
TraceTypeItem traceType = traceTypeList.get(fTraceTypeCombo.getSelectionIndex());
fAspectNode.setTraceTypeId(traceType.traceTypeId);
fAspectList = getAspectList(fAspectNode.getTraceTypeId());
String text = fAspectCombo.getText();
fAspectCombo.removeAll();
for (AspectItem aspect : fAspectList) {
fAspectCombo.add(aspect.label);
}
int index = Arrays.asList(fAspectCombo.getItems()).indexOf(text);
if (index >= 0 && !text.isEmpty()) {
fAspectCombo.select(index);
}
fViewer.refresh(fAspectNode);
}
});
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_AspectLabel);
fAspectList = getAspectList(fAspectNode.getTraceTypeId());
fAspectCombo = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
fAspectCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
for (AspectItem aspect : fAspectList) {
fAspectCombo.add(aspect.label);
}
if (fAspectNode.getEventAspect() != null) {
for (int i = 0; i < fAspectList.size(); i++) {
AspectItem aspect = fAspectList.get(i);
if (aspect.eventAspect != null &&
fAspectNode.getEventAspect().getName().equals(aspect.eventAspect.getName()) &&
(fAspectNode.getTraceTypeId().equals(aspect.traceTypeId) ||
fAspectNode.getTraceTypeId().equals(TmfFilterAspectNode.BASE_ASPECT_ID))) {
fAspectCombo.select(i);
if (fAspectNode.getEventAspect() instanceof TmfEventFieldAspect) {
aspect.eventAspect = fAspectNode.getEventAspect();
createFieldControls((TmfEventFieldAspect) fAspectNode.getEventAspect(), aspect);
}
break;
}
}
}
fAspectCombo.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
int selection = fAspectCombo.getSelectionIndex();
AspectItem aspect = null;
if (selection != -1) {
aspect = fAspectList.get(fAspectCombo.getSelectionIndex());
fAspectNode.setEventAspect(aspect.eventAspect);
} else {
fAspectNode.setEventAspect(null);
}
if (fAspectNode.getEventAspect() instanceof TmfEventFieldAspect) {
TmfEventFieldAspect eventFieldAspect = (TmfEventFieldAspect) fAspectNode.getEventAspect();
createFieldControls(eventFieldAspect, aspect);
layout();
} else if (fFieldLabel != null && fFieldText != null) {
fFieldLabel.dispose();
fFieldLabel = null;
fFieldText.dispose();
fFieldText = null;
layout();
}
fViewer.refresh(fAspectNode);
}
});
}
private void createFieldControls(final TmfEventFieldAspect eventFieldAspect, final AspectItem aspect) {
if (fFieldLabel != null) {
fFieldLabel.dispose();
}
fFieldLabel = new Label(this, SWT.NONE);
fFieldLabel.moveBelow(fAspectCombo);
fFieldLabel.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fFieldLabel.setText(Messages.FilterViewer_FieldLabel);
if (fFieldText != null) {
fFieldText.dispose();
}
fFieldText = new Text(this, SWT.BORDER);
fFieldText.moveBelow(fFieldLabel);
fFieldText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
fFieldText.setToolTipText(Messages.FilterViewer_Subfield_ToolTip);
if (eventFieldAspect.getFieldPath() != null) {
fFieldText.setText(eventFieldAspect.getFieldPath());
}
if (fFieldText.getText().length() == 0) {
fFieldText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fFieldText.setText(Messages.FilterViewer_FieldHint);
}
fFieldText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (fFieldText.getText().length() == 0) {
fFieldText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fFieldText.setText(Messages.FilterViewer_FieldHint);
}
}
@Override
public void focusGained(FocusEvent e) {
if (fFieldText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fFieldText.setText(""); //$NON-NLS-1$
}
fFieldText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
}
});
fFieldText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!fFieldText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
if (fFieldText.getText().isEmpty()) {
fAspectNode.setEventAspect(eventFieldAspect.forField(null));
} else {
fAspectNode.setEventAspect(eventFieldAspect.forField(fFieldText.getText()));
}
aspect.eventAspect = fAspectNode.getEventAspect();
fViewer.refresh(fAspectNode);
}
}
});
}
private List<TraceTypeItem> getTraceTypeList(ITmfFilterTreeNode node) {
ArrayList<TraceTypeItem> traceTypeList = new ArrayList<>();
traceTypeList.add(new TraceTypeItem(Messages.FilterViewer_CommonCategory, TmfFilterAspectNode.BASE_ASPECT_ID));
ITmfFilterTreeNode curNode = node;
while (curNode != null) {
if (curNode instanceof TmfFilterTraceTypeNode) {
TmfFilterTraceTypeNode traceTypeNode = (TmfFilterTraceTypeNode) curNode;
TraceTypeHelper helper = TmfTraceType.getTraceType(traceTypeNode.getTraceTypeId());
if (helper != null) {
traceTypeList.set(0, new TraceTypeItem(helper.getLabel(), helper.getTraceTypeId()));
}
return traceTypeList;
}
curNode = curNode.getParent();
}
for (TraceTypeHelper helper : getTraceTypeMap().values()) {
traceTypeList.add(new TraceTypeItem(helper.getLabel(), helper.getTraceTypeId()));
}
return traceTypeList;
}
private List<AspectItem> getAspectList(String traceTypeId) {
ArrayList<AspectItem> aspectList = new ArrayList<>();
aspectList.add(new AspectItem(Messages.FilterViewer_CommonCategory));
for (ITmfEventAspect<?> aspect : TmfBaseAspects.getBaseAspects()) {
aspectList.add(new AspectItem(aspect.getName(), aspect, TmfFilterAspectNode.BASE_ASPECT_ID));
}
TraceTypeHelper helper = TmfTraceType.getTraceType(traceTypeId);
if (helper != null) {
aspectList.add(new AspectItem("")); //$NON-NLS-1$
aspectList.add(new AspectItem('[' + helper.getLabel() + ']'));
for (ITmfEventAspect<?> aspect : helper.getTrace().getEventAspects()) {
for (AspectItem baseAspect : aspectList) {
if (aspect.equals(baseAspect.eventAspect)) {
aspectList.remove(baseAspect);
break;
}
}
aspectList.add(new AspectItem(aspect.getName(), aspect, helper.getTraceTypeId()));
}
}
return aspectList;
}
}
private class FilterNodeComposite extends FilterBaseNodeComposite {
TmfFilterNode fNode;
Text fNameText;
FilterNodeComposite(Composite parent, TmfFilterNode node) {
super(parent);
fNode = node;
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_NameLabel);
fNameText = new Text(this, SWT.BORDER);
fNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (node.getFilterName() != null && node.getFilterName().length() > 0) {
fNameText.setText(node.getFilterName());
} else {
fNameText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fNameText.setText(Messages.FilterViewer_FilterNameHint);
}
fNameText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (fNode.getFilterName() == null || fNode.getFilterName().length() == 0) {
fNameText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fNameText.setText(Messages.FilterViewer_FilterNameHint);
}
}
@Override
public void focusGained(FocusEvent e) {
if (fNameText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNameText.setText(""); //$NON-NLS-1$
}
fNameText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
}
});
fNameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!fNameText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setFilterName(fNameText.getText());
fViewer.refresh(fNode);
}
}
});
}
}
private class FilterTraceTypeNodeComposite extends FilterBaseNodeComposite {
TmfFilterTraceTypeNode fNode;
Combo fTypeCombo;
Map<String, TraceTypeHelper> fTraceTypeMap;
FilterTraceTypeNodeComposite(Composite parent, TmfFilterTraceTypeNode node) {
super(parent);
fNode = node;
fTraceTypeMap = getTraceTypeMap();
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_TypeLabel);
fTypeCombo = new Combo(this, SWT.DROP_DOWN | SWT.READ_ONLY);
fTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
fTypeCombo.setItems(fTraceTypeMap.keySet().toArray(new String[0]));
if (fNode.getTraceTypeId() != null) {
fTypeCombo.setText(fNode.getName());
}
fTypeCombo.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
TraceTypeHelper helper = checkNotNull(fTraceTypeMap.get(fTypeCombo.getText()));
fNode.setTraceTypeId(helper.getTraceTypeId());
fNode.setTraceClass(helper.getTraceClass());
fNode.setName(fTypeCombo.getText());
fViewer.refresh(fNode);
}
});
}
}
private class FilterAndNodeComposite extends FilterBaseNodeComposite {
TmfFilterAndNode fNode;
Button fNotButton;
FilterAndNodeComposite(Composite parent, TmfFilterAndNode node) {
super(parent);
fNode = node;
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_NotLabel);
fNotButton = new Button(this, SWT.CHECK);
fNotButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNotButton.setSelection(fNode.isNot());
fNotButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setNot(fNotButton.getSelection());
fViewer.refresh(fNode);
}
});
}
}
private class FilterOrNodeComposite extends FilterBaseNodeComposite {
TmfFilterOrNode fNode;
Button fNotButton;
FilterOrNodeComposite(Composite parent, TmfFilterOrNode node) {
super(parent);
fNode = node;
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_NotLabel);
fNotButton = new Button(this, SWT.CHECK);
fNotButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNotButton.setSelection(fNode.isNot());
fNotButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setNot(fNotButton.getSelection());
fViewer.refresh(fNode);
}
});
}
}
private class FilterContainsNodeComposite extends FilterAspectNodeComposite {
TmfFilterContainsNode fNode;
Button fNotButton;
Text fValueText;
Button fIgnoreCaseButton;
FilterContainsNodeComposite(Composite parent, TmfFilterContainsNode node) {
super(parent, node);
fNode = node;
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_NotLabel);
fNotButton = new Button(this, SWT.CHECK);
fNotButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNotButton.setSelection(fNode.isNot());
fNotButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setNot(fNotButton.getSelection());
fViewer.refresh(fNode);
}
});
createAspectControls();
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_ValueLabel);
fValueText = new Text(this, SWT.BORDER);
fValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (node.getValue() != null && node.getValue().length() > 0) {
fValueText.setText(node.getValue());
} else {
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fValueText.setText(Messages.FilterViewer_ValueHint);
}
fValueText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (fNode.getValue() == null || fNode.getValue().length() == 0) {
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fValueText.setText(Messages.FilterViewer_ValueHint);
}
}
@Override
public void focusGained(FocusEvent e) {
if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fValueText.setText(""); //$NON-NLS-1$
}
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
}
});
fValueText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setValue(fValueText.getText());
fViewer.refresh(fNode);
}
}
});
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fIgnoreCaseButton = new Button(this, SWT.CHECK);
fIgnoreCaseButton.setSelection(fNode.isIgnoreCase());
fIgnoreCaseButton.setText(Messages.FilterViewer_IgnoreCaseButtonText);
fIgnoreCaseButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fIgnoreCaseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setIgnoreCase(fIgnoreCaseButton.getSelection());
fViewer.refresh(fNode);
}
});
}
}
private class FilterEqualsNodeComposite extends FilterAspectNodeComposite {
TmfFilterEqualsNode fNode;
Button fNotButton;
Text fValueText;
Button fIgnoreCaseButton;
FilterEqualsNodeComposite(Composite parent, TmfFilterEqualsNode node) {
super(parent, node);
fNode = node;
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_NotLabel);
fNotButton = new Button(this, SWT.CHECK);
fNotButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNotButton.setSelection(fNode.isNot());
fNotButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setNot(fNotButton.getSelection());
fViewer.refresh(fNode);
}
});
createAspectControls();
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_ValueLabel);
fValueText = new Text(this, SWT.BORDER);
fValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (node.getValue() != null && node.getValue().length() > 0) {
fValueText.setText(node.getValue());
} else {
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fValueText.setText(Messages.FilterViewer_ValueHint);
}
fValueText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (fNode.getValue() == null || fNode.getValue().length() == 0) {
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fValueText.setText(Messages.FilterViewer_ValueHint);
}
}
@Override
public void focusGained(FocusEvent e) {
if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fValueText.setText(""); //$NON-NLS-1$
}
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
}
});
fValueText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setValue(fValueText.getText());
fViewer.refresh(fNode);
}
}
});
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fIgnoreCaseButton = new Button(this, SWT.CHECK);
fIgnoreCaseButton.setSelection(fNode.isIgnoreCase());
fIgnoreCaseButton.setText(Messages.FilterViewer_IgnoreCaseButtonText);
fIgnoreCaseButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fIgnoreCaseButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setIgnoreCase(fIgnoreCaseButton.getSelection());
fViewer.refresh(fNode);
}
});
}
}
private class FilterMatchesNodeComposite extends FilterAspectNodeComposite {
TmfFilterMatchesNode fNode;
Button fNotButton;
Text fRegexText;
FilterMatchesNodeComposite(Composite parent, TmfFilterMatchesNode node) {
super(parent, node);
fNode = node;
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_NotLabel);
fNotButton = new Button(this, SWT.CHECK);
fNotButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNotButton.setSelection(fNode.isNot());
fNotButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setNot(fNotButton.getSelection());
fViewer.refresh(fNode);
}
});
createAspectControls();
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_RegexLabel);
fRegexText = new Text(this, SWT.BORDER);
fRegexText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (node.getRegex() != null && node.getRegex().length() > 0) {
fRegexText.setText(node.getRegex());
} else {
fRegexText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fRegexText.setText(Messages.FilterViewer_RegexHint);
}
fRegexText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (fNode.getRegex() == null || fNode.getRegex().length() == 0) {
fRegexText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fRegexText.setText(Messages.FilterViewer_RegexHint);
}
}
@Override
public void focusGained(FocusEvent e) {
if (fRegexText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fRegexText.setText(""); //$NON-NLS-1$
}
fRegexText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
}
});
fRegexText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!fRegexText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setRegex(fRegexText.getText());
fViewer.refresh(fNode);
}
}
});
}
}
private class FilterCompareNodeComposite extends FilterAspectNodeComposite {
TmfFilterCompareNode fNode;
Button fNotButton;
Text fValueText;
Button fLTButton;
Button fEQButton;
Button fGTButton;
Button fNumButton;
Button fAlphaButton;
Button fTimestampButton;
FilterCompareNodeComposite(Composite parent, TmfFilterCompareNode node) {
super(parent, node);
fNode = node;
Label label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_NotLabel);
fNotButton = new Button(this, SWT.CHECK);
fNotButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNotButton.setSelection(fNode.isNot());
fNotButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fNode.setNot(fNotButton.getSelection());
fViewer.refresh(fNode);
}
});
createAspectControls();
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_ResultLabel);
Composite resultGroup = new Composite(this, SWT.NONE);
GridLayout rggl = new GridLayout(3, true);
rggl.marginHeight = 0;
rggl.marginWidth = 0;
resultGroup.setLayout(rggl);
resultGroup.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fLTButton = new Button(resultGroup, SWT.RADIO);
fLTButton.setSelection(fNode.getResult() < 0);
fLTButton.setText("<"); //$NON-NLS-1$
fLTButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fLTButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (fLTButton.getSelection()) {
fNode.setResult(-1);
}
fViewer.refresh(fNode);
}
});
fEQButton = new Button(resultGroup, SWT.RADIO);
fEQButton.setSelection(fNode.getResult() == 0);
fEQButton.setText("="); //$NON-NLS-1$
fEQButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fEQButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (fEQButton.getSelection()) {
fNode.setResult(0);
}
fViewer.refresh(fNode);
}
});
fGTButton = new Button(resultGroup, SWT.RADIO);
fGTButton.setSelection(fNode.getResult() > 0);
fGTButton.setText(">"); //$NON-NLS-1$
fGTButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fGTButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (fGTButton.getSelection()) {
fNode.setResult(1);
}
fViewer.refresh(fNode);
}
});
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_TypeLabel);
Composite typeGroup = new Composite(this, SWT.NONE);
GridLayout tggl = new GridLayout(3, false);
tggl.marginHeight = 0;
tggl.marginWidth = 0;
typeGroup.setLayout(tggl);
typeGroup.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNumButton = new Button(typeGroup, SWT.RADIO);
fNumButton.setSelection(fNode.getType() == Type.NUM);
fNumButton.setText(Messages.FilterViewer_NumButtonText);
fNumButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fNumButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (fNumButton.getSelection()) {
fNode.setType(Type.NUM);
}
fViewer.refresh(fNode);
}
});
fAlphaButton = new Button(typeGroup, SWT.RADIO);
fAlphaButton.setSelection(fNode.getType() == Type.ALPHA);
fAlphaButton.setText(Messages.FilterViewer_AlphaButtonText);
fAlphaButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fAlphaButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (fAlphaButton.getSelection()) {
fNode.setType(Type.ALPHA);
}
fViewer.refresh(fNode);
}
});
fTimestampButton = new Button(typeGroup, SWT.RADIO);
fTimestampButton.setSelection(fNode.getType() == Type.TIMESTAMP);
fTimestampButton.setText(Messages.FilterViewer_TimestampButtonText);
fTimestampButton.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
fTimestampButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (fTimestampButton.getSelection()) {
fNode.setType(Type.TIMESTAMP);
}
fViewer.refresh(fNode);
}
});
label = new Label(this, SWT.NONE);
label.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
label.setText(Messages.FilterViewer_ValueLabel);
fValueText = new Text(this, SWT.BORDER);
fValueText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (node.getValue() != null && node.getValue().length() > 0) {
fValueText.setText(node.getValue());
} else {
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fValueText.setText(Messages.FilterViewer_ValueHint);
}
fValueText.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
if (fNode.getValue() == null || fNode.getValue().length() == 0) {
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
fValueText.setText(Messages.FilterViewer_ValueHint);
}
}
@Override
public void focusGained(FocusEvent e) {
if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fValueText.setText(""); //$NON-NLS-1$
}
fValueText.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
}
});
fValueText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
if (!fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setValue(fValueText.getText());
fViewer.refresh(fNode);
}
}
});
}
}
}