Skip to content

Content of file ModelExplorerDropAdapter.java

/*******************************************************************************
 * Copyright (c) 2011-2012 EclipseSource Muenchen GmbH and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Eugen Neufeld - initial API and implementation
 *
 *******************************************************************************/

package org.eclipse.emf.ecp.ui.common.dnd;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecp.core.ECPProject;
import org.eclipse.emf.ecp.core.util.ECPUtil;
import org.eclipse.emf.edit.command.ChangeCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;

/**
 * @author Eugen Neufeld
 */
public class ModelExplorerDropAdapter extends ECPDropAdapter {

	/**
	 * Default constructor.
	 *
	 * @param viewer the viewer, the drop adapter is responsible for
	 */
	public ModelExplorerDropAdapter(Viewer viewer) {
		super(null, viewer);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
	 */
	@Override
	public void dragEnter(DropTargetEvent event) {
		if (domain == null) {
			return;
		}
		super.dragEnter(event);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
	 */
	@Override
	public void dragOver(DropTargetEvent event) {
		final Object target = extractDropTarget(event.item);
		if (target == null) {
			return;
		}
		source = getDragSource(event);

		Object sourceObject = null;

		if (source == null) {
			final ISelection selection = viewer.getSelection();
			if (selection instanceof IStructuredSelection) {
				sourceObject = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
			}

		} else {
			sourceObject = source.iterator().next();
		}

		final EditingDomain sourceProjectDomain = getProjectDomain(sourceObject);
		final EditingDomain targetProjectDomain = getProjectDomain(target);
		EditingDomain newDomain = null;

		if (target instanceof ECPProject) {
			newDomain = ((ECPProject) target).getEditingDomain();
		} else {
			newDomain = AdapterFactoryEditingDomain.getEditingDomainFor(target);
		}

		if (domain == null || newDomain != null && sourceProjectDomain == targetProjectDomain) {
			domain = newDomain;
		}

		if (target instanceof ECPProject) {

			final ECPProject project = (ECPProject) target;
			if (sourceObject instanceof ECPProject) {
				event.detail = DND.DROP_COPY;
				event.feedback = DND.FEEDBACK_INSERT_AFTER | DND.FEEDBACK_INSERT_BEFORE | DND.FEEDBACK_SCROLL;
			}
			// TODO delegate to provider?
			else if (project.getContents().contains(sourceObject)) {
				if (originalOperation != DND.DROP_COPY) {
					event.detail = DND.DROP_NONE;
				} else {
					event.detail = DND.DROP_COPY;
				}
			} else {
				event.feedback = DND.FEEDBACK_SELECT | getAutoFeedback();
				if (sourceProjectDomain == targetProjectDomain) {
					event.detail = DND.DROP_MOVE;
				} else {
					event.detail = DND.DROP_COPY;
				}

			}
		} else {
			if (sourceProjectDomain != targetProjectDomain) {
				event.detail = DND.DROP_NONE;

			} else {
				super.dragOver(event);
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#drop(org.eclipse.swt.dnd.DropTargetEvent)
	 */
	@Override
	public void drop(final DropTargetEvent event) {
		final Object target = extractDropTarget(event.item);
		source = getDragSource(event);
		final Object sourceObject = source.iterator().next();

		if (target instanceof ECPProject) {
			final ECPProject project = (ECPProject) target;

			if (sourceObject instanceof EObject) {
				project.getEditingDomain().getCommandStack().execute(new ChangeCommand((EObject) sourceObject) {

					@Override
					protected void doExecute() {
						if (event.detail == DND.DROP_MOVE) {
							project.getContents().add(sourceObject);
						} else if (event.detail == DND.DROP_COPY) {
							project.getContents().add(EcoreUtil.copy((EObject) sourceObject));
						}
					}
				});

			} else if (sourceObject instanceof ECPProject) {
				final ECPProject oldProject = (ECPProject) sourceObject;
				ECPUtil.getECPProjectManager().createProject(oldProject, oldProject.getName() + "(Copy)");
} } else if (event.detail != DND.DROP_NONE) { super.drop(event); } } /* * (non-Javadoc) * @see org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter#dropAccept(org.eclipse.swt.dnd.DropTargetEvent) */ @Override public void dropAccept(DropTargetEvent event) { final Object target = extractDropTarget(event.item); if (target instanceof ECPProject) { event.feedback = DND.FEEDBACK_SELECT | getAutoFeedback(); } else { super.dropAccept(event); } } }