/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.ui.pages.editor.dnd;
import java.io.File;
import java.util.Properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Path;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.dnd.TemplateTransfer;
import org.eclipse.jface.util.TransferDropTargetListener;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.ui.dnd.ModelTransfer;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.seam.pages.xml.model.SeamPagesXModelUtil;
import org.jboss.tools.seam.ui.pages.editor.PagesEditor;
import org.jboss.tools.seam.ui.pages.editor.edit.PagesDiagramEditPart;
public class XModelTransferDropTargetListener implements TransferDropTargetListener {
PagesEditor editor;
boolean baseDropAccept = false;
public XModelTransferDropTargetListener(PagesEditor editor) {
this.editor = editor;
}
public void dragOperationChanged(DropTargetEvent event) {
}
public void dragEnter(DropTargetEvent event) {
if (TemplateTransfer.getInstance().isSupportedType(
event.currentDataType)) {
baseDropAccept = true;
return;
} else if (FileTransfer.getInstance().isSupportedType(
event.currentDataType)) {
String[] os = (String[]) FileTransfer.getInstance().nativeToJava(
event.currentDataType);
if (os == null || os.length != 1 || !new File(os[0]).isFile())
return;
IFile f = ResourcesPlugin.getWorkspace().getRoot()
.getFileForLocation(new Path(os[0]));
if (f == null || !f.exists())
return;
if (!DndHelper.drag(EclipseResourceUtil.getObjectByResource(f)))
return;
}
if (DndHelper.isDropEnabled(editor.getPagesModel().getData())) {
baseDropAccept = true;
} else {
baseDropAccept = false;
}
}
public void dragOver(DropTargetEvent event) {
if (!baseDropAccept)
event.detail = DND.DROP_NONE;
else
event.detail = DND.DROP_COPY;
}
public void dragLeave(DropTargetEvent event) {
}
public void dropAccept(DropTargetEvent event) {
}
public void drop(DropTargetEvent event) {
org.eclipse.swt.graphics.Point parentPoint = editor
.getScrollingGraphicalViewer().getControl().toControl(event.x,
event.y);
Point point = new Point(parentPoint.x, parentPoint.y);
PagesDiagramEditPart part = (PagesDiagramEditPart) editor.getScrollingGraphicalViewer()
.getRootEditPart().getChildren().get(0);
part.getFigure()
.translateToRelative(point);
if (TemplateTransfer.getInstance().isSupportedType(
event.currentDataType)) {
Properties properties = new Properties();
if (point != null) {
properties.put("mouse.x", "" + point.x);
properties.put("mouse.y", "" + point.y);
}
properties.put("diagramEditPart", part);
SeamPagesXModelUtil.addPage((XModelObject) editor.getPagesModel().getData(), properties);
return;
}
DndHelper.drop(editor.getPagesModel().getData(), point);
}
public Transfer getTransfer() {
return ModelTransfer.getInstance();
}
public boolean isEnabled(DropTargetEvent event) {
return true;
}
}