diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/View/src/CPbkThumbnailPopupControlSlim.cpp --- /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 +#include // TResourceReader +#include // CCoeEnv +#include // CCoeMain +#include +#include + +#include +#include +#include +#include +#include + + +// 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