chxavtextcontrol.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:6k
- /************************************************************************
- * chxavtextcontrol.cpp
- * --------------------
- *
- * Synopsis:
- * Text control for ui implementation.
- *
- * Target:
- * Symbian OS
- *
- *
- * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
- *
- ************************************************************************/
- // Helix includes...
- #include "hxstring.h"
- // Includes from this project...
- #include "hxsym_debug.h"
- #include "hxsym_leaveutil.h"
- #include "chxavmisc.h"
- #include "chxavcleanstring.h"
- #include "chxavstringutils.h"
- #include "chxavtextcontrol.h"
- CHXAvTextControl::CHXAvTextControl(TInt cid)
- : CHXAvControl(cid)
- , m_pCommand(0)
- , m_pbmpBG(0)
- , m_pExternalFont(0)
- , m_bUseEllipsisForTruncation(true)
- {
- SetText(KNullDesC);
- }
- CHXAvTextControl*
- CHXAvTextControl::NewL(const CCoeControl& container, TInt cid )
- {
- CHXAvTextControl* pSelf = new(ELeave) CHXAvTextControl(cid);
- CleanupStack::PushL(pSelf);
- pSelf->ConstructL(container);
- CleanupStack::Pop();
- return pSelf;
- }
- void
- CHXAvTextControl::ConstructL(const CCoeControl& parent)
- {
- SetContainerWindowL(parent);
- EnableDragEvents();
- }
- CHXAvTextControl::~CHXAvTextControl()
- {
- if (m_pFont )
- {
- iEikonEnv->ScreenDevice()->ReleaseFont(m_pFont);
- m_pFont = 0;
- }
- HX_DELETE(m_pbmpBG);
- HX_DELETE(m_pText);
- HX_DELETE(m_pCommand);
- }
- void
- CHXAvTextControl::HandlePointerEventL(const TPointerEvent& aPointerEvent)
- {
- DPRINTF(SYMP_WSEVENTS, ("CHXAvTextControl::HandlePointerEventL (%d)n", aPointerEvent.iType));
- // only handle events if we are not disabled
- if (!IsDimmed())
- {
- if( aPointerEvent.iType == TPointerEvent::EButton1Down )
- {
- if( m_pCommand)
- {
- m_pCommand->Execute();
- }
- }
- }
- }
- void CHXAvTextControl::SetCommandL(const CHXAvCommand& commandProto)
- {
- HX_DELETE(m_pCommand);
- m_pCommand = commandProto.CloneL();
- }
- //
- // create a copy of the parent background bitmap
- //
- // useful if the text control is transparent, and the text
- // will change during the lifetime of the control.
- //
- void
- CHXAvTextControl::SetBGBitmapL(CFbsBitmap* pbmpParentBG)
- {
- if( !pbmpParentBG )
- {
- // free current bitmap
- HX_DELETE(m_pbmpBG);
- return;
- }
- CWsScreenDevice* pScreenDevice = iCoeEnv->ScreenDevice();
- // create bg bitmap of same size as this control
- if( m_pbmpBG )
- {
- m_pbmpBG->Reset();
- }
- {
- m_pbmpBG = new (ELeave) CFbsBitmap();
- }
- CleanupStack::PushL(m_pbmpBG);
- m_pbmpBG->Create(Rect().Size(), pScreenDevice->DisplayMode());
-
- // create device
- CFbsBitmapDevice* pbmpDevice = CFbsBitmapDevice::NewL(m_pbmpBG);
- CleanupStack::PushL(pbmpDevice);
- // create context from device
- CGraphicsContext* pbmpContext = 0;
- HXSYM_LEAVE_IF_ERR(pbmpDevice->CreateContext(pbmpContext));
- CleanupStack::PushL(pbmpContext);
- // draw from parent bitmap to new bitmap
- TRect rcDest(TPoint(0,0), Rect().Size());
- pbmpContext->DrawBitmap(rcDest, pbmpParentBG, Rect());
- CleanupStack::PopAndDestroy(2); // gc, dev
- CleanupStack::Pop(); // m_pbmpBG
- }
- void
- CHXAvTextControl::Draw(const TRect& /*rect*/) const
- {
- CWindowGc& gc = SystemGc();
- const CFont* pFont = GetFont();
- HX_ASSERT(pFont); // call UpdateFont() after attributes are set
- gc.SetPenColor(m_attr.textColor);
- gc.SetBrushColor(m_attr.bgColor);
- if (m_attr.bIsTransparent)
- {
- // draw background if supplied
- if( m_pbmpBG )
- {
- gc.BitBlt(Rect().iTl, m_pbmpBG);
- }
- gc.SetBrushStyle(CGraphicsContext::ENullBrush);
- }
- else
- {
- gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
- }
- gc.UseFont(pFont);
- const TDesC& text = GetText();
- if (text.Length() > 0)
- {
- HBufC* pNewText = 0;
- TRAPD(ret, CHXAvStringUtils::GetTruncatedDisplayTextL(text, pFont, Rect().Width(), pNewText, m_bUseEllipsisForTruncation));
- // only safe to draw if function succeeded
- if( ret == KErrNone )
- {
- const TDesC* pText = pNewText ? pNewText: &text;
- gc.DrawText(*pText, Rect(),
- Rect().Height()/2 + pFont->AscentInPixels()/2,
- m_attr.justify);
- delete pNewText;
- }
- }
- else
- {
- gc.SetPenStyle(CGraphicsContext::ENullPen);
- gc.DrawRect(Rect());
- }
- //gc.DiscardFont();
- }
- void
- CHXAvTextControl::SetText(const TDesC& text)
- {
- HX_DELETE(m_pText);
- m_pText = text.Alloc();
- }
- void
- CHXAvTextControl::SetAttributes(const CHXAvTextControl::TextControlAttributes& attr)
- {
- m_attr = attr;
- }
- ////////////////////////////////////////////////////
- //
- // 1) use an externally owned font
- // 2) create internal font based on current font attributes
- //
- void CHXAvTextControl::UpdateFont(const CFont* pExternalFont)
- {
- // reset the current font
- if (m_pFont)
- {
- iEikonEnv->ScreenDevice()->ReleaseFont(m_pFont);
- m_pFont = 0;
- }
- if( pExternalFont )
- {
- m_pExternalFont = pExternalFont;
- }
- else
- {
- m_pExternalFont = 0;
- m_pFont = CreateFont();
- }
- }
-
- void
- CHXAvTextControl::SetTextColor(const TRgb& color)
- {
- m_attr.textColor = color;
- }
-
- void
- CHXAvTextControl::SetBackgroundColor(const TRgb& color)
- {
- m_attr.bgColor = color;
- }
-
- void
- CHXAvTextControl::SetFontName(const CHXString& fontName)
- {
- m_attr.fontName = fontName;
- }
-
- void
- CHXAvTextControl::SetFontHeight(int height)
- {
- m_attr.fontHeight = height;
- }
-
- void
- CHXAvTextControl::SetFontBold(bool bold)
- {
- m_attr.bIsBold = bold;
- }
- void
- CHXAvTextControl::SetJustification(CGraphicsContext::TTextAlign justify)
- {
- m_attr.justify = justify;
- }
-
- void
- CHXAvTextControl::SetTransparent(bool transparent)
- {
- m_attr.bIsTransparent = transparent;
- }
- CFont*
- CHXAvTextControl::CreateFont() const
- {
- CHXAvCleanString fontName(m_attr.fontName); //XXXLCM leave
- TFontSpec spec(fontName(), PointsToTwips(m_attr.fontHeight));
- if (m_attr.bIsBold)
- {
- spec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
- }
- CFont* font;
- iEikonEnv->ScreenDevice()->GetNearestFontInTwips(font, spec);
- return font;
- }