diff options
author | Uwe Stieber | 2012-05-02 11:20:56 +0000 |
---|---|---|
committer | Uwe Stieber | 2012-05-02 11:37:35 +0000 |
commit | 82dba9bf83929c40e1a11b3453fdb630c248a630 (patch) | |
tree | 1bf4a875214f5575c759028c5c4b14291d6cc221 /target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui | |
parent | 86e0ea52f2f9bf83b690371b8b68f64594b38208 (diff) | |
download | org.eclipse.tcf-82dba9bf83929c40e1a11b3453fdb630c248a630.tar.gz org.eclipse.tcf-82dba9bf83929c40e1a11b3453fdb630c248a630.tar.xz org.eclipse.tcf-82dba9bf83929c40e1a11b3453fdb630c248a630.zip |
Target Explorer: Rework delete handler contributions
Diffstat (limited to 'target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui')
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.properties | 3 | ||||
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml | 70 | ||||
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/FSTreeNodeAdapterFactory.java | 7 | ||||
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/handlers/DeleteHandler.java (renamed from target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/DeleteHandlerDelegate.java) | 118 | ||||
-rw-r--r-- | target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/testers/TreeNodePropertyTester.java | 34 |
5 files changed, 187 insertions, 45 deletions
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.properties b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.properties index 7ea30d154..98877889f 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.properties +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.properties @@ -62,6 +62,9 @@ command.commit.name = Commit File command.merge.name = Merge File command.revert.name = Revert File +command.delete.label=Delete +command.delete.description=Delete the selected node + decorator.modified.label = Modified Cache decorator.outdated.label = Outdated Cache decorator.conflict.label = Conflicting Cache diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml index 6346cb378..82e3fa2e1 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/plugin.xml @@ -362,10 +362,9 @@ <iterate ifEmpty="false" operator="and"> - <test - property="org.eclipse.tcf.te.ui.views.isDeletableElement" - value="true"> - </test> + <instanceof + value="org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode"> + </instanceof> </iterate> </with> </visibleWhen> @@ -549,6 +548,28 @@ </visibleWhen> </command> </menuContribution> + <menuContribution locationURI="popup:org.eclipse.tcf.te.ui.views.View#Popup?after=group.delete"> + <command + commandId="org.eclipse.ui.edit.delete" + disabledIcon="platform:/plugin/org.eclipse.ui/icons/full/dtool16/delete.gif" + helpContextId="org.eclipse.tcf.te.ui.command_Delete" + icon="platform:/plugin/org.eclipse.ui/icons/full/etool16/delete.gif" + id="org.eclipse.tcf.te.ui.commands.delete" + label="%command.delete.label" + mnemonic="D" + style="push" + tooltip="%command.delete.description"> + <visibleWhen checkEnabled="false"> + <with variable="selection"> + <count value="+"/> + <iterate operator="and" ifEmpty="false"> + <instanceof value="org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode"/> + </iterate> + </with> + </visibleWhen> + </command> + </menuContribution> + <menuContribution locationURI="popup:org.eclipse.tcf.te.ui.views.View#Popup?after=group.properties"> <command commandId="org.eclipse.ui.file.properties" @@ -936,6 +957,13 @@ properties="isEditorActivation" type="org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent"> </propertyTester> + <propertyTester + id="org.eclipse.tcf.te.tcf.filesystem.propertytester.treenode" + class="org.eclipse.tcf.te.tcf.filesystem.ui.internal.testers.TreeNodePropertyTester" + namespace="org.eclipse.tcf.te.tcf.filesystem" + properties="canDelete" + type="org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode"> + </propertyTester> </extension> <!-- Command contributions --> @@ -1565,6 +1593,37 @@ class="org.eclipse.tcf.te.tcf.filesystem.ui.internal.handlers.RefreshViewerHandler" commandId="org.eclipse.tcf.te.tcf.filesystem.commands.refreshViewer"> </handler> + + <handler + commandId="org.eclipse.ui.edit.delete" + class="org.eclipse.tcf.te.tcf.ui.handler.DeleteHandler"> + <activeWhen> + <and> + <with variable="activePartId"> + <or> + <equals value="org.eclipse.tcf.te.ui.views.View"/> + <equals value="org.eclipse.tcf.te.ui.views.Editor"/> + </or> + </with> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <instanceof value="org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode"/> + </iterate> + </with> + </and> + </activeWhen> + <enabledWhen> + <with variable="selection"> + <iterate operator="and" ifEmpty="false"> + <test + property="org.eclipse.tcf.te.tcf.filesystem.canDelete" + value="true"> + </test> + </iterate> + </with> + </enabledWhen> + </handler> + </extension> <!-- Decorator contributions --> @@ -1667,9 +1726,6 @@ type="org.eclipse.tcf.te.ui.views.interfaces.handler.IRefreshHandlerDelegate"> </adapter> <adapter - type="org.eclipse.tcf.te.ui.views.interfaces.handler.IDeleteHandlerDelegate"> - </adapter> - <adapter type="org.eclipse.ui.IPersistableElement"> </adapter> </factory> diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/FSTreeNodeAdapterFactory.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/FSTreeNodeAdapterFactory.java index 7b53d0681..c1fe7d5b4 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/FSTreeNodeAdapterFactory.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/FSTreeNodeAdapterFactory.java @@ -19,7 +19,6 @@ import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode;
import org.eclipse.tcf.te.tcf.filesystem.ui.activator.UIPlugin;
import org.eclipse.tcf.te.tcf.filesystem.ui.internal.columns.FSTreeElementLabelProvider;
-import org.eclipse.tcf.te.ui.views.interfaces.handler.IDeleteHandlerDelegate;
import org.eclipse.tcf.te.ui.views.interfaces.handler.IRefreshHandlerDelegate;
import org.eclipse.ui.IActionFilter;
import org.eclipse.ui.IPersistableElement;
@@ -29,7 +28,6 @@ import org.eclipse.ui.IPersistableElement; */
public class FSTreeNodeAdapterFactory implements IAdapterFactory {
private static ILabelProvider nodeLabelProvider = new FSTreeElementLabelProvider();
- private static IDeleteHandlerDelegate deleteDelegate = new DeleteHandlerDelegate();
private static IRefreshHandlerDelegate refreshDelegate = new RefreshHandlerDelegate();
// The fFilters map caching fFilters for FS nodes.
private Map<FSTreeNode, NodeStateFilter> filters;
@@ -62,9 +60,6 @@ public class FSTreeNodeAdapterFactory implements IAdapterFactory { else if(adapterType == IRefreshHandlerDelegate.class) {
return refreshDelegate;
}
- else if(adapterType == IDeleteHandlerDelegate.class) {
- return deleteDelegate;
- }
else if(adapterType == IPersistableElement.class && UIPlugin.isExpandedPersisted()) {
return new PersistableNode(node);
}
@@ -77,6 +72,6 @@ public class FSTreeNodeAdapterFactory implements IAdapterFactory { */
@Override
public Class[] getAdapterList() {
- return new Class[] { IActionFilter.class, ILabelProvider.class, IRefreshHandlerDelegate.class, IDeleteHandlerDelegate.class, IPersistableElement.class };
+ return new Class[] { IActionFilter.class, ILabelProvider.class, IRefreshHandlerDelegate.class, IPersistableElement.class };
}
}
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/DeleteHandlerDelegate.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/handlers/DeleteHandler.java index 4f0ef3aa3..da7622570 100644 --- a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/adapters/DeleteHandlerDelegate.java +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/handlers/DeleteHandler.java @@ -7,20 +7,29 @@ * Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
-package org.eclipse.tcf.te.tcf.filesystem.ui.internal.adapters;
+package org.eclipse.tcf.te.tcf.filesystem.ui.internal.handlers;
+import java.util.Iterator;
import java.util.List;
import java.util.UUID;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
+import org.eclipse.tcf.te.runtime.callback.Callback;
import org.eclipse.tcf.te.runtime.interfaces.callback.ICallback;
import org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer;
+import org.eclipse.tcf.te.runtime.properties.PropertiesContainer;
import org.eclipse.tcf.te.tcf.filesystem.core.interfaces.IConfirmCallback;
import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.IOpExecutor;
import org.eclipse.tcf.te.tcf.filesystem.core.internal.operations.OpDelete;
@@ -29,61 +38,106 @@ import org.eclipse.tcf.te.tcf.filesystem.ui.activator.UIPlugin; import org.eclipse.tcf.te.tcf.filesystem.ui.internal.ImageConsts;
import org.eclipse.tcf.te.tcf.filesystem.ui.internal.operations.UiExecutor;
import org.eclipse.tcf.te.tcf.filesystem.ui.nls.Messages;
-import org.eclipse.tcf.te.ui.views.interfaces.handler.IDeleteHandlerDelegate;
+import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.navigator.CommonViewer;
/**
- * File System tree node delete handler delegate implementation.
+ * Delete handler implementation.
*/
-public class DeleteHandlerDelegate implements IDeleteHandlerDelegate {
+public class DeleteHandler extends AbstractHandler {
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
+ */
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ // Get the current selection
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
+ // Determine the active part
+ final IWorkbenchPart part = HandlerUtil.getActivePart(event);
+ // Create the delete state properties container
+ final IPropertiesContainer state = new PropertiesContainer();
+ // Store the selection to the state as reference
+ state.setProperty("selection", selection); //$NON-NLS-1$
+
+ // Loop over the selection and delete the elements providing an IDeleteHandlerDelegate
+ Iterator<?> iterator = ((IStructuredSelection)selection).iterator();
+ while (iterator.hasNext()) {
+ final Object element = iterator.next();
+
+ // Delete the element if there is a valid delegate
+ if (canDelete(element)) {
+ // Determine the elements parent element
+ Object parentElement = null;
+ CommonViewer viewer = (CommonViewer)part.getAdapter(CommonViewer.class);
+ if (viewer != null && viewer.getContentProvider() instanceof ITreeContentProvider) {
+ ITreeContentProvider cp = (ITreeContentProvider)viewer.getContentProvider();
+ parentElement = cp.getParent(element);
+ }
+ final Object finParentElement = parentElement;
+
+ // Delete the element and refresh the parent element
+ delete(element, state, new Callback() {
+ @Override
+ protected void internalDone(Object caller, IStatus status) {
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ CommonViewer viewer = (CommonViewer)part.getAdapter(CommonViewer.class);
+ if (viewer != null) {
+ if (finParentElement != null) {
+ viewer.refresh(finParentElement, true);
+ } else {
+ viewer.refresh(true);
+ }
+ }
+ }
+ });
+ }
+ });
+ }
+ }
+ }
+
+ return null;
+ }
+
+ // ***** DeleteHandlerDelegate content. Clean up. *****
// The key to access the selection in the state.
private static final String KEY_SELECTION = "selection"; //$NON-NLS-1$
// The key to access the processed state in the state.
private static final String KEY_PROCESSED = "processed"; //$NON-NLS-1$
// The deletion confirmation callback
- private IConfirmCallback confirmCallback;
+ private IConfirmCallback confirmCallback = new DeletionConfirmCallback();
// The confirmation call for read only files.
- private IConfirmCallback readonlyCallback;
-
- /**
- * Constructor
- */
- public DeleteHandlerDelegate() {
- confirmCallback = new DeletionConfirmCallback();
- readonlyCallback = new ReadOnlyConfirmCallback();
- }
-
+ private IConfirmCallback readonlyCallback = new ReadOnlyConfirmCallback();
+
/**
* Set the confirmation callback
- *
+ *
* @param confirmCallback The confirmation callback
*/
public void setConfirmCallback(IConfirmCallback confirmCallback) {
this.confirmCallback = confirmCallback;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.tcf.te.ui.views.interfaces.handler.IDeleteHandlerDelegate#canDelete(java.lang.Object)
- */
- @Override
+ @Deprecated
public boolean canDelete(Object element) {
if (element instanceof FSTreeNode) {
FSTreeNode node = (FSTreeNode) element;
if (!node.isSystemRoot() && !node.isRoot()) {
- return node.isWindowsNode() && !node.isReadOnly()
+ return node.isWindowsNode() && !node.isReadOnly()
|| !node.isWindowsNode() && node.isWritable();
}
}
return false;
}
- /*
- * (non-Javadoc)
- * @see org.eclipse.tcf.te.ui.views.interfaces.handler.IDeleteHandlerDelegate#delete(java.lang.Object, org.eclipse.tcf.te.runtime.interfaces.properties.IPropertiesContainer, org.eclipse.tcf.te.runtime.interfaces.callback.ICallback)
- */
- @Override
+ @Deprecated
public void delete(Object element, IPropertiesContainer state, ICallback callback) {
Assert.isNotNull(element);
Assert.isNotNull(state);
@@ -143,9 +197,9 @@ public class DeleteHandlerDelegate implements IDeleteHandlerDelegate { });
return results[0];
}
-
+
}
-
+
static class DeletionConfirmCallback implements IConfirmCallback {
/*
* (non-Javadoc)
@@ -155,7 +209,7 @@ public class DeleteHandlerDelegate implements IDeleteHandlerDelegate { public boolean requires(Object object) {
return true;
}
-
+
/*
* (non-Javadoc)
* @see org.eclipse.tcf.te.tcf.filesystem.interfaces.IConfirmCallback#confirms(java.lang.Object)
@@ -163,7 +217,7 @@ public class DeleteHandlerDelegate implements IDeleteHandlerDelegate { @Override
public int confirms(Object object) {
IStructuredSelection selection = (IStructuredSelection) object;
- List<FSTreeNode> nodes = selection.toList();
+ List<FSTreeNode> nodes = selection.toList();
String question;
if (nodes.size() == 1) {
FSTreeNode node = nodes.get(0);
@@ -173,7 +227,7 @@ public class DeleteHandlerDelegate implements IDeleteHandlerDelegate { question = NLS.bind(Messages.DeleteFilesHandler_DeleteMultipleFilesConfirmation, Integer.valueOf(nodes.size()));
}
Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
- if (MessageDialog.openQuestion(parent, Messages.DeleteFilesHandler_ConfirmDialogTitle, question)) {
+ if (MessageDialog.openQuestion(parent, Messages.DeleteFilesHandler_ConfirmDialogTitle, question)) {
return IConfirmCallback.YES;
}
return IConfirmCallback.NO;
diff --git a/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/testers/TreeNodePropertyTester.java b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/testers/TreeNodePropertyTester.java new file mode 100644 index 000000000..4e43d4b75 --- /dev/null +++ b/target_explorer/plugins/org.eclipse.tcf.te.tcf.filesystem.ui/src/org/eclipse/tcf/te/tcf/filesystem/ui/internal/testers/TreeNodePropertyTester.java @@ -0,0 +1,34 @@ +/*******************************************************************************
+ * Copyright (c) 2012 Wind River Systems, Inc. and others. 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:
+ * Wind River Systems - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.tcf.te.tcf.filesystem.ui.internal.testers;
+
+import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.tcf.te.tcf.filesystem.core.model.FSTreeNode;
+import org.eclipse.tcf.te.tcf.filesystem.ui.internal.handlers.DeleteHandler;
+
+/**
+ * Tree node property tester.
+ */
+public class TreeNodePropertyTester extends PropertyTester {
+ private final DeleteHandler deleteHandler = new DeleteHandler();
+
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
+ */
+ @Override
+ public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
+ if (receiver instanceof FSTreeNode && "canDelete".equals(property)) { //$NON-NLS-1$
+ return deleteHandler.canDelete(receiver);
+ }
+ return false;
+ }
+
+}
|