/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is modified by Dimitry Polivaev in 2008.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.features.url.mindmapmode;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.net.URI;
import java.net.URL;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.Compat;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.clipboard.MindMapNodesSelection;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.mode.ModeController;
import org.freeplane.features.mode.mindmapmode.MModeController;
public class FileOpener implements DropTargetListener {
/**
*
*/
// final private ModeController modeController;
/**
* @param modeController
*/
public FileOpener() {
// this.modeController = modeController;
}
public void dragEnter(final DropTargetDragEvent dtde) {
if (!isDragAcceptable(dtde)) {
dtde.rejectDrag();
return;
}
}
public void dragExit(final DropTargetEvent e) {
}
public void dragOver(final DropTargetDragEvent e) {
}
public void dragScroll(final DropTargetDragEvent e) {
}
static final private Pattern filePattern = Pattern.compile("file://[^\\s" + File.pathSeparatorChar + "]+");
@SuppressWarnings("unchecked")
public void drop(final DropTargetDropEvent dtde) {
if (!isDropAcceptable(dtde)) {
dtde.rejectDrop();
return;
}
dtde.acceptDrop(DnDConstants.ACTION_COPY);
try {
final Transferable transferable = dtde.getTransferable();
Controller.getCurrentController().selectMode(MModeController.MODENAME);
ModeController modeController = Controller.getCurrentModeController();
if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
final List<File> list = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
for (final File file : list) {
String fileName = file.getName();
if (file.isDirectory() || !isMindMapUrl(fileName)) {
continue;
}
modeController.getMapController().newMap(Compat.fileToUrl(file));
}
}
if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
final String urls = (String) transferable.getTransferData(DataFlavor.stringFlavor);
if(urls.startsWith("file:")){
final Matcher matcher = filePattern.matcher(urls);
while (matcher.find()) {
final String urlString = matcher.group();
if (!isMindMapUrl(urlString)) {
continue;
}
try {
final URI uri = new URI(urlString);
final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPath());
final File file = Compat.urlToFile(url);
if(! file.exists() || file.isDirectory())
continue;
modeController.getMapController().newMap(url);
}
catch (final Exception e) {
e.printStackTrace();
continue;
}
}
}
else if(urls.startsWith("http://") && isMindMapUrl(urls)){
final URL url = new URL(urls);
modeController.getMapController().newMap(url);
}
}
}
catch (final Exception e) {
UITools.errorMessage(TextUtils.format("dropped_file_error", e.getMessage()));
dtde.dropComplete(false);
return;
}
dtde.dropComplete(true);
}
private boolean isMindMapUrl(final String urlString) {
return urlString.substring(urlString.length() - 3).equalsIgnoreCase(".mm");
}
public void dropActionChanged(final DropTargetDragEvent e) {
}
private boolean isDragAcceptable(final DropTargetDragEvent event) {
return event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| !event.isDataFlavorSupported(MindMapNodesSelection.mindMapNodesFlavor)
&& event.isDataFlavorSupported(DataFlavor.stringFlavor);
}
private boolean isDropAcceptable(final DropTargetDropEvent event) {
return event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
|| event.isDataFlavorSupported(DataFlavor.stringFlavor);
}
}