/* * Copyright (c) 2012 Data Harmonisation Panel * * All rights reserved. This program and the accompanying materials are made * available under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution. If not, see <http://www.gnu.org/licenses/>. * * Contributors: * HUMBOLDT EU Integrated Project #030962 * Data Harmonisation Panel <http://www.dhpanel.eu> */ package eu.esdihumboldt.hale.ui.views.data.internal; import java.net.URL; import java.util.List; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TreeEditor; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.TreeItem; import de.fhg.igd.slf4jplus.ALogger; import de.fhg.igd.slf4jplus.ALoggerFactory; import eu.esdihumboldt.hale.common.instance.extension.metadata.MetadataActionExtension; import eu.esdihumboldt.hale.common.instance.extension.metadata.MetadataActionFactory; import eu.esdihumboldt.util.Pair; /** * Provides metadata actions for {@link TreeViewer}s * * @author Sebastian Reinhardt */ public abstract class MetadataActionProvider { private static ALogger _log = ALoggerFactory.getLogger(MetadataActionProvider.class); private final TreeViewer treeViewer; /** * Standard Constructor * * @param treeViewer the TreeViewer to which the action will be applied */ public MetadataActionProvider(TreeViewer treeViewer) { this.treeViewer = treeViewer; } /** * Retrieves the key and value of a certain meta datum from a * {@link ViewerCell} * * @param cell the ViewerCell * @return a Pair containing the key and the value of a meta datum */ protected abstract Pair<Object, Object> retrieveMetadata(ViewerCell cell); /** * Adds the action to the certain TreeViewer cell */ public void setup() { final TreeEditor metaEditor = new TreeEditor(treeViewer.getTree()); metaEditor.horizontalAlignment = SWT.LEFT; metaEditor.verticalAlignment = SWT.TOP; treeViewer.getTree().addMouseMoveListener(new MouseMoveListener() { @Override public void mouseMove(MouseEvent e) { final ViewerCell cell = treeViewer.getCell(new Point(e.x, e.y)); // Selected cell changed? if (cell == null || metaEditor.getItem() != cell.getItem() || metaEditor.getColumn() != cell.getColumnIndex()) { // Clean up any previous editor control Control oldmetaEditor = metaEditor.getEditor(); if (oldmetaEditor != null) { oldmetaEditor.dispose(); metaEditor.setEditor(null, null, 0); } } // No selected cell or selected cell didn't change. if (cell == null || cell.getColumnIndex() == 0 || (metaEditor.getItem() == cell.getItem() && metaEditor.getColumn() == cell .getColumnIndex())) { return; } // Initiate the extension-point MetadataActionExtension mae = MetadataActionExtension.getInstance(); final Pair<Object, Object> data = retrieveMetadata(cell); if (data == null) { return; } // get all defined actions final List<MetadataActionFactory> actionSources = mae.getMetadataActions(data .getFirst().toString()); if (actionSources == null || actionSources.isEmpty()) { return; } // Tool-bar used to view and trigger the different possible // actions ToolBar tooli = new ToolBar(treeViewer.getTree(), SWT.NONE); for (final MetadataActionFactory source : actionSources) { ToolItem actionItem = new ToolItem(tooli, SWT.PUSH); // get the Icon of the action URL iconURL = source.getIconURL(); Image image = ImageDescriptor.createFromURL(iconURL).createImage(); actionItem.setImage(image); actionItem.setToolTipText(source.getDisplayName()); actionItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { try { source.createExtensionObject().execute(data.getFirst(), data.getSecond()); } catch (Exception e1) { _log.userError("error creating metadata action", e1); } } }); } metaEditor.setEditor(tooli, (TreeItem) cell.getItem(), cell.getColumnIndex()); tooli.pack(); } }); } }