/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.ie.view.palette;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.SystemFlavorMap;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.Reader;
import java.net.URI;
import java.util.Iterator;
import java.util.List;
import org.openflexo.foundation.FlexoObserver;
import org.openflexo.foundation.ie.action.ImportImage;
import org.openflexo.foundation.ie.palette.FlexoIEPalette;
import org.openflexo.foundation.ie.palette.FlexoIEPalette.FlexoIEPaletteWidget;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.view.controller.FlexoController;
public class IEImagePalettePanel extends IEPalettePanel implements FlexoObserver {
private static String ZERO_CHAR_STRING = "" + (char) 0;
public IEImagePalettePanel(IEPalette palette, FlexoIEPalette<? extends FlexoIEPaletteWidget> model, String keyName) {
super(palette, model, keyName);
new DropTarget(this, DnDConstants.ACTION_COPY, new DropTargetListener() {
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
}
@Override
public void drop(DropTargetDropEvent dtde) {
try {
Transferable tr = dtde.getTransferable();
dtde.acceptDrop(DnDConstants.ACTION_COPY);
StringBuilder sb = new StringBuilder();
if (tr.isDataFlavorSupported(java.awt.datatransfer.DataFlavor.javaFileListFlavor)) {
List<File> fileList = (List<File>) tr.getTransferData(java.awt.datatransfer.DataFlavor.javaFileListFlavor);
Iterator<File> iterator = fileList.iterator();
while (iterator.hasNext()) {
File file = iterator.next();
importImageFile(sb, file);
}
} else {
DataFlavor[] flavors = tr.getTransferDataFlavors();
boolean handled = false;
for (int i = 0; i < flavors.length; i++) {
if (flavors[i].isRepresentationClassReader()) {
Reader reader = flavors[i].getReaderForText(tr);
BufferedReader br = new BufferedReader(reader);
java.lang.String line = null;
while ((line = br.readLine()) != null) {
try {
// kde seems to append a 0 char to the end of the reader
if (ZERO_CHAR_STRING.equals(line)) {
continue;
}
File file = new File(new URI(line));
importImageFile(sb, file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
dtde.getDropTargetContext().dropComplete(true);
if (sb.length() > 0) {
FlexoController.notify(sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
}
@Override
public void dragExit(DropTargetEvent dte) {
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
for (DataFlavor flavor : dtde.getCurrentDataFlavors()) {
if (flavor.isFlavorJavaFileListType() || flavor.isRepresentationClassReader()) {
dtde.acceptDrag(DnDConstants.ACTION_COPY);
return;
}
}
dtde.rejectDrag();
}
}, true, SystemFlavorMap.getDefaultFlavorMap());
}
private void importImageFile(StringBuilder error, File file) {
if (ImportImage.isValidImageFile(file)) {
ImportImage importImage = ImportImage.actionType.makeNewAction(getModel().getProject(), null, _palette.getController()
.getEditor());
importImage.setFileToImport(file);
importImage.doAction();
} else {
error.append(FlexoLocalization.localizedForKey("file") + " " + file.getName() + " "
+ FlexoLocalization.localizedForKey("does_not_seem_to_be_an_image"));
}
}
}