package net.sourceforge.c4jplugin.internal.ui.contracthierarchy.zest;
import java.util.ArrayList;
import net.sourceforge.c4jplugin.internal.ui.contracthierarchy.ContractHierarchyLifeCycle;
import net.sourceforge.c4jplugin.internal.ui.contracthierarchy.HierarchyLabelProvider;
import net.sourceforge.c4jplugin.internal.ui.contracthierarchy.HierarchyViewerSorter;
import net.sourceforge.c4jplugin.internal.ui.contracthierarchy.IContractHierarchyViewer;
import net.sourceforge.c4jplugin.internal.ui.contracthierarchy.tree.TreeContractHierarchyContentProvider;
import org.eclipse.core.resources.IResource;
import org.eclipse.gef.editparts.ZoomManager;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import org.eclipse.jdt.internal.ui.util.JavaUIHelp;
import org.eclipse.jdt.internal.ui.viewsupport.DecoratingJavaLabelProvider;
import org.eclipse.jdt.internal.ui.viewsupport.ResourceToItemsMapper;
import org.eclipse.jdt.ui.IWorkingCopyProvider;
import org.eclipse.jdt.ui.JavaElementLabels;
import org.eclipse.jdt.ui.ProblemsLabelDecorator.ProblemsLabelChangedEvent;
import org.eclipse.jdt.ui.actions.OpenAction;
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.IBaseLabelProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.mylar.zest.core.ZestStyles;
import org.eclipse.mylar.zest.core.viewers.StaticGraphViewer;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
public class ZestContractHierarchyViewer extends StaticGraphViewer implements
IContractHierarchyViewer, ResourceToItemsMapper.IContentViewerAccessor {
private OpenAction fOpen;
private HierarchyLabelProvider fLabelProvider;
private ZestDecoratingHierarchyLabelProvider fZestLabelProvider;
protected ResourceToItemsMapper fResourceToItemsMapper;
public ZestContractHierarchyViewer(Composite composite, ContractHierarchyLifeCycle lifeCycle, IWorkbenchPart part) {
super(composite, ZestStyles.PANNING |
ZestStyles.NO_OVERLAPPING_NODES | ZestStyles.ENFORCE_BOUNDS);
setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED);
fLabelProvider= new HierarchyLabelProvider(lifeCycle);
fZestLabelProvider = new ZestDecoratingHierarchyLabelProvider(fLabelProvider);
setLabelProvider(fZestLabelProvider);
//setLabelProvider(new DecoratingJavaLabelProvider(fLabelProvider));
setUseHashlookup(true);
setContentProvider(new ZestContractHierarchyContentProvider(lifeCycle));
setComparator(new HierarchyViewerSorter(lifeCycle));
fOpen= new OpenAction(part.getSite());
addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
fOpen.run();
}
});
addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
fOpen.run();
}
});
//JavaUIHelp.setHelp(this, IJavaHelpContextIds.TYPE_HIERARCHY_VIEW);
initMapper();
}
public Object containsElements() {
ZestContractHierarchyContentProvider contentProvider= getHierarchyContentProvider();
if (contentProvider != null) {
Object[] elements= contentProvider.getElements(null);
if (elements.length > 0) {
return elements[0];
}
}
return null;
}
public void contributeToContextMenu(IMenuManager menu) {
}
public IType getRootType() {
ZestContractHierarchyContentProvider contentProvider= getHierarchyContentProvider();
if (contentProvider != null) {
Object[] elements= contentProvider.getElements(null);
if (elements.length > 0 && elements[0] instanceof IType) {
return (IType) elements[0];
}
}
return null;
}
public String getTitle() {
return "Zest Contract Hierarchy";
}
public void initContextMenu(IMenuListener menuListener, String popupId,
IWorkbenchPartSite viewSite) {
MenuManager menuMgr= new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(menuListener);
Menu menu= menuMgr.createContextMenu(getControl());
getControl().setMenu(menu);
viewSite.registerContextMenu(popupId, menuMgr, this);
}
public boolean isElementShown(Object element) {
return findItem(element) != null;
}
public boolean isMethodFiltering() {
ZestContractHierarchyContentProvider contentProvider= getHierarchyContentProvider();
if (contentProvider != null) {
return contentProvider.getMemberFilter() != null;
}
return false;
}
public void setMemberFilter(IMember[] memberFilter) {
ZestContractHierarchyContentProvider contentProvider= getHierarchyContentProvider();
if (contentProvider != null) {
contentProvider.setMemberFilter(memberFilter);
}
}
public void setQualifiedTypeName(boolean on) {
if (on) {
fLabelProvider.setTextFlags(fLabelProvider.getTextFlags() | JavaElementLabels.T_POST_QUALIFIED);
} else {
fLabelProvider.setTextFlags(fLabelProvider.getTextFlags() & ~JavaElementLabels.T_POST_QUALIFIED);
}
refresh();
}
public void setWorkingSetFilter(ViewerFilter filter) {
fLabelProvider.setFilter(filter);
ZestContractHierarchyContentProvider contentProvider= getHierarchyContentProvider();
if (contentProvider != null) {
contentProvider.setWorkingSetFilter(filter);
}
}
public void updateContent(boolean doExpand) {
//System.out.println("ZEST updateContent called");
//getControl().setRedraw(true);
refresh();
//applyLayout();
}
public void setHierarchyMode(int mode) {
fZestLabelProvider.setHierarchyMode(mode);
}
public ZoomManager getZoomManager() {
return super.getZoomManager();
}
protected ZestContractHierarchyContentProvider getHierarchyContentProvider() {
return (ZestContractHierarchyContentProvider)getContentProvider();
}
public void doUpdateItem(Widget item) {
doUpdateItem(item, item.getData(), true);
}
protected void handleLabelProviderChanged(LabelProviderChangedEvent event) {
if (event instanceof ProblemsLabelChangedEvent) {
ProblemsLabelChangedEvent e= (ProblemsLabelChangedEvent) event;
if (!e.isMarkerChange() && canIgnoreChangesFromAnnotionModel()) {
return;
}
}
Object[] changed= event.getElements();
if (changed != null && !fResourceToItemsMapper.isEmpty()) {
ArrayList others= new ArrayList();
for (int i= 0; i < changed.length; i++) {
Object curr= changed[i];
if (curr instanceof IResource) {
fResourceToItemsMapper.resourceChanged((IResource) curr);
} else {
others.add(curr);
}
}
if (others.isEmpty()) {
return;
}
event= new LabelProviderChangedEvent((IBaseLabelProvider) event.getSource(), others.toArray());
} else {
// we have modified the list of changed elements via add additional parents.
if (event.getElements() != changed)
event= new LabelProviderChangedEvent((IBaseLabelProvider) event.getSource(), changed);
}
super.handleLabelProviderChanged(event);
}
/**
* Answers whether this viewer can ignore label provider changes resulting from
* marker changes in annotation models
*/
private boolean canIgnoreChangesFromAnnotionModel() {
Object contentProvider= getContentProvider();
return contentProvider instanceof IWorkingCopyProvider && !((IWorkingCopyProvider)contentProvider).providesWorkingCopies();
}
private void initMapper() {
fResourceToItemsMapper= new ResourceToItemsMapper(this);
}
/*
* @see StructuredViewer#mapElement(Object, Widget)
*/
protected void mapElement(Object element, Widget item) {
super.mapElement(element, item);
if (item instanceof Item) {
fResourceToItemsMapper.addToMap(element, (Item) item);
}
}
/*
* @see StructuredViewer#unmapElement(Object, Widget)
*/
protected void unmapElement(Object element, Widget item) {
if (item instanceof Item) {
fResourceToItemsMapper.removeFromMap(element, (Item) item);
}
super.unmapElement(element, item);
}
/*
* @see StructuredViewer#unmapAllElements()
*/
protected void unmapAllElements() {
fResourceToItemsMapper.clearMap();
super.unmapAllElements();
}
}