menufw/menufwui/mmwidgets/src/mmlistboxitemdrawer.cpp
branchRCL_3
changeset 50 137ebc85284b
parent 47 7be2816dbabd
child 54 1b758917cafc
--- a/menufw/menufwui/mmwidgets/src/mmlistboxitemdrawer.cpp	Tue May 11 16:02:39 2010 +0300
+++ b/menufw/menufwui/mmwidgets/src/mmlistboxitemdrawer.cpp	Tue May 25 12:29:32 2010 +0300
@@ -29,6 +29,7 @@
 #include <AknBidiTextUtils.h>
 #include <AknDef.hrh>
 #include <AknLayoutFont.h>
+#include <avkon.mbg>
 
 #ifdef RD_UI_TRANSITION_EFFECTS_LIST
 #include <aknlistloadertfx.h>
@@ -53,6 +54,7 @@
 #include "mmwidgetcontainer.h"
 #include "hnsuitemodel.h"
 #include "menudebug.h"
+#include "hnextbmpiconholder.h"
 
 // -----------------------------------------------------------------------------
 //
@@ -77,6 +79,7 @@
   // this is needed to get iColors initialized on first use:
   iLastDrawnItemWasFloating = ETrue;
     SetFlags( CListItemDrawer::EDisableHighlight );
+    iIsSwapFloating = EFalse;
     }
 
 // -----------------------------------------------------------------------------
@@ -314,13 +317,13 @@
                 iZoomIconIndex = iFloatingItems[i].GetDrawnItemIndex();
                 iIconAnimationZoomRatio = iFloatingItems[i].GetCurrentZoomRatio();
 
-        if ( ItemHasFloatingType( drawnItemIndex, EDrag) ||
-            ItemHasFloatingType( drawnItemIndex, EDragTransition) )
+                if ( ItemHasFloatingType( drawnItemIndex, EDrag) ||
+                        ItemHasFloatingType( drawnItemIndex, EDragTransition) )
                     {
                     ClearFlags( CListItemDrawer::EPressedDownState );
                     }
-
-        DrawActualItem( drawnItemIndex, rect, ETrue, EFalse, EFalse, EFalse );
+                type == ESwapTransition ? iIsSwapFloating = ETrue : iIsSwapFloating = EFalse;
+                DrawActualItem( drawnItemIndex, rect, ETrue, EFalse, EFalse, EFalse );
                 iIconAnimationZoomRatio = tempZoomRatio;
                 iZoomIconIndex = tempZoomIconIndex;
                 }
@@ -399,6 +402,7 @@
             }
         }
 
+    iIsSwapFloating = EFalse;
     DrawActualItem(aItemIndex, actualItemRect, aItemIsCurrent, aViewIsEmphasized,
             aViewIsDimmed, aItemIsSelected);
     const_cast<CMmListBoxItemDrawer*>(this)->iLeftOverAreaUnderAnimatedItem = EFalse;
@@ -505,7 +509,7 @@
         }
 #endif
 
-  if( iDrawSeparatorLines )
+  if( iDrawSeparatorLines && !iIsSwapFloating )
         {
         CMmListBoxView* view = static_cast<CMmListBoxView*>( iWidget->View() );
         if( aItemIndex != ( view->ModelItemsCount() - 1  ))
@@ -1183,30 +1187,65 @@
         {
         CFbsBitmap* bitmap = icon->Bitmap();
         ASSERT( bitmap );
+        TInt errTooBig( KErrNone );
         //resize the item if it is a move indicator
         if( iIsIndicatorItem )
             {
-                AknIconUtils::SetSize( bitmap, child.iRectAccordingToParent.Size(),
+            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 ) ) )
-                    {
+            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() );
-                        AknIconUtils::SetSize( mask, targetSize, EAspectRatioPreservedAndUnusedSpaceRemoved );
-                        }
-                    AknIconUtils::SetSize( bitmap, targetSize, EAspectRatioPreservedAndUnusedSpaceRemoved );
+                    __ASSERT_DEBUG( bmpSize == mask->SizeInPixels(), User::Invariant() );
+                    errTooBig = AknIconUtils::SetSize( mask, targetSize,
+                            EAspectRatioPreservedAndUnusedSpaceRemoved );
+                    }
+                if( !errTooBig )
+                    errTooBig = AknIconUtils::SetSize( bitmap, targetSize,
+                        EAspectRatioPreservedAndUnusedSpaceRemoved );
                 }
             }
 
-            TInt iconIndex = iItemsDataCache->GetItemCacheL( aItemIndex )->AppendIconL( iconHolder );
+        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();
@@ -1322,7 +1361,8 @@
             {
             TSize itemSize = GetItemSize( aItemIndex,
                 aItemIndex == iWidget->View()->CurrentItemIndex() );
-            CHnIconHolder* iconHolder = iMmModel->GetAttributeAsRefCountedGraphics( aItemIndex, child.iData, &itemSize );
+            CHnIconHolder* iconHolder = iMmModel->GetAttributeAsRefCountedGraphics(
+                    aItemIndex, child.iData, &itemSize );
             icon = iconHolder ? iconHolder->GetGulIcon() : NULL;
             if( icon )
                 {
@@ -1331,7 +1371,8 @@
                         TPoint( itemSize.iWidth, itemSize.iHeight ) );
                 AknIconUtils::SetSize( bitmap, itemSize,
                         EAspectRatioNotPreserved );
-        TInt iconIndex = iItemsDataCache->GetItemCacheL( aItemIndex )->AppendIconL( iconHolder );
+                TInt iconIndex = iItemsDataCache->GetItemCacheL( aItemIndex )->
+                        AppendIconL( iconHolder );
 
                 HBufC8* number = HnConvUtils::NumToStr8LC( iconIndex );
                 TInt newLength = aItemText.Length() + number->Length();
@@ -1399,10 +1440,13 @@
 
     //Backdrop icon as first element to draw
     TInt subcellIncrement( 0 );
-    if( GetBackdropVisibility( aItemIndex, aItemIsCurrent ) )
+    if( ( GetBackdropVisibility( aItemIndex, aItemIsCurrent )
+                || ItemHasFloatingType( aItemIndex, ESwapTransition ) )
+            && !iIsSwapFloating )
         {
         SetupBackdropSubcellL( templateChildArray, aItemIndex, itemText, subcellIncrement );
         iItemHasBackdrop = ETrue;
+        iIsSwapFloating = EFalse;
         }
     else
         {
@@ -1519,9 +1563,9 @@
     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 );
+        TBool currentlyDraggedItem =
+                ItemHasFloatingType( aItemIndex, EDrag ) ||
+                ItemHasFloatingType( aItemIndex, EDragTransition );
 
         if( ( STATIC_CAST(CMmWidgetContainer*,Widget()->Parent())->IsHighlightVisible()
                 && aItemIsCurrent && aAllowHighlightForNonDraggedItem )
@@ -1540,7 +1584,7 @@
 TBool CMmListBoxItemDrawer::GetBackdropVisibility( TInt aItemIndex,
         TBool aItemIsCurrent ) const
     {
-  TBool currentlyDraggedItem =
+    TBool currentlyDraggedItem =
     ItemHasFloatingType( aItemIndex, EDrag ) ||
     ItemHasFloatingType( aItemIndex, EDragTransition );