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