Replace wxST_MARKUP style with wxControl::SetLabelMarkup().

This is an incompatible change which removes the wxStaticText-specific
wxST_MARKUP style and adds wxControl::SetLabelMarkup() replacing it.

It doesn't actually change anything yet but it simplifies wxStaticText code a
lot by getting rid of many markup-related functions in it which had to behave
differently depending on whether wxST_MARKUP was used or not and also paves
way for adding markup support for the other controls in the future.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67055 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-02-27 12:47:26 +00:00
parent 6ea2bc50c8
commit 3da9cffc79
17 changed files with 290 additions and 343 deletions

View File

@@ -138,6 +138,166 @@ public:
*/
void SetLabelText(const wxString& text);
// NB: when writing docs for the following function remember that Doxygen
// will always expand HTML entities (e.g. ") and thus we need to
// write e.g. "<" to have in the output the "<" string.
/**
Sets the controls label to a string using markup.
Simple markup supported by this function can be used to apply different
fonts or colours to different parts of the control label when supported
(currently only wxStaticText under GTK+ 2). If markup is not supported
by the control or platform, it is simply stripped and SetLabel() is
used with the resulting string.
For example,
@code
wxStaticText *text;
...
text->SetLabelMarkup("<b>&amp;Bed</b> &amp;mp; "
"<span foreground='red'>breakfast</span> "
"available <big>HERE</big>");
@endcode
would show the string using bold, red and big for the corresponding
words under wxGTK but will simply show the string "Bed &amp; breakfast
available HERE" on the other platforms. In any case, the "B" of "Bed"
will be underlined to indicate that it can be used as a mnemonic for
this control.
The supported tags are:
<TABLE>
<TR>
<TD><b>Tag</b></TD>
<TD><b>Description</b></TD>
</TR>
<TR>
<TD>&lt;b&gt;</TD>
<TD>bold text</TD>
</TR>
<TR>
<TD>&lt;big&gt;</TD>
<TD>bigger text</TD>
</TR>
<TR>
<TD>&lt;i&gt;</TD>
<TD>italic text</TD>
</TR>
<TR>
<TD>&lt;s&gt;</TD>
<TD>strike-through text</TD>
</TR>
<TR>
<TD>&lt;small&gt;</TD>
<TD>smaller text</TD>
</TR>
<TR>
<TD>&lt;tt&gt;</TD>
<TD>monospaced text</TD>
</TR>
<TR>
<TD>&lt;u&gt;</TD>
<TD>underlined text</TD>
</TR>
<TR>
<TD>&lt;span&gt;</TD>
<TD>generic formatter tag, see the table below for supported
attributes.
</TD>
</TR>
</TABLE>
Supported @c &lt;span&gt; attributes:
<TABLE>
<TR>
<TD><b>Name</b></TD>
<TD><b>Description</b></TD>
</TR>
<TR>
<TD>foreground, fgcolor, color</TD>
<TD>Foreground text colour, can be a name or RGB value.</TD>
</TR>
<TR>
<TD>background, bgcolor</TD>
<TD>Background text colour, can be a name or RGB value.</TD>
</TR>
<TR>
<TD>font_family, face</TD>
<TD>Font face name.</TD>
</TR>
<TR>
<TD>font_weight, weight</TD>
<TD>Numeric value in 0..900 range or one of "ultralight",
"light", "normal" (all meaning non-bold), "bold", "ultrabold"
and "heavy" (all meaning bold).</TD>
</TR>
<TR>
<TD>font_style, style</TD>
<TD>Either "oblique" or "italic" (both with the same meaning)
or "normal".</TD>
</TR>
<TR>
<TD>size</TD>
<TD>The font size can be specified either as "smaller" or
"larger" relatively to the current font, as a CSS font size
name ("xx-small", "x-small", "small", "medium", "large",
"x-large" or "xx-large") or as a number giving font size in
1024th parts of a point, i.e. 10240 for a 10pt font.</TD>
</TR>
</TABLE>
This markup language is a strict subset of Pango markup (described at
http://library.gnome.org/devel/pango/unstable/PangoMarkupFormat.html)
and any tags and span attributes not documented above can't be used
under non-GTK platforms.
Also note that you need to escape the following special characters:
<TABLE>
<TR>
<TD><b>Special character</b></TD>
<TD><b>Escape as</b></TD>
</TR>
<TR>
<TD>@c &amp;</TD>
<TD>@c &amp;amp; or as @c &amp;&amp;</TD>
</TR>
<TR>
<TD>@c &apos;</TD>
<TD>@c &amp;apos;</TD>
</TR>
<TR>
<TD>@c &quot;</TD>
<TD>@c &amp;quot;</TD>
</TR>
<TR>
<TD>@c &lt;</TD>
<TD>@c &amp;lt;</TD>
</TR>
<TR>
<TD>@c &gt;</TD>
<TD>@c &amp;gt;</TD>
</TR>
</TABLE>
The non-escaped ampersand @c &amp; characters are interpreted as
mnemonics as with wxControl::SetLabel.
@param markup
String containing markup for the label. It may contain newline
characters and the markup tags described above.
@return
@true if the new label was set (even if markup in it was ignored)
or @false if we failed to parse the markup. In this case the label
remains unchanged.
Note that the string must be well-formed (e.g. all tags must be correctly
closed) and won't be shown at all otherwise.
@since 2.9.2
*/
bool SetLabelMarkup(const wxString& markup);
public: // static functions
@@ -149,9 +309,8 @@ public: // static functions
/**
Returns the given @a str string without mnemonics ("&" characters).
@note This function is identic to GetLabelText() and is provided both for symmetry
with the wxStaticText::RemoveMarkup() function and to allow to write more
readable code (since this function has a more descriptive name respect GetLabelText()).
@note This function is identical to GetLabelText() and is provided
mostly for symmetry with EscapeMnemonics().
*/
static wxString RemoveMnemonics(const wxString& str);

View File

@@ -10,8 +10,10 @@
@class wxStaticText
A static text control displays one or more lines of read-only text.
wxStaticText supports the three classic text alignments, label ellipsization
and formatting markup.
wxStaticText supports the three classic text alignments, label
ellipsization i.e. replacing parts of the text with the ellipsis ("...") if
the label doesn't fit into the provided space and also formatting markup
with wxControl::SetLabelMarkup().
@beginStyleTable
@style{wxALIGN_LEFT}
@@ -25,7 +27,7 @@
size of the text when SetLabel() is called. If this style flag is
given, the control will not change its size (this style is
especially useful with controls which also have the @c wxALIGN_RIGHT or
the @c wxALIGN_CENTRE style because otherwise they won't make sense any
the @c wxALIGN_CENTRE style because otherwise they won't make sense any
longer after a call to SetLabel()).
@style{wxST_ELLIPSIZE_START}
If the labeltext width exceeds the control width, replace the beginning
@@ -36,8 +38,6 @@
@style{wxST_ELLIPSIZE_END}
If the label text width exceeds the control width, replace the end
of the label with an ellipsis; uses wxControl::Ellipsize.
@style{wxST_MARKUP}
Support markup in the label; see SetLabel() for more information.
@endStyleTable
@library{wxcore}
@@ -89,154 +89,12 @@ public:
const wxSize& size = wxDefaultSize, long style = 0,
const wxString& name = wxStaticTextNameStr);
/**
Returns the contents of the control.
Note that the returned string may contain both mnemonics (@& characters),
and markup tags, if they were passed to the SetLabel() function.
Use GetLabelText() if only the label text, without mnemonics and without
markup if the @c wxST_MARKUP style is set, is needed.
Also note that the returned string is always the string which was passed to
SetLabel() but may be different from the string passed to SetLabelText()
(since this last one escapes mnemonic characters and eventually markup).
*/
wxString GetLabel() const;
/**
This method returns the control's label without the mnemonics characters
(if any) and without the markup (if the control has the @c wxST_MARKUP style).
Note that because of the stripping of the mnemonics and markup the returned
string may differ from the string which was passed to SetLabel() but should
always be the same which was passed to SetLabelText().
*/
wxString GetLabelText() const;
/**
Returns @true if the window styles for this control contains one of the
@c wxST_ELLIPSIZE_START, @c wxST_ELLIPSIZE_MIDDLE or @c wxST_ELLIPSIZE_END styles.
*/
bool IsEllipsized() const;
// NB: when writing docs for the following function remember that Doxygen
// will always expand HTML entities (e.g. &quot;) and thus we need to
// write e.g. "&amp;lt;" to have in the output the "&lt;" string.
/**
Sets the static text label and updates the controls size to exactly fit the
label unless the control has @c wxST_NO_AUTORESIZE flag.
This function allows to set decorated static label text, when the @c wxST_MARKUP
style is used, on those platforms which support it (currently only GTK+ 2).
For the other platforms or when @c wxST_MARKUP is not used, the markup is ignored.
The supported tags are:
<TABLE>
<TR>
<TD><b>Tag</b></TD>
<TD><b>Description</b></TD>
</TR>
<TR>
<TD>&lt;b&gt;</TD>
<TD>bold text</TD>
</TR>
<TR>
<TD>&lt;big&gt;</TD>
<TD>bigger text</TD>
</TR>
<TR>
<TD>&lt;i&gt;</TD>
<TD>italic text</TD>
</TR>
<TR>
<TD>&lt;s&gt;</TD>
<TD>strike-through text</TD>
</TR>
<TR>
<TD>&lt;sub&gt;</TD>
<TD>subscript text</TD>
</TR>
<TR>
<TD>&lt;sup&gt;</TD>
<TD>superscript text</TD>
</TR>
<TR>
<TD>&lt;small&gt;</TD>
<TD>smaller text</TD>
</TR>
<TR>
<TD>&lt;tt&gt;</TD>
<TD>monospaced text</TD>
</TR>
<TR>
<TD>&lt;u&gt;</TD>
<TD>underlined text</TD>
</TR>
<TR>
<TD>&lt;span&gt;</TD>
<TD>generic formatter tag; see Pango Markup
(http://library.gnome.org/devel/pango/unstable/PangoMarkupFormat.html)
for more information.</TD>
</TR>
</TABLE>
Note that the string must be well-formed (e.g. all tags must be correctly
closed) otherwise it can be not shown correctly or at all.
Also note that you need to escape the following special characters:
<TABLE>
<TR>
<TD><b>Special character</b></TD>
<TD><b>Escape as</b></TD>
</TR>
<TR>
<TD>@c &amp;</TD>
<TD>@c &amp;amp; or as @c &amp;&amp;</TD>
</TR>
<TR>
<TD>@c &apos;</TD>
<TD>@c &amp;apos;</TD>
</TR>
<TR>
<TD>@c &quot;</TD>
<TD>@c &amp;quot;</TD>
</TR>
<TR>
<TD>@c &lt;</TD>
<TD>@c &amp;lt;</TD>
</TR>
<TR>
<TD>@c &gt;</TD>
<TD>@c &amp;gt;</TD>
</TR>
</TABLE>
The non-escaped ampersand @c &amp; characters are interpreted as
mnemonics; see wxControl::SetLabel.
Example:
@param label
The new label to set.
It may contain newline characters and the markup tags described above.
*/
virtual void SetLabel(const wxString& label);
/**
Sets the control's label to exactly the given string.
Unlike SetLabel(), this function shows exactly the @a text passed to it
in the control, without interpreting ampersands in it in any way and,
if @c wxST_MARKUP is used, without interpreting markup tags.
Notice that it means that the control can't have any mnemonic nor markup defined
for it using this function.
@see EscapeMarkup()
*/
virtual void SetLabelText(const wxString& text);
/**
This functions wraps the controls label so that each of its lines becomes at
most @a width pixels wide if possible (the lines are broken at words
@@ -249,34 +107,5 @@ public:
@since 2.6.2
*/
void Wrap(int width);
public: // static functions
/**
Returns the given @a label string without the mnemonics characters (if any)
and without the markup.
Note that since this function is static it will always remove markup
(since it cannot check @c wxST_MARKUP presence/absence!).
*/
static wxString GetLabelText(const wxString& label);
/**
Escapes all the symbols of @a str that have a special meaning (<tt><>&quot;'&</tt>) for
wxStaticText objects with the @c wxST_MARKUP style.
Those symbols are replaced the corresponding entities
(&amp;lt; &amp;gt; &amp;quot; &amp;apos; &amp;amp;).
*/
static wxString EscapeMarkup(const wxString& str);
/**
Removes the markup accepted by wxStaticText when the @c wxST_MARKUP style is used,
and then returns the cleaned string.
See SetLabel() for more info about the markup.
*/
static wxString RemoveMarkup(const wxString& str);
};