package org.codefaces.ui.internal.views;
import java.util.HashMap;
import java.util.Map;
import org.codefaces.core.events.WorkspaceChangedEvent;
import org.codefaces.core.events.WorkspaceChangedListener;
import org.codefaces.core.models.RepoFile;
import org.codefaces.core.models.RepoResource;
import org.codefaces.core.models.RepoResourceType;
import org.codefaces.core.models.RepoWorkspace;
import org.codefaces.ui.internal.StatusManager;
import org.codefaces.ui.internal.commands.CommandExecutor;
import org.codefaces.ui.internal.commands.OpenFileCommandHandler;
import org.codefaces.ui.internal.commons.RepoFolderOpenListener;
import org.codefaces.ui.internal.commons.RepoResourceComparator;
import org.codefaces.ui.internal.commons.RepoResourceContentProvider;
import org.codefaces.ui.internal.commons.RepoResourceLabelProvider;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
public class ProjectExplorerViewPart extends ViewPart {
public static final String ID = "org.codefaces.ui.view.projectExplorer";
private static final String VIEWER_CONTEXT_MENU_ID = ID + "#viewer";
private TreeViewer viewer;
private StatusManager statusManager;
private UpdateInputListener workspaceChangedListener = new UpdateInputListener();
private final class UpdateInputListener implements WorkspaceChangedListener {
@Override
public void workspaceChanged(WorkspaceChangedEvent evt) {
viewer.refresh();
}
}
private class FileOpenListener implements IOpenListener {
@Override
public void open(OpenEvent event) {
IStructuredSelection selection = (IStructuredSelection) event
.getSelection();
if (selection.isEmpty()
|| !(selection.getFirstElement() instanceof RepoResource)) {
return;
}
RepoResource clickedRepoResource = (RepoResource) selection
.getFirstElement();
if (clickedRepoResource.getType() == RepoResourceType.FILE) {
Map<String, String> parameterMap = new HashMap<String, String>();
parameterMap.put(OpenFileCommandHandler.PARAM_MODE,
OpenFileCommandHandler.MODE_DIRECT_FILES);
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put(OpenFileCommandHandler.VARIABLE_FILES,
new RepoFile[] { (RepoFile) clickedRepoResource });
CommandExecutor.execute(OpenFileCommandHandler.ID,
parameterMap, variableMap);
}
}
}
@Override
public void createPartControl(Composite parent) {
createViewer(parent);
hookWorkspaceChangedListener();
statusManager = new StatusManager(getViewSite().getActionBars()
.getStatusLineManager(), getViewer());
registerContextMenu(viewer);
}
private void hookWorkspaceChangedListener() {
RepoWorkspace workspce = RepoWorkspace.getCurrent();
workspce.addWorkspaceChangeListener(workspaceChangedListener);
}
@Override
public void dispose() {
unhookWorkspaceChangedListener();
super.dispose();
}
private void unhookWorkspaceChangedListener() {
RepoWorkspace workspce = RepoWorkspace.getCurrent();
workspce.removeWorkspaceChangeListener(workspaceChangedListener);
}
/**
* create and register a context menu associate to the explorer tree viewer
*
* @param viewer
* - the project explorer tree-viewer
*/
private void registerContextMenu(TreeViewer viewer) {
MenuManager contextMenuManager = new MenuManager();
contextMenuManager.add(new Separator(
IWorkbenchActionConstants.MB_ADDITIONS));
Menu menu = contextMenuManager.createContextMenu(viewer.getControl());
viewer.getControl().setMenu(menu);
getSite().registerContextMenu(VIEWER_CONTEXT_MENU_ID,
contextMenuManager, viewer);
getSite().setSelectionProvider(viewer);
}
public StatusManager getStatusManager() {
return statusManager;
}
/**
* Create and initialize the viewer
*/
private void createViewer(Composite parent) {
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.BORDER);
viewer.setContentProvider(new RepoResourceContentProvider());
viewer.setLabelProvider(new RepoResourceLabelProvider());
viewer.setComparator(new RepoResourceComparator());
viewer.addOpenListener(new FileOpenListener());
viewer.addOpenListener(new RepoFolderOpenListener());
viewer.setInput(RepoWorkspace.getCurrent());
}
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
public TreeViewer getViewer() {
return viewer;
}
}