Xcos: fix update of empty value for IOBlocks
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / graph / SuperBlockDiagram.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2009 - DIGITEO - Antoine ELIAS
4  * Copyright (C) 2009-2010 - DIGITEO - ClĂ©ment 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-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.graph;
15
16 import java.io.Serializable;
17
18 import org.scilab.modules.xcos.block.SuperBlock;
19 import org.scilab.modules.xcos.utils.XcosEvent;
20
21 import com.mxgraph.util.mxEventObject;
22
23 /**
24  * @author Antoine ELIAS
25  *
26  */
27 public final class SuperBlockDiagram extends XcosDiagram implements Serializable {
28
29     private static final long serialVersionUID = -402918614723713301L;
30     private SuperBlock container;
31
32     /**
33      * Constructor
34      */
35     public SuperBlockDiagram() {
36         super();
37     }
38
39     /**
40      * @param superBlock parent super block
41      */
42     public SuperBlockDiagram(SuperBlock superBlock) {
43         super();
44         this.container = superBlock;
45     }
46
47     /**
48      * @return parent super block
49      */
50     public SuperBlock getContainer() {
51         return container;
52     }
53
54     /**
55      * @param container parent super block
56      */
57     public void setContainer(SuperBlock container) {
58         this.container = container;
59     }
60
61     /**
62      * Concatenate the context with the parent one
63      * @return the context
64      * @see org.scilab.modules.xcos.graph.XcosDiagram#getContext()
65      */
66     @Override
67     public String[] getContext() {
68         final String[] parent = getContainer().getParentDiagram().getContext();
69         final String[] current = super.getContext();
70         
71         String[] full = new String[current.length + parent.length];
72         System.arraycopy(parent, 0, full, 0, parent.length);
73         System.arraycopy(current, 0, full, parent.length, current.length);
74         return full;
75     }
76     
77     /**
78      * Listener for SuperBlock diagram events.
79      */
80     private static final class GenericSuperBlockListener implements mxIEventListener {
81         private static GenericSuperBlockListener instance;
82         
83         /**
84          * Reduce constructor visibility
85          */
86         private GenericSuperBlockListener() {
87             super();
88         }
89         
90         /**
91          * Mono-threaded singleton implementation getter
92          * @return The unique instance
93          */
94         public static GenericSuperBlockListener getInstance() {
95             if (instance == null) {
96                 instance = new GenericSuperBlockListener();
97             }
98             return instance;
99         }
100         
101         /**
102          * Update the IOPorts colors and values.
103          * @param arg0 the source
104          * @param arg1 the event data
105          * @see com.mxgraph.util.mxEventSource.mxIEventListener#invoke(java.lang.Object, com.mxgraph.util.mxEventObject)
106          */
107         public void invoke(Object arg0, mxEventObject arg1) {
108             ((SuperBlockDiagram) arg0).getContainer().updateAllBlocksColor();
109             ((SuperBlockDiagram) arg0).getContainer().updateExportedPort();         
110         }
111     }
112     
113     /**
114      * Install the specific listeners for {@link SuperBlockDiagram}.
115      */
116     public void installSuperBlockListeners() {
117         addListener(XcosEvent.CELLS_ADDED, GenericSuperBlockListener.getInstance());
118
119         addListener(XcosEvent.CELLS_REMOVED, GenericSuperBlockListener.getInstance());
120
121         addListener(XcosEvent.IO_PORT_VALUE_UPDATED, GenericSuperBlockListener.getInstance());
122     }
123
124     /**
125      * This function set the SuperBlock diagram and all its parents in a 
126      * modified state or not.
127      * @param modified status
128      */
129         @Override
130     public void setModified(boolean modified) {
131         super.setModified(modified);
132
133         if (getContainer() != null
134                         && getContainer().getParentDiagram() != null) {
135             getContainer().getParentDiagram().setModified(modified);
136         }
137     }
138     
139     /**
140      * This function set the SuperBlock diagram in a modified state or not.
141      * 
142      * It doesn't perform recursively on the parent diagrams. If you want such
143      * a behavior use setModified instead.
144      * @param modified status
145      * @see setModified
146      */
147     public void setModifiedNonRecursively(boolean modified) {
148         super.setModified(modified);
149     }
150 }