40f6e4ee504d0cce6f88622ff1e2819e931e753f
[scilab.git] / scilab / modules / gui / src / java / org / scilab / modules / gui / bridge / label / SwingScilabLabel.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.1-en.txt
12  *
13  */
14 package org.scilab.modules.gui.bridge.label;
15
16 import static org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties.__GO_UI_ICON__;
17
18 import java.awt.Color;
19 import java.awt.Dimension;
20 import java.awt.Font;
21 import java.awt.Graphics;
22 import java.awt.Graphics2D;
23 import java.awt.GraphicsConfiguration;
24 import java.awt.GraphicsDevice;
25 import java.awt.GraphicsEnvironment;
26 import java.awt.GridBagConstraints;
27 import java.awt.GridBagLayout;
28 import java.awt.Image;
29 import java.awt.image.BufferedImage;
30 import java.io.File;
31 import java.io.IOException;
32
33 import javax.imageio.ImageIO;
34 import javax.swing.BorderFactory;
35 import javax.swing.GrayFilter;
36 import javax.swing.Icon;
37 import javax.swing.ImageIcon;
38 import javax.swing.JComponent;
39 import javax.swing.JEditorPane;
40 import javax.swing.JLabel;
41 import javax.swing.JPanel;
42 import javax.swing.JScrollPane;
43 import javax.swing.JTextPane;
44 import javax.swing.SwingConstants;
45 import javax.swing.UIManager;
46 import javax.swing.border.Border;
47 import javax.swing.event.HyperlinkEvent;
48 import javax.swing.event.HyperlinkListener;
49 import javax.swing.text.html.HTMLDocument;
50 import javax.swing.text.html.StyleSheet;
51
52 import org.scilab.forge.jlatexmath.TeXConstants;
53 import org.scilab.forge.jlatexmath.TeXFormula;
54 import org.scilab.forge.jlatexmath.TeXIcon;
55 import org.scilab.modules.commons.gui.FindIconHelper;
56 import org.scilab.modules.console.utils.ScilabSpecialTextUtilities;
57 import org.scilab.modules.graphic_objects.graphicController.GraphicController;
58 import org.scilab.modules.gui.SwingViewObject;
59 import org.scilab.modules.gui.SwingViewWidget;
60 import org.scilab.modules.gui.bridge.label.SwingScilabLabel.IconLabel.IconType;
61 import org.scilab.modules.gui.events.callback.CommonCallBack;
62 import org.scilab.modules.gui.label.SimpleLabel;
63 import org.scilab.modules.gui.menubar.MenuBar;
64 import org.scilab.modules.gui.textbox.TextBox;
65 import org.scilab.modules.gui.toolbar.ToolBar;
66 import org.scilab.modules.gui.utils.Position;
67 import org.scilab.modules.gui.utils.PositionConverter;
68 import org.scilab.modules.gui.utils.ScilabAlignment;
69 import org.scilab.modules.gui.utils.ScilabRelief;
70 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
71 import org.scilab.modules.gui.utils.Size;
72 import org.scilab.modules.gui.utils.WebBrowser;
73
74 /**
75  * Swing implementation for Scilab Labels in GUIs
76  * @author Vincent COUVERT
77  * @author Marouane BEN JELLOUL
78  */
79 public class SwingScilabLabel extends JScrollPane implements SwingViewObject, SimpleLabel {
80
81     private enum LabelStyle {
82         TEXT, LATEX, MATHML, HTML
83     };
84
85     private static final long serialVersionUID = 7177323379068859441L;
86
87     private Integer uid;
88
89     private JComponent label = new JLabel(" ");
90
91     private Border defaultBorder = null;
92
93     private LabelStyle labelStyle = null;
94
95     private String horizontalAlignment = "left"; //Horizontal alignment property
96
97     private String verticalAlignment = "middle"; // Vertical alignment property
98
99     private final JPanel alignmentPanel = new JPanel(); // Used for alignment
100
101     private final GridBagLayout alignmentLayout = new GridBagLayout();
102
103     private String labelText = ""; // Used to save user given text
104
105     private static HyperlinkListener urlOpener = new HyperlinkListener() {
106         public void hyperlinkUpdate(HyperlinkEvent event) {
107             if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
108                 WebBrowser.openUrl(event.getURL(), event.getDescription());
109             }
110         }
111     };
112
113     /**
114      * Constructor
115      */
116     public SwingScilabLabel() {
117         super();
118         alignmentPanel.setLayout(alignmentLayout);
119         setViewportView(label);
120         setBorder(BorderFactory.createEmptyBorder());
121         setViewportBorder(BorderFactory.createEmptyBorder());
122         setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
123         setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
124         // Initialize display
125         setAlignment();
126     }
127
128     /**
129      * Apply a new font for the label.
130      * @param font new font to use.
131      */
132     public void setFont(Font font) {
133         super.setFont(font);
134         if (label != null) {
135             label.setFont(font);
136             if (labelStyle == LabelStyle.HTML) {
137                 StyleSheet styleSheet = ((HTMLDocument) ((JTextPane) label).getDocument()).getStyleSheet();
138                 styleSheet.addRule("body {font-family:" + font.getName() + ";}");
139                 styleSheet.addRule("body {font-size:" + font.getSize() + "pt;}");
140                 if (font.isBold()) {
141                     styleSheet.addRule("body {font-weight:bold;}");
142                 } else {
143                     styleSheet.addRule("body {font-weight:normal;}");
144                 }
145                 if (font.isItalic()) {
146                     styleSheet.addRule("body {font-style:italic;}");
147                 } else {
148                     styleSheet.addRule("body {font-style:normal;}");
149                 }
150             }
151         }
152     }
153
154     /**
155      * To set the Foreground color of the element.
156      * @param color the Color
157      */
158     public void setForeground(Color color) {
159         super.setForeground(color);
160         if (label != null) {
161             label.setForeground(color);
162         }
163     }
164
165     public void setEnabled(boolean enabled) {
166         super.setEnabled(enabled);
167         if (label != null) {
168             label.setEnabled(enabled);
169         }
170     }
171
172     /**
173      * To set the Background color of the element.
174      * @param color the Color
175      */
176     public void setBackground(Color color) {
177         super.setBackground(color);
178         if (alignmentPanel != null) {
179             alignmentPanel.setBackground(color);
180         }
181         if (label != null) {
182             if (label instanceof JLabel) {
183                 ((JLabel) label).setOpaque(true);
184             }
185             label.setBackground(color);
186         }
187     }
188
189     /**
190      * Draws a swing Scilab PushButton
191      * @see org.scilab.modules.gui.uielement.UIElement#draw()
192      */
193     public void draw() {
194         this.setVisible(true);
195         this.doLayout();
196     }
197
198     /**
199      * Gets the dimensions (width and height) of a swing Scilab element
200      * @return the dimensions of the element
201      * @see org.scilab.modules.gui.uielement.UIElement#getDims()
202      */
203     public Size getDims() {
204         return new Size(getWidth(), getHeight());
205     }
206
207     /**
208      * Gets the position (X-coordinate and Y-coordinate) of a swing Scilab
209      * element
210      * @return the position of the element
211      * @see org.scilab.modules.gui.uielement.UIElement#getPosition()
212      */
213     public Position getPosition() {
214         return PositionConverter.javaToScilab(getLocation(), getSize(), getParent());
215     }
216
217     /**
218      * Sets the dimensions (width and height) of a swing Scilab element
219      * @param newSize the dimensions to set to the element
220      * @see org.scilab.modules.gui.uielement.UIElement#setDims(org.scilab.modules.gui.utils.Size)
221      */
222     public void setDims(Size newSize) {
223         setSize(newSize.getWidth(), newSize.getHeight());
224         // Need validate to force alignement to be applyed
225         setMinimumSize(new Dimension(Math.max((int) label.getMinimumSize().getWidth(), newSize.getWidth()), (int) label.getMinimumSize().getHeight()));
226     }
227
228     /**
229      * Sets the position (X-coordinate and Y-coordinate) of a swing Scilab
230      * element
231      * @param newPosition the position to set to the element
232      * @see org.scilab.modules.gui.uielement.UIElement#setPosition(org.scilab.modules.gui.utils.Position)
233      */
234     public void setPosition(Position newPosition) {
235         Position javaPosition = PositionConverter.scilabToJava(newPosition, getDims(), getParent());
236         setLocation(javaPosition.getX(), javaPosition.getY());
237     }
238
239     /**
240      * Add a callback to the Label
241      * @param callback the callback to set.
242      */
243     public void setCallback(CommonCallBack callback) {
244         // Nothing to do...
245     }
246
247     /**
248      * Setter for MenuBar
249      * @param menuBarToAdd the MenuBar associated to the Label.
250      */
251     public void addMenuBar(MenuBar menuBarToAdd) {
252         /* Unimplemented for Labels */
253         throw new UnsupportedOperationException();
254     }
255
256     /**
257      * Setter for ToolBar
258      * @param toolBarToAdd the ToolBar associated to the Label.
259      */
260     public void addToolBar(ToolBar toolBarToAdd) {
261         /* Unimplemented for Labels */
262         throw new UnsupportedOperationException();
263     }
264
265     /**
266      * Getter for MenuBar
267      * @return MenuBar: the MenuBar associated to the Label.
268      */
269     public MenuBar getMenuBar() {
270         /* Unimplemented for Labels */
271         throw new UnsupportedOperationException();
272     }
273
274     /**
275      * Getter for ToolBar
276      * @return ToolBar: the ToolBar associated to the Label.
277      */
278     public ToolBar getToolBar() {
279         /* Unimplemented for Labels */
280         throw new UnsupportedOperationException();
281     }
282
283     /**
284      * Set the horizontal alignment for the Label text
285      * @param alignment the value for the alignment (See ScilabAlignment.java)
286      */
287     public void setHorizontalAlignment(String alignment) {
288         horizontalAlignment = alignment;
289         setAlignment();
290     }
291
292     /**
293      * Set the vertical alignment for the Label text
294      * @param alignment the value for the alignment (See ScilabAlignment.java)
295      */
296     public void setVerticalAlignment(String alignment) {
297         verticalAlignment = alignment;
298         setAlignment();
299
300     }
301
302     /**
303      * Set the Relief of the Label
304      * @param reliefType the type of the relief to set (See ScilabRelief.java)
305      */
306     public void setRelief(String reliefType) {
307         if (defaultBorder == null) {
308             defaultBorder = getBorder();
309         }
310         setBorder(ScilabRelief.getBorderFromRelief(reliefType, defaultBorder));
311     }
312
313     /**
314      * Destroy the Label
315      */
316     public void destroy() {
317         ScilabSwingUtilities.removeFromParent(this);
318     }
319
320     /**
321      * Setter for InfoBar
322      * @param infoBarToAdd the InfoBar associated to the Label.
323      */
324     public void addInfoBar(TextBox infoBarToAdd) {
325         /* Unimplemented for Labels */
326         throw new UnsupportedOperationException();
327     }
328
329     /**
330      * Getter for InfoBar
331      * @return the InfoBar associated to the Label.
332      */
333     public TextBox getInfoBar() {
334         /* Unimplemented for Labels */
335         throw new UnsupportedOperationException();
336     }
337
338     /**
339      * get the text displayed in the label
340      * @return the label
341      * @see org.scilab.modules.gui.text.SimpleText#getText()
342      */
343     public String getText() {
344         return labelText;
345     }
346
347     /**
348      * Set the text displayed in the label
349      * @param newText the text
350      * @see org.scilab.modules.gui.text.SimpleText#setText(java.lang.String)
351      */
352     public void setText(String newText) {
353         // Save the data given by the user so that it can be retrieved
354         // (Java adds HTML tags in the getlabel().getText() returned value)
355
356         // <math></math>    : LateXLabel ( MathML )
357         // <html></html>    : JTextPane for clickable links
358         // $...$            : LateXLabel ( LateX )
359         // else             : JLabel
360
361         if (newText.equals("")) {
362             labelText = " ";
363         } else {
364             labelText = newText;
365         }
366
367         if (labelText.startsWith("<math>") && labelText.endsWith("</math>")) {
368             boolean mathML = ScilabSpecialTextUtilities.setText(new JLabel(), labelText);
369
370             //if MAthML rendering failed use normal renderer ( JLabel)
371             if (mathML) {
372                 changeLabelType(LabelStyle.MATHML);
373                 ((IconLabel) label).setText(labelText);
374             } else {
375                 changeLabelType(LabelStyle.TEXT);
376                 ((JLabel) label).setText(labelText);
377             }
378             return;
379         }
380
381         if (labelText.startsWith("<html>") && labelText.endsWith("</html>")) {
382             changeLabelType(LabelStyle.HTML);
383             ((JEditorPane) label).setText(labelText);
384             return;
385         }
386
387         if (labelText.startsWith("$") && labelText.endsWith("$")) {
388             boolean latex = ScilabSpecialTextUtilities.setText(new JLabel(), labelText);
389
390             //if MAthML rendering failed use normal renderer ( JLabel)
391             if (latex) {
392                 changeLabelType(LabelStyle.LATEX);
393                 ((IconLabel) label).setText(labelText);
394             } else {
395                 changeLabelType(LabelStyle.TEXT);
396                 ((JLabel) label).setText(labelText);
397             }
398             return;
399         }
400
401         changeLabelType(LabelStyle.TEXT);
402         ((JLabel) label).setText(labelText);
403
404         ((JLabel) label).invalidate();
405         ((JLabel) label).validate();
406         ((JLabel) label).repaint();
407     }
408
409     /**
410      * Change Label type to switch between JLabel abd JEditorPane JLabel is
411      * quicker on simple text JEditorPane can enable HyperLinks
412      * @param isHtmlLabel
413      */
414     private void changeLabelType(LabelStyle style) {
415
416         if (labelStyle == style) {
417             return;
418         }
419
420         labelStyle = style;
421         Color bgColor = label.getBackground();
422         Color fgColor = label.getForeground();
423         Font font = label.getFont();
424         Dimension dims = label.getSize();
425         label.setVisible(false);
426
427         switch (labelStyle) {
428             case LATEX:
429                 alignmentPanel.remove(label);
430                 label = new IconLabel(IconType.LATEX);
431                 setViewportView(label);
432                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
433                 break;
434             case MATHML:
435                 alignmentPanel.remove(label);
436                 label = new IconLabel(IconType.MATHML);
437                 setViewportView(label);
438                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
439                 break;
440             case HTML: {
441                 JTextPane newLabel = new JTextPane();
442                 newLabel.addHyperlinkListener(urlOpener);
443                 newLabel.setContentType("text/html");
444                 newLabel.setEditable(false);
445                 StyleSheet styleSheet = ((HTMLDocument) newLabel.getDocument()).getStyleSheet();
446                 styleSheet.addRule("body {font-family:" + font.getName() + ";}");
447                 styleSheet.addRule("body {font-size:" + font.getSize() + "pt;}");
448                 if (font.isBold()) {
449                     styleSheet.addRule("body {font-weight:bold;}");
450                 } else {
451                     styleSheet.addRule("body {font-weight:normal;}");
452                 }
453                 if (font.isItalic()) {
454                     styleSheet.addRule("body {font-style:italic;}");
455                 } else {
456                     styleSheet.addRule("body {font-style:normal;}");
457                 }
458
459                 label = newLabel;
460                 alignmentPanel.add(label);
461                 setViewportView(alignmentPanel);
462                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
463                 break;
464             }
465             case TEXT: {
466                 alignmentPanel.remove(label);
467                 label = new JLabel();
468                 setViewportView(label);
469                 //refresh icon
470                 update(__GO_UI_ICON__, GraphicController.getController().getProperty(getId(), __GO_UI_ICON__));
471                 ((JLabel) label).setOpaque(false);
472                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
473                 break;
474             }
475         }
476
477         setBackground(bgColor);
478         label.setForeground(fgColor);
479         label.setFont(font);
480         label.setSize(dims);
481         label.setVisible(true);
482         setAlignment();
483     }
484
485     /**
486      * Set alignment of the text component
487      */
488     private void setAlignment() {
489
490         if (labelStyle != LabelStyle.HTML) {
491             ((JLabel) label).setVerticalAlignment(ScilabAlignment.toSwingAlignment(verticalAlignment));
492             ((JLabel) label).setHorizontalAlignment(ScilabAlignment.toSwingAlignment(horizontalAlignment));
493             return;
494         }
495
496         GridBagConstraints gbc = new GridBagConstraints();
497
498         gbc.gridx = 0;
499         gbc.gridy = 0;
500         gbc.weightx = 1;
501         gbc.weighty = 1;
502         gbc.gridwidth = 1;
503         gbc.gridheight = 1;
504
505         switch (ScilabAlignment.toSwingAlignment(horizontalAlignment)) {
506             case SwingConstants.LEFT:
507                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
508                     case SwingConstants.TOP:
509                         gbc.anchor = GridBagConstraints.NORTHWEST;
510                         break;
511                     case SwingConstants.CENTER:
512                         gbc.anchor = GridBagConstraints.WEST;
513                         break;
514                     default: // SwingConstants.BOTTOM
515                         gbc.anchor = GridBagConstraints.SOUTHWEST;
516                         break;
517                 }
518                 break;
519             case SwingConstants.CENTER:
520                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
521                     case SwingConstants.TOP:
522                         gbc.anchor = GridBagConstraints.NORTH;
523                         break;
524                     case SwingConstants.CENTER:
525                         gbc.anchor = GridBagConstraints.CENTER;
526                         break;
527                     default: // SwingConstants.BOTTOM
528                         gbc.anchor = GridBagConstraints.SOUTH;
529                         break;
530                 }
531                 break;
532             default: // SwingConstants.RIGHT
533                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
534                     case SwingConstants.TOP:
535                         gbc.anchor = GridBagConstraints.NORTHEAST;
536                         break;
537                     case SwingConstants.CENTER:
538                         gbc.anchor = GridBagConstraints.EAST;
539                         break;
540                     default: // SwingConstants.BOTTOM
541                         gbc.anchor = GridBagConstraints.SOUTHEAST;
542                         break;
543                 }
544                 break;
545         }
546
547         alignmentLayout.setConstraints(label, gbc);
548     }
549
550     /**
551      * Set the UID
552      * @param id the UID
553      */
554     public void setId(Integer id) {
555         uid = id;
556     }
557
558     /**
559      * Get the UID
560      * @return the UID
561      */
562     public Integer getId() {
563         return uid;
564     }
565
566     /**
567      * Generic update method
568      * @param property property name
569      * @param value property value
570      */
571     public void update(int property, Object value) {
572         switch (property) {
573             case __GO_UI_ICON__: {
574                 if (labelStyle == LabelStyle.TEXT) {
575                     String icon = (String) value;
576                     if (icon != null && icon.equals("") == false) {
577                         File file = new File((String) value);
578                         if (file.exists() == false) {
579                             String filename = FindIconHelper.findImage((String) value);
580                             file = new File(filename);
581                         }
582
583                         try {
584                             ((JLabel) label).setIcon(new ImageIcon(ImageIO.read(file)));
585                         } catch (IOException e) {
586                         }
587                     } else {
588                         ((JLabel) label).setIcon(null);
589                     }
590                 }
591                 break;
592             }
593             default: {
594                 SwingViewWidget.update(this, property, value);
595             }
596         }
597     }
598
599     public void resetBackground() {
600         Color color = (Color) UIManager.getLookAndFeelDefaults().get("Label.background");
601         if (color != null) {
602             //bypass setBackground
603             if (label instanceof JLabel) {
604                 ((JLabel) label).setOpaque(true);
605             }
606             label.setBackground(color);
607         }
608     }
609
610     public void resetForeground() {
611         Color color = (Color) UIManager.getLookAndFeelDefaults().get("Label.foreground");
612         if (color != null) {
613             label.setForeground(color);
614         }
615     }
616
617     /**
618      * Component to display LaTeX Thank you Calixte
619      */
620     public static class IconLabel extends JLabel {
621         public enum IconType {
622             LATEX, MATHML
623         };
624
625         private static final long serialVersionUID = 3885565301114930030L;
626         private final static Font DEFAULTFONT = new Font("serif", Font.PLAIN, 12);
627         private final static boolean isWindows = System.getProperty("os.name").toLowerCase().indexOf("win") != -1;
628
629         private Icon icon;
630         private Icon iconDisable;
631         private float fontSize;
632         private String text;
633         private Dimension preferred;
634         IconType type = IconType.MATHML;
635
636         public IconLabel(IconType type) {
637             super();
638             fontSize = 12f;
639             icon = null;
640             iconDisable = null;
641             preferred = new Dimension(0, 0);
642             this.type = type;
643         }
644
645         /**
646          * Set the LaTeX content
647          * @param text the LaTeX
648          */
649         public void setText(String text) {
650             this.text = text;
651             update();
652         }
653
654         /**
655          * Get the LaTeX content
656          * @return the LaTeX string
657          */
658         public String getText() {
659             return text;
660         }
661
662         public Dimension getPreferredSize() {
663             return preferred;
664         }
665
666         public Dimension getMinimumSize() {
667             return getPreferredSize();
668         }
669
670         protected void paintComponent(Graphics g) {
671             super.paintComponent(g);
672             if (isOpaque() && getBackground() != null) {
673                 final Color old = g.getColor();
674                 g.setColor(getBackground());
675                 g.fillRect(0, 0, getWidth(), getHeight());
676                 g.setColor(old);
677             }
678
679             int h = getHorizontalAlignment();
680             int v = getVerticalAlignment();
681
682             int x = 0;
683             int y = 0;
684
685             if (h == JLabel.CENTER) {
686                 x = (getSize().width - icon.getIconWidth()) / 2;
687             } else if (h == JLabel.RIGHT) {
688                 x = getSize().width - icon.getIconWidth();
689             }
690
691             if (v == JLabel.CENTER) {
692                 y = (getSize().height - icon.getIconHeight()) / 2;
693             } else if (v == JLabel.BOTTOM) {
694                 y = getSize().height - icon.getIconHeight();
695             }
696
697             if (type == IconType.LATEX) {
698                 TeXIcon latex = (TeXIcon) icon;
699                 if (isEnabled()) {
700                     latex.setForeground(getForeground());
701                     latex.paintIcon(this, g, x, y);
702                 } else {
703                     if (isWindows && (UIManager.getColor("Label.disabledForeground") instanceof Color) && (UIManager.getColor("Label.disabledShadow") instanceof Color)) {
704                         latex.setForeground(UIManager.getColor("Label.disabledShadow"));
705                         latex.paintIcon(this, g, x + 1, y + 1);
706                         latex.setForeground(UIManager.getColor("Label.disabledForeground"));
707                         latex.paintIcon(this, g, x, y);
708                     } else {
709                         latex.setForeground(getBackground().brighter());
710                         latex.paintIcon(this, g, x + 1, y + 1);
711                         latex.setForeground(getBackground().darker());
712                         latex.paintIcon(this, g, x, y);
713                     }
714                 }
715             } else { //MathML
716                 //enable/disable is made @ icon generation in ScilabSpecialTextUtilities
717                 if (isEnabled()) {
718                     icon.paintIcon(this, g, x, y);
719                 } else {
720                     icon.paintIcon(this, g, x + 1, y + 1);
721                     iconDisable.paintIcon(this, g, x, y);
722                 }
723             }
724         }
725
726         public void setFont(Font f) {
727             this.fontSize = f.getSize2D();
728             update();
729         }
730
731         public Font getFont() {
732             return DEFAULTFONT;
733         }
734
735         /**
736          * Update the component
737          */
738         private void update() {
739             if (text.equals("") == false) {
740                 if (type == IconType.LATEX) {
741                     icon = ScilabSpecialTextUtilities.compileLaTeXExpression(text, (int) fontSize);
742                 } else {
743                     if (isEnabled()) {
744                         icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize);
745                     } else {
746                         if (isWindows && (UIManager.getColor("Label.disabledForeground") instanceof Color) && (UIManager.getColor("Label.disabledShadow") instanceof Color)) {
747                             icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, UIManager.getColor("Label.disabledShadow"));
748                             iconDisable = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, UIManager.getColor("Label.disabledForeground"));
749                         } else {
750                             icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, getBackground().brighter());
751                             iconDisable = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, getBackground().darker());
752                         }
753                     }
754                 }
755                 preferred = new Dimension(icon.getIconWidth(), icon.getIconHeight());
756                 revalidate();
757             }
758         }
759
760         public void setEnabled(boolean enabled) {
761             super.setEnabled(enabled);
762             update();
763         }
764     }
765 }