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