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.Request; import org.xmind.ui.internal.AttachmentImageDescriptor; import org.xmind.ui.util.Logger; public class ImageDndClient extends MindMapDNDClientBase { 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; } @Override protected Object[] toViewerElements(Object transferData, Request request, IWorkbook workbook, ITopic targetParent, boolean dropInParent) { if (transferData instanceof ImageData) { if (workbook != null) { ImageData imageData = (ImageData) transferData; ImageLoader saver = new ImageLoader(); saver.data = new ImageData[] { imageData }; ByteArrayOutputStream os = new ByteArrayOutputStream(); try { saver.save(os, SWT.IMAGE_PNG); } finally { try { os.close(); } catch (IOException e) { } } byte[] imageDataInBytes = os.toByteArray(); IManifest manifest = workbook.getManifest(); try { ByteArrayInputStream is = new ByteArrayInputStream( imageDataInBytes); IFileEntry entry; try { entry = manifest.createAttachmentFromStream(is, "temp.png", Core.MEDIA_TYPE_IMAGE_PNG); //$NON-NLS-1$ } finally { is.close(); } String imageSource = HyperlinkUtils.toAttachmentURL(entry .getPath()); if (targetParent != null && dropInParent) { return new Object[] { createModifyImageCommand( targetParent, imageSource, IImage.UNSPECIFIED, IImage.UNSPECIFIED, null) }; } ITopic topic = workbook.createTopic(); topic.getImage().setSource(imageSource); return new Object[] { topic }; } catch (IOException e) { Logger.log(e, "[ImageDndClient] Failed to create image entry."); //$NON-NLS-1$ } } } return null; } }