/*
* 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 the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
* which accompanies this distribution, and is available
* at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*     Layouts from pop-up windows. Mostly used for implementing list queries,
*     options menus, grouped soft notifications and other popup windows.
*
*/


#ifndef __AKNPOPUPLAYOUT__
#define __AKNPOPUPLAYOUT__

#include <aknutils.h>
#include <e32std.h>

struct TAknPopupWindowLayoutDef;
class CEikListBox;
class CAknPopupHeadingPane;
class CWindowGc;
class CCoeControl;
class CEikonEnv;
class TAknWindowComponentLayout;

const TInt EAknPopupLayoutsDynamic = 0x80;
const TInt EAknPopupLayoutsFind = 0x100;

/** The purpose of AknPopupLayouts class is to provide layouts
 *  for popup windows described in European Avkon LAF
 *  document.
 *  
 *  Applications should not use this class except for building custom
 *  layouts. The default layouts looks usually much nicer.
 *
 *  Applications cannot extend this class to add new layouts, but they
 *  can override virtual methods from the class that call methods from
 *  these classes.
 *
 *  These classes are used by
 *    1) List queries CAknListQueryDialog (aknquerydialog.cpp)
 *    2) options menus CEikMenuPane and CEikMenuBar (uikon/coctlsrc/eikmenup.cpp)
 *    3) popup windows CAknPopupList (aknpopup.cpp)
 *    4) grouped soft notifications
 *
 */
struct TAknPopupLayoutsNode;
struct TAknPopupLayoutsNode
{
	TAknPopupLayoutsNode *iNext;
	TInt iId;
	CCoeControl *iControl;
};
enum TAknPopupLayoutsNodeList
{
	EListNode = 0x5555,
	EHeadingNode,
	EWindowOwningNode,
	EMessageBoxNode,
    EFindBoxNode
};

class AknPopupLayouts
    {
public: 
    /** 
     *	If you ever want to add new items here, do not -- instead derive from
     * popuplist or list query and override SetupWindowLayout().
     * (or if you can modify avkon, then add them here to make it easier for apps to use
     * the new layout..)
     * There's example at aknGMSstylegrid.cpp how to make new popup window without avkon
     * modifications.
     */
    enum TAknPopupLayouts
	{
	// these are the standard popup windows
	EMenuWindow, // CAknSinglePopupMenuStyleListBox
	EMenuGraphicWindow, // CAknSingleGraphicPopupMenuStyleListBox
	EMenuGraphicHeadingWindow, // CAknSingleGraphicHeadingPopupMenuStyleListBox, CAknSingleHeadingPopupMenuStyleListBox
	EMenuDoubleWindow, // CAknDoublePopupMenuStyleListBox
	EMenuDoubleLargeGraphicWindow, // CAknDoubleLargeGraphicPopupMenuStyleListBox
	EPopupSNotePopupWindow,
    EMenuUnknownColumnWindow,       // for apps that use Column listboxes inside popup list
    EMenuUnknownFormattedCellWindow,// for apps that use Formatted cell listboxes inside popup list
	
	// these are versions of the popup windows which does not resize
	// themselves if you insert items. (they're full size from the
	// beginning)
	EDynMenuWindow = EMenuWindow + 0x80,
	EDynMenuGraphicWindow,
	EDynMenuGraphicHeadingWindow,
	EDynMenuDoubleWindow,
	EDynMenuDoubleLargeGraphicWindow	
	};

public: // interface for controls
    

   /** 
    * Implementation of SizeChanged() for a popup window control with a list inside
    *
    * This method calls setrect() on heading, listbox and window owning control
    * and expects the window owning control has listbox and heading in
    * its componentcontrols...
    */
    IMPORT_C static void HandleSizeChanged(TAknPopupWindowLayoutDef &aDef,
					   TAknPopupLayouts aLayout,
					   TAknPopupLayoutsNode *aListOfControls);
    IMPORT_C static void HandleSizeChanged(TAknPopupWindowLayoutDef &aDef, 
				  TAknPopupLayouts aLayout,
				  CAknPopupHeadingPane *aHeadingOrNull,
				  CEikListBox *aListBox,
				  CCoeControl *aWindowOwningControl);
   /** 
    * Implementation of Draw() for a popup window control with a list inside
    */    
    IMPORT_C static void HandleDraw(CEikonEnv* aEikEnv,
			   CWindowGc &aGc,
			   const TAknPopupWindowLayoutDef &aDef, 
			   CEikListBox *aListBox,
			   CAknPopupHeadingPane *aHeadingOrNull);


public: // interface for adding heading
   /** 
    * Adds a heading to popup window
    */
    IMPORT_C static void ModifyWindowGraphicForHeading(TAknPopupWindowLayoutDef &aDef);
    IMPORT_C static void ModifyWindowGraphicForMessageBox(TAknPopupWindowLayoutDef &aDef, TInt aNumOfLines);

public: // The implementation of different popup window styles.
   /** 
    * Calculates layout of popup_menu_window from LAF specification
    */
    IMPORT_C static void CalcPopupMenuWindow(TAknPopupWindowLayoutDef &aDef, 
					     TRect aClientRect, 
					     TInt aNumberOfLinesInListBox);
   /** 
    * Calculates layout of popup_menu_graphic_window from LAF specification
    */
    IMPORT_C static void CalcPopupMenuGraphicWindow(TAknPopupWindowLayoutDef &aDef,
						    TRect aClientRect, 
						    TInt aNumberOfLinesInListBox);
   /** 
    * Calculates layout of popup_menu_graphic_heading_window from LAF specification
    */
    IMPORT_C static void CalcPopupMenuGraphicHeadingWindow(TAknPopupWindowLayoutDef &aDef,
							   TRect aClientRect, 
							   TInt aNumberOfLinesInListBox);
   /** 
    * Calculates layout of popup_menu_double_window from LAF specification
    */
    IMPORT_C static void CalcPopupMenuDoubleWindow(TAknPopupWindowLayoutDef &aDef,
						   TRect aClientRect, 
						   TInt aNumberOfLinesInListBox);
   /** 
    * Calculates layout of popup_menu_double_large_graphic_window from LAF specification
    */
    IMPORT_C static void CalcPopupMenuDoubleLargeGraphicWindow(TAknPopupWindowLayoutDef &aDef,
							       TRect aClientRect, 
							       TInt aNumberOfLinesInListBox);
   /** 
    * Calculates layout of popup_snote_window from LAF specification
    */
    IMPORT_C static void CalcPopupSNoteGroupWindow(TAknPopupWindowLayoutDef &aDef, 
						   TRect aClientRect, 
						   TInt aNumberOfLinesInListBox);

    /**
     * Setup a border for the window
     */
    IMPORT_C static void SetupMenuPopupWindow(TAknPopupWindowLayoutDef &aDef, 
					      TInt aNumberOfLinesInListBox, 
					      TBool aHeading);
    /**
     * Setup a border for the window
     */
    IMPORT_C static void SetupPopupMenuGraphicWindow(TAknPopupWindowLayoutDef &aDef, 
						     TInt aNumberOfLinesInListBox,
						     TBool aHeading);
    /**
     * Setup a border for the window
     */
    IMPORT_C static void SetupPopupMenuGraphicHeadingWindow(TAknPopupWindowLayoutDef &aDef, 
							    TInt aNumberOfLinesInListBox, 
							    TBool aHeading);
    /**
     * Setup a border for the window
     */
    IMPORT_C static void SetupPopupMenuDoubleWindow(TAknPopupWindowLayoutDef &aDef, 
						    TInt aNumberOfLinesInListBox, 
						    TBool aHeading);    
    /**
     * Setup a border for the window
     */
    IMPORT_C static void SetupImageSelectionMenuPopupWindow(TAknPopupWindowLayoutDef &aDef,
							    TInt num, 
							    TBool heading);
    /**
     * Setup a border for the window
     */
    IMPORT_C static void SetupPopupSNoteGroupWindow(TAknPopupWindowLayoutDef &aDef,
						    TInt num,
						    TBool heading);

    
public: // interface to setup listbox and popup heading pane. (used by HandleSizeChanged)
    IMPORT_C static void HandleSizeAndPositionOfComponents(const TAknPopupWindowLayoutDef &aDef, 
						  CCoeControl *aContentInsidePopup,
						  CAknPopupHeadingPane *aHeadingOrNull);
    IMPORT_C static void SetupDefaults(TAknPopupWindowLayoutDef &aDef);
public: // Utilities
    /**
     * Access to different coordinate transformations needed to setup popup windows
     */
    IMPORT_C static TRect WindowRect(TAknPopupWindowLayoutDef &aDef);
    /**
     * Access to different coordinate transformations needed to setup popup windows
     */
    IMPORT_C static TRect MenuRect(TAknPopupWindowLayoutDef &aDef);
    /**
     * Check integer range
     */
    IMPORT_C static void CheckRange(TInt &aValue, TInt aMin, TInt aMax);
    /**
     * Helper for building popup window layout
     */
    IMPORT_C static void MenuPopupWindowGraphics(TAknPopupWindowLayoutDef &aDef);

    static TRect RectFromLayout(TRect aParent, const TAknWindowComponentLayout &aComponentLayout);
    };

/** TAknPopupWindowLayoutDef
 * collects all LAF specification lines that are needed for popup windows
 *
 */

struct TAknPopupWindowLayoutDef
    {
    IMPORT_C TAknPopupWindowLayoutDef();
    TAknLayoutRect iListRect;
    TAknLayoutRect iHeadingRect;
    
    TAknLayoutRect iCover;
    TAknLayoutRect iSecond;
    TAknLayoutRect iFirst;
    TAknLayoutRect iOutline;
    TAknLayoutRect iInside;
    
    TAknLayoutRect iVertLineExt1;
    TAknLayoutRect iVertLineExt2;

    // the window position relative to clientrect
    TRect iWindowRect;

    // popup_menu_window position relative to iWindowPos
    TPoint iPopupMenuWindowOffset;
    TInt iMaximumHeight;
    };

#endif



