Bug 9031 fixed: Misalignment when using xstring with a matrix
[scilab.git] / scilab / modules / scirenderer / src / org / scilab / forge / scirenderer / texture / TextEntity.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2012 - DIGITEO - Pierre Lando
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  */
11
12 package org.scilab.forge.scirenderer.texture;
13
14 import org.scilab.forge.scirenderer.shapes.appearance.Color;
15
16 import java.awt.Dimension;
17 import java.awt.Font;
18 import java.awt.font.FontRenderContext;
19 import java.awt.font.TextLayout;
20 import java.awt.geom.Rectangle2D;
21
22 /**
23  * @author Pierre Lando
24  */
25 public class TextEntity {
26
27     /**
28      * The default text color.
29      */
30     public static final Color DEFAULT_TEXT_COLOR = new Color(0.f, 0.f, 0.f);
31
32     /**
33      * The default text anti-aliased status.
34      */
35     public static final boolean DEFAULT_TEXT_ANTI_ALIASED = true;
36
37     /**
38      * The default text use fractional matrix status.
39      */
40     public static final boolean DEFAULT_TEXT_USE_FRACTIONAL_METRICS = true;
41
42     /**
43      * The default font.
44      */
45     private static final Font DEFAULT_FONT = new Font(null);
46
47     /**
48      * The current text color.
49      */
50     private Color textColor = DEFAULT_TEXT_COLOR;
51
52     /**
53      * The current text anti-aliased status.
54      */
55     private boolean textAntiAliased = DEFAULT_TEXT_ANTI_ALIASED;
56
57     /**
58      * The current text use fractional matrix status.
59      */
60     private boolean textUseFractionalMetrics = DEFAULT_TEXT_USE_FRACTIONAL_METRICS;
61
62     /**
63      * The text content of this object.
64      */
65     private String text;
66
67     /**
68      * The font used by this text entity.
69      */
70     private Font font;
71
72     private TextLayout layout;
73
74     /**
75      * Default constructor.
76      * @param text the text content.
77      */
78     public TextEntity(String text) {
79         this.text = text;
80         this.font = DEFAULT_FONT;
81     }
82
83     /**
84      * Return the text content.
85      * @return the text content.
86      */
87     public String getText() {
88         return text;
89     }
90
91     /**
92      * Set the text content.
93      * @param text the new text content.
94      */
95     public void setText(String text) {
96         this.text = text;
97         this.layout = null;
98     }
99
100     /**
101      * Return the text font.
102      * @return the text font.
103      */
104     public Font getFont() {
105         return font;
106     }
107
108     /**
109      * Set the text font.
110      * @param font the new text font.
111      */
112     public void setFont(Font font) {
113         this.font = font;
114         this.layout = null;
115     }
116
117     /**
118      * Return the text color.
119      * @return the text color.
120      */
121     public Color getTextColor() {
122         return textColor;
123     }
124
125     /**
126      * Set the text color.
127      * @param textColor the new text color.
128      */
129     public void setTextColor(Color textColor) {
130         this.textColor = textColor;
131     }
132
133     /**
134      * Return the text anti-aliased status.
135      * @return the text anti-aliased status.
136      */
137     public boolean isTextAntiAliased() {
138         return textAntiAliased;
139     }
140
141     /**
142      * Set the text anti-aliased status.
143      * @param textAntiAliased the new text anti-aliased status.
144      */
145     public void setTextAntiAliased(boolean textAntiAliased) {
146         this.textAntiAliased = textAntiAliased;
147         this.layout = null;
148     }
149
150     /**
151      * Return the text use fractional metrics status.
152      * @return the text use fractional metrics status.
153      */
154     public boolean isTextUseFractionalMetrics() {
155         return textUseFractionalMetrics;
156     }
157
158     /**
159      * Set the text use fractional metrics status.
160      * @param textUseFractionalMetrics the new text use fractional metrics status.
161      */
162     public void setTextUseFractionalMetrics(boolean textUseFractionalMetrics) {
163         this.textUseFractionalMetrics = textUseFractionalMetrics;
164         this.layout = null;
165     }
166
167     /**
168      * TextEntity validity getter.
169      * @return true if the text entity is valid.
170      */
171     public boolean isValid() {
172         return ((getFont() != null)
173                 && (getText() != null)
174                 && (getText().length() > 0)
175                );
176     }
177
178     public TextLayout getLayout() {
179         if (layout == null) {
180             FontRenderContext frc = new FontRenderContext(null, isTextAntiAliased(), isTextUseFractionalMetrics());
181             layout = new TextLayout(getText(), getFont(), frc);
182         }
183
184         return layout;
185     }
186
187     /**
188      * Return the dimension in pixel of the text entity.
189      * @return the dimension in pixel of the text entity.
190      */
191     public Dimension getSize() {
192         if (isValid()) {
193             TextLayout textLayout = getLayout();
194             Dimension dimension = new Dimension();
195             Rectangle2D r = textLayout.getBounds();
196             /* +1 added to fix rendering of ticks labels, a pixel row/column was missing */
197             dimension.setSize(r.getWidth() + 2, textLayout.getAscent() + textLayout.getDescent() + 1);
198             return dimension;
199         } else {
200             return new Dimension(0, 0);
201         }
202     }
203 }