/* This file is part of Green.
*
* Copyright (C) 2005 The Research Foundation of State University of New York
* All Rights Under Copyright Reserved, The Research Foundation of S.U.N.Y.
*
* Green is free software, licensed under the terms of the Eclipse
* Public License, version 1.0. The license is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package edu.buffalo.cse.green.editor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
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.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import edu.buffalo.cse.green.editor.controller.AbstractPart;
import edu.buffalo.cse.green.editor.controller.MemberPart;
import edu.buffalo.cse.green.editor.controller.TypePart;
import edu.buffalo.cse.green.editor.model.AbstractModel;
import edu.buffalo.cse.green.editor.model.MemberModel;
import edu.buffalo.cse.green.editor.model.TypeModel;
/**
* Customized Content Outline View for use with the Green
* diagram editor.
*
* @author bcmartin
*/
public class OutlinePage extends ContentOutlinePage {
private OutlineContentProvider _contentProvider;
private TreeViewer _viewer;
private IStructuredSelection _sel;
private static final OutlinePage SINGLETON = new OutlinePage();
/**
* The constructor. Maps this OutlinePage to the DiagramEditor
*/
private OutlinePage() {
super();
DiagramEditor.setOutlinePage(this);
}
/**
* @return the static singleton for the OutlinePage
*/
public static OutlinePage getInstance() {
return SINGLETON;
}
/**
* Updates the outline with contents from the given editor
* @param editor the editor whose contents are to be put in the outline
*/
public void update(DiagramEditor editor) {
if (_viewer.getContentProvider() == null) {
// don't update
return;
}
_viewer.setInput(editor);
}
/**
* Creates the control i.e. creates all the stuff that matters and
* is visible in the outline.
*
* Actions must be created before menus and toolbars.
*
* @param parent
*/
public void createControl(Composite parent) {
super.createControl(parent);
_contentProvider = new OutlineContentProvider();
// create the context actions
createActions();
// initialize the tree viewer
_viewer = getTreeViewer();
_viewer.setContentProvider(_contentProvider);
_viewer.setLabelProvider(new OutlineLabelProvider());
// get and apply the preferences
this.getOutlinePreferences();
// set the selection listener
_viewer.addSelectionChangedListener(this);
// attach actions to the viewer (double-click, context, etc.)
_viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
AbstractPart part = DiagramEditor.getActiveEditor().getContext().getPart();
System.err.println(part);
part.performRequest(new Request(RequestConstants.REQ_OPEN));
}
});
// enable copy-paste
initCopyPaste(_viewer);
// create the menu bar and the context menu
createToolbar();
resetToolbarButtons();
createContextMenu();
}
/**
* @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection(ISelection selection) {
super.setSelection(selection);
// if the selection hasn't changed, abort
if (selection.equals(_sel)) return;
_sel = (IStructuredSelection) selection;
AbstractPart part = (AbstractPart) _sel.getFirstElement();
DiagramEditor.getActiveEditor().selectionChanged(
DiagramEditor.getActiveEditor(), new StructuredSelection(part));
}
/**
* @see org.eclipse.ui.part.Page#dispose()
*/
public void dispose() {
super.dispose();
}
/**
* Creates the actions associated with the outline.
*/
private void createActions() {
}
/**
* Initialize copy paste by getting the clipboard and hooking
* the actions to global edit menu.
*
* @param viewer
*/
private void initCopyPaste(TreeViewer viewer) {
}
/**
* Get the preferences.
*
*/
private void getOutlinePreferences() {
}
private void resetToolbarButtons() {
}
/**
* Create the toolbar.
*/
private void createToolbar() {
// add actions to the toolbar
// IToolBarManager toolbarManager = getSite().getActionBars().getToolBarManager();
}
/**
* Creates the context menu.
*/
private void createContextMenu() {
// create menu manager
MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager mgr) {
DiagramEditor.getActiveEditor().createContextMenu(mgr);
}
});
// create the menu
Menu menu = menuMgr.createContextMenu(getTreeViewer().getControl());
getTreeViewer().getControl().setMenu(menu);
//register menu for extensions
//getSite().registerContextMenu(menuMgr, getTreeViewer());
}
}
class OutlineContentProvider implements ITreeContentProvider {
/**
* Gets the children of the given parent node of the tree.
*
* @param parentElement parent node of the tree
* @return list of children
*/
public Object[] getChildren(Object element) {
List<Object> children = new ArrayList<Object>();
if (element instanceof TypePart) {
TypePart part = (TypePart) element;
TypeModel model = (TypeModel) part.getModel();
if (model.getFieldCompartmentModel() != null) {
children.addAll(part.getRootPart().getPartFromModel(
model.getFieldCompartmentModel()).getChildren());
}
if (model.getMethodCompartmentModel() != null) {
children.addAll(part.getRootPart().getPartFromModel(
model.getMethodCompartmentModel()).getChildren());
}
}
return children.toArray();
}
/**
* Gets the parent of the given tree node.
*
* @param element node of the tree
* @return parent node of the element
*/
public Object getParent(Object element) {
if (element instanceof MemberPart) {
if (!(element instanceof TypePart)) {
MemberPart part = (MemberPart) element;
MemberModel model = (MemberModel) part.getModel();
part.getRootPart().getPartFromModel(
model.getParent().getParent());
}
}
return null;
}
/**
* Checks if the given tree node has children nodes.
*
* @param element node of the tree
* @return true if element has children, otherwise false
*/
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public Object[] getElements(Object inputElement) {
DiagramEditor editor = (DiagramEditor) inputElement;
List<AbstractPart> children = new ArrayList<AbstractPart>();
for (AbstractModel model : editor.getRootModel().getChildren()) {
if (model instanceof TypeModel) {
children.add(editor.getRootPart().getPartFromModel(model));
}
}
return children.toArray();
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {}
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// do nothing
}
}
class OutlineLabelProvider extends LabelProvider {
private static Map<String, Image> _mapping =
new HashMap<String, Image>();
/**
* Returns an image for the given element.
*
* @return the image to view at the given element
*/
public Image getImage(Object element) {
// if an image was already created, free it up (so as to not waste mem)
MemberPart part = (MemberPart) element;
MemberModel model = (MemberModel) part.getModel();
Image image = _mapping.get(model.getMember().getHandleIdentifier());
if (image != null) {
image.dispose();
}
image = model.getIcon();
_mapping.put(model.getMember().getHandleIdentifier(), image);
return image;
}
/**
* Returns the text description of the elemet. That is element
* name for OutlineNode.
*
* @return the text to view at the given element
*/
public String getText(Object element) {
MemberPart part = (MemberPart) element;
MemberModel model = (MemberModel) part.getModel();
return model.getDisplayName();
}
/**
* @see org.eclipse.jface.viewers.LabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
public boolean isLabelProperty(Object element, String property) {
return false;
}
}