blob: c83d04313c609982e26275bcc7eb6b5daefc5cf7 [file] [log] [blame]
/*******************************************************************************
* Copyright 2005, CHISEL Group, University of Victoria, Victoria, BC, Canada.
* 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
*
* Contributors: The Chisel Group, University of Victoria
******************************************************************************/
package org.eclipse.zest.core.viewers;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.zest.core.viewers.internal.AbstractStructuredGraphViewer;
import org.eclipse.zest.core.viewers.internal.GraphModelEntityFactory;
import org.eclipse.zest.core.viewers.internal.GraphModelEntityRelationshipFactory;
import org.eclipse.zest.core.viewers.internal.GraphModelFactory;
import org.eclipse.zest.core.viewers.internal.IStylingGraphModelFactory;
import org.eclipse.zest.core.viewers.internal.ZoomManager;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphItem;
import org.eclipse.zest.layouts.LayoutAlgorithm;
/**
* This view is used to represent a static graph. Static graphs can be layed
* out, but do not continually update their layout locations.
*
* @author Ian Bull
* @author Chris Callendar
*/
public class GraphViewer extends AbstractStructuredGraphViewer implements
ISelectionProvider {
protected Graph graph = null;
private IStylingGraphModelFactory modelFactory = null;
private List selectionChangedListeners = null;
ZoomManager zoomManager = null;
/**
* Initializes the viewer.
*
* @param composite
* The parent composite.
* @param style
* The style for the viewer and the related Graph.
* @see SWT#V_SCROLL
* @see SWT#H_SCROLL
*/
public GraphViewer(Composite composite, int style) {
super(style);
this.graph = new Graph(composite, style);
hookControl(this.graph);
}
public void setControl(Graph graphModel) {
this.graph = graphModel;
hookControl(this.graph);
}
protected void hookControl(Control control) {
super.hookControl(control);
selectionChangedListeners = new ArrayList();
getGraphControl().addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Iterator iterator = selectionChangedListeners.iterator();
ISelection structuredSelection = getSelection();
SelectionChangedEvent event = new SelectionChangedEvent(
GraphViewer.this, structuredSelection);
while (iterator.hasNext()) {
ISelectionChangedListener listener = (ISelectionChangedListener) iterator
.next();
listener.selectionChanged(event);
}
firePostSelectionChanged(event);
}
});
control.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
DoubleClickEvent doubleClickEvent = new DoubleClickEvent(
GraphViewer.this, getSelection());
fireDoubleClick(doubleClickEvent);
}
public void mouseDown(MouseEvent e) {
}
public void mouseUp(MouseEvent e) {
}
});
}
/**
* Gets the styles for this structuredViewer
*
* @return
*/
public int getStyle() {
return this.graph.getStyle();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#
* getGraphControl()
*/
public Graph getGraphControl() {
return super.getGraphControl();
};
/**
* Sets the layout algorithm to use for this viewer.
*
* @param algorithm
* the algorithm to layout the nodes
* @param runLayout
* if the layout should be run
*/
public void setLayoutAlgorithm(LayoutAlgorithm algorithm, boolean runLayout) {
graph.setLayoutAlgorithm(algorithm, runLayout);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#
* setLayoutAlgorithm(org.eclipse.zest.layouts.LayoutAlgorithm)
*/
public void setLayoutAlgorithm(LayoutAlgorithm algorithm) {
super.setLayoutAlgorithm(algorithm);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#setNodeStyle
* (int)
*/
public void setNodeStyle(int nodeStyle) {
super.setNodeStyle(nodeStyle);
this.graph.setNodeStyle(nodeStyle);
}
public void setContentProvider(IContentProvider contentProvider) {
if (contentProvider instanceof IGraphContentProvider) {
modelFactory = null;
super.setContentProvider(contentProvider);
} else if (contentProvider instanceof IGraphEntityContentProvider) {
modelFactory = null;
super.setContentProvider(contentProvider);
} else if (contentProvider instanceof IGraphEntityRelationshipContentProvider) {
modelFactory = null;
super.setContentProvider(contentProvider);
} else {
throw new IllegalArgumentException(
"Invalid content provider, only IGraphContentProvider, IGraphEntityContentProvider, or IGraphEntityRelationshipContentProvider are supported.");
}
}
/**
* Finds the graph widget item for a given user model item.
*
* Note: This method returns an internal interface (GraphItem). You should
* be able to cast this to either a IGraphModelNode or IGraphModelConnection
* (which are also internal). These are internal because this API is not
* stable. If use this method (to access internal nodes and edges), your
* code may not compile between versions.
*
* @param The
* user model node.
* @return An IGraphItem. This should be either a IGraphModelNode or
* IGraphModelConnection
*/
public GraphItem findGraphItem(Object element) {
Widget[] result = findItems(element);
return (result.length == 0 || !(result[0] instanceof GraphItem)) ? null
: (GraphItem) result[0];
}
/**
* Applys the current layout to the viewer
*/
public void applyLayout() {
graph.applyLayout();
}
protected void setSelectionToWidget(List l, boolean reveal) {
GraphItem[] listOfItems = findItems(l);
graph.setSelection(listOfItems);
}
public Control getControl() {
return graph;
}
public Object[] getNodeElements() {
return super.getNodeElements();
}
public Object[] getConnectionElements() {
return super.getConnectionElements();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#reveal
* (java.lang.Object)
*/
public void reveal(Object element) {
super.reveal(element);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#
* setConnectionStyle(int)
*/
public void setConnectionStyle(int connectionStyle) {
super.setConnectionStyle(connectionStyle);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.zest.core.viewer.internal.AbstractStructuredGraphViewer#unReveal
* (java.lang.Object)
*/
public void unReveal(Object element) {
super.unReveal(element);
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
if (!selectionChangedListeners.contains(listener)) {
selectionChangedListeners.add(listener);
}
}
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
if (selectionChangedListeners.contains(listener)) {
selectionChangedListeners.remove(listener);
}
}
// @tag zest.bug.156286-Zooming.fix.experimental : expose the zoom manager
// for new actions.
protected ZoomManager getZoomManager() {
if (zoomManager == null) {
zoomManager = new ZoomManager(getGraphControl().getRootLayer(),
getGraphControl().getViewport());
}
return zoomManager;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#getFactory()
*/
protected IStylingGraphModelFactory getFactory() {
if (modelFactory == null) {
if (getContentProvider() instanceof IGraphContentProvider) {
modelFactory = new GraphModelFactory(this);
} else if (getContentProvider() instanceof IGraphEntityContentProvider) {
modelFactory = new GraphModelEntityFactory(this);
} else if (getContentProvider() instanceof IGraphEntityRelationshipContentProvider) {
modelFactory = new GraphModelEntityRelationshipFactory(this);
}
}
return modelFactory;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer#
* getLayoutAlgorithm()
*/
protected LayoutAlgorithm getLayoutAlgorithm() {
return graph.getLayoutAlgorithm();
}
}