/* * Copyright 2016 Igor Maznitsa. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.igormaznitsa.mindmap.swing.panel; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.util.Map; import javax.annotation.Nonnull; import com.igormaznitsa.meta.annotation.MustNotContainNull; import com.igormaznitsa.mindmap.model.Extra; import com.igormaznitsa.mindmap.model.MindMap; import com.igormaznitsa.mindmap.model.Topic; /** * Transferable object to represent topic list in clipboard. * * @since 1.3.1 */ public class MMDTopicsTransferable implements Transferable { public static final DataFlavor MMD_DATA_FLAVOR; static { try{ MMD_DATA_FLAVOR = new DataFlavor(DataFlavor.javaSerializedObjectMimeType + ";class=\"" + NBMindMapTopicsContainer.class.getName() + "\"", "nb-mindmap-topic-list",NBMindMapTopicsContainer.class.getClassLoader()); }catch(ClassNotFoundException ex){ throw new Error("Can't find class",ex); } } private static final DataFlavor[] FLAVORS = new DataFlavor[]{DataFlavor.stringFlavor, MMD_DATA_FLAVOR}; private final Topic [] topics; private static final String END_OF_LINE = System.getProperty("line.separator","\n"); public MMDTopicsTransferable(@Nonnull @MustNotContainNull final Topic ... topics) { this.topics = new Topic[topics.length]; final MindMap fakeMap = new MindMap(null, false); for(int i=0;i<topics.length;i++){ this.topics[i] = new Topic(fakeMap,topics[i],true); } } @Nonnull private static String convertTopicToText(@Nonnull final Topic topic) { final StringBuilder result = new StringBuilder(); result.append(topic.getText()); boolean addedExtras = false; result.append(END_OF_LINE).append("--------------------"); if (!topic.getExtras().isEmpty()){ addedExtras = true; for(final Map.Entry<Extra.ExtraType,Extra<?>> e : topic.getExtras().entrySet()) { result.append(END_OF_LINE).append(e.getKey().name()).append('=').append(e.getValue().getAsString()); } } if (!topic.getAttributes().isEmpty()) { if (addedExtras) { result.append(END_OF_LINE); } for(final Map.Entry<String,String> e : topic.getAttributes().entrySet()) { result.append(END_OF_LINE).append(e.getKey()).append('=').append(e.getValue()); } } result.append(END_OF_LINE).append("--------------------"); for(final Topic c : topic.getChildren()){ result.append(END_OF_LINE).append(END_OF_LINE).append(convertTopicToText(c)); } return result.toString(); } @Override @Nonnull @MustNotContainNull public DataFlavor[] getTransferDataFlavors() { return FLAVORS; } @Override public boolean isDataFlavorSupported(@Nonnull final DataFlavor flavor) { return flavor.isFlavorTextType() || flavor.isMimeTypeEqual(MMD_DATA_FLAVOR); } @Override @Nonnull public Object getTransferData(@Nonnull final DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (flavor.isFlavorTextType()) { final StringBuilder result = new StringBuilder(); for(final Topic t : this.topics){ if (result.length()>0){ result.append(END_OF_LINE).append(END_OF_LINE); } result.append(convertTopicToText(t)); } return result.toString(); } else if (flavor.isMimeTypeEqual(MMD_DATA_FLAVOR)) { return new NBMindMapTopicsContainer(this.topics); } else { throw new UnsupportedFlavorException(flavor); } } }