--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/menufw/menufwui/mmwidgets/src/mmlistboxitemdrawer.cpp Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,1670 @@
+/*
+ * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include <eikfrlb.h>
+#include <e32math.h>
+#include "mmwidgetsconstants.h"
+#include "hnconvutils.h"
+#include <gdi.h>
+#include <AknIconArray.h>
+#include <AknsConstants.h>
+#include <AknFontAccess.h>
+#include <aknlistboxtfx.h>
+#include <layoutmetadata.cdl.h>
+#include <AknIconUtils.h>
+#include <AknBidiTextUtils.h>
+#include <AknDef.hrh>
+#include <AknLayoutFont.h>
+#include <avkon.mbg>
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+#include <aknlistloadertfx.h>
+#include <aknlistboxtfxinternal.h>
+#endif
+
+#include <AknsLayeredBackgroundControlContext.h>
+#include <AknsListBoxBackgroundControlContext.h>
+#include "bitmaptransforms.h"
+#include "mmwidgetsconstants.h"
+#include "mmlistbox.h"
+#include "mmtemplatelibrary.h"
+#include "mmlistboxitemdrawer.h"
+#include "mmlistboxmodel.h"
+#include "mmdraweranimator.h"
+#include "mmmarqueeadapter.h"
+#include "mmfloatingitem.h"
+#include "mmgridview.h"
+#include "mmlistboxview.h"
+#include "mmcacheforitem.h"
+#include "mmitemsdatacache.h"
+#include "mmwidgetcontainer.h"
+#include "hnsuitemodel.h"
+#include "menudebug.h"
+#include "hnextbmpiconholder.h"
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMmListBoxItemDrawer::CMmListBoxItemDrawer(
+ CMmListBoxModel* aMmListBoxModel,
+ const CFont* aFont,
+ CFormattedCellListBoxData* aFormattedCellData,
+ TMmWidgetType aWidgetType,
+ CMmTemplateLibrary* aTemplateLibrary )
+ : CFormattedCellListBoxItemDrawer( aMmListBoxModel , aFont, aFormattedCellData),
+ iFont(aFont), iLeftOverAreaUnderAnimatedItem(EFalse)
+ {
+ iWidgetType = aWidgetType;
+ iTemplateLibrary = aTemplateLibrary;
+ iMmModel = aMmListBoxModel;
+ iRedrawBackground = ETrue;
+ iDrawSeparatorLines = EFalse;
+ iZoomIconIndex = -1;
+ iIconAnimationZoomRatio = 1;
+ // this is needed to get iColors initialized on first use:
+ iLastDrawnItemWasFloating = ETrue;
+ SetFlags( CListItemDrawer::EDisableHighlight );
+ iIsSwapFloating = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMmListBoxItemDrawer::~CMmListBoxItemDrawer()
+ {
+ iFloatingItems.Close();
+ delete iItemsDataCache;
+ delete iAnimator;
+ delete iSubcellText;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::EnableCachedDataUse( TBool aEnable )
+ {
+ iUseCache = aEnable;
+ if( aEnable )
+ {
+ RemoveFloatingItems();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::CachedDataUseIsEnabled() const
+ {
+ return iUseCache;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::TrimCacheSize( TInt aItemCount )
+ {
+ iItemsDataCache->Trim( aItemCount );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::InvalidateCache()
+ {
+ iItemsDataCache->Invalidate();
+ // this is needed to get iColors initialized on first use:
+ iLastDrawnItemWasFloating = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMmListBoxItemDrawer* CMmListBoxItemDrawer::NewLC(
+ CMmListBoxModel* aMmListBoxModel,
+ const CFont* aFont,
+ CFormattedCellListBoxData* aFormattedCellData,
+ TMmWidgetType aWidgetType,
+ CMmTemplateLibrary* aTemplateLibrary )
+ {
+ CMmListBoxItemDrawer* self = new ( ELeave ) CMmListBoxItemDrawer(
+ aMmListBoxModel, aFont, aFormattedCellData, aWidgetType,
+ aTemplateLibrary );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMmListBoxItemDrawer* CMmListBoxItemDrawer::NewL(
+ CMmListBoxModel* aMmListBoxModel,
+ const CFont* aFont,
+ CFormattedCellListBoxData* aFormattedCellData,
+ TMmWidgetType aWidgetType,
+ CMmTemplateLibrary* aTemplateLibrary )
+ {
+ CMmListBoxItemDrawer* self = CMmListBoxItemDrawer::NewLC(
+ aMmListBoxModel, aFont, aFormattedCellData, aWidgetType,
+ aTemplateLibrary );
+ CleanupStack::Pop( self );
+ return self;
+
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetView( CEikListBox * aView )
+ {
+ iWidget = aView;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CEikListBox* CMmListBoxItemDrawer::Widget() const
+ {
+ return iWidget;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::ConstructL()
+ {
+ iAnimator = CMmDrawerAnimator::NewL( *this );
+ iItemsDataCache = CMmItemsDataCache::NewL();
+ iIsEditMode = EFalse;
+ iHighlightShown = EFalse;
+ iDrawMoveIndicators = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DrawEmptyItem( TInt aItemIndex,
+ TPoint aItemRectPos, TBool aViewIsDimmed ) const
+ {
+ TRect r( aItemRectPos, iItemCellSize );
+
+ CFormattedCellListBoxItemDrawer::DrawEmptyItem( aItemIndex, aItemRectPos,
+ aViewIsDimmed );
+
+ const_cast<CMmListBoxItemDrawer*> ( this )->DrawFloatingItems( r );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmListBoxItemDrawer::GetFloatingItemIndex( TMmFloatingItemType aType ) const
+ {
+ TInt ret( KErrNotFound );
+ TInt i( iFloatingItems.Count() - 1 );
+ for( ; i >= 0; i-- )
+ {
+ if( iFloatingItems[i].GetFloatingItemType() == aType )
+ {
+ ret = i;
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TMmFloatingItem& CMmListBoxItemDrawer::GetFloatingItemL(TMmFloatingItemType aType)
+ {
+ TInt index = GetFloatingItemIndex( aType );
+ User::LeaveIfError( index );
+ return iFloatingItems[index];
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AnimateDragItemTransitionL()
+ {
+ iAnimator->AnimateDragItemTransitionL();
+ iAnimator->Trigger();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AnimateItemSwapL( TInt aItemFrom, TInt aItemTo )
+ {
+ iAnimator->AnimateItemSwapL( aItemFrom, aItemTo );
+ iAnimator->Trigger();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AnimateItemZoomInL( TInt aItemIndex )
+ {
+ iAnimator->AnimateItemZoomL( aItemIndex, ETrue );
+ iAnimator->Trigger();
+ static_cast<CMmWidgetContainer*> (Widget()->Parent() )->SetAllowMove( EFalse );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AnimateItemZoomOutL( TInt aItemIndex )
+ {
+ iAnimator->AnimateItemZoomL( aItemIndex, EFalse );
+ iAnimator->Trigger();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DrawFloatingItems( TRect currentlyDrawnRect )
+ {
+ TBool redrawItemBackground = IsRedrawItemBackgroundEnabled();
+ SetRedrawItemBackground( EFalse );
+ for( TInt i( iFloatingItems.Count() - 1 ); i >= 0; i-- )
+ {
+ TMmFloatingItemType type = iFloatingItems[i].GetFloatingItemType();
+ if( iFloatingItems[i].IsFloatingItemValid() )
+ {
+ TInt drawnItemIndex = iFloatingItems[i].GetDrawnItemIndex();
+ TSize size = iWidget->View()->ItemSize( drawnItemIndex );
+ if ( iWidgetType == EListbox
+ && TemplateLibrary()->GetScrollbarVisibility())
+ {
+ size.iWidth -= TemplateLibrary()->ScrollbarWidth();
+ }
+ TRect rect( iFloatingItems[i].GetItemPosition(),
+ iFloatingItems[i].GetItemPosition() + size);
+
+ if( rect.Intersects( currentlyDrawnRect ) )
+ {
+ TInt tempZoomIconIndex = iZoomIconIndex;
+ TInt tempZoomRatio = iIconAnimationZoomRatio;
+
+ iZoomIconIndex = iFloatingItems[i].GetDrawnItemIndex();
+ iIconAnimationZoomRatio = iFloatingItems[i].GetCurrentZoomRatio();
+
+ if ( ItemHasFloatingType( drawnItemIndex, EDrag)
+ || ItemHasFloatingType( drawnItemIndex, EDragTransition)
+ || ItemHasFloatingType( drawnItemIndex, EDragStart ) )
+ {
+ ClearFlags( CListItemDrawer::EPressedDownState );
+ }
+ type == ESwapTransition ? iIsSwapFloating = ETrue : iIsSwapFloating = EFalse;
+ if( ( type == EDrag && !ItemHasFloatingType( drawnItemIndex, EDragStart ) )
+ || ( type != EDragTransition && type != EDrag
+ && !ItemHasFloatingType( drawnItemIndex, EDragTransition ) )
+ || ( type == EDragTransition )
+ )
+ {
+ DrawActualItem( drawnItemIndex, rect, ETrue, EFalse, EFalse, EFalse );
+ }
+ iIconAnimationZoomRatio = tempZoomRatio;
+ iZoomIconIndex = tempZoomIconIndex;
+ }
+ }
+ else
+ {
+ iFloatingItems.Remove( i );
+ }
+ }
+ SetRedrawItemBackground( redrawItemBackground );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmListBoxItemDrawer::GetValidFloatingItemCount(TMmFloatingItemType aType)
+ {
+ TInt count( 0 );
+
+ for( TInt i( iFloatingItems.Count() - 1 ); i >= 0; i-- )
+ {
+ if( iFloatingItems[i].GetFloatingItemType() == aType
+ && iFloatingItems[i].IsFloatingItemValid() )
+ count++;
+ }
+ return count;
+ }
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DrawItem( TInt aItemIndex, TPoint aItemRectPos,
+ TBool aItemIsSelected, TBool aItemIsCurrent, TBool aViewIsEmphasized,
+ TBool aViewIsDimmed) const
+ {
+ if( !Widget()->View()->RedrawDisabled() )
+ {
+ TBool highlightVisible =
+ !( Flags() & CListItemDrawer::ESingleClickDisabledHighlight );
+ aItemIsCurrent = aItemIsCurrent && highlightVisible;
+ DoDrawItem( aItemIndex, aItemRectPos, aItemIsSelected,
+ aItemIsCurrent, aViewIsEmphasized, aViewIsDimmed );
+ }
+ }
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DoDrawItem(TInt aItemIndex, TPoint aItemRectPos,
+ TBool aItemIsSelected, TBool aItemIsCurrent, TBool aViewIsEmphasized,
+ TBool aViewIsDimmed) const
+ {
+ TSize itemCellSize = TSize( GetItemSize( aItemIndex, aItemIsCurrent ) );
+ TRect actualItemRect( aItemRectPos, itemCellSize );
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( iGc );
+ if( transApi )
+ {
+ transApi->StartDrawing( MAknListBoxTfxInternal::EListView );
+ transApi->StopDrawing();
+ transApi->BeginRedraw( MAknListBoxTfxInternal::EListItem,
+ actualItemRect, aItemIndex );
+ }
+#endif
+
+ const_cast<CMmListBoxItemDrawer*>(this)->iLeftOverAreaUnderAnimatedItem = EFalse;
+ for( TInt i( iFloatingItems.Count() - 1 ); i >= 0; i-- )
+ {
+ if( iFloatingItems[i].GetDrawnItemIndex() == aItemIndex
+ && iFloatingItems[i].IsFloatingItemValid() )
+ {
+ const_cast<CMmListBoxItemDrawer*>(this)->iLeftOverAreaUnderAnimatedItem = ETrue;
+ break;
+ }
+ }
+
+ iIsSwapFloating = EFalse;
+ DrawActualItem(aItemIndex, actualItemRect, aItemIsCurrent, aViewIsEmphasized,
+ aViewIsDimmed, aItemIsSelected);
+ const_cast<CMmListBoxItemDrawer*>(this)->iLeftOverAreaUnderAnimatedItem = EFalse;
+
+ const_cast<CMmListBoxItemDrawer*>(this)->DrawFloatingItems(actualItemRect);
+
+ if( !AknLayoutUtils::PenEnabled() && IsEditMode() )
+ {
+ const_cast<CMmListBoxItemDrawer*> ( this )->DrawActualIndicatorItem(
+ aItemIndex, actualItemRect );
+ }
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ if( transApi )
+ {
+ transApi->EndRedraw( MAknListBoxTfxInternal::EListItem, aItemIndex );
+ }
+#endif
+
+
+
+ }
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DrawItemText( TInt aItemIndex,
+ const TRect &aItemTextRect, TBool aItemIsCurrent,
+ TBool aViewIsEmphasized, TBool aItemIsSelected ) const
+ {
+ TRAP_IGNORE( DoDrawItemTextL( aItemIndex, aItemTextRect, aItemIsCurrent,
+ aViewIsEmphasized, aItemIsSelected ) );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DoDrawItemTextL( TInt aItemIndex, const TRect
+ &aItemTextRect, TBool aItemIsCurrent, TBool aViewIsEmphasized,
+ TBool /* aItemIsSelected */) const
+ {
+ CMmCacheForItem* cache = iItemsDataCache->GetItemCacheL( aItemIndex );
+ cache->InvalidateIfCacheMayNotBeUsed(
+ aItemIsCurrent, iLastSubcellsSetupCode );
+
+ if( IsRedrawItemBackgroundEnabled() )
+ {
+ DrawBackground( aItemTextRect );
+ }
+
+ if ( !iUseCache || !cache->IsValid() )
+ {
+ SetupSubCellsL( aItemIsCurrent, aItemIndex );
+ }
+ __ASSERT_DEBUG( cache->IsValid(), User::Invariant() );
+
+ FormattedCellData()->SetIconArray( cache->GetIconListL() );
+
+ TBool isFloating = !iUseCache && IsFloating( aItemIndex );
+ if( !!isFloating != !!iLastDrawnItemWasFloating ) // Ex-OR
+ {
+ iLastDrawnItemWasFloating = isFloating;
+ iColors = SetupColors( isFloating );
+ }
+
+ CFormattedCellListBoxData* data = static_cast<CFormattedCellListBoxData*>(iData);
+ data->EnableMarqueeL( EFalse );
+
+ TBool highlightShown = ETrue;
+ if( FormattedCellData()->RespectFocus() && !aViewIsEmphasized )
+ {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iGc );
+ if( transApi )
+ {
+ transApi->Remove( MAknListBoxTfxInternal::EListHighlight );
+ }
+#endif
+ highlightShown = EFalse;
+ }
+
+ data->Draw( Properties(aItemIndex), *iGc, &( cache->GetItemText() ), aItemTextRect,
+ GetHighlightVisibility( aItemIndex, aItemIsCurrent, highlightShown ), iColors );
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iGc );
+ if( transApi )
+ {
+ transApi->StartDrawing( MAknListBoxTfxInternal::EListItem );
+ }
+#endif
+
+ if( iMarqueeAdapter && aItemIsCurrent )
+ {
+ DEBUG(("CMmListBoxItemDrawer::DoDrawItemTextL - DrawMarquee"));
+ iMarqueeAdapter->DrawMarqueeL( *iGc );
+ }
+
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ if( transApi )
+ {
+ transApi->StopDrawing();
+ }
+#endif
+
+ if( iDrawSeparatorLines && !iIsSwapFloating )
+ {
+ CMmListBoxView* view = static_cast<CMmListBoxView*>( iWidget->View() );
+ if( aItemIndex != ( view->ModelItemsCount() - 1 ))
+ {
+ AknListUtils::DrawSeparator( *iGc, aItemTextRect, iColors.iBack );
+ }
+ }
+ ColumnData()->SetIconArray( NULL );
+
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetRedrawItemBackground( TBool aRedraw )
+ {
+ iRedrawBackground = aRedraw;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetDrawSeparatorLines( TBool aDraw )
+ {
+ iDrawSeparatorLines = aDraw;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::IsRedrawItemBackgroundEnabled() const
+ {
+ return iRedrawBackground;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DrawBackground( const TRect& aItemTextRect ) const
+ {
+ MAknsSkinInstance *skin = AknsUtils::SkinInstance();
+ CCoeControl* control = FormattedCellData()->Control();
+
+ if( IsRedrawItemBackgroundEnabled() )
+ {
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ MAknListBoxTfxInternal *transApi = CAknListLoader::TfxApiInternal( iGc );
+ if( transApi )
+ {
+ transApi->StartDrawing( MAknListBoxTfxInternal::EListView );
+ }
+#endif
+ TBool bgDrawn( EFalse );
+ if( control )
+ {
+ if( CAknEnv::Static()->TransparencyEnabled() )
+ {
+ bgDrawn = AknsDrawUtils::Background(
+ skin, iBgContext, control, *iGc, aItemTextRect,
+ KAknsDrawParamNoClearUnderImage );
+ }
+ else
+ {
+ bgDrawn = AknsDrawUtils::Background(
+ skin, iBgContext, control, *iGc, aItemTextRect,
+ KAknsDrawParamNoClearUnderImage |
+ KAknsDrawParamBottomLevelRGBOnly );
+ }
+ }
+ if( !bgDrawn )
+ {
+ iGc->Clear( aItemTextRect );
+ }
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ if( transApi )
+ {
+ transApi->StopDrawing();
+ }
+#endif
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AnimateDragItemStartL( TInt aDraggedIndex,
+ TPoint aPoint )
+ {
+ iAnimator->AnimateDragItemStartL( aDraggedIndex, aPoint );
+ iAnimator->Trigger();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetupSubNoCellL( TInt aIndex,
+ TInt aItemIndex ) const
+ {
+ TTemplateChild child;
+ child.iFontId = EAknLogicalFontSecondaryFont;
+ child.iIsImage = EFalse;
+ const_cast<CMmListBoxItemDrawer*>(this)->
+ ReplaceSubCellText( KNullDesC() );
+ SetupSubCellL( child, aIndex, aItemIndex );
+ iLastSubcellsSetupCode.AddSubcellInfo( TMmSubcellsSetupCode::ENoSubcell );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetupSubIcondDragHighlightCellL(
+ TTemplateChild aSubCellTemplate, TInt aIndex, TInt aItemIndex ) const
+ {
+ aSubCellTemplate.iRectAccordingToParent.iBr
+ = TPoint(ItemCellSize().iWidth * iIconAnimationZoomRatio,
+ ItemCellSize().iHeight * iIconAnimationZoomRatio);
+
+ aSubCellTemplate.iRectAccordingToParent.iTl = TPoint(0, 0);
+ SetupSubCellL( aSubCellTemplate, aIndex, aItemIndex );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetupSubCellL( TTemplateChild aSubCellTemplate,
+ TInt aIndex, TInt aItemIndex ) const
+ {
+ CFormattedCellListBoxData* data = static_cast<CFormattedCellListBoxData*>(iData);
+ TInt width = aSubCellTemplate.iRectAccordingToParent.iBr.iX - aSubCellTemplate.iRectAccordingToParent.iTl.iX;
+ TInt height = aSubCellTemplate.iRectAccordingToParent.iBr.iY - aSubCellTemplate.iRectAccordingToParent.iTl.iY;
+ data->SetTransparentSubCellL( aIndex, ETrue );
+ data->SetSubCellSizeL( aIndex, TSize( width, height ) );
+ data->SetSubCellIconSize( aIndex, TSize( width, height ) );
+ data->SetSubCellPositionL( aIndex, aSubCellTemplate.iRectAccordingToParent.iTl);
+ data->SetGraphicsSubCellL( aIndex, aSubCellTemplate.iIsImage );
+ data->SetSubCellAlignmentL( aIndex, aSubCellTemplate.iTextAlign );
+ const CFont* font = AknLayoutUtils::FontFromId(aSubCellTemplate.iFontId);
+ data->SetSubCellFontL (aIndex, font);
+ data->SetSubCellBaselinePosL( aIndex,
+ CAknLayoutFont::AsCAknLayoutFontOrNull( font )->TextPaneTopToBaseline()
+ + aSubCellTemplate.iRectAccordingToParent.iTl.iY );
+
+ // If some text is clipped then marquee will do the drawing right after the subcell is drawn by ListBoxData.
+ // Setting the subcell size to zero prevents ListBoxData from drawing the text.
+ if (!aSubCellTemplate.iIsImage
+ && !iIsMarqueeBeingDrawn
+ && ( aItemIndex == iWidget->View()->CurrentItemIndex() )
+ && !IsEditMode()
+ && iWidgetType == EListbox
+ && iSubcellText
+ && iMarqueeAdapter->IsMarqueeEnabled() )
+
+ {
+ if (iMarqueeAdapter && IsTextClippedL( aSubCellTemplate, *iSubcellText )
+ && STATIC_CAST(CMmWidgetContainer*,Widget()->Parent())->IsHighlightVisible() )
+ {
+ data->SetSubCellSizeL( aIndex, TSize( 0, 0 ) );
+ const_cast<CMmListBoxItemDrawer*> ( this )->AddSubcellMarqueeElementL(
+ aSubCellTemplate, aIndex, aItemIndex );
+ }
+ else if( iMarqueeAdapter )
+ {
+ iMarqueeAdapter->StopMarqueeDrawing( aIndex );
+ }
+ }
+
+ if( iMarqueeAdapter && iIsMarqueeBeingDrawn
+ && iMarqueeAdapter->SubcellMarqueeElementExists( aIndex ) )
+ {
+ if( aItemIndex != iWidget->View()->CurrentItemIndex() )
+ {
+ iMarqueeAdapter->StopMarqueeDrawing( aIndex );
+ }
+ else
+ {
+ data->SetSubCellSizeL( aIndex, TSize( 0, 0 ) );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CFormattedCellListBoxData::TColors CMmListBoxItemDrawer::SetupColors( TBool aDragged ) const
+ {
+ CFormattedCellListBoxData::TColors colors;
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+ if( !aDragged )
+ {
+ AknsUtils::GetCachedColor( skin, colors.iText, KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG9 );
+ AknsUtils::GetCachedColor( skin, colors.iBack , KAknsIIDQsnTextColors,
+ EAknsCIQsnOtherColorsCG6 );
+ AknsUtils::GetCachedColor( skin, colors.iHighlightedText,
+ KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG11 );
+ AknsUtils::GetCachedColor( skin, colors.iHighlightedBack,
+ KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
+ }
+ else
+ {
+ AknsUtils::GetCachedColor( skin, colors.iText, KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG11 );
+ AknsUtils::GetCachedColor( skin, colors.iBack , KAknsIIDQsnTextColors,
+ EAknsCIQsnTextColorsCG6 );
+ AknsUtils::GetCachedColor( skin, colors.iHighlightedText,
+ KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG11 );
+ AknsUtils::GetCachedColor( skin, colors.iHighlightedBack,
+ KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
+ }
+
+ return colors;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmListBoxItemDrawer::GetItemHeight( TInt aItemIndex, TBool aItemIsCurrent ) const
+ {
+ TSize ret( TInt( 0 ), TInt( 0 ) );
+ ret = GetItemSize( aItemIndex, aItemIsCurrent );
+ return ret.iHeight;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TInt CMmListBoxItemDrawer::GetFloatingItemCount()
+ {
+ for( TInt i( iFloatingItems.Count() - 1 ); i >= 0; i-- )
+ {
+ TMmFloatingItem& current = GetFloatingItemAtIndex( i );
+ if( current.GetDrawnItemIndex() == KErrNotFound )
+ {
+ RemoveFloatingItem( i );
+ }
+ }
+
+ return iFloatingItems.Count();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TMmFloatingItem& CMmListBoxItemDrawer::GetFloatingItemAtIndex( TInt aIndex )
+ {
+ return iFloatingItems[aIndex];
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::RemoveFloatingItem( TInt aPosition )
+ {
+ if( aPosition != KErrNotFound )
+ {
+ iFloatingItems.Remove( aPosition );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::RemoveFloatingItems()
+ {
+ iFloatingItems.Reset();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AddFloatingItemL( TMmFloatingItem& aFloatingItem,
+ TInt aPosition )
+ {
+ EnableCachedDataUse( EFalse );
+ if( aPosition != KErrNotFound )
+ {
+ iFloatingItems.InsertL( aFloatingItem, aPosition );
+ }
+ else
+ {
+ iFloatingItems.AppendL( aFloatingItem );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TSize CMmListBoxItemDrawer::GetItemSize( TInt aItemIndex, TBool aItemIsCurrent ) const
+ {
+ if( aItemIndex < 0 )
+ {
+ return TSize( 1, 1 );
+ }
+
+ TSize size;
+
+ CMmCacheForItem* cache = NULL;
+ TRAPD( cacheError, cache = iItemsDataCache->GetItemCacheL( aItemIndex ) );
+ if( cacheError != KErrNone )
+ {
+ cache = NULL;
+ }
+
+ if( cache )
+ {
+ cache->InvalidateIfCacheMayNotBeUsed(
+ aItemIsCurrent, iLastSubcellsSetupCode );
+ }
+
+ if( !iUseCache || !cache || !cache->IsValid() )
+ {
+ const TDesC8& mm_template = iMmModel->GetAttributeAsText (aItemIndex,
+ KMmTemplate8);
+ TRect viewRect = iWidget->View()->ViewRect();
+ TBool landscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
+
+ if( iTemplateLibrary->GetSize( size, iWidgetType, mm_template,
+ landscapeOrientation, aItemIsCurrent, viewRect )
+ != KErrNone )
+ {
+ size = TSize( 1, 1 );
+ }
+ if( cache )
+ {
+ cache->SetSize( size );
+ }
+ }
+ else
+ {
+ size = cache->GetSize();
+ }
+ return size;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TRect CMmListBoxItemDrawer::GetIndicatorRect() const
+ {
+ TBool landscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
+ const TDesC8& mm_template = iMmModel->GetAttributeAsText(
+ iWidget->View()->CurrentItemIndex(), KMmTemplate8 );
+ TRect indicatorRect( iTemplateLibrary->GetMoveIndicatorRect(
+ iWidgetType, mm_template, landscapeOrientation, ETrue ) );
+ return indicatorRect;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetDraggableL( TBool aDraggable )
+ {
+
+ iDraggable = aDraggable;
+
+ if( !iDraggable )
+ {
+ for( int i = 0; i < iFloatingItems.Count(); i++ )
+ {
+ if( iFloatingItems[i].GetFloatingItemType() == EZoomTransition
+ && iFloatingItems[i].GetZoomingStatus() > 0 )
+ {
+ AnimateItemZoomOutL( iFloatingItems[i].GetDrawnItemIndex() );
+ }
+ else if( iFloatingItems[i].GetFloatingItemType() == EDrag
+ || iFloatingItems[i].IsManualDelete() )
+ {
+ iFloatingItems[i].InvalidateFloatingItem();
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetEditModeL( TBool aEditMode )
+ {
+ if( aEditMode )
+ {
+ EnableCachedDataUse( EFalse );
+ }
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+ MAknListBoxTfxInternal *trans = CAknListLoader::TfxApiInternal( iGc );
+ if( trans )
+ {
+ trans->Remove( MAknListBoxTfxInternal::EListEverything );
+ trans->Draw( iViewRect );
+ }
+#endif
+ iIsEditMode = aEditMode;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::IsEditMode() const
+ {
+ return iIsEditMode;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMmDrawerAnimator* CMmListBoxItemDrawer::GetAnimator()
+ {
+ return iAnimator;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetDraggedPointL( TPoint aPoint )
+ {
+ TInt dragFloatingItem = GetFloatingItemIndex( EDragStart );
+ if( KErrNotFound != dragFloatingItem )
+ {
+ TMmFloatingItem & item = GetFloatingItemAtIndex( dragFloatingItem );
+ TMmFloatingItem postDragRefresh( item.GetDrawnItemIndex(),
+ item.GetItemPosition(), EPostDragRefreshItem,
+ MmEffects::KNoAnimationFramesCount, iWidget->View() );
+ if( postDragRefresh.GetItemPosition() != aPoint )
+ {
+ iFloatingItems.Append( postDragRefresh );
+ }
+ }
+
+ if( dragFloatingItem == KErrNotFound
+ && ( dragFloatingItem = GetFloatingItemIndex( EDrag ) )
+ != KErrNotFound )
+ {
+ TMmFloatingItem & item = GetFloatingItemAtIndex( dragFloatingItem );
+ TMmFloatingItem floatingItem( item.GetDrawnItemIndex(),
+ aPoint, EDrag, MmEffects::KNoAnimationFramesCount, NULL );
+ floatingItem.SetManualDelete( ETrue );
+
+ TMmFloatingItem postDragRefresh( item.GetDrawnItemIndex(),
+ item.GetItemPosition(), EPostDragRefreshItem,
+ MmEffects::KNoAnimationFramesCount, iWidget->View() );
+
+ iFloatingItems.Remove( dragFloatingItem );
+
+ if (postDragRefresh.GetItemPosition() != floatingItem.GetItemPosition())
+ {
+ iFloatingItems.Append( postDragRefresh );
+ }
+ iFloatingItems.Insert( floatingItem, 0 );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetDraggedIndexL( TInt aDraggedItemIndex,
+ TPoint aPoint )
+ {
+ TInt dragStartFloatingItem( KErrNotFound );
+ TInt dragFloatingItem( KErrNotFound );
+ do
+ {
+ dragStartFloatingItem = GetFloatingItemIndex( EDragStart );
+ dragFloatingItem = GetFloatingItemIndex( EDrag );
+ if( dragStartFloatingItem == KErrNotFound )
+ dragStartFloatingItem = dragFloatingItem;
+ if( dragStartFloatingItem != KErrNotFound )
+ {
+ TMmFloatingItem & item = GetFloatingItemAtIndex( dragStartFloatingItem );
+ TMmFloatingItem postDragRefresh( item.GetDrawnItemIndex(),
+ item.GetItemPosition(), EPostDragRefreshItem,
+ MmEffects::KNoAnimationFramesCount, iWidget->View() );
+
+ if( postDragRefresh.GetItemPosition() != aPoint )
+ {
+ iFloatingItems.Append( postDragRefresh );
+ }
+ }
+ RemoveFloatingItem( dragFloatingItem );
+ }
+ while( dragFloatingItem != KErrNotFound );
+
+ if( aDraggedItemIndex != KErrNotFound )
+ {
+ TMmFloatingItem floatingItem( aDraggedItemIndex, aPoint, EDrag,
+ MmEffects::KNoAnimationFramesCount, iWidget->View() );
+ floatingItem.SetManualDelete( ETrue );
+ AddFloatingItemL( floatingItem, 0 );
+
+ TMmFloatingItem postDragRefresh( aDraggedItemIndex,
+ iWidget->View()->ItemPos( aDraggedItemIndex ), EPostDragRefreshItem,
+ MmEffects::KNoAnimationFramesCount, iWidget->View() );
+ AddFloatingItemL( postDragRefresh );
+
+ ClearFlags( CListItemDrawer::EPressedDownState );
+ }
+
+ iAnimator->Trigger();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::IsDraggable() const
+ {
+ return iDraggable && iWidget->View();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetBgContext(
+ CAknsBasicBackgroundControlContext * aBgContext )
+ {
+ iBgContext = aBgContext;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetScrollbarVisibilityL( TBool aIsScrollbarVisible )
+ {
+ iTemplateLibrary->SetScrollbarVisibilityL( aIsScrollbarVisible );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TRect CMmListBoxItemDrawer::AdjustItemRect( TInt aItemIndex ) const
+ {
+ TSize size = iWidget->View()->ItemSize (iWidget->View()->CurrentItemIndex () );
+ TRect rect(iWidget->View()->ItemPos (iWidget->View()->CurrentItemIndex () ),
+ iWidget->View()->ItemPos (iWidget->View()->CurrentItemIndex () ) + size);
+ if( !AknLayoutUtils::PenEnabled() && iIsIndicatorItem )
+ {
+ TBool landscapeOrientation =
+ Layout_Meta_Data::IsLandscapeOrientation();
+ const TDesC8& mm_template = iMmModel->GetAttributeAsText (
+ 0, KMmTemplate8);
+ TRect relativeToParentRect = TRect( TPoint( 0, 0 ), TPoint( 0, 0 ) );
+ relativeToParentRect = iTemplateLibrary->GetMoveIndicatorRect(
+ iWidgetType, mm_template, landscapeOrientation,
+ aItemIndex == iWidget->View()->CurrentItemIndex () );
+ rect.Move( relativeToParentRect.iTl );
+ rect.iBr.iX = rect.iBr.iX + relativeToParentRect.Width();
+ rect.iBr.iY = rect.iBr.iY + relativeToParentRect.Height();
+ }
+ return rect;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DrawActualIndicatorItem( TInt aItemIndex, TRect /*actualItemRect*/ )
+ {
+ if ( iDrawMoveIndicators )
+ {
+ iIsIndicatorItem = ETrue;
+ TBool redrawItemBackground =
+ IsRedrawItemBackgroundEnabled( );
+ SetRedrawItemBackground( EFalse );
+
+ DrawActualItem( aItemIndex, AdjustItemRect( aItemIndex ) , EFalse, EFalse, EFalse, EFalse);
+
+ SetRedrawItemBackground( redrawItemBackground );
+ iIsIndicatorItem = EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::ReplaceSubCellText( const TDesC& aText )
+ {
+ delete iSubcellText;
+ iSubcellText = NULL;
+ if( aText.Compare( KNullDesC() ) )
+ {
+ iSubcellText = aText.Alloc();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AddSubcellMarqueeElementL( TTemplateChild aSubCellTemplate, TInt aIndex, TInt aItemIndex )
+ {
+ TRgb textColor;
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG10 );
+ iMarqueeAdapter->AddMarqueeElementL( aSubCellTemplate.iRectAccordingToParent, *iSubcellText,
+ aSubCellTemplate.iFontId, textColor, aSubCellTemplate.iTextAlign, aIndex,
+ aSubCellTemplate.iRectAccordingToParent.iTl.iY,
+ aItemIndex);
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetMarqueeAdapter( CMmMarqueeAdapter* aAdapter )
+ {
+ iMarqueeAdapter = aAdapter;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetMarqueeDrawing( TBool aIsMarqueeBeingDrawn )
+ {
+ iIsMarqueeBeingDrawn = aIsMarqueeBeingDrawn;
+ }
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::IsTextClippedL( TTemplateChild aTemplateChild,
+ const TDesC& aText ) const
+ {
+ TBuf< MmMarqueeConstants::KClippingBufLength > clipbuf
+ = aText.Left( MmMarqueeConstants::KTextTrimmingThreshold);
+ TInt maxClipWidth = aTemplateChild.iRectAccordingToParent.Width();
+ const CFont* font = AknLayoutUtils::FontFromId(aTemplateChild.iFontId);
+ return AknBidiTextUtils::ConvertToVisualAndClipL( clipbuf, *font,
+ aTemplateChild.iRectAccordingToParent.Width(), maxClipWidth );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetNumberOfColsInView( TInt aNumberOfColumns )
+ {
+ iNumberOfColsInWidget = aNumberOfColumns;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetupIconSubcellL(
+ RArray<TTemplateChild>& aTemplateChildArray, TInt aChildIndex, TInt aItemIndex,
+ RBuf& aItemText, TInt& aSubcellIncrement ) const
+ {
+ CGulIcon* icon = NULL;
+ TTemplateChild child = aTemplateChildArray[aChildIndex];
+ if ( !IsEditMode() &&
+ child.iImageVisualId == EImageVisualIdEditMode )
+ {
+ child.iIsImage = EFalse;
+ }
+
+ if( IsEditMode() && IsDraggable() && aItemIndex == iZoomIconIndex )
+ {
+ const TReal KNormalZoomRatio = 1.0;
+ TReal zoomDelta = ( iIconAnimationZoomRatio - KNormalZoomRatio ) / 2.0;
+ TSize size = child.iRectAccordingToParent.Size();
+ TSize sizeDelta( size.iWidth * zoomDelta, size.iHeight * zoomDelta );
+ child.iRectAccordingToParent.Grow( sizeDelta );
+ TInt targetZoom( KZoomStateZoomRatio * 100 );
+ Math::Round( zoomDelta, ( zoomDelta * 1000 ), 0);
+ if( (TInt)zoomDelta == targetZoom )
+ {
+ static_cast<CMmWidgetContainer*> (Widget()->Parent())->SetAllowMove( ETrue );
+ }
+ }
+
+ TSize targetSize = child.iRectAccordingToParent.Size();
+
+ CHnIconHolder* iconHolder = iMmModel->GetAttributeAsRefCountedGraphics(
+ aItemIndex, child.iData, &targetSize );
+ icon = iconHolder ? iconHolder->GetGulIcon() : NULL;
+ if( icon )
+ {
+ CFbsBitmap* bitmap = icon->Bitmap();
+ ASSERT( bitmap );
+ TInt errTooBig( KErrNone );
+ //resize the item if it is a move indicator
+ if( iIsIndicatorItem )
+ {
+ errTooBig = AknIconUtils::SetSize( bitmap,
+ child.iRectAccordingToParent.Size(),
+ EAspectRatioNotPreserved );
+ }
+ else
+ {
+ TSize bmpSize = bitmap->SizeInPixels();
+ TBool setSizeRequired = bitmap->DisplayMode() == ENone;
+ if ( targetSize.iWidth && targetSize.iHeight &&
+ ( setSizeRequired || !BitmapFitsIntoTarget( bmpSize, targetSize ) ) )
+ {
+ CFbsBitmap* mask = icon->Mask();
+ if( mask )
+ {
+ __ASSERT_DEBUG( bmpSize == mask->SizeInPixels(), User::Invariant() );
+ errTooBig = AknIconUtils::SetSize( mask, targetSize,
+ EAspectRatioPreservedAndUnusedSpaceRemoved );
+ }
+ if( !errTooBig )
+ errTooBig = AknIconUtils::SetSize( bitmap, targetSize,
+ EAspectRatioPreservedAndUnusedSpaceRemoved );
+ }
+ }
+
+ if( errTooBig == KErrTooBig )
+ {
+ // If icon is not created, try to create default application icon
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ CFbsBitmap* bitmap( NULL );
+ CFbsBitmap* maskBitmap( NULL );
+ TRAPD( err,
+ {
+ AknsUtils::CreateIconLC( skin,
+ KAknsIIDQgnMenuUnknownLst, bitmap, maskBitmap,
+ AknIconUtils::AvkonIconFileName(),
+ EMbmAvkonQgn_menu_unknown_lst,
+ EMbmAvkonQgn_menu_unknown_lst_mask );
+ CleanupStack::Pop( 2 ); // for trap
+ }
+ );
+ if( !err )
+ {
+ if( maskBitmap)
+ AknIconUtils::SetSize( maskBitmap, targetSize,
+ EAspectRatioPreservedAndUnusedSpaceRemoved );
+ AknIconUtils::SetSize( bitmap, targetSize,
+ EAspectRatioPreservedAndUnusedSpaceRemoved );
+ static_cast<CHnExtBmpIconHolder*>(iconHolder)->CleanBmpBuffer();
+ icon->SetBitmap(bitmap);
+ icon->SetMask(maskBitmap);
+ icon->SetBitmapsOwnedExternally(EFalse);
+ }
+ }
+
+ TInt iconIndex = iItemsDataCache->GetItemCacheL( aItemIndex )->AppendIconL( iconHolder );
+
+ HBufC8* number = HnConvUtils::NumToStr8LC( iconIndex );
+ const TInt newLength = aItemText.Length() + number->Length();
+ if( aItemText.MaxLength() < newLength )
+ {
+ aItemText.ReAllocL( newLength );
+ }
+ CleanupStack::PopAndDestroy( number );
+ aItemText.AppendNum( iconIndex );
+
+ SetupSubCellL( child, aSubcellIncrement, aItemIndex );
+
+ if( aChildIndex < aTemplateChildArray.Count() - 1 )
+ {
+ const TInt newLength = aItemText.Length() + KTab().Length();
+ if( aItemText.MaxLength() < newLength )
+ {
+ aItemText.ReAllocL( newLength );
+ }
+ aItemText.Append( KTab );
+ }
+
+ aSubcellIncrement++;
+ iLastSubcellsSetupCode.AddSubcellInfo( TMmSubcellsSetupCode::EGraphicsSubcell );
+ }
+ else
+ {
+ // Mark the fact that subcell was not set to ensure that TMmSubcellsSetupCode
+ // works properly.
+ iLastSubcellsSetupCode.AddSubcellInfo( TMmSubcellsSetupCode::ESkippedSubcell );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::BitmapFitsIntoTarget(
+ TSize aBmpSize, TSize aTargetSize ) const
+ {
+ TBool widthLessOrEqual = aBmpSize.iWidth <= aTargetSize.iWidth;
+ TBool heightLessOrEqual = aBmpSize.iHeight <= aTargetSize.iHeight;
+ TBool widthAlmostEqual = Abs( aBmpSize.iWidth - aTargetSize.iWidth ) < 2;
+ TBool heightAlmostEqual = Abs( aBmpSize.iHeight - aTargetSize.iHeight ) < 2;
+ return ( widthLessOrEqual && heightAlmostEqual ) ||
+ ( widthAlmostEqual && heightLessOrEqual );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetupTextSubcellL(
+ RArray<TTemplateChild>& aTemplateChildArray, TInt aChildIndex,
+ TInt aItemIndex, RBuf& aItemText, TInt& aSubcellIncrement ) const
+ {
+ TTemplateChild child = aTemplateChildArray[aChildIndex];
+ RBuf itemChildText;
+ CleanupClosePushL( itemChildText );
+ const TDesC8& mmTitleDes8 = iMmModel->GetAttributeAsText( aItemIndex,
+ child.iData );
+ itemChildText.Assign( HnConvUtils::Str8ToStr( mmTitleDes8 ) );
+
+ AppendText( aItemText, itemChildText );
+
+ const_cast<CMmListBoxItemDrawer*> ( this )->ReplaceSubCellText(
+ itemChildText );
+ CleanupStack::PopAndDestroy( &itemChildText );
+
+ SetupSubCellL( child, aSubcellIncrement, aItemIndex );
+
+ if( aChildIndex < aTemplateChildArray.Count() - 1 )
+ {
+ AppendText( aItemText, KTab );
+ }
+
+ aSubcellIncrement++;
+ iLastSubcellsSetupCode.AddSubcellInfo( TMmSubcellsSetupCode::ETextSubcell );
+ }
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::AppendText( RBuf& aBuffer, const TDesC& aTextToAppend ) const
+ {
+ TInt newLength = aBuffer.Length() + aTextToAppend.Length();
+ TInt error = KErrNone;
+
+ if( aBuffer.MaxLength() < newLength )
+ {
+ error = aBuffer.ReAlloc( newLength );
+ }
+ if( error == KErrNone )
+ {
+ aBuffer.Append( aTextToAppend );
+ }
+ }
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetupBackdropSubcellL(
+ RArray<TTemplateChild>& aTemplateChildArray, TInt aItemIndex,
+ RBuf& aItemText, TInt& aSubcellIncrement ) const
+ {
+ CGulIcon* icon = NULL;
+ for( TInt i = 0; i < aTemplateChildArray.Count() /*&&
+ aItemIndex != iWidget->View()->CurrentItemIndex()*/; ++i )
+ {
+ TTemplateChild child = aTemplateChildArray[i];
+ if( child.iImageVisualId == EImageVisualIdEditMode &&
+ child.iIsImage )
+ {
+ TSize itemSize = GetItemSize( aItemIndex,
+ aItemIndex == iWidget->View()->CurrentItemIndex() );
+ CHnIconHolder* iconHolder = iMmModel->GetAttributeAsRefCountedGraphics(
+ aItemIndex, child.iData, &itemSize );
+ icon = iconHolder ? iconHolder->GetGulIcon() : NULL;
+ if( icon )
+ {
+ CFbsBitmap* bitmap = icon->Bitmap();
+ child.iRectAccordingToParent = TRect( TPoint( 0, 0 ),
+ TPoint( itemSize.iWidth, itemSize.iHeight ) );
+ AknIconUtils::SetSize( bitmap, itemSize,
+ EAspectRatioNotPreserved );
+ TInt iconIndex = iItemsDataCache->GetItemCacheL( aItemIndex )->
+ AppendIconL( iconHolder );
+
+ HBufC8* number = HnConvUtils::NumToStr8LC( iconIndex );
+ TInt newLength = aItemText.Length() + number->Length();
+ if( aItemText.MaxLength() < newLength )
+ {
+ aItemText.ReAllocL( newLength );
+ }
+ CleanupStack::PopAndDestroy( number );
+ aItemText.AppendNum( iconIndex );
+
+ newLength = aItemText.Length() + KTab().Length();
+ if( aItemText.MaxLength() < newLength )
+ {
+ aItemText.ReAllocL( newLength );
+ }
+ aItemText.Append( KTab );
+ SetupSubCellL( child, aSubcellIncrement, aItemIndex );
+ aSubcellIncrement++;
+ iLastSubcellsSetupCode.AddSubcellInfo( TMmSubcellsSetupCode::EBackdropSubcell );
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetupSubCellsL( TBool aItemIsCurrent,
+ TInt aItemIndex ) const
+ {
+ CMmCacheForItem* cache = iItemsDataCache->GetItemCacheL( aItemIndex );
+ cache->MarkAsInvalid();
+
+ const TDesC8& mmTemplate = iMmModel->GetAttributeAsText( aItemIndex, KMmTemplate8 );
+ if( !mmTemplate.Compare( KNullDesC8 ) || !mmTemplate.Compare( KEmpty8 ) )
+ {
+ User::Leave( KErrNotFound );
+ }
+ cache->SetTemplateL( mmTemplate );
+
+ cache->ClearIconArray();
+ cache->SetCurrent( aItemIsCurrent );
+
+ TBool landscapeOrientation = Layout_Meta_Data::IsLandscapeOrientation();
+
+ RBuf& itemText = cache->GetItemTextForModifications();
+ itemText.Close();
+ itemText.CreateL( MmTemplateContants::KItemSubCellsText );
+
+ RArray<TTemplateChild> templateChildArray;
+ CleanupClosePushL( templateChildArray );
+ if( !iIsIndicatorItem )
+ {
+ iTemplateLibrary->GetChildrenL( iWidgetType, templateChildArray, mmTemplate,
+ landscapeOrientation, aItemIsCurrent, IsEditMode() );
+ }
+ else if ( !AknLayoutUtils::PenEnabled() )
+ {
+ iTemplateLibrary->GetMoveIndicatorChildrenL( iWidgetType, templateChildArray,
+ mmTemplate, landscapeOrientation, aItemIsCurrent );
+ }
+
+ iLastSubcellsSetupCode.Clear();
+
+ //Backdrop icon as first element to draw
+ TInt subcellIncrement( 0 );
+ if( ( GetBackdropVisibility( aItemIndex, aItemIsCurrent )
+ || ItemHasFloatingType( aItemIndex, ESwapTransition ) )
+ && !iIsSwapFloating )
+ {
+ SetupBackdropSubcellL( templateChildArray, aItemIndex, itemText, subcellIncrement );
+ iItemHasBackdrop = ETrue;
+ iIsSwapFloating = EFalse;
+ }
+ else
+ {
+ iItemHasBackdrop = EFalse;
+ }
+
+ for ( TInt i( 0 ) ; i < templateChildArray.Count() && !iLeftOverAreaUnderAnimatedItem; i++ )
+ {
+ TTemplateChild child = templateChildArray[i];
+ if ( child.iImageVisualId == EImageVisualIdEditMode && child.iIsImage )
+ {
+ continue;
+ }
+ else if( !child.iIsImage )
+ {
+ SetupTextSubcellL( templateChildArray, i, aItemIndex, itemText, subcellIncrement );
+ }
+ else
+ {
+ SetupIconSubcellL( templateChildArray, i, aItemIndex, itemText, subcellIncrement );
+ }
+ }
+ TInt subcellsJustSet = subcellIncrement;
+ iCurrentNumberOfSubcellsSet = Max( iCurrentNumberOfSubcellsSet, subcellsJustSet );
+ __ASSERT_DEBUG( iCurrentNumberOfSubcellsSet <= MmTemplateContants::KSubCellsCount,
+ User::Invariant() );
+
+ for( TInt i = subcellIncrement; i < iCurrentNumberOfSubcellsSet; i++ )
+ {
+ SetupSubNoCellL( i, aItemIndex );
+ }
+
+ iLastSubcellsSetupCode.AddTemplateInfo(
+ iItemsDataCache->GetTemplateIdentifierL( mmTemplate ) );
+ iLastSubcellsSetupCode.AddIsCurrentInfo( aItemIsCurrent );
+
+ CleanupStack::PopAndDestroy( &templateChildArray );
+
+ cache->SetSubcellsSetupCode( iLastSubcellsSetupCode );
+ // the line below is here only to make the cached information complete
+ GetItemSize( aItemIndex, aItemIsCurrent );
+ cache->MarkAsValidL();
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CMmTemplateLibrary* CMmListBoxItemDrawer::TemplateLibrary()
+ {
+ return iTemplateLibrary;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::SetHighlightShown( TBool aDrawn )
+ {
+ iHighlightShown = aDrawn;
+ iDrawMoveIndicators = aDrawn;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::IsFloating( TInt aItemIndex ) const
+ {
+ TBool isFloating( EFalse );
+
+ TInt index = GetFloatingItemIndex( EDrag );
+ if( index == KErrNotFound )
+ {
+ index = GetFloatingItemIndex( EDragTransition );
+ }
+ if( index == KErrNotFound )
+ {
+ index = GetFloatingItemIndex( EDragStart );
+ }
+
+ if( KErrNotFound != index )
+ {
+ TMmFloatingItem& current = const_cast<CMmListBoxItemDrawer*>(this)->GetFloatingItemAtIndex( index );
+ TInt drawnIndex = current.GetDrawnItemIndex();
+ if( drawnIndex == aItemIndex )
+ {
+ isFloating = ETrue;
+ }
+ }
+ return isFloating;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMmListBoxItemDrawer::DrawActualItem( TInt aItemIndex,
+ const TRect& aActualItemRect, TBool aItemIsCurrent,
+ TBool aViewIsEmphasized, TBool /*aViewIsDimmed*/,
+ TBool aItemIsSelected ) const
+ {
+ if( Properties( aItemIndex ).IsSelectionHidden() )
+ {
+ aItemIsSelected = EFalse;
+ }
+ DrawItemText( aItemIndex, aActualItemRect, aItemIsCurrent,
+ aViewIsEmphasized, aItemIsSelected );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::GetHighlightVisibility( TInt aItemIndex,
+ TBool aItemIsCurrent, TBool aAllowHighlightForNonDraggedItem ) const
+ {
+ TBool highlightVisibility( EFalse );
+ if( !iItemHasBackdrop && !iLeftOverAreaUnderAnimatedItem ) //never draw highlight when item has backdrop or when left over area under animated item
+ {
+ TBool currentlyDraggedItem =
+ ItemHasFloatingType( aItemIndex, EDrag )
+ || ItemHasFloatingType( aItemIndex, EDragTransition )
+ || ItemHasFloatingType( aItemIndex, EDragStart );
+
+ if( ( STATIC_CAST(CMmWidgetContainer*,Widget()->Parent())->IsHighlightVisible()
+ && aItemIsCurrent && aAllowHighlightForNonDraggedItem )
+ || currentlyDraggedItem )
+ {
+ highlightVisibility = ETrue;
+ }
+ }
+ return highlightVisibility;
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::GetBackdropVisibility( TInt aItemIndex,
+ TBool aItemIsCurrent ) const
+ {
+ TBool currentlyDraggedItem =
+ ItemHasFloatingType( aItemIndex, EDrag )
+ || ItemHasFloatingType( aItemIndex, EDragTransition )
+ || ItemHasFloatingType( aItemIndex, EDragStart );
+
+ return IsEditMode() /* draw the backdrop only in edit mode */
+ && !currentlyDraggedItem /* backdrop is disabled for dragged items */
+ && !iIsIndicatorItem /* in non-touch backdrop is not drawn, just "move indicators" */
+ && !iLeftOverAreaUnderAnimatedItem /* is the currently drawn item the area left over behind dragged item*/
+ && !( STATIC_CAST( CMmWidgetContainer*,Widget()->Parent() )->IsHighlightVisible()
+ && aItemIsCurrent );/*if the timer is active then we want to draw highlight (not backdrop) on the current index*/
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMmListBoxItemDrawer::ItemHasFloatingType( TInt aItemIndex,
+ TMmFloatingItemType aFloatingType ) const
+ {
+ TBool hasFloatingType( EFalse );
+ for( TInt i = iFloatingItems.Count() - 1; i >= 0; i-- )
+ {
+ const TMmFloatingItem& item = iFloatingItems[i];
+ if( item.GetFloatingItemType() == aFloatingType
+ && item.GetDrawnItemIndex() == aItemIndex )
+ {
+ hasFloatingType = ETrue;
+ break;
+ }
+ }
+ return hasFloatingType;
+ }
+// End of file