*/
public void setValue(String value) {
this.fValue = value;
- fValueUpperCase = value.toUpperCase();
+ if (value != null) {
+ fValueUpperCase = value.toUpperCase();
+ }
}
/**
*/
public void setRegex(String regex) {
this.fRegex = regex;
- try {
- this.fPattern = Pattern.compile(regex, Pattern.DOTALL);
- } catch (PatternSyntaxException e) {
- this.fPattern = null;
+ if (regex != null) {
+ try {
+ this.fPattern = Pattern.compile(regex, Pattern.DOTALL);
+ } catch (PatternSyntaxException e) {
+ this.fPattern = null;
+ }
}
}
</visibleWhen>
</command>
</menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.linuxtools.tmf.ui.views.filter?after=add_delete">
+ <command
+ commandId="org.eclipse.ui.edit.delete"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.linuxtools.tmf.ui.views.filter?after=edit">
+ <command
+ commandId="org.eclipse.ui.edit.cut"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.linuxtools.tmf.ui.views.filter?after=edit">
+ <command
+ commandId="org.eclipse.ui.edit.copy"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.linuxtools.tmf.ui.views.filter?after=edit">
+ <command
+ commandId="org.eclipse.ui.edit.paste"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.linuxtools.tmf.ui.views.filter?after=delete">
+ <command
+ commandId="org.eclipse.ui.edit.delete"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.linuxtools.tmf.ui.views.filter?after=edit">
+ <command
+ commandId="org.eclipse.ui.edit.cut"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.linuxtools.tmf.ui.views.filter?after=edit">
+ <command
+ commandId="org.eclipse.ui.edit.copy"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="popup:org.eclipse.linuxtools.tmf.ui.views.filter?after=edit">
+ <command
+ commandId="org.eclipse.ui.edit.paste"
+ style="push">
+ </command>
+ </menuContribution>
</extension>
<extension
point="org.eclipse.ui.commands">
class="org.eclipse.linuxtools.internal.tmf.ui.commands.ExportToTextCommandHandler"
commandId="org.eclipse.linuxtools.tmf.ui.exportToText">
</handler>
+ <handler
+ class="org.eclipse.linuxtools.tmf.ui.views.filter.CopyHandler"
+ commandId="org.eclipse.ui.edit.copy">
+ <activeWhen>
+ <with
+ variable="activePart">
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.views.filter.FilterView">
+ </instanceof>
+ </with>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.linuxtools.tmf.ui.views.filter.PasteHandler"
+ commandId="org.eclipse.ui.edit.paste">
+ <activeWhen>
+ <with
+ variable="activePart">
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.views.filter.FilterView">
+ </instanceof>
+ </with>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.linuxtools.tmf.ui.views.filter.CutHandler"
+ commandId="org.eclipse.ui.edit.cut">
+ <activeWhen>
+ <with
+ variable="activePart">
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.views.filter.FilterView">
+ </instanceof>
+ </with>
+ </activeWhen>
+ </handler>
+ <handler
+ class="org.eclipse.linuxtools.tmf.ui.views.filter.DeleteHandler"
+ commandId="org.eclipse.ui.edit.delete">
+ <activeWhen>
+ <with
+ variable="activePart">
+ <instanceof
+ value="org.eclipse.linuxtools.tmf.ui.views.filter.FilterView">
+ </instanceof>
+ </with>
+ </activeWhen>
+ </handler>
</extension>
<extension point="org.eclipse.ui.bindings">
<key
public static String FilterViewer_EmptyTreeHintText;
public static String FilterViewer_CommonCategory;
public static String FilterViewer_AlphaButtonText;
- public static String FilterViewer_DeleteActionText;
public static String FilterViewer_FieldLabel;
public static String FilterViewer_FilterNameHint;
public static String FilterViewer_IgnoreCaseButtonText;
FilterViewer_EmptyTreeHintText=<Right-click to add filter node>
FilterViewer_CommonCategory=[common]
FilterViewer_AlphaButtonText=Alpha
-FilterViewer_DeleteActionText=Delete
FilterViewer_FieldLabel=field:
FilterViewer_FilterNameHint=type filter name
FilterViewer_IgnoreCaseButtonText=ignore case
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Kalray
+ *
+ * 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:
+ * Xavier Raynaud - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views.filter;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Handler for copy command in filter view
+ * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
+ * @since 2.2
+ */
+public class CopyHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return null;
+ }
+ IWorkbenchPage page = window.getActivePage();
+ FilterView part = (FilterView) page.getActivePart();
+ ISelection selection = getSelection(part);
+
+ LocalSelectionTransfer.getTransfer().setSelection(selection);
+ LocalSelectionTransfer.getTransfer().setSelectionSetTime(System.currentTimeMillis());
+ return null;
+ }
+
+ /**
+ * Retrieve the current selection
+ *
+ * @param tcv
+ * the FilterView
+ * @return the current selection in the FilterView
+ */
+ protected ISelection getSelection(FilterView tcv) {
+ return tcv.getViewSite().getSelectionProvider().getSelection();
+ }
+
+ @Override
+ public boolean isEnabled() {
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return false;
+ }
+
+ // Get the selection
+ IWorkbenchPage page = window.getActivePage();
+ IWorkbenchPart part = page.getActivePart();
+ if (part instanceof FilterView) {
+ FilterView tcv = (FilterView) part;
+ ISelection selection = tcv.getSite().getSelectionProvider().getSelection();
+ if (!selection.isEmpty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Kalray
+ *
+ * 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:
+ * Xavier Raynaud - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views.filter;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.linuxtools.tmf.core.filter.model.ITmfFilterTreeNode;
+
+/**
+ * Handler for cut command in filter view
+ * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
+ * @since 2.2
+ */
+public class CutHandler extends CopyHandler {
+
+ @Override
+ protected ISelection getSelection(FilterView tcv) {
+ ISelection sel = super.getSelection(tcv);
+ if (sel instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) sel;
+ Object o = selection.getFirstElement();
+ if (o instanceof ITmfFilterTreeNode) {
+ ITmfFilterTreeNode node = (ITmfFilterTreeNode) o;
+ node = node.remove();
+ tcv.refresh();
+ return new StructuredSelection(node);
+ }
+ }
+ return sel;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Kalray
+ *
+ * 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:
+ * Xavier Raynaud - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views.filter;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.linuxtools.tmf.core.filter.model.ITmfFilterTreeNode;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Handler for delete command in filter view
+ * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
+ * @since 2.2
+ */
+public class DeleteHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return null;
+ }
+ IWorkbenchPage page = window.getActivePage();
+ FilterView part = (FilterView) page.getActivePart();
+ ISelection sel = part.getViewSite().getSelectionProvider().getSelection();
+ if (sel instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) sel;
+ Object o = selection.getFirstElement();
+ if (o instanceof ITmfFilterTreeNode) {
+ ITmfFilterTreeNode node = (ITmfFilterTreeNode) o;
+ node = node.remove();
+ part.refresh();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return false;
+ }
+
+ // Get the selection
+ IWorkbenchPage page = window.getActivePage();
+ IWorkbenchPart part = page.getActivePart();
+ if (part instanceof FilterView) {
+ FilterView tcv = (FilterView) part;
+ ISelection selection = tcv.getSite().getSelectionProvider().getSelection();
+ if (!selection.isEmpty()) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Kalray
+ *
+ * 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:
+ * Xavier Raynaud - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views.filter;
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.linuxtools.tmf.core.filter.model.ITmfFilterTreeNode;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+
+/**
+ * DragSourceListener for filter view
+ * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
+ */
+class FilterDragSourceAdapter extends DragSourceAdapter {
+
+ private FilterViewer fViewer;
+
+ /**
+ * Constructor
+ *
+ * @param viewer
+ * the content of the FilterView
+ */
+ public FilterDragSourceAdapter(FilterViewer viewer) {
+ super();
+ this.fViewer = viewer;
+ }
+
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ ISelection s = fViewer.getTreeViewer().getSelection();
+ LocalSelectionTransfer.getTransfer().setSelection(s);
+ LocalSelectionTransfer.getTransfer().setSelectionSetTime(event.time & 0xFFFFFFFFL);
+ }
+
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+ event.data = LocalSelectionTransfer.getTransfer().getSelection();
+ }
+
+ @Override
+ public void dragFinished(DragSourceEvent event) {
+ if (event.detail == DND.DROP_MOVE) {
+ IStructuredSelection selection = (IStructuredSelection) LocalSelectionTransfer.getTransfer().getSelection();
+ for (Object data : selection.toList()) {
+ if (data instanceof ITmfFilterTreeNode) {
+ ITmfFilterTreeNode e = (ITmfFilterTreeNode) data;
+ e.remove();
+ fViewer.refresh();
+ }
+ }
+ }
+ LocalSelectionTransfer.getTransfer().setSelection(null);
+ LocalSelectionTransfer.getTransfer().setSelectionSetTime(0);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Kalray
+ *
+ * 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:
+ * Xavier Raynaud - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views.filter;
+
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.linuxtools.tmf.core.filter.model.ITmfFilterTreeNode;
+import org.eclipse.linuxtools.tmf.core.filter.model.TmfFilterNode;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * DropTargetListener for filter view
+ * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
+ */
+class FilterDropTargetAdapter extends DropTargetAdapter {
+
+ private FilterViewer fViewer;
+
+ /**
+ * Constructor
+ * @param viewer the content of the FilterView
+ */
+ public FilterDropTargetAdapter(FilterViewer viewer) {
+ super();
+ this.fViewer = viewer;
+ }
+
+ /**
+ * Returns <code>true</code> if droppedNode is an ancestor of node.
+ *
+ * @param droppedNode
+ * the ITmfFilterTreeNode to drop or paste
+ * @param node
+ * the ITmfFilterTreeNode receiving a new child
+ * @return <code>true</code> if droppedNode is and ancestor of node,
+ * <code>false</code> otherwise.
+ */
+ private static boolean isAncestor(ITmfFilterTreeNode droppedNode, ITmfFilterTreeNode node) {
+ ITmfFilterTreeNode tmp = node;
+
+ while (tmp != null) {
+ ITmfFilterTreeNode n = tmp.getParent();
+ if (n == droppedNode) {
+ return true;
+ }
+ tmp = n;
+ }
+ return false;
+ }
+
+ @Override
+ public void dropAccept(DropTargetEvent event) {
+ ITmfFilterTreeNode treeNodeToDrop = null;
+ if (LocalSelectionTransfer.getTransfer().isSupportedType(event.currentDataType)) {
+ treeNodeToDrop = FilterEditUtils.getTransferredTreeNode();
+ }
+ if (treeNodeToDrop == null) {
+ // should never occur
+ event.detail = DND.DROP_NONE;
+ return;
+ }
+ if (event.item instanceof TreeItem) {
+ Object data = event.item.getData();
+ if (data instanceof ITmfFilterTreeNode) {
+ ITmfFilterTreeNode node = (ITmfFilterTreeNode) data;
+ if (node.getValidChildren().contains(treeNodeToDrop.getNodeName())) {
+ if (isAncestor(treeNodeToDrop, node) && event.detail != DND.DROP_COPY) {
+ // do nothing in this case
+ event.detail = DND.DROP_NONE;
+ }
+ return;
+ }
+ }
+ } else { // accept only TmfFilterNode
+ if (!TmfFilterNode.NODE_NAME.equals(treeNodeToDrop.getNodeName())) {
+ event.detail = DND.DROP_NONE;
+ }
+ return;
+ }
+ event.detail = DND.DROP_NONE;
+ return;
+ }
+
+ @Override
+ public void drop(DropTargetEvent event) {
+ ITmfFilterTreeNode treeNodeToDrop = FilterEditUtils.getTransferredTreeNode();
+ if (event.item instanceof TreeItem) {
+ Object data = event.item.getData();
+ if (data instanceof ITmfFilterTreeNode) {
+ ITmfFilterTreeNode node = (ITmfFilterTreeNode) data;
+ if (node.getValidChildren().contains(treeNodeToDrop.getNodeName())) {
+ treeNodeToDrop = treeNodeToDrop.clone();
+ node.addChild(treeNodeToDrop);
+ fViewer.refresh();
+ fViewer.setSelection(treeNodeToDrop, true);
+ return;
+ }
+ }
+ } else { // accept only TmfFilterNode
+ if (TmfFilterNode.NODE_NAME.equals(treeNodeToDrop.getNodeName())) {
+ ITmfFilterTreeNode root = fViewer.getInput();
+ treeNodeToDrop = treeNodeToDrop.clone();
+ root.addChild(treeNodeToDrop);
+ fViewer.refresh();
+ fViewer.setSelection(treeNodeToDrop, true);
+ return;
+ }
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Kalray
+ *
+ * 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:
+ * Xavier Raynaud - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views.filter;
+
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.linuxtools.tmf.core.filter.model.ITmfFilterTreeNode;
+
+/**
+ * Utilities for cut/copy/paste/dnd in filter view
+ * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
+ */
+class FilterEditUtils {
+
+ /**
+ * Gets the ITmfFilterTreeNode in LocalSelectionTransfer, if any
+ * @return a ITmfFilterTreeNode or <code>null</code>
+ */
+ public static ITmfFilterTreeNode getTransferredTreeNode() {
+ ITmfFilterTreeNode treeNodeToDrop = null;
+ ISelection sel = LocalSelectionTransfer.getTransfer().getSelection();
+ if (sel instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) sel;
+ for (Object data : selection.toList()) {
+ if (!(data instanceof ITmfFilterTreeNode)) {
+ return null;
+ } else if (treeNodeToDrop != null) {
+ // should never occur, since tree has SWT.SINGLE style
+ return null;
+ } else {
+ treeNodeToDrop = (ITmfFilterTreeNode) data;
+ }
+ }
+ }
+ return treeNodeToDrop;
+ }
+}
*
* Contributors:
* Yuriy Vashchuk - Initial API and implementation
+ * Xavier Raynaud - add cut/copy/paste/dnd support
* based on Francois Chouinard ProjectView code.
*/
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IActionBars;
import org.xml.sax.SAXException;
private static final Image SAVE_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/save_button.gif"); //$NON-NLS-1$
private static final Image ADD_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/add_button.gif"); //$NON-NLS-1$
- private static final Image DELETE_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/delete_button.gif"); //$NON-NLS-1$
private static final Image IMPORT_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/import_button.gif"); //$NON-NLS-1$
private static final Image EXPORT_IMAGE = Activator.getDefault().getImageFromPath("/icons/elcl16/export_button.gif"); //$NON-NLS-1$
private SaveAction fSaveAction;
private AddAction fAddAction;
- private DeleteAction fDeleteAction;
private ExportAction fExportAction;
private ImportAction fImportAction;
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (!(event.getSelection().isEmpty()) && event.getSelection() instanceof IStructuredSelection) {
- fDeleteAction.setEnabled(true);
fExportAction.setEnabled(true);
} else {
- fDeleteAction.setEnabled(false);
fExportAction.setEnabled(false);
}
}
});
+ this.getSite().setSelectionProvider(fViewer.getTreeViewer());
+
+ // Adds root context menu
+ MenuManager menuManager = new MenuManager();
+ menuManager.setRemoveAllWhenShown(true);
+ menuManager.addMenuListener(new IMenuListener() {
+ @Override
+ public void menuAboutToShow(IMenuManager manager) {
+ fViewer.fillContextMenu(manager);
+ }
+ });
+ Menu contextMenu = menuManager.createContextMenu(fViewer.getTreeViewer().getTree());
+ fViewer.getTreeViewer().getTree().setMenu(contextMenu);
+ this.getSite().registerContextMenu(menuManager, fViewer.getTreeViewer());
+ }
+
+ /**
+ * @return the ITmfFilterTreeNode currently selected
+ */
+ ITmfFilterTreeNode getSelection() {
+ return fViewer.getSelection();
}
@Override
fAddAction.setImageDescriptor(ImageDescriptor.createFromImage(ADD_IMAGE));
fAddAction.setToolTipText(Messages.FilterView_AddActionToolTipText);
- fDeleteAction = new DeleteAction();
- fDeleteAction.setImageDescriptor(ImageDescriptor.createFromImage(DELETE_IMAGE));
- fDeleteAction.setToolTipText(Messages.FilterView_DeleteActionToolTipText);
- fDeleteAction.setEnabled(false);
-
fExportAction = new ExportAction();
fExportAction.setImageDescriptor(ImageDescriptor.createFromImage(EXPORT_IMAGE));
fExportAction.setToolTipText(Messages.FilterView_ExportActionToolTipText);
fImportAction.setToolTipText(Messages.FilterView_ImportActionToolTipText);
manager.add(fSaveAction);
- manager.add(new Separator());
+ manager.add(new Separator("add_delete")); //$NON-NLS-1$
manager.add(fAddAction);
- manager.add(fDeleteAction);
+ manager.add(new Separator("edit")); //$NON-NLS-1$
manager.add(new Separator());
manager.add(fExportAction);
manager.add(fImportAction);
}
}
- private class DeleteAction extends Action {
- @Override
- public void run() {
- ITmfFilterTreeNode node = fViewer.getSelection();
- if (node != null) {
- node.remove();
- }
- refresh();
- }
- }
-
private class ExportAction extends Action {
@Override
public void run() {
*
* Contributors:
* Patrick Tasse - Initial API and implementation
+ * Xavier Raynaud - add cut/copy/paste/dnd support
*******************************************************************************/
package org.eclipse.linuxtools.tmf.ui.views.filter;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
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.linuxtools.tmf.ui.project.model.TmfTraceType;
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.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;
private static final String CUSTOM_XML_CATEGORY = "Custom XML"; //$NON-NLS-1$
private TreeViewer fViewer;
+
private Composite fComposite;
public FilterViewer(Composite parent, int style) {
gl.marginWidth = 0;
fComposite.setLayout(gl);
- createContextMenu();
-
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
}
}
});
- }
-
- /**
- * Create the context menu for the tree viewer
- */
- private void createContextMenu() {
- // Adds root context menu
- MenuManager menuManager = new MenuManager();
- menuManager.setRemoveAllWhenShown(true);
- menuManager.addMenuListener(new IMenuListener() {
- @Override
- public void menuAboutToShow(IMenuManager manager) {
- fillContextMenu(manager);
- }
- });
- // Context
- Menu contextMenu = menuManager.createContextMenu(fViewer.getTree());
-
- // Publish it
- fViewer.getTree().setMenu(contextMenu);
+ 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));
}
/**
}
}
- final ITmfFilterTreeNode selectedNode = filterTreeNode;
-
- if (selectedNode != null) {
-
- fillContextMenuForNode(selectedNode, manager);
-
- if (selectedNode.getValidChildren().size() > 0) {
- manager.add(new Separator());
- }
-
- Action deleteAction = new Action() {
- @Override
- public void run() {
- selectedNode.remove();
- fViewer.refresh();
- }
- };
- deleteAction.setText(Messages.FilterViewer_DeleteActionText);
- manager.add(deleteAction);
-
- manager.add(new Separator());
+ if (filterTreeNode != null) {
+ fillContextMenuForNode(filterTreeNode, manager);
}
+ manager.add(new Separator("delete")); //$NON-NLS-1$
+ manager.add(new Separator("edit")); //$NON-NLS-1$
- if (fViewer.getInput() instanceof TmfFilterRootNode || selectedNode == null) {
- final ITmfFilterTreeNode root = (ITmfFilterTreeNode) fViewer.getInput();
-
+ if (fViewer.getInput() instanceof TmfFilterRootNode || filterTreeNode == null) {
+ manager.add(new Separator());
+ ITmfFilterTreeNode root = (ITmfFilterTreeNode) fViewer.getInput();
fillContextMenuForNode(root, manager);
}
}
fViewer.removeSelectionChangedListener(listener);
}
+ /**
+ * Gets the TreeViewer displaying filters
+ * @return a {@link TreeViewer}
+ */
+ TreeViewer getTreeViewer() {
+ return fViewer;
+ }
+
private class FilterBaseNodeComposite extends Composite {
FilterBaseNodeComposite(Composite parent) {
fNameText.setText(Messages.FilterViewer_FilterNameHint);
}
}
+
@Override
public void focusGained(FocusEvent e) {
if (fNameText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
- if (! fNameText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
+ if (!fNameText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setFilterName(fNameText.getText());
fViewer.refresh(fNode);
}
fTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
fTypeCombo.setItems(fEventsTypeMap.keySet().toArray(new String[0]));
if (fNode.getEventType() != null) {
- for (Entry <String, Object> eventTypeEntry : fEventsTypeMap.entrySet()) {
+ for (Entry<String, Object> eventTypeEntry : fEventsTypeMap.entrySet()) {
Object value = eventTypeEntry.getValue();
if (value instanceof IConfigurationElement) {
IConfigurationElement ce = (IConfigurationElement) value;
fTypeCombo.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
- for (Entry <String, Object> eventTypeEntry : fEventsTypeMap.entrySet()) {
+ for (Entry<String, Object> eventTypeEntry : fEventsTypeMap.entrySet()) {
if (eventTypeEntry.getKey().equals(fTypeCombo.getText())) {
Object value = eventTypeEntry.getValue();
if (value instanceof IConfigurationElement) {
fValueText.setText(Messages.FilterViewer_ValueHint);
}
}
+
@Override
public void focusGained(FocusEvent e) {
if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fValueText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
- if (! fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
+ if (!fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setValue(fValueText.getText());
fViewer.refresh(fNode);
}
fValueText.setText(Messages.FilterViewer_ValueHint);
}
}
+
@Override
public void focusGained(FocusEvent e) {
if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fValueText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
- if (! fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
+ if (!fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setValue(fValueText.getText());
fViewer.refresh(fNode);
}
fRegexText.setText(Messages.FilterViewer_RegexHint);
}
}
+
@Override
public void focusGained(FocusEvent e) {
if (fRegexText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fRegexText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
- if (! fRegexText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
+ if (!fRegexText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setRegex(fRegexText.getText());
fViewer.refresh(fNode);
}
fValueText.setText(Messages.FilterViewer_ValueHint);
}
}
+
@Override
public void focusGained(FocusEvent e) {
if (fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fValueText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
- if (! fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
+ if (!fValueText.getForeground().equals(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY))) {
fNode.setValue(fValueText.getText());
fViewer.refresh(fNode);
}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Kalray
+ *
+ * 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:
+ * Xavier Raynaud - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.linuxtools.tmf.ui.views.filter;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.linuxtools.tmf.core.filter.model.ITmfFilterTreeNode;
+import org.eclipse.linuxtools.tmf.core.filter.model.TmfFilterNode;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Handler for paste command in filter view
+ * @author Xavier Raynaud <xavier.raynaud@kalray.eu>
+ * @since 2.2
+ */
+public class PasteHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return null;
+ }
+
+ // Get the selection
+ IWorkbenchPage page = window.getActivePage();
+ IWorkbenchPart part = page.getActivePart();
+ if (!(part instanceof FilterView)) {
+ return null;
+ }
+ FilterView v = (FilterView) part;
+
+ ITmfFilterTreeNode objectToPaste = FilterEditUtils.getTransferredTreeNode();
+ objectToPaste = objectToPaste.clone();
+ ITmfFilterTreeNode sel = v.getSelection();
+ if (sel == null || TmfFilterNode.NODE_NAME.equals(objectToPaste.getNodeName())) {
+ sel = v.getFilterRoot();
+ }
+
+ sel.addChild(objectToPaste);
+ v.refresh();
+ v.setSelection(objectToPaste);
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ // Check if we are closing down
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ return false;
+ }
+
+ // Get the selection
+ IWorkbenchPage page = window.getActivePage();
+ IWorkbenchPart part = page.getActivePart();
+ if (!(part instanceof FilterView)) {
+ return false;
+ }
+ FilterView v = (FilterView) part;
+ ITmfFilterTreeNode sel = v.getSelection();
+ if (sel == null) {
+ sel = v.getFilterRoot();
+ }
+ ITmfFilterTreeNode objectToPaste = FilterEditUtils.getTransferredTreeNode();
+ if (objectToPaste != null &&
+ (sel.getValidChildren().contains(objectToPaste.getNodeName())
+ || TmfFilterNode.NODE_NAME.equals(objectToPaste.getNodeName()))) {
+ return true;
+ }
+ return false;
+ }
+
+}