blob: 758afe91ea84dc127cb18166851a5815f77b9a7b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.gef.examples.logicdesigner.actions;
import java.util.List;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.gef.ui.actions.Clipboard;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.gef.examples.logicdesigner.LogicMessages;
/**
* If the current object on the clipboard is a valid template, this action will
* paste the template to the viewer.
*
* @author Eric Bordeau, Pratik Shah
* @see org.eclipse.gef.ui.actions.CopyTemplateAction
*/
public abstract class PasteTemplateAction extends SelectionAction {
/**
* Constructor for PasteTemplateAction.
*
* @param editor
*/
public PasteTemplateAction(IWorkbenchPart editor) {
super(editor);
}
/**
* @return <code>true</code> if {@link #createPasteCommand()} returns an
* executable command
* @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled()
*/
protected boolean calculateEnabled() {
// TODO Workaround for Bug 82622/39369. Should be removed when 39369 is
// fixed.
return true;
}
/**
* Creates and returns a command (which may be <code>null</code>) to create
* a new EditPart based on the template on the clipboard.
*
* @return the paste command
*/
protected Command createPasteCommand() {
Command result = null;
List selection = getSelectedObjects();
if (selection != null && selection.size() == 1) {
Object obj = selection.get(0);
if (obj instanceof GraphicalEditPart) {
GraphicalEditPart gep = (GraphicalEditPart) obj;
Object template = getClipboardContents();
if (template != null) {
CreationFactory factory = getFactory(template);
if (factory != null) {
CreateRequest request = new CreateRequest();
request.setFactory(factory);
request.setLocation(getPasteLocation(gep));
result = gep.getCommand(request);
}
}
}
}
return result;
}
/**
* Returns the template on the clipboard, if there is one. Note that the
* template on the clipboard might be from a palette from another type of
* editor.
*
* @return the clipboard's contents
*/
protected Object getClipboardContents() {
return Clipboard.getDefault().getContents();
}
/**
* Returns the appropriate Factory object to be used for the specified
* template. This Factory is used on the CreateRequest that is sent to the
* target EditPart. Note that the given template might be from a palette for
* a different GEF-based editor. In that case, this method can return
* <code>null</code>.
*
* @param template
* the template Object; it will never be <code>null</code>
* @return a Factory
*/
protected CreationFactory getFactory(Object template) {
if (template instanceof CreationFactory)
return (CreationFactory) template;
return null;
}
/**
* @param container
* the parent of the new part that is being pasted
* @return the location at which
*/
protected abstract Point getPasteLocation(GraphicalEditPart container);
/**
* @see org.eclipse.gef.ui.actions.EditorPartAction#init()
*/
protected void init() {
setId(ActionFactory.PASTE.getId());
setText(LogicMessages.PasteAction_ActionLabelText);
}
/**
* Executes the command returned by {@link #createPasteCommand()}.
*/
public void run() {
execute(createPasteCommand());
}
}