/*
* Copyright (c) 2002-2007 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: 
*     General Avkon Utilities. Includes:
*       - listbox utilities
*       - layout utilities
* 
*
*/


#ifndef __AKNUTILS_H__
#define __AKNUTILS_H__

#include <eiktxlbm.h>
#include <avkon.hrh>
#include <avkon.rsg>
#include <coedef.h>
#include <coecobs.h>
#include <w32std.h>
#include <gulalign.h>
#include <gulutil.h>
#include <eikenv.h>
#include <biditext.h>
#include <eiksbfrm.h>
#include <AknsConstants.h>
#include <aknenv.h>
#include <AknLayout.lag>

// These are for listbox column lengths (These are used to allocate memory from stack while drawing listboxes, they should be as small as possible, but not smaller!)
const TInt KMaxColumnDataLength = 80; // This is maximum length of data for one listbox column -- after that the data is truncated before drawing.
const TInt KMaxTotalDataLength = 8*KMaxColumnDataLength;  // max of 5 columns can have full 80 characters...

/** AVKON utility module
 *
 * From this file, you can find several tools for making application development easier for S60
 *
 * 1) Conversion modules to convert coordinate data from european LAF to usable formats
 *     AknLayoutUtils, TAknLayoutRect, TAknLayoutText
 * 2) Utilities to clip text
 * 3) Part of selection service implementation
 * 4) Different classes that help using listboxes
 * 5) Handling colors in AKN_LAF_COLOR macro.
 * 6) Resource readers for different purposes
 * 7) Utility to find files without specifying the drive letter or path
 */


class CCoeControl;
class CEikTextListBox;
class CEikColumnListBox;
class CEikFormattedCellListBox;
class CGulIcon;
class CEikSettingsListBox;
class CAknLAF;
class CEikImage;
class CEikMfne;
class CEikListBox;
class CEikLabel;
class CEikEdwin;
class CEikMenuPane;
class CAknPopupField;
class CListBoxView;
class CAknColumnListBox;
class CEikSecretEditor;
class CFindExtension;
class CAknLayoutFont;
class TAknFontSpecification;
class CAknAppUiBase;
class TAknWindowLineLayout;
class TAknMultiLineTextLayout;
class TAknTextLineLayout;

/**
 * Egul library had methods to clip text from right side, this class includes methods to clip from both sides.
 * It does add 3 dots to the end of the text.
 */
const TInt  KDefaultClipWidth = -1;
const TUint KDefaultClipChar  = TUint(0x2026);

// Constant to use in AknLayoutUtils to indicate that the parameter is not to be used as a override value
const TInt KAknLayoutUtilsDoNotOverride = -1;

/**
* Text utilities.
* Text truncating and wrapping methods in this class do not support 
* text that requires conversion from logical to visual form,
* e.g. Arabic/Hebrew, Thai and Hindi text. Code that needs to support that
* kind of text should use corresponding methods in AknBidiTextUtils instead.
*/
class AknTextUtils 
    {
public:
    enum TClipDirection
    {
    EDoNotClip,
    EClipFromEnd,
    EClipFromBeginning
    };
    /** ClipToFit() Generic clipping
    
    @param aBuffer         String that needs to be clipped. will be modified by this call
    @param aFont           Font used in the code
    @param aMaxWidthInPixels Maximum length of text that will not be clipped.
    @param aDir            Where is the text clipped from. EDoNotClip, EClipFromEnd, EClipFromBeginning.
    @param aClipWidth      The length of the text after clipping. KDefaultClipWidth will make it use aMaxWidthInPixels.
    @param aClipString     The representation of three dots. (not really used anywhere - use the default value always or "")
       
    returns true if the text was clipped and 3 dots were added. 
    */
    
    IMPORT_C static TBool ClipToFit(TDes& aBuffer,
                                    const CFont& aFont, 
                                    TInt aMaxWidthInPixels,
                                    TClipDirection aDir=EClipFromEnd,
                                    TInt aClipWidth = KDefaultClipWidth,
                                    const TDesC &aClipString=_L("..."));

    /** ClipToFit() for clipping text inside lists
     *
     * NOTICE: This method cannot handle situation where the text may dynamically change its size! Especially when you have bitmaps on the right side!
     *
     * This needs to be done AFTER the listbox has done its SizeChanged()!
     */
    IMPORT_C static TBool ClipToFit(TDes& aBuffer, 
                                    TClipDirection aDir,
                                    CEikFormattedCellListBox *aListBox,
                                    TInt aItemIndex,
                                    TInt aSubCellNumber);

    /** ClipToFit() for clipping text inside lists
     *
     * NOTICE: This method cannot handle situation where the text may dynamically change its size! Especially when you have bitmaps on the right side!
     *
     * This needs to be done AFTER the listbox has done its SizeChanged()!
     */
    IMPORT_C static TBool ClipToFit(TDes& aBuffer,
                                    TClipDirection aDir,
                                    CEikColumnListBox *aListBox,
                                    TInt aItemIndex,
                                    TInt aColumnNumber);

    // implementation

    static TBool DoClipToFit(
        TDes& aBuffer,
        const CFont& aFont,
        TInt aMaxWidthInPixels,
        TClipDirection aDir,
        TInt aClipWidth,
        const TDesC& aClipString );

    /**
    * Wraps a string to an array of pointers.
    * The number of lines and line widths are specified by aLineWidthArray.
    * The pointers in aWrappedArray point to positions inside aWrappedString.
    *
    * @param aStringToWrap      String that needs to be wrapped
    * @param aLineWidthArray    Line widths in pixels
    * @param aFont              Used font
    * @param aWrappedArray      Pointers to wrapped lines
    */
    IMPORT_C static void WrapToArrayL( 
        const TDesC& aStringToWrap,
        const CArrayFix<TInt>& aLineWidthArray,
        const CFont& aFont,
        CArrayFix<TPtrC>& aWrappedArray);

    /**
    * Wraps a string to an array of pointers.
    * Constant line width is given.
    * The pointers in aWrappedArray point to positions inside aWrappedString.
    *
    * @param aStringToWrap      String that needs to be wrapped
    * @param aLineWidth         Constant line width in pixels
    * @param aFont              Used font
    * @param aWrappedArray      Pointers to wrapped lines
    */
    IMPORT_C static void WrapToArrayL( 
        const TDesC& aStringToWrap,
        TInt aLineWidth,
        const CFont& aFont,
        CArrayFix<TPtrC>& aWrappedArray );

    /**
    * Wraps a string to an array of pointers and clips at the end
    * of the last line if there aren't enough lines to accomodate
    * the entire text. When clipping three dots are inserted at the
    * end of the last line.
    * The number of lines and line widths are specified by aLineWidthArray.
    * The pointers in aWrappedArray point to positions inside aWrappedString.
    *
    * Expect the string to be modified if clipping is needed.
    * (Clipping character KEllipsis is inserted at the ending point)
    *
    * @param aStringToWrap      String that needs to be wrapped
    * @param aLineWidthArray    Line widths in pixels
    * @param aFont              Used font
    * @param aWrappedArray      Pointers to wrapped lines
    */
    IMPORT_C static void WrapToArrayAndClipL( 
        TDes& aStringToWrap,             
        const CArrayFix<TInt>& aLineWidthArray, 
        const CFont& aFont,                     
        CArrayFix<TPtrC>& aWrappedArray );       
    
    /**
    * Chops a string when a line break character is encountered.
    * Clips at the end of each line if there isn't enough space
    * on that line.
    * When clipping, KEllipsis (shown as 3 dots) is inserted at
    * the end of the line.
    * The number of lines and line widths are specified by aLineWidthArray.
    * The pointers in aChoppedArray point to positions inside aStringToChop.
    *
    * Expect the string to be modified if clipping is needed
    * (Clipping character KEllipsis is inserted in the end of the lines)
    *
    * @param aStringToChop      String that needs to be chopped
    * @param aLineWidthArray    Line widths in pixels
    * @param aFont              Used font
    * @param aChoppedArray      Pointers to chopped lines
    */
    IMPORT_C static void ChopToArrayAndClipL(
        TDes& aStringToChop,             
        const CArrayFix<TInt>& aLineWidthArray, 
        const CFont& aFont,                    
        CArrayFix<TPtrC>& aChoppedArray);

    /**
    * Chops a string when a line break character is encountered.
    * Clips at the end of each line if there isn't enough space
    * on that line.
    * When clipping, KEllipsis (shown as 3 dots) is inserted at
    * the end of the line.
    * Constant line width is given.
    * The pointers in aChoppedArray point to positions inside aStringToChop.
    *
    * Expect the string to be modified if clipping is needed
    * (Clipping character KEllipsis is inserted in the end of the lines)
    *
    * @param aStringToChop      String that needs to be chopped
    * @param aLineWidth         Constant line width in pixels
    * @param aFont              Used font
    * @param aChoppedArray      Pointers to chopped lines
    */
    IMPORT_C static void ChopToArrayAndClipL(
        TDes& aStringToChop,             
        TInt aLineWidth, 
        const CFont& aFont,                    
        CArrayFix<TPtrC>& aChoppedArray );

    /**
    * Wraps a string (aStringToWrap) into lines according to the
    * number of lines and line widths specified in aLineWidthArray. 
    * Inserts '\n' at the end of lines. 
    * Copies the result into aWrappedString.
    * Leaves if aWrappedString isn't big enough.
    *
    * @param aStringToWrap      String that needs to be wrapped
    * @param aLineWidthArray    Lines widths in pixels
    * @param aFont              Used font
    * @param aWrappedString     Wrapped string 
    */
    IMPORT_C static void WrapToStringL( 
        const TDesC& aStringToWrap,
        const CArrayFix<TInt>& aLineWidthArray,
        const CFont& aFont,
        TDes& aWrappedString );

   /**
    * Wraps a string (aStringToWrap) into lines according to the
    * number of lines and line widths specified in aLineWidthArray. 
    * Inserts '\n' at the end of lines. 
    * Clips the last line if there aren't enough lines to
    * fit the entire string. 
    * Copies the result into aWrappedString.
    * Leaves if aWrappedString isn't big enough.
    *
    * @param aStringToWrap      String that needs to be wrapped
    * @param aLineWidthArray    Width of lines in pixels
    * @param aFont              Used font
    * @param aWrappedString     Wrapped string 
    */
    IMPORT_C static void WrapToStringAndClipL(
        const TDesC& aStringToWrap, 
        const CArrayFix<TInt>& aLineWidthArray, 
        const CFont& aFont, 
        TDes& aWrappedString ); 

    /**
     * This routine is used to strip away a set of characters from
     * a descriptor.
     *
     * Useful for example for listboxes to make sure strings from
     * network or typed by the end user does not have tab or linefeed
     * characters. (as those will make listbox broken.)
     * 
     * @param   aDes         Parameter to change
     * @param   aCharacters  A set of characters to remove
     *
     * There exists predefined character sets to remove:
     *    KAknStripTabs
     *    KAknStripListControlChars  (\t's and \n's and \r's)
     */
    IMPORT_C static void StripCharacters(TDes &aDes, const TDesC &aCharacters);

    /**
     * This routine is used to replace all control chars with a single 
     * character, usually a whitespace.
     *
     * @param   aDes         Parameter to change
     * @param   aCharacters  A set of characters to remove
     * @param   aReplacement a character used as replacement
     *
     *    KAknReplaceTabs
     *    KAknReplaceListControlChars  (\t's and \n's)
     */
    IMPORT_C static void ReplaceCharacters(TDes &aDes, const TDesC &aChars, TChar aReplacement);

    /**
     * This routine is used to remove extra whitespaces from text before 
     * showing on screen
     *
     * @param   aDes                   Parameter to change
     * @param   aWhiteSpaceCharacters  A set of whitespace characters to remove
     */
    IMPORT_C static void PackWhiteSpaces(TDes &aDes, const TDesC &aWhiteSpaceChars);
    
    // non-exported implementation

    static void WrapToStringL(
        const TDesC& aStringToWrap, 
        const CArrayFix<TInt>& aLineWidthArray, 
        const CFont& aFont, 
        TDes& aWrappedString,
        TInt aFlags,
        TInt aDirectionality );

    static void WrapToArrayL( 
        TDes& aStringToWrap,
        const CArrayFix<TInt>* aLineWidthArray, 
        const CFont& aFont,
        CArrayFix<TPtrC>& aWrappedArray,
        TInt aLineWidth,
        TInt aFlags,
        TInt aDirectionality );

    static void ChopToArrayAndClipL(
        TDes& aStringToChop,             
        const CArrayFix<TInt>* aLineWidthArray,
        const CFont& aFont,                 
        CArrayFix<TPtrC>& aChoppedArray,
        TInt aLineWidth );    

    /**
    * This utility is used to see if a text is empty according to the conventions of 
    * Avkon.
    *
    * @param    aTextToTest
    * @return   ETrue if the text is empty according to Avkon
    */
    static TBool IsEmptyText( const TDesC& aTextToTest );

    /**
     * This routine is used to convert between arabic-indic digits and european digits.
     * based on existing language setting. So it'll convert any digit from the string
     * to use either european digits or arabic-indic digits based on current settings.
     *
     * NOTE: THis method can be also called in european release. The method is required
     * to do the correct thing with all the languages.
     *
     * This method should only be used just before displaying the number as unicode string.
     * Also, never store the converted string as unicode.
     *
     * @since 2.0
     * @param   aDes                    Parameter to change
     */
    IMPORT_C static void LanguageSpecificNumberConversion(TDes &aDes);

    /**
     * This routine is used to convert digits from any digit format to another format eg. from 
     * european digits to arabic-indic digits.
     *
     * @since 2.0
     * @param aDes                      Parameter to change. It can contain digits from several digit types.
     * @param aDigitType                Destination digit type.
     */
    IMPORT_C static void ConvertDigitsTo( TDes& aDes, TDigitType aDigitType );

    /**
    * Convenience routine to obtain the directionality of the current input language
    * This routine will attempt to access this information in a system-efficient way.
    *
    * This is not to be confused with either the directionality of the display text 
    * language or (a closely associated concept) the layout direction of the UI 
    * (accessed via AknLayoutUtils::LayoutMirrored() )
    * 
    * @since 2.0
    * @return TBidiText::ELeftToRight if the current input language is left to right
    *         TBidiText::ERightToLeft if the current input langauge is right to left     
    */
    IMPORT_C static TBidiText::TDirectionality CurrentScriptDirectionality();

    /**
    * Method used to constrain the digit type to use to that consisted with the current input language
    * 
    * @since 2.0
    * @returns TDigitType consistent with the current input language
    */
    static TDigitType InputLanguageFilteredDigitType();

    /**
    * Method used to constrain the digit type to use to that consisted with the current display text language
    * 
    * @since 2.0
    * @returns TDigitType consistent with the current input language
    */
    static TDigitType DisplayTextLanguageFilteredDigitType();

    /**
    * Returns the digit type to be used for editors that are purely numeric in quality.
    *
    * @since 2.0
    * @returns TDigitType to use for purely numeric editors
    */ 
    IMPORT_C static TDigitType NumericEditorDigitType();

    /**
     * This routine is used to convert between arabic-indic digits and european digits.
     * based on existing language setting. So it'll convert any digit from the string
     * to use either european digits or arabic-indic digits based on current settings.
     *
     * This routine builds in the constraints imposed by current display text languages. 
     *
     * The number of characters in the buffer is not changed by this routine. It can therefore be 
     * safely used easily with existing (modifiable) descriptors.
     *
     * This method should only be used just before displaying the number as unicode descriptor.
     * Never store the converted string.
     *
     * @since 2.0
     * @param   aDes                    Parameter to change
     */
    IMPORT_C static void DisplayTextLanguageSpecificNumberConversion(TDes &aDes);
  
    /**
    * Returns the digit type to be used for editors that are alphanumeric.
    * (Note that these editors may be configurable to be purely numeric - that is have a numeric
    * mode, but they remain alphanumeric editors for the sake of this API.)
    *
    * This may be useful for instance for input processors that convert numeric key events to the 
    * currently set input digit type.
    *
    * @since 2.0
    * @returns TDigitType to editors with alphanumeric capability
    */ 
    IMPORT_C static TDigitType TextEditorDigitType();

    enum TDigitModeQueryType {
        EDigitModeEditorDefault, // in editors by default whether western or foreign digits are used (gen.editors, both text and numbers)
        EDigitModeUserModifiableEditor, // in editors whether user can modify digitmode with keypad
        EDigitModeShownToUser, // in all components when displaying digits
        EDigitModeNumberEditor, // number, time, date, notification texts (1st group of editors)
        EDigitModeLatinNumberEditor // e-mail, password, PIN codes, etc. (3rd group, where only latin can be used)
    };
    /**
     * This routine can be used to check what modes digits can be on.
     *
     * It uses input language, display language and the setting from general settings
     * to calculate whether foreign digits need to be used.
     *
     * This is useful for editor implementation and anyone that needs to convert
     * digits for display.
     * 
     * @since 2.0
     * @param aQueryType   what is the situation where the digits are to be used.
     * @returns ETrue to indicate whether digit conversions need to be used.
     * @returns EFalse to indicate that no conversion is needed.
     */
    IMPORT_C static TBool DigitModeQuery(TDigitModeQueryType aQueryType = EDigitModeShownToUser);

    /** 
     * Converts a filename ABCDE.EXT to format which is suitable for display.
     * This method is needed for bi-directional language support.
     * The method adds directionality markers to the filename so that the
     * filename can correctly be rendered to screen.
     *
     *
     * @since 2.6
     * @param aDes contains the file name in logical format. 
     * @returns file name in logical format with needed directionality markers.
     */
    IMPORT_C static HBufC* ConvertFileNameL(const TDesC& aDes);


    /**
    * @deprecated
    * Do not use. This method will be removed.
    */
    IMPORT_C static HBufC* LoadScalableTextL(CCoeEnv& aCoe, TInt aResourceId);

    /**
    * @deprecated
    * Do not use. This method will be removed.
    */
    IMPORT_C static HBufC* LoadScalableTextLC(CCoeEnv& aCoe, TInt aResourceId);

    /**
    * @deprecated
    * Do not use. This method will be removed.
    */
    IMPORT_C static TInt LoadScalableText(CCoeEnv& aCoe, TInt aResourceId, TDes& aBuffer ); 

    /**
    * @deprecated
    * Do not use. This method will be removed.
    */
    IMPORT_C static HBufC* ClipAccordingScreenOrientationLC(CCoeEnv& aCoe, HBufC* aBuf); 

    /**
    * Utility method used in scalable UI for choosing the longest fitting text variant.
    * Truncating and wrapping methods in classes AknTextUtils and AknBidiTextUtils do
    * the choice by themselves, so whenever they are used to process the text, it is not
    * necessary to call this method.
    *
    * Applications do not need to call this method if they pass their localized texts
    * to Avkon's UI components.
    *
    * @since 2.8
    * 
    * @param aText Text containing one or many variants with varying text widths,
    * separated with the character 0x0001. The text is supposed to be 
    * in logical order.
    * @param aFont Font used to render the text.
    * @param aMaxWidthInPixels Max width in pixels.
    *
    * @ret Longest fitting text. If none of the variants fits,
    * the shortest one in pixels is returned.
    */
    IMPORT_C static TPtrC ChooseScalableText(
        const TDesC& aText,
        const CFont& aFont,
        TInt aMaxWidthInPixels );
    };

_LIT(KAknStripTabs, "\t");
_LIT(KAknStripListControlChars, "\t\n");
_LIT(KAknReplaceTabs, "\t");
_LIT(KAknReplaceListControlChars, "\t\n");
_LIT(KAknCommonWhiteSpaceCharacters, " \n\t\r");

/**
 * These are part of Selection service and they should be called by application's HandleCommandL() to get
 * menus and cba's handled automatically for selection service.
 *
 * The right way to implement these would be to have dialogs with names "Selection List", "MultiSelection List"
 * and "Markable list" and make them keep a listbox inside it. (look at CAknPopupList, it does similar things)
 *
 * See CAknSelectionListDialog and CAknMarkableListDialog from aknselectionlist.h, they provide better
 * interface for applications.
 */
class AknSelectionService
    {
public:
    /** Helper function to implement ProcessCommandL() for selection list dialogs
     */
    IMPORT_C static void HandleSelectionListProcessCommandL(
        TInt aCommand,
        CEikListBox* aListBox);

    /** Helper function to implement ProcessCommandL() for selection list dialogs
     */
    IMPORT_C static void HandleMultiselectionListProcessCommandL(
        TInt aCommand,
        CEikListBox* aListBox);

    /** Helper function to implement ProcessCommandL() for markable list dialogs
     */
    IMPORT_C static void HandleMarkableListProcessCommandL(
        TInt aCommand,
        CEikListBox* aListBox);

    /** Helper function to implement ProcessCommandL() for menu lists
     */
    IMPORT_C static TKeyResponse HandleMenuListOfferKeyEventL(
        const TKeyEvent& aKeyEvent,
        TEventCode aType,
        CEikListBox* aListBox);

    /** Helper function to implement DynInitMenuPaneL() for markable list dialogs
     */
    IMPORT_C static void HandleMarkableListDynInitMenuPane(
        TInt aResourceId,
        CEikMenuPane *aMenu,
        CEikListBox *aListBox);

    /** Helper function to implement DynInitMenuPaneL() for markable list dialogs
     */
    IMPORT_C static void HandleMarkableListDynInitMenuItem(
        CEikMenuPane *aMenu,
        CEikListBox *aListBox,
        TInt aCommandId,
        TBool aCanBeAppliedToMultipleItems);

    /** Helper function to implement command handling for markable list dialogs
     */
    IMPORT_C static void HandleMarkableListUpdateAfterCommandExecution(
        CEikListBox *aListBox);

    /** Helper function to position list highlight correctly after item removal
     */
    IMPORT_C static void HandleItemRemovalAndPositionHighlightL(
        CEikListBox *aListBox,
        TInt aValueOfCurrentItemIndexBeforeRemoval,
        TBool aCurrentItemWasRemoved);

    // This one updates selectionindexes too.
    /** Helper function to position list highlight correctly after item removal
     *
     * It also updates selection index array based on information about which
     * items were removed.
     */
    IMPORT_C static void HandleItemRemovalAndPositionHighlightL(
        CEikListBox *aListBox,
        TInt aValueOfCurrentItemIndexBeforeRemoval,
        CArrayFix<TInt> &aIndexesOfRemovedItemsBeforeRemoval);
    };



class CAknSearchField;

/** 
 * This class implements find requirements from component specifications. This
 * class works also as documentation of how to use different find components.
 * (The implementation has been copied from the example application which 
 * implements find and replaced the code with calls to these static functions).
 *
 * There is no reason for an application to use this class directly. 
 * Application should use CAknSelectionListDialog instead. This class is public
 * only because sometimes it is necessary to access the low level behaviour of
 * find to implement similar functionality in places independent of find; or if
 * @c CAknSelectionListDialog is not used for some reason.
 */
class AknFind
    {
public:

    /*
     * Implements the event handlers for the find pane. This method must be
     * called when a @c ProcessCommandL event is received and a find pane is on
     * the screen.
     *
     * @param aCommand Command id.
     * @param aListBox Pointer to listbox control.
     * @param aSearchField Pointer to search field control.
     * @param aParentControl Parent control.
     */
    IMPORT_C static void HandleFindPopupProcessCommandL(
                        TInt aCommand, 
                        CEikListBox* aListBox, 
                        CAknSearchField* aSearchField, 
                        CCoeControl* aParentControl);
    
    /*
     * Handles key events for the find pane. This method must be called when
     * control receives @c OfferKeyEventL event.
     *
     * @param aKeyEvent The key event.
     * @param aType The type of key event:@c TEventCode.
     * @param aListBoxParent Pointer to the parent control.
     * @param aListBox Pointer to listbox control.
     * @param aSearchField Pointer to search field control.
     * @param isFindPopup @c ETrue if popup find pane, @c EFalse if normal find
     *        pane.
     * @param aNeedRefresh @c ETrue when find pane is redrawn.
     */    
    IMPORT_C static TKeyResponse HandleFindOfferKeyEventL(
                        const TKeyEvent& aKeyEvent, 
                        TEventCode aType, 
                        CCoeControl* aListBoxParent, 
                        CEikListBox* aListBox, 
                        CAknSearchField* aSearchField, 
                        TBool isFindPopup, 
                        TBool &aNeedRefresh);

    /*
     * Do not use this method.
     *
     * @deprecated Use @c AknFind::HandleFixedFindSizeChanged() and 
     *             @c AknFind::HandlePopupFindSizeChanged instead.
     *        
     */
    IMPORT_C static void HandleFindSizeChanged(
            CCoeControl* aParentControl, 
            CEikListBox* aListBox, 
            CAknSearchField* aSearchField, 
            TBool ispopup = ETrue, 
            TInt aFindWindowResourceId = R_AVKON_POPUP_FIND_WINDOW, 
            TInt aListAreaId = R_AVKON_LIST_GEN_PANE, 
            TInt aListResourceIdWithFindPopup = 
                                R_AVKON_LIST_GEN_PANE_WITH_FIND_POPUP, 
            TInt aFindWindowParentResourceId = 
                                R_AVKON_MAIN_PANE_WITH_STATUS_PANE);

    /** 
     * This is the new typesafe (and easier to use) version of @c
     * HandleFindSizeChanged(). Use this instead of (deprecated) @c
     * HandleFindSizeChanged().
     *
     * @param aParentControl Parent control.
     * @param aListBox Column list, optional and available only with column 
     *                 lists.
     * @param aSearchField Pointer to search field control.
     */
    IMPORT_C static void HandleFixedFindSizeChanged(
            CCoeControl* aParentControl,
            CAknColumnListBox* aListBox, // only available with column lists
            CAknSearchField* aSearchField);
    
    /** 
     * This is the new typesafe(and easier to use) version of @c 
     * HandleFindSizeChanged(). Use this instead of (deprecated) @c
     * HandleFindSizeChanged().
     *
     * @param aParentControl Parent control.
     * @param aListBox Pointer to listbox control.
     * @param aSearchField Pointer to search field control.
     */
    IMPORT_C static void HandlePopupFindSizeChanged(
                            CCoeControl* aParentControl,
                            CEikListBox* aListBox,  //available with all lists.
                            CAknSearchField* aSearchField);
    
    /**
     * Creates layout for a find pane and for a list. This method must be called
     * in @c SizeChanged() method of an container.
     *
     * @since 2.6
     *
     * @param aParentControl Parent control.
     * @param aListBox Pointer to listbox control.
     * @param aSearchField Pointer to search field control.
     * @param aFindWindow LAF specific table line for find window.
     * @param aListArea LAF specific table for list box area.
     * @param aIsPopup @c ETrue if popup find pane, @c EFalse if normal find
     *        pane.
     * @param aFindWindowParent LAF specific table line for find parent.
     */
    IMPORT_C static void HandleFindSizeChangedLayouts(
                            CCoeControl* aParentControl, 
                            CEikListBox* aListBox, 
                            CAknSearchField* aSearchField, 
                            const TAknWindowLineLayout& aFindWindow,
                            const TAknWindowLineLayout& aListArea,
                            TBool aIsPopup,
                            const TAknWindowLineLayout& aFindWindowParent );

public:

    /**
     * Checks if @c aItemText matches @c aSearchText. 
     *
     * @param aItemText List box item text.
     * @param aSearchText Searched text.
     * 
     * @return @c ETrue if list box item text @c aItemText matches @c 
     *         aSearchText otherwise @c EFalse.
     */
    IMPORT_C static TBool IsFindMatch(const TDesC& aItemText, 
                                      const TDesC& aSearchText);

    /**
     * Tests if aCh is a word separator character as described in S60.
     *
     * @param aCh Comperative character.
     *
     * @return @c ETrue if aCh is a word separator character as described in
     * S60 otherwise @c EFalse.
     */
    IMPORT_C static TBool IsFindWordSeparator(TChar aCh);

    
    /**
     * Checks if @c aItemText matches @c aSearchText. 
     * Calls UpdateNextCharsL() if findutil is not supported.
     *
     * @since 5.0
     * @param aItemText List box item text.
     * @param aSearchText Searched text.
     * @param aNextChars Reference to the next characters for the adaptive search grid
     *        The HBufC buffer may be re-allocated by this method. 
     *        In that case the pointer reference is modified to point to the re-allocated object.     
     * 
     * @return @c ETrue if list box item text @c aItemText matches @c 
     *         aSearchText otherwise @c EFalse.
     */
    IMPORT_C static TBool IsAdaptiveFindMatch( const TDesC& aItemText, 
			    		       const TDesC& aSearchText,			
			       		       HBufC*& aNextChars );

    /**
     * Update next characters if find pane state was changed.
     *
     * @since 5.0
     * @param aNextChars Next characters for the adaptive search grid
     * @param aCh Criteria from the search field.    
     */
    static void UpdateNextCharsL( HBufC*& aNextChars, TChar aCh );
    
    /**
     * For Devanagari adaptive search     
     * Update next characters if find pane state was changed.
     *
     * @since 5.0
     * @param aNextChars reference to the next characters for the adaptive search grid
     * @param aItemString string we are searching.    
     */
    static void UpdateNextCharsL( HBufC*& aNextChars, const TDesC& aItemString );
    
    /**
     * Update next chars from the list box item text, when search field if empty.
     * This need to be done for update next characters for adaptive grid
     * works faster then calling IsAdaptiveFindMatch(). 
     *
     * @since 5.0
     * @param aNextChars Reference to the next characters for the adaptive search grid
     *        The HBufC buffer may be re-allocated by this method. 
     *        In that case the pointer reference is modified to point to the re-allocated object.     
     * @param aItemString List box item text.
     */
    IMPORT_C static void UpdateNextCharsFromString( HBufC*& aNextChars, const TDesC& aItemString );

    /**
     * Update next chars from the list box item text according to the bitflag.
     * Use to exclude columns from the listbox string. For example icon index columns. 
     *
     * @since 5.0
     * @param aInputText List box item text
     * @param aColumnFlag The bit flag shows which columns take into account
     * @param aOutText Updated list box item text accoding to bit flag
     */
    IMPORT_C static void UpdateItemTextAccordingToFlag( const TDesC& aInputText, 
		  		 			TBitFlags32 aColumnFlag, 
							TDes& aOutText );

    /**
     * Helper function to handle find pane's visibility.
     *
     * @param aSearchField Pointer to search field control.
     * @param ispopup @c ETrue if popup find pane, @c EFalse if normal find 
     *        pane.
     * @param textchanged @c ETrue when text in @c CAknSearchField has changed.
     * @param aNeedRefresh @c ETrue when find pane is redrawn.
     */
    static void HandleFindPaneVisibility(CAknSearchField* aSearchField, 
                                         TBool ispopup, 
                                         TBool textchanged, 
                                         TBool &aNeedRefresh);
    };


/** 
 * Utility class to initialize editor control. Use this in conjunction with @c
 * AknLayoutUtils::LayoutEdwin(). The class is not fully implemented yet.
 */
class AknEditUtils
    {
    public:
    
    /** Basic elements that are needed for the basic editing functions. */
    struct SAknEditorParameters 
    {
        /** The maximum available space that can be used for one text. */
        TInt iEditingSpace;
        
        /** Size of the editing window. */
        TInt iEditingWindow;
        
        /**
         * Character case effects on the style of entering characters.
         * Available alternatives are Upper case, Lower case and Text case.
         */ 
        TInt iCharacterCase;
        
        /** 
         * Specifies from which edge the current line is filled with the
         * inserted characters.
         */
        TInt iJustification;
        
        /** Is user allowed to move the insertion point. */ 
        TBool iAllowedToMoveInsertionPoint;
        
        /** Is cursor blinking or not. */
        TBool iCursorYesNo;
        
        /** Is overflow active or not.  */  
        TBool iOverflowYesNo;
    };

    IMPORT_C static void ConstructEditingL(CEikEdwin* aEdwin, TInt aResourceId);
    IMPORT_C static void ConstructEditingL(CEikEdwin* aEdwin, TResourceReader& aReader);
    IMPORT_C static void ConstructEditingL(CEikEdwin* aEdwin, const SAknEditorParameters &aParams);

/**
 *  Configures edwin editor. Use AknLayoutUtils::LayoutEdwin() with this method.
 *
 *  @param aEdwin Edwins created with new.
 *  @param aEditingSpace maximum number of characters for the editor
 *  @param aEditingWindow maximum number of lines in the editor
 *  @param aCharacterCase initial character case:
 *          EAknEditorCharactersUpperCase = EAknEditorUpperCase,
 *          EAknEditorCharactersLowerCase = EAknEditorLowerCase,
 *          EAknEditorCharactersTextCase = EAknEditorTextCase,
 *          EAknEditorCharactersTitleCase = EAknEditorTitleCase
 *
 *  @param aJustification alignment for the editor text ( EAknEditorAlignCenter, 
 *         EAknEditorAlignLeft, EAknEditorAlignRight)
 *  @param aAllowedToMoveInsertionPoint user can move cursor
 *  @param aCursorYesNo is cursor visible or not.
 *  @param aOverflowYesNo
 */
    IMPORT_C static void ConstructEditingL(CEikEdwin* aEdwin, 
                       TInt aEditingSpace, 
                       TInt aEditingWindow, 
                       TInt aCharacterCase, 
                       TInt aJustification, 
                       TBool aAllowedToMoveInsertionPoint, 
                       TBool aCursorYesNo, 
                       TBool aOverflowYesNo);
                       
/**
 *  Configures edwin editor. Use AknLayoutUtils::LayoutEdwin() with this method.
 *  
 *  @param aEdwin Edwins created with new.
 *  @param aEditingSpace maximum number of characters for the editor
 *  @param aEditingWindow maximum number of lines in the editor
 *  @param aCharacterCase initial character case:
 *          EAknEditorCharactersUpperCase = EAknEditorUpperCase,
 *          EAknEditorCharactersLowerCase = EAknEditorLowerCase,
 *          EAknEditorCharactersTextCase = EAknEditorTextCase,
 *          EAknEditorCharactersTitleCase = EAknEditorTitleCase
 *
 *  @param aJustification alignment for the editor text ( EAknEditorAlignCenter, 
 *         EAknEditorAlignLeft, EAknEditorAlignRight)
 *  @param aAllowedToMoveInsertionPoint user can move cursor
 *  @param aCursorYesNo is cursor visible or not.
 *  @param aOverflowYesNo
 *  @param aIsResizeable is edwin resizeable (one line editor should use EFalse, in order to have proper scrolling)
 */
    IMPORT_C static void ConstructEditingL(CEikEdwin* aEdwin, 
                                              TInt aEditingSpace, 
                                              TInt aEditingWindow, 
                                              TInt aCharacterCase, 
                                              TInt aJustification, 
                                              TBool aAllowedToMoveInsertionPoint, 
                                              TBool aCursorYesNo, 
                                              TBool aOverflowYesNo,
                                              TBool aIsResizable);

    };

/** Automatic numbering for list items. (DEPRECATED)
 * Just create this kind of object and attach it to a listbox, and you'll
 * have automatic numbering. 
 *
 *
 * You'll need to call UpdateL() each time you modify the listbox's model!
 */
class CListBoxNumbers : public CBase
    {
public:
    IMPORT_C CListBoxNumbers(CEikTextListBox* aListBox);
    IMPORT_C void ConstructL();
    IMPORT_C void UpdateL();
private:
    CEikTextListBox* iListBox;
    };

class CAknListBoxFilterItems;

    /** 
    * This class shows how application should build its model for filtered
    * items. Application should not use this directly, if it has it's own model
    * or if there's any special things needed for @c MatchableTextArray.
    * Application can derive from this though. All listboxes use 
    * @c CAknFilteredTextListBoxModel by default. @c CreateFilter() call 
    * enables it.
    * @since S60 0.9
    */
class CAknFilteredTextListBoxModel : public CTextListBoxModel, public MDesCArray
    {
public: // public interface for apps
    /**
    * Creates a @c CAknListBoxFilterItems and thus enables filtering of list
    * items.
    * @param aListBox List box from which one or more items can be selected.
    * @param aSearchField Search field control.
    */
    IMPORT_C void CreateFilterL(CEikListBox* aListBox, CAknSearchField* aSearchField);
    /**
     * removes previously added filter from model
     */
    IMPORT_C void RemoveFilter();
    /**
    * Access function for the filter.
    * @return Pointer to the listbox filter.
    */
    IMPORT_C CAknListBoxFilterItems* Filter() const;
    /**
    * Destructor.
    */
    IMPORT_C ~CAknFilteredTextListBoxModel();
public: // from CTextListBoxMode
    /**
    * Implementation of @c CTextListBoxModel::NumberOfItems()
    * @return The number of items the list box has.
    */
    IMPORT_C virtual TInt NumberOfItems() const;
    /**
    * Returns the text of the specified item.
    * @param aItemIndex Index to the item.
    * @return The text of item in given index.
    */
    IMPORT_C virtual TPtrC ItemText(TInt aItemIndex) const;
public: // from MEikTextListBoxModel (default filtering string conversions)
    /**
    * Implementation of @c CTextListBoxModel::MatchableTextArray()
    * @return Pointer to the text array.
    */
    IMPORT_C const MDesCArray* MatchableTextArray() const;

private:
    CAknListBoxFilterItems* iFilter; // owned
private: // From MdesCArray (these implement default matchabletextarray for filtering.)
    IMPORT_C TInt MdcaCount() const;
    IMPORT_C TPtrC MdcaPoint(TInt aIndex) const;
private: // from MListBoxModel
    IMPORT_C virtual TAny* MListBoxModel_Reserved();
    };

    /** 
    * Listbox item filtering. This class is designed to be stored inside
    * a listbox model and the model should call this in its @c NumberOfItems()
    * and @c ItemText() implementation. The model must be given to this class
    * and it must have @c MatchableTextArray() implemented correctly.
    * @c HandleOfferKeyEvent() should be called from the same offer key event
    * implementation which forwards the keys to listbox and search field
    * 
    * If you have both markable list and find at the same time, you should call
    * @c ResetFiltering() before executing the command for marked items. This
    * ensures that the ListBox's @c SelectionIndexes() returns all items instead
    * of only those items that are visible. Selected *items can be found under
    * @c CAknListBoxFilterItems::SelectionIndexes().
    *
    * @since S60 0.9
    * 
    */
class CAknListBoxFilterItems : public CBase, public MCoeControlObserver
    {
public:
    /**
    * Base class default constructor.
    * @param aListBox Listbox to be filtered,
    * @param aSearchField Listbox search field.
    * @param aModel Listbox model,
    * @param aView A list box view that displays the list items which are
    * currently visible in a list box.
    */
    IMPORT_C CAknListBoxFilterItems(
        CEikListBox *aListBox,
        CAknSearchField *aSearchField,
        MListBoxModel *aModel,
        CListBoxView *aView);

    /**
    * This is for setting empty list text.
    */
    IMPORT_C void ConstructL(); // for setting empty list text.
    /** 
    * This function is to be called when filter is cleared.
    */
    IMPORT_C void ResetFilteringL();
    /** 
    * This function will update filter items state from the search field and
    * listbox. Also updates selection indexes.
    */
    IMPORT_C void UpdateCachedDataL(); // updates iOldSearchCriteria and selection indexes.
    /**
    * Destructor. Frees all resources owned by the object prior to its
    * destruction.
    */
    IMPORT_C ~CAknListBoxFilterItems();    

public: 
    /** 
    * This one gives all indices, not just the ones that are visible.
    * @return Pointer to the array that has all indices.
    */
    IMPORT_C CArrayFix<TInt> *SelectionIndexes();
    /** 
    * This will synchronise the selection indices from the listbox.
    * If you use @c SelectionIndexes(), call this before it.
    * This is heavy operation and goes through all list items.
    */
    IMPORT_C void UpdateSelectionIndexesL();
    /** 
    * This will synchronise the selected index from the listbox.
    * If you use @c SelectionIndexes(), call this before it.
    * This is heavy operation and goes through all list items. 
    * @param aVisibleIndex Index to be updated.
    */
    IMPORT_C void UpdateSelectionIndexL(TInt aVisibleIndex);

public: // Applications should call this in their listbox model implementation
    /** 
    * This is used to ask how many list items are available after filter has
    * been used. Counts visible list items.
    * @return Number of items visible.
    */
    IMPORT_C TInt FilteredNumberOfItems() const;
    /** 
    * This is used to fetch the content of a list item after filter has been
    * used.
    * @param aVisibleItemIndex The index of visible item.
    * @return Index to the original item array.
    */
    IMPORT_C TInt FilteredItemIndex(TInt aVisibleItemIndex) const;

public: // Needed to change the correct item.

    /** 
    * Returns number of original list items.
    * @return Number of all items.
    */
    IMPORT_C TInt NonFilteredNumberOfItems() const; // this always returns >= FilteredNumberOfItems()
    /** 
    * Finds the list item on the screen when the item array index is given.
    * @param aOriginalIndex Item index.
    * @return Matching index from original array. Returns -1 if the Index is
    * not visible.
    */
    IMPORT_C TInt VisibleItemIndex(TInt aOriginalIndex) const;
public: 
    /** 
    * For building @c MdcaPoint() of the model's @c MatchableTextArray.
    * This method builds the default value for @c MatchableTextArray.
    * @param aText Pointer descriptor.
    * @return Modified text.
    */
    IMPORT_C TPtrC DefaultMatchableItemFromItem(TPtrC aText);

public: 
    /** 
    * Applications should call this in @c OfferKeyEventL() which gives keys to
    * listbox and search field.
    */
    IMPORT_C void HandleOfferkeyEventL();

   
    /** 
    * When you change the list item array you should call this method.
    */
    IMPORT_C void HandleItemArrayChangeL();

public: // MCoeControlObserver
    /**
    * Sets the observer.
    * @param aObserver Pointer to the observer.
    */
    IMPORT_C void SetObserver(MCoeControlObserver *aObserver);
    /**
    * Editor sends messages to this object as control events.
    * @param aControl The control that sent the event.
    * @param aEventType The event type.
    */
    IMPORT_C void HandleControlEventL(CCoeControl *aControl, TCoeEvent aEventType);

public: // For FEP
    /**
    * Sends key events to FEP. This is used to resend key event to FEP if
    * @c AknFind's @c HandleOfferKeyEventL() gets the key while search field
    * has no focus. If search field has a focus, the key events go directly to
    * the editor and this is not called.
    * @param aValue The character code for an @c EEventKey.
    */
    IMPORT_C void DeferredSendKeyEventToFepL(TUint aValue);
    /**
    * This gets called from @c DeferredSendKeyEventToFepL().
    * This does the actual sending of a key event. Does not support more than
    * one event at the time.
    * @param aFilterItems Pointer to the @c CAknListBoxFilterItems object.
    * @return Always returns 0.
    */
    static TInt IdleCallBack(TAny *aFilterItems);

public: // For size changed
    /**
    * @c AknFind uses this to inform us who is the parent control owning the
    * listbox and search field. This control should be window-owning control and
    * it will be used to resize the listbox when changes to the filtering
    * happens.
    * @param aControl Pointer to the control.
    */
    IMPORT_C void SetParentControl(CCoeControl *aControl);
   /**
    * @c AknFind uses this to inform us that we have popup find. Applications 
    * shouldn't call this.
    */
    IMPORT_C void SetPopup();

public: // For detaching and attaching list, findbox, model and view...
    /**
    * Attaches or detaches list used by the filtering.
    * @since S60 2.0
    * @param aListBox Pointer to listbox or @c NULL.
    */
    IMPORT_C void SetListBox(CEikListBox *aListBox);
    /**
    * Attaches or detaches find pane used by the filtering.
    * @since S60 2.0
    * @param aSearchField Pointer to findbox or @c NULL.
    */
    IMPORT_C void SetSearchField(CAknSearchField *aSearchField);
    /**
    * Attaches or detaches list model used by the filtering.
    * @since S60 2.0
    * @param aModel a pointer to list model or @c NULL.
    */
    IMPORT_C void SetModel(MListBoxModel *aModel);
    /**
    * Attaches or detaches list view used by the filtering.
    * @since S60 2.0
    * @param aView a pointer to list view or @c NULL.
    */
    IMPORT_C void SetView(CListBoxView *aView);
    
public:
    /**
    * This function just returns pointer to the search field.
    * @return Pointer to the search field.
    */
    IMPORT_C CCoeControl *FindBox() const;

    /**
     * An improved version of DeferredSendKeyEventToFepL. It sends a 
     * @c TKeyEvent rather than just key code. Thus the correct key 
     * event can be send to FEP on QWERTY keyboard.
     * @since S60 5.0
     * @param aEvent Event send to FEP.
     */
    void DeferredSendFullKeyEventToFepL(const TKeyEvent& aEvent);

private:
    void NoCriteriaL(TBool aUpdateAS = ETrue); // remove criteria completely.
    void TightenCriteriaL(const TDesC& aCriteria); // slow operation (do when adding new characters to search criteria)
    void ReleaseCriteriaL(const TDesC& aCriteria); // very slow operation (do when removing characters from search criteria)
    // EmptyListText handling
    void InstallEmptyTextL();
    void UninstallEmptyTextL();
    // Selections -- these methods form a pair, 
    // you must call Fetch first and then push.
    void FetchSelectionIndexesFromListBoxL();
    void PushSelectionIndexesToListBoxL();
    void ClearNextChars();
    TBool IsAdaptiveSearch() const; 	

    // HandleItemAddition without ResetFilteringL() call
    void HandleItemAdditionL();
    void HandleItemRemovalL();
private:
    TBool IsItemVisible(const TDesC& aMatchableItemString, const TDesC& aSearchText);
    static TBool IsSeparatorCharacter(TChar c);
    TBool IsItemSelected(TInt aRealIndex) const;
private:
    CArrayFix<TInt> *iShownIndexes; // own // uses non-filtered indexes
    CArrayFix<TInt> *iSelectionIndexes; // own   // this uses non-filtered indexes
    HBufC *iOldSearchCriteria; // own
    MListBoxModel *iModel;
    CListBoxView *iView;
    TInt iOldItemCount;
    HBufC* iEmptyListText; // own
    CEikListBox* iListBox;
    CAknSearchField* iSearchField;
    TBuf<256> iMatchableText;
    MCoeControlObserver *iObserver;
    CFindExtension *iExtension;
    TUint iKeyValue;
    CCoeControl *iParentControl;
    TBool iIsPopup;
    TBool iDisableChangesToShownIndexes;  
    };


/** Removing optimization that breaks listbox views 
 * A view which removes optimization from CListBoxView which breaks with lists where all items are not
 * the same layout.
 * Use it like this: 
 *   CListBoxView* MakeViewClassInstanceL() { return new(ELeave) NoOptimizationView<CListBoxView>; }
 */
template<class T>
class NoOptimizationView : public T
    {
public:
    virtual void VScrollTo(TInt aNewTopItemIndex, TRect& aMinRedrawRect)
    {
    // AVKON LAF
    if (this->RedrawDisabled())
        return;
    if (this->iTopItemIndex == aNewTopItemIndex)
        return;
    aMinRedrawRect.SetRect(this->iViewRect.iTl,this->iViewRect.Size());
    this->SetTopItemIndex(aNewTopItemIndex);
    this->Draw(&aMinRedrawRect);
    // end of AVKON LAF
    }
    };


/** This is private class, do not use it except for drawing controls!
 * 
 * Do not use it in applications.
 */


class AknLAFUtils 
    {
public:
    static void DrawLines(CGraphicsContext* aGc, 
                  const TRect& mainpane,
                  TInt x);
    IMPORT_C static void ReplaceColumn(TPtr aTarget, TDesC* aSource,
                                       TDesC* aReplacement, TChar aColumnSeparator,
                                       TInt aColumn);
    };


/**
 * Resource reader class
 *
 * This is utility class for reading listbox resouces.
 *
 * This should be derived from and it reads resource file for you.
 *
 * This seems to be only used by listbox resource readers. (Do not use it in applications)
 */
struct SAknLayoutGfx;
struct SAknLayoutText;
struct SAknLayoutCmd;
struct SAknLayoutGfx;
// Not for apps
struct SAknLayoutPos 
    {
    TInt l, t, r, b, W, H;

    typedef SAknLayoutPos ItemType;
    static void ReadResource(TResourceReader& aReader, ItemType& aTarget);    
    };
template<class T> class CArrayReader;
class CAknGenericReader : public CBase
    {
public:
    IMPORT_C void ConstructL(TInt aResourceId);
    IMPORT_C virtual void ConstructFromResourceL(TResourceReader& aReader);
    IMPORT_C ~CAknGenericReader();

    IMPORT_C const SAknLayoutGfx* GfxItem(TInt aIndex) const;
    IMPORT_C const SAknLayoutText* TextItem(TInt aIndex) const;
    IMPORT_C const SAknLayoutCmd* CmdItem(TInt aIndex) const;
    IMPORT_C const SAknLayoutGfx* AreaItem(TInt aIndex) const;

    CArrayReader<SAknLayoutGfx>* iGfx;
    CArrayReader<SAknLayoutText>* iText;
    CArrayReader<SAknLayoutCmd>* iCmd;
    CArrayReader<SAknLayoutGfx>* iArea;
    };





// Use this to mark that the position in LAF specification is empty.
const TInt AknLayoutUtilsNoValue = ELayoutEmpty;

/** Utility classes to build layout based on European LAF from resource files. (can be used by applications)
 *
 * Methods in this class are designed to be called from your control's SizeChanged() method!
 *
 * This class knows the specification's coordinate data format and ensures that different types of
 * controls are positioned and setup correctly according to European LAF. 
 * 
 * This class helps you with positioning labels, controls, rects and other things to according to LAF specification.
 * (It is NOT trivial to get it correct and this adjusts easily to changes in the LAF specification - if you're not
 * using this, remember to read the whole LAF specification - especially the beginning and the end with color and
 * especially how text margins and widths interact!!)
 *
 * (idea of this class is that when specification of one component changes, only resource file needs to be changed and when you 
 * get new product with new specification format, only this module needs to be changed and resources rewritten from the specification. 
 * And when component's specification changes, only the component need to be changed (usually only change is what components are
 * inside it and how it calls this module.).. => all controls have common format that decides its layout!
 *
 * Parent rectangles are always coordinates of LAF specification's parent rectangle in the screen.
 * 
 * To use this, call one of the methods in your SizeChanged() and then you'll need to make sure you
 * draw the area between controls using ClearBetweenRects() call from egul library. (CCoeControl::Rect() helps with that...)
 *
 * A Tip: You do not want to use any dynamic calculation of layouts! It is almost always an error to do so!
 *        => Do not allow layouts that have not been specified!
 *
 * (If LAF spec has many numbers and you need to dynamically choose between them, then keep the numbers in
 * code as function-local using SAknLayoutText/SAknLayoutRect/... -structs..)
 *
 * You'll want to use TAknLayoutRect and TAknLayoutText too to build layout
 * for your custom controls.
 */
class AknLayoutUtils
    {
public:

    struct SAknLayoutText
    {
    TInt iFont, iC, iL, iR, iB, iW, iJ;
    };
    struct SAknLayoutTextMultiline
    {
    TInt iFont, iC, iL, iR, iB, iW, iJ, iNumberOfLinesShown, iNextLineB;
    };
    typedef SAknLayoutTextMultiline SAknLayoutLabel;
    typedef SAknLayoutTextMultiline SAknLayoutEdwin;
    typedef SAknLayoutText SAknLayoutMfne;
    typedef SAknLayoutText SAknLayoutSecEd;
    struct SAknLayoutRect
    {
    TInt iC, iL, iT, iR, iB, iW, iH;
    };
    typedef SAknLayoutRect SAknLayoutControl;
    typedef SAknLayoutRect SAknLayoutImage;

    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutLabel(CEikLabel* aLabel,
                                     const TRect& aLabelParent,
                                     TInt aResourceId,
                                     const CFont* aCustomFont=0);

    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutLabel(CEikLabel* aLabel,
                                     const TRect& aLabelParent,
                                     TResourceReader& aReader,
                                     const CFont* aCustomFont=0);

    /** Layouts a label via a structure of layout parameters
    @param aLayout   the structure
     */
    IMPORT_C static void LayoutLabel(CEikLabel* aLabel,
                                     const TRect& aLabelParent,
                                     const SAknLayoutLabel& aLayout,
                                     const CFont *aCustomFont=0);

    /** Layouts a label via a layout compiler output
    @param aLayout   a define from aknlayout.lag file
     */
    IMPORT_C static void LayoutLabel(CEikLabel* aLabel,
                                     const TRect& aLabelParent,
                                     const TAknMultiLineTextLayout& aLayout,
                                     const CFont *aCustomFont=0);

    /** Layouts a label via a layout compiler output
    @param aLayout   a define from aknlayout.lag file
     */
    IMPORT_C static void LayoutLabel(CEikLabel* aLabel,
                                     const TRect& aLabelParent,
                                     const TAknTextLineLayout& aLayout,
                                     const CFont *aCustomFont=0);

    /** Layouts a label via parameters from the specification
    @param aLayout   a define from aknlayout.lag file
    @param font      font id, ELatinPlain12, ELatinBold12, ELatinBold13, ELatinBold17, ELatinBold19 etc..
    @param C         colour index, 0..255
    @param l         left margin
    @param r         right margin
    @param B         Baseline from top of the parent rectangle
    @param W         text width in pixels
    @param J         justification. ELayoutAlignNone; ELayoutAlignCenter; ELayoutAlignLeft; ELayoutAlignRight; ELayoutAlignBidi
    @param NextLineB baseline of 2nd line for multi-line labels/editors
    @param aCustomFont   a font used, if resource file uses EFontCustom
     */
    IMPORT_C static void LayoutLabel(CEikLabel* aLabel,
                                     const TRect& aLabelParent,
                                     TInt font, TInt C,
                                     TInt l, TInt r,
                                     TInt B, TInt W,
                                     TInt J, TInt NextLineB=0,
                                     const CFont* aCustomFont=0);

    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutEdwin(CEikEdwin* aEdwin,
                                     const TRect& aEdwinParent,
                                     TInt aResourceId,
                                     TInt aNumberOfLines = 0,
                                     const CFont* aCustomFont=0,
                                     TBool aMinimizeEdwinView=EFalse);
    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutEdwin(CEikEdwin* aEdwin,
                                     const TRect& aEdwinParent,
                                     TResourceReader& aReader,
                                     TInt aNumberOfLines = 0,
                                     const CFont* aCustomFont=0,
                                     TBool aMinimizeEdwinView=EFalse);

    /** Layouts an editor via a structure of layout parameters
    @param aLayout   the structure
     */
    IMPORT_C static void LayoutEdwin(CEikEdwin* aEdwin,
                                     const TRect& aEdwinParent,
                                     const SAknLayoutEdwin& aLayout,
                                     const CFont* aCustomFont=0,
                                     TBool aMinimizeEdwinView=EFalse);

    /** Layouts an editor via a structure of layout parameters
    @param aLayout   the structure
     */

    IMPORT_C static void LayoutEdwin( CEikEdwin* aEdwin,
                                      const TRect& aEdwinParent,
                                      const TAknMultiLineTextLayout& aLayout,
                                      const CFont* aCustomFont=0,
                                      TBool aMinimizeEdwinView=EFalse);

    IMPORT_C static void LayoutEdwin( CEikEdwin* aEdwin,
                                      const TRect& aEdwinParent,
                                      const TAknMultiLineTextLayout& aLayout,
                                      TAknsQsnTextColorsIndex aOverrideColor,
                                      const CFont* aCustomFont=0,
                                      TBool aMinimizeEdwinView=EFalse ); 
        


    IMPORT_C static void LayoutEdwin( CEikEdwin* aEdwin,
                                      const TRect& aEdwinParent,
                                      const TAknTextLineLayout& aLayout,
                                      const CFont* aCustomFont=0,
                                      TBool aMinimizeEdwinView=EFalse );

    IMPORT_C static void LayoutEdwin( CEikEdwin* aEdwin,
                                      const TRect& aEdwinParent,
                                      const TAknTextLineLayout& aLayout,
                                      TAknsQsnTextColorsIndex aOverrideColor,
                                      const CFont* aCustomFont=0,
                                      TBool aMinimizeEdwinView=EFalse );

    /** 
    * Routine to perform standard layout of a CEikEdwin editor.  Two elements from the S60 layout data are required: 
    * The rectangle of the containing layout element, and the TAknTextLineLayout object created for the contained text pane element. 
    * 
    * Override parameters can be supplied for a different number of lines, a different baseline separation,
    * or substituted skin color. Various "Do Not Override" values are to be passed if the values passed in aLayout are to be used. 
    * Refer to the parameters' documentation.
    * 
    * The lower extent of the editor to be laid out (whether driven by the NumberOfLinesToShow() 
    * feature of the TAknTextLineLayout object, or overridden by aNumberOfLinesToShowOverRide)
    * will not extend below the lower limit of the rectangle aEdwinParent.  Thus the number of
    * lines formatted is limited, and is available as an output parameter.
    * 
    * The height of the editor is also restricted by any value previously set in 
    * CEikEdwin::SetMaximumHeightInLines().
    * 
    * @since 3.1 
    * 
    * @param aEdwin          pointer to the editor to be laid out 
    * @param aEdwinParent    rectangle of the containing layout element 
    * @param aLayout         object representing the layout of the text pane implemented by this editor 
    * @param aNumberOfLinesToShowOverride  number of lines overriding aLayout, if not KAknLayoutUtilsDoNotOverride 
    * @param aBaselineSeparationOverride   vertical separation of baselines overriding aLayout, if not KAknLayoutUtilsDoNotOverride 
    * @param aOverrideColor      Avkon Skins color index to override with, if 
    *                            not (TAknsQsnTextColorsIndex)KAknLayoutUtilsDoNotOverride 
    * @param aNumberOfVisibleLines  Number of lines of editor actually laid out.
    */ 
    IMPORT_C static void LayoutEdwin( CEikEdwin* aEdwin,
                         const TRect& aEdwinParent,
                         const TAknTextLineLayout& aLayout,
                         TInt aNumberOfLinesToShowOverRide,
                         TInt aBaselineSeparationOverRide,
                         TAknsQsnTextColorsIndex aOverrideColor, 
                         TInt& aNumberOfVisibleLines );
                                 
    /** Layouts an editor via parameters from the specification
    @param aLayout   a define from aknlayout.lag file
    @param font      font id, ELatinPlain12, ELatinBold12, ELatinBold13, ELatinBold17, ELatinBold19 etc..
    @param C         colour index, 0..255
    @param l         left margin
    @param r         right margin
    @param B         Baseline from top of the parent rectangle
    @param W         text width in pixels
    @param J         justification. ELayoutAlignNone; ELayoutAlignCenter; ELayoutAlignLeft; ELayoutAlignRight; ELayoutAlignBidi
    @param aNumberOfLinesShown number of lines visible for the editor
    @param NextLineB baseline of 2nd line for multi-line labels/editors
    @param aMinimizeEdwinView whether to use minimum size. You need to use MinimizedEdwinRect() if you use ETrue here.
     */
    IMPORT_C static void LayoutEdwin( CEikEdwin* aEdwin,
                                      const TRect& aEdwinParent,
                                      TInt font,
                                      TInt C,
                                      TInt l,
                                      TInt r,
                                      TInt B,
                                      TInt W,
                                      TInt J,
                                      TInt aNumberOfLinesShown,
                                      TInt aNextLineBaseline,
                                      const CFont* aCustomFont=0 ,
                                      TBool aMinimizeEdwinView=EFalse );

    IMPORT_C static void LayoutEdwin( CEikEdwin* aEdwin,
                                      const TRect& aEdwinParent,
                                      TInt font,
                                      TInt C,
                                      TInt l,
                                      TInt r,
                                      TInt B,
                                      TInt W,
                                      TInt J,
                                      TInt aNumberOfLinesShown,
                                      TInt aNextLineBaseline,
                                      TAknsQsnTextColorsIndex aOverrideColor,
                                      const CFont* aCustomFont=0 ,
                                      TBool aMinimizeEdwinView=EFalse );
    /** Use this, if you give aMinimizeEdwinView to LayoutEdwin as true.
     * The edwin will not draw the whole rectangle allocated for the control.
     */
    IMPORT_C static TRect MinimizedEdwinRect(const CEikEdwin *aEdwin);


    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutMfne(CEikMfne* aMfne,
                                    const TRect& aMfneParent,
                                    TInt aResourceId);
    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutMfne(CEikMfne* aMfne,
                                    const TRect& aMfneParent,
                                    TResourceReader& aReader);

    IMPORT_C static void LayoutMfne(CEikMfne* aMfne,
                                    const TRect& aMfneParent,
                                    const SAknLayoutMfne& aLayout);

    IMPORT_C static void LayoutMfne(CEikMfne* aMfne,
                                    const TRect& aMfneParent,
                                    const TAknTextLineLayout& aLayout);

    IMPORT_C static void LayoutMfne(CEikMfne* aMfne,
                                    const TRect& aMfneParent,
                                    TInt font, TInt C, TInt l, TInt r,
                                    TInt B, TInt W, TInt J);

    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutControl(CCoeControl* aControl, 
                                       const TRect& aControlParent,
                                       TInt aResourceId);
    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutControl(CCoeControl* aControl,
                                       const TRect& aControlParent,
                                       TResourceReader& aReader);

    IMPORT_C static void LayoutControl(CCoeControl* aControl,
                                       const TRect& aControlParent,
                                       const SAknLayoutControl& aLayout);

    IMPORT_C static void LayoutControl(CCoeControl* aControl, 
                                       const TRect& aControlParent,
                                       const TAknWindowLineLayout& aLayout);

    IMPORT_C static void LayoutControl(CCoeControl* aControl,
                                       const TRect& aControlParent,
                                       TInt /*C*/, TInt l, TInt t, TInt r, TInt b,
                                       TInt W, TInt H);

    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static void LayoutImage(CEikImage* aImage,
                                     const TRect& aParent,
                                     TInt aResourceId);
    /**
    * Deprecated! Do not use!
    */    
    IMPORT_C static void LayoutImage(CEikImage* aImage, 
                                     const TRect& aParent,
                                     TResourceReader& aReader);

    IMPORT_C static void LayoutImage(CEikImage* aImage, 
                                     const TRect& aParent,
                                     const SAknLayoutControl& aLayout);

    IMPORT_C static void LayoutImage(CEikImage* aImage,
                                     const TRect& aParent,
                                     const TAknWindowLineLayout& aLayout);

    IMPORT_C static void LayoutImage(CEikImage* aImage,
                                     const TRect& aParent,
                                     TInt C, TInt l, TInt t, TInt r, TInt b,
                                     TInt W, TInt H);

    /** Sets CEikSecretEditor's position, colors and fonts based on LAF specification
     *
     */
    IMPORT_C static void LayoutSecretEditor(CEikSecretEditor* aSecEd,
                                            const TRect& aParent,
                                            const SAknLayoutText& aLayout);

    IMPORT_C static void LayoutSecretEditor(CEikSecretEditor* aSecEd,
                                            const TRect& aParent,
                                            const TAknTextLineLayout& aLayout);

public:
    /** Different conversions
     * Fonts: ELatinPlain12, ELatinBold12, ELatinBold13, ELatinBold17, ELatinBold19, ENumberPlain5, EClockBold30, ELatinClock14, EFontCustom
     *        EAknLogicalFontPrimaryFont, EAknLogicalFontSecondaryFont, EAknLogicalFontTitleFont,
     * Alignments: ELayoutAlignNone, ELayoutAlignCenter, ELayoutAlignLeft, ELayoutAlignRight, ELayoutAlignBidi with these..
     */
    IMPORT_C static TRect TextRectFromCoords(const TRect& aParent,
                                             const CFont* aFont,
                                             TInt l, TInt r,
                                             TInt B, TInt W,
                                             TInt LB = 0);

    IMPORT_C static TRect RectFromCoords(const TRect& aParent,
                                         TInt l, TInt t, TInt r, TInt b,
                                         TInt W, TInt H);

    /**
    * Method to return a useable system font reference from a S60 font enumeration from among
    * the supported list.
    * 
    * This method should only be used if application code needs to render its own graphics. That is, it
    * is not using S60 controls and furthermore not using the recommended methods 
    * AknLayoutUtils::LayoutEdwin(), AknLayoutUtils::LayoutLabel() or AknLayoutUtils::LayoutSecretEditor(). 
    * 
    * Fonts returned by this are not recommended to be stored in clients' member data, but should be
    * accessed when they are required for use.
    *
    * Applications that are written to run with their layout dynamically adapting to different screen sizes 
    * should use only the values found in the S60 logical font enumeration, TAknLogicalFontId.
    * 
    * @param aFontId        Input S60 font id.
    * @param aCustomFont    Font to return if aFontId is given as EFontCustom
    * @return               const pointer to a system font, or aCustomFont
    */
    IMPORT_C static const CFont* FontFromId(TInt aFontId, const CFont* aCustomFont=0);

    /**
    * Method to return a system font reference from a S60 font id. This will always conform to type CAknLayoutFont
    * 
    * This method should only be used if application code needs to render its own graphics. That is, it
    * is not using S60 controls and furthermore not using the recommended methods 
    * AknLayoutUtils::LayoutEdwin(), AknLayoutUtils::LayoutLabel() or AknLayoutUtils::LayoutSecretEditor(). 
    * 
    * Fonts returned by this are not recommended to be stored in clients' member data, but should be
    * accessed when they are required for use.
    *
    * Applications that are written to run with their layout dynamically adapting to different screen sizes 
    * should use only the values found in the S60 logical font enumeration, TAknLogicalFontId.
    * 
    * @param aFontId        Input S60 font id.
    * @param aCustomFont    Font to return if aFontId is given as EFontCustom
    * @return               const pointer to a system font, or aCustomFont
    */
    IMPORT_C static const CAknLayoutFont* LayoutFontFromId(TInt aId, 
                                                           const CAknLayoutFont *aCustomFont = 0);

    /**
    * Return a fully constructed CAknLayoutFont object based upon the specification passed in.
    * The Avkon font specifiation object uses TAknFontCategory to determine the font. 
    *
    * The font object is returned as non-const, since it is owned and will eventually be deleted by the client.
    * 
    * @param aSpec     S60 font specification object
    * @return               pointer to a CAknLayoutFont object, owned by the caller
    */
    IMPORT_C static CAknLayoutFont* CreateLayoutFontFromSpecificationL( 
        const TAknFontSpecification& aSpec );

    /**
    * Return a fully constructed CAknLayoutFont object based upon the typeface and specification passed in.
    * The TTypeface object contains a typeface name that is used as the primary key to select a font.  
    * The S60  font specifiation object is also used, but any value of TAknFontCategory passed in is reset to 
    * EAknFontCategoryUndefined, and is not used to select the font. 
    *
    * The font object is returned as non-const, since it is owned and will eventually be deleted by the client.
    * 
    * @param aTypeface      Symbian Typface object
    * @param aSpec             S60 font specification object
    * @return                       pointer to a CAknLayoutFont object, owned by the caller
    */
    IMPORT_C static CAknLayoutFont* CreateLayoutFontFromSpecificationL( 
        const TTypeface& aTypeface, 
        const TAknFontSpecification& aSpec);

    /**
    * Deprecated! Do not use!
    */
    IMPORT_C static const CFont* FontFromName(const TDesC& aName); 

    IMPORT_C static CGraphicsContext::TTextAlign TextAlignFromId(TInt aId);

    IMPORT_C static TGulAlignment GulAlignFromId(TInt aId);

    IMPORT_C static TInt CursorHeightFromFont(const TFontSpec& aFont);

    IMPORT_C static TInt CursorWidthFromFont (const TFontSpec& aFont);

    IMPORT_C static TInt CursorAscentFromFont(const TFontSpec& aFont);

    IMPORT_C static void CursorExtensionsFromFont(const TFontSpec& /*aFont*/,
                                                  TInt& aFirstExtension,
                                                  TInt& aSecondExtension);

    IMPORT_C static TInt HighlightLeftPixelsFromFont (const TFontSpec& aFont);

    IMPORT_C static TInt HighlightRightPixelsFromFont(const TFontSpec& aFont);
    static void HighlightExtensionsFromFont(const TInt fontid,
                                            TInt& aLeft, TInt& aRight,
                                            TInt&  aTop, TInt& aBottom);

    /**
    * Access the system font array to see if there is a font that matches the  
    * font specification presented in Twips. Device map is also passed in case the 
    * system font array has fonts from different devices.
    * 
    * A null return value means that the system font array is not constructed yet, or does
    * not contain a font that has the same TFontSpec or device map.
    *
    * @param aSpec  Symbian font specification object to match
    * @param aMap   Device map to disambiguate fonts on different devices
    * @return       NULL if no match was found; otherwise a CAknLayoutFont pointer
    **/
    static const CAknLayoutFont* MatchFontFromSystemFontArray( 
        const TFontSpec& aSpec, MGraphicsDeviceMap* aMap );

    IMPORT_C static TBool LayoutMirrored();

    /*
    * This method returns build variant based on which flag is active,
    * __AVKON_ELAF__ or __AVKON_APAC__.
    *
    * If you need to decide which layout to use, do not do it based on this method.
    * Instead, use CAknEnv::GetCurrentLayoutId().
    *
    * @return current variant
    */
    IMPORT_C static EVariantFlag Variant();

    IMPORT_C static ESubVariantFlag SubVariant();

    IMPORT_C static void OverrideControlColorL(
        CCoeControl& aControl,
        TLogicalColor aLogicalColor,
        TRgb aColor);
    
    /*
    * This method returns the default scrollbar type for the given application. 
    * For non-layout aware applications (e.g. legacy apps designed for 176x208 screen) 
    * this method returns always EArrowHead. But for layout aware apps the returned type 
    * may vary depending on the type of scrollbar which has been set as preferred 
    * scrollbar type in the device.
    *
    * Note that applications may use freely whatever scrollbartype, this method only 
    * returns the default scrollbartype for the application.
    * 
    * @since  2.6
    * @param  aApplication Application of which default scrollbar type is requested.
    * @return Default scrollbar type for the given application
    */
    IMPORT_C static CEikScrollBarFrame::TScrollBarType DefaultScrollBarType(CAknAppUiBase* aApplication);

    /*
    * This method sets the layout for vertical scrollbar of the given scrollbar frame. Layout
    * can freely only be set for EDoubleSpan type scrollbars.
    * 
    * @since  2.6
    * @param  aScrollBarFrame   Scrollbarframe of which vertical scrollbar layout will be set.
    * @param  aControlParent    Rect of the parent control of the scrollbarframe.
    * @param  aLayout           Layout for the vertical scrollbar.
    *
    *
    * This method can also be useful when layout of the scrollbar needs to be changed for scrollbars
    * which are owned by some other components such as e.g. ListBoxes, Editors or Grids.
    *
    * Example of use:
    *
    *  // Get a pointer to scrollbarframe of the listbox
    *  CEikScrollBarFrame* frame = iListBox->ScrollBar();
    *  
    *  // Get the layout data
    *  TAknWindowLineLayout layout = GetMyListBoxLayout();
    *  Trect parentRect = GetMyListBoxParentRect();
    *
    *  // Set the layout
    *  AknLayoutUtils::LayoutVerticalScrollBar(frame, parentRect, layout);
    *
    *  // The layout for scrollbar is now set.
    *
    */
    IMPORT_C static void LayoutVerticalScrollBar(
        CEikScrollBarFrame* aScrollBarFrame,
        const TRect& aControlParent,
        const TAknWindowLineLayout& aLayout);

    /*
    * This method sets the layout for horizontal scrollbar of the given scrollbar frame. Layout
    * can freely only be set for EDoubleSpan type scrollbars.
    * 
    * @since  2.6
    * @param  aScrollBarFrame   Scrollbarframe of which horizontal scrollbar layout will be set.
    * @param  aControlParent    Rect of the parent control of the scrollbarframe.
    * @param  aLayout           Layout for the horizontal scrollbar.
    *
    *
    * Usage of this method is similar as for LayoutVerticalScrollBar().
    *
    */
    IMPORT_C static void LayoutHorizontalScrollBar(
        CEikScrollBarFrame* aScrollBarFrame,
        const TRect& aControlParent,
        const TAknWindowLineLayout& aLayout);

public:   // Metrics API

    /**
    * Layout Metrics.
    */
    enum TAknLayoutMetrics
    {
        /** Screen. */
        EScreen,
        
        /** Window that fills the entire screen. */
        EApplicationWindow,
        
        /** Indicates common components for most of the applications. */
        EStatusPane,
        
        /** The application main pane is used in all the applications */
        EMainPane,
        
        /** Control pane. */
        EControlPane,   
        
        /** The signal pane is used to indicate signal strength. */
        ESignalPane,
        
        /** The context pane is used to indicate an active application. */
        EContextPane,
        
        /** Used to indicate the subject or the name of the main pane content.*/
        ETitlePane,
        
        /** The battery pane is used to indicate battery strength. */
        EBatteryPane,
        
        /** 
         * The universal indicator pane is used to indicate items that require
         * the user's attention while browsing applications.
         */
        EUniversalIndicatorPane,
        
        /** 
         * The navi pane is used to indicate navigation within an application,
         * to provide context sensitive information to the user while entering
         * or editing data, or to show additional information.
         */
        ENaviPane,
        
        /** 
         * A fixed find pane is used with lists instead of the find pop-up
         * window. */
        EFindPane,
        
        /** Wallpaper pane. */
        EWallpaperPane,
        
        /** 
         * The universal indicator pane is used to indicate items that require
         * the user's attention while browsing applications.
         */
        EIndicatorPane,
        
        /** Used generally to display small sized graphics or heading texts. */
        EAColunm,
        
        /** Used generally to display large sized icons or heading texts. */
        EBColunm,
        
        /** 
         * Used generally to display data entered by the user. Overlaps with
         * the D column.
         */
        ECColunm,
        
        /** 
         * Used generally to display additional icons. Overlaps with
         * the C column.
         */
        EDColunm,
        
        /** @deprecated, do not use */
        EStatusPaneSecondary,
        
        /** deprecated, do not use */
        EControlPaneSecondary,
        
        /** Top part of status and control panes in landscape layout. */
        EStaconTop,
        
        /** Bottom part of status and control panes in landscape layout. */
        EStaconBottom,

        /** */
        EPopupParent,
        
        /** Bottom part of status pane in landscape layout. */
        EStatusPaneBottom = EStatusPaneSecondary,
        
        /** Bottom part of control pane in landscape layout. */
        EControlPaneBottom = EControlPaneSecondary,
        
        /** Top part of control pane in landscape layout. */
        EControlPaneTop = EControlPane,
        
        /** Top part of status pane in landscape layout. */
        EStatusPaneTop = EStatusPane
    };


    /**
    * Fills given TRect with rectangle for given layout component. 
    * Returns EFalse for status pane descendants if requested
    * layout component is not available in current layout. For
    * other components returns always ETrue (returned rectangle is
    * from layout definition).
    *
    * @since  2.8
    * @param  aParam   Layout component to be queried. 
    * @param  aRect    Resulting rectangle.
    * @param  ETrue    If requested value was available.
    *         EFalse   Otherwise.
    */
    IMPORT_C static TBool LayoutMetricsRect(TAknLayoutMetrics aParam, TRect& aRect);

    /**
    * This method returns size of rectangle for given layout component.
    * Returns EFalse for status pane descendants if requested
    * layout component is not available in current layout. For
    * other components returns always ETrue (returned size is
    * from layout definition).
    *
    * @since  2.8
    * @param  aParam   Layout component to be queried. 
    * @param  aSize    Resulting size.
    * @param  ETrue    If requested value was available.
    *         EFalse   Otherwise.
    */
    IMPORT_C static TBool LayoutMetricsSize(TAknLayoutMetrics aParam, TSize& aSize);

    /**
    * This method returns position of top left corner for given layout component.
    * Returns EFalse for status pane descendants if requested
    * layout component is not available in current layout. For
    * other components returns always ETrue (returned position is
    * from layout definition).
    *
    * @since  2.8
    * @param  aParam   Layout component to be queried. 
    * @param  aPos     Resulting position.
    * @param  ETrue    If requested value was available.
    *         EFalse   Otherwise.
    */
    IMPORT_C static TBool LayoutMetricsPosition(TAknLayoutMetrics aParan, TPoint& aPos);
public:
    /**
    * This method returns a new value for a baseline, based upon a value for bottom and 
    * a value for height. For legacy layout data, the baseline will be correct, and this
    * method will detect that it is a legacy font id and just return aBottom. 
    * However, for scalable layout data, the bottom value will be hidden inside 
    * the old baseline variable, so call this method passing in 'iB', NOT passing in 'ib'
    * ... e.g.: (the following line is an example, so is ok to have commented out code)
    * TInt newbaseline = CorrectBaseline(myLayoutLine.iB, myLayoutLine.iFont);
    *
    * @since  2.8
    * @param  aBottom  Baseline or Bottom value of text pane (found in TAknTextLineLayout.iB)
    * @param  aFontId     FontId of text pane (for scalable layouts, this will encode the height)
    * @return   new Baseline value
    */
    static TInt CorrectBaseline(TInt aParentHeight, TInt aBaseline, TInt aFontId);

    /**
    * This method updates fontid if it has ELayoutEmpty or parent relative values
    */
    static void CorrectFontId(TRect aParent, TInt at, TInt aH, TInt ab, TInt &aFontId);

    /**
    * This method tells if the scalable layout interface is available.
    * 
    * @internal
    * @return ETrue if scalable layout interface can be used, otherwise EFalse.
    */
    IMPORT_C static TBool ScalableLayoutInterfaceAvailable();
    
    /*
    * Enumeration of CBA's possible locations.
    * @since 3.0
    */
    enum TAknCbaLocation
        {
        EAknCbaLocationBottom, //landscape and portrait
        EAknCbaLocationRight,  //only landscape
        EAknCbaLocationLeft    //only landscape
        };
    
    /**
    * This method tells location of softkeys (CBA) field in current running application. 
    * Possible location of softkeys are bottom (portrait and landscape), left and right 
    * (only landscape).
    *
    * @since 3.0
    * @return TAknCbaLocation
    */
    IMPORT_C static TAknCbaLocation CbaLocation();

    /**
    * Used by pop-ups to align themselves around the given highlighted area.
    * @param aHighlightRect Highlighted area.
    * @param aControl Control whose position should be calculated,
    * @return TRect Size and position of pop-up.
    */
    static TRect HighlightBasedRect( const TRect& aHighlightRect, CCoeControl* aControl );

    /**
     * Flags for main_pane status
     */
    enum TAknMainPaneState 
        {
        EAknMainPaneForTinyStatusPane = 0x0001  // for 3x4 grid or app shell list views
        };
    IMPORT_C static TAknMainPaneState MainPaneState();

    /**
    * This method can be used to check whether pen support is enabled.
    * @return ETrue if pen support is enabled, otherwise EFalse.
    */
    IMPORT_C static TBool PenEnabled();
    
    /**
    * This method can be used to check whether MSK support is enabled.
    * @return ETrue if MSK support is enabled, otherwise EFalse.
    */
    IMPORT_C static TBool MSKEnabled();

    /**
    * Utility method to be used along side LayoutEdwin methods that take number of lines or 
    * baseline separation overrides. 
    * 
    * This routine returns the edwin height in pixels required to fit exactly the passed-in layout,
    * or the layout with overridden baseline separation and/or number of lines.
    * 
    * The vertical position of the editor is also returned. Note that the correct
    * height of the parent layout item is needed in order for this to be calculated properly.
    *
    * Note that this API does not cause a layout of the editor.
    * 
    * @since 3.1
    *
    * @param aParentHeight  Height of the parent layout item
    * @param aLayout        S60 layout object for the text to be laid out in the editor
    * @param aBaselineSeparationOverride   vertical separation of baselines overriding aLayout, if not KAknLayoutUtilsDoNotOverride 
    *                                       aLayout, if not KAknLayoutUtilsDoNotOverride 
    * @param aNumberOfLinesToShowOverride   number of lines overriding aLayout, 
    *                                       if not KAknLayoutUtilsDoNotOverride 
    * @param aEdwinVerticalPositionRelativeToParent     Returns the vertical postion of the editor 
    *                                                   relative to its parent when laid out.
    * @param aEdwinHeight   The height required in pixels to fit the required number of laid 
    *                       out lines plus highlights.
    */
    IMPORT_C static void GetEdwinVerticalPositionAndHeightFromLines(
        TInt aParentHeight,
        const TAknTextLineLayout& aLayout,
        TInt aBaselineSeparationOverRide,
        TInt aNumberOfLinesToShowOverRide,
        TInt& aEdwinVerticalPositionRelativeToParent,
        TInt& aEdwinHeight
        );
       
    /**
    * Utility routine to give the number of text lines that will completely fit, 
    * including room for highlights, within the given height, when the passed in layout is
    * being used. 
    *
    * Note that the NumberOfLinesShown() value from the TAknTextLineLayout object is not taken into
    * consideration. This routine ignores it, and returns number of lines based upon the font metrics,
    * hightlight specification, and the passed in maximum height.
    * 
    * Note that this API does not cause a layout of the editor.
    *
    * @since 3.1
    *
    * @param aLayout    S60 layout object for the text to be laid out in the editor    
    * @param aBaselineSeparationOverride   vertical separation of baselines 
    *       overriding aLayout, if not KAknLayoutUtilsDoNotOverride 
    * @param aMaxHeight     Input maximum height to use for the editor.
    * @param aUsedHeight    Returns the number of pixels required for the lines that fit
    * @return The number of lines which completely fit
    */
    IMPORT_C static TInt EdwinLinesWithinHeight (
        const TAknTextLineLayout& aLayout,
        TInt aBaselineSeparationOverride,
        TInt aMaxHeight,
        TInt& aUsedHeight
        );
};

/** Low level drawing based on European LAF document (can be used by application's custom controls)
 *
 * This class reads AVKON_LAYOUT_TEXT resources
 */
class TAknLayoutText
    {
public:
    IMPORT_C TAknLayoutText();
    /** Read resources and calculate information needed to draw text.
     *
     * LayoutText() call should be placed to control's SizeChanged() method.
     */
    IMPORT_C void LayoutText(const TRect& aParent, TInt aResourceId,
                             const CFont* aCustomFont=0);

    IMPORT_C void LayoutText(const TRect& aParent, TResourceReader& aReader,
                             const CFont* aCustomFont=0);

    IMPORT_C void LayoutText(const TRect& aParent, 
                             const AknLayoutUtils::SAknLayoutText& aLayout,
                             const CFont* aCustomFont=0);

    IMPORT_C void LayoutText(const TRect& aParent,
                             const TAknTextLineLayout& aLayout,
                             const CFont* aCustomFont=0);

    IMPORT_C void LayoutText(const TRect& aParent, TInt fontid, 
                             TInt C, TInt l, TInt r, TInt B, TInt W, TInt J,
                             const CFont* aCustomFont=0);

    /** Do the actual drawing, should be placed to control's Draw() method.
     */
    IMPORT_C void DrawText(CGraphicsContext& aGc, const TDesC& aText) const;
    
    /**
    * In case of bidirectional text, which is already converted from logical to
    * visual order, use this method with parameter 
    * aUseLogicalToVisualConversion EFalse.
    */
    IMPORT_C void DrawText(
        CGraphicsContext& aGc,
        const TDesC& aText,
        TBool aUseLogicalToVisualConversion ) const;

    IMPORT_C void DrawText(
        CGraphicsContext& aGc,
        const TDesC& aText,
        TBool aUseLogicalToVisualConversion,
        const TRgb &aColor) const;
                           

public:
    /** This returns rectangle that is used to draw the text.
     *
     * This allows you to divide screen space for egul's TextUtils::ClearBetweenRect()
     * without knowing exact coordinates => when coordinates change, your code 
     * does not need to change.
     */
    IMPORT_C TRect TextRect() const;
    const CFont *Font() const { return iFont; }
    TRgb Color() const { return AKN_LAF_COLOR_STATIC(iColor); }
    CGraphicsContext::TTextAlign Align() const { return iAlign; }
    /**
    * Returns the baseline position for the font set in this object.
    * This value, together with TextRect(), are the metrics that are used to 
    * parametrise a call to DrawText, for example:
    *      void CGraphicsContext::DrawText( 
    *            const TDesC& aText, 
    *            const TRect& aBox, 
    *            TInt aBaselineOffset, 
    *            TTextAlign aAlignment = ELeft,
    *            TInt aLeftMargin = 0);
    * 
    *  TAknLayoutText's own DrawText methods are recommended, however.
    * 
    *  Notice that this value is relative to the top of the TextRect() rectangle, 
    *  which is generally made to bound all accents. Thus this offset value 
    *  is usually larger than the CFont::AscentInPixels value.
    * 
    * @since 3.1 
    * @return   distance in pixels measured from the top of the textpane down to the baseline
    */
    TInt BaselineOffset() const;
private:
    TRect iTextRect;
    const CFont *iFont; // not owned..
    TInt iColor;
    TInt iOffset;
    CGraphicsContext::TTextAlign iAlign;
    friend class CBubbleOutlookNumberEntry;
    };

/** Low level rectangle management based on European LAF document (can be used by application's custom controls)
 * 
 * This allows you to draw images, rectangles, lines or just calculate rectangles based on LAF spec.
 *
 * This class reads AVKON_LAYOUT_RECT resources.
 *
 * Instances of this class should be placed inside controls for reading low level layout from resources.
 */
class TAknLayoutRect
    {    
public:
    IMPORT_C TAknLayoutRect();
    /** LayoutRect should be called from control's SizeChanged() method.
     */
    IMPORT_C void LayoutRect(const TRect &aParent, TInt aResourceId);
    IMPORT_C void LayoutRect(const TRect &aParent, TResourceReader &aReader);
    IMPORT_C void LayoutRect(const TRect &aParent, 
                             const AknLayoutUtils::SAknLayoutRect &aLayout);

    IMPORT_C void LayoutRect(const TRect &aParent,
                             const TAknWindowLineLayout &aLayout);

    IMPORT_C void LayoutRect(const TRect &aParent, 
                             TInt C, TInt l, TInt t, TInt r, TInt b,
                             TInt W, TInt H);
    
    /** Color() can be called from control's Draw() method. 
    
    DO NOT CALL it in SizeChanged(), ConstructL() or ActivateL() method, because 
    it messes up color scheme changes. Especially if you're using colors 226-248.
    If you store color values, be prepared to update TRgb's you store when color
    palette is changed! Best thing to do is to make your Draw() methods call
    AKN_LAF_COLOR().
     */    
    IMPORT_C TRgb Color() const;
    /** Rect() can be called from control's Draw() or in SizeChanged() as input for some other table's layout code.
     */
    IMPORT_C TRect Rect() const;
    TBool Valid() const;

    /** DrawRect() and DrawImage() should be called from control's Draw() method.
     */
    IMPORT_C void DrawRect(CWindowGc& aGc) const;
    IMPORT_C void DrawOutLineRect(CWindowGc& aGc) const;
    IMPORT_C void DrawImage(CBitmapContext& aGc, CFbsBitmap* aBitmap, CFbsBitmap* aMask) const;
private:
    TInt iColor;
    TRect iRect;
    };

/**
 * Helper functions for drawing empty lists and window shadows
 */
class AknDraw 
    {
public:
    /** 
    Draws standard empty list
    @param aRect the client rectangle
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyList(
        const TRect& aRect,
        CWindowGc& aGc,
        TPtrC aText);

    /** 
    Draws empty list for setting item editing
    @param aRect the rectangle of setting page's content
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyListForSettingPage(
        const TRect &aRect,
        CWindowGc &aGc,
        TPtrC text); // only for setting page with empty layout.

    /** 
    Draws empty list for lists with find
    @param aRect the client rectangle
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyListWithFind(
        const TRect& aClientRect,
        CWindowGc& aGc,
        TPtrC aText); // only for fixed find pane used with single graphics listbox.

    /** 
    Draws empty list for lists with heading
    @param aRect the client rectangle
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyListHeading(
        const TRect &aClientRect,
        CWindowGc& aGc,
        TPtrC aText); // only heading style lists.

    // The following is optimization for drawing window shadows.
    /** 
    Draws a window shadow
    @param aCoverRect the area covered by the shadow
    @param aSecondShadowRect the area used for second shadow
    @param aFirstShadowRect  the area of first shadow
    @param aOutliineFrameRect the area of black outline frame
    @param aInsideAreaRect   the area of content inside the window
     */
    IMPORT_C static void DrawWindowShadow(
        CWindowGc& aGc,
        const TAknLayoutRect& aCoverRect,
        const TAknLayoutRect& aSecondShadowRect,
        const TAknLayoutRect& aFirstShadowRect,
        const TAknLayoutRect& aOutlineFrameRect,
        const TAknLayoutRect& aInsideAreaRect);

public:

    /** 
    * The main implementation routine for empty list drawing.
    * @param aRect the client rectangle
    * @param aGc   the graphics context
    * @param aText text for empty list in one of following formats:
    *
    * layouts with large font:
    * "Line 1"
    * "Long line. This will be wrapped to 2 lines and 2nd will be trunca..."
    * "Line 1\nLine 2"
    *
    * layout with 1 line of large font and up to 3 lines with small font:
    * "Line 1\nLong line, will be wrapped up to 3 lines with small font and..."
    *
    *
    * @param aLayoutLine1 Resource id of AVKON_LAYOUT_TEXT for first line layout 
    * @param aLayoutLine2 Resource id of AVKON_LAYOUT_TEXT for second line layout 
     */
    IMPORT_C static void DrawEmptyListImpl( const TRect& aRect,
                                            CWindowGc& aGc,
                                            TPtrC aText,
                                            TInt aLayoutLine1,
                                            TInt aLayoutLine2 );
    
    };

/**
 * Helper functions for drawing empty lists and window shadows
 */
class AknDrawWithSkins
    {
public:
    /** 
    Draws standard empty list
    @param aRect the client rectangle
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyList(
        const TRect& aRect,
        CWindowGc& aGc,
        TPtrC aText,
        CCoeControl *aControl);

    /** 
    Draws empty list for setting item editing
    @param aRect the rectangle of setting page's content
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyListForSettingPage(
        const TRect &aRect,
        CWindowGc &aGc,
        TPtrC text,
        CCoeControl *aControl); // only for setting page with empty layout.

    /** 
    Draws empty list for lists with find
    @param aRect the client rectangle
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyListWithFind(
        const TRect& aClientRect,
        CWindowGc& aGc,
        TPtrC aText,
        CCoeControl *aControl); // only for fixed find pane used with single graphics listbox.

    /** 
    Draws empty list for lists with heading
    @param aRect the client rectangle
    @param aGc   the graphics context
    @param aText text for empty list in format "Line1\nLine2"
     */
    IMPORT_C static void DrawEmptyListHeading(
        const TRect &aClientRect,
        CWindowGc& aGc,
        TPtrC aText,
        CCoeControl *aControl); // only heading style lists.

    // The following is optimization for drawing window shadows.
    /** 
    Draws a window shadow
    @param aCoverRect the area covered by the shadow
    @param aSecondShadowRect the area used for second shadow
    @param aFirstShadowRect  the area of first shadow
    @param aOutliineFrameRect the area of black outline frame
    @param aInsideAreaRect   the area of content inside the window
     */
    IMPORT_C static void DrawWindowShadow(
        CWindowGc& aGc,
        const TAknLayoutRect& aCoverRect,
        const TAknLayoutRect& aSecondShadowRect,
        const TAknLayoutRect& aFirstShadowRect,
        const TAknLayoutRect& aOutlineFrameRect,
        const TAknLayoutRect& aInsideAreaRect,
        CCoeControl *aControl);
    
    };




// Browser and calculator fonts will not be placed here. Application
// can use them themselves with CEikonEnv::Static()->Font() call.
IMPORT_C const CFont *LatinPlain12();
IMPORT_C const CFont *LatinBold12();
IMPORT_C const CFont *LatinBold13();
IMPORT_C const CFont *LatinBold16(); // since 2.0
IMPORT_C const CFont *LatinBold17();
IMPORT_C const CFont *LatinBold19(); 
IMPORT_C const CFont *NumberPlain5();
IMPORT_C const CFont *ClockBold30();
IMPORT_C const CFont *LatinClock14();
const CFont *CalcBold21();
const CFont *CalcOperBold21();
const CFont *CalcOperBold13();



IMPORT_C const CFont *ApacPlain12();
IMPORT_C const CFont *ApacPlain16();


/**
* CompletePathWithAppPath
*   All the components that are specified in the given descriptor (drive letter,
*   path and file name, including extension) are put into the result;
*   any missing components (path and drive letter) are taken from the app's path.
*
*   Can be used e.g. to load a bitmap file when an application don't know where
*   it has been installed.
*
*   Example1:
*        TFilename fname = _L("\testdir\pics.mbm"); // Use _LIT instead
*        CompletePathWithAppPath( fname );
*        Result:
*            fname == "c:\testdir\pics.mbm" if application was installed to c:
*
*   Example2:
*        TFilename fname = _L("pics.mbm"); // Use _LIT instead
*        CompletePathWithAppPath( fname );
*        Result:
*            fname == "c:\system\apps\myapp\pics.mbm" if application was 
*                installed to c:\system\apps\myapp
*
* @param    aFileName   FileName which will be completed with application's path
* @return   Error code if an error occured. In case of an error aFileName will
*               not be changed
*/
IMPORT_C TInt CompleteWithAppPath( TDes& aFileName );

/**
 * Test whether the value falls within the parent relative range
 * as defined in AknLayout2Def.h
 *
 * @since 2.8
 * @param aVal value
 * @return ETrue if value is within the parent relative range, EFalse otherwise
 */
TBool IsParentRelative(TInt aVal);

/**
 * Returns default input language that corresponds to the UI language.
 *
 * @since 3.0
 * @param aUiLanguage Language code of the UI language
 * @return Language code of the default input language
 */
IMPORT_C TInt DefaultInputLanguageFromUILanguage(const TInt aUiLanguage);

    /**
    * Sets the key block mode.
    * Has the same functionality as SetKeyBlockMode in AknAppUi,
    * but this can be used from a non app-framework application.
    * The default mode blocks simultaneous key presses.
    * @param aMode @c ENoKeyBlock if no key block, otherwise
    * @c EDefaultBlockMode
    */
IMPORT_C void SetKeyblockMode( TAknKeyBlockMode aMode );

namespace AknDateTimeUtils
    {
    /**
    * Converts given UTC time to home time.
    * This conversion is used e.g. when showing time stamps of files in UI.
    * In Symbian OS file system, time stamps are in UTC time, but in UI
    * they should be shown in home time.
    *
    * @param aTime UTC time to be converted to home time.
    * @since 3.1
    */
    IMPORT_C void ConvertUtcTimeToHomeTime( TTime& aTime );
    }

#define KAknLanguageMask 0x3FF
#define KAknDialectMask 0xFC00

namespace AknLangUtils
    {
    /**
    * Returns the RFC 3066 tag of the current display language.
    * @since 3.1
    * @ret RFC 3066 tag, ownership transferred to the caller.
    */
    IMPORT_C HBufC* DisplayLanguageTagL();
    
    TLanguage UserLanguage();
    
    }

/**
 * Helper functions for Popups
 * 
 * @since S60 v5.2
 */
class AknPopupUtils
    {
public:
    /** 
     * Calculates proper position for a popup control. Returned value depends
     * on currently active layout and softkey visibility.
     * 
     * @param aSize             The size of the popup.
     * @param aSoftkeysVisible  ETrue if softkeys are visible.
     * @return                  Corrent popup position.
     */
    IMPORT_C static TPoint Position( const TSize& aSize,
        TBool aSoftkeysVisible );

    /** 
     * Calculates proper position for a popup control. Returned value depends
     * on currently active layout and softkey visibility which is checked from
     * aControl via MOP chain.
     * 
     * @param aSize         The size of the popup.
     * @param aControl      Control who's position should be calculated.
     * @return              Corrent popup position.
     */
    IMPORT_C static TPoint Position( const TSize& aSize,
        CCoeControl* aControl );
    };

#endif //  __AKNUTILS_H__

// End of file

