/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.utils.common; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.swt.dnd.Clipboard; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.widgets.Display; /** * Helper for accessing the system clipboard. * * This helper currently only allows the handling of {@link String}s. * * @author Tobias Rodehutskors */ public final class ClipboardHelper { private static final Log LOG = LogFactory.getLog(ClipboardHelper.class); /** * This class has only static methods. */ private ClipboardHelper() { // only static methods } /** * Helper to copy {@link String}s onto the system clipboard. * * @param content The content to copy onto the clipboard. */ public static void setContent(String content) { // This method should be overloaded to allow handling of different types. // This function should be refactored if more transfer data types should be supported to avoid code duplication // TODO Maybe we should store an instance of the clipboard for reuse? Clipboard cb = new Clipboard(Display.getDefault()); TextTransfer textTransfer = TextTransfer.getInstance(); try { cb.setContents(new Object[] { content }, new Transfer[] { textTransfer }); } catch (IllegalArgumentException e) { // content is null // Empty content cannot be copied onto the clipboard } // TODO there are more possible exceptions cb.dispose(); } /** * Helper to get a {@link String} from the system clipboard. Returns * * @return a {@link String} if the clipboard contains content of the type TextTransfer, otherwise it returns null. */ public static String getContentAsStringOrNull() { // This function should be refactored if more transfer data types should be supported to avoid code duplication Clipboard cb = new Clipboard(Display.getDefault()); // Check if the requested type is currently available on the system clipboard. This is faster and more reliable than directly // accessing the clipboard, according to https://eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html. TransferData[] availableTypes = cb.getAvailableTypes(); boolean textTransferAvailable = false; for (TransferData availableType : availableTypes) { if (TextTransfer.getInstance().isSupportedType(availableType)) { textTransferAvailable = true; break; } } if (!textTransferAvailable) { cb.dispose(); return null; } else { TextTransfer textTransfer = TextTransfer.getInstance(); String clipboardText = (String) cb.getContents(textTransfer); cb.dispose(); return clipboardText; } } }