phonebookui/Phonebook/View/src/CPbkThumbnailPopupControlSlim.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/View/src/CPbkThumbnailPopupControlSlim.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,385 @@
+/*
+* Copyright (c) 2002 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: 
+*       Provides methods for Control for thumbnail popup window.
+*
+*/
+
+
+// INCLUDE FILES
+#include    "CPbkThumbnailPopupControlSlim.h"
+#include    <PbkView.rsg>
+#include    <barsread.h> // TResourceReader
+#include    <coemain.h> // CCoeEnv
+#include    <eikenv.h>  // CCoeMain
+#include    <aknappui.h>
+#include    <PbkDebug.h>
+
+#include <aknlayout.cdl.h>
+#include <applayout.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+
+
+// Unnamed namespace for local definitions
+namespace {
+
+// LOCAL CONSTANTS AND MACROS
+inline TRect RectFromCoords(const TRect& aParent, TAknWindowLineLayout& aLayout)
+    {
+    TAknLayoutRect layoutRect;
+    layoutRect.LayoutRect(aParent, aLayout);
+    return layoutRect.Rect();
+    }
+
+} // namespace
+
+// ================= MEMBER FUNCTIONS =======================
+
+CPbkThumbnailPopupControlSlim* CPbkThumbnailPopupControlSlim::NewL()
+    {
+    CPbkThumbnailPopupControlSlim* self = new (ELeave) CPbkThumbnailPopupControlSlim();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+CPbkThumbnailPopupControlSlim::~CPbkThumbnailPopupControlSlim()
+    {
+    delete iBitmap;
+    }
+
+void CPbkThumbnailPopupControlSlim::ChangeBitmap(
+    CFbsBitmap* aBitmap, 
+    CEikListBox* aListBox)
+    {
+    
+    // the is no LAF definitions for thumbnail position on landscape mode,
+    // so the position of a thumbnail bitmap is calculted from the 
+    // material available. Some of the calculations might look a 
+    // bit odd, but those seems to work. 
+    
+    // When the UI specifiers add the thumbnail coordinates to 
+    // LAF documents, and someone does the work on Avkon layout
+    // components, these can, and should be changed to more
+    // appropriate way to get right coordinates.
+
+
+    if(aBitmap != iBitmap && aBitmap != NULL )
+        {
+        delete iBitmap;
+        iBitmap = aBitmap;
+        }
+    
+    if (iBitmap && aListBox )
+        {        
+        iDrawNeeded = EFalse;
+
+        PBK_DEBUG_PRINT(PBK_DEBUG_STRING("Thumbnail size(W:%d H:%d)"), 
+                        iBitmap->SizeInPixels().iWidth, 
+                        iBitmap->SizeInPixels().iHeight);
+
+        TRect appRect = iAvkonAppUi->ApplicationRect();
+        TAknLayoutRect statusPaneRect;
+        statusPaneRect.LayoutRect(appRect, AknLayout::status_pane(appRect, 0));
+
+        TSize bitmapSize = iBitmap->SizeInPixels();
+
+        /// bitmap blit position
+        TPoint controlPoint(0,0);
+
+        iControlSize.iHeight = bitmapSize.iHeight;
+        iControlSize.iWidth = bitmapSize.iWidth;
+            
+
+        // bitmap
+        TAknWindowComponentLayout componentThumbnail = 
+            AknLayoutScalable_Apps::popup_phob_thumbnail_window_g1();
+            
+        TAknWindowLineLayout lineThumbnail = componentThumbnail.LayoutLine();
+        TAknLayoutRect aknRectThumbnail;
+        aknRectThumbnail.LayoutRect( TRect(), componentThumbnail );
+
+        // Shadow size
+               
+        TAknWindowComponentLayout componentThumbnailShadow = 
+            AknLayoutScalable_Apps::popup_phob_thumbnail_window_g2();
+        TAknWindowLineLayout lineThumbnailShadow = componentThumbnailShadow.LayoutLine();
+        TAknLayoutRect aknRectThumbnailShadow;
+        aknRectThumbnailShadow.LayoutRect( TRect(), componentThumbnailShadow );
+            
+        iShadowWidth = aknRectThumbnailShadow.Rect().iTl.iX - aknRectThumbnail.Rect().iTl.iX ;
+        if ( iShadowWidth < 0 )
+            {
+            iShadowWidth  = aknRectThumbnail.Rect().iTl.iX - aknRectThumbnailShadow.Rect().iTl.iX;
+            }
+        iShadowHeight = aknRectThumbnailShadow.Rect().iTl.iY - aknRectThumbnail.Rect().iTl.iY;
+        if ( iShadowHeight < 0 )
+            {
+            iShadowHeight  = aknRectThumbnail.Rect().iTl.iY - aknRectThumbnailShadow.Rect().iTl.iY;          
+            }
+
+        // increment shadow size
+        iControlSize.iWidth += iShadowWidth;
+        iControlSize.iHeight += iShadowHeight;
+
+        // x
+        TAknWindowComponentLayout layoutCompScrollPane = AknLayoutScalable_Avkon::scroll_pane_cp15(0);
+        TAknWindowLineLayout layoutLineScrollPane = layoutCompScrollPane.LayoutLine();
+        if ( Layout_Meta_Data::IsMirrored() )
+            {
+            TPoint tlListBox  = aListBox->View()->ViewRect().iTl; 
+            controlPoint.iX += tlListBox.iX;
+            // following "2*" is esthetic addition just to avoid unwanted
+            // error reports 
+            controlPoint.iX += 2 * layoutLineScrollPane.iW;  
+            }
+        else
+            {
+            TPoint brListBox  = aListBox->View()->ViewRect().iBr; 
+            controlPoint.iX += brListBox.iX - iControlSize.iWidth;
+            // following "2*" is esthetic addition just to avoid unwanted
+            // error reports 
+            controlPoint.iX -= 2 * layoutLineScrollPane.iW;              
+            }
+        
+        // y        
+        TAknWindowComponentLayout layoutCompAreaTopPane = AknLayoutScalable_Avkon::area_top_pane(1);
+        TAknWindowLineLayout layoutLineAreaTopPane = layoutCompAreaTopPane.LayoutLine();
+        controlPoint.iY += layoutLineAreaTopPane.iH;
+
+        TAknWindowComponentLayout layoutCompIndicatorPane = AknLayoutScalable_Avkon::indicator_pane_g1(0);
+        TAknWindowLineLayout layoutLineIndicatorPane = layoutCompIndicatorPane.LayoutLine();
+        controlPoint.iY += layoutLineIndicatorPane.iH;
+                
+        TInt itemCount = aListBox->CurrentItemIndex() - aListBox->TopItemIndex();
+        TPoint brListBox  = aListBox->View()->ViewRect().iBr; 
+        TInt maxItemCount( aListBox->View()->NumberOfItemsThatFitInRect( aListBox->View()->ViewRect() ) );
+        TInt itemHeight( aListBox->ItemHeight() );
+        TInt yMaxSize( maxItemCount * itemHeight );
+        TSize itemSize = aListBox->View()->ItemSize();
+        if ( iThumbnailDown )
+            {
+            // Add one to itemCount so that we get also the focused one counted to size
+            TInt ypos = ( itemCount + 1 ) * itemHeight;
+            if ( ( yMaxSize - ypos ) < iControlSize.iHeight )
+                {
+                iThumbnailDown = EFalse;
+                iDrawNeeded = ETrue;
+                }
+            }
+        else
+            {
+            TInt ypos = itemCount * itemHeight;
+            if ( ypos < iControlSize.iHeight )
+                {
+                iThumbnailDown = ETrue;
+                iDrawNeeded = ETrue;
+                }
+            }
+
+        if ( iThumbnailDown )        
+            {
+            controlPoint.iY += yMaxSize - iControlSize.iHeight;
+            // The bitmap gets too close to the listbox's bottom line
+            // so lets set the relative distance from edge to same
+            // on sitaution where the bitmap is located upper corner.
+            controlPoint.iY -= layoutLineIndicatorPane.iH;
+            }
+        
+        // set the control size
+        SetExtent(controlPoint, iControlSize);
+        if ( iDrawNeeded )
+            {
+            DrawNow();        
+            }
+        }
+    else // the else branch is for vCard viewer, it does not have a listbox.
+        if (iBitmap && aBitmap )
+        {
+        
+        PBK_DEBUG_PRINT(PBK_DEBUG_STRING("Thumbnail size(W:%d H:%d)"), 
+                        iBitmap->SizeInPixels().iWidth, 
+                        iBitmap->SizeInPixels().iHeight);
+
+        TRect appRect = iAvkonAppUi->ApplicationRect();
+        TAknLayoutRect mainPaneRect;
+        
+        mainPaneRect.LayoutRect(appRect, AknLayout::main_pane(appRect, 0, 1, 1));
+                
+        TSize bitmapSize = iBitmap->SizeInPixels();
+
+        /// bitmap blit position
+        TPoint controlPoint;
+
+        // bitmap
+        TAknWindowComponentLayout componentThumbnail = 
+            AknLayoutScalable_Apps::popup_phob_thumbnail_window_g1();
+            
+        // center of bitmap
+        TAknWindowComponentLayout componentThumbnailCenter = 
+            AknLayoutScalable_Apps::aid_phob_thumbnail_center_pane();
+
+        TAknWindowLineLayout lineThumbnail = componentThumbnail.LayoutLine();
+        TAknLayoutRect aknRectThumbnail;
+        aknRectThumbnail.LayoutRect( TRect(), componentThumbnail );
+        
+        TAknWindowLineLayout lineThumbnailCenter = componentThumbnailCenter.LayoutLine();
+        TAknLayoutRect aknRectThumbnailCenter;
+        aknRectThumbnailCenter.LayoutRect( TRect(), componentThumbnailCenter );
+
+        // Calculate Y position
+        const TInt imageMaxHeight( aknRectThumbnail.Rect().Height() );
+        
+        if ( bitmapSize.iHeight < aknRectThumbnail.Rect().Height() )
+            {
+            controlPoint.iY = aknRectThumbnailCenter.Rect().Height() - bitmapSize.iHeight/2;
+            if (controlPoint.iY < 0)
+                {
+                controlPoint.iY = 0;
+                }
+            iControlSize.iHeight = bitmapSize.iHeight;
+            }
+        else 
+            {
+            controlPoint.iY = 0;
+            iControlSize.iHeight = imageMaxHeight;
+            }
+                                
+        // calculate the X position of the bitmap
+        const TInt imageMaxWidth( aknRectThumbnail.Rect().Width() );        
+        controlPoint.iX = aknRectThumbnailCenter.Rect().Width() - bitmapSize.iWidth/2;
+        
+        if (controlPoint.iX <= 0)
+            {
+            controlPoint.iX = 0;
+            iControlSize.iWidth = imageMaxWidth;
+            }
+        else 
+            {
+            iControlSize.iWidth = bitmapSize.iWidth;
+            }
+        
+        // calculate the actual bitmap position according to LAF
+        TAknWindowLineLayout popupLayout = AppLayout::popup_pbook_thumbnail_window();
+        TRect popupWindowRect = RectFromCoords(mainPaneRect.Rect(), lineThumbnail);        
+        
+        TAknWindowComponentLayout layoutCompScrollPane = AknLayoutScalable_Avkon::scroll_pane_cp15(0);
+        TAknWindowLineLayout layoutLineScrollPane = layoutCompScrollPane.LayoutLine();        
+        
+        // the x-position of thumbnail is calculated referring to the scroll pane, because
+        // the LAF defines the position of thumbnail in landscape mode to wrong place
+        // ( located on the context pane's position, and the it should be in bottom right
+        // corner), so the LAF coordinates cannot be used.
+        if ( Layout_Meta_Data::IsMirrored() )
+            {                        
+            controlPoint.iX += layoutLineScrollPane.iW + ( layoutLineScrollPane.iW / 2 );                        
+            controlPoint.iY += mainPaneRect.Rect().iBr.iY;
+            controlPoint.iY -= popupWindowRect.iBr.iY;                    
+            }
+        else
+            {
+            controlPoint.iX -= layoutLineScrollPane.iW + ( layoutLineScrollPane.iW / 2 );
+            controlPoint += mainPaneRect.Rect().iBr;
+            controlPoint -= popupWindowRect.iBr;            
+            }
+        
+            
+        // Shadow size
+        TAknWindowComponentLayout componentThumbnailShadow = 
+            AknLayoutScalable_Apps::popup_phob_thumbnail_window_g2();
+        TAknWindowLineLayout lineThumbnailShadow = componentThumbnailShadow.LayoutLine();
+        TAknLayoutRect aknRectThumbnailShadow;
+        aknRectThumbnailShadow.LayoutRect( TRect(), componentThumbnailShadow );
+            
+        iShadowWidth = aknRectThumbnailShadow.Rect().iTl.iX - aknRectThumbnail.Rect().iTl.iX ;
+        if ( iShadowWidth < 0 )
+            {
+            iShadowWidth  = aknRectThumbnail.Rect().iTl.iX - aknRectThumbnailShadow.Rect().iTl.iX;
+            }
+        iShadowHeight = aknRectThumbnailShadow.Rect().iTl.iY - aknRectThumbnail.Rect().iTl.iY;
+        if ( iShadowHeight < 0 )
+            {
+            iShadowHeight  = aknRectThumbnail.Rect().iTl.iY - aknRectThumbnailShadow.Rect().iTl.iY;          
+            }
+
+        // increment shadow size
+        iControlSize.iWidth += iShadowWidth;
+        iControlSize.iHeight += iShadowHeight;
+        
+        if ( !Layout_Meta_Data::IsMirrored() )
+            {
+            controlPoint.iX -= iShadowWidth;       
+            }
+        
+        // set the control size
+        SetExtent(controlPoint, iControlSize);
+        PBK_DEBUG_PRINT(PBK_DEBUG_STRING("##shadow: %d * %d"), iShadowWidth, iShadowHeight);
+        PBK_DEBUG_PRINT(PBK_DEBUG_STRING("##Thumbnail control size %d * %d"), iControlSize.iWidth, iControlSize.iHeight);
+        DrawNow();            
+        }
+    }
+
+void CPbkThumbnailPopupControlSlim::Draw
+        (const TRect& /*aRect*/) const
+    {
+    CWindowGc& gc = SystemGc();
+
+    if (iBitmap)
+        {   
+        // draw the bitmap
+        PBK_DEBUG_PRINT(PBK_DEBUG_STRING("Thumbnail draw (Left:%d Top:%d Right:%d Bottom:%d)"), 
+                Position().iX, 
+                Position().iY, 
+                Position().iX + iBitmap->SizeInPixels().iWidth,
+                Position().iY + iBitmap->SizeInPixels().iHeight); 
+      
+        gc.BitBltMasked( TPoint(iShadowWidth, iShadowHeight), 
+                         iThumbBackg, 
+                         TRect(0,0,iThumbBackg->SizeInPixels().iWidth, iThumbBackg->SizeInPixels().iHeight ),
+                         iThumbBackgMask, 
+                         EFalse);
+        gc.BitBlt(TPoint(), iBitmap);
+        }
+    }
+
+CPbkThumbnailPopupControlSlim::CPbkThumbnailPopupControlSlim()
+    {
+    }
+
+void CPbkThumbnailPopupControlSlim::ConstructL()
+    {
+    CreateWindowL();
+    MakeVisible(EFalse);
+    SetExtent(TPoint(0,0),TSize(0,0));
+    ActivateL();
+    }
+
+void CPbkThumbnailPopupControlSlim::SetThumbnailBackg( CFbsBitmap* aThumbBackg, CFbsBitmap* aThumbBackgMask )
+    {
+    iThumbBackg = aThumbBackg;
+    iThumbBackgMask = aThumbBackgMask;
+    }
+
+void CPbkThumbnailPopupControlSlim::MakeControlVisible( TBool aVisible )
+    {
+    // make control visible
+    MakeVisible(aVisible);
+    // MakeVisible does not seem to make sure the control is redrawn
+    DrawDeferred();    
+    }
+
+//  End of File