blob: 6e5df51b1cf840226525a39fe09f9245e0d93bb6 [file] [log] [blame]
/**
* Copyright (c) 2016 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Grégoire Dupé (Mia-Software) - Bug 506318 - [New Browser] Drag and drop support
*/
package org.eclipse.modisco.infra.browser.editor.ui.internal.editor;
import java.util.Collection;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.modisco.facet.custom.ui.CustomizedContentProviderUtils;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.widgets.TreeItem;
public class TreeEditorDropListener implements DropTargetListener {
private final EditingDomain editingDomain;
public TreeEditorDropListener(final EditingDomain editingDomain) {
this.editingDomain = editingDomain;
}
public void dragEnter(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void dragLeave(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void dragOperationChanged(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void dragOver(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
public void drop(final DropTargetEvent event) {
Object value = null;
if (event.data instanceof IStructuredSelection) {
final IStructuredSelection structSelection = (IStructuredSelection) event.data;
if (structSelection.size() == 1) {
value = structSelection.getFirstElement();
} else {
value = structSelection.toList();
}
}
final TreeItem item = (TreeItem) event.item;
final Object data = item.getData();
final EStructuralFeature structFeature =
CustomizedContentProviderUtils.getEStructuralFeature(data);
if (structFeature != null) {
final EObject eObject = CustomizedContentProviderUtils.getParentEObject(data);
eObjDrop(eObject, structFeature, value);
}
}
private void eObjDrop(final EObject eObject,
final EStructuralFeature feature, final Object value) {
final Resource eResource = eObject.eResource();
final ResourceSet resourceSet = eResource.getResourceSet();
Command command;
if (feature.isMany()) {
if (value instanceof Collection<?>) {
final Collection<EObject> collection = EmfUtils
.getCollectionFrom(resourceSet, (Collection<?>) value);
command = AddCommand.create(this.editingDomain, eObject,
feature, collection);
} else if (value instanceof EObject) {
final EObject eObjectVal = EmfUtils.getEObjectFrom(resourceSet,
(EObject) value);
command = AddCommand.create(this.editingDomain, eObject,
feature, eObjectVal);
} else if (value == null) {
throw new IllegalStateException(
"Unexpected value : null found while expecting an EObject or a collection of EObjects." //$NON-NLS-1$
);
} else {
final String message = String.format(
"Unexpected value type: '%s' found while expecting an EObject or a collection of EObjects.", //$NON-NLS-1$
value.getClass());
throw new IllegalStateException(message);
}
} else {
final EObject eObjectVal = EmfUtils.getEObjectFrom(resourceSet,
(EObject) value);
command = SetCommand.create(this.editingDomain, eObject, feature,
eObjectVal);
}
this.editingDomain.getCommandStack().execute(command);
}
public void dropAccept(final DropTargetEvent event) {
// TODO Auto-generated method stub
}
}