Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }