chxavtextcontrol.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
源码类别:

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavtextcontrol.cpp
  3.  * --------------------
  4.  *
  5.  * Synopsis:
  6.  * Text control for ui implementation.
  7.  *
  8.  * Target:
  9.  * Symbian OS
  10.  *
  11.  *
  12.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  13.  *
  14.  ************************************************************************/
  15. // Helix includes...
  16. #include "hxstring.h"
  17. // Includes from this project...
  18. #include "hxsym_debug.h"
  19. #include "hxsym_leaveutil.h"
  20. #include "chxavmisc.h"
  21. #include "chxavcleanstring.h"
  22. #include "chxavstringutils.h"
  23. #include "chxavtextcontrol.h"
  24. CHXAvTextControl::CHXAvTextControl(TInt cid)
  25. : CHXAvControl(cid)
  26. , m_pCommand(0)
  27. , m_pbmpBG(0)
  28. , m_pExternalFont(0)
  29. , m_bUseEllipsisForTruncation(true)
  30. {
  31.     SetText(KNullDesC);
  32. }
  33. CHXAvTextControl* 
  34. CHXAvTextControl::NewL(const CCoeControl& container, TInt cid )
  35. {
  36.     CHXAvTextControl* pSelf = new(ELeave) CHXAvTextControl(cid);
  37.     CleanupStack::PushL(pSelf);
  38.     pSelf->ConstructL(container);
  39.     CleanupStack::Pop();
  40.     return pSelf;
  41. }
  42. void 
  43. CHXAvTextControl::ConstructL(const CCoeControl& parent)
  44. {
  45.     SetContainerWindowL(parent);
  46.     EnableDragEvents();
  47. }
  48. CHXAvTextControl::~CHXAvTextControl()
  49. {
  50.     if (m_pFont )
  51.     {
  52. iEikonEnv->ScreenDevice()->ReleaseFont(m_pFont);
  53. m_pFont = 0;
  54.     }
  55.     HX_DELETE(m_pbmpBG);
  56.     HX_DELETE(m_pText);
  57.     HX_DELETE(m_pCommand);
  58. }
  59. void 
  60. CHXAvTextControl::HandlePointerEventL(const TPointerEvent& aPointerEvent)
  61. {
  62.     DPRINTF(SYMP_WSEVENTS, ("CHXAvTextControl::HandlePointerEventL (%d)n", aPointerEvent.iType));
  63.     // only handle events if we are not disabled
  64.     if (!IsDimmed())
  65.     {
  66. if( aPointerEvent.iType == TPointerEvent::EButton1Down )
  67. {
  68.     if( m_pCommand)
  69.     {
  70. m_pCommand->Execute();
  71.     }
  72. }
  73.     }
  74. }
  75. void CHXAvTextControl::SetCommandL(const CHXAvCommand& commandProto)
  76. {
  77.     HX_DELETE(m_pCommand);
  78.     m_pCommand = commandProto.CloneL();
  79. }
  80. // 
  81. // create a copy of the parent background bitmap
  82. //
  83. // useful if the text control is transparent, and the text
  84. // will change during the lifetime of the control.
  85. //
  86. void 
  87. CHXAvTextControl::SetBGBitmapL(CFbsBitmap* pbmpParentBG)
  88. {
  89.     if( !pbmpParentBG )
  90.     {
  91. // free current bitmap
  92. HX_DELETE(m_pbmpBG);
  93. return;
  94.     }
  95.     CWsScreenDevice* pScreenDevice = iCoeEnv->ScreenDevice();
  96.     // create bg bitmap of same size as this control
  97.     if( m_pbmpBG )
  98.     {
  99. m_pbmpBG->Reset();
  100.     }
  101.     {
  102. m_pbmpBG = new (ELeave) CFbsBitmap();
  103.     }
  104.     CleanupStack::PushL(m_pbmpBG);
  105.     m_pbmpBG->Create(Rect().Size(), pScreenDevice->DisplayMode());
  106.     
  107.     // create device 
  108.     CFbsBitmapDevice* pbmpDevice = CFbsBitmapDevice::NewL(m_pbmpBG);
  109.     CleanupStack::PushL(pbmpDevice);
  110.     // create context from device
  111.     CGraphicsContext* pbmpContext = 0;
  112.     HXSYM_LEAVE_IF_ERR(pbmpDevice->CreateContext(pbmpContext));
  113.     CleanupStack::PushL(pbmpContext);
  114.     // draw from parent bitmap to new bitmap
  115.     TRect rcDest(TPoint(0,0), Rect().Size());
  116.     pbmpContext->DrawBitmap(rcDest, pbmpParentBG, Rect());
  117.     CleanupStack::PopAndDestroy(2); // gc, dev
  118.     CleanupStack::Pop(); // m_pbmpBG
  119. }
  120. void
  121. CHXAvTextControl::Draw(const TRect& /*rect*/) const
  122. {
  123.     CWindowGc& gc = SystemGc();
  124.     const CFont* pFont = GetFont();
  125.     HX_ASSERT(pFont); // call UpdateFont() after attributes are set
  126.     gc.SetPenColor(m_attr.textColor);
  127.     gc.SetBrushColor(m_attr.bgColor);
  128.     if (m_attr.bIsTransparent)
  129.     {
  130. // draw background if supplied
  131. if( m_pbmpBG )
  132. {
  133.     gc.BitBlt(Rect().iTl, m_pbmpBG);
  134. }
  135. gc.SetBrushStyle(CGraphicsContext::ENullBrush);
  136.     }
  137.     else
  138.     {
  139. gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
  140.     }
  141.     gc.UseFont(pFont);
  142.     const TDesC& text = GetText();
  143.     if (text.Length() > 0)
  144.     {
  145. HBufC* pNewText = 0;
  146. TRAPD(ret, CHXAvStringUtils::GetTruncatedDisplayTextL(text, pFont, Rect().Width(), pNewText, m_bUseEllipsisForTruncation));
  147. // only safe to draw if function succeeded
  148. if( ret == KErrNone )
  149. {
  150.     const TDesC* pText = pNewText ? pNewText: &text;
  151.     gc.DrawText(*pText, Rect(), 
  152.     Rect().Height()/2 + pFont->AscentInPixels()/2, 
  153.     m_attr.justify);
  154.     delete pNewText;
  155. }
  156.     }
  157.     else
  158.     {
  159. gc.SetPenStyle(CGraphicsContext::ENullPen);
  160. gc.DrawRect(Rect());
  161.     }
  162.     //gc.DiscardFont();
  163. }
  164. void 
  165. CHXAvTextControl::SetText(const TDesC& text)
  166. {
  167.     HX_DELETE(m_pText);
  168.     m_pText = text.Alloc();
  169. }
  170. void 
  171. CHXAvTextControl::SetAttributes(const CHXAvTextControl::TextControlAttributes& attr)
  172. {
  173.     m_attr = attr;
  174. }
  175. ////////////////////////////////////////////////////
  176. //
  177. // 1) use an externally owned font
  178. // 2) create internal font based on current font attributes
  179. //
  180. void CHXAvTextControl::UpdateFont(const CFont* pExternalFont)
  181. {
  182.     // reset the current font
  183.     if (m_pFont)
  184.     {
  185. iEikonEnv->ScreenDevice()->ReleaseFont(m_pFont);
  186. m_pFont = 0;
  187.     }
  188.     if( pExternalFont )
  189.     {
  190. m_pExternalFont = pExternalFont;
  191.     }
  192.     else
  193.     {
  194. m_pExternalFont = 0;
  195. m_pFont = CreateFont();
  196.     }
  197. }
  198.     
  199. void
  200. CHXAvTextControl::SetTextColor(const TRgb& color)
  201. {
  202.     m_attr.textColor = color;
  203. }
  204.     
  205. void
  206. CHXAvTextControl::SetBackgroundColor(const TRgb& color)
  207. {
  208.     m_attr.bgColor = color;
  209. }
  210.     
  211. void
  212. CHXAvTextControl::SetFontName(const CHXString& fontName)
  213. {
  214.     m_attr.fontName = fontName;
  215. }
  216.     
  217. void
  218. CHXAvTextControl::SetFontHeight(int height)
  219. {
  220.     m_attr.fontHeight = height;
  221. }
  222.     
  223. void
  224. CHXAvTextControl::SetFontBold(bool bold)
  225. {
  226.     m_attr.bIsBold = bold;
  227. }  
  228. void 
  229. CHXAvTextControl::SetJustification(CGraphicsContext::TTextAlign justify)
  230. {
  231.     m_attr.justify = justify;
  232. }
  233.     
  234. void
  235. CHXAvTextControl::SetTransparent(bool transparent)
  236. {
  237.     m_attr.bIsTransparent = transparent;
  238. }
  239. CFont*
  240. CHXAvTextControl::CreateFont() const
  241. {
  242.     CHXAvCleanString fontName(m_attr.fontName); //XXXLCM leave
  243.     TFontSpec spec(fontName(), PointsToTwips(m_attr.fontHeight));
  244.     if (m_attr.bIsBold)
  245.     {
  246. spec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
  247.     }
  248.     CFont* font;
  249.     iEikonEnv->ScreenDevice()->GetNearestFontInTwips(font, spec); 
  250.     return font;
  251. }