--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/classicui_pub/ui_framework_utilities_api/inc/AknUtils.h Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,2706 @@
+/*
+* 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
+