Fix url links in uicontrols
[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("<a href") && labelText.endsWith("</a>")) {
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
402         //force window to redraw all component
403         JFrame win = (JFrame)SwingUtilities.getAncestorOfClass(JFrame.class, this);
404         if (win != null) {
405             win.invalidate();
406         }
407
408         changeLabelType(LabelStyle.TEXT);
409         ((JLabel) label).setText(labelText);
410         setMinimumSize(label.getMinimumSize());
411
412
413         //force window to redraw all component
414         if (win != null) {
415             win.validate();
416         }
417
418     }
419
420     public void setEmptyText() {
421         setText(null);
422     }
423
424     /**
425      * Change Label type to switch between JLabel abd JEditorPane JLabel is
426      * quicker on simple text JEditorPane can enable HyperLinks
427      * @param isHtmlLabel
428      */
429     private void changeLabelType(LabelStyle style) {
430
431         if (labelStyle == style) {
432             return;
433         }
434
435         labelStyle = style;
436         Color bgColor = label.getBackground();
437         Color fgColor = label.getForeground();
438         Font font = label.getFont();
439         Dimension dims = label.getSize();
440         label.setVisible(false);
441
442         switch (labelStyle) {
443             case LATEX:
444                 alignmentPanel.remove(label);
445                 label = new IconLabel(IconType.LATEX);
446                 setViewportView(label);
447                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
448                 break;
449             case MATHML:
450                 alignmentPanel.remove(label);
451                 label = new IconLabel(IconType.MATHML);
452                 setViewportView(label);
453                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
454                 break;
455             case HTML: {
456                 JTextPane newLabel = new JTextPane();
457                 newLabel.addHyperlinkListener(urlOpener);
458                 newLabel.setContentType("text/html");
459                 newLabel.setEditable(false);
460                 StyleSheet styleSheet = ((HTMLDocument) newLabel.getDocument()).getStyleSheet();
461                 styleSheet.addRule("body {font-family:" + font.getName() + ";}");
462                 styleSheet.addRule("body {font-size:" + font.getSize() + "pt;}");
463                 if (font.isBold()) {
464                     styleSheet.addRule("body {font-weight:bold;}");
465                 } else {
466                     styleSheet.addRule("body {font-weight:normal;}");
467                 }
468                 if (font.isItalic()) {
469                     styleSheet.addRule("body {font-style:italic;}");
470                 } else {
471                     styleSheet.addRule("body {font-style:normal;}");
472                 }
473
474                 label = newLabel;
475                 alignmentPanel.add(label);
476                 setViewportView(alignmentPanel);
477                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
478                 break;
479             }
480             case TEXT: {
481                 alignmentPanel.remove(label);
482                 label = new JLabel();
483                 setViewportView(label);
484                 //refresh icon
485                 update(__GO_UI_ICON__, GraphicController.getController().getProperty(getId(), __GO_UI_ICON__));
486                 ((JLabel) label).setOpaque(false);
487                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
488                 break;
489             }
490         }
491
492         setBackground(bgColor);
493         label.setForeground(fgColor);
494         label.setFont(font);
495         label.setSize(dims);
496         label.setVisible(true);
497         setAlignment();
498     }
499
500     /**
501      * Set alignment of the text component
502      */
503     private void setAlignment() {
504
505         if (labelStyle != LabelStyle.HTML) {
506             ((JLabel) label).setVerticalAlignment(ScilabAlignment.toSwingAlignment(verticalAlignment));
507             ((JLabel) label).setHorizontalAlignment(ScilabAlignment.toSwingAlignment(horizontalAlignment));
508             return;
509         }
510
511         GridBagConstraints gbc = new GridBagConstraints();
512
513         gbc.gridx = 0;
514         gbc.gridy = 0;
515         gbc.weightx = 1;
516         gbc.weighty = 1;
517         gbc.gridwidth = 1;
518         gbc.gridheight = 1;
519
520         switch (ScilabAlignment.toSwingAlignment(horizontalAlignment)) {
521             case SwingConstants.LEFT:
522                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
523                     case SwingConstants.TOP:
524                         gbc.anchor = GridBagConstraints.NORTHWEST;
525                         break;
526                     case SwingConstants.CENTER:
527                         gbc.anchor = GridBagConstraints.WEST;
528                         break;
529                     default: // SwingConstants.BOTTOM
530                         gbc.anchor = GridBagConstraints.SOUTHWEST;
531                         break;
532                 }
533                 break;
534             case SwingConstants.CENTER:
535                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
536                     case SwingConstants.TOP:
537                         gbc.anchor = GridBagConstraints.NORTH;
538                         break;
539                     case SwingConstants.CENTER:
540                         gbc.anchor = GridBagConstraints.CENTER;
541                         break;
542                     default: // SwingConstants.BOTTOM
543                         gbc.anchor = GridBagConstraints.SOUTH;
544                         break;
545                 }
546                 break;
547             default: // SwingConstants.RIGHT
548                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
549                     case SwingConstants.TOP:
550                         gbc.anchor = GridBagConstraints.NORTHEAST;
551                         break;
552                     case SwingConstants.CENTER:
553                         gbc.anchor = GridBagConstraints.EAST;
554                         break;
555                     default: // SwingConstants.BOTTOM
556                         gbc.anchor = GridBagConstraints.SOUTHEAST;
557                         break;
558                 }
559                 break;
560         }
561
562         alignmentLayout.setConstraints(label, gbc);
563     }
564
565     /**
566      * Set the UID
567      * @param id the UID
568      */
569     public void setId(Integer id) {
570         uid = id;
571     }
572
573     /**
574      * Get the UID
575      * @return the UID
576      */
577     public Integer getId() {
578         return uid;
579     }
580
581     /**
582      * Generic update method
583      * @param property property name
584      * @param value property value
585      */
586     public void update(int property, Object value) {
587         switch (property) {
588             case __GO_UI_ICON__: {
589                 if (labelStyle == LabelStyle.TEXT) {
590                     String icon = (String) value;
591                     if (icon != null && icon.equals("") == false) {
592                         File file = new File((String) value);
593                         if (file.exists() == false) {
594                             String filename = FindIconHelper.findImage((String) value);
595                             file = new File(filename);
596                         }
597
598                         try {
599                             ((JLabel) label).setIcon(new ImageIcon(ImageIO.read(file)));
600                         } catch (IOException e) {
601                         }
602                     } else {
603                         ((JLabel) label).setIcon(null);
604                     }
605                 }
606                 break;
607             }
608             default: {
609                 SwingViewWidget.update(this, property, value);
610             }
611         }
612     }
613
614     public void resetBackground() {
615         Color color = (Color) UIManager.getLookAndFeelDefaults().get("Label.background");
616         if (color != null) {
617             //bypass setBackground
618             if (label instanceof JLabel) {
619                 ((JLabel) label).setOpaque(true);
620             }
621             label.setBackground(color);
622         }
623     }
624
625     public void resetForeground() {
626         Color color = (Color) UIManager.getLookAndFeelDefaults().get("Label.foreground");
627         if (color != null) {
628             label.setForeground(color);
629         }
630     }
631
632     /**
633      * Component to display LaTeX Thank you Calixte
634      */
635     public static class IconLabel extends JLabel {
636         public enum IconType {
637             LATEX, MATHML
638         };
639
640         private static final long serialVersionUID = 3885565301114930030L;
641         private final static Font DEFAULTFONT = new Font("serif", Font.PLAIN, 12);
642         private final static boolean isWindows = System.getProperty("os.name").toLowerCase().indexOf("win") != -1;
643
644         private Icon icon;
645         private Icon iconDisable;
646         private float fontSize;
647         private String text;
648         private Dimension preferred;
649         IconType type = IconType.MATHML;
650
651         public IconLabel(IconType type) {
652             super();
653             fontSize = 12f;
654             icon = null;
655             iconDisable = null;
656             preferred = new Dimension(0, 0);
657             this.type = type;
658         }
659
660         /**
661          * Set the LaTeX content
662          * @param text the LaTeX
663          */
664         public void setText(String text) {
665             this.text = text;
666             update();
667         }
668
669         /**
670          * Get the LaTeX content
671          * @return the LaTeX string
672          */
673         public String getText() {
674             return text;
675         }
676
677         public Dimension getPreferredSize() {
678             return preferred;
679         }
680
681         public Dimension getMinimumSize() {
682             return getPreferredSize();
683         }
684
685         protected void paintComponent(Graphics g) {
686             super.paintComponent(g);
687             if (isOpaque() && getBackground() != null) {
688                 final Color old = g.getColor();
689                 g.setColor(getBackground());
690                 g.fillRect(0, 0, getWidth(), getHeight());
691                 g.setColor(old);
692             }
693
694             int h = getHorizontalAlignment();
695             int v = getVerticalAlignment();
696
697             int x = 0;
698             int y = 0;
699
700             if (h == JLabel.CENTER) {
701                 x = (getSize().width - icon.getIconWidth()) / 2;
702             } else if (h == JLabel.RIGHT) {
703                 x = getSize().width - icon.getIconWidth();
704             }
705
706             if (v == JLabel.CENTER) {
707                 y = (getSize().height - icon.getIconHeight()) / 2;
708             } else if (v == JLabel.BOTTOM) {
709                 y = getSize().height - icon.getIconHeight();
710             }
711
712             if (type == IconType.LATEX) {
713                 TeXIcon latex = (TeXIcon) icon;
714                 if (isEnabled()) {
715                     latex.setForeground(getForeground());
716                     latex.paintIcon(this, g, x, y);
717                 } else {
718                     if (isWindows && (UIManager.getColor("Label.disabledForeground") instanceof Color) && (UIManager.getColor("Label.disabledShadow") instanceof Color)) {
719                         latex.setForeground(UIManager.getColor("Label.disabledShadow"));
720                         latex.paintIcon(this, g, x + 1, y + 1);
721                         latex.setForeground(UIManager.getColor("Label.disabledForeground"));
722                         latex.paintIcon(this, g, x, y);
723                     } else {
724                         latex.setForeground(getBackground().brighter());
725                         latex.paintIcon(this, g, x + 1, y + 1);
726                         latex.setForeground(getBackground().darker());
727                         latex.paintIcon(this, g, x, y);
728                     }
729                 }
730             } else { //MathML
731                 //enable/disable is made @ icon generation in ScilabSpecialTextUtilities
732                 if (isEnabled()) {
733                     icon.paintIcon(this, g, x, y);
734                 } else {
735                     icon.paintIcon(this, g, x + 1, y + 1);
736                     iconDisable.paintIcon(this, g, x, y);
737                 }
738             }
739         }
740
741         public void setFont(Font f) {
742             this.fontSize = f.getSize2D();
743             update();
744         }
745
746         public Font getFont() {
747             return DEFAULTFONT;
748         }
749
750         /**
751          * Update the component
752          */
753         private void update() {
754             if (text.equals("") == false) {
755                 if (type == IconType.LATEX) {
756                     icon = new TeXFormula(text).new TeXIconBuilder().setStyle(TeXConstants.STYLE_DISPLAY).setSize(fontSize).build();
757                 } else {
758                     if (isEnabled()) {
759                         icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize);
760                     } else {
761                         if (isWindows && (UIManager.getColor("Label.disabledForeground") instanceof Color) && (UIManager.getColor("Label.disabledShadow") instanceof Color)) {
762                             icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, UIManager.getColor("Label.disabledShadow"));
763                             iconDisable = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, UIManager.getColor("Label.disabledForeground"));
764                         } else {
765                             icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, getBackground().brighter());
766                             iconDisable = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, getBackground().darker());
767                         }
768                     }
769                 }
770                 preferred = new Dimension(icon.getIconWidth(), icon.getIconHeight());
771                 revalidate();
772             }
773         }
774
775         public void setEnabled(boolean enabled) {
776             super.setEnabled(enabled);
777             update();
778         }
779     }
780 }