Xcos src: Java cleanup
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / block / custom / ProdPortLabeler.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-2015 - 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.VectorOfInt;
30
31 /**
32  * Change the port label accordingly to the ipar values.
33  */
34 public class ProdPortLabeler {
35
36     private static final String NOT_PRINTED_LABEL = "\u00d7";
37     private static ProdPortLabeler instance;
38
39     /**
40      * Default constructor
41      */
42     public ProdPortLabeler() {
43     }
44
45     /**
46      * @return the shared instance
47      */
48     public static ProdPortLabeler getInstance() {
49         if (instance == null) {
50             instance = new ProdPortLabeler();
51         }
52         return instance;
53     }
54
55     /**
56      * Change the label of the port according to the integer parameters
57      * property.
58      *
59      * @param source the source of the block
60      */
61     public void updateLabel(final BasicBlock source) {
62         /**
63          * Get the input port children
64          */
65         final List<InputPort> ports = new ArrayList<InputPort>();
66         for (int i = 0; i < source.getChildCount(); i++) {
67             final mxICell port = source.getChildAt(i);
68
69             if (port instanceof InputPort) {
70                 ports.add((InputPort) port);
71             }
72         }
73
74         /**
75          * Set the ports labels
76          */
77         JavaController controller = new JavaController();
78         VectorOfInt ipar = new VectorOfInt();
79         controller.getObjectProperty(source.getUID(), Kind.BLOCK, ObjectProperties.IPAR, ipar);
80
81         for (int i = 0; i < ports.size(); i++) {
82             final int gain;
83
84             if (i < ipar.size()) {
85                 gain = ipar.get(i);
86             } else {
87                 gain = 1;
88             }
89
90             ports.get(i).setValue(getLabel(gain));
91         }
92
93         /**
94          * Check if all the values are equal to the default one.
95          */
96         if (!hasDefaultValue(ports)) {
97             return;
98         }
99
100         /**
101          * When all values are equal to the default one, set it to the block
102          * and hide the children.
103          */
104         source.setValue(NOT_PRINTED_LABEL);
105         for (InputPort port : ports) {
106             port.setValue("");
107         }
108     }
109
110     /**
111      * Has all the ports have the default value ?
112      *
113      * @param ports
114      *            the ports list
115      * @return true if they all have the default values
116      */
117     private boolean hasDefaultValue(final List<InputPort> ports) {
118         boolean allPortIsDefaultLabel = true;
119         for (InputPort port : ports) {
120             if (port.getValue() instanceof String) {
121                 String current = port.getValue().toString();
122                 if (!NOT_PRINTED_LABEL.equals(current)) {
123                     allPortIsDefaultLabel = false;
124                     break;
125                 }
126             }
127         }
128         return allPortIsDefaultLabel;
129     }
130
131     /**
132      * Return the symbol for the gain value
133      *
134      * @param gain
135      *            the current gain
136      * @return A label representing the gain
137      */
138     private String getLabel(double gain) {
139         if (gain > 0) {
140             return NOT_PRINTED_LABEL;
141         } else {
142             return "\u00f7";
143         }
144     }
145 }