enable/disable a tab children frame, enable/disable tab title to show its state
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / tab / SwingScilabTabGroup.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2014 - Scilab Enterprises - Bruno JOFRET
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.gui.bridge.tab;
14
15 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACK__;
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_CALLBACKTYPE__;
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_POSITION__;
18 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTANGLE__;
19 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTNAME__;
20 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTSIZE__;
21 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_FONTWEIGHT__;
22 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_STRING__;
23 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TAB_STRING__;
24 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TITLE_POSITION__;
25 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TITLE_SCROLL__;
26 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VALUE__;
27 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_TAB_VALUE__;
28 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_VISIBLE__;
29 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_TAG__;
30
31 import java.awt.Component;
32 import java.awt.Font;
33
34 import javax.swing.Icon;
35 import javax.swing.JLabel;
36 import javax.swing.JTabbedPane;
37 import javax.swing.event.ChangeEvent;
38 import javax.swing.event.ChangeListener;
39
40 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
41 import org.scilab.modules.graphic_objects.graphicObject.CallBack;
42 import org.scilab.modules.graphic_objects.uicontrol.Uicontrol;
43 import org.scilab.modules.gui.SwingViewObject;
44 import org.scilab.modules.gui.events.callback.CommonCallBack;
45 import org.scilab.modules.gui.utils.Position;
46 import org.scilab.modules.gui.utils.PositionConverter;
47 import org.scilab.modules.gui.utils.Size;
48
49 public class SwingScilabTabGroup extends JTabbedPane implements SwingViewObject {
50     private static final long serialVersionUID = 965704348405077905L;
51     private Integer id;
52     private CommonCallBack callback = null;
53     private ChangeListener listener = null;
54
55     public SwingScilabTabGroup() {
56         super();
57
58         listener = new ChangeListener() {
59             public void stateChanged(ChangeEvent e) {
60                 //update value, string and children visible
61                 updateModelProperties();
62
63                 //call callback function if exists
64                 if (callback != null) {
65                     callback.actionPerformed(null);
66                 }
67             }
68         };
69
70         addChangeListener(listener);
71     }
72
73     public void setId(Integer id) {
74         this.id = id;
75     }
76
77     public Integer getId() {
78         return id;
79     }
80
81     public void update(int property, Object value) {
82         switch (property) {
83             case __GO_VISIBLE__:
84                 setVisible((Boolean) value);
85                 break;
86             case __GO_UI_TITLE_POSITION__:
87                 Integer pos = (Integer) value;
88                 switch (Uicontrol.TitlePositionType.intToEnum(pos)) {
89                     case BOTTOM:
90                         setTabPlacement(JTabbedPane.BOTTOM);
91                         break;
92                     case LEFT:
93                         setTabPlacement(JTabbedPane.LEFT);
94                         break;
95                     case RIGHT:
96                         setTabPlacement(JTabbedPane.RIGHT);
97                         break;
98                     case TOP:
99                     default:
100                         setTabPlacement(JTabbedPane.TOP);
101                         break;
102                 }
103                 break;
104             case __GO_UI_TITLE_SCROLL__:
105                 if ((Boolean) value) {
106                     setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
107                 } else {
108                     setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
109                 }
110                 break;
111             case __GO_UI_FONTNAME__:
112             case __GO_UI_FONTANGLE__:
113             case __GO_UI_FONTSIZE__:
114             case __GO_UI_FONTWEIGHT__: {
115                 for (int i = 0; i < getTabCount(); i++) {
116                     setTitleAt(i, null);
117                 }
118                 break;
119             }
120             case __GO_POSITION__: {
121                 Double[] positions = (Double[]) value;
122                 setSize(positions[2].intValue(), positions[3].intValue());
123                 Position javaPosition = PositionConverter.scilabToJava(new Position(positions[0].intValue(), positions[1].intValue()), new Size(getSize().width, getSize().height), getParent());
124                 setLocation(javaPosition.getX(), javaPosition.getY());
125                 break;
126             }
127             case __GO_UI_VALUE__: {
128                 Double[] doubleValue = ((Double[]) value);
129                 if (doubleValue.length == 0) {
130                     return;
131                 }
132
133                 Integer val = doubleValue[0].intValue();
134                 //if intValue[0] is out of bounds, do not update view but let "wrong" value in model
135                 if (val > 0 && val <= getTabCount()) {
136                     setSelectedIndex(val - 1);
137                 }
138                 break;
139             }
140             case __GO_UI_STRING__: {
141                 //set tab by his name
142                 String name = ((String[]) value)[0];
143                 for (int i = 0; i < getTabCount(); i++) {
144                     JLabel current = (JLabel) getTabComponentAt(i);
145                     if (current != null && current.getText() != null && current.getText().equals(name)) {
146                         setSelectedIndex(i);
147                         break;
148                     }
149                 }
150                 break;
151             }
152             case __GO_CALLBACK__: {
153                 int cbType = (Integer) GraphicController.getController().getProperty(getId(), __GO_CALLBACKTYPE__);
154                 callback = CommonCallBack.createCallback((String) value, cbType, getId());
155                 break;
156             }
157             case __GO_CALLBACKTYPE__: {
158                 String cbString = (String) GraphicController.getController().getProperty(getId(), __GO_CALLBACK__);
159                 if ((Integer) value == CallBack.UNTYPED) {
160                     //Disable callback
161                     callback = null;
162                 } else {
163                     callback = CommonCallBack.createCallback(cbString, (Integer) value, getId());
164                 }
165                 break;
166             }
167             default: {
168             }
169         }
170     }
171
172     public void insertTab(String title, Icon icon, Component component, String tooltip, int index) {
173         super.insertTab(title, icon, component, tooltip, index);
174         setTitleAt(index, title);
175         setSelectedIndex(index);
176     }
177
178     public void updateModelProperties() {
179         GraphicController controller = GraphicController.getController();
180
181         int index = getSelectedIndex();
182
183         //get current id
184         Double[] prev = (Double[]) controller.getProperty(getId(), __GO_UI_VALUE__);
185         Integer previous = null;
186         if (prev != null && prev[0] != null) {
187             if (prev[0] == 0) {
188                 prev[0] = 1.0;
189             }
190             previous = ((SwingViewObject) getComponentAt(prev[0].intValue() - 1)).getId();
191         }
192         //get next id
193         Integer next = ((SwingViewObject) getComponentAt(index)).getId();
194
195         if (previous != null && previous != 0) {
196             //set visible false en previous selected children
197             controller.setProperty(previous, __GO_VISIBLE__, false);
198         }
199
200         if (next != null && next != 0) {
201             //set visible true on current selected children
202             controller.setProperty(next, __GO_VISIBLE__, true);
203         }
204
205         //update value with new selected tab index ( 1-indexed )
206         controller.setProperty(getId(), __GO_UI_TAB_VALUE__, new Double[] { (double) (index + 1) });
207         //update string with new selected tab name
208         String tabName = (String) controller.getProperty(next, __GO_TAG__);
209         controller.setProperty(getId(), __GO_UI_TAB_STRING__, new String[] {tabName});
210     }
211
212     public void setTitleAt(int index, String title) {
213         //super.setTitleAt(index, title);
214         String fontName = (String) GraphicController.getController().getProperty(getId(), __GO_UI_FONTNAME__);
215         Double fontSize = (Double) GraphicController.getController().getProperty(getId(), __GO_UI_FONTSIZE__);
216         String fontAngle = (String) GraphicController.getController().getProperty(getId(), __GO_UI_FONTANGLE__);
217         String fontWeight = (String) GraphicController.getController().getProperty(getId(), __GO_UI_FONTWEIGHT__);
218
219         int fontStyle = Font.PLAIN;
220         if (fontAngle.equals("italic")) {
221             fontStyle |= Font.ITALIC;
222         }
223
224         if (fontWeight.equals("bold")) {
225             fontStyle |= Font.BOLD;
226         }
227
228         JLabel label = null;
229         Component comp = getTabComponentAt(index);
230         if (comp instanceof JLabel) {
231             label = (JLabel) comp;
232         } else {
233             label = new JLabel();
234         }
235
236         Font oldFont = label.getFont();
237         Font font = new Font(fontName.equals("") == false ? fontName : oldFont.getFontName(), fontStyle, fontSize != 0.0 ? fontSize.intValue() : oldFont.getSize());
238
239         label.setFont(font);
240
241         if (title != null) {
242             label.setText(title);
243         }
244         setTabComponentAt(index, label);
245     }
246
247     public Boolean isTabActive(Component tab) {
248         if (getSelectedComponent() == tab) {
249             return true;
250         }
251
252         return false;
253     }
254
255     public Integer getIndex(Component component) {
256         for (int i = 0 ; i < getTabCount() ; i++) {
257             if (getComponentAt(i) == component) {
258                 return i;
259             }
260         }
261
262         return -1;
263     }
264
265     @Override
266     public void setEnabledAt(int index, boolean enabled) {
267         super.setEnabledAt(index, enabled);
268         //update tab label to show enabled state
269         getTabComponentAt(index).setEnabled(enabled);
270     }
271 }