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.dawnsci.processing.ui.slice; import java.io.File; import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import org.dawb.common.services.IFileIconService; import org.dawb.common.services.ServiceManager; import org.dawb.common.services.conversion.IConversionContext; import org.dawb.common.services.conversion.IConversionContext.ConversionScheme; import org.dawb.common.services.conversion.IConversionService; import org.dawb.common.services.conversion.IProcessingConversionInfo; import org.dawb.common.services.conversion.ProcessingOutputType; import org.dawb.common.ui.monitor.ProgressMonitorWrapper; import org.dawnsci.common.widgets.dialog.FileSelectionDialog; import org.dawnsci.processing.ui.Activator; import org.dawnsci.processing.ui.processing.OperationDescriptor; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.dawnsci.analysis.api.dataset.IDataset; import org.eclipse.dawnsci.analysis.api.dataset.ILazyDataset; import org.eclipse.dawnsci.analysis.api.dataset.Slice; import org.eclipse.dawnsci.analysis.api.dataset.SliceND; import org.eclipse.dawnsci.analysis.api.io.IDataHolder; import org.eclipse.dawnsci.analysis.api.io.ILoaderService; import org.eclipse.dawnsci.analysis.api.metadata.AxesMetadata; import org.eclipse.dawnsci.analysis.api.metadata.IMetadata; import org.eclipse.dawnsci.analysis.api.monitor.IMonitor; import org.eclipse.dawnsci.analysis.api.processing.IExecutionVisitor; import org.eclipse.dawnsci.analysis.api.processing.IOperation; import org.eclipse.dawnsci.analysis.api.processing.IOperationContext; import org.eclipse.dawnsci.analysis.api.processing.IOperationService; import org.eclipse.dawnsci.analysis.api.processing.OperationData; import org.eclipse.dawnsci.analysis.api.processing.OperationException; import org.eclipse.dawnsci.analysis.api.processing.model.IOperationModel; import org.eclipse.dawnsci.analysis.dataset.slicer.SliceFromSeriesMetadata; import org.eclipse.dawnsci.analysis.dataset.slicer.SliceInformation; import org.eclipse.dawnsci.analysis.dataset.slicer.Slicer; import org.eclipse.dawnsci.analysis.dataset.slicer.SourceInformation; import org.eclipse.dawnsci.hdf5.operation.HierarchicalFileExecutionVisitor; import org.eclipse.dawnsci.plotting.api.IPlottingSystem; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; 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.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.ResourceTransfer; import org.eclipse.ui.part.ViewPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DataFileSliceView extends ViewPart { private static IConversionService cservice; public static void setConversionService(IConversionService s) { cservice = s; } private static IOperationService oservice; public static void setOperationService(IOperationService s) { oservice = s; } private static ILoaderService lservice; public static void setLoaderService(ILoaderService s) { lservice = s; } private FileManager fileManager; private OperationEventManager eventManager; private TableViewer viewer; private UpdateJob job; private Label currentSliceLabel; private ChangeSliceWidget csw; private String selectedFile = null; private IOperation<? extends IOperationModel, ? extends OperationData> currentOperation = null; private IPlottingSystem input; private IPlottingSystem output; private IOperationInputData inputData = null; private ProcessingOutputType processingOutputType = ProcessingOutputType.PROCESSING_ONLY; String lastPath = null; private final static Logger logger = LoggerFactory.getLogger(DataFileSliceView.class); @Override public void createPartControl(Composite parent) { fileManager = new FileManager(new SetupContextHelper()); parent.setLayout(new GridLayout()); viewer = new TableViewer(parent); viewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setContentProvider(new BasicContentProvider()); viewer.setInput(fileManager); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (event.getSelection() instanceof StructuredSelection) { inputData = null; eventManager.sendInputDataUpdate(null); selectedFile = (String) ((StructuredSelection) event.getSelection()).getFirstElement(); update(currentOperation); } } }); ColumnViewerToolTipSupport.enableFor(viewer); DropTargetAdapter dropListener = new DropTargetAdapter() { @Override public void drop(DropTargetEvent event) { Object dropData = event.data; if (dropData instanceof TreeSelection) { TreeSelection selectedNode = (TreeSelection) dropData; Object obj[] = selectedNode.toArray(); List<String> paths = new ArrayList<String>(); for (int i = 0; i < obj.length; i++) { if (obj[i] instanceof IFile) { IFile file = (IFile) obj[i]; paths.add(file.getLocation().toOSString()); } } if (!paths.isEmpty()) fileManager.addFiles(paths.toArray(new String[paths.size()])); } else if (dropData instanceof String[]) { fileManager.addFiles((String[]) dropData); } viewer.setInput(fileManager); } }; 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); csw = new ChangeSliceWidget(parent); csw.addSliceChangeListener(new ISliceChangeListener() { @Override public void sliceChanged(SliceChangeEvent event) { inputData = null; eventManager.sendInputDataUpdate(null); String ss = Slice.createString(csw.getCurrentSlice()); currentSliceLabel.setText("Current slice of data: [" + ss + "]"); currentSliceLabel.getParent().layout(true); update(currentOperation); } }); csw.disable(); final MenuManager rightClick = new MenuManager(); createActions(rightClick); viewer.getControl().setMenu(rightClick.createContextMenu(viewer.getControl())); getSite().getPage().addSelectionListener("org.dawnsci.processing.ui.processingView", new ISelectionListener() { @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (selection instanceof StructuredSelection && ((StructuredSelection) selection) .getFirstElement() instanceof OperationDescriptor) { OperationDescriptor des = (OperationDescriptor) ((StructuredSelection) selection) .getFirstElement(); try { currentOperation = des.getSeriesObject(); update(currentOperation); } catch (InstantiationException e) { logger.error(e.getMessage(), e); } } else { if (getOperations() == null || getOperations().length == 0) { output.clear(); } } } }); currentSliceLabel = new Label(parent, SWT.WRAP); currentSliceLabel.setText("Current slice of data: [ - - - - -]"); IWorkbenchPage page = getSite().getPage(); IViewPart view = page.findView("org.dawnsci.processing.ui.output"); output = (IPlottingSystem) view.getAdapter(IPlottingSystem.class); view = page.findView("org.dawnsci.processing.ui.input"); input = (IPlottingSystem) view.getAdapter(IPlottingSystem.class); fileManager.addFileListener(new IFilesAddedListener() { @Override public void filesAdded(FileAddedEvent event) { String[] paths = event.getPaths(); boolean[] success = event.getSuccess(); int first = -1; final List<String> failedPaths = new ArrayList<String>(); for (int i = 0; i < success.length; i++) { if (success[i] && first < 0) first = i; if (!success[i]) failedPaths.add(paths[i]); } final int f = first; Display.getDefault().syncExec(new Runnable() { @Override public void run() { if (f < 0) { MessageDialog.openError(getSite().getShell(), "Error loading files", "None of the selected files contained suitable datasets!"); return; } if (!failedPaths.isEmpty()) { StringBuilder sb = new StringBuilder(); sb.append("Failed to load: "); for (String p : failedPaths) sb.append(p + ", "); sb.append("did not contain suitable datasets"); MessageDialog.openError(getSite().getShell(), "Error loading some files", sb.toString()); } } }); if (f < 0) return; final String path = paths[first]; Display.getDefault().syncExec(new Runnable() { @Override public void run() { viewer.refresh(); viewer.setSelection(new StructuredSelection(path), true); } }); } }); eventManager = new OperationEventManager(); eventManager.addOperationRunnerListener(new IOperationGUIRunnerListener.Stub() { @Override public void updateRequested() { update(currentOperation); } }); //hook up delete key to remove from list viewer.getTable().addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.DEL) { clearSelected(); } } }); } private void createActions(IContributionManager rightClick) { final IAction run = new Action("Process all files", Activator.getImageDescriptor("icons/run_workflow.gif")) { public void run() { IOperation<? extends IOperationModel, ? extends OperationData>[] ops = getOperations(); if (ops != null) { final IOperation<? extends IOperationModel, ? extends OperationData>[] fop = ops; fileManager.setProcessingConversionInfo(new IProcessingConversionInfo() { @Override public IOperation<? extends IOperationModel, ? extends OperationData>[] getOperationSeries() { return fop; } @Override public IExecutionVisitor getExecutionVisitor(String fileName) { return new HierarchicalFileExecutionVisitor(fileName); } @Override public ProcessingOutputType getProcessingOutputType() { return processingOutputType; } }); } ExtendedFileSelectionDialog fsd = new ExtendedFileSelectionDialog( Display.getCurrent().getActiveShell()); if (lastPath == null) { final File source = new File(fileManager.getFilePaths().get(0)); lastPath = source.getParent(); } fsd.setPath(lastPath); fsd.create(); if (fsd.open() == Dialog.CANCEL) return; lastPath = fsd.getPath(); File f = new File(lastPath); if (!f.canWrite()) { MessageBox dialog = new MessageBox(getViewSite().getShell(), SWT.ICON_ERROR | SWT.OK); dialog.setText("File save error!"); dialog.setMessage( "Could not save calibration file! (Do you have write access to this directory?)"); dialog.open(); return; } fileManager.setOutputPath(fsd.getPath()); ProgressMonitorDialog dia = new ProgressMonitorDialog(Display.getCurrent().getActiveShell()); try { dia.run(true, true, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask("Processing", getAmountOfWork(fileManager.getContext())); fileManager.getContext().setMonitor(new ProgressMonitorWrapper(monitor)); try { cservice.process(fileManager.getContext()); } catch (final Exception e) { Display.getDefault().asyncExec(new Runnable() { public void run() { MessageDialog.openError(DataFileSliceView.this.getViewSite().getShell(), "Error processing files!", e.getMessage()); } }); logger.error(e.getMessage(), e); } } }); } catch (InvocationTargetException e1) { logger.error(e1.getMessage(), e1); } catch (InterruptedException e1) { logger.error(e1.getMessage(), e1); } } }; getViewSite().getActionBars().getToolBarManager().add(run); getViewSite().getActionBars().getMenuManager().add(run); rightClick.add(run); final IAction clear = new Action("Clear selected file", Activator.getImageDescriptor("icons/delete.gif")) { public void run() { clearSelected(); } }; final IAction clearAll = new Action("Clear all files", Activator.getImageDescriptor("icons/deleteAll.gif")) { public void run() { fileManager.clear(); csw.disable(); eventManager.sendInitialDataUpdate(null); job = null; currentSliceLabel.setText("Current slice of data: [ - - - - -]"); try { input.reset(); output.reset(); } catch (Exception e1) { logger.error("Could not clear plotting systems"); } viewer.refresh(); } }; final IAction edit = new Action("Edit slice configuration", Activator.getImageDescriptor("icons/book-brown-setting.png")) { public void run() { fileManager.setUpContext(); } }; final IAction export = new OperationExportAction("Export to Workflow", Activator.getImageDescriptor("icons/flow.png")) { public IOperationContext createContext() { IOperationContext ocontext = oservice.createContext(); ocontext.setSeries(getOperations()); final String selectedPath = (String) ((IStructuredSelection) viewer.getSelection()) .getFirstElement(); if (selectedPath == null) { MessageDialog.openWarning(Display.getDefault().getActiveShell(), "Please Choose File", "Please select a file to use with export.\n\nOne file only may be exported to workflows at a time."); return null; } ocontext.setFilePath(selectedPath); IConversionContext ccontext = fileManager.getContext(); if (ccontext == null) { MessageDialog.openWarning(Display.getDefault().getActiveShell(), "Please Choose File", "Please ensure that a slice and file have been chosen."); return null; } ocontext.setSlicing(ccontext.getSliceDimensions()); ocontext.setDatasetPath(ccontext.getDatasetNames().get(0)); return ocontext; } }; getViewSite().getActionBars().getToolBarManager().add(clear); getViewSite().getActionBars().getMenuManager().add(clear); rightClick.add(clear); getViewSite().getActionBars().getToolBarManager().add(clearAll); getViewSite().getActionBars().getMenuManager().add(clearAll); rightClick.add(clearAll); getViewSite().getActionBars().getToolBarManager().add(edit); getViewSite().getActionBars().getMenuManager().add(edit); rightClick.add(edit); getViewSite().getActionBars().getToolBarManager().add(new Separator()); getViewSite().getActionBars().getMenuManager().add(new Separator()); rightClick.add(new Separator()); getViewSite().getActionBars().getToolBarManager().add(export); getViewSite().getActionBars().getMenuManager().add(export); rightClick.add(export); } private void clearSelected() { fileManager.getFilePaths().remove(selectedFile); if (fileManager.getFilePaths().isEmpty()) { fileManager.clear(); csw.disable(); currentSliceLabel.setText("Current slice of data: [ - - - - -]"); eventManager.sendInitialDataUpdate(null); } else { viewer.setSelection(new StructuredSelection(fileManager.getFilePaths().get(0)), true); } job = null; try { input.reset(); output.reset(); } catch (Exception e1) { logger.error("Could not clear plotting systems"); } viewer.refresh(); } private void update(final IOperation<? extends IOperationModel, ? extends OperationData> end) { if (fileManager.getContext() == null) return; if (job == null) { job = new UpdateJob(fileManager.getContext()); } else { job.cancel(); } job.setPath(selectedFile); job.setEndOperation(end); job.schedule(); } private void updateSliceWidget(String path) { try { IDataHolder dh = lservice.getData(path, new IMonitor.Stub()); ILazyDataset lazy = dh.getLazyDataset(fileManager.getContext().getDatasetNames().get(0)); int[] shape = lazy.getShape(); int[] dd = Slicer.getDataDimensions(shape, fileManager.getContext().getSliceDimensions()); Slice[] slices = Slicer.getSliceArrayFromSliceDimensions(fileManager.getContext().getSliceDimensions(), shape); csw.setDatasetShapeInformation(shape, dd.clone(), slices); String ss = Slice.createString(csw.getCurrentSlice()); currentSliceLabel.setText("Current slice of data: [" + ss + "]"); currentSliceLabel.getParent().layout(true); } catch (Exception e) { logger.error(e.getMessage(), e); } } private IOperation<? extends IOperationModel, ? extends OperationData>[] getOperations() { IViewPart view = getSite().getPage().findView("org.dawnsci.processing.ui.processingView"); Object ob = view.getAdapter(IOperation.class); IOperation<? extends IOperationModel, ? extends OperationData>[] ops = null; if (ob == null) return null; if (ob.getClass().isArray() && Array.get(ob, 0) instanceof IOperation) { ops = (IOperation[]) ob; } return ops; } private int getAmountOfWork(IConversionContext context) { int c = 0; String name = context.getDatasetNames().get(0); int[] dd = null; Map<Integer, String> sliceDimensions = context.getSliceDimensions(); for (String path : context.getFilePaths()) { try { IMetadata metadata = lservice.getMetadata(path, null); int[] s = metadata.getDataShapes().get(name); Slice[] slices = Slicer.getSliceArrayFromSliceDimensions(sliceDimensions, s); SliceND slice = new SliceND(s, slices); int[] nShape = slice.getShape(); if (dd == null) { dd = Slicer.getDataDimensions(s, context.getSliceDimensions()); Arrays.sort(dd); } int n = 1; for (int i = 0; i < nShape.length; i++) { if (Arrays.binarySearch(dd, i) < 0) n *= nShape[i]; } c += n; } catch (Exception e) { logger.warn("cannot load metadata for {}, assuming one frame", path); c++; } } return c; } @Override public void setFocus() { if (viewer != null) viewer.getTable().setFocus(); } private class UpdateJob extends Job { IConversionContext context; IOperation<? extends IOperationModel, ? extends OperationData> end; String path = null; public UpdateJob(IConversionContext context) { super("Update..."); this.context = context; } public void setEndOperation(IOperation<? extends IOperationModel, ? extends OperationData> end) { this.end = end; } public void setPath(String path) { if (path == null) return; if (!path.equals(this.path)) { updateSliceWidget(path); this.path = path; } } @Override protected IStatus run(IProgressMonitor monitor) { output.setEnabled(false); EscapableSliceVisitor sliceVisitor = null; try { if (path == null) path = context.getFilePaths().get(0); final IDataHolder dh = lservice.getData(path, new IMonitor.Stub()); ILazyDataset lazyDataset = dh.getLazyDataset(context.getDatasetNames().get(0)); if (lazyDataset == null) { logger.error("Selected dataset not in file!!!!"); return Status.CANCEL_STATUS; } //take a local view lazyDataset = lazyDataset.getSliceView(); Map<Integer, String> axesNames = context.getAxesNames(); if (axesNames != null) { AxesMetadata axMeta = SlicedDataUtils.createAxisMetadata(path, lazyDataset, axesNames); if (axMeta != null) lazyDataset.setMetadata(axMeta); else lazyDataset.clearMetadata(AxesMetadata.class); } int[] dataDims = Slicer.getDataDimensions(lazyDataset.getShape(), context.getSliceDimensions()); Slice[] s = csw.getCurrentSlice(); //Plot input, probably a bit wasteful to do each time IDataset firstSlice = null; if (lazyDataset instanceof IDataset) { firstSlice = ((IDataset) lazyDataset).getSliceView(s); } else { firstSlice = lazyDataset.getSlice(s); } eventManager.sendInitialDataUpdate(firstSlice.getSliceView().squeeze()); SlicedDataUtils.plotDataWithMetadata(firstSlice, input, dataDims); IOperation<? extends IOperationModel, ? extends OperationData>[] ops = getOperations(); if (ops == null) { output.clear(); return Status.OK_STATUS; } //Only run what is necessary if (inputData != null) { if (inputData.getCurrentOperation() != end) { int pos = 0; for (int i = 0; i < ops.length; i++) { if (ops[i] == end) break; if (ops[i] == inputData.getCurrentOperation()) { pos = i; pos++; break; } } if (pos != 0) { firstSlice = inputData.getInputData(); ops = Arrays.copyOfRange(ops, pos - 1, ops.length); } } else { firstSlice = inputData.getInputData(); ops = new IOperation[] { inputData.getCurrentOperation() }; } } SourceInformation si = new SourceInformation(path, context.getDatasetNames().get(0), lazyDataset); SliceInformation sli = csw.getCurrentSliceInformation(); //TODO replace with check shape firstSlice.setMetadata(new SliceFromSeriesMetadata(si, sli)); // OriginMetadataImpl om = new OriginMetadataImpl(lazyDataset, viewSlice, dataDims, path, context.getDatasetNames().get(0)); // om.setCurrentSlice(csw.getCurrentSlice()); // lazyDataset.setMetadata(om); sliceVisitor = getSliceVisitor(ops, lazyDataset, Slicer.getDataDimensions(lazyDataset.getShape(), context.getSliceDimensions())); sliceVisitor.setEndOperation(end); long start = System.currentTimeMillis(); sliceVisitor.visit(firstSlice, null, null); inputData = sliceVisitor.getOperationInputData(); eventManager.sendInputDataUpdate(inputData); logger.debug("Ran in: " + (System.currentTimeMillis() - start) / 1000. + " s"); eventManager.sendErrorUpdate(null); } catch (OperationException e) { logger.error(e.getMessage(), e); eventManager.sendErrorUpdate(e); return Status.CANCEL_STATUS; } catch (Exception e) { logger.error(e.getMessage(), e); String message = e.getMessage(); if (message == null) message = "Unexpected error!"; eventManager.sendErrorUpdate(new OperationException(null, message)); return Status.CANCEL_STATUS; } finally { if (sliceVisitor != null) { inputData = sliceVisitor.getOperationInputData(); eventManager.sendInputDataUpdate(inputData); } output.setEnabled(true); } return Status.OK_STATUS; } } private EscapableSliceVisitor getSliceVisitor( IOperation<? extends IOperationModel, ? extends OperationData>[] series, ILazyDataset lz, int[] dataDims) { return new EscapableSliceVisitor(lz, dataDims, series, null, fileManager.getContext(), output); } @Override public Object getAdapter(final Class clazz) { if (clazz == FileManager.class) return fileManager; if (clazz == OperationEventManager.class) return eventManager; return super.getAdapter(clazz); } private class BasicContentProvider implements IStructuredContentProvider { @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof FileManager) { if (((FileManager) inputElement).getFilePaths() == null) return new String[0]; return ((FileManager) inputElement).getFilePaths().toArray(); } return new String[0]; } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } private class ViewLabelProvider extends ColumnLabelProvider { private IFileIconService service; ViewLabelProvider() { try { this.service = (IFileIconService) ServiceManager.getService(IFileIconService.class); } catch (Exception e) { // Ignored, we just have no icon then } } @Override public String getText(Object obj) { if (obj instanceof String) { File f = new File((String) obj); if (f.isFile()) return f.getName(); } return ""; } @Override public Image getImage(Object obj) { try { if (obj instanceof String) { return service.getIconForFile((String) obj); } } catch (Exception ignored) { // Not end of world if no icon! } return null; } @Override public String getToolTipText(Object obj) { return obj.toString(); } } private class SetupContextHelper implements ISetupContext { @Override public IConversionContext init(String path) { IConversionContext context = cservice.open(path); return setupwizard(context); } @Override public boolean setup(IConversionContext context) { if (context.getSliceDimensions() != null) { context.getSliceDimensions().clear(); } IConversionContext c = setupwizard(context); if (c != null) { job = null; viewer.setSelection(new StructuredSelection(context.getFilePaths().get(0)), true); return true; } return false; } private IConversionContext setupwizard(IConversionContext context) { final SetUpProcessWizardPage convertPage = new SetUpProcessWizardPage(context); Wizard wiz = new Wizard() { //set @Override public boolean performFinish() { convertPage.populateContext(); return true; } }; wiz.setNeedsProgressMonitor(true); wiz.addPage(convertPage); final WizardDialog wd = new WizardDialog(getSite().getShell(), wiz); wd.setPageSize(new Point(900, 500)); wd.create(); context.setConversionScheme(ConversionScheme.PROCESS); if (wd.open() == WizardDialog.OK) return context; return null; } } private class ExtendedFileSelectionDialog extends FileSelectionDialog { public ExtendedFileSelectionDialog(Shell parentShell) { super(parentShell); } @Override protected Control createDialogArea(Composite parent) { super.createDialogArea(parent); final Button button1 = new Button(parent, SWT.CHECK); button1.setText("Include original data in output (hdf5 and NeXus only)."); if (processingOutputType == ProcessingOutputType.ORIGINAL_AND_PROCESSED) button1.setSelection(true); SelectionListener groupListener = new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { if (button1.getSelection()) { processingOutputType = ProcessingOutputType.ORIGINAL_AND_PROCESSED; } else { processingOutputType = ProcessingOutputType.PROCESSING_ONLY; } } @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } }; button1.addSelectionListener(groupListener); return parent; } } }