1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.9. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2011 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
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