Source code: giny/util/Sugiyama.java
1 package giny.util;
2
3 import giny.view.*;
4 import giny.model.*;
5
6 import java.util.*;
7 import java.awt.geom.Point2D;
8
9 public class Sugiyama {
10
11
12 GraphView graphView;
13 List nodeLevels;
14 boolean vertical;
15
16 public Sugiyama ( GraphView view ) {
17 this.graphView = view;
18 this.vertical = false;
19 }
20
21 /**
22 * @param levels This is a List of Lists of Nodes, each list shows
23 * the nodes that are on the same level. It is
24 * assumed that the levels will be in order.
25 */
26 public void setNodeLevels ( List levels ) {
27 this.nodeLevels = levels;
28 }
29
30 public void layout ( List levels, boolean vertical ) {
31 this.nodeLevels = levels;
32 this.vertical = vertical;
33 layout();
34 }
35
36
37 public void layout () {
38
39 Iterator level_iterator = nodeLevels.iterator();
40
41 double major = 0; // Major refers to the axis that corresponds to
42 // i.e. the Y-axis if a horizonatal layout is chosen.
43
44 // Go through for initial layout
45 while ( level_iterator.hasNext() ) {
46 layoutLevel( ( List )level_iterator.next(), major );
47 major += 200;
48 }
49
50 // now go through and put the bends in the right place.
51 level_iterator = nodeLevels.iterator();
52 while ( level_iterator.hasNext() ) {
53 layoutBends( ( List )level_iterator.next() );
54 }
55 }
56
57 public void layoutBends ( List nodes ) {
58 Iterator member_iterator = nodes.iterator();
59 Iterator neighbors;
60 EdgeView edge_view;
61 NodeView from_view, to_view;
62 Node from, to;
63 while ( member_iterator.hasNext() ) {
64 from = ( Node )member_iterator.next();
65 neighbors = graphView.getGraphPerspective().neighborsList( from ).iterator();
66 while ( neighbors.hasNext() ) {
67 to = ( Node )neighbors.next();
68 if ( nodes.contains( to ) ) {
69 // these nodes are on the same level
70 // do nothing
71 continue;
72 }
73
74 from_view = graphView.getNodeView( from.getRootGraphIndex() );
75 to_view = graphView.getNodeView( to.getRootGraphIndex() );
76 double from_x = from_view.getXPosition();
77 double from_y = from_view.getYPosition();
78 double to_x = to_view.getXPosition();
79 double to_y = to_view.getYPosition();
80
81 double mid_x = Math.abs( from_x - to_x ) / 2;
82 double mid_y = Math.abs( from_y - to_y ) / 2;
83
84 int[] edges_array = graphView.getGraphPerspective().getEdgeIndicesArray( from.getRootGraphIndex(), to.getRootGraphIndex(), false );
85
86 if ( edges_array != null )
87 for ( int i = 0; i < edges_array.length; ++i ) {
88
89
90 edge_view = graphView.getEdgeView( edges_array[i] );
91 Bend bend = edge_view.getBend();
92 Point2D from_point, to_point;
93 edge_view.setLineType( EdgeView.STRAIGHT_LINES );
94
95 System.out.println( "From: "+from.getRootGraphIndex()+" X: "+from_x+" To: "+to.getRootGraphIndex()+" X: "+to_x+" Mid: "+mid_x+" Y: "+from_y+" To: "+to.getRootGraphIndex()+" Y: "+to_y+" Mid: "+mid_y );
96
97 if ( !vertical ) {
98 if ( to_y > from_y ) {
99 System.out.println( "A" );
100 to_point = new Point2D.Double( to_x + mid_x, from_y + 50 );
101 from_point = new Point2D.Double( from_x + mid_x, to_y - 50 );
102 } else {
103 System.out.println( "B" );
104 to_point = new Point2D.Double( to_x - mid_x, from_y - 50 );
105 from_point = new Point2D.Double( from_x - mid_x, to_y + 50 );
106 }
107 } else {
108 if ( to_x > from_x ) {
109 System.out.println( "C" );
110 from_point = new Point2D.Double( mid_y, from_x + 50 );
111 to_point = new Point2D.Double( mid_y, to_x - 50 );
112 } else {
113 System.out.println( "D" );
114 from_point = new Point2D.Double( mid_y, from_x - 50 );
115 to_point = new Point2D.Double( mid_y, to_x + 50 );
116 }
117 }
118
119 System.out.println( from_point+" "+to_point );
120
121 if ( bend != null ) {
122 bend.addHandle( 0, from_point );
123 // bend.addHandle( 1, to_point );
124 }
125 }
126 }
127 }
128 }
129
130 public void layoutLevel ( List nodes, double major ) {
131 Iterator member_iterator = nodes.iterator();
132 NodeView node_view;
133 double minor = 0;
134 while ( member_iterator.hasNext() ) {
135 // node_view = graphView.getNodeView( ( Node )member_iterator.next() );
136
137 Node n = ( Node )member_iterator.next() ;
138 System.out.println( "TEST: "+n.getRootGraphIndex() );
139 node_view = graphView.getNodeView( n.getRootGraphIndex() );
140
141 if ( vertical )
142 node_view.setOffset( major, minor );
143 else
144 node_view.setOffset( minor, major );
145
146 minor += 200;
147 }
148 }
149
150
151 }