/******************************************************************************* * 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(); } }