Fix listbox & popumenu uicontrols tests.
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / listbox / SwingScilabListBox.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2007 - INRIA - Vincent Couvert
4  * Copyright (C) 2007 - INRIA - Marouane BEN JELLOUL
5  * Copyright (C) 2010-2011 - DIGITEO - Vincent COUVERT
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14
15 package org.scilab.modules.gui.bridge.listbox;
16
17 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_VALUE__;
18
19 import java.awt.Color;
20 import java.awt.Font;
21 import java.awt.event.MouseEvent;
22 import java.awt.event.MouseListener;
23
24 import javax.swing.DefaultListModel;
25 import javax.swing.JList;
26 import javax.swing.JScrollPane;
27 import javax.swing.ListSelectionModel;
28
29 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
30 import org.scilab.modules.gui.SwingViewWidget;
31 import org.scilab.modules.gui.SwingViewObject;
32 import org.scilab.modules.gui.events.callback.CommonCallBack;
33 import org.scilab.modules.gui.listbox.SimpleListBox;
34 import org.scilab.modules.gui.menubar.MenuBar;
35 import org.scilab.modules.gui.textbox.TextBox;
36 import org.scilab.modules.gui.toolbar.ToolBar;
37 import org.scilab.modules.gui.utils.Position;
38 import org.scilab.modules.gui.utils.PositionConverter;
39 import org.scilab.modules.gui.utils.ScilabRelief;
40 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
41 import org.scilab.modules.gui.utils.Size;
42
43 /**
44  * Swing implementation for Scilab ListBox in GUIs
45  * @author Vincent COUVERT
46  * @author Marouane BEN JELLOUL
47  */
48 public class SwingScilabListBox extends JScrollPane implements SwingViewObject, SimpleListBox {
49
50     private static final long serialVersionUID = 3507396207331058895L;
51
52     private String uid;
53
54     private CommonCallBack callback;
55
56     private MouseListener mouseListener;
57
58     /**
59      * the JList we use
60      */
61     private JList list;
62
63     /**
64      * Constructor
65      */
66     public SwingScilabListBox() {
67         super();
68         getViewport().add(getList());
69
70         mouseListener = new MouseListener() {
71             public void mouseClicked(MouseEvent e) {
72                 // Scilab indices in Value begin at 1 and Java indices begin at 0
73                 int[] javaIndices = getList().getSelectedIndices().clone();
74                 Double[] scilabIndices = new Double[javaIndices.length];
75                 for (int i = 0; i < getList().getSelectedIndices().length; i++) {
76                     scilabIndices[i] = (double) javaIndices[i] + 1;
77                 }
78                 GraphicController.getController().setProperty(uid, __GO_UI_VALUE__, scilabIndices);
79                 if (e.getButton() == MouseEvent.BUTTON1 && callback != null) {
80                     callback.actionPerformed(null);
81                 }
82             }
83             public void mouseEntered(MouseEvent arg0) { }
84             public void mouseExited(MouseEvent arg0) { }
85             public void mousePressed(MouseEvent arg0) { }
86             public void mouseReleased(MouseEvent arg0) { }
87         };
88         getList().addMouseListener(mouseListener);
89     }
90
91     /**
92      * To get the Background color of the element.
93      * @return color the Color
94      */
95     public Color getBackground() {
96         return getList().getBackground();
97     }
98
99     /**
100      * To get the Font of the element.
101      * @return font the Font
102      */
103     public Font getFont() {
104         return getList().getFont();
105     }
106
107     /**
108      * To get the Foreground color of the element.
109      * @return color the Color
110      */
111     public Color getForeground() {
112         return getList().getForeground();
113     }
114
115     /**
116      * To set the Background color of the element.
117      * @param color the Color
118      */
119     public void setBackground(Color color) {
120         getList().setBackground(color);
121     }
122
123     /**
124      * To set the Font of the element.
125      * @param font the Font
126      */
127     public void setFont(Font font) {
128         getList().setFont(font);
129     }
130
131     /**
132      * To set the Foreground color of the element.
133      * @param color the Color
134      */
135     public void setForeground(Color color) {
136         getList().setForeground(color);
137     }
138
139     /**
140      * Draws a swing Scilab tab
141      * @see org.scilab.modules.gui.uielement.UIElement#draw()
142      */
143     public void draw() {
144         this.setVisible(true);
145         this.doLayout();
146     }
147
148     /**
149      * Gets the dimensions (width and height) of a swing Scilab tab
150      * @return the dimensions of the tab
151      * @see org.scilab.modules.gui.uielement.UIElement#getDims()
152      */
153     public Size getDims() {
154         return new Size(getWidth(), getHeight());
155     }
156
157     /**
158      * Gets the position (X-coordinate and Y-coordinate) of a swing Scilab tab
159      * @return the position of the tab
160      * @see org.scilab.modules.gui.uielement.UIElement#getPosition()
161      */
162     public Position getPosition() {
163         return PositionConverter.javaToScilab(getLocation(), getSize(), getParent());
164     }
165
166     /**
167      * Sets the dimensions (width and height) of a swing Scilab tab
168      * @param newSize the dimensions we want to set to the tab
169      * @see org.scilab.modules.gui.uielement.UIElement#setDims(org.scilab.modules.gui.utils.Size)
170      */
171     public void setDims(Size newSize) {
172         setSize(newSize.getWidth(), newSize.getHeight());
173     }
174
175     /**
176      * Sets the position (X-coordinate and Y-coordinate) of a swing Scilab tab
177      * @param newPosition the position we want to set to the tab
178      * @see org.scilab.modules.gui.uielement.UIElement#setPosition(org.scilab.modules.gui.utils.Position)
179      */
180     public void setPosition(Position newPosition) {
181         Position javaPosition = PositionConverter.scilabToJava(newPosition, getDims(), getParent());
182         setLocation(javaPosition.getX(), javaPosition.getY());
183     }
184
185     /**
186      * Sets the visibility status of an UIElement
187      * @param newVisibleState the visibility status we want to set for the UIElement
188      *                      (true if the UIElement is visible, false if not)
189      */
190     public void setVisible(boolean newVisibleState) {
191         super.setVisible(newVisibleState);
192         list.setVisible(newVisibleState);
193     }
194
195     /**
196      * Sets the enable status of an UIElement
197      * @param newEnableState the enable status we want to set for the UIElement
198      *                      (true if the UIElement is enabled, false if not)
199      */
200     public void setEnabled(boolean newEnableState) {
201         super.setEnabled(newEnableState);
202         getList().setEnabled(newEnableState);
203         if (newEnableState) {
204             if (mouseListener != null) {
205                 getList().addMouseListener(mouseListener);
206             }
207         } else {
208             if (mouseListener != null) {
209                 getList().removeMouseListener(mouseListener);
210             }
211         }
212     }
213
214     /**
215      * Add a callback to the CheckBox
216      * @param cb the callback to set.
217      */
218     public void setCallback(CommonCallBack cb) {
219         this.callback = cb;
220     }
221
222     /**
223      * Setter for MenuBar
224      * @param menuBarToAdd the MenuBar associated to the Tab.
225      */
226     public void addMenuBar(MenuBar menuBarToAdd) {
227         /* Unimplemented for ListBoxes */
228         throw new UnsupportedOperationException();
229     }
230
231     /**
232      * Setter for ToolBar
233      * @param toolBarToAdd the ToolBar associated to the Tab.
234      */
235     public void addToolBar(ToolBar toolBarToAdd) {
236         /* Unimplemented for ListBoxes */
237         throw new UnsupportedOperationException();
238     }
239
240     /**
241      * Getter for MenuBar
242      * @return MenuBar: the MenuBar associated to the Tab.
243      */
244     public MenuBar getMenuBar() {
245         /* Unimplemented for ListBoxes */
246         throw new UnsupportedOperationException();
247     }
248
249     /**
250      * Getter for ToolBar
251      * @return ToolBar: the ToolBar associated to the Tab.
252      */
253     public ToolBar getToolBar() {
254         /* Unimplemented for ListBoxes */
255         throw new UnsupportedOperationException();
256     }
257
258     /**
259      * Get the first item text
260      * @return the items
261      * @see org.scilab.modules.gui.widget.Widget#getText()
262      */
263     public String getText() {
264         /* Unimplemented for ListBoxes */
265         throw new UnsupportedOperationException();
266     }
267
268     /**
269      * Get the text of all the list items
270      * @return the items
271      * @see org.scilab.modules.gui.listbox.ListBox#getAllItemsText()
272      */
273     public String[] getAllItemsText() {
274         String[] retValue = new String[getList().getModel().getSize()];
275         for (int i = 0; i < getList().getModel().getSize(); i++) {
276             retValue[i] = (String) getList().getModel().getElementAt(i);
277         }
278         return retValue;
279     }
280
281     /**
282      * Get the number of items in the list
283      * @return the number of items
284      * @see org.scilab.modules.gui.listbox.ListBox#getNumberOfItems()
285      */
286     public int getNumberOfItems() {
287         return getList().getModel().getSize();
288     }
289
290     /**
291      * Set the text of the list items
292      * @param text the text of the items
293      * @see org.scilab.modules.gui.widget.Widget#setText(java.lang.String)
294      */
295     public void setText(String text) {
296         DefaultListModel model = new DefaultListModel();
297         model.addElement(text);
298         getList().setModel(model);
299         revalidate();
300     }
301
302     /**
303      * Set the text of the list items
304      * @param text the text of the items
305      * @see org.scilab.modules.gui.widget.Widget#setText(java.lang.String)
306      */
307     public void setText(String[] text) {
308         /* Do we need to update the strings */
309         /* Test performed to avoid loops when the model is updated from here */
310         boolean updateNeeded = false;
311         String[] previousText = getAllItemsText();
312         if (previousText.length != text.length) {
313             updateNeeded = true;
314         } else {
315             for (int k = 0; k < text.length; k++) {
316                 if (text[k].compareTo(previousText[k]) != 0) {
317                     updateNeeded = true;
318                     break;
319                 }
320             }
321         }
322         if (!updateNeeded) {
323             return;
324         }
325
326         DefaultListModel model = new DefaultListModel();
327         for (int i = 0; i < text.length; i++) {
328             model.addElement(text[i]);
329         }
330         getList().setModel(model);
331         revalidate();
332     }
333
334     /**
335      * Set the horizontal alignment for the ListBox text
336      * @param alignment the value for the alignment (See ScilabAlignment.java)
337      */
338     public void setHorizontalAlignment(String alignment) {
339         // Nothing to do here
340     }
341
342     /**
343      * Set the vertical alignment for the ListBox text
344      * @param alignment the value for the alignment (See ScilabAlignment.java)
345      */
346     public void setVerticalAlignment(String alignment) {
347         // Nothing to do here
348     }
349
350     /**
351      * Set if more than one item can be selected in a ListBox
352      * @param status true if multiple selection is enabled
353      */
354     public void setMultipleSelectionEnabled(boolean status) {
355         if (status) {
356             getList().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
357         } else {
358             getList().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
359         }
360     }
361
362     /**
363      * Set the selected indices of the ListBox
364      * @param indices the indices of the items to be selected
365      */
366     public void setSelectedIndices(int[] indices) {
367         // Scilab indices in Value begin at 1 and Java indices begin at 0
368         int[] javaIndices = indices.clone();
369         for (int i = 0; i < javaIndices.length; i++) {
370             javaIndices[i] = javaIndices[i] - 1;
371         }
372
373         /* Remove the listener to avoid the callback to be executed */
374         if (mouseListener != null) {
375             getList().removeMouseListener(mouseListener);
376         }
377
378         getList().setSelectedIndices(javaIndices);
379
380         /* Put back the listener */
381         if (mouseListener != null) {
382             getList().addMouseListener(mouseListener);
383         }
384     }
385
386     /**
387      * Get the selected indices of the ListBox
388      * @return the indices of the items selected
389      */
390     public int[] getSelectedIndices() {
391         // Scilab indices in Value begin at 1 and Java indices begin at 0
392         int[] javaIndices = getList().getSelectedIndices().clone();
393         int[] scilabIndices = javaIndices.clone();
394         for (int i = 0; i < getList().getSelectedIndices().length; i++) {
395             scilabIndices[i] = scilabIndices[i] + 1;
396         }
397         return scilabIndices;
398     }
399
400     /**
401      * Get the number of items selected in the ListBox
402      * @return the number of items selected
403      */
404     public int getSelectionSize() {
405         return getList().getSelectedIndices().length;
406     }
407
408     /**
409      * Get or create the list component
410      * @return the list
411      */
412     private JList getList() {
413         if (list == null) {
414             list = new JList();
415             list.setLayoutOrientation(JList.VERTICAL);
416             list.setModel(new DefaultListModel());
417         }
418         return list;
419     }
420
421     /**
422      * Set the Relief of the ListBox
423      * @param reliefType the type of the relief to set (See ScilabRelief.java)
424      */
425     public void setRelief(String reliefType) {
426         setBorder(ScilabRelief.getBorderFromRelief(reliefType));
427     }
428
429     /**
430      * Destroy the ListBox
431      */
432     public void destroy() {
433         ScilabSwingUtilities.removeFromParent(this);
434     }
435
436     /**
437      * Setter for InfoBar
438      * @param infoBarToAdd the InfoBar associated to the ListBox.
439      */
440     public void addInfoBar(TextBox infoBarToAdd) {
441         /* Unimplemented for ListBoxes */
442         throw new UnsupportedOperationException();
443     }
444
445     /**
446      * Getter for InfoBar
447      * @return the InfoBar associated to the ListBox.
448      */
449     public TextBox getInfoBar() {
450         /* Unimplemented for ListBoxes */
451         throw new UnsupportedOperationException();
452     }
453
454     /**
455      * Adjusts the view so that the element given by index is displayed at the top of the ListBox.
456      * @param index the index of the element to be displayed at the top of the ListBox.
457      */
458     public void setListBoxTop(int index) {
459         if (index > 0) {
460             getViewport().setViewPosition(getList().getUI().indexToLocation(getList(), index - 1));
461             doLayout();
462         }
463     }
464
465     /**
466      * Gets the index of the element displayed at the top of the ListBox
467      * @return the index of the element displayed at the top of the ListBox
468      */
469     public int getListBoxTop() {
470         return getList().getUI().locationToIndex(getList(), getViewport().getViewPosition()) + 1;
471     }
472
473     /**
474      * Set the UID
475      * @param id the UID
476      */
477     public void setId(String id) {
478         uid = id;
479     }
480
481     /**
482      * Get the UID
483      * @return the UID
484      */
485     public String getId() {
486         return uid;
487     }
488
489     /**
490      * Generic update method
491      * @param property property name
492      * @param value property value
493      */
494     public void update(int property, Object value) {
495         SwingViewWidget.update(this, property, value);
496     }
497 }