f0a6350f065792743333b87295001e0485573607
[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.bridge.tab.SwingScilabPanel;
57 import org.scilab.modules.gui.bridge.window.SwingScilabWindow;
58 import org.scilab.modules.gui.events.callback.CommonCallBack;
59 import org.scilab.modules.gui.label.SimpleLabel;
60 import org.scilab.modules.gui.menubar.MenuBar;
61 import org.scilab.modules.gui.textbox.TextBox;
62 import org.scilab.modules.gui.toolbar.ToolBar;
63 import org.scilab.modules.gui.utils.Position;
64 import org.scilab.modules.gui.utils.PositionConverter;
65 import org.scilab.modules.gui.utils.ScilabAlignment;
66 import org.scilab.modules.gui.utils.ScilabRelief;
67 import org.scilab.modules.gui.utils.ScilabSwingUtilities;
68 import org.scilab.modules.gui.utils.Size;
69 import org.scilab.modules.gui.utils.WebBrowser;
70
71 /**
72  * Swing implementation for Scilab Labels in GUIs
73  * @author Vincent COUVERT
74  * @author Marouane BEN JELLOUL
75  */
76 public class SwingScilabLabel extends JScrollPane implements SwingViewObject, SimpleLabel {
77
78     private enum LabelStyle {
79         TEXT, LATEX, MATHML, HTML
80     };
81
82     private static final long serialVersionUID = 7177323379068859441L;
83
84     private Integer uid;
85
86     private JComponent label = new JLabel(" ");
87
88     private Border defaultBorder = null;
89
90     private LabelStyle labelStyle = null;
91
92     private String horizontalAlignment = "left"; //Horizontal alignment property
93
94     private String verticalAlignment = "middle"; // Vertical alignment property
95
96     private final JPanel alignmentPanel = new JPanel(); // Used for alignment
97
98     private final GridBagLayout alignmentLayout = new GridBagLayout();
99
100     private String labelText = ""; // Used to save user given text
101
102     private static HyperlinkListener urlOpener = new HyperlinkListener() {
103         public void hyperlinkUpdate(HyperlinkEvent event) {
104             if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
105                 WebBrowser.openUrl(event.getURL(), event.getDescription());
106             }
107         }
108     };
109
110     /**
111      * Constructor
112      */
113     public SwingScilabLabel() {
114         super();
115         alignmentPanel.setLayout(alignmentLayout);
116         setViewportView(label);
117         setBorder(BorderFactory.createEmptyBorder());
118         setViewportBorder(BorderFactory.createEmptyBorder());
119         setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
120         setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
121         // Initialize display
122         setAlignment();
123     }
124
125     /**
126      * Apply a new font for the label.
127      * @param font new font to use.
128      */
129     public void setFont(Font font) {
130         super.setFont(font);
131         if (label != null) {
132             label.setFont(font);
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
405
406         //force window to redraw all component
407         if (win != null) {
408             win.validate();
409         }
410
411     }
412
413     public void setEmptyText() {
414         setText(null);
415     }
416
417     /**
418      * Change Label type to switch between JLabel abd JEditorPane JLabel is
419      * quicker on simple text JEditorPane can enable HyperLinks
420      * @param isHtmlLabel
421      */
422     private void changeLabelType(LabelStyle style) {
423
424         if (labelStyle == style) {
425             return;
426         }
427
428         labelStyle = style;
429         Color bgColor = label.getBackground();
430         Color fgColor = label.getForeground();
431         Font font = label.getFont();
432         Dimension dims = label.getSize();
433         label.setVisible(false);
434
435         switch (labelStyle) {
436             case LATEX:
437                 alignmentPanel.remove(label);
438                 label = new IconLabel(IconType.LATEX);
439                 setViewportView(label);
440                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
441                 break;
442             case MATHML:
443                 alignmentPanel.remove(label);
444                 label = new IconLabel(IconType.MATHML);
445                 setViewportView(label);
446                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
447                 break;
448             case HTML: {
449                 JTextPane newLabel = new JTextPane();
450                 newLabel.addHyperlinkListener(urlOpener);
451                 newLabel.setContentType("text/html");
452                 newLabel.setEditable(false);
453                 StyleSheet styleSheet = ((HTMLDocument) newLabel.getDocument()).getStyleSheet();
454                 styleSheet.addRule("body {font-family:" + font.getName() + ";}");
455                 styleSheet.addRule("body {font-size:" + font.getSize() + "pt;}");
456                 if (font.isBold()) {
457                     styleSheet.addRule("body {font-weight:bold;}");
458                 } else {
459                     styleSheet.addRule("body {font-weight:normal;}");
460                 }
461                 if (font.isItalic()) {
462                     styleSheet.addRule("body {font-style:italic;}");
463                 } else {
464                     styleSheet.addRule("body {font-style:normal;}");
465                 }
466
467                 label = newLabel;
468                 alignmentPanel.add(label);
469                 setViewportView(alignmentPanel);
470                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
471                 break;
472             }
473             case TEXT: {
474                 alignmentPanel.remove(label);
475                 label = new JLabel();
476                 setViewportView(label);
477                 //refresh icon
478                 update(__GO_UI_ICON__, GraphicController.getController().getProperty(getId(), __GO_UI_ICON__));
479                 ((JLabel) label).setOpaque(false);
480                 setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
481                 break;
482             }
483         }
484
485         setBackground(bgColor);
486         label.setForeground(fgColor);
487         label.setFont(font);
488         label.setSize(dims);
489         label.setVisible(true);
490         setAlignment();
491     }
492
493     /**
494      * Set alignment of the text component
495      */
496     private void setAlignment() {
497
498         if (labelStyle != LabelStyle.HTML) {
499             ((JLabel) label).setVerticalAlignment(ScilabAlignment.toSwingAlignment(verticalAlignment));
500             ((JLabel) label).setHorizontalAlignment(ScilabAlignment.toSwingAlignment(horizontalAlignment));
501             return;
502         }
503
504         GridBagConstraints gbc = new GridBagConstraints();
505
506         gbc.gridx = 0;
507         gbc.gridy = 0;
508         gbc.weightx = 1;
509         gbc.weighty = 1;
510         gbc.gridwidth = 1;
511         gbc.gridheight = 1;
512
513         switch (ScilabAlignment.toSwingAlignment(horizontalAlignment)) {
514             case SwingConstants.LEFT:
515                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
516                     case SwingConstants.TOP:
517                         gbc.anchor = GridBagConstraints.NORTHWEST;
518                         break;
519                     case SwingConstants.CENTER:
520                         gbc.anchor = GridBagConstraints.WEST;
521                         break;
522                     default: // SwingConstants.BOTTOM
523                         gbc.anchor = GridBagConstraints.SOUTHWEST;
524                         break;
525                 }
526                 break;
527             case SwingConstants.CENTER:
528                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
529                     case SwingConstants.TOP:
530                         gbc.anchor = GridBagConstraints.NORTH;
531                         break;
532                     case SwingConstants.CENTER:
533                         gbc.anchor = GridBagConstraints.CENTER;
534                         break;
535                     default: // SwingConstants.BOTTOM
536                         gbc.anchor = GridBagConstraints.SOUTH;
537                         break;
538                 }
539                 break;
540             default: // SwingConstants.RIGHT
541                 switch (ScilabAlignment.toSwingAlignment(verticalAlignment)) {
542                     case SwingConstants.TOP:
543                         gbc.anchor = GridBagConstraints.NORTHEAST;
544                         break;
545                     case SwingConstants.CENTER:
546                         gbc.anchor = GridBagConstraints.EAST;
547                         break;
548                     default: // SwingConstants.BOTTOM
549                         gbc.anchor = GridBagConstraints.SOUTHEAST;
550                         break;
551                 }
552                 break;
553         }
554
555         alignmentLayout.setConstraints(label, gbc);
556     }
557
558     /**
559      * Set the UID
560      * @param id the UID
561      */
562     public void setId(Integer id) {
563         uid = id;
564     }
565
566     /**
567      * Get the UID
568      * @return the UID
569      */
570     public Integer getId() {
571         return uid;
572     }
573
574     /**
575      * Generic update method
576      * @param property property name
577      * @param value property value
578      */
579     public void update(int property, Object value) {
580         switch (property) {
581             case __GO_UI_ICON__: {
582                 if (labelStyle == LabelStyle.TEXT) {
583                     String icon = (String) value;
584                     if (icon != null && icon.equals("") == false) {
585                         File file = new File((String) value);
586                         if (file.exists() == false) {
587                             String filename = FindIconHelper.findImage((String) value);
588                             file = new File(filename);
589                         }
590
591                         try {
592                             ((JLabel) label).setIcon(new ImageIcon(ImageIO.read(file)));
593                         } catch (IOException e) {
594                         }
595                     } else {
596                         ((JLabel) label).setIcon(null);
597                     }
598                 }
599                 break;
600             }
601             default: {
602                 SwingViewWidget.update(this, property, value);
603             }
604         }
605     }
606
607     public void resetBackground() {
608         Color color = (Color) UIManager.getLookAndFeelDefaults().get("Label.background");
609         if (color != null) {
610             //bypass setBackground
611             if (label instanceof JLabel) {
612                 ((JLabel) label).setOpaque(true);
613             }
614             label.setBackground(color);
615         }
616     }
617
618     public void resetForeground() {
619         Color color = (Color) UIManager.getLookAndFeelDefaults().get("Label.foreground");
620         if (color != null) {
621             label.setForeground(color);
622         }
623     }
624
625     /**
626      * Component to display LaTeX Thank you Calixte
627      */
628     public static class IconLabel extends JLabel {
629         public enum IconType {
630             LATEX, MATHML
631         };
632
633         private static final long serialVersionUID = 3885565301114930030L;
634         private final static Font DEFAULTFONT = new Font("serif", Font.PLAIN, 12);
635         private final static boolean isWindows = System.getProperty("os.name").toLowerCase().indexOf("win") != -1;
636
637         private Icon icon;
638         private Icon iconDisable;
639         private float fontSize;
640         private String text;
641         private Dimension preferred;
642         IconType type = IconType.MATHML;
643
644         public IconLabel(IconType type) {
645             super();
646             fontSize = 12f;
647             icon = null;
648             iconDisable = null;
649             preferred = new Dimension(0, 0);
650             this.type = type;
651         }
652
653         /**
654          * Set the LaTeX content
655          * @param text the LaTeX
656          */
657         public void setText(String text) {
658             this.text = text;
659             update();
660         }
661
662         /**
663          * Get the LaTeX content
664          * @return the LaTeX string
665          */
666         public String getText() {
667             return text;
668         }
669
670         public Dimension getPreferredSize() {
671             return preferred;
672         }
673
674         public Dimension getMinimumSize() {
675             return getPreferredSize();
676         }
677
678         protected void paintComponent(Graphics g) {
679             super.paintComponent(g);
680             if (isOpaque() && getBackground() != null) {
681                 final Color old = g.getColor();
682                 g.setColor(getBackground());
683                 g.fillRect(0, 0, getWidth(), getHeight());
684                 g.setColor(old);
685             }
686
687             int h = getHorizontalAlignment();
688             int v = getVerticalAlignment();
689
690             int x = 0;
691             int y = 0;
692
693             if (h == JLabel.CENTER) {
694                 x = (getSize().width - icon.getIconWidth()) / 2;
695             } else if (h == JLabel.RIGHT) {
696                 x = getSize().width - icon.getIconWidth();
697             }
698
699             if (v == JLabel.CENTER) {
700                 y = (getSize().height - icon.getIconHeight()) / 2;
701             } else if (v == JLabel.BOTTOM) {
702                 y = getSize().height - icon.getIconHeight();
703             }
704
705             if (type == IconType.LATEX) {
706                 TeXIcon latex = (TeXIcon) icon;
707                 if (isEnabled()) {
708                     latex.setForeground(getForeground());
709                     latex.paintIcon(this, g, x, y);
710                 } else {
711                     if (isWindows && (UIManager.getColor("Label.disabledForeground") instanceof Color) && (UIManager.getColor("Label.disabledShadow") instanceof Color)) {
712                         latex.setForeground(UIManager.getColor("Label.disabledShadow"));
713                         latex.paintIcon(this, g, x + 1, y + 1);
714                         latex.setForeground(UIManager.getColor("Label.disabledForeground"));
715                         latex.paintIcon(this, g, x, y);
716                     } else {
717                         latex.setForeground(getBackground().brighter());
718                         latex.paintIcon(this, g, x + 1, y + 1);
719                         latex.setForeground(getBackground().darker());
720                         latex.paintIcon(this, g, x, y);
721                     }
722                 }
723             } else { //MathML
724                 //enable/disable is made @ icon generation in ScilabSpecialTextUtilities
725                 if (isEnabled()) {
726                     icon.paintIcon(this, g, x, y);
727                 } else {
728                     icon.paintIcon(this, g, x + 1, y + 1);
729                     iconDisable.paintIcon(this, g, x, y);
730                 }
731             }
732         }
733
734         public void setFont(Font f) {
735             this.fontSize = f.getSize2D();
736             update();
737         }
738
739         public Font getFont() {
740             return DEFAULTFONT;
741         }
742
743         /**
744          * Update the component
745          */
746         private void update() {
747             if (text.equals("") == false) {
748                 if (type == IconType.LATEX) {
749                     icon = new TeXFormula(text).new TeXIconBuilder().setStyle(TeXConstants.STYLE_DISPLAY).setSize(fontSize).build();
750                 } else {
751                     if (isEnabled()) {
752                         icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize);
753                     } else {
754                         if (isWindows && (UIManager.getColor("Label.disabledForeground") instanceof Color) && (UIManager.getColor("Label.disabledShadow") instanceof Color)) {
755                             icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, UIManager.getColor("Label.disabledShadow"));
756                             iconDisable = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, UIManager.getColor("Label.disabledForeground"));
757                         } else {
758                             icon = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, getBackground().brighter());
759                             iconDisable = ScilabSpecialTextUtilities.compileMathMLExpression(text, (int) fontSize, getBackground().darker());
760                         }
761                     }
762                 }
763                 preferred = new Dimension(icon.getIconWidth(), icon.getIconHeight());
764                 revalidate();
765             }
766         }
767
768         public void setEnabled(boolean enabled) {
769             super.setEnabled(enabled);
770             update();
771         }
772     }
773 }