org.dawnsci.spectrum.ui.views.TraceProcessPage.java Source code

Java tutorial

Introduction

Here is the source code for org.dawnsci.spectrum.ui.views.TraceProcessPage.java

Source

/*
 * 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.spectrum.ui.views;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dawb.common.ui.menu.MenuAction;
import org.dawb.common.ui.util.EclipseUtils;
import org.dawnsci.algorithm.ui.views.runner.AbstractAlgorithmProcessPage;
import org.dawnsci.algorithm.ui.views.runner.IAlgorithmProcessContext;
import org.dawnsci.python.rpc.action.InjectPyDevConsole;
import org.dawnsci.python.rpc.action.InjectPyDevConsoleAction;
import org.dawnsci.spectrum.ui.Activator;
import org.dawnsci.spectrum.ui.file.IContain1DData;
import org.dawnsci.spectrum.ui.file.ISpectrumFile;
import org.dawnsci.spectrum.ui.file.ISpectrumFileListener;
import org.dawnsci.spectrum.ui.file.SpectrumFile;
import org.dawnsci.spectrum.ui.file.SpectrumFileManager;
import org.dawnsci.spectrum.ui.file.SpectrumFileOpenedEvent;
import org.dawnsci.spectrum.ui.file.SpectrumInMemory;
import org.dawnsci.spectrum.ui.processing.SaveProcess;
import org.dawnsci.spectrum.ui.processing.SaveTextProcess;
import org.dawnsci.spectrum.ui.utils.SpectrumUtils;
import org.dawnsci.spectrum.ui.wizard.SaveFileWizardPage;
import org.dawnsci.spectrum.ui.wizard.SpectrumWizard;
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.dataset.impl.Dataset;
import org.eclipse.dawnsci.analysis.dataset.impl.DatasetUtils;
import org.eclipse.dawnsci.analysis.dataset.impl.Maths;
import org.eclipse.dawnsci.plotting.api.IPlottingSystem;
import org.eclipse.dawnsci.plotting.api.PlottingFactory;
import org.eclipse.dawnsci.plotting.api.axis.IAxis;
import org.eclipse.dawnsci.plotting.api.filter.AbstractPlottingFilter;
import org.eclipse.dawnsci.plotting.api.filter.IFilterDecorator;
import org.eclipse.dawnsci.plotting.api.histogram.IPaletteService;
import org.eclipse.dawnsci.plotting.api.trace.ColorOption;
import org.eclipse.dawnsci.plotting.api.trace.ILineTrace;
import org.eclipse.dawnsci.plotting.api.trace.ITrace;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICheckStateListener;
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.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
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.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISourceProvider;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.part.ResourceTransfer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Main view of the Spectrum Perspective. Contains a table which shows the list of active files and 
* has actions for viewing and processing files in different ways.
* <p>
* Hold the SpectrumFileManager which takes care of loading and plotting files
*/
public class TraceProcessPage extends AbstractAlgorithmProcessPage {

    // Jake start using this more please :)
    private Logger logger = LoggerFactory.getLogger(TraceProcessPage.class);

    private SpectrumFileManager manager;
    private IPlottingSystem system;
    private CheckboxTableViewer viewer;
    private List<Color> orderedColors;
    private ProcessMenuManager processMenuManager;

    private Action removeAction;
    private Action configDefaults;

    public Composite createPartControl(Composite parent) {

        //Create table
        viewer = CheckboxTableViewer.newCheckList(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        viewer.setContentProvider(new ViewContentProvider());
        TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
        viewerColumn.setLabelProvider(new ViewLabelProvider());

        TableColumnLayout tableColumnLayout = new TableColumnLayout();
        tableColumnLayout.setColumnData(viewerColumn.getColumn(), new ColumnWeightData(1));
        parent.setLayout(tableColumnLayout);

        ColumnViewerToolTipSupport.enableFor(viewer);

        //Get plotting system from PlotView, use it to create file manager
        IWorkbenchPage page = getView().getSite().getPage();
        IViewPart view = page.findView("org.dawnsci.spectrum.ui.views.SpectrumPlot");
        system = (IPlottingSystem) view.getAdapter(IPlottingSystem.class);
        manager = new SpectrumFileManager(system);

        viewer.setInput(manager);

        manager.addFileListener(new ISpectrumFileListener() {

            @Override
            public void fileLoaded(final SpectrumFileOpenedEvent event) {
                Display.getDefault().syncExec(new Runnable() {
                    @Override
                    public void run() {
                        viewer.refresh();
                        viewer.setSelection(new StructuredSelection(event.getFile()), true);
                        viewer.setChecked(event.getFile(), true);
                    }
                });
            }
        });

        processMenuManager = new ProcessMenuManager(viewer, manager, system);

        getView().getSite().setSelectionProvider(viewer);

        //Set up drag-drop
        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();
                    for (int i = 0; i < obj.length; i++) {
                        if (obj[i] instanceof IFile) {
                            IFile file = (IFile) obj[i];
                            manager.addFile(file.getRawLocation().toOSString());
                        }
                    }
                } else if (dropData instanceof String[]) {
                    for (String path : (String[]) dropData) {
                        manager.addFile(path);
                    }
                }
            }
        };

        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);

        // Create the help context id for the viewer's control
        PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), "org.dawnsci.spectrum.viewer");
        makeActions();
        hookContextMenu();
        //hookDoubleClickAction();
        contributeToActionBars();

        //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) {
                    removeAction.run();
                }
            }
        });

        //Highlight trace on selection
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {

                List<ISpectrumFile> list = SpectrumUtils
                        .getSpectrumFilesList((IStructuredSelection) event.getSelection());
                for (ISpectrumFile file : manager.getFiles()) {
                    if (list.contains(file)) {
                        file.setSelected(true);
                    } else {
                        file.setSelected(false);
                    }
                }
            }
        });

        viewer.addCheckStateListener(new ICheckStateListener() {

            @Override
            public void checkStateChanged(CheckStateChangedEvent event) {
                // TODO Auto-generated method stub
                Object ob = event.getElement();

                if (ob instanceof ISpectrumFile) {
                    if (event.getChecked()) {
                        ((ISpectrumFile) ob).setShowPlot(true);
                    } else {
                        ((ISpectrumFile) ob).setShowPlot(false);
                    }
                }
            }
        });

        //set axis as tight
        List<IAxis> axes = system.getAxes();
        for (IAxis axis : axes)
            axis.setAxisAutoscaleTight(true);
        system.setColorOption(ColorOption.BY_NAME);

        // Currently we do not want the run actions visible
        final IToolBarManager man = getView().getViewSite().getActionBars().getToolBarManager();
        if (man.find(IAlgorithmProcessContext.RUN_ID_STUB) != null)
            man.find(IAlgorithmProcessContext.RUN_ID_STUB).setVisible(false);
        if (man.find(IAlgorithmProcessContext.STOP_ID_STUB) != null)
            man.find(IAlgorithmProcessContext.STOP_ID_STUB).setVisible(false);

        return viewer.getTable();
    }

    @Override
    public boolean showRunButtons() {
        return false;
    }

    @Override
    public String getTitle() {
        return "Traces";
    }

    @Override
    public void run(final IAlgorithmProcessContext context) throws Exception {

        if (manager.isEmpty()) {
            MessageDialog.openInformation(Display.getDefault().getActiveShell(), "Empty File List",
                    "There are currently no files to process.\n\nPlease double click to add files from the 'Trace Project' view.");
            return;
        }

        // We save the manager to file. This then is read by the file
        // reader source and each file is processed.
        final File exportFile = File.createTempFile("SpectrumFiles", ".csv");
        manager.export(exportFile); // saves out file list with data sets so that pipeline can process.

        System.setProperty("import.file.path", exportFile.getAbsolutePath());

        final Job process = new Job(context.getTitle()) {

            @Override
            protected IStatus run(IProgressMonitor monitor) {
                try {
                    final IFile moml = SpectrumWorkflowCreator.createWorkflowFileIfRequired("trace",
                            "trace_workflow.moml", context.getFullPath(), monitor);
                    context.execute(moml.getLocation().toOSString(), false, monitor);

                    return Status.OK_STATUS;

                } catch (Exception e) {
                    logger.error("Cannot process '" + context.getTitle() + "'", e);
                    return Status.CANCEL_STATUS;
                }
            }

        };
        process.setPriority(Job.SHORT);
        process.schedule(2);
    }

    @Override
    public ISourceProvider[] getSourceProviders() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getAdapter(final Class clazz) {
        if (clazz == SpectrumFileManager.class)
            return manager;
        return super.getAdapter(clazz);
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                TraceProcessPage.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getView().getSite().registerContextMenu(menuMgr, viewer);
    }

    private void contributeToActionBars() {
        IActionBars bars = getView().getViewSite().getActionBars();
        fillLocalPullDown(bars.getMenuManager());
        fillLocalToolBar(bars.getToolBarManager());
    }

    private void fillLocalPullDown(IMenuManager menuManager) {
        menuManager.add(removeAction);

        menuManager.add(new Separator());

        Action orderColors = new Action("Jet Color Plotted Traces",
                Activator.getImageDescriptor("icons/color.png")) {
            public void run() {

                if (orderedColors == null) {
                    final IPaletteService pservice = (IPaletteService) PlatformUI.getWorkbench()
                            .getService(IPaletteService.class);
                    PaletteData paletteData = pservice.getDirectPaletteData("Jet (Blue-Cyan-Green-Yellow-Red)");
                    RGB[] rgbs = paletteData.getRGBs();
                    orderedColors = new ArrayList<Color>(256);
                    Display display = Display.getDefault();
                    for (int i = 0; i < 256; i++) {
                        orderedColors.add(new Color(display, rgbs[i]));
                    }
                }

                Collection<ITrace> traces = system.getTraces(ILineTrace.class);
                double count = 0;
                for (ITrace trace : traces)
                    if (trace.isUserTrace())
                        count++;

                double val = 255 / (count - 1);
                int i = 0;
                for (ITrace trace : traces) {
                    if (trace.isUserTrace()) {
                        ((ILineTrace) trace).setTraceColor(orderedColors.get((int) val * i));
                        i++;
                    }

                }
            }
        };

        menuManager.add(orderColors);
        menuManager.add(new Separator());
        menuManager.add(configDefaults);
    }

    private void fillContextMenu(IMenuManager menuManager) {

        processMenuManager.fillProcessMenu(menuManager);

        menuManager.add(new Separator());

        if (((IStructuredSelection) viewer.getSelection()).size() == 1) {

            List<ISpectrumFile> file = SpectrumUtils
                    .getSpectrumFilesList((IStructuredSelection) viewer.getSelection());

            if (!file.isEmpty() && file.get(0) instanceof SpectrumInMemory) {
                menuManager.add(new Action("Save HDF5...") {
                    public void run() {
                        SpectrumWizard sw = new SpectrumWizard();
                        ISelection selection = viewer.getSelection();
                        List<IContain1DData> list = SpectrumUtils.get1DDataList((IStructuredSelection) selection);
                        WizardDialog wd = new WizardDialog(Display.getDefault().getActiveShell(), sw);
                        sw.addPage(new SaveFileWizardPage(new SaveProcess()));
                        sw.setData(list);
                        wd.open();
                    }
                });

                menuManager.add(new Action("Save text...") {
                    public void run() {
                        SpectrumWizard sw = new SpectrumWizard();
                        ISelection selection = viewer.getSelection();
                        List<IContain1DData> list = SpectrumUtils.get1DDataList((IStructuredSelection) selection);
                        WizardDialog wd = new WizardDialog(Display.getDefault().getActiveShell(), sw);
                        sw.addPage(new SaveFileWizardPage(new SaveTextProcess()));
                        sw.setData(list);
                        wd.open();
                    }
                });

                menuManager.add(new Separator());
            }
        }

        menuManager.add(removeAction);

        // Other plug-ins can contribute there actions here

        menuManager.add(new Separator());
        menuManager.add(new Action("Check Selected",
                Activator.imageDescriptorFromPlugin("org.dawnsci.spectrum.ui", "icons/ticked.png")) {
            @Override
            public void run() {
                setSelectionChecked(true);
            }

        });

        menuManager.add(new Action("Uncheck Selected",
                Activator.imageDescriptorFromPlugin("org.dawnsci.spectrum.ui", "icons/unticked.gif")) {
            @Override
            public void run() {
                setSelectionChecked(false);
            }

        });

        if (((IStructuredSelection) viewer.getSelection()).size() == 1) {

            menuManager.add(new Separator());

            menuManager.add(new Action("Open in Data Browsing Perspective", Activator
                    .imageDescriptorFromPlugin("org.dawnsci.spectrum.ui", "icons/application_view_gallery.png")) {
                @Override
                public void run() {
                    try {
                        ISelection selection = viewer.getSelection();
                        List<ISpectrumFile> list = SpectrumUtils
                                .getSpectrumFilesList((IStructuredSelection) selection);
                        if (list.isEmpty())
                            return;
                        if (!(list.get(0) instanceof SpectrumFile)) {
                            showMessage("Could not open perspective, operation not supported for this data!");
                            return;
                        }

                        PlatformUI.getWorkbench().showPerspective(
                                "org.edna.workbench.application.perspective.DataPerspective",
                                PlatformUI.getWorkbench().getActiveWorkbenchWindow());
                        EclipseUtils.openExternalEditor(list.get(0).getLongName());

                    } catch (WorkbenchException e) {
                        showMessage("Could not open perspective, operation not supported for this data! : "
                                + e.getMessage());
                        e.printStackTrace();
                    }
                }
            });
        }

        menuManager.add(new Separator());
        menuManager.add(configDefaults);
        menuManager.add(new Separator());
        menuManager.add(new Action("Copy Python Code to Clipboard",
                Activator.imageDescriptorFromPlugin("org.dawnsci.spectrum.ui", "icons/clipboard.png")) {
            @Override
            public void run() {
                String code = SpectrumUtils.getPythonLoadString(manager);
                Clipboard cb = new Clipboard(Display.getCurrent());
                TextTransfer textTransfer = TextTransfer.getInstance();
                cb.setContents(new Object[] { code }, new Transfer[] { textTransfer });
            }
        });
        menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    //   private void configureCacheActions(MenuManager manager) {
    //      
    //      MenuManager cacheMenu = new MenuManager("Cache");
    //      
    //      if (cachedFile != null) {
    //         cacheMenu.add(new Action(cachedFile.getName()) {
    //            @Override
    //            public void run() {
    //               //does nothing
    //            }
    //         });
    //      }
    //      
    //      cacheMenu.add(new Action("Set as cached") {
    //         @Override
    //         public void run() {
    //            ISelection selection = viewer.getSelection();
    //            List<IContain1DData> list = SpectrumUtils.get1DDataList((IStructuredSelection)selection);
    //            cachedFile = list.get(0);
    //         }
    //      });
    //      
    //      cacheMenu.add(new Action("Clear cached") {
    //         @Override
    //         public void run() {
    //            cachedFile = null;
    //         }
    //      });
    //      cacheMenu.setEnabled(false);
    //      manager.add(cacheMenu);
    //      
    //   }

    //   private void configureCacheArithmeticMenu(MenuManager menuManager) {
    //      
    //      MenuManager menu = new MenuManager("Arithmetic");
    //      
    //      AbstractProcess process = new SubtractionProcess(manager.getCachedFile());
    //      addProcessAction(process, menu, "Subtract cached",true);
    //      
    //      process = new DivisionProcess(manager.getCachedFile());
    //      addProcessAction(process, menu, "Divied by cached",true);
    //      
    //      menuManager.add(menu);
    //
    //      
    //   }

    //   private void addProcessAction(final AbstractProcess process, MenuManager manager, String name, boolean enabled) {
    //      //manager
    //      Action action = new Action(name) {
    //         public void run() {
    //            ISelection selection = viewer.getSelection();
    //            List<IContain1DData> list = SpectrumUtils.get1DDataList((IStructuredSelection)selection);
    //            List<IContain1DData> out = process.process(list);
    //            
    //            if (out == null) {
    //               showMessage("Could not process dataset, operation not supported for this data!");
    //               return;
    //            }
    //            
    //            for(IContain1DData data : out) {
    //               SpectrumInMemory mem = new SpectrumInMemory(data.getLongName(), data.getName(), data.getxDataset(), data.getyDatasets(), system);
    //               TraceProcessPage.this.manager.addFile(mem);
    //            }
    //         }
    //      };
    //      
    //      action.setEnabled(enabled);
    //      manager.add(action);
    //      
    //   }

    private void fillLocalToolBar(IToolBarManager manager) {

        final InjectPyDevConsoleAction console = new InjectPyDevConsoleAction(
                "Open plotted data in python console") {
            public void run() {
                setData(createData(system));
                super.run();
            }
        };
        console.setParameter(InjectPyDevConsole.CREATE_NEW_CONSOLE_PARAM, Boolean.TRUE.toString());
        console.setParameter(InjectPyDevConsole.SETUP_SCISOFTPY_PARAM,
                InjectPyDevConsole.SetupScisoftpy.ALWAYS.toString());
        console.setParameter(InjectPyDevConsole.VIEW_NAME_PARAM, system.getPlotName());

        manager.add(console);

        createXYFiltersActions(manager);

        manager.add(removeAction);
    }

    protected Map<String, IDataset> createData(IPlottingSystem system) {

        final Map<String, IDataset> data = new HashMap<String, IDataset>(3);
        final Collection<ITrace> traces = system.getTraces();
        for (ITrace iTrace : traces) {
            if (iTrace instanceof ILineTrace) {
                ILineTrace line = (ILineTrace) iTrace;
                final IDataset x = line.getXData();

                // We only make x's unique if they are not identical
                String xName = InjectPyDevConsole.getLegalVarName(x.getName()) + "_"
                        + InjectPyDevConsole.getLegalVarName(line.getName());
                if (data.containsKey(xName) && data.get(xName) != x) {
                    xName = InjectPyDevConsole.getLegalVarName(xName, data.keySet());
                }
                data.put(xName, x);

                final IDataset y = line.getYData();
                data.put(InjectPyDevConsole.getLegalVarName(y.getName(), data.keySet()), y);

            } else {
                data.put(InjectPyDevConsole.getLegalVarName(iTrace.getData().getName(), data.keySet()),
                        iTrace.getData());
            }
        }

        return data;
    }

    private void setSelectionChecked(boolean checked) {
        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
        List<ISpectrumFile> list = SpectrumUtils.getSpectrumFilesList(selection);

        for (ISpectrumFile file : list) {
            file.setShowPlot(checked);
            viewer.setChecked(file, checked);
        }
    }

    private void makeActions() {

        removeAction = new Action("Remove From List",
                Activator.imageDescriptorFromPlugin("org.dawnsci.spectrum.ui", "icons/delete.gif")) {
            public void run() {
                ISelection selection = viewer.getSelection();
                List<?> obj = ((IStructuredSelection) selection).toList();
                for (Object ob : obj)
                    manager.removeFile(((ISpectrumFile) ob).getLongName());
                //Todo change selection

                if (manager.isEmpty())
                    system.clear();
                int i = viewer.getTable().getItemCount();

                if (i > 0) {
                    Object ob = viewer.getTable().getItem(i - 1).getData();
                    viewer.setSelection(new StructuredSelection(ob), true);
                }

            }
        };

        removeAction.setToolTipText("Remove selected files from list");

        configDefaults = new Action("Configure Default Dataset Names...",
                Activator.imageDescriptorFromPlugin("org.dawnsci.spectrum.ui", "icons/book-brown-setting.png")) {
            @Override
            public void run() {
                PreferenceDialog pref = PreferencesUtil.createPreferenceDialogOn(
                        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
                        "org.dawnsci.spectrum.ui.preferences.page", null, null);
                if (pref != null)
                    pref.open();
            }
        };
    }

    private void showMessage(String message) {
        MessageDialog.openInformation(viewer.getControl().getShell(), "Sample View", message);
    }

    @Override
    public void dispose() {
        system.dispose();
        manager.dispose();
        if (orderedColors != null)
            for (Color color : orderedColors)
                color.dispose();
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    public void setFocus() {
        viewer.getControl().setFocus();
    }

    public void createXYFiltersActions(IToolBarManager manager) {

        final IFilterDecorator dec = PlottingFactory.createFilterDecorator(system);
        final AbstractPlottingFilter stack = new AbstractPlottingFilter() {

            @Override
            public int getRank() {
                return 1;
            }

            protected IDataset[] filter(IDataset x, IDataset y) {
                Collection<ITrace> traces = system.getTraces(ILineTrace.class);
                IDataset newY = Maths.add(DatasetUtils.norm((Dataset) y), (traces.size() * 0.2));
                newY.setName(y.getName());

                return new IDataset[] { x, newY };
            }
        };

        final AbstractPlottingFilter norm = new AbstractPlottingFilter() {

            @Override
            public int getRank() {
                return 1;
            }

            protected IDataset[] filter(IDataset x, IDataset y) {
                IDataset newY = DatasetUtils.norm((Dataset) y);
                return new IDataset[] { x, newY };
            }
        };

        final AbstractPlottingFilter offset = new AbstractPlottingFilter() {

            @Override
            public int getRank() {
                return 1;
            }

            protected IDataset[] filter(IDataset x, IDataset y) {
                Collection<ITrace> traces = system.getTraces(ILineTrace.class);
                IDataset newY = Maths.add(DatasetUtils.norm((Dataset) y), (traces.size() * 1));
                newY.setName(y.getName());

                return new IDataset[] { x, newY };
            }
        };

        IAction none = new Action("None", IAction.AS_RADIO_BUTTON) {
            public void run() {
                if (!isChecked())
                    return;
                dec.clear();
                replot();
            }

        };

        IAction normalize = new Action("Min/Max", IAction.AS_RADIO_BUTTON) {
            public void run() {
                if (!isChecked())
                    return;
                dec.clear();
                dec.addFilter(norm);
                replot();

            }
        };

        IAction stackAc = new Action("Stack", IAction.AS_RADIO_BUTTON) {
            public void run() {
                if (!isChecked())
                    return;
                dec.clear();
                dec.addFilter(stack);
                replot();
            }
        };

        IAction offAc = new Action("Offset", IAction.AS_RADIO_BUTTON) {
            public void run() {
                if (!isChecked())
                    return;
                dec.clear();
                dec.addFilter(offset);
                replot();
            }
        };

        MenuAction m = new MenuAction("Display");
        none.setChecked(true);
        m.add(none);
        m.add(normalize);
        m.add(stackAc);
        m.add(offAc);

        manager.add(m);
    }

    private void replot() {

        final Collection<ITrace> traces = system.getTraces(ILineTrace.class);
        for (ITrace trace : traces)
            system.removeTrace(trace);

        Collection<ISpectrumFile> files = manager.getFiles();
        for (ISpectrumFile file : files)
            file.plotAll();
        //final Collection<ITrace> traces = system.getTraces(ILineTrace.class);
        //      for (ITrace trace: traces) system.removeTrace(trace);
        //      for (ITrace trace: traces) system.addTrace(trace);
        system.autoscaleAxes();
    }

    class ViewContentProvider implements IStructuredContentProvider {
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
        }

        public void dispose() {
        }

        public Object[] getElements(Object parent) {
            return manager.getFiles().toArray();
        }
    }

    class ViewLabelProvider extends ColumnLabelProvider implements ITableLabelProvider {

        Image fileImage;
        Image memoryImage;

        public ViewLabelProvider() {
            fileImage = Activator.getImage("icons/Multiple.png");
            memoryImage = Activator.getImage("icons/MultipleDisk.png");
        }

        @Override
        public String getColumnText(Object obj, int index) {
            return getText(obj);
        }

        public Image getColumnImage(Object obj, int index) {
            return getImage(obj);
        }

        @Override
        public String getText(Object obj) {
            if (obj instanceof ISpectrumFile) {
                return ((ISpectrumFile) obj).getName();
            }

            return "";
        }

        @Override
        public Image getImage(Object obj) {

            if (!(obj instanceof ISpectrumFile)) {
                return null;
            }

            ISpectrumFile file = (ISpectrumFile) obj;

            if (file.canBeSaved())
                return memoryImage;
            else
                return fileImage;
        }

        @Override
        public String getToolTipText(Object obj) {
            if (obj instanceof ISpectrumFile) {
                return ((ISpectrumFile) obj).getLongName();
            }

            return "";
        }

        @Override
        public void dispose() {
            super.dispose();

            memoryImage.dispose();
            fileImage.dispose();
        }
    }
}