com.meikas.eclipse.recentfiles.views.RecentFilesView.java Source code

Java tutorial

Introduction

Here is the source code for com.meikas.eclipse.recentfiles.views.RecentFilesView.java

Source

/*******************************************************************************
 * Copyright (c) 2009 Ivar Meikas, Codehoop OU and others.
 * 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
 *
 * Contributors:
 *     Ivar Meikas
 *******************************************************************************/
package com.meikas.eclipse.recentfiles.views;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Iterator;

import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.Action;
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.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageListener;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.ide.IDE.SharedImages;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import com.meikas.eclipse.recentfiles.Activator;
import com.meikas.eclipse.recentfiles.core.store.FileLink;
import com.meikas.eclipse.recentfiles.core.store.FileLinkStore;

/**
 * 
 * @author Ivar Meikas <ivar@codehoop.com>
 */

public class RecentFilesView extends ViewPart {

    private static final String BOOKMARKED_FILES = "bookmarkedFiles";

    private static FileLinkStore fileLinkStore = new FileLinkStore();

    /**
     * The ID of the view as specified by the extension.
     */
    public static final String ID = "com.meikas.eclipse.recentfiles.views.RecentFilesView";

    private TableViewer viewer;
    private Action addAction;
    private Action toggleAction;
    private Action removeAction;
    private Action doubleClickAction;

    private boolean called = false;

    private TableColumn mainColumn;

    /*
     * The content provider class is responsible for providing objects to the
     * view. It can wrap existing objects in adapters or simply return objects
     * as-is. These objects may be sensitive to the current input of the view,
     * or ignore it and always show the same content (like Task List, for
     * example).
     */

    /**
     * The constructor.
     */
    public RecentFilesView() {
    }

    @Override
    public void init(IViewSite site) throws PartInitException {
        super.init(site);
        addListeners();
    }

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

        if (memento != null)
            restoreBookmarks(memento.getString(BOOKMARKED_FILES));

    }

    private void restoreBookmarks(String value) {
        if (value == null || value.length() < 1)
            return;
        Activator.logMessage("Deserializing \"" + value + "\"", null, IStatus.INFO);
        String[] split = value.split(",");
        for (String string : split) {
            try {
                FileLink deserialized = FileLink.getDeserialized(string);
                fileLinkStore.addBookmark(deserialized);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        }
    }

    private void addListeners() {
        if (called)
            return;
        called = true;
        final IPartListener partListener = createPartListener();
        IPageListener pageListener = createPageListener(partListener);

        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        window.addPageListener(pageListener);
        IWorkbenchPage[] pages = window.getPages();
        for (IWorkbenchPage p : pages) {
            p.addPartListener(partListener);
        }
    }

    private IPageListener createPageListener(final IPartListener partListener) {
        IPageListener pageListener = new IPageListener() {

            @Override
            public void pageOpened(IWorkbenchPage page) {
                page.addPartListener(partListener);
            }

            @Override
            public void pageClosed(IWorkbenchPage page) {
                page.removePartListener(partListener);
            }

            @Override
            public void pageActivated(IWorkbenchPage page) {
            }
        };
        return pageListener;
    }

    private IPartListener createPartListener() {
        final IPartListener partListener = new IPartListener() {

            @Override
            public void partOpened(IWorkbenchPart part) {
                updateList(part);
            }

            @Override
            public void partDeactivated(IWorkbenchPart part) {
            }

            @Override
            public void partClosed(IWorkbenchPart part) {
            }

            @Override
            public void partBroughtToTop(IWorkbenchPart part) {
            }

            @Override
            public void partActivated(IWorkbenchPart part) {
                updateList(part);
            }

            private void updateList(IWorkbenchPart part) {
                boolean isEditor = part instanceof IEditorPart;
                if (isEditor) {
                    addFile((IEditorPart) part, false);
                }
            }
        };
        return partListener;
    }

    /**
     * This is a callback that will allow us to create the viewer and initialize
     * it.
     */
    public void createPartControl(Composite parent) {
        viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        Table table = viewer.getTable();
        // table.setHeaderVisible(true);
        TableColumn tc = new TableColumn(table, SWT.LEFT);
        mainColumn = new TableColumn(table, SWT.LEFT);
        tc.setWidth(20);
        mainColumn.pack();
        viewer.setContentProvider(new ViewContentProvider(fileLinkStore));
        viewer.setLabelProvider(new ViewLabelProvider());
        // viewer.setSorter(new NameSorter());
        viewer.setInput(getViewSite());
        makeActions();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();
    }

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

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

    private void fillLocalPullDown(IMenuManager manager) {
        manager.add(toggleAction);
        manager.add(new Separator());
        manager.add(addAction);
        manager.add(removeAction);
    }

    private void fillContextMenu(IMenuManager manager) {
        manager.add(toggleAction);
        manager.add(removeAction);
        // Other plug-ins can contribute there actions here
        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        manager.add(toggleAction);
        manager.add(addAction);
        manager.add(removeAction);
    }

    private void makeActions() {

        createAddAction();
        createToggleAction();
        createRemoveAction();
        createDoubleClickAction();
    }

    private void createDoubleClickAction() {
        doubleClickAction = new Action() {
            public void run() {
                ISelection selection = viewer.getSelection();
                Object obj = ((IStructuredSelection) selection).getFirstElement();
                if (obj instanceof FileLink) {
                    FileLink f = (FileLink) obj;
                    openEditor(f);
                }
            }
        };
    }

    private void createRemoveAction() {
        removeAction = new Action() {
            public void run() {
                int selectionStart = viewer.getTable().getSelectionIndex();

                removeSelectedLinks((IStructuredSelection) viewer.getSelection());
                setNewSelection(selectionStart);

                viewer.refresh();
            }

            private void setNewSelection(int selectionIndex) {
                int lastItemIndex = viewer.getTable().getItemCount() - 1;
                selectionIndex = Math.min(selectionIndex, lastItemIndex);
                viewer.getTable().setSelection(selectionIndex);
            }

            private void removeSelectedLinks(IStructuredSelection sel) {
                for (Iterator iterator = sel.iterator(); iterator.hasNext();) {
                    Object obj = iterator.next();
                    if (obj instanceof FileLink) {
                        FileLink f = (FileLink) obj;
                        fileLinkStore.remove(f);
                    }
                }
            }
        };

        removeAction.setText("Remove file");
        removeAction.setToolTipText("Remove file from the list");
        ImageDescriptor deleteImage = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
                "/icons/delete.png");
        removeAction.setImageDescriptor(deleteImage);
    }

    private void createToggleAction() {
        toggleAction = new Action() {

            public void run() {

                ISelection selection = viewer.getSelection();
                IStructuredSelection sel = (IStructuredSelection) selection;

                for (Iterator iterator = sel.iterator(); iterator.hasNext();) {
                    Object obj = iterator.next();
                    if (obj instanceof FileLink) {
                        FileLink f = (FileLink) obj;
                        toggleBookmark(f);
                    }
                }
            }

            private void toggleBookmark(FileLink f) {
                if (f.isBookmark()) {
                    fileLinkStore.remove(f);
                    f.setBookmark(false);
                    fileLinkStore.add(f);
                } else {
                    fileLinkStore.addBookmark(f);
                }
                viewer.refresh();
            }
        };
        toggleAction.setText("Toggle bookmark");
        toggleAction.setToolTipText("Toggle selection bookmark status");
        ImageDescriptor bookmarkImage = PlatformUI.getWorkbench().getSharedImages()
                .getImageDescriptor(SharedImages.IMG_OBJS_BKMRK_TSK);
        toggleAction.setImageDescriptor(bookmarkImage);
    }

    private void createAddAction() {
        addAction = new Action() {

            public void run() {
                IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();

                IEditorPart activeEditor = window.getActivePage().getActiveEditor();
                addFile(activeEditor, true);
            }
        };
        addAction.setText("Bookmark editor");
        addAction.setToolTipText("Add current editors file as bookmark");
        ImageDescriptor addImage = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID,
                "/icons/add.png");
        addAction.setImageDescriptor(addImage);
    }

    private void hookDoubleClickAction() {
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                doubleClickAction.run();
            }
        });
    }

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

    private static void openEditor(FileLink f) {
        IFileStore file = getFile(f);

        IFileInfo i = file.fetchInfo();
        if (i.exists() && !i.isDirectory()) {
            IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
            try {
                IDE.openEditorOnFileStore(page, file);
            } catch (PartInitException e) {
                Activator.logErrorMessage("openEditor failed", e);
            }
        } else {
            // TODO Do something if the file does not exist
            Activator.logMessage("File Not found", null, IStatus.WARNING);
        }

    }

    private static IFileStore getFile(FileLink f) {
        IFileStore file;
        if (f.isRelative()) {
            file = EFS.getLocalFileSystem().getStore(Platform.getLocation().append(f.getFileName()));
        } else {
            file = EFS.getLocalFileSystem().getStore(f.getFileUri());
        }
        return file;
    }

    @Override
    public void saveState(IMemento memento) {
        super.saveState(memento);

        StringBuffer buf = createSerializedLinks(fileLinkStore.getObjectList());

        memento.putString(BOOKMARKED_FILES, buf.toString());

    }

    private StringBuffer createSerializedLinks(Object[] objectList) {
        StringBuffer buf = new StringBuffer();
        for (Object object : objectList) {
            FileLink fl = (FileLink) object;
            if (fl.isBookmark())
                buf.append(fl.getSerialized()).append(",");
        }
        return buf;
    }

    private void addFile(IEditorPart activeEditor, boolean bookmark) {
        IEditorInput ei = activeEditor.getEditorInput();

        if (ei instanceof IURIEditorInput) {
            IURIEditorInput urieditor = (IURIEditorInput) ei;
            URI uri = urieditor.getURI();
            FileLink fileLink = new FileLink(uri);
            fileLink.setRelative(!uri.isAbsolute());
            try {
                if (bookmark)
                    fileLinkStore.addBookmark(fileLink);
                else
                    fileLinkStore.add(fileLink);
                viewer.refresh();
                mainColumn.pack();
            } catch (SWTException e) {
                Activator.logErrorMessage(e.getMessage(), e);
            }
        }
    }

}