blob: cb9b03b2bb286eef4e34d8610c45a386e3e59e51 [file] [log] [blame]
/*******************************************************************************
* Copyright 2005-2006, 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.ArrayList;
import java.util.List;
import org.eclipse.zest.core.viewers.IGraphEntityRelationshipContentProvider;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphContainer;
import org.eclipse.zest.core.widgets.GraphNode;
/**
* A factory for the IGraphEntityRelationshipContentProvider.
*
* @author Del Myers
*/
// @tag bug.154580-Content.fix
// @tag bug.160367-Refreshing.fix : updated to use new
// AbstractStylingModelFactory
public class GraphModelEntityRelationshipFactory extends
AbstractStylingModelFactory {
public GraphModelEntityRelationshipFactory(
AbstractStructuredGraphViewer viewer) {
super(viewer);
if (!(viewer.getContentProvider() instanceof IGraphEntityRelationshipContentProvider)) {
throw new IllegalArgumentException(
"Expected IGraphEntityRelationshipContentProvider");
}
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.zest.core.internal.graphmodel.AbstractStylingModelFactory
* #createGraphModel()
*/
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);
Object[] nodes = getContentProvider().getElements(
getViewer().getInput());
nodes = filter(getViewer().getInput(), nodes);
createModelNodes(model, nodes);
createModelRelationships(model);
}
/**
* Creates all the model relationships. Assumes that all of the model nodes
* have been created in the graph model already. Runtime O(n^2) + O(r).
*
* @param model
* the model to create the relationship on.
*/
private void createModelRelationships(Graph model) {
GraphNode[] modelNodes = getNodesArray(model);
List listOfNodes = new ArrayList();
for (int i = 0; i < modelNodes.length; i++) {
listOfNodes.add(modelNodes[i]);
}
for (int i = 0; i < listOfNodes.size(); i++) {
GraphNode node = (GraphNode) listOfNodes.get(i);
if (node instanceof GraphContainer) {
List childNodes = ((GraphContainer) node).getNodes();
listOfNodes.addAll(childNodes);
}
}
modelNodes = (GraphNode[]) listOfNodes
.toArray(new GraphNode[listOfNodes.size()]);
IGraphEntityRelationshipContentProvider content = getCastedContent();
for (int i = 0; i < modelNodes.length; i++) {
for (int j = 0; j < modelNodes.length; j++) {
Object[] rels = content.getRelationships(
modelNodes[i].getData(), modelNodes[j].getData());
if (rels != null) {
rels = filter(getViewer().getInput(), rels);
for (int r = 0; r < rels.length; r++) {
createConnection(model, rels[r],
modelNodes[i].getData(),
modelNodes[j].getData());
}
}
}
}
}
/**
* Creates the model nodes for the given external nodes.
*
* @param model
* the graph model.
* @param nodes
* the external nodes.
*/
private void createModelNodes(Graph model, Object[] nodes) {
for (int i = 0; i < nodes.length; i++) {
createNode(model, nodes[i]);
}
}
/*
* (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) {
// with this kind of graph, it is just as easy and cost-effective to
// rebuild the whole thing.
refreshGraph(graph);
}
private IGraphEntityRelationshipContentProvider getCastedContent() {
return (IGraphEntityRelationshipContentProvider) getContentProvider();
}
}