monolipse.ui.views.BooExplorerView.java Source code

Java tutorial

Introduction

Here is the source code for monolipse.ui.views.BooExplorerView.java

Source

/*
 * Boo Development Tools for the Eclipse IDE
 * Copyright (C) 2005 Rodrigo B. de Oliveira (rbo@acm.org)
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */
package monolipse.ui.views;

import java.util.*;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jdt.ui.IContextMenuConstants;
import org.eclipse.jface.action.*;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.actions.*;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.*;
import org.eclipse.ui.views.navigator.ResourcePatternFilter;

public class BooExplorerView extends ViewPart implements ISetSelectionTarget {

    public final static String ID_VIEW = "monolipse.ui.views.BooExplorerView";

    private TreeViewer _viewer;

    private DrillDownAdapter _drillDownAdapter;

    BooExplorerActionGroup _actionGroup;

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

    class RefreshOnProjectChange implements IResourceChangeListener {

        public void resourceChanged(IResourceChangeEvent event) {
            IResource resource = event.getResource();
            if (null == resource || IResource.PROJECT == resource.getType()) {
                getDisplay().asyncExec(new Runnable() {
                    public void run() {
                        refresh();
                    }
                });
            }
        }
    };

    class RefreshOnBuild implements IResourceChangeListener {

        public void resourceChanged(IResourceChangeEvent event) {
            try {
                final Set<IProject> projects = new HashSet<IProject>();
                event.getDelta().accept(new IResourceDeltaVisitor() {
                    public boolean visit(IResourceDelta delta) throws CoreException {
                        projects.add(delta.getResource().getProject());
                        return false;
                    }
                });
                for (Iterator<IProject> i = projects.iterator(); i.hasNext();) {
                    final Object project = i.next();
                    getDisplay().asyncExec(new Runnable() {
                        public void run() {
                            if (!isDisposed()) {
                                _viewer.refresh(project, true);
                            }
                        }
                    });
                }
            } catch (CoreException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * This is a callback that will allow us to create the _viewer and
     * initialize it.
     */
    public void createPartControl(Composite parent) {
        _viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        _drillDownAdapter = new DrillDownAdapter(_viewer);
        _viewer.setUseHashlookup(true);

        _viewer.setSorter(new ViewerSorter() {
            public int category(Object element) {
                if (element instanceof IResource) {
                    return 10 - ((IResource) element).getType();
                }
                return 0;
            }
        });

        configureViewFilters();

        _viewer.setContentProvider(new BooExplorerContentProvider());
        _viewer.setLabelProvider(new BooExplorerLabelProvider());
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        _viewer.setInput(workspace);
        getSite().setSelectionProvider(_viewer);

        workspace.addResourceChangeListener(new RefreshOnProjectChange(), IResourceChangeEvent.POST_CHANGE);
        workspace.addResourceChangeListener(new RefreshOnBuild(), IResourceChangeEvent.POST_BUILD);

        createActionGroups();
        hookContextMenu();
        hookDoubleClickAction();
        contributeToActionBars();
    }

    private void configureViewFilters() {
        ResourcePatternFilter resourcePatternFilter = new ResourcePatternFilter();
        resourcePatternFilter.setPatterns(new String[] { ".*" });
        _viewer.addFilter(resourcePatternFilter);

        _viewer.addFilter(DerivedResourceFilter.DEFAULT);
    }

    private void createActionGroups() {
        _actionGroup = new BooExplorerActionGroup(this);
    }

    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                BooExplorerView.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) {
    }

    private void fillContextMenu(IMenuManager menu) {

        createStandardMenuGroups(menu);

        _drillDownAdapter.addNavigationActions(menu);
        menu.add(new Separator());

        _actionGroup.setContext(new ActionContext(getSelection()));
        _actionGroup.fillContextMenu(menu);
        _actionGroup.setContext(null);

    }

    private void createStandardMenuGroups(IMenuManager menu) {
        menu.add(new Separator(IContextMenuConstants.GROUP_NEW));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_GOTO));
        menu.add(new Separator(IContextMenuConstants.GROUP_OPEN));
        menu.add(new GroupMarker(IContextMenuConstants.GROUP_SHOW));
        menu.add(new Separator(IContextMenuConstants.GROUP_REORGANIZE));
        menu.add(new Separator(IContextMenuConstants.GROUP_GENERATE));
        menu.add(new Separator(IContextMenuConstants.GROUP_SEARCH));
        menu.add(new Separator(IContextMenuConstants.GROUP_BUILD));
        menu.add(new Separator(IContextMenuConstants.GROUP_ADDITIONS));
        menu.add(new Separator(IContextMenuConstants.GROUP_VIEWER_SETUP));
        menu.add(new Separator(IContextMenuConstants.GROUP_PROPERTIES));
    }

    private IStructuredSelection getSelection() {
        return (IStructuredSelection) _viewer.getSelection();
    }

    private void fillLocalToolBar(IToolBarManager manager) {
        _drillDownAdapter.addNavigationActions(manager);
    }

    private void hookDoubleClickAction() {
        _viewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                try {
                    Object selectedElement = ((IStructuredSelection) event.getSelection()).getFirstElement();
                    if (selectedElement instanceof IResource) {
                        openResource((IResource) selectedElement);
                    } else if (selectedElement instanceof IAdaptable) {
                        PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(getSite().getShell(),
                                (IAdaptable) selectedElement, null, null, null);
                        dialog.setBlockOnOpen(true);
                        dialog.open();
                    }
                } catch (PartInitException e) {
                    e.printStackTrace();
                }
            }

            private void openResource(IResource resource) throws PartInitException {
                if (IResource.FILE == resource.getType()) {
                    // TODO: use openAction here
                    IDE.openEditor(getWorkbench().getActiveWorkbenchWindow().getActivePage(), (IFile) resource);
                } else if (IResource.FOLDER == resource.getType()) {
                    _drillDownAdapter.goInto(resource);
                }
            }
        });
    }

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

    IWorkbench getWorkbench() {
        return PlatformUI.getWorkbench();
    }

    public void selectReveal(ISelection selection) {
        _viewer.setSelection(selection, true);
    }

    private Display getDisplay() {
        return _viewer.getControl().getDisplay();
    }

    private void refresh() {
        if (!isDisposed()) {
            Object[] elements = _viewer.getExpandedElements();
            _viewer.refresh();
            _viewer.setExpandedElements(elements);
        }
    }

    private boolean isDisposed() {
        return _viewer.getControl().isDisposed();
    }
}