/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.dnd; import java.io.File; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.TransferData; import org.xmind.core.Core; import org.xmind.core.ICloneData; import org.xmind.core.ISerializer; import org.xmind.core.IWorkbook; import org.xmind.core.internal.dom.MarkerSheetImpl; import org.xmind.core.io.DirectoryStorage; import org.xmind.core.marker.IMarkerRef; import org.xmind.core.util.FileUtils; import org.xmind.ui.mindmap.MindMapUI; public class MindMapElementTransfer extends ByteArrayTransfer { private static final MindMapElementTransfer instance = new MindMapElementTransfer(); private static final String TYPE_NAME = "mindmap-element-transfer-format:" //$NON-NLS-1$ + System.currentTimeMillis() + ":" + instance.hashCode(); //$NON-NLS-1$ private static final int TYPE_ID = registerType(TYPE_NAME); private Object[] elements = null; private IWorkbook tempWorkbook = null; private Map<Object, Object> cloneMap = new HashMap<Object, Object>(); protected MindMapElementTransfer() { } public static MindMapElementTransfer getInstance() { return instance; } protected int[] getTypeIds() { return new int[] { TYPE_ID }; } protected String[] getTypeNames() { return new String[] { TYPE_NAME }; } public void javaToNative(Object object, TransferData transferData) { if (!(object instanceof Object[])) { setElements(null); return; } setElements((Object[]) object); if (getElements() == null) return; byte[] check = TYPE_NAME.getBytes(); super.javaToNative(check, transferData); } public Object nativeToJava(TransferData transferData) { Object object = super.nativeToJava(transferData); return object == null ? null : elements; } boolean checkType(Object object) { if (!(object instanceof Object[])) return false; Object[] eles = (Object[]) object; return eles.length > 0; } @Override protected boolean validate(Object object) { return checkType(object); } public void setElements(Object[] elements) { this.elements = recreateElements(elements); } public Object[] getElements() { return elements; } private Object[] recreateElements(Object[] elements) { tempWorkbook = recreateTempWorkbook(); if (elements == null || elements.length == 0) return null; ICloneData result = tempWorkbook.clone(Arrays.asList(elements)); Collection<Object> cloneds = result.getCloneds(); if (!cloneds.isEmpty()) { for (Object element : elements) { if (element instanceof IMarkerRef) { IMarkerRef ref = (IMarkerRef) element; ((MarkerSheetImpl) tempWorkbook.getMarkerSheet()) .getElementRegistry().register(ref.getMarker()); } } fillCloneMap(result, elements); return cloneds.toArray(); } return null; } private void fillCloneMap(ICloneData result, Object[] elements) { if (!cloneMap.isEmpty()) cloneMap.clear(); for (Object obj : elements) { Object cloned = result.get(obj); cloneMap.put(cloned, obj); } } public Map<Object, Object> getTransferMap() { return cloneMap; } private IWorkbook recreateTempWorkbook() { String tempDir = Core.getWorkspace().getTempDir("element_transfer" //$NON-NLS-1$ + MindMapUI.FILE_EXT_XMIND_TEMP); File tempLocation = new File(tempDir); FileUtils.delete(tempLocation); tempLocation.mkdirs(); IWorkbook workbook = Core.getWorkbookBuilder() .createWorkbook(new DirectoryStorage(tempLocation)); workbook.getMarkerSheet().setParentSheet( MindMapUI.getResourceManager().getSystemMarkerSheet()); try { ISerializer serializer = Core.getWorkbookBuilder().newSerializer(); serializer.setWorkbook(workbook); serializer.setWorkbookStorageAsOutputTarget(); serializer.serialize(null); } catch (Exception e) { } return workbook; } }