1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.6. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2008 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.layout;
15  
16  import y.base.DataProvider;
17  import y.base.EdgeMap;
18  import y.base.Node;
19  import y.base.NodeMap;
20  import y.layout.BufferedLayouter;
21  import y.layout.DefaultLayoutGraph;
22  import y.layout.LayoutGraph;
23  import y.layout.LayoutMultiplexer;
24  import y.layout.LayoutOrientation;
25  import y.layout.PortConstraint;
26  import y.layout.PortConstraintKeys;
27  import y.layout.grouping.GroupingKeys;
28  import y.layout.grouping.RecursiveGroupLayouter;
29  import y.layout.hierarchic.HierarchicLayouter;
30  
31  /**
32   * This class shows how to layout the contents of group nodes
33   * each with different layout style. In this example, 
34   * the graph induced by the grouped nodes labeled 0 to 6 will be laid out 
35   * by HierarchicLayouter using BOTTOM_TO_TOP orientation,
36   * while the remaining nodes will be laid out by    
37   * HierarchicLayouter using LEFT_TO_RIGHT orientation.
38   */
39  public class RecursiveGroupLayouterDemo
40  {
41    public static void main(String args[])
42    {
43      LayoutGraph graph = new DefaultLayoutGraph();
44      
45      //create graph structure
46      Node[] v = new Node[10];
47      for(int i = 0; i < v.length; i++) {
48        v[i] = graph.createNode();
49        graph.setSize(v[i], 30,30);
50      }
51      int[][] e = {{0,1}, {0,2}, {0,3}, {4,0}, {5,0}, {0,7}, {6,0}, {6,8}, {8,7}};
52      for(int i = 0; i < e.length; i++) {
53        Node s = v[e[i][0]];
54        Node t = v[e[i][1]];
55        graph.createEdge(s,t);
56      }
57      
58      //set up fixed port constraints for edges that connect at v[0]
59      EdgeMap spcMap = graph.createEdgeMap();
60      EdgeMap tpcMap = graph.createEdgeMap();
61      graph.addDataProvider(PortConstraintKeys.SOURCE_PORT_CONSTRAINT_KEY, spcMap);
62      graph.addDataProvider(PortConstraintKeys.TARGET_PORT_CONSTRAINT_KEY, tpcMap);
63      spcMap.set(v[0].getEdgeTo(v[7]), PortConstraint.create(PortConstraint.ANY_SIDE, true));
64      tpcMap.set(v[6].getEdgeTo(v[0]), PortConstraint.create(PortConstraint.ANY_SIDE, true));
65      
66      //set up edge group information (optional) 
67      EdgeMap sgMap = graph.createEdgeMap();
68      EdgeMap tgMap = graph.createEdgeMap();
69      graph.addDataProvider(PortConstraintKeys.SOURCE_GROUPID_KEY, sgMap);
70      graph.addDataProvider(PortConstraintKeys.TARGET_GROUPID_KEY, tgMap);
71      sgMap.set(v[0].getEdgeTo(v[1]), "G1");
72      sgMap.set(v[0].getEdgeTo(v[2]), "G1");
73      sgMap.set(v[0].getEdgeTo(v[3]), "G1");
74  
75      tgMap.set(v[0].getEdgeFrom(v[4]), "G2");
76      tgMap.set(v[0].getEdgeFrom(v[5]), "G2");
77      
78      //set up grouping information
79      NodeMap groupMap = graph.createNodeMap();
80      NodeMap pidMap  = graph.createNodeMap();
81      NodeMap idMap  = graph.createNodeMap();
82      graph.addDataProvider(GroupingKeys.GROUP_DPKEY, groupMap);
83      graph.addDataProvider(GroupingKeys.NODE_ID_DPKEY, idMap);
84      graph.addDataProvider(GroupingKeys.PARENT_NODE_ID_DPKEY, pidMap);
85      groupMap.setBool(v[9], true);
86      for(int i = 0; i < 6; i++) {
87        pidMap.set(v[i], v[9]);
88      }
89      for(int i = 0; i < v.length; i++) {
90        idMap.set(v[i], v[i]);
91      }
92      
93      //configure layout algorithm
94      HierarchicLayouter innerHL = new HierarchicLayouter();
95      innerHL.setLayoutOrientation(LayoutOrientation.BOTTOM_TO_TOP);
96      HierarchicLayouter outerHL = new HierarchicLayouter();
97      outerHL.setLayoutOrientation(LayoutOrientation.LEFT_TO_RIGHT);
98      LayoutMultiplexer lm = new LayoutMultiplexer();
99      NodeMap layoutMap = graph.createNodeMap();
100     graph.addDataProvider(LayoutMultiplexer.LAYOUTER_DPKEY, layoutMap);
101     for(int i = 0; i < 6; i++) {
102       layoutMap.set(v[i], innerHL);
103     }
104     for(int i = 7; i < v.length; i++) {
105       layoutMap.set(v[i], outerHL);
106     }
107     
108     //launch layout algorithm
109     RecursiveGroupLayouter rgl = new RecursiveGroupLayouter(lm);
110     new BufferedLayouter(rgl).doLayout(graph);
111     
112     //remove group node
113     graph.removeNode(v[9]);
114     
115     //  display result
116     LayoutPreviewPanel lpp = new LayoutPreviewPanel(graph);
117     lpp.createFrame("RecursiveGroupLayouterDemo").setVisible(true);
118 
119 
120     //remove all registered DataProviders, NodeMap and EdgeMaps
121     Object[] key = graph.getDataProviderKeys();
122     for(int i = 0; i < key.length; i++) {
123       DataProvider dp = graph.getDataProvider(key[i]);
124       graph.removeDataProvider(key[i]);
125       if(dp instanceof NodeMap) {
126         graph.disposeNodeMap((NodeMap)dp);
127       }
128       else if(dp instanceof EdgeMap) {
129         graph.disposeEdgeMap((EdgeMap)dp);
130       }
131     }
132      
133   }
134   
135 }
136