package org.xmind.ui.internal.dnd;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.ImageTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.xmind.core.Core;
import org.xmind.core.IFileEntry;
import org.xmind.core.IImage;
import org.xmind.core.IManifest;
import org.xmind.core.ITopic;
import org.xmind.core.IWorkbook;
import org.xmind.core.util.HyperlinkUtils;
import org.xmind.gef.IViewer;
import org.xmind.gef.dnd.IDndClient;
import org.xmind.ui.internal.AttachmentImageDescriptor;
public class ImageDndClient implements IDndClient {
private ImageTransfer transfer = ImageTransfer.getInstance();
public Object getData(Transfer transfer, TransferData data) {
if (transfer == this.transfer) {
return this.transfer.nativeToJava(data);
}
return null;
}
public Transfer getTransfer() {
return transfer;
}
public Object toTransferData(Object[] viewerElements, IViewer viewer) {
if (viewerElements != null && viewerElements.length > 0) {
for (Object element : viewerElements) {
if (element instanceof IImage) {
IImage image = (IImage) element;
String source = image.getSource();
if (source != null) {
if (HyperlinkUtils.isAttachmentURL(source)) {
String path = HyperlinkUtils
.toAttachmentPath(source);
ImageDescriptor imageDescriptor = AttachmentImageDescriptor
.createFromEntryPath(image
.getOwnedWorkbook(), path);
ImageData imageData = imageDescriptor
.getImageData();
return imageData;
}
}
}
}
}
return null;
}
public Object[] toViewerElements(Object transferData, IViewer viewer,
Object target) {
if (transferData instanceof ImageData) {
IWorkbook workbook = (IWorkbook) viewer.getAdapter(IWorkbook.class);
if (workbook != null) {
ImageData imageData = (ImageData) transferData;
ImageLoader saver = new ImageLoader();
saver.data = new ImageData[] { imageData };
ByteArrayOutputStream os = new ByteArrayOutputStream();
saver.save(os, SWT.IMAGE_PNG);
IManifest manifest = workbook.getManifest();
try {
IFileEntry entry = manifest.createAttachmentFromStream(
new ByteArrayInputStream(os.toByteArray()),
"temp.png", Core.MEDIA_TYPE_IMAGE_PNG); //$NON-NLS-1$
ITopic topic = workbook.createTopic();
topic.getImage().setSource(
HyperlinkUtils.toAttachmentURL(entry.getPath()));
return new Object[] { topic.getImage() };
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}