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