view dwtx/draw2d/graph/DirectedGraph.d @ 98:95307ad235d9

Added Draw2d code, still work in progress
author Frank Benoit <benoit@tionex.de>
date Sun, 03 Aug 2008 00:52:14 +0200
parents
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2003, 2005 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 * Port to the D programming language:
 *     Frank Benoit <benoit@tionex.de>
 *******************************************************************************/
module dwtx.draw2d.graph.DirectedGraph;

import dwt.dwthelper.utils;

import dwtx.draw2d.PositionConstants;
import dwtx.draw2d.geometry.Dimension;
import dwtx.draw2d.geometry.Insets;
import dwtx.draw2d.graph.EdgeList;
import dwtx.draw2d.graph.NodeList;
import dwtx.draw2d.graph.Node;
import dwtx.draw2d.graph.RankList;
import dwtx.draw2d.graph.Edge;
import dwtx.draw2d.graph.Rank;

/**
 * A graph consisting of nodes and directed edges.  A DirectedGraph serves as the input to
 * a graph layout algorithm.  The algorithm will place the graph's nodes and edges
 * according to certain goals, such as short, non-crossing edges, and readability.
 *
 * @author hudsonr
 * @since 2.1.2
 */
public class DirectedGraph {

private int direction = PositionConstants.SOUTH;

/**
 * The default padding to be used for nodes which don't specify any padding.  Padding is
 * the amount of empty space to be left around a node.  The default value is undefined.
 */
private Insets defaultPadding;

/**
 * All of the edges in the graph.
 */
public EdgeList edges;

/**
 * All of the nodes in the graph.
 */
public NodeList nodes;

/**
 * For internal use only. The list of rows which makeup the final graph layout.
 * @deprecated
 */
public RankList ranks;

Node forestRoot;
Insets margin;
int[] rankLocations;
int[][] cellLocations;
int tensorStrength;
int tensorSize;
Dimension size;

public this(){
    defaultPadding = new Insets(16);
    edges = new EdgeList();
    nodes = new NodeList();
    ranks = new RankList();
    margin = new Insets();
    size = new Dimension();
}

/**
 * Returns the default padding for nodes.
 * @return the default padding
 * @since 3.2
 */
public Insets getDefaultPadding() {
    return defaultPadding;
}

/**
 * Returns the direction in which the graph will be layed out.
 * @return the layout direction
 * @since 3.2
 */
public int getDirection() {
    return direction;
}

/**
 * Sets the outer margin for the entire graph. The margin is the space in which nodes
 * should not be placed.
 * @return the graph's margin
 * @since 3.2
 */
public Insets getMargin() {
    return margin;
}

/**
 * Returns the effective padding for the given node.  If the node has a specified padding,
 * it will be used, otherwise, the graph's defaultPadding is returned.  The
 * returned value must not be modified.
 * @param node the node
 * @return the effective padding for that node
 */
public Insets getPadding(Node node) {
    Insets pad = node.getPadding();
    if (pad is null)
        return defaultPadding;
    return pad;
}

int[] getCellLocations(int rank) {
    return cellLocations[rank];
}

int[] getRankLocations() {
    return rankLocations;
}
//
//public Cell getCell(Point pt) {
//  int rank = 0;
//  while (rank < rankLocations.length - 1 && rankLocations[rank] < pt.y)
//      rank++;
//  int cells[] = cellLocations[rank];
//  int cell = 0;
//  while (cell < cells.length - 1 && cells[cell] < pt.x)
//      cell++;
//  return new Cell(rank, cell, ranks.getRank(rank).getNode(index));
//}

public Node getNode(int rank, int index) {
    if (ranks.size() <= rank)
        return null;
    Rank r = ranks.getRank(rank);
    if (r.size() <= index)
        return null;
    return r.getNode(index);
}

/**
 * Removes the given edge from the graph.
 * @param edge the edge to be removed
 */
public void removeEdge(Edge edge) {
    edges.remove(edge);
    edge.source.outgoing.remove(edge);
    edge.target.incoming.remove(edge);
    if (edge.vNodes !is null)
        for (int j = 0; j < edge.vNodes.size(); j++)
            removeNode(edge.vNodes.getNode(j));
}

/**
 * Removes the given node from the graph. Does not remove the node's edges.
 * @param node the node to remove
 */
public void removeNode(Node node) {
    nodes.remove(node);
    if (ranks !is null)
        ranks.getRank(node.rank).remove(node);
}

/**
 * Sets the default padding for all nodes in the graph.  Padding is the empty space left
 * around the <em>outside</em> of each node.  The default padding is used for all nodes
 * which do not specify a specific amount of padding (i.e., their padding is
 * <code>null</code>).
 * @param insets the padding
 */
public void setDefaultPadding(Insets insets) {
    defaultPadding = insets;
}

/**
 * Sets the layout direction for the graph. Edges will be layed out in the specified
 * direction (unless the graph contains cycles). Supported values are:
 * <UL>
 * <LI>{@link dwtx.draw2d.PositionConstants#EAST}
 * <LI>{@link dwtx.draw2d.PositionConstants#SOUTH}
 * </UL>
 * <P>The default direction is south.
 * @param direction the layout direction
 * @since 3.2
 */
public void setDirection(int direction) {
    this.direction = direction;
}

//public void setGraphTensor(int length, int strength) {
//  tensorStrength = strength;
//  tensorSize = length;
//}

/**
 * Sets the graphs margin.
 * @param insets the graph's margin
 * @since 3.2
 */
public void setMargin(Insets insets) {
    this.margin = insets;
}

public Dimension getLayoutSize() {
    return size;
}

}