/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.ui.dnd; import java.io.File; import java.util.ArrayList; import java.util.List; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.commands.Command; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.FileTransfer; import org.whole.lang.ui.editparts.IEntityPart; import org.whole.lang.ui.editparts.IGraphicalEntityPart; import org.whole.lang.ui.requests.CommandFactory; /** * @author Enrico Persiani */ public abstract class AbstractFileTransferDragSourceListener extends AbstractSelectionTransferDragSourceListener { protected boolean scheduleDelete; protected File[] files; public AbstractFileTransferDragSourceListener(EditPartViewer viewer) { super(viewer, FileTransfer.getInstance()); } public void dragSetData(DragSourceEvent event) { if (scheduleDelete && files != null) { for (File file : files) try { file.delete(); } catch (Exception e) { } files = null; scheduleDelete = false; } try { if (files == null) files = createFiles(); String[] paths = new String[files.length]; for (int i=0; i<files.length; i++) paths[i] = files[i].getAbsolutePath(); event.data = paths; } catch (Exception e) { event.data = ""; } } protected File[] createFiles() throws Exception { List<EditPart> selectedEditParts = getSelectedEditParts(); List<File> files = new ArrayList<File>(); for (EditPart editPart: selectedEditParts) { IEntityPart entityPart = (IEntityPart) editPart; files.add(createFile(entityPart)); } return files.toArray(new File[0]); } protected abstract File createFile(IEntityPart entityPart) throws Exception; @SuppressWarnings("unchecked") public void dragStart(DragSourceEvent event) { List<EditPart> selectedEditParts = getViewer().getSelectedEditParts(); if (selectedEditParts.isEmpty() || !(selectedEditParts.get(0) instanceof IGraphicalEntityPart)) event.doit = false; storeSelection(selectedEditParts); } @Override public void dragFinished(DragSourceEvent event) { if (event.detail == DND.DROP_MOVE) { Command deleteCmd = CommandFactory.createDeleteCommand(getSelectedEditParts()); getViewer().getEditDomain().getCommandStack().execute(deleteCmd); } restoreSelection(); // workaround for wrong dnd package explorer behavior scheduleDelete = true; // ensure file deletion on exit if (files != null) for (File file : files) file.deleteOnExit(); } }