1
14 package demo.layout.labeling;
15
16 import y.geom.OrientedRectangle;
17 import y.geom.YDimension;
18 import y.base.YList;
19 import y.base.ListCell;
20 import y.layout.EdgeLabelModel;
21 import y.layout.EdgeLayout;
22 import y.layout.NodeLayout;
23 import y.layout.EdgeLabelLayout;
24 import y.layout.EdgeLabelCandidate;
25
26 import java.util.List;
27 import java.util.ArrayList;
28 import java.util.Iterator;
29
30 public class CompositeEdgeLabelModel implements EdgeLabelModel {
31
32 private List models = new ArrayList();
33
34 public Object getDefaultParameter() {
35 final EdgeLabelModel model = (EdgeLabelModel) models.get(0);
36 return new ModelParameter(model, model.getDefaultParameter());
37 }
38
39 public void add(EdgeLabelModel model){
40 this.models.add(model);
41 }
42
43 public OrientedRectangle getLabelPlacement(YDimension labelSize, EdgeLayout edgeLayout, NodeLayout sourceLayout,
44 NodeLayout targetLayout, Object param) {
45 ModelParameter p = (ModelParameter) param;
46 return p.model.getLabelPlacement(labelSize, edgeLayout, sourceLayout, targetLayout, p.parameter);
47 }
48
49 public YList getLabelCandidates(EdgeLabelLayout labelLayout, EdgeLayout edgeLayout, NodeLayout sourceLayout,
50 NodeLayout targetLayout) {
51
52 final YList list = new YList();
53 for (Iterator it = models.iterator(); it.hasNext();) {
54 EdgeLabelModel model = (EdgeLabelModel) it.next();
55 final YList labelCandidates = model.getLabelCandidates(labelLayout, edgeLayout, sourceLayout, targetLayout);
56 for (ListCell listCell = labelCandidates.firstCell(); listCell != null; listCell = listCell.succ()) {
57 EdgeLabelCandidate candidate = (EdgeLabelCandidate) listCell.getInfo();
58 ModelParameter newParam = new ModelParameter(model, candidate.getParameter());
59 list.add(new EdgeLabelCandidate(candidate.getBox(), newParam, labelLayout, candidate.isInternal()));
60 }
61 }
62 return list;
63 }
64
65 public Object createModelParameter(OrientedRectangle labelBounds, EdgeLayout edgeLayout, NodeLayout sourceLayout,
66 NodeLayout targetLayout) {
67 final EdgeLabelModel model = (EdgeLabelModel) models.get(0);
68 final Object param = model.createModelParameter(labelBounds, edgeLayout, sourceLayout, targetLayout);
69 return new ModelParameter(model, param);
70 }
71
72 public final class ModelParameter {
73 private final EdgeLabelModel model;
74 private final Object parameter;
75
76 public ModelParameter(final EdgeLabelModel model, final Object parameter) {
77 this.model = model;
78 this.parameter = parameter;
79 }
80
81 public EdgeLabelModel getModel() {
82 return model;
83 }
84
85 public Object getParameter() {
86 return parameter;
87 }
88 }
89 }
90