package logbook.gui.listener;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

/**
 * ツリーをクリップボードにコピーするアダプターです
 *
 */
public final class TreeToClipboardAdapter extends SelectionAdapter {

    /** ツリーヘッダー */
    private final String[] header;

    /** ツリー */
    private final Tree tree;

    /**
     * コンストラクター
     * 
     * @param header ヘッダー
     * @param tree ツリー
     */
    public TreeToClipboardAdapter(String[] header, Tree tree) {
        this.header = header;
        this.tree = tree;
    }

    @Override
    public void widgetSelected(SelectionEvent arg) {
        copyTree(this.header, this.tree);
    }

    /**
     * ツリーの選択されている部分をヘッダー付きでクリップボードにコピーします
     * 
     * @param header ヘッダー
     * @param tree ツリー
     */
    public static void copyTree(String[] header, Tree tree) {
        TreeItem[] treeItems = tree.getSelection();
        StringBuilder sb = new StringBuilder();
        sb.append(StringUtils.join(header, "\t"));
        sb.append("\r\n");
        for (TreeItem column : treeItems) {
            String[] columns = new String[header.length];
            for (int i = 0; i < header.length; i++) {
                columns[i] = column.getText(i);
            }
            sb.append(StringUtils.join(columns, "\t"));
            sb.append("\r\n");
        }
        Clipboard clipboard = new Clipboard(Display.getDefault());
        clipboard.setContents(new Object[] { sb.toString() }, new Transfer[] { TextTransfer.getInstance() });
    }
}