1/***************************************************************************
2  Title:      GraphBrowser/Region.java
3  Author:     Stefan Berghofer, TU Muenchen
4  Options:    :tabSize=4:
5
6  This is an auxiliary class which is used by the layout algorithm when
7  calculating coordinates with the "pendulum method". A "region" is a
8  group of nodes which "stick together".
9***************************************************************************/
10
11package GraphBrowser;
12
13import java.util.*;
14
15class Region {
16	Vector vertices=new Vector(10,10);
17	Graph gra;
18
19	public Region(Graph g) { gra=g; }
20
21	public void addVertex(Vertex v) {
22		vertices.addElement(v);
23	}
24
25	public Enumeration getVertices() {
26		return vertices.elements();
27	}
28
29	public int pred_deflection() {
30		float d1=0;
31		int n=0;
32		Enumeration e1=vertices.elements();
33		while (e1.hasMoreElements()) {
34			float d2=0;
35			int p=0;
36			n++;
37			Vertex v=(Vertex)(e1.nextElement());
38			Enumeration e2=v.getParents();
39			while (e2.hasMoreElements()) {
40				p++;
41				d2+=((Vertex)(e2.nextElement())).getX()-v.getX();
42			}
43			if (p>0) d1+=d2/p;
44		}
45		return (int)(Math.round(d1/n));
46	}
47
48	public int succ_deflection() {
49		float d1=0;
50		int n=0;
51		Enumeration e1=vertices.elements();
52		while (e1.hasMoreElements()) {
53			float d2=0;
54			int p=0;
55			n++;
56			Vertex v=(Vertex)(e1.nextElement());
57			Enumeration e2=v.getChildren();
58			while (e2.hasMoreElements()) {
59				p++;
60				d2+=((Vertex)(e2.nextElement())).getX()-v.getX();
61			}
62			if (p>0) d1+=d2/p;
63		}
64		return (int)(Math.round(d1/n));
65	}
66
67	public void move(int x) {
68		Enumeration e1=vertices.elements();
69		while (e1.hasMoreElements()) {
70			Vertex v=(Vertex)(e1.nextElement());
71			v.setX(v.getX()+x);
72		}
73	}
74
75	public void combine(Region r2) {
76		Enumeration e1=r2.getVertices();
77		while (e1.hasMoreElements()) addVertex((Vertex)(e1.nextElement()));
78	}
79
80	public int spaceBetween(Region r2) {
81		return ((Vertex)(r2.getVertices().nextElement())).leftX()-
82			((Vertex)(vertices.lastElement())).rightX()-
83			20;
84	}
85
86	public boolean touching(Region r2) {
87		return spaceBetween(r2)==0;
88	}
89}
90