/*******************************************************************************
* Copyright (c) 2008 Scott Stanchfield
* 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
*******************************************************************************/
package com.javadude.dependencies;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.KeyHandler;
import org.eclipse.gef.KeyStroke;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.gef.ui.actions.DeleteAction;
import org.eclipse.gef.ui.actions.RedoAction;
import org.eclipse.gef.ui.actions.UndoAction;
import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
import com.javadude.dependencies.editparts.WorkspaceEditPartFactory;
public class DependencyView extends ViewPart {
private ScrollingGraphicalViewer viewer;
@Override
public void createPartControl(Composite parent) {
viewer = new ScrollingGraphicalViewer();
viewer.createControl(parent);
// set the edit part factory
viewer.setEditPartFactory(new WorkspaceEditPartFactory(getSite().getPage()));
viewer.setContents(ResourcesPlugin.getWorkspace().getRoot());
// create the edit domain
EditDomain editDomain = new EditDomain();
editDomain.addViewer(viewer);
viewer.setEditDomain(editDomain);
// create and enable the delete, undo, and redo actions
final DeleteAction deleteAction = new DeleteAction(this);
UndoAction undoAction = new UndoAction(this);
RedoAction redoAction = new RedoAction(this);
deleteAction.setEnabled(true);
redoAction.setEnabled(true);
undoAction.setEnabled(true);
// update the delete action when the selection changes
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
deleteAction.update();
}
});
// create a key handler for the delete, redo, and undo actions
KeyHandler keyHandler = new KeyHandler();
keyHandler.put(KeyStroke.getPressed(SWT.DEL, SWT.DEL, 0), deleteAction);
keyHandler.put(KeyStroke.getPressed((char) 0x19, 0x79, SWT.CTRL), redoAction);
keyHandler.put(KeyStroke.getPressed((char) 0x1a, 0x7a, SWT.CTRL), undoAction);
// create the GraphicalViewerKeyHandler
GraphicalViewerKeyHandler overallHandler = new GraphicalViewerKeyHandler(viewer);
overallHandler.setParent(keyHandler);
viewer.setKeyHandler(overallHandler);
// set the selection provider
getSite().setSelectionProvider(viewer);
getViewSite().getPage().addSelectionListener(selectionListener_);
}
private ISelectionListener selectionListener_ = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
Object firstElement = structuredSelection.getFirstElement();
if (firstElement instanceof IJavaProject) {
IJavaProject selectedProject = (IJavaProject) firstElement;
Object editPart = viewer.getEditPartRegistry().get(selectedProject);
if (editPart != null) {
viewer.setSelection(new StructuredSelection(editPart));
}
}
}
}};
@Override
public void dispose() {
super.dispose();
getViewSite().getPage().removeSelectionListener(selectionListener_);
}
/**
* Passing the focus request to the viewer's control.
*/
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
/**
* Adapter for the dependencies view. Support for the EditDomain
*/
@Override
public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
if (adapter == CommandStack.class) {
return viewer.getEditDomain().getCommandStack();
}
return super.getAdapter(adapter);
}
}