diff -r 9f56a4e1b8ab -r 08e69e956a8c uifw/AvKon/src/eikfrlbd.cpp --- a/uifw/AvKon/src/eikfrlbd.cpp Mon Mar 15 12:41:34 2010 +0200 +++ b/uifw/AvKon/src/eikfrlbd.cpp Wed Mar 31 21:59:52 2010 +0300 @@ -48,6 +48,7 @@ #endif //RD_UI_TRANSITION_EFFECTS_LIST #include +#include #include "akntrace.h" // there are 17(!) subcells in qdial grid (0 ... 16) @@ -56,6 +57,8 @@ // colored tick marks support const TInt KColorIconFlag = -1; const TInt KColorIconIdx = 0; +// smiley text place holder +_LIT( KPlaceHolder, "\xFFF0i" ); /** * This class needs to be in .cpp file so that we do not accidentally make it @@ -77,7 +80,8 @@ public MAknPictographAnimatorCallBack, public MCoeForegroundObserver, public MAknsEffectAnimObserver, - public MListBoxItemChangeObserver + public MListBoxItemChangeObserver, + public MAknSmileyObserver { public: enum TFlag @@ -123,6 +127,7 @@ TAknWindowLineLayout iGraphicLayout; TInt iSubCellType; TInt iConditionValue; // used with conditional layouts for not always drawn subcells + TBool iSmileyCell; }; SRowAndSubCell& At(TInt aArrayIndex); @@ -131,8 +136,8 @@ TInt FindRowAndSubCellIndex(TInt& aArrayIndex,TInt aRow,TInt aSubCell) const; void FindRowAndSubCellIndexOrAddL(TInt& aArrayIndex,TInt aRow,TInt aSubCell); - SSLSubCell& AtSL(TInt aArrayIndex); - const SSLSubCell& AtSL(TInt aArrayIndex) const; + SSLSubCell& SLAt(TInt aArrayIndex); + const SSLSubCell& SLAt(TInt aArrayIndex) const; void AddSLSubCellL(TInt aSubCell); TInt FindSLSubCellIndex(TInt& aArrayIndex, TInt aSubCell) const; void FindSLSubCellIndexOrAddL(TInt& aArrayIndex, TInt aSubCell); @@ -173,6 +178,11 @@ CWindowGc& aGc, const TRect& aOutRect, const TRect& aInnerRect ) const; + void DrawSmileyWithText( CWindowGc& aGc, const TDesC& aSmileyText, + const TAknLayoutText& aLayout, + TBool aUseLogicalToVisualConversion, + const TRgb &aColor); + TInt ConvertTextToSmiley( TDes& aText ); private: // New internal methods TBool DrawHighlightBackground( CFbsBitGc& aGc ); void PostDeleteAnimation(); @@ -194,7 +204,9 @@ TInt FindSubCellExtIndex(TInt& aArrayIndex,TInt aSubCell) const; TBool SubCellLayoutAlignment(TInt aSubCellIndex) const; - +public: // from MAknSmileyObserver + void SmileyStillImageLoaded( CAknSmileyIcon* aSmileyIcon ); + void SmileyAnimationChanged( CAknSmileyIcon* aSmileyIcon ); private: // From MAknPictographAnimatorCallBack void DrawPictographArea(); @@ -263,6 +275,8 @@ TRect iMarginRect; TBool iKineticScrolling; + CAknSmileyManager* iSmileyMan; + TSize iSmileySize; // last set simley size }; @@ -322,6 +336,7 @@ // Stop receiving foreground events CCoeEnv* env = CCoeEnv::Static(); env->RemoveForegroundObserver( *this ); + delete iSmileyMan; delete iRowAndSubCellArray; iRowAndSubCellArray = NULL; @@ -409,6 +424,7 @@ subcell.iGraphicLayout = NULL; subcell.iSubCellType = 0; subcell.iConditionValue = -1; + subcell.iSmileyCell = EFalse; TKeyArrayFix key(0,ECmpTInt32); iSLSubCellArray->InsertIsqL(subcell,key); @@ -416,14 +432,14 @@ CFormattedCellListBoxDataExtension::SSLSubCell& -CFormattedCellListBoxDataExtension::AtSL(TInt aArrayIndex) +CFormattedCellListBoxDataExtension::SLAt(TInt aArrayIndex) { __ASSERT_DEBUG(aArrayIndex>=0 && aArrayIndexCount(),Panic(EAknPanicOutOfRange)); return(iSLSubCellArray->At(aArrayIndex)); } const CFormattedCellListBoxDataExtension::SSLSubCell& -CFormattedCellListBoxDataExtension::AtSL(TInt aArrayIndex) const +CFormattedCellListBoxDataExtension::SLAt(TInt aArrayIndex) const { __ASSERT_DEBUG(aArrayIndex>=0 && aArrayIndexCount(),Panic(EAknPanicOutOfRange)); return(iSLSubCellArray->At(aArrayIndex)); @@ -1191,7 +1207,16 @@ return(iSubCellExtArray->At(index).iLayoutAlign); } - +void CFormattedCellListBoxDataExtension::SmileyStillImageLoaded( + CAknSmileyIcon* /*aSmileyIcon*/) + { + iControl->DrawDeferred(); + } + +void CFormattedCellListBoxDataExtension::SmileyAnimationChanged( + CAknSmileyIcon* /*aSmileyIcon*/ ) + { + } ///////////handling TSubCellExt,end @@ -1255,6 +1280,31 @@ KAknsIIDQsnFrListCenterPressed ); } +void CFormattedCellListBoxDataExtension::DrawSmileyWithText( CWindowGc& aGc, + const TDesC& aSmileyText, + const TAknLayoutText& aLayout, + TBool aUseLogicalToVisualConversion, + const TRgb& aColor ) + { + __ASSERT_DEBUG( iSmileyMan, Panic(EAknPanicObjectNotFullyConstructed)); + TInt l = Min( aLayout.Font()->TextWidthInPixels(KPlaceHolder), + aLayout.Font()->HeightInPixels() ); + TSize s(l,l); + if ( iSmileySize != s ) + { + iSmileyMan->SetSize( s ); + iSmileySize = s; + } + aGc.SetPenColor( aColor ); // SmileyManager's DrawText does not accept aColor... + iSmileyMan->DrawText( aGc, aSmileyText, aLayout, aUseLogicalToVisualConversion ); + } +TInt CFormattedCellListBoxDataExtension::ConvertTextToSmiley( TDes& aText) + { + __ASSERT_DEBUG( iSmileyMan, Panic(EAknPanicObjectNotFullyConstructed)); + TInt count = 0; + TRAPD( err, count = iSmileyMan->ConvertTextToCodesL( aText )) ; + return err == KErrNone ? count : err; + } EXPORT_C CCoeControl *CFormattedCellListBoxData::Control() const { @@ -2191,6 +2241,7 @@ EXPORT_C void CFormattedCellListBoxData::Draw(TListItemProperties aProperties, CWindowGc& aGc,const TDesC* aText,const TRect& aRect,TBool aHighlight, const TColors& aColors) const { _AKNTRACE_FUNC_ENTER; + _AKNTRACE("Highlight width: %d, (%d,%d)", aRect.Width(), aRect.iTl.iX, aRect.iBr.iX ); DrawDefaultHighlight(aGc, aRect, aHighlight); // Draw the actual items. @@ -2207,8 +2258,8 @@ const TColors& aColors ) const { _AKNTRACE_FUNC_ENTER; - _AKNTRACE("DrawFormatted: aText=%S, aItemRect=(%d,%d,%d,%d)", - aText, aItemRect.iTl.iX, aItemRect.iTl.iY, aItemRect.iBr.iX, + _AKNTRACE("DrawFormatted: aItemRect=(%d,%d,%d,%d)", + aItemRect.iTl.iX, aItemRect.iTl.iY, aItemRect.iBr.iX, aItemRect.iBr.iY); CListBoxView* view = static_cast( iExtension->iControl )->View(); @@ -2236,7 +2287,8 @@ #else aGc.SetClippingRect( view->ViewRect() ); #endif //RD_UI_TRANSITION_EFFECTS_LIST - + TRect vr(view->ViewRect()); + _AKNTRACE("Clipping: Width %d, (%d,%d)", vr.Width(), vr.iTl.iX, vr.iBr.iX ); if ( UsesScalableLayoutData() ) { /* this is a AvKon list or list is created using methods in aknlists.cpp @@ -2337,8 +2389,8 @@ const TColors& aColors ) const { _AKNTRACE_FUNC_ENTER; - _AKNTRACE("DrawFormattedSimple: aText=%S, aItemRect=(%d,%d,%d,%d)", - aText, aItemRect.iTl.iX, aItemRect.iTl.iY, aItemRect.iBr.iX, + _AKNTRACE("DrawFormattedSimple: aItemRect=(%d,%d,%d,%d)", + aItemRect.iTl.iX, aItemRect.iTl.iY, aItemRect.iBr.iX, aItemRect.iBr.iY); TRect textRect(aItemRect); @@ -2427,7 +2479,7 @@ } // graphics or text column - if (iExtension->AtSL(SCindex).iSubCellType == CFormattedCellListBoxDataExtension::EAknSLText) + if (iExtension->SLAt(SCindex).iSubCellType == CFormattedCellListBoxDataExtension::EAknSLText) { const CFont* rowAndCellFont=RowAndSubCellFont(iExtension->iCurrentlyDrawnItemIndex,subcell); const CFont* cellFont=Font(aProperties, subcell); @@ -2443,7 +2495,7 @@ else { // check if there are icons affecting this text layout - TInt gSC = iExtension->AtSL(SCindex).iConditionValue; // graphical subcell which might affect this text subcell + TInt gSC = iExtension->SLAt(SCindex).iConditionValue; // graphical subcell which might affect this text subcell if (gSC > -1) { @@ -2454,16 +2506,16 @@ TextUtils::ColumnText(tempText,gSC, aText); if (tempText != KNullDesC) { - textLineLayout = iExtension->AtSL(tempIndex).iTextLayout; + textLineLayout = iExtension->SLAt(tempIndex).iTextLayout; break; } - gSC = iExtension->AtSL(tempIndex).iConditionValue; + gSC = iExtension->SLAt(tempIndex).iConditionValue; } } if (gSC == -1) // no affecting icons -> use default layout { - textLineLayout = iExtension->AtSL(SCindex).iTextLayout; + textLineLayout = iExtension->SLAt(SCindex).iTextLayout; } } @@ -2499,8 +2551,16 @@ SetUnderlineStyle( aProperties, aGc, subcell ); // * 2 == leave some room for marquee - const TInt maxlen( KMaxColumnDataLength * 2 ); + const TInt maxlen( KMaxColumnDataLength * 3 ); TBuf convBuf = text.Left(maxlen); + TBool smileyDraw = EFalse; + // do smiley convert before clipping. don't worry marquee now. + if ( iExtension->iSmileyMan && + iExtension->SLAt(SCindex).iSmileyCell && + iExtension->ConvertTextToSmiley( convBuf ) > 0 ) + { + smileyDraw = ETrue; + } // Note that this potentially modifies the text so its lenght in pixels // might increase. Therefore, this should always be done before @@ -2565,7 +2625,16 @@ marquee->Stop(); } + if ( smileyDraw ) + { + TRect tr(textLayout.TextRect()); + _AKNTRACE( "textLayout Width: %d (%d,%d)", tr.Width(), tr.iTl.iX, tr.iBr.iX ); + iExtension->DrawSmileyWithText( aGc, convBuf, textLayout, bidiConv, color ); + } + else + { textLayout.DrawText( aGc, convBuf, bidiConv, color ); + } } if ( iExtension->iPictoInterface ) @@ -2652,7 +2721,7 @@ index = index & 0xffff; // mask off possible highlight icon __ASSERT_DEBUG((index>=0 && indexCount()),Panic(EAknPanicFormattedCellListInvalidBitmapIndex)); - TAknWindowLineLayout graphicLayout = iExtension->AtSL(SCindex).iGraphicLayout; + TAknWindowLineLayout graphicLayout = iExtension->SLAt(SCindex).iGraphicLayout; TAknLayoutRect graphicRect; graphicRect.LayoutRect(textRect,graphicLayout); @@ -3406,9 +3475,9 @@ TInt index = 0; iExtension->FindSLSubCellIndexOrAddL(index,aSubCell); - iExtension->AtSL(index).iTextLayout=NULL; - iExtension->AtSL(index).iGraphicLayout=aGraphicLayout; - iExtension->AtSL(index).iSubCellType=CFormattedCellListBoxDataExtension::EAknSLGraphic; + iExtension->SLAt(index).iTextLayout=NULL; + iExtension->SLAt(index).iGraphicLayout=aGraphicLayout; + iExtension->SLAt(index).iSubCellType=CFormattedCellListBoxDataExtension::EAknSLGraphic; // For compabitility - needed at least for text wrapping. // Beware - some of these WILL be overriden if you got here trough @@ -3455,9 +3524,9 @@ TInt index = 0; iExtension->FindSLSubCellIndexOrAddL(index,aSubCell); - iExtension->AtSL(index).iTextLayout=aTextLayout; - iExtension->AtSL(index).iGraphicLayout=NULL; - iExtension->AtSL(index).iSubCellType=CFormattedCellListBoxDataExtension::EAknSLText; + iExtension->SLAt(index).iTextLayout=aTextLayout; + iExtension->SLAt(index).iGraphicLayout=NULL; + iExtension->SLAt(index).iSubCellType=CFormattedCellListBoxDataExtension::EAknSLText; // For compabitility - needed at least for text wrapping. @@ -3518,22 +3587,22 @@ TInt graphicalIndex = 0; if (iExtension->FindSLSubCellIndex(graphicalIndex, aSubCell)!=0) return; // subcell not found // conditional layoutline can be only added to graphical subcells - if (iExtension->AtSL(graphicalIndex).iSubCellType!=CFormattedCellListBoxDataExtension::EAknSLGraphic) return; + if (iExtension->SLAt(graphicalIndex).iSubCellType!=CFormattedCellListBoxDataExtension::EAknSLGraphic) return; TInt textIndex = 0; // index of affected subcell if (iExtension->FindSLSubCellIndex(textIndex, aAffectedSubCell)!=0) return; // subcell not found // affected subcell can only be text subcell - if (iExtension->AtSL(textIndex).iSubCellType==CFormattedCellListBoxDataExtension::EAknSLGraphic) return; + if (iExtension->SLAt(textIndex).iSubCellType==CFormattedCellListBoxDataExtension::EAknSLGraphic) return; - TInt gSC = iExtension->AtSL(textIndex).iConditionValue; // text subcell to be added in priority chain + TInt gSC = iExtension->SLAt(textIndex).iConditionValue; // text subcell to be added in priority chain while (gSC > -1) { if (iExtension->FindSLSubCellIndex(textIndex, gSC)!=0) return; // subcell not found - gSC = iExtension->AtSL(textIndex).iConditionValue; + gSC = iExtension->SLAt(textIndex).iConditionValue; } - iExtension->AtSL(textIndex).iConditionValue = aSubCell; // add next subcell to chain - iExtension->AtSL(graphicalIndex).iTextLayout=aTextLayout; + iExtension->SLAt(textIndex).iConditionValue = aSubCell; // add next subcell to chain + iExtension->SLAt(graphicalIndex).iTextLayout=aTextLayout; iExtension->CreateColorBitmapsL( SubCellSize( aSubCell ) ); @@ -3701,16 +3770,19 @@ TInt aNormalSubCell, TInt aStretchedSubCell ) { + _AKNTRACE_FUNC_ENTER; if ( Layout_Meta_Data::IsLandscapeOrientation() && Layout_Meta_Data::IsListStretchingEnabled() && StretchingEnabled() ) { + _AKNTRACE("Layout_Meta_Data::IsListStretchingEnabled"); SetConditionalSubCellL( aSubCell, aStretchedLayout.LayoutLine(), aStretchedSubCell ); } else { SetConditionalSubCellL( aSubCell, aNormalLayout.LayoutLine(), aNormalSubCell ); } + _AKNTRACE_FUNC_EXIT; } @@ -3903,9 +3975,9 @@ if ( aResults[subCell] ) { - if ( iExtension->AtSL( subCellIndex ).iSubCellType == CFormattedCellListBoxDataExtension::EAknSLText ) + if ( iExtension->SLAt( subCellIndex ).iSubCellType == CFormattedCellListBoxDataExtension::EAknSLText ) { - TAknTextLineLayout textLine = iExtension->AtSL( subCellIndex ).iTextLayout; + TAknTextLineLayout textLine = iExtension->SLAt( subCellIndex ).iTextLayout; textLine.iW = bRect.Width(); @@ -4576,7 +4648,25 @@ } return NULL; } - +void CFormattedCellListBoxData::InitSmileyL() + { + __ASSERT_DEBUG( iExtension, Panic( EAknPanicObjectNotFullyConstructed )); + if ( iExtension && !iExtension->iSmileyMan ) + { + iExtension->iSmileyMan = CAknSmileyManager::NewL( iExtension ); + } + } + +void CFormattedCellListBoxData::SetSmileySubCellL( TInt aSubCell ) + { + __ASSERT_DEBUG( iExtension, Panic( EAknPanicObjectNotFullyConstructed )); + TInt index = 0; + if ( iExtension ) + { + iExtension->FindSLSubCellIndexOrAddL( index,aSubCell ); + iExtension->SLAt(index).iSmileyCell = ETrue; + } + } #ifdef __ARMCC__ #pragma pop #endif // __ARMCC__