Java tutorial
/* * Copyright (c) 2012 Diamond Light Source Ltd. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.dawb.workbench.ui.diffraction.table; import java.util.List; import org.dawb.workbench.ui.Activator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.dawnsci.analysis.api.diffraction.DetectorPropertyEvent; import org.eclipse.dawnsci.analysis.api.diffraction.IDetectorPropertyListener; import org.eclipse.dawnsci.analysis.api.tree.NodeLink; import org.eclipse.dawnsci.analysis.api.tree.TreeFile; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.FileTransfer; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.part.ResourceTransfer; /** * * @author wqk87977 * */ public class DiffractionDelegate implements IRefreshable { private TableViewer viewer; private Action deleteAction; //private List<DiffractionTableData> model = new ArrayList<DiffractionTableData>(); private DiffractionDataManager manager; private Composite parent; private List<String> pathsList; private IDetectorPropertyListener detectorPropertyListener; private DropTargetAdapter dropListener; private Table table; private int tabIndex = 0; /** * * @param parent * composite * @param pathsList * list of all paths images to be displayed in the table viewer * @param service * service loader, can be null */ public DiffractionDelegate(Composite parent, List<String> pathsList, DiffractionDataManager manager) { viewer = new TableViewer(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); this.parent = parent; this.pathsList = pathsList; this.table = viewer.getTable(); this.manager = manager; initialize(); createColumns(viewer); table.setHeaderVisible(true); table.setLinesVisible(true); table.setToolTipText("How to use Diffraction Calibration View:\n" + "1. Drag/drop or double click your calibration file to add it.\n" + "2. Choose the calibrant\n" + "3. Select the rings to use.\n" + "4. Run the calibration."); viewer.setContentProvider(new DiffCalContentProvider()); viewer.setLabelProvider(new DiffCalLabelProvider()); viewer.setInput(manager); viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); final MenuManager mgr = new MenuManager(); mgr.setRemoveAllWhenShown(true); mgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); Object[] selected = selection.toArray(); if (selected.length > 0) { if (selected.length == 1) { deleteAction.setText( "Delete " + ((DiffractionTableData) selection.getFirstElement()).getName()); mgr.add(deleteAction); } else { deleteAction.setText("Delete " + selected.length + " images selected"); mgr.add(deleteAction); } } } }); viewer.getControl().setMenu(mgr.createContextMenu(viewer.getControl())); // add drop support DropTarget dt = new DropTarget(viewer.getControl(), DND.DROP_MOVE | DND.DROP_DEFAULT | DND.DROP_COPY); dt.setTransfer(new Transfer[] { TextTransfer.getInstance(), FileTransfer.getInstance(), ResourceTransfer.getInstance(), LocalSelectionTransfer.getTransfer() }); dt.addDropListener(dropListener); // Label infoEditableLabel = new Label(parent, SWT.NONE); // infoEditableLabel.setText("* Click to change value"); } private void initialize() { detectorPropertyListener = new IDetectorPropertyListener() { @Override public void detectorPropertiesChanged(DetectorPropertyEvent evt) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { viewer.refresh(); } }); } }; dropListener = new DropTargetAdapter() { @Override public void drop(DropTargetEvent event) { Object dropData = event.data; if (dropData instanceof IResource[]) { IResource[] res = (IResource[]) dropData; for (int i = 0; i < res.length; i++) { manager.loadData(res[i].getRawLocation().toOSString(), null); } } else if (dropData instanceof TreeSelection) { TreeSelection selectedNode = (TreeSelection) dropData; Object obj[] = selectedNode.toArray(); for (int i = 0; i < obj.length; i++) { if (obj[i] instanceof NodeLink) { NodeLink node = (NodeLink) obj[i]; if (node == null || !(node.getTree() instanceof TreeFile)) return; manager.loadData(((TreeFile) node.getTree()).getFilename(), node.getFullName()); } else if (obj[i] instanceof IFile) { IFile file = (IFile) obj[i]; manager.loadData(file.getLocation().toOSString(), null); } } } else if (dropData instanceof String[]) { String[] selectedData = (String[]) dropData; for (int i = 0; i < selectedData.length; i++) { manager.loadData(selectedData[i], null); } } } }; deleteAction = new Action("Delete item", Activator.getImageDescriptor("icons/delete_obj.png")) { @Override public void run() { StructuredSelection selection = (StructuredSelection) viewer.getSelection(); Object[] selected = selection.toArray(); for (int i = 0; i < selected.length; i++) { DiffractionTableData selectedData = (DiffractionTableData) selected[i]; if (manager.getSize() > 0) { if (manager.remove(selectedData)) { if (selectedData.getMetaData() != null) selectedData.getMetaData().getDetector2DProperties() .removeDetectorPropertyListener(detectorPropertyListener); } } } if (manager.getSize() > 0) { viewer.setSelection(new StructuredSelection((DiffractionTableData) viewer.getElementAt(0))); } else { viewer.setSelection(new StructuredSelection()); } updateTableColumnsAndLayout(tabIndex); } }; } /** * Add DetectorPropertyListener for the given DiffractionTableData * @param data */ public void addDetectorPropertyListener(DiffractionTableData data) { data.getMetaData().getDetector2DProperties().addDetectorPropertyListener(detectorPropertyListener); } private void createColumns(TableViewer tv) { TableViewerColumn tvc = new TableViewerColumn(tv, SWT.NONE); TableColumn tc = tvc.getColumn(); tc.setText("Image"); tc.setWidth(200); tvc.setEditingSupport(new DiffCalEditingSupport(tv, 0)); tvc = new TableViewerColumn(tv, SWT.NONE); tc = tvc.getColumn(); tc.setText("# of rings"); tc.setWidth(0); tc.setMoveable(false); tvc.setEditingSupport(new DiffCalEditingSupport(tv, 1)); tvc = new TableViewerColumn(tv, SWT.NONE); tc = tvc.getColumn(); tc.setText("Distance"); tc.setToolTipText("in mm"); if (pathsList != null && pathsList.size() <= 1) {// if more than one image then we show the column tc.setWidth(0); tc.setMoveable(false); } else { tc.setWidth(80); tc.setMoveable(true); } tvc.setEditingSupport(new DiffCalEditingSupport(tv, 2)); } /** * Update the visibility of the Table columns and parent layout */ public void updateTableColumnsAndLayout(int tabIndex) { this.tabIndex = tabIndex; TableColumn[] columns = table.getColumns(); for (int i = 1; i < columns.length; i++) { if (tabIndex == 0) { // auto mode int width = 0; // if more than one image and distance column index if (manager.getSize() > 1 && i == 2) width = 80; table.getColumns()[i].setWidth(width); table.getColumns()[i].setMoveable(width > 0); } else if (tabIndex == 1) { // manual mode int width = 80; // if less than 2 images and column is distance if (manager.getSize() <= 1 && i == 2) width = 0; table.getColumns()[i].setWidth(width); table.getColumns()[i].setMoveable(width > 0); } } // update parent composite viewer.refresh(); Rectangle r = parent.getClientArea(); if (parent.getParent() instanceof ScrolledComposite) { ScrolledComposite scrollHolder = (ScrolledComposite) parent.getParent(); scrollHolder.setMinSize(parent.computeSize(r.width, SWT.DEFAULT)); scrollHolder.layout(); } } public IDetectorPropertyListener getDetectorPropertyListener() { return detectorPropertyListener; } public void addSelectionChangedListener(ISelectionChangedListener selectionChangeListener) { viewer.addSelectionChangedListener(selectionChangeListener); } public void removeSelectionChangedListener(ISelectionChangedListener selectionChangeListener) { viewer.removeSelectionChangedListener(selectionChangeListener); } public void setLayoutData(GridData data) { viewer.getTable().setLayoutData(data); } public void refresh() { viewer.refresh(); } public void setSelection(StructuredSelection structuredSelection) { viewer.setSelection(structuredSelection); } public void setSelection(ISelection structuredSelection, boolean reveal) { viewer.setSelection(structuredSelection, reveal); } public ISelection getSelection() { return viewer.getSelection(); } public boolean isDisposed() { return viewer.getTable().isDisposed(); } public void setFocus() { viewer.getTable().setFocus(); } }