Xcos: fix the DSUPER preference over SUPER_f
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / block / SuperBlock.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Bruno JOFRET
4  * Copyright (C) 2014 - Scilab Enterprises - Clement DAVID
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.block;
15
16 import com.mxgraph.model.mxGeometry;
17 import org.scilab.modules.graph.ScilabGraph;
18 import org.scilab.modules.gui.contextmenu.ContextMenu;
19 import org.scilab.modules.gui.menu.Menu;
20 import org.scilab.modules.gui.menu.ScilabMenu;
21 import org.scilab.modules.xcos.JavaController;
22 import org.scilab.modules.xcos.Kind;
23 import org.scilab.modules.xcos.ObjectProperties;
24 import org.scilab.modules.xcos.VectorOfInt;
25 import org.scilab.modules.xcos.block.actions.CodeGenerationAction;
26 import org.scilab.modules.xcos.block.actions.SuperblockMaskCreateAction;
27 import org.scilab.modules.xcos.block.actions.SuperblockMaskCustomizeAction;
28 import org.scilab.modules.xcos.block.actions.SuperblockMaskRemoveAction;
29 import org.scilab.modules.xcos.utils.FileUtils;
30 import org.scilab.modules.xcos.utils.XcosMessages;
31
32 /**
33  * A SuperBlock contains an entire diagram on it. Thus it can be easily
34  * customized by the user.
35  *
36  * A SuperBlock can be created from any part of the diagram y selecting blocks
37  * and applying the
38  * {@link org.scilab.modules.xcos.block.actions.RegionToSuperblockAction}.
39  *
40  * It can also appear to users as a normal block by applying a mask on it. In
41  * this case the creator can use any SuperBlock context defined variable on a
42  * prompt to the user.
43  *
44  * @see SuperBlockDiagram
45  * @see SuperblockMaskCreateAction
46  * @see SuperblockMaskCustomizeAction
47  * @see SuperblockMaskRemoveAction
48  */
49 // CSOFF: ClassDataAbstractionCoupling
50 // CSOFF: ClassFanOutComplexity
51 @SuppressWarnings(value = { "serial" })
52 public final class SuperBlock extends BasicBlock {
53     /**
54      * The interfunction name (linked to Xcos-core)
55      */
56     public static final String INTERFUNCTION_NAME = "SUPER_f";
57
58     /**
59      * The simulation name (linked to Xcos-core)
60      */
61     private static final String SIMULATION_NAME = "super";
62     /**
63      * The simulation name on a masked status (linked to Xcos-core)
64      */
65     private static final String MASKED_SIMULATION_NAME = "csuper";
66     /**
67      * The interfunction name on a masked status (linked to Xcos-core)
68      */
69     private static final String MASKED_INTERFUNCTION_NAME = "DSUPER";
70
71     public SuperBlock(JavaController controller, long uid, Kind kind, Object value, mxGeometry geometry, String style, String id) {
72         super(controller, uid, kind, value, geometry, style, id);
73
74         controller.setObjectProperty(uid, kind, ObjectProperties.SIM_FUNCTION_NAME, SIMULATION_NAME);
75     }
76
77     /**
78      * @param graph
79      *            parent diagram
80      */
81     @Override
82     public void openContextMenu(ScilabGraph graph) {
83         ContextMenu menu = null;
84
85         menu = createContextMenu(graph);
86         menu.getAsSimpleContextMenu().addSeparator();
87         menu.add(CodeGenerationAction.createMenu(graph));
88
89         Menu maskMenu = ScilabMenu.createMenu();
90         maskMenu.setText(XcosMessages.SUPERBLOCK_MASK);
91
92         if (isMasked()) {
93             maskMenu.add(SuperblockMaskRemoveAction.createMenu(graph));
94             menu.add(maskMenu);
95         } else {
96             maskMenu.add(SuperblockMaskCreateAction.createMenu(graph));
97         }
98         maskMenu.add(SuperblockMaskCustomizeAction.createMenu(graph));
99         menu.add(maskMenu);
100
101         menu.setVisible(true);
102     }
103
104     /**
105      * Mask the SuperBlock
106      */
107     public void mask(final JavaController controller) {
108         controller.setObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.INTERFACE_FUNCTION, MASKED_INTERFUNCTION_NAME);
109         controller.setObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.SIM_FUNCTION_NAME, MASKED_SIMULATION_NAME);
110
111         VectorOfInt ipar = new VectorOfInt(1);
112         ipar.set(0, 1);
113         controller.setObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.IPAR, ipar);
114     }
115
116     /**
117      * Unmask the SuperBlock
118      */
119     public void unmask(final JavaController controller) {
120         controller.setObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.INTERFACE_FUNCTION, INTERFUNCTION_NAME);
121         controller.setObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.SIM_FUNCTION_NAME, SIMULATION_NAME);
122     }
123
124     /**
125      * @return True is the SuperBlock is masked, false otherwise
126      */
127     public boolean isMasked() {
128         JavaController controller = new JavaController();
129
130         String[] interfaceFunction = new String[1];
131         controller.getObjectProperty(getUID(), Kind.BLOCK, ObjectProperties.INTERFACE_FUNCTION, interfaceFunction);
132
133         return !INTERFUNCTION_NAME.equals(interfaceFunction[0]);
134     }
135
136     /**
137      * Customize the parent diagram on name change
138      *
139      * @param value
140      *            the new name
141      * @see com.mxgraph.model.mxCell#setValue(java.lang.Object)
142      */
143     @Override
144     public void setValue(Object value) {
145         if (value != null) {
146             super.setValue(FileUtils.toValidCIdentifier(value.toString()));
147         } else {
148             super.setValue(value);
149         }
150     }
151 }
152 // CSON: ClassDataAbstractionCoupling
153 // CSON: ClassFanOutComplexity