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