| /******************************************************************************* |
| * Copyright (c) 2006, 2012 Oracle 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: |
| * Oracle Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.bpel.ui.dnd; |
| |
| import java.util.List; |
| |
| import org.eclipse.bpel.ui.BPELEditor; |
| import org.eclipse.bpel.ui.util.TransferBuffer; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPartViewer; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.dnd.AbstractTransferDropTargetListener; |
| import org.eclipse.gef.requests.CreateRequest; |
| import org.eclipse.gef.requests.CreationFactory; |
| import org.eclipse.swt.dnd.DND; |
| import org.eclipse.swt.dnd.DropTargetEvent; |
| import org.eclipse.swt.dnd.TextTransfer; |
| |
| /** |
| * |
| * A drop handler that is used to transfer text representations of BPEL into the graphical |
| * editor. |
| * |
| * @author Michal Chmielewski (michal.chmielewski@oracle.com) |
| * @date Aug 20, 2007 |
| * |
| */ |
| public class BPELTextTransferDropTargetListener extends AbstractTransferDropTargetListener { |
| |
| @SuppressWarnings("nls") |
| |
| /** The reader which we use as a conversion */ |
| org.eclipse.bpel.model.resource.BPELReader fReader = null; |
| |
| /** The create request that we generate from the content of the clipboard. */ |
| Request fTargetRequest = null; |
| |
| /** The target resource */ |
| protected Resource fTargetResource; |
| |
| protected BPELEditor fEditor; |
| |
| |
| /** The from source factory */ |
| class FromSourceFactory implements CreationFactory { |
| |
| EObject fNewObject = null; |
| |
| FromSourceFactory ( EObject newObject) { |
| this.fNewObject = newObject; |
| } |
| |
| |
| /** |
| * @see org.eclipse.gef.requests.CreationFactory#getNewObject() |
| */ |
| @Override |
| public Object getNewObject() { |
| return this.fNewObject; |
| } |
| |
| /** |
| * @see org.eclipse.gef.requests.CreationFactory#getObjectType() |
| */ |
| |
| @Override |
| public Object getObjectType() { |
| EObject eObj = (EObject) getNewObject(); |
| if (eObj != null) { |
| return eObj.eClass(); |
| } |
| return null; |
| } |
| } |
| |
| |
| @Override |
| protected void unload() { |
| super.unload(); |
| this.fTargetRequest = null; |
| } |
| |
| |
| /** |
| * Constructs a listener on the specified viewer. |
| * @param viewer the EditPartViewer |
| * @param editor |
| */ |
| |
| public BPELTextTransferDropTargetListener (EditPartViewer viewer, BPELEditor editor ) { |
| super(viewer, TextTransfer.getInstance() ); |
| |
| this.fReader = new org.eclipse.bpel.model.resource.BPELReader(); |
| this.fEditor = editor; |
| } |
| |
| /** |
| * We create the target request once from the content of the clipboard. |
| * We attempt to parse the clipboard and then push the result in the creation |
| * factory so that the usual editor mechanics apply. |
| * |
| * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest() |
| */ |
| @SuppressWarnings("nls") |
| @Override |
| protected Request createTargetRequest() { |
| |
| CreateRequest request = new CreateRequest(); |
| String data = (String) TextTransfer.getInstance().nativeToJava(getCurrentEvent().currentDataType); |
| |
| try { |
| List<EObject> list = this.fReader.fromXML(TransferBuffer.adjustXMLSource(data), "Drag-Session", this.fEditor.getResource() ); //$NON-NLS-1$ |
| if (list.size() > 0) { |
| request.setFactory(new FromSourceFactory(list.get(0)) ); |
| return request; |
| } |
| } catch (Throwable t) { |
| t.printStackTrace(); |
| } |
| |
| // Mickael Istria: |
| // In case nothing to DND or error occurred |
| // Command cannot be executed because not CreationFactory was provided. Then dropListener.isEnabled will return false. |
| // Vincent Zurczak: |
| // Yes, but, in fact, the command may not be created (illegal argument exception because the factory is null) |
| // Fixed below by surrounding the isEnabled by a try/catch |
| setEnablementDeterminedByCommand( true ); |
| return request; |
| } |
| |
| |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener |
| * #isEnabled(org.eclipse.swt.dnd.DropTargetEvent) |
| */ |
| @Override |
| public boolean isEnabled( DropTargetEvent event ) { |
| boolean result = false; |
| try { |
| result = super.isEnabled( event ); |
| } catch( Exception e ) { |
| // nothing |
| } |
| |
| return result; |
| } |
| |
| |
| /** |
| * A helper method that casts the target Request to a CreateRequest. |
| * @return CreateRequest |
| */ |
| protected final CreateRequest getCreateRequest() { |
| return (CreateRequest) getTargetRequest(); |
| } |
| |
| |
| /** |
| * |
| * @see AbstractTransferDropTargetListener#handleDragOperationChanged() |
| */ |
| @Override |
| protected void handleDragOperationChanged() { |
| if (getCreateRequest().getNewObject() == null ) { |
| getCurrentEvent().detail = DND.DROP_NONE; |
| } else { |
| getCurrentEvent().detail = DND.DROP_COPY; |
| } |
| super.handleDragOperationChanged(); |
| } |
| |
| /** |
| * The purpose of a template is to be copied. Therefore, the Drop operation is set to |
| * <code>DND.DROP_COPY</code> by default. |
| * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDragOver() |
| */ |
| @Override |
| protected void handleDragOver() { |
| if ( getCreateRequest().getNewObject() == null ) { |
| getCurrentEvent().detail = DND.DROP_NONE; |
| getCurrentEvent().detail = DND.FEEDBACK_NONE; |
| } else { |
| getCurrentEvent().detail = DND.DROP_COPY; |
| getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND; |
| } |
| super.handleDragOver(); |
| } |
| |
| /** |
| * Overridden to select the created object. |
| * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDrop() |
| */ |
| @Override |
| protected void handleDrop() { |
| CreateRequest cr = getCreateRequest(); |
| super.handleDrop(); |
| |
| selectAddedObject( cr ); |
| } |
| |
| private void selectAddedObject ( CreateRequest cr ) { |
| Object model = cr.getNewObject(); |
| if (model == null) { |
| return ; |
| } |
| |
| EditPartViewer viewer = getViewer(); |
| viewer.getControl().forceFocus(); |
| Object editpart = viewer.getEditPartRegistry().get(model); |
| if (editpart instanceof EditPart) { |
| //Force a layout first. |
| getViewer().flush(); |
| viewer.select((EditPart)editpart); |
| } |
| } |
| |
| |
| |
| /** |
| * |
| */ |
| @Override |
| protected Request getTargetRequest() { |
| if (this.fTargetRequest == null) { |
| this.fTargetRequest = createTargetRequest(); |
| } |
| return this.fTargetRequest; |
| } |
| |
| |
| /** |
| * Assumes that the target request is a {@link CreateRequest}. |
| */ |
| @Override |
| protected void updateTargetRequest() { |
| CreateRequest request = getCreateRequest(); |
| request.setLocation(getDropLocation()); |
| } |
| |
| } |