blob: 4a11fe01dad14f972f75c7c93de284baff303e02 [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.internal;
import java.util.Iterator;
import java.util.List;
import org.eclipse.zest.core.viewers.IFigureProvider;
import org.eclipse.zest.core.viewers.IGraphContentProvider;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphConnection;
import org.eclipse.zest.core.widgets.GraphNode;
/**
* This factory helps make models (nodes & connections).
*
* @author Ian Bull
* @author Chris Callendar
*/
public class GraphModelFactory extends AbstractStylingModelFactory {
AbstractStructuredGraphViewer viewer = null;
public GraphModelFactory(AbstractStructuredGraphViewer viewer) {
super(viewer);
this.viewer = viewer;
}
/*
* (non-Javadoc)
*
* @see ca.uvic.cs.zest.internal.graphmodel.IGraphModelFactory#createModel()
*/
public Graph createGraphModel(Graph model) {
doBuildGraph(model);
return model;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.zest.core.internal.graphmodel.AbstractStylingModelFactory#doBuildGraph(org.eclipse.zest.core.internal.graphmodel.GraphModel)
*/
protected void doBuildGraph(Graph model) {
super.doBuildGraph(model);
// make the model have the same styles as the viewer
Object rels[] = getContentProvider().getElements(getViewer().getInput());
if (rels != null) {
IFigureProvider figureProvider = null;
if (getLabelProvider() instanceof IFigureProvider) {
figureProvider = (IFigureProvider) getLabelProvider();
}
// If rels returns null then just continue
// @tag zest(bug(134928(fix))) : An empty graph causes an NPE
for (int i = 0; i < rels.length; i++) {
// Check the filter on the source
Object source = getCastedContent().getSource(rels[i]);
source = filterElement(getViewer().getInput(), source) ? null : source;
// Check hte filter on the dest
Object dest = getCastedContent().getDestination(rels[i]);
dest = filterElement(getViewer().getInput(), dest) ? null : dest;
if (source == null) {
// just create the node for the destination
if (dest != null) {
if (figureProvider != null) {
createNode(model, dest, figureProvider.getFigure(dest));
} else {
createNode(model, dest);
}
}
continue;
} else if (dest == null) {
// just create the node for the source
if (source != null) {
if (figureProvider != null) {
createNode(model, source, figureProvider.getFigure(dest));
} else {
createNode(model, source);
}
}
continue;
}
// If any of the source, dest is null or the edge is filtered,
// don't create the graph.
if (source != null && dest != null && !filterElement(getViewer().getInput(), rels[i])) {
createConnection(model, rels[i], source, dest);
}
}
}
}
private IGraphContentProvider getCastedContent() {
return (IGraphContentProvider) getContentProvider();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.zest.core.internal.graphmodel.IStylingGraphModelFactory#refresh(org.eclipse.zest.core.internal.graphmodel.GraphModel,
* java.lang.Object)
*/
public void refresh(Graph graph, Object element) {
refresh(graph, element, false);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.zest.core.internal.graphmodel.IStylingGraphModelFactory#refresh(org.eclipse.zest.core.internal.graphmodel.GraphModel,
* java.lang.Object, boolean)
*/
public void refresh(Graph graph, Object element, boolean updateLabels) {
GraphConnection conn = viewer.getGraphModelConnection(element);
if (conn == null) {
// did the user send us a node? Check all of the connections on the
// node.
GraphNode node = viewer.getGraphModelNode(element);
if (node != null) {
List connections = node.getSourceConnections();
for (Iterator it = connections.iterator(); it.hasNext();) {
GraphConnection c = (GraphConnection) it.next();
refresh(graph, c.getExternalConnection(), updateLabels);
}
connections = node.getTargetConnections();
for (Iterator it = connections.iterator(); it.hasNext();) {
GraphConnection c = (GraphConnection) it.next();
refresh(graph, c.getExternalConnection(), updateLabels);
}
}
return;
}
Object oldSource = conn.getSource().getData();
Object oldDest = conn.getDestination().getData();
Object newSource = getCastedContent().getSource(element);
Object newDest = getCastedContent().getDestination(element);
if (!(oldSource.equals(newSource) && oldDest.equals(newDest))) {
GraphNode internalSource = viewer.getGraphModelNode(newSource);
GraphNode internalDest = viewer.getGraphModelNode(newDest);
if (internalSource == null) {
internalSource = createNode(graph, newSource);
} else if (updateLabels) {
styleItem(internalSource);
}
if (internalDest == null) {
internalDest = createNode(graph, newDest);
} else if (updateLabels) {
styleItem(internalDest);
}
// @tag TODO: Remove these lines
// conn.disconnect();
// conn.reconnect(internalSource, internalDest);
if (updateLabels) {
styleItem(conn);
}
}
}
}