EOS 2  1.1.0
Einfache Objektbasierte Sprache
Group.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.geo;
2 
3 import de.lathanda.eos.base.FillStyle;
4 import de.lathanda.eos.base.LineStyle;
5 import de.lathanda.eos.base.MutableColor;
6 import de.lathanda.eos.base.Picture;
7 import de.lathanda.eos.base.layout.BalancePoint;
8 import de.lathanda.eos.base.layout.BoundingBox;
9 import de.lathanda.eos.base.layout.Transform;
10 import de.lathanda.eos.base.util.ConcurrentLinkedList;
11 import de.lathanda.eos.geo.exceptions.RecursiveGroupException;
12 
22 public class Group extends Figure implements FigureGroup {
24  protected boolean autoCenter = true;
25 
26  public Group() {
27  super();
29  }
30 
31  @Override
32  protected void scaleInternal(double factor) {
33  transform = transform.scale(factor);
34  }
35 
36  @Override
37  public void addFigure(Figure figure) {
38  //check recursive loop (error check add group within itself)
39  FigureGroup grp = this;
40  while (grp != null) {
41  if (grp == figure) {
42  throw new RecursiveGroupException();
43  } else {
44  grp = grp.getParentGroup();
45  }
46  }
47 
48  //add is safe, now do it
49  figure.replaceGroup(this);
50  members.add(figure);
51  figure.changeTransformation(this);
53  }
54 
55  public void copyFigure(Figure figure) {
56  Figure copy = figure.copy();
57  addFigure(copy);
58  }
59 
60  @Override
61  public void removeFigure(Figure go) {
62  members.remove(go);
63  Group grp = this;
64  while (grp != null) {
65  go.restoreTransformation(grp);
66  grp = grp.getParentGroup().getGroup();
67  }
69  }
70 
74  public void removeAll() {
75  for (Figure f : members) {
76  f.restoreTransformation(this);
77  }
78  members.clear();
80  }
81 
82  @Override
83  public Group getGroup() {
84  return this;
85  }
86  @Override
88  return group;
89  }
90  @Override
91  protected void drawObject(Picture p) {
92  for (Figure m : members) {
93  m.draw(p);
94  }
95  }
96 
97  @Override
98  protected void fireLayoutChanged() {
99  recenter();
100  super.fireLayoutChanged();
101  }
102 
103  public void setLineColor(MutableColor color) {
104  for (Figure m : members) {
105  if (m instanceof LineFigure) {
106  ((LineFigure) m).setLineColor(color);
107  } else if (m instanceof Group) {
108  ((Group) m).setLineColor(color);
109  }
110  }
111  }
112 
113  public void setLineStyle(LineStyle linetype) {
114  for (Figure m : members) {
115  if (m instanceof LineFigure) {
116  ((LineFigure) m).setLineStyle(linetype);
117  } else if (m instanceof Group) {
118  ((Group) m).setLineStyle(linetype);
119  }
120  }
121  }
122 
123  public void setLineWidth(double linewidth) {
124  for (Figure m : members) {
125  if (m instanceof LineFigure) {
126  ((LineFigure) m).setLineWidth(linewidth);
127  } else if (m instanceof Group) {
128  ((Group) m).setLineWidth(linewidth);
129  }
130  }
131  }
132 
133  public void setFillStyle(FillStyle filltype) {
134  for (Figure m : members) {
135  if (m instanceof FilledFigure) {
136  ((FilledFigure) m).setFillStyle(filltype);
137  } else if (m instanceof Group) {
138  ((Group) m).setFillStyle(filltype);
139  }
140  }
141  }
142 
143  public void setFillColor(MutableColor color) {
144  for (Figure m : members) {
145  if (m instanceof FilledFigure) {
146  ((FilledFigure) m).setFillColor(color);
147  } else if (m instanceof Group) {
148  ((Group) m).setFillColor(color);
149  }
150  }
151  }
152 
153  public void mirrorY() {
156  }
157 
158  public void mirrorX() {
161  }
162 
163  @Override
164  public Figure copy() {
165  Group g = (Group) super.copy();
167  for (Figure m : members) {
168  g.members.add(m.copy());
169  }
170  return g;
171  }
172 
173  private void setCenterInternal(double x, double y) {
174  synchronized (this) {
175  double dx = getX() - x;
176  double dy = getY() - y;
177  members.forEach(figure -> figure.moveInternal(dx, dy));
178  moveToInternal(x, y);
179  }
180  }
181 
189  public void setCenter(double x, double y) {
190  autoCenter = false;
191  setCenterInternal(x, y);
192  }
193 
194  public void centerBalancePoint() {
195  autoCenter = true;
196  recenter();
197  }
198 
199  private void recenter() {
200  if (!autoCenter) {
201  return;
202  }
203  BalancePoint wp = getBalancePoint();
204  setCenterInternal(wp.getPoint().getX() + getX(), wp.getPoint().getY() + getY());
205  }
206 
207  @Override
209  double weight = 0;
210  double x = 0;
211  double y = 0;
212  BalancePoint bp;
213  for (Figure figure : members) {
214  bp = figure.getBalancePoint();
215  double figureWeight = bp.getWeight();
216  if (figureWeight > 0) {
217  weight += figureWeight;
218  x += bp.getX() * figureWeight;
219  y += bp.getY() * figureWeight;
220  }
221  }
222 
223  if (weight != 0) {
224  return new BalancePoint(weight, x / weight, y / weight);
225  } else {
226  return new BalancePoint(0, 0, 0);
227  }
228  }
229 
230  @Override
232  Transform t = base.transform(own);
233  BoundingBox bound = new BoundingBox();
234  for (Figure figure : members) {
235  bound.add(figure.calculateBoundingBox(t));
236  }
237  return bound;
238  }
239  public boolean getAutoCenter() {
240  return autoCenter;
241  }
243  return members;
244  }
245 }
Geometrische Transformation.
Definition: Transform.java:13
void restoreTransformation(Group relativeTo)
Definition: Figure.java:248
void moveToInternal(double x, double y)
Definition: Figure.java:113
void changeTransformation(Figure relativeTo)
Definition: Figure.java:238
void setFillColor(MutableColor color)
Definition: Group.java:143
void setLineColor(MutableColor color)
Definition: Group.java:103
void setFillStyle(FillStyle filltype)
Definition: Group.java:133
void addFigure(Figure figure)
Definition: Group.java:37
FigureGroup getParentGroup()
Definition: Group.java:87
void scaleInternal(double factor)
Definition: Group.java:32
ConcurrentLinkedList< Figure > members
Definition: Group.java:23
BalancePoint getBalancePoint()
Definition: Group.java:208
void copyFigure(Figure figure)
Definition: Group.java:55
void setCenter(double x, double y)
Definition: Group.java:189
void removeFigure(Figure go)
Definition: Group.java:61
void setLineWidth(double linewidth)
Definition: Group.java:123
ConcurrentLinkedList< Figure > getMembers()
Definition: Group.java:242
void setLineStyle(LineStyle linetype)
Definition: Group.java:113
BoundingBox calculateBoundingBox(Transform base, Transform own)
Definition: Group.java:231
void drawObject(Picture p)
Definition: Group.java:91
Impressum