Xcos load: do not duplicate children
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / graph / DiagramComparator.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2011 - Scilab Enterprises - Clement DAVID
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 package org.scilab.modules.xcos.graph;
14
15 import java.util.Collections;
16 import java.util.Comparator;
17 import java.util.List;
18
19 import org.scilab.modules.xcos.JavaController;
20 import org.scilab.modules.xcos.Kind;
21 import org.scilab.modules.xcos.ObjectProperties;
22
23 /**
24  * Compare two diagrams per kind.
25  *
26  * Is used to sort diagram list per distance to the root diagram.
27  */
28 public final class DiagramComparator implements Comparator<XcosDiagram> {
29
30     /*
31      * Static API
32      */
33
34     public static void sort(List<XcosDiagram> diagrams) {
35         Collections.sort(diagrams, new DiagramComparator());
36     }
37
38     public static void reverse(List<XcosDiagram> diagrams) {
39         Collections.sort(diagrams, Collections.reverseOrder(new DiagramComparator()));
40     }
41
42     /*
43      * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
44      */
45
46     @Override
47     public int compare(final XcosDiagram o1, final XcosDiagram o2) {
48         long[] o1Parent = new long[] { o1.getUID() };
49         long[] o2Parent = new long[] { o2.getUID() };
50         JavaController controller = new JavaController();
51
52         int o1Relative = 0;
53         while (o1Parent[0] != 0l) {
54             o1Relative++;
55             controller.getObjectProperty(o1Parent[0], Kind.DIAGRAM, ObjectProperties.PARENT_BLOCK, o1Parent);
56         }
57
58         int o2Relative = 0;
59         while (o2Parent[0] != 0l) {
60             o2Relative++;
61             controller.getObjectProperty(o2Parent[0], Kind.DIAGRAM, ObjectProperties.PARENT_BLOCK, o2Parent);
62         }
63
64         return o1Relative - o2Relative;
65     }
66
67 }