/*
* 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();
}
}