uk.ac.diamond.scisoft.analysis.rcp.results.navigator.DataNavigator.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.diamond.scisoft.analysis.rcp.results.navigator.DataNavigator.java

Source

/*
 * Copyright 2012 Diamond Light Source Ltd.
 * 
 * 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 uk.ac.diamond.scisoft.analysis.rcp.results.navigator;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.FileTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import uk.ac.diamond.scisoft.analysis.rcp.results.navigator.actions.OpenDataFileAction;
import uk.ac.gda.common.rcp.util.IFileUtils;
import uk.ac.gda.common.rcp.util.PathUtils;
import uk.ac.gda.ui.file.AlphaNumericFileSorter;
import uk.ac.gda.ui.file.DateFileSorter;
import uk.ac.gda.ui.file.IFileTreeColumnProvider;
import uk.ac.gda.ui.file.IFileTreeContentProvider;
import uk.ac.gda.ui.file.IFileTreeLabelProvider;
import uk.ac.gda.ui.file.SizeFileSorter;
import uk.ac.gda.ui.viewer.ViewerFilterFactory;

/**
 * 
 */
// no longer used by GDA client - to be removed after release 8.14
@Deprecated
public class DataNavigator extends ViewPart {

    public static final String DATA_PROJECT_NAME = "Data";

    public static final String DATA_WORKINGSET_NAME = "Data";

    private static final Logger logger = LoggerFactory.getLogger(DataNavigator.class);

    /**
     * Do not break encapsulation, leave private.
     */
    private static String DEFAULT_FILE_PATH = PathUtils.createFromDefaultProperty();

    /**
     * 
     */
    public static final String ID = "uk.ac.diamond.scisoft.analysis.rcp.results.navigator.ResultsNavigator"; //$NON-NLS-1$

    private TreeViewer resultsViewer;
    private IProject project;

    /**
     * 
     */
    public DataNavigator() {
        final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        this.project = root.getProject(DATA_PROJECT_NAME);
    }

    /**
     * Create contents of the view part.
     * @param parent
     */
    @Override
    public void createPartControl(Composite parent) {

        this.resultsViewer = new TreeViewer(parent,
                SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI);

        ColumnViewerToolTipSupport.enableFor(resultsViewer);

        final TreeViewerColumn name = new TreeViewerColumn(resultsViewer, SWT.NONE, 0);
        name.setLabelProvider(new IFileTreeColumnProvider());
        name.getColumn().setText("Name");
        name.getColumn().setWidth(350);
        name.getColumn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                resultsViewer.setComparator(new AlphaNumericFileSorter());
            }
        });

        final TreeViewerColumn size = new TreeViewerColumn(resultsViewer, SWT.NONE, 1);
        size.getColumn().setText("Size");
        size.getColumn().setWidth(100);
        size.getColumn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                resultsViewer.setComparator(new SizeFileSorter());
            }
        });

        final TreeViewerColumn date = new TreeViewerColumn(resultsViewer, SWT.NONE, 2);
        date.getColumn().setText("Date Modified");
        date.getColumn().setWidth(250);
        date.getColumn().addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                resultsViewer.setComparator(new DateFileSorter());
            }
        });

        resultsViewer.setColumnProperties(new String[] { "Name", "Size", "Date Modified" });
        resultsViewer.setUseHashlookup(true);
        resultsViewer.setContentProvider(new IFileTreeContentProvider(project));
        resultsViewer.setLabelProvider(new IFileTreeLabelProvider());
        resultsViewer.getTree().setHeaderVisible(true);

        //resultsViewer.setInput(rootFile);
        //resultsViewer.expandToLevel(3);
        try {
            setupProject(project, null);
        } catch (Exception e1) {
            logger.error("Cannot create project", e1);
        }
        IWorkingSetManager workingSetManager = PlatformUI.getWorkbench().getWorkingSetManager();
        if (workingSetManager.getWorkingSet(DATA_WORKINGSET_NAME) == null) {
            workingSetManager.addWorkingSet(
                    workingSetManager.createWorkingSet(DATA_WORKINGSET_NAME, new IAdaptable[] { project }));
        }

        getSite().setSelectionProvider(resultsViewer);

        createRightClickMenu();
        createDragSupport(resultsViewer);
        createActions();
        initializeToolBar();
        initializeMenu();

        addSelectionListener(resultsViewer);

    }

    @Override
    public void dispose() {
        super.dispose();
        if (getSite().getSelectionProvider() != null) {
            ((Viewer) getSite().getSelectionProvider()).getControl().dispose();
        }
    }

    private void createDragSupport(final TreeViewer viewer) {
        // We allow people to copy files from the run folder into another folder.
        int ops = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_DEFAULT;
        Transfer[] transfers = new Transfer[] { FileTransfer.getInstance() };
        viewer.addDragSupport(ops, transfers, new DragSourceListener() {
            @Override
            public void dragStart(DragSourceEvent event) {
                // Do nothing
            }

            @Override
            public void dragSetData(DragSourceEvent event) {
                event.doit = false;
                if (FileTransfer.getInstance().isSupportedType(event.dataType)) {
                    final IResource file = (IResource) ((IStructuredSelection) viewer.getSelection())
                            .getFirstElement();
                    if (file == null)
                        return;
                    if (!file.exists())
                        return;
                    if (file instanceof IContainer)
                        return;
                    final String[] files = new String[1];
                    files[0] = file.getLocation().toOSString();
                    event.data = files;
                    event.doit = true;
                }
            }

            @Override
            public void dragFinished(DragSourceEvent event) {
                // Do nothing
            }

        });
    }

    //    @Override
    //   public void init(IViewSite site, IMemento memento) throws PartInitException {
    //       super.init(site, memento);
    //    }

    private void addSelectionListener(TreeViewer resultsViewer) {
        resultsViewer.getTree().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseDoubleClick(MouseEvent evt) {
                try {
                    (new OpenDataFileAction(true)).execute(null);
                } catch (ExecutionException e) {
                    logger.error("Cannot open nexus file", e);
                }
            }
        });
    }

    /** Adds any actions from the extensions tree to the right click menu.**/
    private void createRightClickMenu() {
        final MenuManager menuManager = new MenuManager();

        final Control control = ((Viewer) getSite().getSelectionProvider()).getControl();
        control.setMenu(menuManager.createContextMenu(control));
        getSite().registerContextMenu(menuManager, getSite().getSelectionProvider());
    }

    /**
     * Create the actions.
     */
    private void createActions() {
        // Create the actions
    }

    /**
     * Initialize the toolbar.
     */
    private void initializeToolBar() {
        getViewSite().getActionBars().getToolBarManager();
    }

    /**
     * Initialize the menu.
     */
    private void initializeMenu() {
        getViewSite().getActionBars().getMenuManager();
    }

    @Override
    public void setFocus() {
        if (getSite().getShell().isDisposed())
            return;
        ((TreeViewer) getSite().getSelectionProvider()).getControl().setFocus();
    }

    /**
     * FIXME may need to deal with large file systems better.
     * Refresh the view (reload files).
     */
    public void refresh() {
        ((TreeViewer) getSite().getSelectionProvider()).refresh();
    }

    /**
     * 
     */
    public void refreshFolder() {
        final TreeViewer viewer = (TreeViewer) getSite().getSelectionProvider();
        final IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
        if (sel == null)
            return;
        if (sel.getFirstElement() == null)
            return;
        if (sel.getFirstElement() instanceof IResource) {
            IResource file = (IResource) sel.getFirstElement();
            if (!(file instanceof IContainer))
                file = file.getParent();
            try {
                file.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
            } catch (CoreException e) {
                logger.error("Cannot refresh " + file, e);
            }
            viewer.refresh(file, true);
        }
    }

    /**
     * Call to set the root path of the data tree.
     * @param path
     */
    public void setSelectedPath(String path) {
        final TreeViewer viewer = (TreeViewer) getSite().getSelectionProvider();
        try {
            setupProject(project, path);
            viewer.refresh();
        } catch (Exception ne) {
            logger.error("Cannot set project " + path, ne);
        }

    }

    public void setSelected(final ISelection i) {
        resultsViewer.setSelection(i);
    }

    /**
     * Used by tests to override the folder that the navigator will start with.
     * @param folder
     */
    public static void setDefaultDataFolder(final String folder) {
        DEFAULT_FILE_PATH = folder;
    }

    /**
     * Call with string path fragment below the current selected folder.
     * @param frag
     * @throws Exception 
     */
    public void setSelected(String frag) throws Exception {
        final IResource sel = getResource(frag);
        if (!sel.exists())
            throw new Exception("Cannot find file " + sel);

        final TreeViewer viewer = (TreeViewer) getSite().getSelectionProvider();
        viewer.setSelection(new StructuredSelection(sel));
    }

    private ViewerFilter nexusFilter;
    private ViewerFilter datFilter;

    public void setNexusFilter(boolean filter) {

        if (nexusFilter == null)
            nexusFilter = ViewerFilterFactory.createFileExtensionFilter(".nxs");
        if (filter) {
            resultsViewer.addFilter(nexusFilter);
        } else {
            resultsViewer.removeFilter(nexusFilter);
        }
    }

    public void setAsciiFilter(boolean filter) {

        if (datFilter == null)
            datFilter = ViewerFilterFactory.createFileExtensionFilter(".dat");
        if (filter) {
            resultsViewer.addFilter(datFilter);
        } else {
            resultsViewer.removeFilter(datFilter);
        }
    }

    public void resetFilters() {
        resultsViewer.resetFilters();
    }

    /**
     * Gets the data project (made new) with this absolute path connected as the only
     * sub-folder.
     * 
     * @param dataPath
     * @throws CoreException 
     */
    public void setupProject(final IProject data, String dataPath) throws Exception {

        if (dataPath == null) {
            if (data.exists()) {
                final IResource[] members = project.members();
                for (int i = 0; i < members.length; i++) {
                    if (members[i] instanceof IContainer)
                        dataPath = members[i].getLocation().toOSString();
                }
            } else {
                dataPath = PathUtils.createFromDefaultProperty();
            }
        }

        final Path path = new Path(dataPath);
        if (data.exists()) {
            final IFolder src = data.getFolder(path.toFile().getName());
            final String cp = src.getLocation().toOSString();
            final String pp = path.toOSString();
            if (src.exists() && cp.equals(pp)) {
                resultsViewer.setInput(data);
                return;
            }
        }

        final IWorkspace workspace = ResourcesPlugin.getWorkspace();
        IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
            @Override
            public void run(IProgressMonitor monitor) throws CoreException {
                if (!data.exists()) {
                    data.create(monitor);
                    data.open(monitor);
                }

                final IResource[] members = project.members();
                for (int i = 0; i < members.length; i++) {
                    if (members[i] instanceof IContainer)
                        members[i].delete(false, monitor);
                }

                // Create links to subfolders of data folder so that we can ignore .workspace
                // in case it is a sub-folder of the data folder.
                final IFolder src = data.getFolder(path.lastSegment());
                final IPath workspacePath = ResourcesPlugin.getWorkspace().getRoot().getLocation();
                if (!path.isPrefixOf(workspacePath)) {
                    src.createLink(path, IResource.DEPTH_INFINITE, monitor);
                } else {
                    src.create(false, true, monitor);
                    // Deals with .workspace being under what is linked.
                    IFileUtils.createLinks(src, path, monitor);
                }

                project.refreshLocal(IResource.DEPTH_INFINITE, null);
                workspace.validateProjectLocation(project, project.getFullPath());

                getSite().getShell().getDisplay().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        resultsViewer.setInput(data);
                    }
                });
            }
        };
        workspace.run(runnable, workspace.getRuleFactory().modifyRule(workspace.getRoot()), IResource.NONE, null);
    }

    private IResource getResource(String frag) {
        final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        final IProject data = root.getProject(DATA_PROJECT_NAME);
        if (data == null || !data.exists())
            return null;
        final Path path = new Path(frag);
        IResource member = data.findMember(path);
        return member;
    }

    public static String getDefaultFilePath() {
        return DEFAULT_FILE_PATH;
    }
}