|
||
Note that the following does not yet apply for S60 and MOAP.
The style (plain, bold, shadowed etc.) and colour of text in a control
typically depends upon the state or properties of its parent control. Prior to
Symbian OS 9.1 a control was able to use the MCoeControlContext
interface to share properties. That interface is now deprecated. Text is now
drawn using a Text Drawer. The Text Drawer takes the text itself as a parameter
along with the font, graphics context and text location rectangle.
The text drawer is provided by the run-time hierarchy. Each control in the hierarchy, from the topmost downwards, has the option of modifying or replacing the text drawer.
Text drawers are derived from CCoeTextDrawerBase
(a
default CCoePlainTextDrawer
is provided by Cone) and
require special use to avoid multiple allocations on the heap. Instead of being
allocated directly text drawers must be used through the
XCoeTextDrawer
class which acts as a smart-pointer to a
single CCoeTextDrawerBase
derived class on the heap. The
smart-pointer deletes or resets the text drawer on the heap if necessary and
provides fail-safe measures to ensure that a valid text drawer is returned.
A control that draws text calls its TextDrawer()
function to
retrieve the appropriate text drawer from the run-time hierarchy
XCoeTextDrawer textDrawer( TextDrawer() );
textDrawer->SetAlignment( iAlignment );
textDrawer->SetMargins( iMargin );
textDrawer->SetLineGapInPixels( iGapBetweenLines );
textDrawer.SetClipRect( aRect );
textDrawer.DrawText( gc, *iTextToDraw, Rect(), *Font() );
Note that XCoeTextDrawer
's ->()
operator is overriden to return a pointer to the
CCoeTextDrawerBase
object. i.e.
textDrawer->SetAlignment(iAlignment);
is equivalent to
textDrawer.(iTextDrawer*).SetAlignment(iAlignment);
Unfortunately, as SetClipRect()
is not a function of
CCoeTextDrawerBase
, but of
XCoeTextDrawer
, it can only be accessed through the .
[dot] operator. There are worse things in life.
A control that wishes to provide its own text drawer, or to modify its
parent's text drawer, may do so by providing its own implementation of the
virtual function GetTextDrawer()
.
The control framework provides a mechanism for delivering the correct
font at run-time. The mechanism consists of a Font Provider
(CCoeFontProvider
) and a TCoeFont
class, which represents a font's size (logical or absolute in pixels) and style
(plain, bold, italic, subscript or superscript). Along similar lines to the
Text Drawer, the Font Provider is attached to a parent control and serves
controls further down the run-time hierarchy.
CCoeEnv
includes a default
CCoeFontProvider
: UI-variant specific libraries are
expected to provide their own.
The desired font is affected by the control's zoom state (see below) which must be included when requesting a font from a font provider.
CCoeControl
includes a ScreenFont()
method which encapsulates the font provider and zoom APIs to provide a
simple means of obtaining a CFont
object for drawing text.
The final line of the code snippet above should, therefore, look like this:
textDrawer.DrawText(gc, *iTextToDraw, Rect(), ScreenFont(TCoeFont::NormalFont());
Controls must not keep references or pointers to
CFont
objects in member data. Nor should they use the
CCoeEnv
functions NormalFont()
,
LegendFont()
, TitleFont()
,
AnnotationFont()
and DenseFont()
. Moreover, instances
of these calls should be removed from old code and replaced with code like that
above. This is so that run-time font changes can be propagated and is essential
for zoom support.
Each control may have a TZoomFactor
attached. It
applies to the control itself and all of its component controls. The factor can
be absolute or relative to a control's parent and influences the size of the
font in the control and all of its children.
CCoeControl
has an AccumulatedZoom()
function which aggregates its own zoom factor with those of its parents.