blob: 3949f1db33c89c71346d49423ae987b449bf5638 [file] [log] [blame]
/**
* Copyright (c) 2000, 2007 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*/
package org.eclipse.egf.common.ui.actions;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IAdapterManager;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.egf.common.ui.EGFCommonUIPlugin;
import org.eclipse.egf.common.ui.l10n.EGFCommonUIMessages;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ResourceTransfer;
public abstract class CopyQualifiedNameAction extends Action implements IObjectActionDelegate {
protected IWorkbenchPart _part;
public CopyQualifiedNameAction(String text, ImageDescriptor image) {
super(text, image);
}
public abstract void selectionChanged(IAction action, ISelection selection);
protected EObject getSelection(IStructuredSelection selection) {
Object selectedObject = selection.getFirstElement();
if (selectedObject != null) {
if (selectedObject instanceof EObject) {
return (EObject) selectedObject;
}
if (selectedObject instanceof IAdaptable) {
Object adaptedObj = ((IAdaptable) selectedObject).getAdapter(EObject.class);
if (adaptedObj != null && adaptedObj instanceof EObject) {
return (EObject) adaptedObj;
}
}
IAdapterManager adapterManager = Platform.getAdapterManager();
if (adapterManager.hasAdapter(selectedObject, EObject.class.getName())) {
Object adaptedObj = adapterManager.loadAdapter(selectedObject, EObject.class.getName());
if (adaptedObj instanceof EObject) {
return (EObject) adaptedObj;
}
}
}
return null;
}
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
_part = targetPart;
}
protected abstract URI getURI();
public void run(IAction action) {
URI uri = getURI();
if (uri == null || _part == null) {
return;
}
try {
Object[] data = null;
Transfer[] dataTypes = null;
// Build IResource if any
//
IResource resource = null;
if (uri.isPlatformResource()) {
String path = uri.toPlatformString(true);
resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(path));
}
if (resource != null) {
IPath location = resource.getLocation();
if (location != null) {
data = new Object[] { uri.toString(), resource, new String[] { location.toOSString() } };
dataTypes = new Transfer[] { TextTransfer.getInstance(), ResourceTransfer.getInstance(), FileTransfer.getInstance() };
} else {
data = new Object[] { uri.toString(), resource };
dataTypes = new Transfer[] { TextTransfer.getInstance(), ResourceTransfer.getInstance() };
}
} else {
data = new Object[] { uri.toString() };
dataTypes = new Transfer[] { TextTransfer.getInstance() };
}
Clipboard clipboard = new Clipboard(_part.getSite().getShell().getDisplay());
try {
clipboard.setContents(data, dataTypes);
} catch (SWTError e) {
if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) {
throw e;
}
if (MessageDialog.openQuestion(_part.getSite().getShell(), EGFCommonUIMessages.CopyQualifiedNameAction_ErrorTitle, EGFCommonUIMessages.CopyQualifiedNameAction_ErrorDescription)) {
clipboard.setContents(data, dataTypes);
}
} finally {
clipboard.dispose();
}
} catch (Exception e) {
EGFCommonUIPlugin.getDefault().logError(new String("CopyQualifiedNameAction.run(..) _"), e); //$NON-NLS-1$
}
}
}