1   /****************************************************************************
2    * This demo file is part of yFiles for Java 2.14.
3    * Copyright (c) 2000-2017 by yWorks GmbH, Vor dem Kreuzberg 28,
4    * 72070 Tuebingen, Germany. All rights reserved.
5    * 
6    * yFiles demo files exhibit yFiles for Java functionalities. Any redistribution
7    * of demo files in source code or binary form, with or without
8    * modification, is not permitted.
9    * 
10   * Owners of a valid software license for a yFiles for Java version that this
11   * demo is shipped with are allowed to use the demo source code as basis
12   * for their own yFiles for Java powered applications. Use of such programs is
13   * governed by the rights and conditions as set out in the yFiles for Java
14   * license agreement.
15   * 
16   * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED
17   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19   * NO EVENT SHALL yWorks BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21   * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26   *
27   ***************************************************************************/
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