Xcos: fix port labeling on invalid rpar
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / block / custom / SumPortLabeler.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Clement DAVID
4  * Copyright (C) 2011-2016 - Scilab Enterprises - Clement DAVID
5  *
6  * Copyright (C) 2012 - 2016 - Scilab Enterprises
7  *
8  * This file is hereby licensed under the terms of the GNU GPL v2.0,
9  * pursuant to article 5.3.4 of the CeCILL v.2.1.
10  * This file was originally licensed under the terms of the CeCILL v2.1,
11  * and continues to be available under such terms.
12  * For more information, see the COPYING file which you should have received
13  * along with this program.
14  *
15  */
16
17 package org.scilab.modules.xcos.block.custom;
18
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.scilab.modules.xcos.block.BasicBlock;
23 import org.scilab.modules.xcos.port.input.InputPort;
24
25 import com.mxgraph.model.mxICell;
26 import org.scilab.modules.xcos.JavaController;
27 import org.scilab.modules.xcos.Kind;
28 import org.scilab.modules.xcos.ObjectProperties;
29 import org.scilab.modules.xcos.VectorOfDouble;
30
31 /**
32  * Change the port label on rpar change.
33  *
34  * This listener must be installed on "integerParameters" property.
35  */
36 public class SumPortLabeler {
37
38     private static final String NOT_PRINTED_LABEL = "+";
39     private static SumPortLabeler instance;
40
41     /**
42      * Default constructor
43      */
44     public SumPortLabeler() {
45     }
46
47     /**
48      * @return the shared instance
49      */
50     public static SumPortLabeler getInstance() {
51         if (instance == null) {
52             instance = new SumPortLabeler();
53         }
54         return instance;
55     }
56
57     /**
58      * Change the label of the port according to the integer parameters
59      * property.
60      *
61      * @param source the block to update
62      */
63     public void updateLabel(BasicBlock source) {
64         /**
65          * Get the input port children
66          */
67         final List<InputPort> ports = new ArrayList<InputPort>();
68         for (int i = 0; i < source.getChildCount(); i++) {
69             final mxICell port = source.getChildAt(i);
70
71             if (port instanceof InputPort) {
72                 ports.add((InputPort) port);
73             }
74         }
75
76         /**
77          * Set the ports labels
78          */
79         JavaController controller = new JavaController();
80         VectorOfDouble rpar = new VectorOfDouble();
81         controller.getObjectProperty(source.getUID(), Kind.BLOCK, ObjectProperties.RPAR, rpar);
82
83         for (int i = 0; i < ports.size(); i++) {
84             final double gain;
85
86             if (i < rpar.size()) {
87                 gain = rpar.get(i);
88             } else {
89                 gain = 1;
90             }
91
92             ports.get(i).setValue(getLabel(gain));
93         }
94
95         /**
96          * Check if all the values are equal to the default one.
97          */
98         if (!hasDefaultValue(ports)) {
99             return;
100         }
101
102         /**
103          * When all values are equal to the default one, set it to the block
104          * and hide the children.
105          */
106         source.setValue(NOT_PRINTED_LABEL);
107         for (InputPort port : ports) {
108             port.setValue("");
109         }
110     }
111
112     /**
113      * Has all the ports have the default value ?
114      *
115      * @param ports
116      *            the ports list
117      * @return true if they all have the default values
118      */
119     private boolean hasDefaultValue(final List<InputPort> ports) {
120         boolean allPortIsDefaultLabel = true;
121         for (InputPort port : ports) {
122             if (port.getValue() instanceof String) {
123                 String current = port.getValue().toString();
124                 if (!NOT_PRINTED_LABEL.equals(current)) {
125                     allPortIsDefaultLabel = false;
126                     break;
127                 }
128             }
129         }
130         return allPortIsDefaultLabel;
131     }
132
133     /**
134      * Return the symbol for the gain value
135      *
136      * @param gain
137      *            the current gain
138      * @return A label representing the gain
139      */
140     private String getLabel(double gain) {
141         if (gain > 0) {
142             return NOT_PRINTED_LABEL; // "+"
143         } else {
144             return "-";
145         }
146     }
147 }