Japanese translation
[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         if (newEnableState != super.isEnabled())
202         {
203             super.setEnabled(newEnableState);
204             getList().setEnabled(newEnableState);
205             if (newEnableState) {
206                 if (mouseListener != null) {
207                     getList().addMouseListener(mouseListener);
208                 }
209             } else {
210                 if (mouseListener != null) {
211                     getList().removeMouseListener(mouseListener);
212                 }
213             }
214         }
215     }
216
217     /**
218      * Add a callback to the CheckBox
219      * @param cb the callback to set.
220      */
221     public void setCallback(CommonCallBack cb) {
222         this.callback = cb;
223     }
224
225     /**
226      * Setter for MenuBar
227      * @param menuBarToAdd the MenuBar associated to the Tab.
228      */
229     public void addMenuBar(MenuBar menuBarToAdd) {
230         /* Unimplemented for ListBoxes */
231         throw new UnsupportedOperationException();
232     }
233
234     /**
235      * Setter for ToolBar
236      * @param toolBarToAdd the ToolBar associated to the Tab.
237      */
238     public void addToolBar(ToolBar toolBarToAdd) {
239         /* Unimplemented for ListBoxes */
240         throw new UnsupportedOperationException();
241     }
242
243     /**
244      * Getter for MenuBar
245      * @return MenuBar: the MenuBar associated to the Tab.
246      */
247     public MenuBar getMenuBar() {
248         /* Unimplemented for ListBoxes */
249         throw new UnsupportedOperationException();
250     }
251
252     /**
253      * Getter for ToolBar
254      * @return ToolBar: the ToolBar associated to the Tab.
255      */
256     public ToolBar getToolBar() {
257         /* Unimplemented for ListBoxes */
258         throw new UnsupportedOperationException();
259     }
260
261     /**
262      * Get the first item text
263      * @return the items
264      * @see org.scilab.modules.gui.widget.Widget#getText()
265      */
266     public String getText() {
267         /* Unimplemented for ListBoxes */
268         throw new UnsupportedOperationException();
269     }
270
271     /**
272      * Get the text of all the list items
273      * @return the items
274      * @see org.scilab.modules.gui.listbox.ListBox#getAllItemsText()
275      */
276     public String[] getAllItemsText() {
277         String[] retValue = new String[getList().getModel().getSize()];
278         for (int i = 0; i < getList().getModel().getSize(); i++) {
279             retValue[i] = (String) getList().getModel().getElementAt(i);
280         }
281         return retValue;
282     }
283
284     /**
285      * Get the number of items in the list
286      * @return the number of items
287      * @see org.scilab.modules.gui.listbox.ListBox#getNumberOfItems()
288      */
289     public int getNumberOfItems() {
290         return getList().getModel().getSize();
291     }
292
293     /**
294      * Set the text of the list items
295      * @param text the text of the items
296      * @see org.scilab.modules.gui.widget.Widget#setText(java.lang.String)
297      */
298     public void setText(String text) {
299         DefaultListModel model = new DefaultListModel();
300         model.addElement(text);
301         getList().setModel(model);
302         revalidate();
303     }
304
305     /**
306      * Set the text of the list items
307      * @param text the text of the items
308      * @see org.scilab.modules.gui.widget.Widget#setText(java.lang.String)
309      */
310     public void setText(String[] text) {
311         /* Do we need to update the strings */
312         /* Test performed to avoid loops when the model is updated from here */
313         boolean updateNeeded = false;
314         String[] previousText = getAllItemsText();
315         if (previousText.length != text.length) {
316             updateNeeded = true;
317         } else {
318             for (int k = 0; k < text.length; k++) {
319                 if (text[k].compareTo(previousText[k]) != 0) {
320                     updateNeeded = true;
321                     break;
322                 }
323             }
324         }
325         if (!updateNeeded) {
326             return;
327         }
328
329         DefaultListModel model = new DefaultListModel();
330         for (int i = 0; i < text.length; i++) {
331             model.addElement(text[i]);
332         }
333         getList().setModel(model);
334         revalidate();
335     }
336
337     /**
338      * Set the horizontal alignment for the ListBox text
339      * @param alignment the value for the alignment (See ScilabAlignment.java)
340      */
341     public void setHorizontalAlignment(String alignment) {
342         // Nothing to do here
343     }
344
345     /**
346      * Set the vertical alignment for the ListBox text
347      * @param alignment the value for the alignment (See ScilabAlignment.java)
348      */
349     public void setVerticalAlignment(String alignment) {
350         // Nothing to do here
351     }
352
353     /**
354      * Set if more than one item can be selected in a ListBox
355      * @param status true if multiple selection is enabled
356      */
357     public void setMultipleSelectionEnabled(boolean status) {
358         if (status) {
359             getList().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
360         } else {
361             getList().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
362         }
363     }
364
365     /**
366      * Set the selected indices of the ListBox
367      * @param indices the indices of the items to be selected
368      */
369     public void setSelectedIndices(int[] indices) {
370         // Scilab indices in Value begin at 1 and Java indices begin at 0
371         int[] javaIndices = indices.clone();
372         for (int i = 0; i < javaIndices.length; i++) {
373             javaIndices[i] = javaIndices[i] - 1;
374         }
375
376         /* Remove the listener to avoid the callback to be executed */
377         if (mouseListener != null) {
378             getList().removeMouseListener(mouseListener);
379         }
380
381         getList().setSelectedIndices(javaIndices);
382
383         /* Put back the listener */
384         if (mouseListener != null) {
385             getList().addMouseListener(mouseListener);
386         }
387     }
388
389     /**
390      * Get the selected indices of the ListBox
391      * @return the indices of the items selected
392      */
393     public int[] getSelectedIndices() {
394         // Scilab indices in Value begin at 1 and Java indices begin at 0
395         int[] javaIndices = getList().getSelectedIndices().clone();
396         int[] scilabIndices = javaIndices.clone();
397         for (int i = 0; i < getList().getSelectedIndices().length; i++) {
398             scilabIndices[i] = scilabIndices[i] + 1;
399         }
400         return scilabIndices;
401     }
402
403     /**
404      * Get the number of items selected in the ListBox
405      * @return the number of items selected
406      */
407     public int getSelectionSize() {
408         return getList().getSelectedIndices().length;
409     }
410
411     /**
412      * Get or create the list component
413      * @return the list
414      */
415     private JList getList() {
416         if (list == null) {
417             list = new JList();
418             list.setLayoutOrientation(JList.VERTICAL);
419             list.setModel(new DefaultListModel());
420         }
421         return list;
422     }
423
424     /**
425      * Set the Relief of the ListBox
426      * @param reliefType the type of the relief to set (See ScilabRelief.java)
427      */
428     public void setRelief(String reliefType) {
429         setBorder(ScilabRelief.getBorderFromRelief(reliefType));
430     }
431
432     /**
433      * Destroy the ListBox
434      */
435     public void destroy() {
436         ScilabSwingUtilities.removeFromParent(this);
437     }
438
439     /**
440      * Setter for InfoBar
441      * @param infoBarToAdd the InfoBar associated to the ListBox.
442      */
443     public void addInfoBar(TextBox infoBarToAdd) {
444         /* Unimplemented for ListBoxes */
445         throw new UnsupportedOperationException();
446     }
447
448     /**
449      * Getter for InfoBar
450      * @return the InfoBar associated to the ListBox.
451      */
452     public TextBox getInfoBar() {
453         /* Unimplemented for ListBoxes */
454         throw new UnsupportedOperationException();
455     }
456
457     /**
458      * Adjusts the view so that the element given by index is displayed at the top of the ListBox.
459      * @param index the index of the element to be displayed at the top of the ListBox.
460      */
461     public void setListBoxTop(int index) {
462         if (index > 0) {
463             getViewport().setViewPosition(getList().getUI().indexToLocation(getList(), index - 1));
464             doLayout();
465         }
466     }
467
468     /**
469      * Gets the index of the element displayed at the top of the ListBox
470      * @return the index of the element displayed at the top of the ListBox
471      */
472     public int getListBoxTop() {
473         return getList().getUI().locationToIndex(getList(), getViewport().getViewPosition()) + 1;
474     }
475
476     /**
477      * Set the UID
478      * @param id the UID
479      */
480     public void setId(String id) {
481         uid = id;
482     }
483
484     /**
485      * Get the UID
486      * @return the UID
487      */
488     public String getId() {
489         return uid;
490     }
491
492     /**
493      * Generic update method
494      * @param property property name
495      * @param value property value
496      */
497     public void update(int property, Object value) {
498         SwingViewWidget.update(this, property, value);
499     }
500 }