uifw/AvKon/src/aknpopuplayout.cpp
changeset 0 2f259fa3e83a
child 15 08e69e956a8c
equal deleted inserted replaced
-1:000000000000 0:2f259fa3e83a
       
     1 /*
       
     2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <aknpopuplayout.h>
       
    20 #include <e32def.h>
       
    21 #include <eiklbx.h>
       
    22 #include <aknPopupHeadingPane.h>
       
    23 #include <AknPanic.h>
       
    24 #include <AknLayout.lag>
       
    25 #include <aknenv.h>
       
    26 
       
    27 #include <AknUtils.h>
       
    28 #include <eiksfont.h>
       
    29 #include <avkon.rsg>
       
    30 #include <AknsDrawUtils.h>
       
    31 #include <AknsControlContext.h>
       
    32 #include <eikfrlbd.h>
       
    33 #include <AknsBasicBackgroundControlContext.h>
       
    34 #include <aknmessagequerycontrol.h>
       
    35 #include <aknsfld.h>
       
    36 
       
    37 #include <skinlayout.cdl.h>
       
    38 
       
    39 #include <AknLayout2ScalableDef.h>
       
    40 #include <aknlayoutscalable_avkon.cdl.h>
       
    41 #include <layoutmetadata.cdl.h>
       
    42 #include <aknlayoutscalable_apps.cdl.h>
       
    43 
       
    44 #include <touchfeedback.h>
       
    45 #include <aknlists.h>
       
    46 
       
    47 
       
    48 static CCoeControl *FindControl(TAknPopupLayoutsNode *aNode, TInt aId)
       
    49     {
       
    50     while(aNode)
       
    51         {
       
    52         if (aId == aNode->iId)
       
    53             {
       
    54             return aNode->iControl;
       
    55             }
       
    56         aNode = aNode -> iNext;
       
    57         }
       
    58     return NULL;
       
    59     }
       
    60 
       
    61 static TInt GetMaxListHeight()
       
    62     {
       
    63     TAknLayoutRect temp, layout;
       
    64 
       
    65     TRect mainPane;
       
    66     TRect statusPane;
       
    67     TRect controlPane;
       
    68     AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EPopupParent, mainPane );
       
    69     AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, statusPane );
       
    70     AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EControlPane, controlPane );
       
    71     
       
    72     // in landscape orientation popuplist can't go on top of statuspane
       
    73     if ( !Layout_Meta_Data::IsLandscapeOrientation() )
       
    74         {
       
    75         mainPane.iTl.iY -= statusPane.Height();
       
    76         }
       
    77 
       
    78     // treat mainpane+statuspane area as popup window
       
    79     // too bad we can't use this, because e.g. QVGA landscape has border-size 7
       
    80     // in avkon layout and border-size 9 in skin drawing...
       
    81     /*temp.LayoutRect( mainPane, AknLayoutScalable_Avkon::listscroll_menu_pane(0));
       
    82     layout.LayoutRect( temp.Rect(), AknLayoutScalable_Avkon::list_menu_pane(0));
       
    83     return layout.Rect().Height();*/
       
    84         
       
    85     // shadow
       
    86     TInt varietyIndex = Layout_Meta_Data::IsLandscapeOrientation();
       
    87     
       
    88     TAknLayoutRect insideArea;
       
    89     insideArea.LayoutRect(
       
    90         mainPane,
       
    91         AknLayoutScalable_Avkon::bg_popup_window_pane_g1(varietyIndex) );
       
    92         
       
    93     return insideArea.Rect().Height();
       
    94     }
       
    95 
       
    96 
       
    97 EXPORT_C
       
    98 void AknPopupLayouts::HandleSizeChanged( TAknPopupWindowLayoutDef &aDef, 
       
    99                                          TAknPopupLayouts aLayout_1,
       
   100                                          CAknPopupHeadingPane *aHeading,
       
   101                                          CEikListBox *aListBox,
       
   102                                          CCoeControl *aWindowOwningControl )
       
   103     {
       
   104     TAknPopupLayoutsNode list = { 0, EListNode, aListBox };
       
   105     TAknPopupLayoutsNode heading = { &list, EHeadingNode, aHeading };
       
   106     TAknPopupLayoutsNode windowOwning = { &heading, EWindowOwningNode, aWindowOwningControl };
       
   107     HandleSizeChanged(aDef, aLayout_1, &windowOwning);
       
   108     }
       
   109 
       
   110 
       
   111 EXPORT_C
       
   112 void AknPopupLayouts::HandleSizeChanged( TAknPopupWindowLayoutDef &aDef,
       
   113                                          TAknPopupLayouts aLayout_1,
       
   114                                          TAknPopupLayoutsNode *aNode)
       
   115     {
       
   116     CAknPopupHeadingPane *aHeading = (CAknPopupHeadingPane*)FindControl(aNode, EHeadingNode);
       
   117     CEikListBox *aListBox = (CEikListBox*)FindControl(aNode, EListNode);
       
   118     CCoeControl *aWindowOwningControl = FindControl(aNode, EWindowOwningNode);
       
   119     CAknMessageQueryControl *aMsgQueryCtrl = (CAknMessageQueryControl*)FindControl(aNode, EMessageBoxNode);
       
   120     
       
   121     TInt aLayout = aLayout_1;
       
   122     TInt numofitems = aListBox->Model()->NumberOfItems();
       
   123 
       
   124     aListBox->View()->ItemDrawer()->SetSkinEnabledL(ETrue);
       
   125     
       
   126     TInt maxListHeight = GetMaxListHeight();
       
   127 
       
   128     // position popup window's bottom correctly
       
   129     TRect clientRect;
       
   130     AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EPopupParent, clientRect);
       
   131     // set windowrect to minimum size - this will be adjusted later    
       
   132     TAknLayoutRect windowRect;
       
   133     windowRect.LayoutRect( clientRect, AknLayoutScalable_Avkon::popup_menu_window(8));
       
   134     aDef.iWindowRect = windowRect.Rect();
       
   135     TRAP_IGNORE( aListBox->View()->ItemDrawer()->SetSkinEnabledL(ETrue) );
       
   136     
       
   137     // Popup window when the size does not change based on
       
   138     // the number of items.
       
   139     TBool fixedWindowSize = EFalse;
       
   140     if ( (aLayout & EAknPopupLayoutsDynamic) || numofitems == 0 ||
       
   141          (aLayout & EAknPopupLayoutsFind) )
       
   142         {
       
   143         aLayout &= ~EAknPopupLayoutsDynamic;
       
   144         fixedWindowSize = ETrue;
       
   145         }
       
   146         
       
   147     // heading =============================================================
       
   148     TInt spaceForHeading = 0;
       
   149     if (aHeading)
       
   150         {
       
   151         aHeading->SetLayout( CAknPopupHeadingPane::EListHeadingPane ); 
       
   152         TAknLayoutRect tempHeadingRect;
       
   153         tempHeadingRect.LayoutRect(clientRect,
       
   154             AknLayoutScalable_Avkon::heading_pane(0));
       
   155         spaceForHeading = tempHeadingRect.Rect().Height();
       
   156         maxListHeight -= spaceForHeading;
       
   157         }
       
   158     aDef.iPopupMenuWindowOffset=TPoint(0,spaceForHeading);
       
   159         
       
   160     
       
   161     // findbox =============================================================
       
   162     TBool windowSizeFind = EFalse;
       
   163     TInt spaceForFind = 0;
       
   164     if (aLayout & EAknPopupLayoutsFind)
       
   165         {
       
   166         aLayout &= ~EAknPopupLayoutsFind;
       
   167         windowSizeFind = ETrue;
       
   168         // calculate space needed for find
       
   169         TAknLayoutRect tempFindRect;
       
   170         tempFindRect.LayoutRect(clientRect,AknLayoutScalable_Avkon::find_popup_pane_cp2(0));
       
   171         spaceForFind = tempFindRect.Rect().Height();
       
   172         maxListHeight -= spaceForFind;
       
   173         }
       
   174     
       
   175     // messagebox ==========================================================
       
   176     TRect messageRect;
       
   177     TInt messageNumOfLines = 0;
       
   178     TBool messageBox = EFalse;
       
   179     if (aMsgQueryCtrl && aMsgQueryCtrl->Lines() > 0)
       
   180         {
       
   181         messageBox = ETrue;
       
   182         messageNumOfLines = aMsgQueryCtrl->Lines();
       
   183         TInt varietyIndex = 0;
       
   184         switch(messageNumOfLines)
       
   185             {
       
   186             case (0):
       
   187             case (1): varietyIndex = 0;
       
   188             break;          
       
   189             case (2): varietyIndex = 1;
       
   190             break;
       
   191             default : varietyIndex = 2;
       
   192             }           
       
   193         TAknWindowLineLayout lay = AknLayoutScalable_Apps::loc_type_pane(varietyIndex).LayoutLine();
       
   194         TAknLayoutRect layout;
       
   195         layout.LayoutRect( TRect(0,0,0,0), lay );           
       
   196         messageRect =  layout.Rect();           
       
   197         maxListHeight -= messageRect.Height();
       
   198         }
       
   199     
       
   200     TInt minItems = 1;
       
   201     
       
   202     TRect scrollBarRect(0,0,0,0);
       
   203     
       
   204     TAknWindowLineLayout listLayout;
       
   205     TAknLayoutScalableParameterLimits listLimits;
       
   206     
       
   207     switch(aLayout)
       
   208         {
       
   209         case EPopupSNotePopupWindow:
       
   210         case EMenuUnknownColumnWindow:
       
   211         case EMenuUnknownFormattedCellWindow:
       
   212         case EMenuWindow:
       
   213             {
       
   214             minItems = aHeading ? 5 : 6;
       
   215             listLayout = AknLayoutScalable_Avkon::list_single_pane_cp2(0);
       
   216             listLimits = AknLayoutScalable_Avkon::list_single_pane_cp2_ParamLimits();
       
   217             break;
       
   218             }
       
   219         case EMenuGraphicWindow:
       
   220             {
       
   221             minItems = 5;
       
   222             listLayout = AknLayoutScalable_Avkon::list_single_graphic_pane_cp2(0);
       
   223             listLimits = AknLayoutScalable_Avkon::list_single_graphic_pane_cp2_ParamLimits();
       
   224             break;
       
   225             }
       
   226         case EMenuGraphicHeadingWindow:
       
   227             {
       
   228             minItems = 5;
       
   229             listLayout = AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2(0);
       
   230             listLimits = AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2_ParamLimits();
       
   231             break;
       
   232             }
       
   233         case EMenuDoubleWindow:
       
   234             {
       
   235             minItems = 3;
       
   236             listLayout = AknLayoutScalable_Avkon::list_double_pane_cp2(0);
       
   237             listLimits = AknLayoutScalable_Avkon::list_double_pane_cp2_ParamLimits();
       
   238             break;
       
   239             }
       
   240         case EMenuDoubleLargeGraphicWindow:
       
   241             {
       
   242             minItems = 3;
       
   243             listLayout = AknLayoutScalable_Avkon::list_double_large_graphic_pane_cp2(0);
       
   244             listLimits = AknLayoutScalable_Avkon::list_double_large_graphic_pane_cp2_ParamLimits();
       
   245             break;
       
   246             }
       
   247         }
       
   248         
       
   249     if (!fixedWindowSize)
       
   250         {
       
   251         minItems = 1;
       
   252         }
       
   253 
       
   254     TInt maxLayoutItems = listLimits.LastRow() + 1; // last row is a zero based index, we need num items which is 1 based
       
   255         
       
   256     //aDef.iVertLineExt1.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
       
   257     //aDef.iVertLineExt2.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
       
   258         
       
   259     TAknLayoutRect listItemRect;
       
   260     listItemRect.LayoutRect( aDef.iWindowRect, listLayout);
       
   261     TInt listItemHeight = listItemRect.Rect().Height();
       
   262     TInt maxItems = maxListHeight / listItemHeight;
       
   263     // minItems == 1 only if the popuplist is dynamically changeable
       
   264     if ( (numofitems > 1) && (minItems == 1) )
       
   265         {
       
   266         minItems = numofitems;
       
   267         }
       
   268     if (minItems > maxItems)
       
   269         {
       
   270         minItems = maxItems;
       
   271         }
       
   272     // maxItems might be greater than max items from layout -> use layout's maximum
       
   273     if (minItems > maxLayoutItems)
       
   274         {
       
   275         minItems = maxLayoutItems;
       
   276         }
       
   277 
       
   278     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   279 
       
   280     TAknLayoutRect temp, layout;
       
   281     TRect screenRect;
       
   282     AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screenRect ); 
       
   283     TAknWindowLineLayout lineLayout = AknLayoutScalable_Avkon::listscroll_menu_pane(0).LayoutLine();
       
   284  
       
   285     // Layout data of listscroll_menu_pane are changed for CR 417-35260.
       
   286     // The change is just for QHD landscape model.
       
   287     // The CR makes listscroll_menu_pane's ir or il bigger than normal,
       
   288     // so that width of list item is smaller than needs. Then, first cell 
       
   289     // of list item can not be drawn on proper position.
       
   290     // Adjustment of layout is a solution for this problem. This is not a perfect idea, but
       
   291     // creating a new layout for popuplist is too complex to do that. Adjustment is a must.
       
   292     if(Layout_Meta_Data::IsLandscapeOrientation())       
       
   293         {
       
   294         TInt offset  = AknListBoxLayouts::AdjustPopupLayoutData( screenRect );
       
   295         if (!AknLayoutUtils::LayoutMirrored())
       
   296             {
       
   297             lineLayout.ir -= offset;
       
   298             }
       
   299         else
       
   300             {
       
   301             lineLayout.il -= offset;
       
   302             }
       
   303         }
       
   304     temp.LayoutRect( window_rect, lineLayout);        
       
   305 
       
   306     layout.LayoutRect( temp.Rect(), AknLayoutScalable_Avkon::list_menu_pane(0));
       
   307     TRect tempListRect = layout.Rect(); // this is list's rect for the whole window
       
   308     
       
   309     // subtract heading, findbox and messagebox from tempListRect
       
   310     tempListRect.iBr.iY -= spaceForFind;
       
   311     tempListRect.iTl.iY += spaceForHeading;
       
   312     tempListRect.iTl.iY += messageRect.Height();
       
   313     
       
   314     // We really don't want parent relative list layout here because findbox will be overwritten.
       
   315     // Just calculate list height and use that.
       
   316     TRect nullRect(0,0,0,0);
       
   317     listLayout.iH = (TInt16)(minItems * listItemHeight);
       
   318     listLayout.ib = ELayoutEmpty;
       
   319 
       
   320     aDef.iListRect.LayoutRect(tempListRect,
       
   321         listLayout);
       
   322 
       
   323     // we have to scale iWindowRect to list rect - layout is not (yet) correct
       
   324     TInt usedHeight = aDef.iListRect.Rect().Height()
       
   325         + spaceForFind
       
   326         + spaceForHeading
       
   327         + messageRect.Height();
       
   328         
       
   329     // popupwindow's inside area
       
   330     TInt varietyIndex = Layout_Meta_Data::IsLandscapeOrientation();
       
   331     
       
   332     TAknLayoutRect insideArea;
       
   333     insideArea.LayoutRect(
       
   334         window_rect,
       
   335         AknLayoutScalable_Avkon::bg_popup_window_pane_g1(varietyIndex) );
       
   336 
       
   337     if (layout.Rect().Height() < usedHeight)
       
   338         {
       
   339         aDef.iWindowRect.iTl.iY -= (usedHeight - layout.Rect().Height());
       
   340         }
       
   341     
       
   342     AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation();    
       
   343         
       
   344     // In landscape we have to center (on y-axis) popup window (but not with bottom CBA)
       
   345     if (varietyIndex == 1 && cbaLocation != AknLayoutUtils::EAknCbaLocationBottom)
       
   346         {
       
   347         TRect mainPane;
       
   348         AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EPopupParent, mainPane );
       
   349         TInt diff = (mainPane.Height()-aDef.iWindowRect.Height()) / 2;
       
   350         aDef.iWindowRect.iTl.iY -= diff;
       
   351         aDef.iWindowRect.iBr.iY -= diff;
       
   352                         
       
   353         // with right CBA, move window to the right side of the screen
       
   354         if (cbaLocation == AknLayoutUtils::EAknCbaLocationRight)
       
   355             {
       
   356             TInt offset = mainPane.Width()-aDef.iWindowRect.iBr.iX;
       
   357             aDef.iWindowRect.iTl.iX += offset;
       
   358             aDef.iWindowRect.iBr.iX += offset;
       
   359             }        
       
   360         
       
   361         //should this be uncommented??
       
   362         // If we have left CBA, we move window to left side of screen (on x-axis).       
       
   363         /*else if (cbaLocation == AknLayoutUtils::EAknCbaLocationLeft)
       
   364             {
       
   365             TInt xOffset = aDef.iWindowRect.iTl.iX;
       
   366             if ( xOffset > 0 )
       
   367                 {
       
   368                 aDef.iWindowRect.iTl.iX = 0;
       
   369                 aDef.iWindowRect.iBr.iX -= xOffset;
       
   370                 }
       
   371             }*/
       
   372         }                                                                              
       
   373       
       
   374     TRect screen;
       
   375         AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, screen );
       
   376         
       
   377     TAknLayoutRect cbaRect;
       
   378     cbaRect.LayoutRect( screen, 
       
   379         AknLayoutScalable_Avkon::popup_sk_window( 0  ).LayoutLine() );
       
   380             
       
   381     if ( AknLayoutUtils::PenEnabled() )
       
   382         {
       
   383         TSize size( aDef.iWindowRect.Size() );
       
   384         // add softkey height
       
   385         size.iHeight += cbaRect.Rect().Height();
       
   386         
       
   387         // Reduce listbox's and popup's height if total height is more than
       
   388         // screen height.
       
   389         if ( size.iHeight > screen.Height() )
       
   390             {
       
   391             listLayout.iH -= ( size.iHeight - screen.Height() );
       
   392             aDef.iListRect.LayoutRect( tempListRect, listLayout );
       
   393             
       
   394             size.iHeight = screen.Height();
       
   395             }
       
   396 
       
   397         aDef.iWindowRect.SetRect( AknPopupUtils::Position( size, ETrue ), size );
       
   398         }
       
   399 
       
   400     // now we finally know the window rect: first setup heading
       
   401     if (aHeading)
       
   402         {
       
   403         aDef.iHeadingRect.LayoutRect(AknPopupLayouts::MenuRect(aDef),
       
   404             AknLayoutScalable_Avkon::heading_pane(0));
       
   405         }
       
   406     
       
   407     MenuPopupWindowGraphics(aDef);
       
   408     aWindowOwningControl->SetRect(WindowRect(aDef));
       
   409     HandleSizeAndPositionOfComponents(aDef, aListBox, aHeading);
       
   410 
       
   411     layout.LayoutRect(MenuRect(aDef), lineLayout);
       
   412     TRect scrollBarClientRect(layout.Rect());
       
   413         
       
   414     if ( AknLayoutUtils::PenEnabled() )
       
   415         {
       
   416         // remove softkey height that was added earlier so that
       
   417         // scroll bar doesn't get behind the softkey 
       
   418         scrollBarClientRect.iBr.iY -= cbaRect.Rect().Height();
       
   419         }
       
   420 
       
   421     if (aHeading)
       
   422         {
       
   423         scrollBarClientRect.iTl.iY += spaceForHeading;                
       
   424         }
       
   425         
       
   426     if (windowSizeFind)
       
   427         {
       
   428         scrollBarClientRect.iBr.iY -= spaceForFind;
       
   429         }
       
   430         
       
   431     if (messageBox)
       
   432         {
       
   433         scrollBarClientRect.iTl.iY += messageRect.Height();
       
   434         }
       
   435     varietyIndex = 0;
       
   436     AknLayoutUtils::LayoutVerticalScrollBar(
       
   437         aListBox->ScrollBarFrame(),
       
   438         scrollBarClientRect, 
       
   439         AknLayoutScalable_Avkon::scroll_pane_cp25(varietyIndex).LayoutLine() ) ;
       
   440         
       
   441     if (messageBox)
       
   442         {
       
   443         TAknLayoutRect msgQuery;
       
   444       
       
   445         TInt varietyIndex = 0;
       
   446         switch(messageNumOfLines)
       
   447             {
       
   448             case (0):
       
   449             case (1): varietyIndex = 0;
       
   450             break;          
       
   451             case (2): varietyIndex = 1;
       
   452             break;
       
   453             default : varietyIndex = 2;
       
   454             }
       
   455         msgQuery.LayoutRect( AknPopupLayouts::MenuRect(aDef),
       
   456            AknLayoutScalable_Apps::loc_type_pane(varietyIndex).LayoutLine() );
       
   457         aMsgQueryCtrl->SetRect(msgQuery.Rect());
       
   458         }
       
   459 
       
   460     window_rect = WindowRect(aDef);
       
   461     MAknsControlContext *cc = AknsDrawUtils::ControlContext( aListBox );
       
   462     TBool defaultContext = EFalse;
       
   463     if (!cc)
       
   464         {
       
   465         cc = aListBox->View()->ItemDrawer()->SkinBackgroundControlContext();
       
   466         defaultContext = ETrue;
       
   467         }
       
   468     if (cc)
       
   469         {
       
   470         CAknsBasicBackgroundControlContext *bcc = (CAknsBasicBackgroundControlContext*)cc;
       
   471         TAknLayoutRect popupBgRect;
       
   472         popupBgRect.LayoutRect(window_rect,
       
   473                                SkinLayout::Popup_windows_skin_placing__background_slice__Line_1(window_rect));
       
   474         bcc->SetBitmap(KAknsIIDQsnFrPopupCenter);
       
   475         if (defaultContext) bcc->SetRect(popupBgRect.Rect());
       
   476         bcc->SetParentPos(aWindowOwningControl->PositionRelativeToScreen());
       
   477         if (defaultContext)
       
   478             bcc->SetParentPos(TPoint(0,0));
       
   479         }
       
   480 // handled in CFormattedCellListBoxDataExtension, since listbox does not always cover whole
       
   481 // window rect (listquery/popup list), especially when items are added after construction        
       
   482 /*
       
   483     // note, that cleanup is done in ~CFormattedCellListBoxData()
       
   484     // or ( shudder ) in ~CColumnListBoxData()
       
   485     MTouchFeedback* feedback = MTouchFeedback::Instance();
       
   486     if( feedback )
       
   487         {       
       
   488         feedback->SetFeedbackArea( aListBox, 0, aListBox->Rect(), 
       
   489                     ETouchFeedbackBasic, ETouchEventStylusDown );                                   
       
   490         }
       
   491 */
       
   492 }
       
   493 
       
   494 EXPORT_C void AknPopupLayouts::HandleSizeAndPositionOfComponents(const TAknPopupWindowLayoutDef &aDef, 
       
   495                              CCoeControl *aContent, 
       
   496                              CAknPopupHeadingPane *aHeading)
       
   497     {
       
   498     __ASSERT_DEBUG(aContent->MinimumSize() == aDef.iListRect.Rect().Size(), RDebug::Print(_L("AknPopupLayouts:ERROR, control minimumsize and LAF spec does not match!")));
       
   499     TRect lbrect = aDef.iListRect.Rect();
       
   500     TRect headrect; 
       
   501     
       
   502     aContent->SetRect(lbrect);
       
   503     if (aHeading) 
       
   504         {
       
   505         headrect = aDef.iHeadingRect.Rect();
       
   506         aHeading->SetRect(headrect);
       
   507         }
       
   508     }
       
   509 
       
   510 EXPORT_C void AknPopupLayouts::CheckRange(TInt &aValue, TInt aMin, TInt aMax)
       
   511     {
       
   512     if (aValue > aMax) aValue = aMax;
       
   513     if (aValue < aMin) aValue = aMin;
       
   514     }
       
   515 
       
   516 // Disable "unreferenced formal parameter" for when aEikEnv is not used in the AKN_LAF_COLOR_ENV macro.
       
   517 #pragma warning(disable : 4100)
       
   518 EXPORT_C void AknPopupLayouts::HandleDraw(CEikonEnv* /*aEikEnv*/,
       
   519                   CWindowGc &aGc,
       
   520                   const TAknPopupWindowLayoutDef &aDef, 
       
   521                   CEikListBox* aListBox, 
       
   522                   CAknPopupHeadingPane* aHeading)
       
   523     {
       
   524     TRect windowRect = MenuRect(const_cast<TAknPopupWindowLayoutDef&>(aDef));
       
   525     MAknsSkinInstance *skin = AknsUtils::SkinInstance();
       
   526     MAknsControlContext *cc = AknsDrawUtils::ControlContext( aListBox );
       
   527     TBool windowFrameDrawn = EFalse;
       
   528     if (!cc) cc = aListBox->View()->ItemDrawer()->SkinBackgroundControlContext();
       
   529     
       
   530     TRegionFix<5> dontDrawRegion;
       
   531     TRegionFix<22> drawRegion;
       
   532     if ( aListBox )
       
   533         {
       
   534         dontDrawRegion.AddRect( aListBox->Rect() );
       
   535 
       
   536         // If there are scroll bars and they draw their own background, take
       
   537         // them out of clipping region
       
   538         CEikScrollBarFrame* scrollBarFrame = aListBox->ScrollBarFrame();
       
   539         if (scrollBarFrame)
       
   540             {
       
   541             CEikScrollBar* hBar = scrollBarFrame->GetScrollBarHandle(
       
   542                 CEikScrollBar::EHorizontal);
       
   543             CEikScrollBar* vBar = scrollBarFrame->GetScrollBarHandle(
       
   544                 CEikScrollBar::EVertical);
       
   545             TBool drawHorizontal = ETrue;
       
   546             TBool drawVertical = ETrue;
       
   547             scrollBarFrame->DrawBackgroundState(drawHorizontal, drawVertical);
       
   548             drawHorizontal = drawHorizontal && hBar && hBar->IsVisible();
       
   549             drawVertical = drawVertical && vBar && vBar->IsVisible();
       
   550             if (drawHorizontal)
       
   551                 {
       
   552                 TRect scrollBarRect(hBar->Rect());
       
   553                 if (hBar->OwnsWindow())
       
   554                     {
       
   555                     TPoint windowPos = aDef.iWindowRect.iTl;
       
   556                     TPoint scrollBarPos = hBar->PositionRelativeToScreen();
       
   557                     scrollBarRect.Move(scrollBarPos - windowPos);
       
   558                     }
       
   559                 dontDrawRegion.AddRect(scrollBarRect);
       
   560                 }
       
   561             if (drawVertical)
       
   562                 {
       
   563                 TRect scrollBarRect(vBar->Rect());
       
   564                 if (vBar->OwnsWindow())
       
   565                     {
       
   566                     TPoint windowPos = aDef.iWindowRect.iTl;
       
   567                     TPoint scrollBarPos = vBar->PositionRelativeToScreen();
       
   568                     scrollBarRect.Move(scrollBarPos - windowPos);
       
   569                     }
       
   570                 dontDrawRegion.AddRect(scrollBarRect);
       
   571                 }
       
   572             }
       
   573         }
       
   574     if ( aHeading )
       
   575         {
       
   576         dontDrawRegion.AddRect( aHeading->Rect() );
       
   577         }
       
   578     drawRegion.AddRect( windowRect );
       
   579     drawRegion.SubRegion( dontDrawRegion );
       
   580     if (cc)
       
   581         {
       
   582         const TAknsItemID *popupBgId = &KAknsIIDQsnBgPopupBackground;
       
   583         TAknLayoutRect popupBgRect;
       
   584         popupBgRect.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_1(windowRect));
       
   585         AknsDrawUtils::DrawCachedImage(skin, aGc, popupBgRect.Rect(), *popupBgId);
       
   586 
       
   587         const TAknsItemID *sliceId = &KAknsIIDQsnBgSlicePopup;
       
   588         TAknLayoutRect sliceRect;
       
   589         sliceRect.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__background_slice__Line_2());
       
   590         AknsDrawUtils::DrawCachedImage(skin, aGc, sliceRect.Rect(), *sliceId);
       
   591             
       
   592         TAknLayoutRect topLeft;
       
   593         topLeft.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_2());
       
   594 
       
   595         TAknLayoutRect bottomRight;
       
   596         bottomRight.LayoutRect(windowRect, SkinLayout::Popup_windows_skin_placing__frame_general__Line_5());
       
   597 
       
   598         TRect outerRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr);
       
   599         TRect innerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl);
       
   600         aGc.SetPenStyle(CGraphicsContext::ENullPen);
       
   601         const TAknsItemID *frameId = &KAknsIIDQsnFrPopup;
       
   602         const TAknsItemID *frameCenterId = &KAknsIIDQsnFrPopupCenter;
       
   603         aGc.SetClippingRegion( drawRegion );
       
   604         windowFrameDrawn = AknsDrawUtils::DrawFrame(skin, aGc, outerRect, innerRect, *frameId, *frameCenterId);
       
   605         aGc.CancelClippingRegion();
       
   606         }
       
   607     if (!windowFrameDrawn)
       
   608         {
       
   609         AknDraw::DrawWindowShadow(aGc, aDef.iCover, aDef.iSecond, aDef.iFirst, aDef.iOutline, aDef.iInside);
       
   610         }
       
   611     }
       
   612 #pragma warning(default : 4100)
       
   613 
       
   614 
       
   615 EXPORT_C TRect AknPopupLayouts::MenuRect(TAknPopupWindowLayoutDef &aDef)
       
   616     {
       
   617     return TRect(TPoint(0,0), aDef.iWindowRect.Size());
       
   618     }
       
   619 
       
   620 
       
   621 EXPORT_C void AknPopupLayouts::MenuPopupWindowGraphics(TAknPopupWindowLayoutDef &aDef)
       
   622     {
       
   623     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   624     TAknWindowLineLayout s0 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_1(window_rect);
       
   625     TAknWindowLineLayout s1 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_2(window_rect);
       
   626     TAknWindowLineLayout s2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_3(window_rect);
       
   627     TAknWindowLineLayout s3 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_4(window_rect);
       
   628     TAknWindowLineLayout s4 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_graphics_Line_5(window_rect);
       
   629 
       
   630     aDef.iCover.LayoutRect(  window_rect, s0);
       
   631     aDef.iSecond.LayoutRect( window_rect, s1);
       
   632     aDef.iFirst.LayoutRect(  window_rect, s2);
       
   633     aDef.iOutline.LayoutRect(window_rect, s3);
       
   634     aDef.iInside.LayoutRect( window_rect, s4);
       
   635 }
       
   636 
       
   637 EXPORT_C void AknPopupLayouts::SetupMenuPopupWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
       
   638     {
       
   639     SetupDefaults(aDef);
       
   640     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   641     TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_pane(heading?1:0, num-1);
       
   642     // We really don't want parent relative list layout here because findbox will be overwritten.
       
   643     // Just calculate list height and use that.
       
   644     TRect nullRect(0,0,0,0);
       
   645     TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_single_number_heading_pane_cp2(0));
       
   646     listLayout.iH = (TInt16)(num * listItemRect.Height());
       
   647     listLayout.ib = ELayoutEmpty;
       
   648 
       
   649     aDef.iListRect.LayoutRect(window_rect, listLayout);
       
   650 
       
   651     //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_pane(heading?1:0, num-1));
       
   652     
       
   653     TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
       
   654     TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_Line_2;
       
   655 
       
   656     // Combine two layouts togeher.
       
   657     if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
       
   658     if (part2.il != ELayoutEmpty) part1.il = part2.il;
       
   659     if (part2.it != ELayoutEmpty) part1.it = part2.it;
       
   660     if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
       
   661     if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
       
   662     if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
       
   663     if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
       
   664 
       
   665     aDef.iHeadingRect.LayoutRect(window_rect, part1);
       
   666 
       
   667     //MenuPopupWindowGraphics(aDef);
       
   668     }
       
   669 
       
   670 EXPORT_C void AknPopupLayouts::SetupPopupMenuGraphicWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
       
   671     {
       
   672     SetupDefaults(aDef);
       
   673     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   674     TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_graphic_pane(heading?1:0, num-1);
       
   675     // We really don't want parent relative list layout here because findbox will be overwritten.
       
   676     // Just calculate list height and use that.
       
   677     TRect nullRect(0,0,0,0);
       
   678     TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2(0));
       
   679     listLayout.iH = (TInt16)(num * listItemRect.Height());
       
   680     listLayout.ib = ELayoutEmpty;
       
   681 
       
   682     aDef.iListRect.LayoutRect(window_rect, listLayout);
       
   683 
       
   684     //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_graphic_pane(heading?1:0, num-1));
       
   685     TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
       
   686     TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_Line_2;
       
   687 
       
   688     // Combine two layouts togeher.
       
   689     if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
       
   690     if (part2.il != ELayoutEmpty) part1.il = part2.il;
       
   691     if (part2.it != ELayoutEmpty) part1.it = part2.it;
       
   692     if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
       
   693     if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
       
   694     if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
       
   695     if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
       
   696 
       
   697     aDef.iHeadingRect.LayoutRect(window_rect, part1); 
       
   698 
       
   699     //MenuPopupWindowGraphics(aDef);
       
   700     }
       
   701 
       
   702 EXPORT_C void AknPopupLayouts::SetupPopupMenuGraphicHeadingWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
       
   703     {
       
   704     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   705     TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_graphic_heading_pane(heading?1:0, num-1);
       
   706     // We really don't want parent relative list layout here because findbox will be overwritten.
       
   707     // Just calculate list height and use that.
       
   708     TRect nullRect(0,0,0,0);
       
   709     TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_single_graphic_heading_pane_cp2(0));
       
   710     listLayout.iH = (TInt16)(num * listItemRect.Height());
       
   711     listLayout.ib = ELayoutEmpty;
       
   712 
       
   713     aDef.iListRect.LayoutRect(window_rect, listLayout);
       
   714 
       
   715     TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
       
   716     TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_and_elements__single_graphic_heading__Line_2;
       
   717     // Combine two layouts togeher.
       
   718     if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
       
   719     if (part2.il != ELayoutEmpty) part1.il = part2.il;
       
   720     if (part2.it != ELayoutEmpty) part1.it = part2.it;
       
   721     if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
       
   722     if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
       
   723     if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
       
   724     if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
       
   725 
       
   726     aDef.iHeadingRect.LayoutRect(window_rect, part1);
       
   727     
       
   728     //MenuPopupWindowGraphics(aDef);
       
   729 
       
   730     const TAknWindowLineLayout lines[] =
       
   731         {
       
   732         AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_and_elements__single_graphic_heading__Line_3(heading?1:0),
       
   733         AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_and_elements__single_graphic_heading__Line_3(1)
       
   734         };
       
   735     TRect inner_rect = window_rect; 
       
   736     aDef.iVertLineExt1.LayoutRect( inner_rect, lines[0]);
       
   737     aDef.iVertLineExt2.LayoutRect( inner_rect, lines[1]);
       
   738     }
       
   739 
       
   740 EXPORT_C void AknPopupLayouts::SetupPopupMenuDoubleWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
       
   741     {
       
   742     SetupDefaults(aDef);
       
   743     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   744     TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_double_pane_list_menu_double2_pane(heading?1:0, num-1);
       
   745     // We really don't want parent relative list layout here because findbox will be overwritten.
       
   746     // Just calculate list height and use that.
       
   747     TRect nullRect(0,0,0,0);
       
   748     TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_double2_graphic_pane_cp2(0));
       
   749     listLayout.iH = (TInt16)(num * listItemRect.Height());
       
   750     listLayout.ib = ELayoutEmpty;
       
   751 
       
   752     aDef.iListRect.LayoutRect(window_rect, listLayout);
       
   753 
       
   754     //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_double_pane_list_menu_double2_pane(heading?1:0, num-1 ));
       
   755     TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
       
   756     TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants__double__Line_2;
       
   757     // Combine two layouts togeher.
       
   758     if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
       
   759     if (part2.il != ELayoutEmpty) part1.il = part2.il;
       
   760     if (part2.it != ELayoutEmpty) part1.it = part2.it;
       
   761     if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
       
   762     if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
       
   763     if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
       
   764     if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
       
   765 
       
   766     aDef.iHeadingRect.LayoutRect(window_rect, part1);
       
   767 
       
   768     //MenuPopupWindowGraphics(aDef);
       
   769     }
       
   770     
       
   771 EXPORT_C void AknPopupLayouts::SetupImageSelectionMenuPopupWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool heading)
       
   772     {
       
   773     SetupDefaults(aDef);
       
   774     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   775     TAknWindowLineLayout listLayout = AKN_LAYOUT_WINDOW_list_menu_double_large_graphic_pane(heading?1:0, num-1);
       
   776     // We really don't want parent relative list layout here because findbox will be overwritten.
       
   777     // Just calculate list height and use that.
       
   778     TRect nullRect(0,0,0,0);
       
   779     TRect listItemRect = RectFromLayout(nullRect, AknLayoutScalable_Avkon::list_double_large_graphic_pane_cp2(0));
       
   780     listLayout.iH = (TInt16)(num * listItemRect.Height());
       
   781     listLayout.ib = ELayoutEmpty;
       
   782 
       
   783     aDef.iListRect.LayoutRect(window_rect, listLayout);
       
   784 
       
   785     //aDef.iListRect.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_list_menu_double_large_graphic_pane(heading?1:0, num-1));
       
   786 
       
   787     TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
       
   788     TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants__double__Line_2;
       
   789 
       
   790     // Combine two layouts togeher.
       
   791     if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
       
   792     if (part2.il != ELayoutEmpty) part1.il = part2.il;
       
   793     if (part2.it != ELayoutEmpty) part1.it = part2.it;
       
   794     if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
       
   795     if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
       
   796     if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
       
   797     if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
       
   798     aDef.iHeadingRect.LayoutRect(window_rect, part1);
       
   799 
       
   800     //MenuPopupWindowGraphics(aDef);
       
   801     }
       
   802 
       
   803 
       
   804 EXPORT_C void AknPopupLayouts::SetupPopupSNoteGroupWindow(TAknPopupWindowLayoutDef &aDef, TInt num, TBool /*heading*/)
       
   805     {
       
   806     // not used (at least by AvKon) - no need to remove magic numbers
       
   807     SetupDefaults(aDef);
       
   808     TRect window_rect = AknPopupLayouts::MenuRect(aDef);
       
   809     aDef.iListRect.LayoutRect(window_rect, 0, 3, 11, ELayoutEmpty, ELayoutEmpty, 168, 38+(57-38)*(num-2) );
       
   810     TAknWindowLineLayout part1 = AKN_LAYOUT_WINDOW_Pop_up_window_list_pane_descendants_Line_8;
       
   811     TAknWindowLineLayout part2 = AKN_LAYOUT_WINDOW_Menu_pop_up_window_descendants_Line_2;
       
   812 
       
   813     // Combine two layouts togeher.
       
   814     if (part2.iC != ELayoutEmpty) part1.iC = part2.iC;
       
   815     if (part2.il != ELayoutEmpty) part1.il = part2.il;
       
   816     if (part2.it != ELayoutEmpty) part1.it = part2.it;
       
   817     if (part2.ir != ELayoutEmpty) part1.ir = part2.ir;
       
   818     if (part2.ib != ELayoutEmpty) part1.ib = part2.ib;
       
   819     if (part2.iW != ELayoutEmpty) part1.iW = part2.iW;
       
   820     if (part2.iH != ELayoutEmpty) part1.iH = part2.iH;
       
   821 
       
   822     aDef.iHeadingRect.LayoutRect(window_rect, part1);
       
   823 
       
   824     TInt p = window_rect.Size().iHeight;
       
   825     const AknLayoutUtils::SAknLayoutRect shadow[] =
       
   826     {   
       
   827         { 0,0,0,ELayoutEmpty, ELayoutEmpty,   176, p },
       
   828         { 86,7,12,ELayoutEmpty, ELayoutEmpty,   167, p -16 },
       
   829         { 221,4,10,ELayoutEmpty, ELayoutEmpty,  169, p -15 },
       
   830         { 215,2,8,ELayoutEmpty, ELayoutEmpty,  170, p -14 },
       
   831         { 0,3,9,ELayoutEmpty, ELayoutEmpty,  168, p -16 }
       
   832     };
       
   833 
       
   834     aDef.iCover.LayoutRect(  window_rect, shadow[0]);
       
   835     aDef.iSecond.LayoutRect( window_rect, shadow[1]);
       
   836     aDef.iFirst.LayoutRect(  window_rect, shadow[2]);
       
   837     aDef.iOutline.LayoutRect(window_rect, shadow[3]);
       
   838     aDef.iInside.LayoutRect( window_rect, shadow[4]);    
       
   839     }
       
   840 
       
   841 
       
   842 
       
   843 EXPORT_C void AknPopupLayouts::CalcPopupMenuWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
       
   844     {
       
   845     TAknLayoutRect popup_menu_window;
       
   846     popup_menu_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_window(num-1));
       
   847     aDef.iWindowRect = popup_menu_window.Rect();
       
   848     aDef.iPopupMenuWindowOffset=TPoint(0,0);
       
   849     }
       
   850 EXPORT_C void AknPopupLayouts::CalcPopupMenuGraphicWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
       
   851     {
       
   852     TAknLayoutRect popup_menu_graphic_window;
       
   853     popup_menu_graphic_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_graphic_window(num-1));
       
   854     aDef.iWindowRect = popup_menu_graphic_window.Rect();
       
   855     aDef.iPopupMenuWindowOffset=TPoint(0,0);
       
   856     }
       
   857 EXPORT_C void AknPopupLayouts::CalcPopupMenuGraphicHeadingWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
       
   858     {
       
   859     TAknLayoutRect popup_menu_graphic_heading_window;
       
   860     popup_menu_graphic_heading_window.LayoutRect(aRect,AKN_LAYOUT_WINDOW_popup_menu_graphic_heading_window(num-1));
       
   861     aDef.iWindowRect = popup_menu_graphic_heading_window.Rect();
       
   862     aDef.iPopupMenuWindowOffset=TPoint(0,0);
       
   863     }
       
   864 EXPORT_C void AknPopupLayouts::CalcPopupMenuDoubleWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
       
   865     {
       
   866     TAknLayoutRect popup_menu_double_window;
       
   867     TInt items = 2;
       
   868     if (num == 2) items = 1;
       
   869     if (num == 1) items = 0;
       
   870     popup_menu_double_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_double_window(items));
       
   871     aDef.iWindowRect = popup_menu_double_window.Rect();
       
   872     aDef.iPopupMenuWindowOffset=TPoint(0,0);
       
   873     }
       
   874 
       
   875 EXPORT_C void AknPopupLayouts::CalcPopupMenuDoubleLargeGraphicWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
       
   876     {
       
   877     TAknLayoutRect popup_menu_double_large_graphic_window;
       
   878     TInt items = 2;
       
   879     if (num == 2) items = 1;
       
   880     if (num == 1) items = 0;
       
   881     popup_menu_double_large_graphic_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_menu_double_large_graphic_window(items));
       
   882     aDef.iWindowRect = popup_menu_double_large_graphic_window.Rect();
       
   883     aDef.iPopupMenuWindowOffset=TPoint(0,0);
       
   884     }    
       
   885 
       
   886 
       
   887 EXPORT_C void AknPopupLayouts::CalcPopupSNoteGroupWindow(TAknPopupWindowLayoutDef &aDef,TRect aRect, TInt num)
       
   888     {
       
   889     TAknLayoutRect popup_menu_snote_window;
       
   890     if (num-2 < 0) { num = 2; }
       
   891     popup_menu_snote_window.LayoutRect(aRect, AKN_LAYOUT_WINDOW_popup_snote_group_window(num-2));
       
   892     aDef.iWindowRect = popup_menu_snote_window.Rect();
       
   893     aDef.iPopupMenuWindowOffset=TPoint(0,0);
       
   894     }    
       
   895 
       
   896 
       
   897 EXPORT_C TRect AknPopupLayouts::WindowRect(TAknPopupWindowLayoutDef &aDef) {return aDef.iWindowRect; }
       
   898 
       
   899 EXPORT_C void AknPopupLayouts::ModifyWindowGraphicForHeading(TAknPopupWindowLayoutDef &aDef)
       
   900     {
       
   901     TRect nullRect(0,0,0,0);
       
   902     TAknLayoutRect nullHeadingRect;
       
   903     // find out, how much space is needed for heading (spaceForHeading was 23)
       
   904     nullHeadingRect.LayoutRect(nullRect,AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_1(nullRect));
       
   905     TInt spaceForHeading = nullHeadingRect.Rect().Height();
       
   906 
       
   907 
       
   908     aDef.iWindowRect.iTl.iY -= spaceForHeading; // This is necessary to position it correctly 
       
   909                                 // this is because b=0 in parent of coverrect and because
       
   910                                 // parent's height is used in the child...
       
   911 
       
   912     TRect window_rect = aDef.iWindowRect;
       
   913 
       
   914     aDef.iCover.LayoutRect(  window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_1(window_rect));
       
   915     aDef.iSecond.LayoutRect( window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_2(window_rect));
       
   916     aDef.iFirst.LayoutRect(  window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_3(window_rect));
       
   917     aDef.iOutline.LayoutRect(window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_4(window_rect));
       
   918     aDef.iInside.LayoutRect( window_rect, AKN_LAYOUT_WINDOW_Pop_up_menu_with_heading_window_graphics_Line_5(window_rect));
       
   919     
       
   920     aDef.iPopupMenuWindowOffset=TPoint(0,spaceForHeading);
       
   921     }
       
   922 
       
   923 EXPORT_C void AknPopupLayouts::ModifyWindowGraphicForMessageBox(TAknPopupWindowLayoutDef &aDef, TInt aNumberOfLines)
       
   924     {        
       
   925     TInt varietyIndex = 0;
       
   926     switch (aNumberOfLines)
       
   927         {       
       
   928         case (2): varietyIndex = 1;
       
   929         break;
       
   930         case (3): varietyIndex = 2;
       
   931         }
       
   932                                 
       
   933     TAknWindowLineLayout lay = AknLayoutScalable_Apps::loc_type_pane(varietyIndex).LayoutLine();
       
   934     TAknLayoutRect layout;
       
   935     layout.LayoutRect( TRect(0,0,0,0), lay );
       
   936     TRect messageRect( layout.Rect() );
       
   937     
       
   938     aDef.iWindowRect.iTl.iY -= messageRect.Height();
       
   939     }
       
   940 
       
   941 EXPORT_C void AknPopupLayouts::SetupDefaults(TAknPopupWindowLayoutDef &aDef)
       
   942     {
       
   943     aDef.iVertLineExt1.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
       
   944     aDef.iVertLineExt2.LayoutRect(TRect(1,1,1,1), 0, 0,0, ELayoutEmpty, ELayoutEmpty, 0,0);
       
   945     }
       
   946 
       
   947 
       
   948 EXPORT_C TAknPopupWindowLayoutDef::TAknPopupWindowLayoutDef()
       
   949     : iMaximumHeight(0)
       
   950     {
       
   951     
       
   952     }
       
   953 
       
   954 TRect AknPopupLayouts::RectFromLayout(TRect aParent, const TAknWindowComponentLayout &aComponentLayout)
       
   955     {
       
   956     TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine();
       
   957     TAknLayoutRect layoutRect;
       
   958     layoutRect.LayoutRect(aParent,lineLayout);
       
   959     return layoutRect.Rect();
       
   960     }
       
   961 
       
   962 // End of File