epoc32/include/mw/aknuniteditor.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 2 2fe1408b6811
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     1 /*
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description:  Unit multi-field numeric editor
    15 *
    16 */
    17 
    18 
    19 #ifndef CAKNUNITEDITOR_H
    20 #define CAKNUNITEDITOR_H
    21 
    22 #include <eikmfne.h>
    23 
    24 class CAknMfneFloat;
    25 class CAknMfneSeparator;
    26 
    27 /**
    28  * A multi-field numeric editor for displaying and editing a floating value
    29  * and an associated label.
    30  *
    31  * CAknUnitEditor is a multi-field numeric editor (MFNE), which is used for
    32  * displaying and editing floating point numeric data with a textual
    33  * label. Unit in the class name refers to a unit of measurement, for
    34  * example distance or speed, hence a typical use case might be an editor
    35  * which is used to edit an altitude value for a position in a GPS
    36  * application.
    37  *
    38  * Creating the editor is carried out by using either NewL() or
    39  * NewLC() function followed by a call to either ConstructL()
    40  * or ConstructFromResourceL() function. Note that if the editor is
    41  * not constructed fully, most functions will panic with KERN-EXEC 3.
    42  *
    43  * The value to be shown by the editor must be set at construction, and
    44  * can be later set using SetValue(). The current value of the editor
    45  * can be retrieved using Value().
    46  *
    47  * Minimum and maximum limits can be set using the function
    48  * SetMinimumAndMaximum(). NaN values for this function are
    49  * not supported, and will cause undefined behaviour.
    50  *
    51  * The editor supports a label shown next to the value. This label can be
    52  * set to a custom value (referred to as custom unit), or a set of
    53  * predefined and localized units can be used. See TAknUnitEditorUnits in
    54  * eikon.hrh and the two overloads of SetUnitL(). Note that the editor
    55  * discards the custom unit when a localized unit is set, so setting
    56  * the localized unit back to EAknUnitEditorCustomUnit clears
    57  * the unit.
    58  *
    59  * The editor supports variable number of fractional digits. A value
    60  * with no fractional part at all can also be displayed and edited. This
    61  * feature can be used with the function SetMaxFractionalDigits(), and
    62  * the corresponding getter MaxFractionalDigits(). Values set using
    63  * construction functions or SetValue() are rounded to correspond
    64  * with the number of fractional digits, so data loss may occur in such
    65  * case.
    66  *
    67  * The editor also supports an uninitialized state, which in practice means
    68  * that it can have nothing to display and in such case contains a
    69  * 'not a number' (NaN) value. This state can be allowed by the using the flag
    70  * EAknUnitEditorAllowUninitialized, found in TAknUnitEditorFlags in
    71  * eikon.hrh. For more information about NaN, see Math::IsNaN() and
    72  * TRealX::SetNaN().
    73  *
    74  * @lib eikctl.lib
    75  * @since S60 v3.2
    76  */
    77 NONSHARABLE_CLASS( CAknUnitEditor ) : public CEikMfne
    78     {
    79 public:
    80     /**
    81      * Creates a new CAknUnitEditor object. The client must call ConstructL()
    82      * or ConstructFromResourceL() after calling this function.
    83      *
    84      * @return The created CAknUnitEditor.
    85      */
    86     IMPORT_C static CAknUnitEditor* NewL();
    87     
    88     /**
    89      * Creates a new CAknUnitEditor object, leaving it in the cleanup stack.
    90      * The client must call ConstructL() or ConstructFromResourceL()
    91      * after calling this function.
    92      *
    93      * @return The created CAknUnitEditor.
    94      */
    95     IMPORT_C static CAknUnitEditor* NewLC();
    96 
    97     /**
    98      * C++ destructor. Deletes all owned member data.
    99      */
   100     virtual ~CAknUnitEditor();
   101 
   102     /**
   103      * Second-phase constructor. This should be called after creating a
   104      * new editor object with NewL() or NewLC(), if the
   105      * editor is not constructed from a resource.
   106      *
   107      * @param aMinimumValue The minimum allowable value.
   108      * @param aMaximumValue The maximum allowable value.
   109      * @param aInitialValue The initial value, can be NaN if the editor
   110      *                      is set to support it by using the
   111      *                      EAknUnitEditorAllowedUninitialized flag.
   112      * @param aMaxFractionalDigits The maximum number of fractional digits.
   113      * @param aUnit The unit type, see TAknUnitEditorUnits
   114      *              in eikon.hrh. Can be set to EAknUnitEditorCustomUnit
   115      *              or zero if you plan on using a custom unit.
   116      * @param aFlags The editor flags, see TAknUnitEditorFlags
   117      *               in eikon.hrh. This can be set to zero if no flags
   118      *               are desired. This is also the default parameter.
   119      * @leave KErrNotSupported If the given predefined unit type, aUnit,
   120      *                         is not found.
   121      * @see TAknUnitEditorUnits
   122      * @see TAknUnitEditorFlags
   123      */
   124     IMPORT_C void ConstructL(
   125         TReal aMinimumValue, TReal aMaximumValue,
   126         TReal aInitialValue,
   127         TInt aMaxFractionalDigits, TInt aUnit, TUint aFlags = 0 );
   128     
   129     /**
   130      * Second-phase constructor. This should be called after creating a
   131      * new editor object with NewL() or NewLC(), if the
   132      * editor is constructed from a resource. The resource structure
   133      * used in creating the editor is AVKON_UNIT_EDITOR.
   134      *
   135      * @param aResourceReader A resource file reader.
   136      * @leave KErrNotSupported If the predefined unit type in the resource
   137      *                         is not found.
   138      * @see AVKON_UNIT_EDITOR
   139      */        
   140     IMPORT_C void ConstructFromResourceL( TResourceReader& aResourceReader );
   141 
   142     /**
   143      * Sets a value to the editor. If the value is too large or small it is
   144      * set to maximum or minimum value, respectively. In case of an 
   145      * unallowed NaN the value is set to be the maximum value.
   146      *
   147      * @param aValue The value to be set.
   148      * @return ETrue, if the value was valid and not changed. The value is
   149      *         also considered to be valid in case it is rounded to the
   150      *         limits of the editor's maximum fractional digits.
   151      */
   152     IMPORT_C TBool SetValue( TReal aValue );
   153     
   154     /**
   155      * Gets the value from the editor.
   156      *
   157      * @return The value from the editor.
   158      */
   159     IMPORT_C TReal Value() const;
   160     
   161     /**
   162      * Tests if particular predefined unit type is supported.
   163      *
   164      * @param aUnit The predefined unit type, from the enum
   165      *              TAknUnitEditorUnits.
   166      * @return ETrue, if the given predefined unit type is supported.
   167      * @see TAknUnitEditorUnits
   168      */
   169     IMPORT_C TBool SupportsUnit( TInt aUnit ) const;
   170     
   171     /**
   172      * Sets the custom unit type. There's no actual limit for the length of
   173      * the text, but if the unit text overflows, it will not be wrapped.
   174      *
   175      * @param aUnit The unit type to be set.
   176      */
   177     IMPORT_C void SetUnitL( const TDesC& aUnit );
   178     
   179     /**
   180      * Sets the predefined and localized unit type. If the given unit type
   181      * is EAknUnitEditorCustomUnit, the unit field is emptied and a
   182      * subsequent call to SetUnitL( const TDesC& aUnit ) is needed.
   183      *
   184      * @param aUnit The predefined unit type, from the enum
   185      *              TAknUnitEditorUnits.
   186      * @leave KErrNotSupported If the given predefined unit type is not found.
   187      * @see TAknUnitEditorUnits
   188      */
   189     IMPORT_C void SetUnitL( TInt aUnit );
   190 
   191     /**
   192      * Gets the current unit type as a descriptor. This returns the textual
   193      * representation of the unit field, regardless of the way it was set.
   194      *
   195      * @param aDes On return, contains the editor's unit type if it fits in
   196      *             the given descriptor.
   197      * @return Zero, if the function executed successfully. Otherwise the
   198      *         minimum length needed for the editor's content.
   199      */
   200     IMPORT_C TInt GetUnit( TDes& aDes ) const;
   201     
   202     /**
   203      * Gets the current unit type as an predefined unit type id,
   204      * from the enum TAknUnitEditorUnits. Returns EAknUnitEditorCustomUnit
   205      * if the last unit set was a custom unit.
   206      *
   207      * @return The current unit type identifier. EAknUnitEditorCustomUnit
   208      *         if custom unit was set.
   209      * @see TAknUnitEditorUnits  
   210      */
   211     IMPORT_C TInt Unit() const;
   212 
   213     /**
   214      * Sets the maximum number of digits to show in the fractional part of
   215      * the value. The maximum number of fractional digits is limited
   216      * to eight. Setting a value outside of valid range (0 to 8) has
   217      * no effect in release builds, and panics in debug builds.
   218      *
   219      * @param aFractionalDigits The maximum number of digits in the
   220      *                          fractional part. Can be zero to eight.
   221      * @panic 1 In debug builds only, if aMaxFractionalDigits is out of
   222      *          range.
   223      */
   224     IMPORT_C void SetMaxFractionalDigits( TInt aMaxFractionalDigits );
   225     
   226     /**
   227      * Gets the maximum number of digits in the fractional part of the
   228      * value.
   229      *
   230      * @return The maximum number of digits in the fractional part
   231      */
   232     IMPORT_C TInt MaxFractionalDigits() const;
   233     
   234     /**
   235      * Sets the minimum and maximum editor values. NaN values are not
   236      * supported, and will cause undefined behaviour.
   237      *
   238      * @param aMinimumValue The minimum allowable value
   239      * @param aMaximumValue The maximum allowable value
   240      */
   241     IMPORT_C void SetMinimumAndMaximum(
   242         TReal aMinimumValue, TReal aMaximumValue );
   243     
   244     /**
   245      * Gets the minimum and maximum editor values.
   246      *
   247      * @param aMinimumValue On return, contains the editor's minimum value
   248      * @param aMaximumValue On return, contains the editor's maximum value
   249      */
   250     IMPORT_C void GetMinimumAndMaximum(
   251         TReal& aMinimumValue, TReal& aMaximumValue ) const;
   252         
   253     /**
   254      * Sets the editor flags, see TAknUnitEditorFlags in eikon.hrh.
   255      *
   256      * @param aFlags The editor flags. Note that this overrides all
   257      *               the flags. Use zero if no flags are desired.
   258      * @see TAknUnitEditorFlags
   259      */
   260     IMPORT_C void SetFlags( TUint aFlags );
   261     
   262     /**
   263      * Gets the editor flags, see TAknUnitEditorFlags in eikon.hrh.
   264      *
   265      * @return The editor flags.
   266      * @see TAknUnitEditorFlags
   267      */
   268     IMPORT_C TUint Flags() const;
   269     
   270 // from base class CEikMfne
   271 
   272     /**
   273      * From CEikMfne.
   274      * Validates the values in the editor. This function should be called
   275      * before removing focus from the editor.
   276      *
   277      * @leave KLeaveWithoutAlert If the value in the field had an error
   278      *                           in it.
   279      */
   280     IMPORT_C void PrepareForFocusLossL();
   281     
   282 protected:
   283 
   284     /**
   285      * From CEikMfne.
   286      * Deals with focus changes.
   287      *
   288      * @param aDrawNow Whether to draw the control immediately.
   289      */
   290      void FocusChanged( TDrawNow aDrawNow );
   291 
   292 private:
   293 
   294     /**
   295      * C++ constructor.
   296      */
   297     CAknUnitEditor();
   298     
   299     /**
   300      * Checks if the unit field label should be visible.
   301      *
   302      * @return ETrue, if the unit field should be visible.
   303      */
   304     TBool UnitFieldVisibility() const;
   305     
   306 private: // data
   307 
   308     /**
   309      * Bit flags
   310      */
   311     TUint iFlags;
   312     
   313     /**
   314      * The limit for predefined unit indices
   315      */
   316     const TInt iUnitLimit;
   317     
   318     /**
   319      * Value of the current unit type, as in enum
   320      * TAknUnitEditorUnits.
   321      */
   322     TInt iUnitType;
   323 
   324     /**
   325      * Helper pointer to float value field
   326      * Not own.
   327      */
   328     CAknMfneFloat* iFloatField;
   329     
   330     /**
   331      * Helper pointer to separator field
   332      * Not own.
   333      */
   334     CAknMfneSeparator* iSeparatorField;
   335     
   336     /**
   337      * Helper pointer to unit field
   338      * Not own.
   339      */
   340     CAknMfneSeparator* iUnitField;
   341     
   342     };
   343 
   344 #endif // CAKNUNITEDITOR_H