1 package org.xpilot.jxpmap;
2 
3 import java.util.List;
4 import java.util.ArrayList;
5 import java.util.Map;
6 import java.util.Collection;
7 import java.util.Collections;
8 import java.util.Iterator;
9 import java.util.ListIterator;
10 import java.io.PrintWriter;
11 import java.io.IOException;
12 import java.awt.Rectangle;
13 import java.awt.Point;
14 import java.awt.Graphics2D;
15 import java.awt.Shape;
16 import java.awt.Color;
17 import java.awt.geom.GeneralPath;
18 
19 
20 public class Group extends MapObject {
21 
22     protected List members;
23     protected GeneralPath previewShape;
24 
deepClone(Map context)25     public Object deepClone (Map context) {
26         Group clone = (Group)super.deepClone(context);
27         clone.members = new ArrayList();
28         for (Iterator i = members.iterator(); i.hasNext();)
29             clone.members.add(((MapObject)i.next()).deepClone(context));
30         return clone;
31     }
32 
copy()33     public MapObject copy() {
34         Group copy = (Group)super.clone();
35         copy.members = new ArrayList();
36         for (Iterator i = members.iterator(); i.hasNext();)
37             copy.members.add(((MapObject)i.next()).copy());
38         return copy;
39     }
40 
Group()41     public Group() {
42         members = new ArrayList();
43     }
44 
Group(Collection c)45     public Group(Collection c) {
46         members = new ArrayList(c);
47         Collections.sort(members, MapObject.Z_ORDER);
48         invalidate();
49     }
50 
getZOrder()51     public int getZOrder() {
52         if (members.isEmpty()) return 100;
53         return ((MapObject)members.get(0)).getZOrder();
54     }
55 
addMember(MapObject o)56     public void addMember(MapObject o) {
57         members.add(o);
58         invalidate();
59     }
60 
invalidate()61     public void invalidate() {
62         previewShape = null;
63         bounds = null;
64     }
65 
addToFront(MapObject moNew)66     public void addToFront(MapObject moNew) {
67         invalidate();
68         for (ListIterator iter = members.listIterator(); iter.hasNext();) {
69             MapObject moOld = (MapObject)iter.next();
70             int znew = moNew.getZOrder();
71             int zold = moOld.getZOrder();
72 
73             if (znew <= zold) {
74                 iter.previous();
75                 iter.add(moNew);
76                 return;
77             }
78         }
79         members.add(moNew);
80     }
81 
removeMember(MapObject o)82     public void removeMember(MapObject o) {
83         if (members.remove(o)) invalidate();
84     }
85 
hasMember(MapObject o)86     public boolean hasMember(MapObject o) {
87         return members.contains(o);
88     }
89 
getMembers()90     public List getMembers() {
91         return Collections.unmodifiableList(members);
92     }
93 
getBounds()94     public Rectangle getBounds() {
95         if (bounds == null) {
96             int x1, y1, x2, y2;
97             x1 = y1 = Integer.MAX_VALUE;
98             x2 = y2 = Integer.MIN_VALUE;
99             for (Iterator i = members.iterator(); i.hasNext();) {
100                 Rectangle b = ((MapObject)i.next()).getBounds();
101                 if (b.x < x1) x1 = b.x;
102                 if (b.y < y1) y1 = b.y;
103                 if (b.x + b.width > x2) x2 = b.x + b.width;
104                 if (b.y + b.height > y2) y2 = b.y + b.height;
105             }
106             bounds = new Rectangle(x1, y1, (x2 - x1), (y2 - y1));
107         }
108         return bounds;
109     }
110 
setBounds(Rectangle r)111     public void setBounds(Rectangle r) {
112         throw new UnsupportedOperationException();
113     }
114 
contains(Point p)115     public boolean contains (Point p) {
116         for (Iterator i = members.iterator(); i.hasNext();)
117             if (((MapObject)i.next()).contains(p)) return true;
118         return false;
119     }
120 
getPreviewShape()121     public Shape getPreviewShape () {
122         if (previewShape == null) {
123             previewShape = new GeneralPath();
124             //previewShape.append(getBounds(), false);
125             for (Iterator i = members.iterator(); i.hasNext();)
126                 previewShape.append(((MapObject)i.next()).getPreviewShape(),
127                     false);
128         }
129         return previewShape;
130     }
131 
getCreateHandler(Runnable r)132     public CanvasEventHandler getCreateHandler (Runnable r) {
133         throw new UnsupportedOperationException();
134     }
135 
moveTo(int x, int y)136     public void moveTo (int x, int y) {
137         Rectangle b = getBounds();
138         int dx = x - b.x;
139         int dy = y - b.y;
140         for (Iterator i = members.iterator(); i.hasNext();) {
141             MapObject o = (MapObject)i.next();
142             b = o.getBounds();
143             o.moveTo(b.x + dx, b.y + dy);
144         }
145         invalidate();
146     }
147 
paint(Graphics2D g, float scale)148     public void paint (Graphics2D g, float scale) {
149         for (int i = members.size() - 1; i >= 0; i--)
150             ((MapObject)members.get(i)).paint(g, scale);
151         if (isSelected()) {
152             g.setStroke(SELECTED_STROKE);
153             g.setColor(Color.white);
154             g.draw(getBounds());
155         }
156     }
157 
printXml(PrintWriter out)158     public void printXml (PrintWriter out) throws IOException {
159         out.println("<Group>");
160         printMemberXml(out);
161         out.println("</Group>");
162     }
163 
printMemberXml(PrintWriter out)164     protected void printMemberXml (PrintWriter out) throws IOException {
165         for (Iterator i = members.iterator(); i.hasNext();)
166             ((MapObject)i.next()).printXml(out);
167     }
168 }
169