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