--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/aknpopuplayout.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,962 @@
+/*
+* 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:
+*
+*/
+
+
+#include <aknpopuplayout.h>
+#include <e32def.h>
+#include <eiklbx.h>
+#include <aknPopupHeadingPane.h>
+#include <AknPanic.h>
+#include <AknLayout.lag>
+#include <aknenv.h>
+
+#include <AknUtils.h>
+#include <eiksfont.h>
+#include <avkon.rsg>
+#include <AknsDrawUtils.h>
+#include <AknsControlContext.h>
+#include <eikfrlbd.h>
+#include <AknsBasicBackgroundControlContext.h>
+#include <aknmessagequerycontrol.h>
+#include <aknsfld.h>
+
+#include <skinlayout.cdl.h>
+
+#include <AknLayout2ScalableDef.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <aknlayoutscalable_apps.cdl.h>
+
+#include <touchfeedback.h>
+#include <aknlists.h>
+
+
+static CCoeControl *FindControl(TAknPopupLayoutsNode *aNode, TInt aId)
+ {
+ while(aNode)
+ {
+ if (aId == aNode->iId)
+ {
+ return aNode->iControl;
+ }
+ aNode = aNode -> iNext;
+ }
+ return NULL;
+ }
+
+static TInt GetMaxListHeight()
+ {
+ TAknLayoutRect temp, layout;
+
+ TRect mainPane;
+ TRect statusPane;
+ TRect controlPane;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EPopupParent, mainPane );
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, statusPane );
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EControlPane, controlPane );
+
+ // in landscape orientation popuplist can't go on top of statuspane
+ if ( !Layout_Meta_Data::IsLandscapeOrientation() )
+ {
+ mainPane.iTl.iY -= statusPane.Height();
+ }
+
+ // treat mainpane+statuspane area as popup window
+ // too bad we can't use this, because e.g. QVGA landscape has border-size 7
+ // in avkon layout and border-size 9 in skin drawing...
+ /*temp.LayoutRect( mainPane, AknLayoutScalable_Avkon::listscroll_menu_pane(0));
+ layout.LayoutRect( temp.Rect(), AknLayoutScalable_Avkon::list_menu_pane(0));
+ return layout.Rect().Height();*/
+
+ // shadow
+ TInt varietyIndex = Layout_Meta_Data::IsLandscapeOrientation();
+
+ TAknLayoutRect insideArea;
+ insideArea.LayoutRect(
+ mainPane,
+ AknLayoutScalable_Avkon::bg_popup_window_pane_g1(varietyIndex) );
+
+ return insideArea.Rect().Height();
+ }
+
+
+EXPORT_C
+void AknPopupLayouts::HandleSizeChanged( TAknPopupWindowLayoutDef &aDef,
+ TAknPopupLayouts aLayout_1,
+ CAknPopupHeadingPane *aHeading,
+ CEikListBox *aListBox,
+ CCoeControl *aWindowOwningControl )
+ {
+ TAknPopupLayoutsNode list = { 0, EListNode, aListBox };
+ TAknPopupLayoutsNode heading = { &list, EHeadingNode, aHeading };
+ TAknPopupLayoutsNode windowOwning = { &heading, EWindowOwningNode, aWindowOwningControl };
+ HandleSizeChanged(aDef, aLayout_1, &windowOwning);
+ }
+
+
+EXPORT_C
+void AknPopupLayouts::HandleSizeChanged( TAknPopupWindowLayoutDef &aDef,
+ TAknPopupLayouts aLayout_1,
+ TAknPopupLayoutsNode *aNode)
+ {
+ CAknPopupHeadingPane *aHeading = (CAknPopupHeadingPane*)FindControl(aNode, EHeadingNode);
+ CEikListBox *aListBox = (CEikListBox*)FindControl(aNode, EListNode);
+ CCoeControl *aWindowOwningControl = FindControl(aNode, EWindowOwningNode);
+ CAknMessageQueryControl *aMsgQueryCtrl = (CAknMessageQueryControl*)FindControl(aNode, EMessageBoxNode);
+
+ TInt aLayout = aLayout_1;
+ TInt numofitems = aListBox->Model()->NumberOfItems();
+
+ aListBox->View()->ItemDrawer()->SetSkinEnabledL(ETrue);
+
+ TInt maxListHeight = GetMaxListHeight();
+
+ // position popup window's bottom correctly
+ TRect clientRect;
+ AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EPopupParent, clientRect);
+ // set windowrect to minimum size - this will be adjusted later
+ TAknLayoutRect windowRect;
+ windowRect.LayoutRect( clientRect, AknLayoutScalable_Avkon::popup_menu_window(8));
+ aDef.iWindowRect = windowRect.Rect();
+ TRAP_IGNORE( aListBox->View()->ItemDrawer()->SetSkinEnabledL(ETrue) );
+
+ // Popup window when the size does not change based on
+ // the number of items.
+ TBool fixedWindowSize = EFalse;
+ if ( (aLayout & EAknPopupLayoutsDynamic) || numofitems == 0 ||
+ (aLayout & EAknPopupLayoutsFind) )
+ {
+ aLayout &= ~EAknPopupLayoutsDynamic;
+ fixedWindowSize = ETrue;
+ }
+
+ // heading =============================================================
+ TInt spaceForHeading = 0;
+ if (aHeading)
+ {
+ aHeading->SetLayout( CAknPopupHeadingPane::EListHeadingPane );
+ TAknLayoutRect tempHeadingRect;
+ tempHeadingRect.LayoutRect(clientRect,
+ AknLayoutScalable_Avkon::heading_pane(0));
+ spaceForHeading = tempHeadingRect.Rect().Height();
+ maxListHeight -= spaceForHeading;
+ }
+ aDef.iPopupMenuWindowOffset=TPoint(0,spaceForHeading);
+
+
+ // findbox =============================================================
+ TBool windowSizeFind = EFalse;
+ TInt spaceForFind = 0;
+ if (aLayout & EAknPopupLayoutsFind)
+ {
+ aLayout &= ~EAknPopupLayoutsFind;
+ windowSizeFind = ETrue;
+ // calculate space needed for find
+ TAknLayoutRect tempFindRect;
+ tempFindRect.LayoutRect(clientRect,AknLayoutScalable_Avkon::find_popup_pane_cp2(0));
+ spaceForFind = tempFindRect.Rect().Height();
+ maxListHeight -= spaceForFind;
+ }
+
+ // messagebox ==========================================================
+ TRect messageRect;
+ TInt messageNumOfLines = 0;
+ TBool messageBox = EFalse;
+ if (aMsgQueryCtrl && aMsgQueryCtrl->Lines() > 0)
+ {
+ messageBox = ETrue;
+ messageNumOfLines = aMsgQueryCtrl->Lines();
+ TInt varietyIndex = 0;
+ switch(messageNumOfLines)
+ {
+ case (0):
+ case (1): varietyIndex = 0;
+ break;
+ case (2): varietyIndex = 1;
+ break;
+ default : varietyIndex = 2;
+ }
+ TAknWindowLineLayout lay = AknLayoutScalable_Apps::loc_type_pane(varietyIndex).LayoutLine();
+ TAknLayoutRect layout;
+ layout.LayoutRect( TRect(0,0,0,0), lay );
+ messageRect = layout.Rect();
+ maxListHeight -= messageRect.Height();
+ }
+
+ TInt minItems = 1;
+
+ TRect scrollBarRect(0,0,0,0);
+
+ TAknWindowLineLayout listLayout;
+ TAknLayoutScalableParameterLimits listLimits;
+
+ switch(aLayout)
+ {
+ case EPopupSNotePopupWindow:
+ case EMenuUnknownColumnWindow:
+ case EMenuUnknownFormattedCellWindow:
+ case EMenuWindow:
+ {
+ minItems = aHeading ? 5 : 6;
+ listLayout = AknLayoutScalable_Avkon::list_single_pane_cp2(0);
+ listLimits = AknLayoutScalable_Avkon::list_single_pane_cp2_ParamLimits();
+ break;
+ }
+ case EMenuGraphicWindow:
+ {
+ minItems = 5;
+ listLayout = AknLayoutScalable_Avkon::list_single_graphic_pane_cp2(0);
+ listLimits = AknLayoutScalable_Avkon::list_single_graphic_pane_cp2_ParamLimits();
+ break;
+ }
+ case EMenuGraphicHeadingWindow:
+ {
+ minItems = 5;
+ listLayout = AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2(0);
+ listLimits = AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2_ParamLimits();
+ break;
+ }
+ case EMenuDoubleWindow:
+ {
+ minItems = 3;
+ listLayout = AknLayoutScalable_Avkon::list_double_pane_cp2(0);
+ listLimits = AknLayoutScalable_Avkon::list_double_pane_cp2_ParamLimits();
+ break;
+ }
+ case EMenuDoubleLargeGraphicWindow:
+ {
+ minItems = 3;
+ listLayout = AknLayoutScalable_Avkon::list_double_large_graphic_pane_cp2(0);
+ listLimits = AknLayoutScalable_Avkon::list_double_large_graphic_pane_cp2_ParamLimits();
+ break;
+ }
+ }
+
+ if (!fixedWindowSize)
+ {
+ minItems = 1;
+ }
+
+ TInt maxLayoutItems = listLimits.LastRow() + 1; // last row is a zero based index, we need num items which is 1 based
+
+ //aDef.iVertLineExt1.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
+ //aDef.iVertLineExt2.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
+
+ TAknLayoutRect listItemRect;
+ listItemRect.LayoutRect( aDef.iWindowRect, listLayout);
+ TInt listItemHeight = listItemRect.Rect().Height();
+ TInt maxItems = maxListHeight / listItemHeight;
+ // minItems == 1 only if the popuplist is dynamically changeable
+ if ( (numofitems > 1) && (minItems == 1) )
+ {
+ minItems = numofitems;
+ }
+ if (minItems > maxItems)
+ {
+ minItems = maxItems;
+ }
+ // maxItems might be greater than max items from layout -> use layout's maximum
+ if (minItems > maxLayoutItems)
+ {
+ minItems = maxLayoutItems;
+ }
+
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+
+ TAknLayoutRect temp, layout;
+ TRect screenRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect );
+ TAknWindowLineLayout lineLayout = AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine();
+
+ // Layout data of listscroll_menu_pane are changed for CR 417-35260.
+ // The change is just for QHD landscape model.
+ // The CR makes listscroll_menu_pane's ir or il bigger than normal,
+ // so that width of list item is smaller than needs. Then, first cell
+ // of list item can not be drawn on proper position.
+ // Adjustment of layout is a solution for this problem. This is not a perfect idea, but
+ // creating a new layout for popuplist is too complex to do that. Adjustment is a must.
+ if(Layout_Meta_Data::IsLandscapeOrientation())
+ {
+ TInt offset = AknListBoxLayouts::AdjustPopupLayoutData( screenRect );
+ if (!AknLayoutUtils::LayoutMirrored())
+ {
+ lineLayout.ir -= offset;
+ }
+ else
+ {
+ lineLayout.il -= offset;
+ }
+ }
+ temp.LayoutRect( window_rect, lineLayout);
+
+ layout.LayoutRect( temp.Rect(), AknLayoutScalable_Avkon::list_menu_pane(0));
+ TRect tempListRect = layout.Rect(); // this is list's rect for the whole window
+
+ // subtract heading, findbox and messagebox from tempListRect
+ tempListRect.iBr.iY -= spaceForFind;
+ tempListRect.iTl.iY += spaceForHeading;
+ tempListRect.iTl.iY += messageRect.Height();
+
+ // We really don't want parent relative list layout here because findbox will be overwritten.
+ // Just calculate list height and use that.
+ TRect nullRect(0,0,0,0);
+ listLayout.iH = (TInt16)(minItems * listItemHeight);
+ listLayout.ib = ELayoutEmpty;
+
+ aDef.iListRect.LayoutRect(tempListRect,
+ listLayout);
+
+ // we have to scale iWindowRect to list rect - layout is not (yet) correct
+ TInt usedHeight = aDef.iListRect.Rect().Height()
+ + spaceForFind
+ + spaceForHeading
+ + messageRect.Height();
+
+ // popupwindow's inside area
+ TInt varietyIndex = Layout_Meta_Data::IsLandscapeOrientation();
+
+ TAknLayoutRect insideArea;
+ insideArea.LayoutRect(
+ window_rect,
+ AknLayoutScalable_Avkon::bg_popup_window_pane_g1(varietyIndex) );
+
+ if (layout.Rect().Height() < usedHeight)
+ {
+ aDef.iWindowRect.iTl.iY -= (usedHeight - layout.Rect().Height());
+ }
+
+ AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation();
+
+ // In landscape we have to center (on y-axis) popup window (but not with bottom CBA)
+ if (varietyIndex == 1 && cbaLocation != AknLayoutUtils::EAknCbaLocationBottom)
+ {
+ TRect mainPane;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EPopupParent, mainPane );
+ TInt diff = (mainPane.Height()-aDef.iWindowRect.Height()) / 2;
+ aDef.iWindowRect.iTl.iY -= diff;
+ aDef.iWindowRect.iBr.iY -= diff;
+
+ // with right CBA, move window to the right side of the screen
+ if (cbaLocation == AknLayoutUtils::EAknCbaLocationRight)
+ {
+ TInt offset = mainPane.Width()-aDef.iWindowRect.iBr.iX;
+ aDef.iWindowRect.iTl.iX += offset;
+ aDef.iWindowRect.iBr.iX += offset;
+ }
+
+ //should this be uncommented??
+ // If we have left CBA, we move window to left side of screen (on x-axis).
+ /*else if (cbaLocation == AknLayoutUtils::EAknCbaLocationLeft)
+ {
+ TInt xOffset = aDef.iWindowRect.iTl.iX;
+ if ( xOffset > 0 )
+ {
+ aDef.iWindowRect.iTl.iX = 0;
+ aDef.iWindowRect.iBr.iX -= xOffset;
+ }
+ }*/
+ }
+
+ TRect screen;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screen );
+
+ TAknLayoutRect cbaRect;
+ cbaRect.LayoutRect( screen,
+ AknLayoutScalable_Avkon::popup_sk_window( 0 ).LayoutLine() );
+
+ if ( AknLayoutUtils::PenEnabled() )
+ {
+ TSize size( aDef.iWindowRect.Size() );
+ // add softkey height
+ size.iHeight += cbaRect.Rect().Height();
+
+ // Reduce listbox's and popup's height if total height is more than
+ // screen height.
+ if ( size.iHeight > screen.Height() )
+ {
+ listLayout.iH -= ( size.iHeight - screen.Height() );
+ aDef.iListRect.LayoutRect( tempListRect, listLayout );
+
+ size.iHeight = screen.Height();
+ }
+
+ aDef.iWindowRect.SetRect( AknPopupUtils::Position( size, ETrue ), size );
+ }
+
+ // now we finally know the window rect: first setup heading
+ if (aHeading)
+ {
+ aDef.iHeadingRect.LayoutRect(AknPopupLayouts::MenuRect(aDef),
+ AknLayoutScalable_Avkon::heading_pane(0));
+ }
+
+ MenuPopupWindowGraphics(aDef);
+ aWindowOwningControl->SetRect(WindowRect(aDef));
+ HandleSizeAndPositionOfComponents(aDef, aListBox, aHeading);
+
+ layout.LayoutRect(MenuRect(aDef), lineLayout);
+ TRect scrollBarClientRect(layout.Rect());
+
+ if ( AknLayoutUtils::PenEnabled() )
+ {
+ // remove softkey height that was added earlier so that
+ // scroll bar doesn't get behind the softkey
+ scrollBarClientRect.iBr.iY -= cbaRect.Rect().Height();
+ }
+
+ if (aHeading)
+ {
+ scrollBarClientRect.iTl.iY += spaceForHeading;
+ }
+
+ if (windowSizeFind)
+ {
+ scrollBarClientRect.iBr.iY -= spaceForFind;
+ }
+
+ if (messageBox)
+ {
+ scrollBarClientRect.iTl.iY += messageRect.Height();
+ }
+ varietyIndex = 0;
+ AknLayoutUtils::LayoutVerticalScrollBar(
+ aListBox->ScrollBarFrame(),
+ scrollBarClientRect,
+ AknLayoutScalable_Avkon::scroll_pane_cp25(varietyIndex).LayoutLine() ) ;
+
+ if (messageBox)
+ {
+ TAknLayoutRect msgQuery;
+
+ TInt varietyIndex = 0;
+ switch(messageNumOfLines)
+ {
+ case (0):
+ case (1): varietyIndex = 0;
+ break;
+ case (2): varietyIndex = 1;
+ break;
+ default : varietyIndex = 2;
+ }
+ msgQuery.LayoutRect( AknPopupLayouts::MenuRect(aDef),
+ AknLayoutScalable_Apps::loc_type_pane(varietyIndex).LayoutLine() );
+ aMsgQueryCtrl->SetRect(msgQuery.Rect());
+ }
+
+ window_rect = WindowRect(aDef);
+ MAknsControlContext *cc = AknsDrawUtils::ControlContext( aListBox );
+ TBool defaultContext = EFalse;
+ if (!cc)
+ {
+ cc = aListBox->View()->ItemDrawer()->SkinBackgroundControlContext();
+ defaultContext = ETrue;
+ }
+ if (cc)
+ {
+ CAknsBasicBackgroundControlContext *bcc = (CAknsBasicBackgroundControlContext*)cc;
+ TAknLayoutRect popupBgRect;
+ popupBgRect.LayoutRect(window_rect,
+ SkinLayout::Popup_windows_skin_placing__background_slice__Line_1(window_rect));
+ bcc->SetBitmap(KAknsIIDQsnFrPopupCenter);
+ if (defaultContext) bcc->SetRect(popupBgRect.Rect());
+ bcc->SetParentPos(aWindowOwningControl->PositionRelativeToScreen());
+ if (defaultContext)
+ bcc->SetParentPos(TPoint(0,0));
+ }
+// handled in CFormattedCellListBoxDataExtension, since listbox does not always cover whole
+// window rect (listquery/popup list), especially when items are added after construction
+/*
+ // note, that cleanup is done in ~CFormattedCellListBoxData()
+ // or ( shudder ) in ~CColumnListBoxData()
+ MTouchFeedback* feedback = MTouchFeedback::Instance();
+ if( feedback )
+ {
+ feedback->SetFeedbackArea( aListBox, 0, aListBox->Rect(),
+ ETouchFeedbackBasic, ETouchEventStylusDown );
+ }
+*/
+}
+
+EXPORT_C void AknPopupLayouts::HandleSizeAndPositionOfComponents(const TAknPopupWindowLayoutDef &aDef,
+ CCoeControl *aContent,
+ CAknPopupHeadingPane *aHeading)
+ {
+ __ASSERT_DEBUG(aContent->MinimumSize() == aDef.iListRect.Rect().Size(), RDebug::Print(_L("AknPopupLayouts:ERROR, control minimumsize and LAF spec does not match!")));
+ TRect lbrect = aDef.iListRect.Rect();
+ TRect headrect;
+
+ aContent->SetRect(lbrect);
+ if (aHeading)
+ {
+ headrect = aDef.iHeadingRect.Rect();
+ aHeading->SetRect(headrect);
+ }
+ }
+
+EXPORT_C void AknPopupLayouts::CheckRange(TInt &aValue, TInt aMin, TInt aMax)
+ {
+ if (aValue > aMax) aValue = aMax;
+ if (aValue < aMin) aValue = aMin;
+ }
+
+// Disable "unreferenced formal parameter" for when aEikEnv is not used in the AKN_LAF_COLOR_ENV macro.
+#pragma warning(disable : 4100)
+EXPORT_C void AknPopupLayouts::HandleDraw(CEikonEnv* /*aEikEnv*/,
+ CWindowGc &aGc,
+ const TAknPopupWindowLayoutDef &aDef,
+ CEikListBox* aListBox,
+ CAknPopupHeadingPane* aHeading)
+ {
+ TRect windowRect = MenuRect(const_cast<TAknPopupWindowLayoutDef&>(aDef));
+ MAknsSkinInstance *skin = AknsUtils::SkinInstance();
+ MAknsControlContext *cc = AknsDrawUtils::ControlContext( aListBox );
+ TBool windowFrameDrawn = EFalse;
+ if (!cc) cc = aListBox->View()->ItemDrawer()->SkinBackgroundControlContext();
+
+ TRegionFix<5> dontDrawRegion;
+ TRegionFix<22> drawRegion;
+ if ( aListBox )
+ {
+ dontDrawRegion.AddRect( aListBox->Rect() );
+
+ // If there are scroll bars and they draw their own background, take
+ // them out of clipping region
+ CEikScrollBarFrame* scrollBarFrame = aListBox->ScrollBarFrame();
+ if (scrollBarFrame)
+ {
+ CEikScrollBar* hBar = scrollBarFrame->GetScrollBarHandle(
+ CEikScrollBar::EHorizontal);
+ CEikScrollBar* vBar = scrollBarFrame->GetScrollBarHandle(
+ CEikScrollBar::EVertical);
+ TBool drawHorizontal = ETrue;
+ TBool drawVertical = ETrue;
+ scrollBarFrame->DrawBackgroundState(drawHorizontal, drawVertical);
+ drawHorizontal = drawHorizontal && hBar && hBar->IsVisible();
+ drawVertical = drawVertical && vBar && vBar->IsVisible();
+ if (drawHorizontal)
+ {
+ TRect scrollBarRect(hBar->Rect());
+ if (hBar->OwnsWindow())
+ {
+ TPoint windowPos = aDef.iWindowRect.iTl;
+ TPoint scrollBarPos = hBar->PositionRelativeToScreen();
+ scrollBarRect.Move(scrollBarPos - windowPos);
+ }
+ dontDrawRegion.AddRect(scrollBarRect);
+ }
+ if (drawVertical)
+ {
+ TRect scrollBarRect(vBar->Rect());
+ if (vBar->OwnsWindow())
+ {
+ TPoint windowPos = aDef.iWindowRect.iTl;
+ TPoint scrollBarPos = vBar->PositionRelativeToScreen();
+ scrollBarRect.Move(scrollBarPos - windowPos);
+ }
+ dontDrawRegion.AddRect(scrollBarRect);
+ }
+ }
+ }
+ if ( aHeading )
+ {
+ dontDrawRegion.AddRect( aHeading->Rect() );
+ }
+ drawRegion.AddRect( windowRect );
+ drawRegion.SubRegion( dontDrawRegion );
+ if (cc)
+ {
+ const TAknsItemID *popupBgId = &KAknsIIDQsnBgPopupBackground;
+ TAknLayoutRect popupBgRect;
+ popupBgRect.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_1(windowRect));
+ AknsDrawUtils::DrawCachedImage(skin, aGc, popupBgRect.Rect(), *popupBgId);
+
+ const TAknsItemID *sliceId = &KAknsIIDQsnBgSlicePopup;
+ TAknLayoutRect sliceRect;
+ sliceRect.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_2());
+ AknsDrawUtils::DrawCachedImage(skin, aGc, sliceRect.Rect(), *sliceId);
+
+ TAknLayoutRect topLeft;
+ topLeft.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_2());
+
+ TAknLayoutRect bottomRight;
+ bottomRight.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_5());
+
+ TRect outerRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr);
+ TRect innerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl);
+ aGc.SetPenStyle(CGraphicsContext::ENullPen);
+ const TAknsItemID *frameId = &KAknsIIDQsnFrPopup;
+ const TAknsItemID *frameCenterId = &KAknsIIDQsnFrPopupCenter;
+ aGc.SetClippingRegion( drawRegion );
+ windowFrameDrawn = AknsDrawUtils::DrawFrame(skin, aGc, outerRect, innerRect, *frameId, *frameCenterId);
+ aGc.CancelClippingRegion();
+ }
+ if (!windowFrameDrawn)
+ {
+ AknDraw::DrawWindowShadow(aGc, aDef.iCover, aDef.iSecond, aDef.iFirst, aDef.iOutline, aDef.iInside);
+ }
+ }
+#pragma warning(default : 4100)
+
+
+EXPORT_C TRect AknPopupLayouts::MenuRect(TAknPopupWindowLayoutDef &aDef)
+ {
+ return TRect(TPoint(0,0), aDef.iWindowRect.Size());
+ }
+
+
+EXPORT_C void AknPopupLayouts::MenuPopupWindowGraphics(TAknPopupWindowLayoutDef &aDef)
+ {
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+ TAknWindowLineLayout s0 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_1(window_rect);
+ TAknWindowLineLayout s1 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_2(window_rect);
+ TAknWindowLineLayout s2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_3(window_rect);
+ TAknWindowLineLayout s3 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_4(window_rect);
+ TAknWindowLineLayout s4 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_5(window_rect);
+
+ aDef.iCover.LayoutRect( window_rect, s0);
+ aDef.iSecond.LayoutRect( window_rect, s1);
+ aDef.iFirst.LayoutRect( window_rect, s2);
+ aDef.iOutline.LayoutRect(window_rect, s3);
+ aDef.iInside.LayoutRect( window_rect, s4);
+}
+
+EXPORT_C void AknPopupLayouts::SetupMenuPopupWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
+ {
+ SetupDefaults(aDef);
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+ TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_pane(heading?1:0, num-1);
+ // We really don't want parent relative list layout here because findbox will be overwritten.
+ // Just calculate list height and use that.
+ TRect nullRect(0,0,0,0);
+ TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_single_number_heading_pane_cp2(0));
+ listLayout.iH = (TInt16)(num * listItemRect.Height());
+ listLayout.ib = ELayoutEmpty;
+
+ aDef.iListRect.LayoutRect(window_rect, listLayout);
+
+ //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_pane(heading?1:0, num-1));
+
+ TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
+ TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_Line_2;
+
+ // Combine two layouts togeher.
+ if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
+ if (part2.il != ELayoutEmpty) part1.il = part2.il;
+ if (part2.it != ELayoutEmpty) part1.it = part2.it;
+ if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
+ if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
+ if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
+ if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
+
+ aDef.iHeadingRect.LayoutRect(window_rect, part1);
+
+ //MenuPopupWindowGraphics(aDef);
+ }
+
+EXPORT_C void AknPopupLayouts::SetupPopupMenuGraphicWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
+ {
+ SetupDefaults(aDef);
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+ TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_graphic_pane(heading?1:0, num-1);
+ // We really don't want parent relative list layout here because findbox will be overwritten.
+ // Just calculate list height and use that.
+ TRect nullRect(0,0,0,0);
+ TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2(0));
+ listLayout.iH = (TInt16)(num * listItemRect.Height());
+ listLayout.ib = ELayoutEmpty;
+
+ aDef.iListRect.LayoutRect(window_rect, listLayout);
+
+ //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_graphic_pane(heading?1:0, num-1));
+ TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
+ TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_Line_2;
+
+ // Combine two layouts togeher.
+ if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
+ if (part2.il != ELayoutEmpty) part1.il = part2.il;
+ if (part2.it != ELayoutEmpty) part1.it = part2.it;
+ if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
+ if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
+ if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
+ if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
+
+ aDef.iHeadingRect.LayoutRect(window_rect, part1);
+
+ //MenuPopupWindowGraphics(aDef);
+ }
+
+EXPORT_C void AknPopupLayouts::SetupPopupMenuGraphicHeadingWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
+ {
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+ TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_graphic_heading_pane(heading?1:0, num-1);
+ // We really don't want parent relative list layout here because findbox will be overwritten.
+ // Just calculate list height and use that.
+ TRect nullRect(0,0,0,0);
+ TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2(0));
+ listLayout.iH = (TInt16)(num * listItemRect.Height());
+ listLayout.ib = ELayoutEmpty;
+
+ aDef.iListRect.LayoutRect(window_rect, listLayout);
+
+ TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
+ TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_and_elements__single_graphic_heading__Line_2;
+ // Combine two layouts togeher.
+ if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
+ if (part2.il != ELayoutEmpty) part1.il = part2.il;
+ if (part2.it != ELayoutEmpty) part1.it = part2.it;
+ if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
+ if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
+ if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
+ if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
+
+ aDef.iHeadingRect.LayoutRect(window_rect, part1);
+
+ //MenuPopupWindowGraphics(aDef);
+
+ const TAknWindowLineLayout lines[] =
+ {
+ AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_and_elements__single_graphic_heading__Line_3(heading?1:0),
+ AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_and_elements__single_graphic_heading__Line_3(1)
+ };
+ TRect inner_rect = window_rect;
+ aDef.iVertLineExt1.LayoutRect( inner_rect, lines[0]);
+ aDef.iVertLineExt2.LayoutRect( inner_rect, lines[1]);
+ }
+
+EXPORT_C void AknPopupLayouts::SetupPopupMenuDoubleWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
+ {
+ SetupDefaults(aDef);
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+ TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_double_pane_list_menu_double2_pane(heading?1:0, num-1);
+ // We really don't want parent relative list layout here because findbox will be overwritten.
+ // Just calculate list height and use that.
+ TRect nullRect(0,0,0,0);
+ TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_double2_graphic_pane_cp2(0));
+ listLayout.iH = (TInt16)(num * listItemRect.Height());
+ listLayout.ib = ELayoutEmpty;
+
+ aDef.iListRect.LayoutRect(window_rect, listLayout);
+
+ //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_double_pane_list_menu_double2_pane(heading?1:0, num-1 ));
+ TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
+ TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants__double__Line_2;
+ // Combine two layouts togeher.
+ if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
+ if (part2.il != ELayoutEmpty) part1.il = part2.il;
+ if (part2.it != ELayoutEmpty) part1.it = part2.it;
+ if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
+ if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
+ if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
+ if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
+
+ aDef.iHeadingRect.LayoutRect(window_rect, part1);
+
+ //MenuPopupWindowGraphics(aDef);
+ }
+
+EXPORT_C void AknPopupLayouts::SetupImageSelectionMenuPopupWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
+ {
+ SetupDefaults(aDef);
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+ TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_double_large_graphic_pane(heading?1:0, num-1);
+ // We really don't want parent relative list layout here because findbox will be overwritten.
+ // Just calculate list height and use that.
+ TRect nullRect(0,0,0,0);
+ TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_double_large_graphic_pane_cp2(0));
+ listLayout.iH = (TInt16)(num * listItemRect.Height());
+ listLayout.ib = ELayoutEmpty;
+
+ aDef.iListRect.LayoutRect(window_rect, listLayout);
+
+ //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_double_large_graphic_pane(heading?1:0, num-1));
+
+ TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
+ TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants__double__Line_2;
+
+ // Combine two layouts togeher.
+ if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
+ if (part2.il != ELayoutEmpty) part1.il = part2.il;
+ if (part2.it != ELayoutEmpty) part1.it = part2.it;
+ if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
+ if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
+ if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
+ if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
+ aDef.iHeadingRect.LayoutRect(window_rect, part1);
+
+ //MenuPopupWindowGraphics(aDef);
+ }
+
+
+EXPORT_C void AknPopupLayouts::SetupPopupSNoteGroupWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool /*heading*/)
+ {
+ // not used (at least by AvKon) - no need to remove magic numbers
+ SetupDefaults(aDef);
+ TRect window_rect = AknPopupLayouts::MenuRect(aDef);
+ aDef.iListRect.LayoutRect(window_rect, 0, 3, 11, ELayoutEmpty, ELayoutEmpty, 168, 38+(57-38)*(num-2) );
+ TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
+ TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_Line_2;
+
+ // Combine two layouts togeher.
+ if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
+ if (part2.il != ELayoutEmpty) part1.il = part2.il;
+ if (part2.it != ELayoutEmpty) part1.it = part2.it;
+ if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
+ if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
+ if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
+ if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
+
+ aDef.iHeadingRect.LayoutRect(window_rect, part1);
+
+ TInt p = window_rect.Size().iHeight;
+ const AknLayoutUtils::SAknLayoutRect shadow[] =
+ {
+ { 0,0,0,ELayoutEmpty, ELayoutEmpty, 176, p },
+ { 86,7,12,ELayoutEmpty, ELayoutEmpty, 167, p -16 },
+ { 221,4,10,ELayoutEmpty, ELayoutEmpty, 169, p -15 },
+ { 215,2,8,ELayoutEmpty, ELayoutEmpty, 170, p -14 },
+ { 0,3,9,ELayoutEmpty, ELayoutEmpty, 168, p -16 }
+ };
+
+ aDef.iCover.LayoutRect( window_rect, shadow[0]);
+ aDef.iSecond.LayoutRect( window_rect, shadow[1]);
+ aDef.iFirst.LayoutRect( window_rect, shadow[2]);
+ aDef.iOutline.LayoutRect(window_rect, shadow[3]);
+ aDef.iInside.LayoutRect( window_rect, shadow[4]);
+ }
+
+
+
+EXPORT_C void AknPopupLayouts::CalcPopupMenuWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
+ {
+ TAknLayoutRect popup_menu_window;
+ popup_menu_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_window(num-1));
+ aDef.iWindowRect = popup_menu_window.Rect();
+ aDef.iPopupMenuWindowOffset=TPoint(0,0);
+ }
+EXPORT_C void AknPopupLayouts::CalcPopupMenuGraphicWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
+ {
+ TAknLayoutRect popup_menu_graphic_window;
+ popup_menu_graphic_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_graphic_window(num-1));
+ aDef.iWindowRect = popup_menu_graphic_window.Rect();
+ aDef.iPopupMenuWindowOffset=TPoint(0,0);
+ }
+EXPORT_C void AknPopupLayouts::CalcPopupMenuGraphicHeadingWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
+ {
+ TAknLayoutRect popup_menu_graphic_heading_window;
+ popup_menu_graphic_heading_window.LayoutRect(aRect,AKN_LAYOUT_WINDOW_popup_menu_graphic_heading_window(num-1));
+ aDef.iWindowRect = popup_menu_graphic_heading_window.Rect();
+ aDef.iPopupMenuWindowOffset=TPoint(0,0);
+ }
+EXPORT_C void AknPopupLayouts::CalcPopupMenuDoubleWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
+ {
+ TAknLayoutRect popup_menu_double_window;
+ TInt items = 2;
+ if (num == 2) items = 1;
+ if (num == 1) items = 0;
+ popup_menu_double_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_double_window(items));
+ aDef.iWindowRect = popup_menu_double_window.Rect();
+ aDef.iPopupMenuWindowOffset=TPoint(0,0);
+ }
+
+EXPORT_C void AknPopupLayouts::CalcPopupMenuDoubleLargeGraphicWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
+ {
+ TAknLayoutRect popup_menu_double_large_graphic_window;
+ TInt items = 2;
+ if (num == 2) items = 1;
+ if (num == 1) items = 0;
+ popup_menu_double_large_graphic_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_double_large_graphic_window(items));
+ aDef.iWindowRect = popup_menu_double_large_graphic_window.Rect();
+ aDef.iPopupMenuWindowOffset=TPoint(0,0);
+ }
+
+
+EXPORT_C void AknPopupLayouts::CalcPopupSNoteGroupWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
+ {
+ TAknLayoutRect popup_menu_snote_window;
+ if (num-2 < 0) { num = 2; }
+ popup_menu_snote_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_snote_group_window(num-2));
+ aDef.iWindowRect = popup_menu_snote_window.Rect();
+ aDef.iPopupMenuWindowOffset=TPoint(0,0);
+ }
+
+
+EXPORT_C TRect AknPopupLayouts::WindowRect(TAknPopupWindowLayoutDef &aDef) {return aDef.iWindowRect; }
+
+EXPORT_C void AknPopupLayouts::ModifyWindowGraphicForHeading(TAknPopupWindowLayoutDef &aDef)
+ {
+ TRect nullRect(0,0,0,0);
+ TAknLayoutRect nullHeadingRect;
+ // find out, how much space is needed for heading (spaceForHeading was 23)
+ nullHeadingRect.LayoutRect(nullRect,AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_1(nullRect));
+ TInt spaceForHeading = nullHeadingRect.Rect().Height();
+
+
+ aDef.iWindowRect.iTl.iY -= spaceForHeading; // This is necessary to position it correctly
+ // this is because b=0 in parent of coverrect and because
+ // parent's height is used in the child...
+
+ TRect window_rect = aDef.iWindowRect;
+
+ aDef.iCover.LayoutRect( window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_1(window_rect));
+ aDef.iSecond.LayoutRect( window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_2(window_rect));
+ aDef.iFirst.LayoutRect( window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_3(window_rect));
+ aDef.iOutline.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_4(window_rect));
+ aDef.iInside.LayoutRect( window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_5(window_rect));
+
+ aDef.iPopupMenuWindowOffset=TPoint(0,spaceForHeading);
+ }
+
+EXPORT_C void AknPopupLayouts::ModifyWindowGraphicForMessageBox(TAknPopupWindowLayoutDef &aDef, TInt aNumberOfLines)
+ {
+ TInt varietyIndex = 0;
+ switch (aNumberOfLines)
+ {
+ case (2): varietyIndex = 1;
+ break;
+ case (3): varietyIndex = 2;
+ }
+
+ TAknWindowLineLayout lay = AknLayoutScalable_Apps::loc_type_pane(varietyIndex).LayoutLine();
+ TAknLayoutRect layout;
+ layout.LayoutRect( TRect(0,0,0,0), lay );
+ TRect messageRect( layout.Rect() );
+
+ aDef.iWindowRect.iTl.iY -= messageRect.Height();
+ }
+
+EXPORT_C void AknPopupLayouts::SetupDefaults(TAknPopupWindowLayoutDef &aDef)
+ {
+ aDef.iVertLineExt1.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
+ aDef.iVertLineExt2.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
+ }
+
+
+EXPORT_C TAknPopupWindowLayoutDef::TAknPopupWindowLayoutDef()
+ : iMaximumHeight(0)
+ {
+
+ }
+
+TRect AknPopupLayouts::RectFromLayout(TRect aParent, const TAknWindowComponentLayout &aComponentLayout)
+ {
+ TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine();
+ TAknLayoutRect layoutRect;
+ layoutRect.LayoutRect(aParent,lineLayout);
+ return layoutRect.Rect();
+ }
+
+// End of File