/* * ARX: Powerful Data Anonymization * Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors * * 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 org.deidentifier.arx.gui.view.impl.common; import java.util.ArrayList; import java.util.List; import org.deidentifier.arx.gui.resources.Resources; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; 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.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.TreeColumn; /** * Supports interaction with the system clipboard. * * @author Fabian Prasser */ public class ClipboardHandlerTree { /** The viewer. */ private final TreeViewer tree; /** * Creates a new instance. * * @param tree */ public ClipboardHandlerTree(TreeViewer tree){ this.tree = tree; } /** * Copies the table's contents to the clipboard. */ public void copy(){ if (tree != null && getItemCount(tree)>0) { Clipboard clipboard = new Clipboard(tree.getTree().getDisplay()); TextTransfer textTransfer = TextTransfer.getInstance(); clipboard.setContents(new String[]{getText(tree)}, new Transfer[]{textTransfer}); clipboard.dispose(); } } /** * Creates a pop up menu for this handler. * * @return */ public Menu getMenu() { Menu menu = new Menu(tree.getTree()); MenuItem itemCopy = new MenuItem(menu, SWT.NONE); itemCopy.setText(Resources.getMessage("ClipboardHandlerTree.0")); //$NON-NLS-1$ itemCopy.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent arg0) { copy(); } }); return menu; } /** * Access to tree viewer. * * @param tree * @param item * @return */ private Object[] getChildren(TreeViewer tree, Object item){ return ((ITreeContentProvider)tree.getContentProvider()).getChildren(item); } /** * Access to tree viewer. * * @param tree * @return */ private TreeColumn[] getColumns(TreeViewer tree){ return tree.getTree().getColumns(); } /** * Returns the number of items. * * @param tree * @return */ private int getItemCount(TreeViewer tree) { ITreeContentProvider provider = (ITreeContentProvider)tree.getContentProvider(); return provider.getElements(null).length; } /** * Access to tree viewer. * * @param tree * @return */ private Object[] getItems(TreeViewer tree) { return ((ITreeContentProvider)tree.getContentProvider()).getElements(null); } /** * Access to tree viewer. * * @param tree * @param item * @param index * @return */ private String getLabel(TreeViewer tree, Object item, int index){ return ((ITableLabelProvider)tree.getLabelProvider()).getColumnText(item, index); } /** * Renders the tree into a string. * * @param tree * @return */ private String getText(TreeViewer tree){ StringBuilder builder = new StringBuilder(); List<String> properties = new ArrayList<String>(); for (TreeColumn column : getColumns(tree)){ properties.add(column.getText()); } for (Object item : getItems(tree)) { getText(tree, item, properties, builder, ""); //$NON-NLS-1$ } return builder.toString(); } /** * Renders an item and its children. * * @param tree * @param item * @param properties * @param builder * @param prefix */ private void getText(TreeViewer tree, Object item, List<String> properties, StringBuilder builder, String prefix){ if (builder.length() != 0) { builder.append("\n"); //$NON-NLS-1$ } builder.append(prefix); int added = 0; for (int i=0; i<properties.size(); i++) { String value = getLabel(tree, item, i); if (value != null && !value.equals("")) { //$NON-NLS-1$ if (added!=0) { builder.append(", "); //$NON-NLS-1$ } added++; builder.append(properties.get(i)).append(": ").append(value); //$NON-NLS-1$ } } for (Object child : getChildren(tree, item)) { getText(tree, child, properties, builder, prefix+"\t"); //$NON-NLS-1$ } } }