epoc32/include/coetextdrawer.h
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
equal deleted inserted replaced
1:666f914201fb 2:2fe1408b6811
     1 coetextdrawer.h
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #ifndef __COETEXTDRAWER_H__
       
    17 #define __COETEXTDRAWER_H__
       
    18 
       
    19 #include <gulutil.h>	 
       
    20 #include <gulalign.h>	 
       
    21 #include <biditext.h>
       
    22 #include <coemop.h>
       
    23 
       
    24 //
       
    25 // TEXT DRAWER CODE
       
    26 //
       
    27 
       
    28 // forward declarations
       
    29 class CCoeTextDrawerBase;
       
    30 class TCoeTextTypeAdaptor;
       
    31 
       
    32 /**
       
    33 This class serves as a smart-pointer handle to a CCoeTextDrawerBase-derived object, used for drawing
       
    34 user interface text. Through the use of the CCoeControl's TextDrawer() and GetTextDrawer() methods, a
       
    35 container control can control the text style and color used by its child controls. For example, a button
       
    36 class can override its GetTextDrawer() method to set the text color used by its text label child control 
       
    37 depending on the buttons state (e.g. unpressed, pressed, or dimmed).
       
    38 
       
    39 The XCoeTextDrawer object manages the life of the heap allocated CCoeTextDrawerBase (deleting it or 
       
    40 resetting it depending on whether the object is reusable or not).
       
    41 
       
    42 XCoeTextDrawer objects shall be allocated on the stack in the control's Draw() method and initialized 
       
    43 with a heap allocated CCoeTextDrawerBase object fetched from the control's skin, or from its parent or 
       
    44 background through the CCoeControl::TextDrawer() method. 
       
    45 
       
    46 Never create a CCoeTextDrawer-derived object inside your CCoeControl::Draw() method, as this is not 
       
    47 guaranteed to work in low-memory situations. Non-reusable text drawers must only be created in your
       
    48 control's GetTextDrawer() method, as this provides error handling in case the text drawer could not be 
       
    49 created.
       
    50 
       
    51 Hence, typical use from inside a CCoeControl's Draw() method:
       
    52 <code>
       
    53 XCoeTextDrawer textDrawer(TextDrawer());
       
    54 textDrawer.SetAlignment(EHLeftVCenter);
       
    55 textDrawer.SetMargins(iTextMargins);
       
    56 textDrawer.DrawText(SystemGc(), *iText, iTextRect, ScreenFont(TCoeFont::NormalFont()));
       
    57 </code>
       
    58 
       
    59 @publishedAll
       
    60 @released
       
    61 */
       
    62 class XCoeTextDrawer
       
    63 	{
       
    64 public:
       
    65 	IMPORT_C XCoeTextDrawer(CCoeTextDrawerBase& aTextDrawer);
       
    66 	IMPORT_C ~XCoeTextDrawer();
       
    67 	
       
    68 	IMPORT_C void operator=(CCoeTextDrawerBase& aTextDrawer);
       
    69 
       
    70 	IMPORT_C void DrawText(CGraphicsContext& aGc, const TBidiText& aText, const TRect& aTextRect, const CFont& aFont) const;
       
    71 	IMPORT_C void DrawDisplayOrderedText(CGraphicsContext& aGc, const TDesC& aText, const TRect& aTextRect, const CFont& aFont) const;
       
    72 	
       
    73 	IMPORT_C void DrawTextVertical(CGraphicsContext& aGc, const TBidiText& aText, const TRect& aTextRect, const CFont& aFont, TBool aUp = ETrue) const;
       
    74 	IMPORT_C void DrawDisplayOrderedTextVertical(CGraphicsContext& aGc, const TDesC& aText, const TRect& aTextRect, const CFont& aFont, TBool aUp = ETrue) const;
       
    75 	
       
    76 	IMPORT_C TRect ClipRect() const;
       
    77 	IMPORT_C void SetClipRect(const TRect& aClipRect);
       
    78 
       
    79 	inline TRgb TextColor() const;
       
    80 	inline void SetTextColor(TRgb aColor);
       
    81 	
       
    82 	inline TGulAlignment Alignment() const;
       
    83 	inline void SetAlignment(const TGulAlignment& aAlignment);
       
    84 	
       
    85 	inline TMargins8 Margins() const;
       
    86 	inline void SetMargins(const TMargins8& aMargins);
       
    87 	
       
    88 	inline TInt LineGapInPixels() const;
       
    89 	inline void SetLineGapInPixels(TInt aLineGapInPixels);	
       
    90 public: 
       
    91 	IMPORT_C CCoeTextDrawerBase *operator ->();		// deprecated	
       
    92 private:
       
    93 	XCoeTextDrawer(const XCoeTextDrawer& aTextDrawer);  
       
    94 private:	
       
    95 	CCoeTextDrawerBase* iTextDrawer;
       
    96 	TRect iClipRect;
       
    97 	};
       
    98 
       
    99 
       
   100 // forward declaration
       
   101 class CCoeTextDrawerBaseExt;
       
   102 
       
   103 /**
       
   104 This is the base class for all text drawers implementing different text effects (for example 
       
   105 shadow or glowing/outlined text). The object can be created and deleted each time it's used, 
       
   106 or Reset() and reused if it IsReusable(). The latter is recommended.
       
   107 
       
   108 Note that the pure virtual DrawText() method is private. This ensures that the object is used 
       
   109 through the XCoeTextDrawer class (which manages its life). 
       
   110 
       
   111 Note also that the accessor and set methods should be used via the owning XCoeTextDrawer object,
       
   112 and that the MObjectProvider mechanism can be used to identify the actual text drawer implementation.
       
   113 
       
   114 @publishedAll
       
   115 @released
       
   116 */
       
   117 class CCoeTextDrawerBase : public CBase, public MObjectProvider
       
   118 	{
       
   119 	friend class XCoeTextDrawer;   
       
   120 public:
       
   121 	IMPORT_C ~CCoeTextDrawerBase();
       
   122 	IMPORT_C virtual void Reset();
       
   123 
       
   124 	/**
       
   125 	This method returns the main color used by the CCoeTextDrawer to draw text.
       
   126 	@return The color used to draw text.
       
   127 	*/
       
   128 	virtual TRgb TextColor() const = 0;
       
   129 	/**
       
   130 	This method sets the main color to use to draw text.
       
   131 	@param aColor The color to use to draw text.
       
   132 	*/
       
   133 	virtual void SetTextColor(TRgb aColor) = 0;
       
   134  
       
   135 	IMPORT_C TGulAlignment Alignment() const;
       
   136 	IMPORT_C void SetAlignment(const TGulAlignment& aAlignment);
       
   137 	
       
   138 	IMPORT_C TMargins8 Margins() const;
       
   139 	IMPORT_C void SetMargins(const TMargins8& aMargins);
       
   140 	
       
   141 	IMPORT_C TInt LineGapInPixels() const;
       
   142 	IMPORT_C void SetLineGapInPixels(TInt aLineGapInPixels);
       
   143 public:	// public methods only for use by the owner/creator of the CCoeTextDrawerBase-derived object
       
   144  	IMPORT_C TBool IsReusable() const;
       
   145 	IMPORT_C void SetReusable(TBool aIsReusable);
       
   146 	
       
   147 	IMPORT_C void SetAppLanguage(TLanguage aAppLang);
       
   148 protected:
       
   149  	IMPORT_C CCoeTextDrawerBase();
       
   150 	IMPORT_C TInt Construct();
       
   151 	IMPORT_C TGulHAlignment ActualHorizontalAlignment(const TCoeTextTypeAdaptor& aText) const;
       
   152 private:  
       
   153 	/**
       
   154 	Any actual text drawer must implement this method to draw the text passed as argument.
       
   155 	The implementation must draw the text inside the text rectangle, cropped to the clipping
       
   156 	rectangle, and with the given margins and alignment taken into account.
       
   157 	
       
   158 	Note that the actual horizontal alignment shall depend on the script directionality. 
       
   159 	Calling	ActualHorizontalAlignment() will return the horizontal alignment where left and 
       
   160 	right has been swapped for right-to-left scripts.
       
   161 	*/
       
   162 	virtual void DrawText(CGraphicsContext& aGc, const TCoeTextTypeAdaptor& aText, const CFont& aFont, 
       
   163 							const TRect& aTextRect, const TRect& aClipRect) const = 0;
       
   164 public:
       
   165 	IMPORT_C virtual TMargins8 EffectMargins();
       
   166 private:
       
   167 	/**
       
   168 	Draws the text vertically inside the text rectangle, cropped to the clipping
       
   169 	rectangle, and with the given margins and alignment taken into account.
       
   170 	If aUp is ETrue, text is rotated 90 degrees anti-clockwise; EFalse, text is rotated 90 degrees clockwise.
       
   171 	
       
   172 	Note that the actual horizontal alignment shall depend on the script directionality. 
       
   173 	Calling	ActualHorizontalAlignment() will return the horizontal alignment where left and 
       
   174 	right has been swapped for right-to-left scripts.
       
   175 	Also note that the margines are relative to the orientation of the text.
       
   176 	*/
       
   177 	IMPORT_C virtual void DrawTextVertical(CGraphicsContext& aGc, const TCoeTextTypeAdaptor& aText, const CFont& aFont, 
       
   178 							const TRect& aTextRect, const TRect& aClipRect, TBool aUp) const;
       
   179 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved3();
       
   180 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved4();
       
   181 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved5();
       
   182 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved6();
       
   183 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved7();
       
   184 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved8();
       
   185 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved9();
       
   186 	IMPORT_C virtual void CCoeTextDrawerBase_Reserved10();
       
   187  private:
       
   188 	TBool iIsReusable;	 
       
   189 	TGulAlignment iAlignment;
       
   190 	TMargins8 iMargins;
       
   191 	TInt iLineGap;
       
   192 	CCoeTextDrawerBaseExt* iExtension;
       
   193 	};
       
   194 
       
   195 
       
   196 /**
       
   197 This class allows the XCoeTextDrawer to draw text that is in the form of a TBidiText 
       
   198 object as well as pre-reordered new-line separated plain text descriptors. (The descriptor 
       
   199 text is especially useful when using the XCoeTextDrawer together with the FORM component). 
       
   200 
       
   201 This removes the need to implement two versions of the DrawText() method.
       
   202 
       
   203 @publishedAll
       
   204 @released
       
   205 */
       
   206 class TCoeTextTypeAdaptor
       
   207 	{
       
   208 public:
       
   209 	IMPORT_C TCoeTextTypeAdaptor(const TDesC& aText);		// text lines separated with '\n'
       
   210 	IMPORT_C TCoeTextTypeAdaptor(const TBidiText& aText);	// TBidiText object
       
   211 	IMPORT_C TInt NumberOfLines() const;
       
   212 	IMPORT_C TPtrC LineOfText(TInt aLineNumber, TInt& aWidthInPixels, const CFont& aFont) const;	
       
   213 	IMPORT_C TBool HasRightToLeftDirectionality() const;
       
   214 private:
       
   215 	enum TTextType
       
   216 		{
       
   217 		ENewlineSeparated,
       
   218 		EBidiText
       
   219 		};
       
   220 	const TAny* iText;
       
   221 	TTextType iTextType;
       
   222 	};
       
   223 
       
   224 
       
   225 /**	
       
   226 This is a basic text drawer without any text effects. The default text drawer that can be 
       
   227 used if no other (device specific) text drawers has been added to the system. 
       
   228 
       
   229 @publishedAll
       
   230 @released
       
   231 */
       
   232 class CCoePlainTextDrawer : public CCoeTextDrawerBase
       
   233 	{
       
   234 public:
       
   235 	DECLARE_TYPE_ID(0x1020831A)
       
   236 public:
       
   237 	IMPORT_C static CCoePlainTextDrawer* New(TRgb aTextColor);
       
   238 	
       
   239 	IMPORT_C TRgb TextColor() const;
       
   240 	IMPORT_C void SetTextColor(TRgb aTextColor);
       
   241 protected: // from MObjectProvider
       
   242 	IMPORT_C virtual TTypeUid::Ptr MopSupplyObject(TTypeUid aId);
       
   243 private:  
       
   244 	void DrawText(CGraphicsContext& aGc, const TCoeTextTypeAdaptor& aText, const CFont& aFont, 
       
   245 					const TRect& aTextRect, const TRect& aClipRect) const;
       
   246 	void Reset();	
       
   247 	CCoePlainTextDrawer(TRgb aTextColor);
       
   248 	TInt Construct();	//lint !e1511 Suppress member hides non-virtual member
       
   249 private:	
       
   250 	TRgb iTextColor;
       
   251 	};
       
   252 	
       
   253 
       
   254 
       
   255 // Inlines		
       
   256 
       
   257 /**
       
   258 This method returns the main color used by by DrawText() and DrawDisplayOrderedText().
       
   259 @return The color used to draw text.
       
   260 */
       
   261 TRgb XCoeTextDrawer::TextColor() const
       
   262 	{ return iTextDrawer->TextColor(); }
       
   263 	
       
   264 /**
       
   265 This method sets the main color to use by DrawText() and DrawDisplayOrderedText() to draw text.
       
   266 @param aColor The color to use to draw text.
       
   267 */
       
   268 void XCoeTextDrawer::SetTextColor(TRgb aColor)
       
   269 	{ iTextDrawer->SetTextColor(aColor); }
       
   270 
       
   271 /**
       
   272 Returns the text alignment that will be used by DrawText() and DrawDisplayOrderedText().
       
   273 Note that left and right alignment will be swapped for right-to-left scripts, unless
       
   274 the alignment has been set to be absolute (see TGulAlignment).
       
   275 
       
   276 @return TGulAlignment value of iAlignment data member
       
   277 */
       
   278 TGulAlignment XCoeTextDrawer::Alignment() const
       
   279 	{ return iTextDrawer->Alignment(); }
       
   280 
       
   281 /**
       
   282 Set the text alignment that will be used by DrawText() and DrawDisplayOrderedText().
       
   283 Note that left and right alignment will be swapped for right-to-left scripts, unless
       
   284 the alignment has been set to be absolute (see TGulAlignment).
       
   285 
       
   286 @param aAlignment TGulAlignment value.  
       
   287 */		
       
   288 void XCoeTextDrawer::SetAlignment(const TGulAlignment& aAlignment)
       
   289 	{ iTextDrawer->SetAlignment(aAlignment); }
       
   290 
       
   291 /**
       
   292 Returns the text margins that will be used by DrawText() and DrawDisplayOrderedText().
       
   293 Note that text effects may intrude on the margin.
       
   294 
       
   295 @return The margins between the text rect and the actual text, in pixels.
       
   296 */	
       
   297 TMargins8 XCoeTextDrawer::Margins() const
       
   298 	{ return iTextDrawer->Margins(); }
       
   299 
       
   300 /**
       
   301 Set the text margins that will be used by DrawText() and DrawDisplayOrderedText().
       
   302 Note that text effects may intrude on the margin, and that margins are always relative to the text orientation. 
       
   303 
       
   304 @param aMargins The margins between the text rect and the actual text, in pixels.
       
   305 */		
       
   306 void XCoeTextDrawer::SetMargins(const TMargins8& aMargins)
       
   307 	{ iTextDrawer->SetMargins(aMargins); }
       
   308 	
       
   309 /**
       
   310 Returns the gap (in pixels) between lines of text. Default gap is 1 (one) pixel.
       
   311 @return The gap between lines of text, in pixels.
       
   312 */	
       
   313 TInt XCoeTextDrawer::LineGapInPixels() const
       
   314 	{ return iTextDrawer->LineGapInPixels(); }
       
   315 	
       
   316 /**
       
   317 Set the gap (in pixels) between lines of text. Default gap is 1 (one) pixel.
       
   318 @param aLineGapInPixels The gap between lines of text, in pixels.
       
   319 */			
       
   320 void XCoeTextDrawer::SetLineGapInPixels(TInt aLineGapInPixels)
       
   321 	{ iTextDrawer->SetLineGapInPixels(aLineGapInPixels); }
       
   322 
       
   323 		
       
   324 #endif	// __COETEXTDRAWER_H__