/*
* Copyright (c) 2002-2010 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:  Implementation of AVKON query control.
*
*/


// INCLUDE FILES
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <uikon/eikdefmacros.h>
#endif
#include "aknQueryControl.h"    //This class
#include <barsread.h>           //For TResourceReader

#include <aknenv.h>
#include <AknBitmapAnimation.h>
#include <aknconsts.h>
#include <avkon.mbg>
#include <avkon.rsg>
#include <aknborders.h>
#include <AknEcs.h>
#include <aknedsts.h>
#include <AknLayoutDef.h>
#include <AknLayout.lag>

#include "akntextcontrol.h"
#include "aknqueryeditorindicator.h"
#include "aknEditStateIndicator.h"
#include "AknUtils.h"
#include "aknnoteattributes.h"

#include <AknsDrawUtils.h>
#include <AknsConstants.h>
#include <AknsFrameBackgroundControlContext.h>
#include <AknsPointerStore.h>

#include <in_sock.h>

#include <AknPictographInterface.h>
#include <AknPictographDrawerInterface.h>

#include "AknQueryExtension.h"
#include <skinlayout.cdl.h>

#include <AknIconUtils.h>
#include "aknappui.h"
#include <layoutmetadata.cdl.h>
#include <aknlayoutscalable_avkon.cdl.h>
#include <aknlayoutscalable_apps.cdl.h>
#include "aknkeypad.h"


#if defined( RD_SCALABLE_UI_V2)
//class CAknButton is available from week 20 version 5.0 onwards
#include "aknbutton.h"
// For MAknMfneCommandObserver
#include <aknmfnecommandobserver.h>
#endif //if defined( RD_SCALABLE_UI_V2)
#include <aknlocationed.h>

#include <eikdialg.h>
#include <eikdialogext.h>
#include <gulicon.h>
#include <StringLoader.h>

#include <AknTasHook.h> // for testability hooks
#include <tacticon.h>

#include "akntrace.h"
const TInt KPinCodeTacticonInterval = 30000000; // 30s
const TInt KPinCodeMaxTacticons = 10;
/*******
 * CAknQueryControlExtension
 */
 
NONSHARABLE_CLASS(CAknQueryControlExtension) : public CBase
{
public:
    ~CAknQueryControlExtension();
    
	CAknLocationEditor *iLocationEd;
	
	// Saved animation ID for later updates due to skin change.
	// The value is saved in CAknQueryControl::ConstructQueryL().
	TInt iAnimationId;
	 
	HBufC* iOriginalPrompt;
	CAknButton* iBackspaceButton;
	CAknKeypad* iKeypad;
	
	// Flag indicating whether or not the query CBA has been
	// changed to ECS softkeys (Call and Cancel).
	TBool iEcsCbaShown;

    // Timer for pincode query tacticon playback
    CPeriodic* iPinTacticonTimer;
    // Counter for tacticons played in a pincode query
    TInt iPinTacticonsPlayed;
};

CAknQueryControlExtension::~CAknQueryControlExtension()
    {
    _AKNTRACE_FUNC_ENTER;
    delete iOriginalPrompt;
    delete iBackspaceButton;
    delete iKeypad;

    delete iPinTacticonTimer;
    iPinTacticonTimer = NULL;
    _AKNTRACE_FUNC_EXIT;
    }
    
CAknLocationEditor *CAknQueryControl::LocationEd() const
{
   if (iExtension)
	return iExtension->iLocationEd;
   else
	return NULL;
}
CAknLocationEditor *&CAknQueryControl::LocationEd()
{
	return iExtension->iLocationEd;
}


/*****************************
 * CAknQueryExtension
 *****************************/

void CAknQueryExtension::CreateEditorContextL()
    {
    _AKNTRACE_FUNC_ENTER;
    delete iEditorContext;
    iEditorContext = NULL;
    iEditorContext = CAknsFrameBackgroundControlContext::NewL(
        KAknsIIDQsnFrInput, TRect(0,0,1,1), TRect(0,0,1,1), EFalse );
    _AKNTRACE_FUNC_EXIT;
    }

CAknsFrameBackgroundControlContext* CAknQueryExtension::EditorContext()
    {
    return iEditorContext;
    }

CAknQueryExtension* CAknQueryExtension::Instance(
    const CAknQueryControl* aQueryControl )
    {
    return static_cast<CAknQueryExtension*>(
        AknsPointerStore::RetrievePointer( 
        static_cast<const CBase*>(aQueryControl) ) );
    }

void CAknQueryExtension::CreateExtensionL(
    const CAknQueryControl* aQueryControl )
    {
    _AKNTRACE_FUNC_ENTER;
    CAknQueryExtension* extension = CAknQueryExtension::NewL();
    CleanupStack::PushL( extension );
    AknsPointerStore::StorePointerL( 
        static_cast<const CBase*>(aQueryControl), extension );
    CleanupStack::Pop(); // extension
    _AKNTRACE_FUNC_EXIT;
    }

void CAknQueryExtension::DestroyExtension(
    const CAknQueryControl* aQueryControl )
    {
    _AKNTRACE_FUNC_ENTER;
    delete Instance( aQueryControl );
    AknsPointerStore::RemovePointer( 
        static_cast<const CBase*>(aQueryControl) );
    _AKNTRACE_FUNC_EXIT;
    }

CAknQueryExtension* CAknQueryExtension::NewL()
    {
    return new (ELeave) CAknQueryExtension();
    }

CAknQueryExtension::~CAknQueryExtension()
    {
    delete iEditorContext;
    _AKNTRACE( "[%s][%s]exit", "CAknQueryExtension", "~CAknQueryExtension" );
    }

/*****************************
 * TAknQueryEcsObserver
 *****************************/

/**
*
* This class is local to this cpp file.  It is used to ensure that all reference to aknecs.h is 
* done within the CAknQueryControl class implementation and not in its header; that would cause
* the client of CAknQueryControl (probably via CAknQueryDialog) to have to have Shared data and 
* phone client .h files in the INCLUDE path 
*
*/
NONSHARABLE_CLASS(TAknQueryEcsObserver): public MAknEcsObserver
    {
    public:
        TAknQueryEcsObserver( CAknQueryControl* aParent );
        // May be called from a sub-class of CAknEcsDetector in another DLL
        IMPORT_C virtual void HandleEcsEvent(CAknEcsDetector* /*aDetector*/, CAknEcsDetector::TState aUpdatedState);
    private:
        CAknQueryControl* iParent; // Not owned; set by constructor initializaton
    };

TAknQueryEcsObserver::TAknQueryEcsObserver( CAknQueryControl* aParent ): iParent( aParent )
    {
    }


EXPORT_C void TAknQueryEcsObserver::HandleEcsEvent( CAknEcsDetector* /*aDetector*/,
                                                    CAknEcsDetector::TState aUpdatedState )
    {
	_AKNTRACE( "[%s][%s] aUpdatedState: %d", "TAknQueryEcsObserver", __FUNCTION__,aUpdatedState);
    TRAP_IGNORE( iParent->SetEcsCbaVisibleL( aUpdatedState == CAknEcsDetector::ECompleteMatch || 
                                             aUpdatedState == CAknEcsDetector::EServiceNumMatch ) );
    
    // Hide the emergency call number again.
    // Number should be visible only in Partial or Complete match state
    if ( aUpdatedState != CAknEcsDetector::EPartialMatch &&
         aUpdatedState != CAknEcsDetector::ECompleteMatch && 
         aUpdatedState != CAknEcsDetector::EServiceNumMatch )
        {
        if ( iParent->QueryType() == EPinLayout )
            {
            _AKNTRACE( "[%s][%s] ", "RevealSecretText( EFalse )", __FUNCTION__);
            if( iParent->ControlByLayoutOrNull( EPinLayout ) )
            	{
				static_cast<CAknNumericSecretEditor*>
					( iParent->ControlByLayoutOrNull( EPinLayout ) )->RevealSecretText( EFalse );
            	}
            }
        }
    
    // This check must be last action in the routine.  
    // If the query is cancelled, the iParent is deleted!
    if ( aUpdatedState == CAknEcsDetector::ECallAttempted )
        {
        _AKNTRACE( "[%s][%s] ", "cancel query", __FUNCTION__);
        TRAP_IGNORE( iParent->CancelQueryL() );
        }
    _AKNTRACE_FUNC_EXIT;
    }


const TInt KMaxLinesInQuery=5;

/*****************************
 * CAknQueryControl
 *****************************/

/************************************************
 * KQueryTypeToLayout
 * 
 * The index into this table is the query type, 
 * according to the query constants enum in 
 * avkon.hrh. The values
 * are the layout methods according to the enum
 * TLayoutMethod. So this table maps a query type
 * as read from resource file to a lyout method
 ************************************************/

const CAknQueryControl::TLayoutMethod KQueryTypeToLayout[]= {
    CAknQueryControl::EDataQueryLayoutM,   // NOT USED  
    CAknQueryControl::EDataQueryLayoutM,   // EDataLayout=1,
    CAknQueryControl::EConfQueryLayoutM,   // EConfirmationQueryLayout and EConfirmationLayout
    CAknQueryControl::ECodeQueryLayoutM,   // ECodeLayout,
    CAknQueryControl::ETimeQueryLayoutM,   // ETimeLayout,
    CAknQueryControl::EDateQueryLayoutM,   // EDateLayout,
    CAknQueryControl::ECodeQueryLayoutM,   // EListLayout,
    CAknQueryControl::ECodeQueryLayoutM,   // EMultiListLayout,
    CAknQueryControl::ECodeQueryLayoutM,   // EMultiLineDataLayout,
    CAknQueryControl::ETimeQueryLayoutM,   // EDurationLayout,
    CAknQueryControl::ECodeQueryLayoutM,   // ETextSoftNotification, - THIS IS USED FOR NOTES
    CAknQueryControl::EDataQueryLayoutM,   // ENumberLayout,
    CAknQueryControl::ECodeQueryLayoutM,   // EPinLayout,
    CAknQueryControl::EDataQueryLayoutM,   // EPhoneLayout,
    CAknQueryControl::EDataQueryLayoutM,   // EMessageQueryLayout,
    CAknQueryControl::EDataQueryLayoutM,   // EStaticSizeDataLayout
    CAknQueryControl::EDataQueryLayoutM,   // EFloatingPointLayout
    CAknQueryControl::ETimeQueryLayoutM,   // EIpLayout
    CAknQueryControl::EDataQueryLayoutM,    // EFixedPointLayout
    CAknQueryControl::EDataQueryLayoutM    // EDataLayoutAllowEmptyInput - USED FOR EMPTY INPUT
    };

///
/// Construction and Destruction methods
///

/**
 *
 */
EXPORT_C CAknQueryControl::CAknQueryControl() :/* iQueryType(EConfirmationLayout),*/ iNumberOfEditorLines(-1), iHasEditor(EFalse)
    {
    AKNTASHOOK_ADD( this, "CAknQueryControl" );
    }

/**
 *
 */
EXPORT_C CAknQueryControl::~CAknQueryControl()
    {
	_AKNTRACE( "[%s][%s] enter", "CAknQueryControl", "~CAknQueryControl");
    AKNTASHOOK_REMOVE();
	if (iEdwin)
        AknsUtils::DeregisterControlPosition(iEdwin);
    else if (iNumberEdwin)
        AknsUtils::DeregisterControlPosition(iNumberEdwin);
    else if (iFloatingPointEditor)
        AknsUtils::DeregisterControlPosition(iFloatingPointEditor);
    else if (iDateEdwin)
        AknsUtils::DeregisterControlPosition(iDateEdwin);
    else if (iTimeEdwin)
        AknsUtils::DeregisterControlPosition(iTimeEdwin);
    else if (iDurationEdwin)
        AknsUtils::DeregisterControlPosition(iDurationEdwin);
    else if (iSecretEd)
        AknsUtils::DeregisterControlPosition(iSecretEd);
    else if (iPinEdwin)
        AknsUtils::DeregisterControlPosition(iPinEdwin);
    else if (iExtension && LocationEd())
    	AknsUtils::DeregisterControlPosition(LocationEd());
    

    delete iLineWidths;
    delete iEcsDetector;
    delete iEcsObserver;
    delete iPrompt;
    delete iEditIndicator;
    if ( iImage && iImage->IsPictureOwnedExternally() )
        {
        delete ((CApaMaskedBitmap*) iImage->Bitmap());
        }
    delete iImage;
    delete iEdwin;
    delete iDateEdwin;
    delete iTimeEdwin;
    delete iDurationEdwin;
    delete iSecretEd;
    delete iNumberEdwin;
    delete iPinEdwin;
    delete iFloatingPointEditor;
    if (iExtension)
    delete LocationEd();
    delete iAnimation;
    if ( iQueryType ) // As we must maintain BC, we cannot add private members or change protected members. 
        {         // We have to use iQueryType to distinguish if the context was added to stack or not
              // This won't affect to normal usage of iQueryType any way, only a way to indicate if 
                          // construction was succesful until context was set. 
        CCoeBrushAndPenContext* brushAndPenContext = (CCoeBrushAndPenContext*)ControlContext();
        delete brushAndPenContext;
        }
    CAknQueryExtension::DestroyExtension( this );
	delete iExtension;
        
#if defined( RD_SCALABLE_UI_V2)
    delete iIncreaseValueButton;
    delete iDecreaseValueButton;
#endif //defined( RD_SCALABLE_UI_V2)
    _AKNTRACE( "[%s][%s] exit", "CAknQueryControl", "~CAknQueryControl");
    }

/**
 * Construct from resource
 */
EXPORT_C void CAknQueryControl::ConstructFromResourceL(TResourceReader &aRes)
    {
    _AKNTRACE_FUNC_ENTER;
    // Construct extension
    CAknQueryExtension::CreateExtensionL( this );
    iExtension = new (ELeave)CAknQueryControlExtension;
    
    iEcsObserver   = new (ELeave) TAknQueryEcsObserver(this);
    iEditIndicator = CAknQueryEditIndicator::NewL(this);
    iEditIndicator->SetObserver(this);
    
    iLineWidths = new(ELeave)CArrayFixFlat<TInt>(5);

    CCoeBrushAndPenContext* brushAndPenContext=CCoeBrushAndPenContext::NewL();
    brushAndPenContext->SetBrushStyle(CGraphicsContext::ENullBrush);
    SetControlContext(brushAndPenContext);
    // This must be straight after setting Graphics Context, it is the only way to indicate
    // brushAndPenContext is added to stack or not.
    iQueryType = aRes.ReadUint16();
    __ASSERT_DEBUG(iQueryType, Panic(EAknPanicLayoutResourceProblem));
    
    iEditIndicator->SetQueryType(iQueryType);
    
    SetLineWidthsL();
    ReadPromptL(aRes);
    ConstructQueryL(aRes);

    CEikDialog* dlg;
    MopGetObject( dlg );
    if ( dlg )
        {
        if ( CAknEnv::Static()->TransparencyEnabled() )
            {
            dlg->Extension()->iPublicFlags.Set( CEikDialogExtension::EClipChildControlRect );
            }

        // set dialog's window as button group's container window in case a fullscreen
        // virtual input dialog is requested
        if ( EmbeddedVirtualInput() )
            {   
            CEikCba* cba = static_cast<CEikCba*>( dlg->ButtonGroupContainer().ButtonGroup() );
            cba->SetContainerWindowL( *this );
            dlg->ButtonGroupContainer().SetContainerWindowL( *cba );
            dlg->ButtonGroupContainer().SetParent( NULL );
            cba->SetPosition( TPoint( 0, 0 ) );
            
            iExtension->iKeypad = CAknKeypad::NewL( *this, iQueryType );
            }
        }
    _AKNTRACE_FUNC_EXIT;
    }

void CAknQueryControl::ConstructQueryL(TResourceReader& aRes)
    {
    _AKNTRACE( "[%s][%s] iQueryType : %d", "CAknQueryControl", "ConstructQueryL", iQueryType );
    switch(iQueryType)
        {
        case EConfirmationQueryLayout:
            {
            TPtrC bmpFile=aRes.ReadTPtrC();
            TInt bmpId=aRes.ReadInt16();
            TInt bmpMask=aRes.ReadInt16();
            TInt animationId = aRes.ReadUint32();

            // Animation overrides bitmap if it is set.
            if ( (animationId == 0) && (bmpFile.Length() != 0))
                {   
                iImage = new(ELeave) CEikImage;
                iImage->SetContainerWindowL(*this);
                
                TBool skinnedFound( EFalse );
                if ( bmpFile.CompareF(KAvkonBitmapFile) == 0 ) // Skinning is supported only avkon bitmaps
                    {
                    TAknsItemID id;
                    id.Set(0,0);
                    id = CAknNoteAttributes::GetSkinnedBitmapID(bmpId);
                    if ( id.iMajor && id.iMinor ) // skin id found, try loading
                        {
                        CApaMaskedBitmap* bitmap = NULL;
                        MAknsSkinInstance* skin = AknsUtils::SkinInstance();

                        TRAPD( err, bitmap = AknsUtils::CreateMaskedBitmapL(skin,id));
                        if ( !err ) 
                            {
                            CFbsBitmap* mask = bitmap->Mask();
                            iImage->SetPicture(bitmap,mask);
                            iImage->SetPictureOwnedExternally(ETrue);
                            skinnedFound = ETrue;
                            }
                        }
                    }
                if ( !skinnedFound) 
                    {
                    iImage->CreatePictureFromFileL(bmpFile,bmpId,bmpMask);
                    }
                }
            else
                {
                if (animationId == 0) 
                    {
                    // Default animation if neither bitmap nor animation is set.
                    animationId = R_QGN_NOTE_QUERY_ANIM;
                    }
                }
            
            if (animationId != 0)
                {
                if (!iAnimation)
                    {// no animation previously set
                    // Save animation ID for possible skin changes
                    
                    //iExtension->iAnimationId = animationId; 

                    TRAPD( err, SetAnimationL( animationId ) );
                    if ( err != KErrNone )
                        {
                        iAnimation = NULL;
                        }
                    }
                }
            break;
            }
        case EDataLayoutAllowEmptyInput:
            {
            CAknQueryExtension* extension = QueryExtension();
            if( extension )
                {
                extension->iAllowEmptyInput = ETrue;
                }
            iQueryType = EDataLayout;    
            // fall through
            }
        case EDataLayout:
        case EStaticSizeDataLayout:
            {
            iEdwin = new(ELeave)CEikEdwin;
            iEdwin->SetContainerWindowL(*this);
            iEdwin->SetEdwinObserver(this);
            iEdwin->ConstructFromResourceL(aRes);
            iEdwin->SetObserver(this);
            iEdwin->SetEdwinSizeObserver(this);
            
            
            
#if defined( RD_SCALABLE_UI_V2)

            if ( AknLayoutUtils::PenEnabled() )
                {
                if ( EmbeddedVirtualInput() )
        			{
      				CreateBackspaceButtonL();
      				//HACK
      				iEdwin->AddFlagToUserFlags( CEikEdwin::EAvkonDisableVKB );
      				
      				iEdwin->SetMaximumHeightInLines( 1 );
      				
    
        			}
                }
            
#endif //if defined( RD_SCALABLE_UI_V2)
            

//Set maximum height in lines to KMaxLinesInQuery if it is unset, or an
//invalid value has been used.
            if (!iEdwin->MaximumHeightInLines()||iEdwin->MaximumHeightInLines()>KMaxLinesInQuery)
                iEdwin->SetMaximumHeightInLines(KMaxLinesInQuery);

//If the maximum number of lines is 1, 
//  ensure flags are consistent with a single-line editor scrolling mechanism
//else
//  ensure flags are consistent with a multi-line editor scrolling mechanism

            if (1==iEdwin->MaximumHeightInLines())
                iEdwin->RemoveFlagFromUserFlags(EEikEdwinNoHorizScrolling | EEikEdwinResizable);
            else
                iEdwin->AddFlagToUserFlags(EEikEdwinNoHorizScrolling | EEikEdwinResizable);
            if (EDataLayout==iQueryType && iEdwin->InputCapabilities().IsNone())
                {
                iEdwin->SetAknEditorAllowedInputModes(EAknEditorTextInputMode | EAknEditorNumericInputMode );              
                }
            break;
            }
        case ECodeLayout:
            {
            iSecretEd = new(ELeave)CEikSecretEditor;
            iSecretEd->SetContainerWindowL(*this);
            iSecretEd->ConstructFromResourceL(aRes);
            iSecretEd->SetObserver(this);
            iSecretEd->SetSkinTextColorL(EAknsCIQsnTextColorsCG27);
            
            
#if defined( RD_SCALABLE_UI_V2)

            if ( AknLayoutUtils::PenEnabled() )
                {
                if ( EmbeddedVirtualInput() )
        			{
      				CreateBackspaceButtonL();
      				iSecretEd->SetFeature(CEikSecretEditor::EDisablePenInput, 1);
        			}
                }
            
#endif //if defined( RD_SCALABLE_UI_V2)
            
            break;
            }
        case EDateLayout:
            {
            iDateEdwin = new(ELeave)CEikDateEditor;
            iDateEdwin->SetContainerWindowL(*this);
            iDateEdwin->ConstructFromResourceL(aRes);
            iDateEdwin->SetObserver(this);
            iDateEdwin->SetSkinTextColorL(EAknsCIQsnTextColorsCG27);
            

#if defined( RD_SCALABLE_UI_V2)

            if ( AknLayoutUtils::PenEnabled() )
                {
       			if ( EmbeddedVirtualInput() )
        			{
      				CreateBackspaceButtonL();
      				iDateEdwin->SetFeature(CEikMfne::EDisablePenInput, 1);
        			}
        		else
        			{
        			iDateEdwin->SetFeature( CEikMfne::EFingerSupport, CEikMfne::EnableWithAllHighlight );
        			}
                }
            
#endif //if defined( RD_SCALABLE_UI_V2)
            
            break;
            }
        case ETimeLayout:
            {
            iTimeEdwin = new(ELeave)CEikTimeEditor;
            iTimeEdwin->SetContainerWindowL(*this);
            iTimeEdwin->ConstructFromResourceL(aRes);
            iTimeEdwin->SetObserver(this);
            iTimeEdwin->SetSkinTextColorL(EAknsCIQsnTextColorsCG27);
            
            
#if defined( RD_SCALABLE_UI_V2)

            if ( AknLayoutUtils::PenEnabled() )
                {
                if ( EmbeddedVirtualInput() )
        			{
      				CreateBackspaceButtonL();
      				iTimeEdwin->SetFeature(CEikMfne::EDisablePenInput, 1);
        			}
        		else
        			{
        			iTimeEdwin->SetFeature( CEikMfne::EFingerSupport, CEikMfne::EnableWithAllHighlight );
        			}
                }
                
#endif //if defined( RD_SCALABLE_UI_V2)
            
            break;
            }
        case EDurationLayout:
            {
            iDurationEdwin = new(ELeave)CEikDurationEditor;
            iDurationEdwin->SetContainerWindowL(*this);
            iDurationEdwin->ConstructFromResourceL(aRes);
            iDurationEdwin->SetObserver(this);
            iDurationEdwin->SetSkinTextColorL(EAknsCIQsnTextColorsCG27);
#if defined( RD_SCALABLE_UI_V2)

            if ( AknLayoutUtils::PenEnabled() )
                {
                iDurationEdwin->SetFeature( CEikMfne::EFingerSupport, CEikMfne::EnableWithAllHighlight );
                }
            
#endif //if defined( RD_SCALABLE_UI_V2)            
            break;
            }
        case ENumberLayout:
            {
            iNumberEdwin = new(ELeave)CAknIntegerEdwin;
            iNumberEdwin->SetContainerWindowL(*this);
            iNumberEdwin->ConstructFromResourceL(aRes);
            iNumberEdwin->SetObserver(this);
            break;
            }
        case EPinLayout:
            {
            iPinEdwin = new(ELeave)CAknNumericSecretEditor;
            iPinEdwin->SetContainerWindowL(*this);
            iPinEdwin->ConstructFromResourceL(aRes);
            iPinEdwin->SetObserver(this);
            iPinEdwin->SetSkinTextColorL(EAknsCIQsnTextColorsCG27);
            
            // reset tacticon playback counter and play tacticon, which
            // also resets the tacticon timer
            if ( iExtension )
                {
                iExtension->iPinTacticonsPlayed = 0;
                PlayPinCodeTacticon();
                }
            
#if defined( RD_SCALABLE_UI_V2)

            if ( AknLayoutUtils::PenEnabled() )
                {
                if ( EmbeddedVirtualInput() )
        			{
      				CreateBackspaceButtonL();
      				iPinEdwin->SetFeature(CEikSecretEditor::EDisablePenInput, 1);
        			}
                }
            
#endif //if defined( RD_SCALABLE_UI_V2)
                   
            break;
            }
        case EPhoneLayout:
            {
            iEdwin = new(ELeave)CEikEdwin;
            iEdwin->AddFlagToUserFlags(EEikEdwinAlternativeWrapping);
            iEdwin->SetContainerWindowL(*this);
            iEdwin->SetEdwinObserver(this);
            iEdwin->ConstructFromResourceL(aRes);
            iEdwin->SetEdwinSizeObserver(this);

//Set maximum height in lines to KMaxLinesInQuery if it is unset, or an
//invalid value has been used.
            if (!iEdwin->MaximumHeightInLines()||iEdwin->MaximumHeightInLines()>KMaxLinesInQuery)
                iEdwin->SetMaximumHeightInLines(KMaxLinesInQuery);

//If the maximum number of lines is 1, 
//  ensure flags are consistent with a single-line editor scrolling mechanism
//else
//  ensure flags are consistent with a multi-line editor scrolling mechanism

            if (1==iEdwin->MaximumHeightInLines())
                iEdwin->RemoveFlagFromUserFlags(EEikEdwinNoHorizScrolling | EEikEdwinResizable);
            else
                iEdwin->AddFlagToUserFlags(EEikEdwinNoHorizScrolling | EEikEdwinResizable);
            iEdwin->SetAknEditorInputMode(EAknEditorNumericInputMode);
            iEdwin->SetAknEditorAllowedInputModes(EAknEditorNumericInputMode);
            iEdwin->SetObserver(this);
            break;
            }
        case EFloatingPointLayout:
            {
            iFloatingPointEditor = new ( ELeave ) CEikFloatingPointEditor;
            iFloatingPointEditor->SetContainerWindowL( *this );
            iFloatingPointEditor->SetEdwinObserver( this );
            iFloatingPointEditor->ConstructFromResourceL( aRes );
            iFloatingPointEditor->SetAknEditorAllowedInputModes( EAknEditorNumericInputMode );
            iFloatingPointEditor->SetObserver(this);
            break;
            }
        default:
              __ASSERT_DEBUG(0, Panic(EAknPanicLayoutControlResourceProblem));
            break;
    }

    // Construct editor context
    CAknQueryExtension* extension = QueryExtension();
    if( extension )
        {
        extension->CreateEditorContextL();
        }
    _AKNTRACE_FUNC_EXIT;
    }

TInt CAknQueryControl::PinCodeTimeoutCallback( TAny* aThis )
    {
    _AKNTRACE_FUNC_ENTER;
    // play tacticon
    static_cast<CAknQueryControl*>( aThis )->PlayPinCodeTacticon();
    _AKNTRACE_FUNC_EXIT;
    return KErrNone;
    }

void CAknQueryControl::PlayPinCodeTacticon()
    {
    _AKNTRACE_FUNC_ENTER;
    // play tacticon
    RTacticon client;
    if ( KErrNone == client.Connect() )
    	{
    	client.PlayTacticon( ENeutralTacticon );
    	client.Close();
    	}
    
    if ( iExtension )
        {
        iExtension->iPinTacticonsPlayed++;
        
        // if the maximum amount of pincode query tacticons has not been
        // reached, reset timer
        if ( iExtension->iPinTacticonsPlayed < KPinCodeMaxTacticons )
            {
            ResetPinCodeTacticonTimer();
            }
        else
            {
            // max amount reached, stop timer for good
            StopPinCodeTacticonTimer();
            }
        }
    _AKNTRACE_FUNC_EXIT;
    }

void CAknQueryControl::ResetPinCodeTacticonTimer()
    {
    _AKNTRACE_FUNC_ENTER;
    // stop old timer
    StopPinCodeTacticonTimer();

    if ( iExtension )
        {
        // create new one
        iExtension->iPinTacticonTimer = 
            CPeriodic::New( CActive::EPriorityStandard );
        
        // start timer, if creation succeeded
        if ( iExtension->iPinTacticonTimer )
            {
            iExtension->iPinTacticonTimer->Start( 
                        KPinCodeTacticonInterval, KPinCodeTacticonInterval,
                        TCallBack( PinCodeTimeoutCallback, this ) );
            }
        }
    _AKNTRACE_FUNC_EXIT;
    }

void CAknQueryControl::StopPinCodeTacticonTimer()
    {
    _AKNTRACE_FUNC_ENTER;
    if ( iExtension )
        {
        // delete timer
        delete iExtension->iPinTacticonTimer;
        
        // set the timer null, so that it will not be used again
        iExtension->iPinTacticonTimer = NULL;
        }
    _AKNTRACE_FUNC_EXIT;
    }

///
/// CCoeControl methods
///

/**
 *Returns the control owned by this control by the index
 */
CCoeControl* CAknQueryControl::ComponentControl(TInt anIndex) const
    {
    if ( AknLayoutUtils::PenEnabled() )
        {
        CCoeControl* cba = NULL;
        CEikDialog* dialog;
        
        const_cast<CAknQueryControl*>( this )->MopGetObject( dialog );
        
        if ( dialog && EmbeddedVirtualInput() )
            {
            cba = static_cast<CEikCba*>( dialog->ButtonGroupContainer().ButtonGroup() );
            }

        CCoeControl* controls[] = { iPrompt, 
                                    iEditIndicator, 
                                iEdwin, iDateEdwin, LocationEd(), 
                                    iTimeEdwin, iSecretEd, iDurationEdwin,
                                    iNumberEdwin, iPinEdwin, iFloatingPointEditor,
                                    iImage, iAnimation
#if defined( RD_SCALABLE_UI_V2)                              
                                    ,iIncreaseValueButton, iDecreaseValueButton
                                    ,( iExtension && iExtension->iKeypad) ? cba : NULL
                                    ,iExtension ? iExtension->iKeypad : NULL
                                    ,iExtension ? iExtension->iBackspaceButton : NULL
#endif //if defined( RD_SCALABLE_UI_V2)                         
                                    };
        
        for (TUint ii=0;ii<sizeof(controls)/sizeof(CCoeControl*);ii++)
            {
            //subtle: index is decremented only if control is not NULL!
            if (controls[ii] && anIndex-- == 0) 
                {
                return controls[ii];
                }
            }
        }
    else
        {
        CCoeControl* controls[] = { iPrompt, 
                                    iEditIndicator, 
                                	iEdwin, iDateEdwin, LocationEd(), 
                                    iTimeEdwin, iSecretEd, iDurationEdwin,
                                    iNumberEdwin, iPinEdwin, iFloatingPointEditor,
                                    iImage, iAnimation
                                    };
        //TODO add buttons to array

        
        for (TUint ii=0;ii<sizeof(controls)/sizeof(CCoeControl*);ii++)
            {
            //subtle: index is decremented only if control is not NULL!
            if (controls[ii] && anIndex-- == 0) 
                {
                return controls[ii];
                }
            }
        }
    return NULL;
    }     

/**
 * Returns the number of controls inside the compound control.
 */
TInt CAknQueryControl::CountComponentControls() const
    {
    TInt count = 0;
    if ( AknLayoutUtils::PenEnabled() )
        {
        CCoeControl* cba = NULL;
        CEikDialog* dialog;
        
        const_cast<CAknQueryControl*>( this )->MopGetObject( dialog );
        
        if ( dialog && EmbeddedVirtualInput() )
            {
            cba = static_cast<CEikCba*>( dialog->ButtonGroupContainer().ButtonGroup() );
            }

        CCoeControl* controls[] = { iPrompt,
                                    iEditIndicator,
                                    iEdwin, iDateEdwin, LocationEd(),
                                    iTimeEdwin, iSecretEd, iDurationEdwin,
                                    iNumberEdwin, iPinEdwin, iFloatingPointEditor,
                                    iImage, iAnimation
#if defined( RD_SCALABLE_UI_V2)                              
                                    ,iIncreaseValueButton, iDecreaseValueButton,
                                    ( iExtension && iExtension->iKeypad) ? cba : NULL,
                                    iExtension ? iExtension->iKeypad : NULL,
                                    iExtension ? iExtension->iBackspaceButton : NULL
#endif //if defined( RD_SCALABLE_UI_V2)                                   
                                };
                                
        for (TUint ii=0;ii<sizeof(controls)/sizeof(CCoeControl*);ii++)
            {
            if (controls[ii])
                {
                count++;
                }
            }
        }
    else
        {
        CCoeControl* controls[] = { iPrompt,
                                    iEditIndicator,
                                	iEdwin, iDateEdwin, LocationEd(),
                                    iTimeEdwin, iSecretEd, iDurationEdwin,
                                    iNumberEdwin, iPinEdwin, iFloatingPointEditor,
                                    iImage, iAnimation
                                };
                                
        for (TUint ii=0;ii<sizeof(controls)/sizeof(CCoeControl*);ii++)
            {
            if (controls[ii])
                {
                count++;
                }
            }
        }
    return count;
    }

/**
 * Forward key event to the editor
 */
EXPORT_C TKeyResponse CAknQueryControl::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType) 
    {
    _AKNTRACE( "[%s][%s] aKeyEvent.iCode :%d, aType:%d ", "CAknQueryControl", __FUNCTION__, aKeyEvent.iCode, aType);
    TKeyResponse response( EKeyWasNotConsumed );

    // Send key handling for emergency call support
    if ( aKeyEvent.iCode == EKeyYes )
        {
        if ( iEcsDetector )
            {
            AttemptEmergencyCallL();
            }
        // Always eat the key, however, as in former handling of this key
        response = EKeyWasConsumed;
        }

    CCoeControl* ctrl = ControlByLayoutOrNull( iQueryType );
    if ( ctrl && ctrl->IsFocused() )
        {
        response = ctrl->OfferKeyEventL( aKeyEvent, aType );
        
        // pin query received key, reset timer if it exists
        if ( iExtension && iExtension->iPinTacticonTimer && 
             iQueryType == EPinLayout && response == EKeyWasConsumed )
            {
            ResetPinCodeTacticonTimer();
            }
        }
    _AKNTRACE_FUNC_EXIT;
    return response;
    }

/**
 * Handle a focus changed
 */
void CAknQueryControl::FocusChanged(TDrawNow aDrawNow)
    {
    CCoeControl* ctrl = ControlByLayoutOrNull( iQueryType );
    if (ctrl)
        {
        ctrl->DrawDeferred();
        ctrl->SetFocus( IsFocused(), aDrawNow );
        Layout();
        }
    if ( iAnimation )
        {
        iAnimation->SetFocus( IsFocused(), aDrawNow );
        }
    }

void CAknQueryControl::PrepareForFocusLossL()
    {
    CCoeControl* ctrl = ControlByLayoutOrNull( iQueryType );
    if (ctrl)
        {
        ctrl->PrepareForFocusLossL(); 
        }
    }

///
/// Observer related methods (Handle* methods)
///

//
//Set observer for component
//
EXPORT_C void CAknQueryControl::SetQueryControlObserver(MAknQueryControlObserver* aQueryControlObserver)
    {
    iQueryControlObserver = aQueryControlObserver;
    }

//
//Handle edwin events
//
EXPORT_C void CAknQueryControl::HandleEdwinEventL(CEikEdwin* /*aEdwin*/,TEdwinEvent /*aEventType*/)
    {

    }

//
//Call observer when edwin size changed
//
EXPORT_C TBool CAknQueryControl::HandleEdwinSizeEventL(CEikEdwin* /*aEdwin*/, TEdwinSizeEvent /*aEventType*/, TSize /*aDesirableEdwinSize*/)
    {
    TInt editorNbr = NbrOfEditorLines(); 
    TInt maxLines = KMaxLinesInQuery; 
    if (iEdwin)
        {
        const TInt mHIL = iEdwin->MaximumHeightInLines();
        if (mHIL)
            {
            maxLines = mHIL;
            }
        }

    if(iQueryControlObserver  && editorNbr <= maxLines)
        {
        iQueryControlObserver->HandleQueryEditorSizeEventL(this,MAknQueryControlObserver::EQueryControltSizeChanging);
        }
    return EFalse;
    }


EXPORT_C void CAknQueryControl::HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType)
    {
    if (iEditIndicator && aControl == iEditIndicator)
    	{
    	if ( iExtension && iExtension->iKeypad )
        	{
        	iExtension->iKeypad->SetState(iEditIndicator->State());
        	}
        return;	
    	}
    
    if(iQueryControlObserver && aEventType == EEventStateChanged)
        {
        if ( iNumberEdwin || iFloatingPointEditor)
            {
            TInt intValue;
            TReal realValue;
            CAknNumericEdwin::TValidationStatus status = iNumberEdwin ?
                iNumberEdwin->GetTextAsInteger(intValue) : 
                    iFloatingPointEditor->GetValueAsReal(realValue);
            switch( status )
                {
                case CAknNumericEdwin::EEmpty:
                    {
                    iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorEmpty);   
                    break;
                    }
                case CAknNumericEdwin::EValueTooLarge:
                    {
                    iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorValueTooLarge);   
                    break;
                    }
                case CAknNumericEdwin::EValueTooSmall:
                    {
                    iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorValueTooSmall);   
                    break;
                    }
                case CAknNumericEdwin::EValueNotParsed:
                    {
                    iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorValueNotParsed);  
                    break;
                    }
                case CAknNumericEdwin::EValueValid:
                    {
                    iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorValueValid);  
                    break;
                    }
                default:
                    break;
                }
            }
        else
            {
            if(GetTextLength())
                {
                iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorValueValid);
                }
            else
                {
                iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorEmpty);
                }
            }

        // Emergency Call support. Set the buffer in the Ecs copied from the editor
        if ( iEcsDetector )
            {
            if ( iNumberEdwin || iPinEdwin )
                {
                // In either case, we need to copy the first KAknEcsMaxMatchingLength
                // characters to the emergency call buffer
                if ( iNumberEdwin )
                    {
                    TBuf<KAknEcsMaxMatchingLength> buf;
                    iNumberEdwin->Text()->Extract(buf, 0, KAknEcsMaxMatchingLength );
                    iEcsDetector->SetBuffer( buf );
                    }   
                else if ( iPinEdwin )
                    {
                    TPtrC secretBuffer = iPinEdwin->Buffer().Left(KAknEcsMaxMatchingLength);
                    iEcsDetector->SetBuffer( secretBuffer );
                    // Manage appearance of the PIN query
                    // If match is complete, or complete + Send key, show the number
                    TBool reveal = EFalse;
                    TInt ecsState( iEcsDetector->State() );
                    if ( ( ecsState == CAknEcsDetector::ECompleteMatch ) ||
                         ( ecsState == CAknEcsDetector::EServiceNumMatch ) ||
                         ( ecsState == CAknEcsDetector::ECompleteMatchThenSendKey ) )
                        {
                        // Further check to ensure that the matched number is the entire buffer
                        // Get the matched text and see if is the same length as the current query length
                        if ( GetTextLength() == iEcsDetector->CurrentMatch().Length() ) 
                            {
                            reveal = ETrue;
                            
                            if ( ecsState == CAknEcsDetector::ECompleteMatch || 
                                 ecsState == CAknEcsDetector::EServiceNumMatch )
                                {
                                SetEcsCbaVisibleL( ETrue );
                                }
                            }
                        }
                    _AKNTRACE( "[%s][%s] iPinEdwin->RevealSecretText( %d )", "CAknQueryControl", __FUNCTION__, reveal);
                    iPinEdwin->RevealSecretText( reveal );
                    }
                }
            }
            
        if (aControl)
            {
            
#if defined( RD_SCALABLE_UI_V2)
            if ( AknLayoutUtils::PenEnabled() )
                {
                if(aControl == iIncreaseValueButton)
                    {
                    if(iTimeEdwin)
                        {
                        iTimeEdwin->HandleMfneCommandL(MAknMfneCommandObserver::EMfneIncrementCurrentFieldValue);
                        }
                    if(iDateEdwin)
                        {
                        iDateEdwin->HandleMfneCommandL(MAknMfneCommandObserver::EMfneIncrementCurrentFieldValue);
                        }
                    if(iDurationEdwin)
                        {
                        iDurationEdwin->HandleMfneCommandL(MAknMfneCommandObserver::EMfneIncrementCurrentFieldValue);
                        }                            
                    if(iExtension && LocationEd())
                        {
                        LocationEd()->HandleMfneCommandL(MAknMfneCommandObserver::EMfneIncrementCurrentFieldValue);
                        }
                         
                    }
                else if(aControl == iDecreaseValueButton)
                    {
                    if(iTimeEdwin)
                        {
                        iTimeEdwin->HandleMfneCommandL(MAknMfneCommandObserver::EMfneDecrementCurrentFieldValue);
                        }
                    if(iDateEdwin)
                        {
                        iDateEdwin->HandleMfneCommandL(MAknMfneCommandObserver::EMfneDecrementCurrentFieldValue);
                        }
                    if(iDurationEdwin)
                        {
                        iDurationEdwin->HandleMfneCommandL(MAknMfneCommandObserver::EMfneDecrementCurrentFieldValue);
                        }                        
                    if(iExtension && LocationEd())
                        {
                        LocationEd()->HandleMfneCommandL(MAknMfneCommandObserver::EMfneIncrementCurrentFieldValue);
                        }
                    }
                else if( iExtension && aControl == iExtension->iBackspaceButton )
                    {
                    TInt scanCode = EStdKeyBackspace;
            		TRawEvent event;
            		event.Set( TRawEvent::EKeyDown, scanCode );
            		event.SetTip( ETrue );
            		
					if (iEikonEnv->AppUi())
						{
						static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->DisableNextKeySound( scanCode );
						}	
            		
            		CCoeEnv::Static()->WsSession().SimulateRawEvent( event );
            		event.Set( TRawEvent::EKeyUp, scanCode );
            		CCoeEnv::Static()->WsSession().SimulateRawEvent( event );
                    }
                }
#endif //if defined( RD_SCALABLE_UI_V2)
            }
        }
    }

///
/// DRAWING METHODS
///

/**
 * Draw the following:-
 *  - Text editor frame if there is a text editor, which is true for all
 *    queries except confirmation queries  
 */
void CAknQueryControl::Draw(const TRect& /*aRect*/) const
    {
    CWindowGc& gc=SystemGc(); 
    TRect rect(Rect());
    
    TRect dialogRect = DialogRect();
    rect.iBr.iY += dialogRect.iBr.iY; 

    MAknsSkinInstance* skin = AknsUtils::SkinInstance();

    TRgb color;
    TInt error = AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG19 );
    if ( !error )
        {        
        TRAP_IGNORE(AknLayoutUtils::OverrideControlColorL( *(CAknQueryControl*)this, EColorLabelText, color ) );
        }

    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );

    if ( CAknEnv::Static()->TransparencyEnabled() )
        {
        RRegion clipReg;
        clipReg.AddRect( rect );
    
        if ( iHasEditor )
            {
            clipReg.SubRect( iEditorFrame.Rect() );
            }
    
        if ( iEditIndicator )
            {
            clipReg.SubRect( 
                TRect( iEditIndicator->Position(),
                iEditIndicator->Size() ) );
            }

        gc.SetClippingRegion( clipReg );
        clipReg.Close();
        
        AknsDrawUtils::Background( skin, cc, this, gc, rect, KAknsDrawParamNoClearUnderImage );
        
        clipReg.AddRect( rect );

        CCoeControl* ctrl = const_cast<CAknQueryControl*>(this)->ControlByLayoutOrNull( iQueryType );
        if ( ctrl )
            {
            clipReg.SubRect( ctrl->Rect() );
            }

        gc.CancelClippingRegion();
        gc.SetClippingRegion( clipReg );
        clipReg.Close();
        }
    else
        {
            AknsDrawUtils::Background( skin, cc, this, gc, rect );
        }

    DrawEditorFrame(gc,rect);
 
    if ( CAknEnv::Static()->TransparencyEnabled() )
        {
        gc.CancelClippingRegion();
        }
    }

/**
 * Draw text editor frame and shadow 
 */
void CAknQueryControl::DrawEditorFrame(CWindowGc& aGc,TRect& /*aRect*/) const
    {
    if (iHasEditor)
        {
        TBool skinnedDraw( EFalse );

        CAknQueryExtension* extension = QueryExtension();
        if( extension && extension->EditorContext() )
            {
            // If first-level image exists, frame has already been drawn
            // as part of the context.

            if ( CAknEnv::Static()->TransparencyEnabled() )
                {
                const CCoeControl* ctrl = const_cast<CAknQueryControl*>(this)->ControlByLayoutOrNull( iQueryType );
                if ( ctrl )
                    {
                    skinnedDraw = AknsDrawUtils::Background( 
                        AknsUtils::SkinInstance(), 
                        extension->EditorContext(), 
                        ctrl,
                        aGc,
                        iEditorFrame.Rect(),
                        KAknsDrawParamNoClearUnderImage ); 
                    }
                }
            else
                {
                skinnedDraw = AknsDrawUtils::Background( 
                    AknsUtils::SkinInstance(), 
                    extension->EditorContext(), 
                    aGc, 
                    iEditorFrame.Rect() );                 
                }
            }

        // ... otherwise, draw the non-skinned frame
        if( !skinnedDraw )
            {
            iEditorFrame.DrawOutLineRect(aGc);
            iEditorVerShadow.DrawRect(aGc); 
            iEditorHorShadow.DrawRect(aGc);
            }
        }
    }


///
/// LAYOUT METHODS
///

/**
 * Depending on query type and on the number of prompt or editor lines 
 * return the window layout.
 *
 * This is used by a dialog to layout the control correctly.
 *
 */
void CAknQueryControl::WindowLayout( TAknWindowLineLayout& aLayout ) const
    {
    if ( EmbeddedVirtualInput() )
        {
        aLayout = AknLayoutScalable_Avkon::application_window( 0 );
        return;
        }

    TIndex LAFIndex(NbrOfPromptLines());

    switch (KQueryTypeToLayout[iQueryType])
        {
        case EConfQueryLayoutM:
            aLayout = AknLayoutScalable_Avkon::popup_note_window(LAFIndex.PNWindow());
            break;
               
        case EDataQueryLayoutM: 
            aLayout = AknLayoutScalable_Avkon::popup_query_data_window(LAFIndex.PQDWindow(NbrOfEditorLines()));
            break;
   
        case ECodeQueryLayoutM:
            aLayout = AknLayoutScalable_Avkon::popup_query_code_window(LAFIndex.PQCWindow());
            break;
        
        case ETimeQueryLayoutM:
            aLayout = AknLayoutScalable_Avkon::popup_query_code_window(LAFIndex.PQCWindow());
            break;

        case EDateQueryLayoutM:
            aLayout = AknLayoutScalable_Avkon::popup_query_code_window(LAFIndex.PQCWindow());;
            break;

        default:
            __ASSERT_DEBUG(0,Panic(EAknPanicNotSupported));
            aLayout = AknLayoutScalable_Avkon::popup_note_window(LAFIndex.PNWindow());            
            break;
        }
    }

/**
 * Layout information in LAF is relative to the size of the dialog and not to the
 * size of the internal area (dialog size - margins from UIKLAF). Therefore when
 * doing layout do not use Rect(), but LayoutRect() - which returns the size of the
 * dialog.
 *
 * Position is always (0,0) - top 
 *
 */
TRect CAknQueryControl::LayoutRect() 
    {
#ifndef RD_NO_DIALOG_BORDERS    
	TPoint topLeft = Position();
    TRect parent   = DialogRect();
	TAknLayoutRect layout;

	if (KQueryTypeToLayout[iQueryType] == EDataQueryLayoutM)
		layout.LayoutRect(parent, AKN_LAYOUT_WINDOW_Data_query_pop_up_window_graphics_Line_5(parent));
    else
		layout.LayoutRect(parent, AKN_LAYOUT_WINDOW_Note_pop_up_window_graphics_Line_5(parent));

	TRect rect(layout.Rect());
	topLeft.iX -= rect.iTl.iX;
    topLeft.iY -= rect.iTl.iY;

    TPoint bottomRight (topLeft);
    TSize  size (DialogSize());
    bottomRight.iY += size.iHeight; 
    bottomRight.iX += size.iWidth;

    return TRect(topLeft,bottomRight);
#else
    return Rect();
#endif        		
    }

/**
 * Do layout (call SizeChanged) and if the control is
 * activated do a redraw
 */
void CAknQueryControl::Layout()
    {
    SizeChanged();
    }

/**
 * Perform layout depending on query type.
 */
void CAknQueryControl::SizeChanged()
    {  
    DialogSizeChanged();
    iPrompt->SetRect(LayoutRect());
    LayoutPrompt(KQueryTypeToLayout[iQueryType]);

    LayoutImageOrAnim(KQueryTypeToLayout[iQueryType]);
    LayoutEditor(KQueryTypeToLayout[iQueryType]);
    
    
	// Layout Keypad
    
    if ( iExtension && iExtension->iKeypad )
    	{
        TBool landscape = Layout_Meta_Data::IsLandscapeOrientation();
     
        TAknLayoutRect layoutRect;
        layoutRect.LayoutRect( LayoutRect(), TAknWindowComponentLayout::Compose(
            AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ), 
            AknLayoutScalable_Apps::grid_vitu2_itu_pane( landscape ? 5 : 0 ) ).LayoutLine() );
                 
        iExtension->iKeypad->SetRect( layoutRect.Rect() ); 
        }

        
    // Layout Backspace Button
     
     if ( iExtension && iExtension->iBackspaceButton )
        {
        TBool landscape = Layout_Meta_Data::IsLandscapeOrientation();
     
        TAknLayoutRect layoutRect;
 		layoutRect.LayoutRect( LayoutRect(), TAknWindowComponentLayout::Compose(
 			AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ), 
    		AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ) ).LayoutLine() );
    
        TAknLayoutRect layout;
 		layout.LayoutRect(layoutRect.Rect(), AknLayoutScalable_Apps::bg_button_pane_cp022( 0 ));
 
		iExtension->iBackspaceButton->SetRect(layout.Rect());
        }
        
    // Layout CBA
    
    CEikDialog* dlg;
    MopGetObject( dlg );
    if ( dlg )
        {
        // Note: iExtension->iKeypad is used to ensure that SetRect is not called too early
	    if ( iExtension && iExtension->iKeypad && EmbeddedVirtualInput() )
            {   
            CEikCba* cba = static_cast<CEikCba*>( dlg->ButtonGroupContainer().ButtonGroup() );   
            
            TBool landscape = Layout_Meta_Data::IsLandscapeOrientation();
            
        	TAknLayoutRect layoutRect;
 			layoutRect.LayoutRect( LayoutRect(), TAknWindowComponentLayout::Compose(
 				AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ), 
    		AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ) ).LayoutLine() );
        
			TAknLayoutRect leftLayout;
			leftLayout.LayoutRect(layoutRect.Rect(), AknLayoutScalable_Apps::bg_button_pane_cp018( 0 ));

			TAknLayoutRect rightLayout;
			rightLayout.LayoutRect(layoutRect.Rect(), AknLayoutScalable_Apps::bg_button_pane_cp021( 0 ));
       		
       		TRect rect;
       		if ( AknLayoutUtils::LayoutMirrored() )
       		    {
       		    rect.iTl = rightLayout.Rect().iTl;
       		    rect.iBr = leftLayout.Rect().iBr;
       		    }
       		else
       		    {
       		    rect.iTl = leftLayout.Rect().iTl;
       		    rect.iBr = rightLayout.Rect().iBr;
       		    }
       		    
       		cba->SetRect( rect );
            }
        }
    
    CAknQueryExtension* extension = QueryExtension();
    if( iHasEditor && extension && extension->EditorContext() )
        {
        // Layout editor context
        TAknLayoutRect topLeft;
        TAknLayoutRect bottomRight;
        
        //How to handle lanscape layout in full screen queries? 
        
        topLeft.LayoutRect(iEditorFrame.Rect(), SkinLayout::Input_field_skin_placing__general__Line_2());                
        bottomRight.LayoutRect(TRect(iEditorFrame.Rect().iBr, iEditorFrame.Rect().iBr), SkinLayout::Input_field_skin_placing__general__Line_5());

        TRect outerRect = TRect(topLeft.Rect().iTl, bottomRight.Rect().iBr);
        TRect innerRect = TRect(topLeft.Rect().iBr, bottomRight.Rect().iTl);
        

        extension->EditorContext()->SetFrameRects( outerRect, innerRect );
        // Chain with the background (since the frame doesn't occupy the entire
        // layout and it may even be transparent)
        extension->EditorContext()->SetParentContext( AknsDrawUtils::ControlContextOfParent( this ) );
        

#if defined( RD_SCALABLE_UI_V2)

		// Create backspace button if not created yet
		if ( AknLayoutUtils::PenEnabled() && EmbeddedVirtualInput() )
			{
			TRAP_IGNORE( CreateBackspaceButtonL() );
			}

#endif //if defined( RD_SCALABLE_UI_V2)
        }

    if (iImage)
        {
        TAknLayoutRect rect;
        rect.LayoutRect( Rect(), AKN_LAYOUT_WINDOW_Note_pop_up_window_elements_Line_1 );
        AknIconUtils::SetSize( CONST_CAST( CFbsBitmap*, iImage->Bitmap() ), rect.Rect().Size() );
        }            
    }

/**
 * Return the minimum size for the control. 
 *
 * This depends on the type of query and the number of prompt and/or
 * editor lines.
 *
 * Changed this to use only data-query layout
 */
EXPORT_C TSize CAknQueryControl::MinimumSize()
    {	
    DialogSizeChanged();
#ifndef RD_NO_DIALOG_BORDERS
	TRect parent = DialogRect();
	TAknLayoutRect layout;
	layout.LayoutRect(parent, AKN_LAYOUT_WINDOW_Data_query_pop_up_window_graphics_Line_5(parent));
	TRect rect(layout.Rect());
	return (TSize(rect.Size()));
#else
    return DialogRect().Size();
#endif
    }

/**
 * Return rect that is used by dialog to lay itself out
 * This is determined by LAF values only.
 */
TRect CAknQueryControl::DialogRect() const
    {
    return TRect(TPoint(0,0),DialogSize());
    }
    
/**
 * Return the size of the dialog 
 */
TSize CAknQueryControl::DialogSize() const
    {
    return iDialogSize;
    }
    
/**
 * Calculates the size of the dialog. This is determined by
 * LAF values only.
 */
void CAknQueryControl::DialogSizeChanged()
    {
    TAknWindowLineLayout lay;
    WindowLayout( lay );
	TAknLayoutRect layout;
	layout.LayoutRect(Rect(), lay);
	TRect rect(layout.Rect());	
	iDialogSize = TSize(rect.Size());
    }
    
/**
* Layout the query prompt. 
*
* There are two possible ways of laying
* out the text, either according to the general note LAF specs
* or according to the data query LAF specs
*
* Data queries layout the prompt according to data query LAF specs.
* Other queries layout the text according to the general note spces
*
* This method is called from SizeChanged, which determines the layout method
* to use (general note or data query) depending on the query type.
*/
void CAknQueryControl::LayoutPrompt(const TLayoutMethod& aLayoutM)
    {
    __ASSERT_DEBUG(iPrompt,Panic(EAknPanicNullPointer));
    
    if ( AknLayoutUtils::PenEnabled() && EmbeddedVirtualInput() )
    	{
    	LayoutPromptForFullScreen();
        return;     		
   		}
       
    TRect rect = LayoutRect();
    for (TInt i = 0; i < NbrOfPromptLines(); i++)
        {
        if (aLayoutM == EConfQueryLayoutM)
            {
            // AknLayoutScalable_Avkon::popup_note_window_t1 ? 
            AknLayoutUtils::LayoutLabel(iPrompt->Line(i), rect, AKN_LAYOUT_TEXT_Note_pop_up_window_texts_Line_1(i) );
            }
        else if (aLayoutM == ECodeQueryLayoutM || aLayoutM == ETimeQueryLayoutM || aLayoutM == EDateQueryLayoutM )
            {
            // AknLayoutScalable_Avkon::popup_query_code_window_t1 ? 
            AknLayoutUtils::LayoutLabel(iPrompt->Line(i), rect, AKN_LAYOUT_TEXT_Code_query_pop_up_window_texts_Line_1(i) );
            }
        else if (aLayoutM == EDataQueryLayoutM)
            {
            // AknLayoutScalable_Avkon::popup_query_code_window_t1 ?             
            AknLayoutUtils::LayoutLabel(iPrompt->Line(i), rect, AKN_LAYOUT_TEXT_Data_query_pop_up_window_texts_Line_1(i));
            }        
        else
            {
            __ASSERT_DEBUG(0,Panic(EAknPanicNotSupported));
            }
        }
    }

/**
 * Layout the image or the animation.
 *
 * Confirmation queries can have either an image or an animation and the
 * layout is similar to general notes.
 *
 * This method is called from SizeChanged.
 */
void CAknQueryControl::LayoutImageOrAnim(const TLayoutMethod& aLayoutM)
    {
    if (aLayoutM == EConfQueryLayoutM)
        {
        // AknLayoutScalable_Avkon::popup_note_window_g1() ? 
        if (iImage)
            AknLayoutUtils::LayoutImage(iImage, LayoutRect(), AKN_LAYOUT_WINDOW_Note_pop_up_window_elements_Line_1);
        
        if (iAnimation)
            AknLayoutUtils::LayoutControl(iAnimation, LayoutRect(), AKN_LAYOUT_WINDOW_Note_pop_up_window_elements_Line_1);
        }
    }

/**
 * Layout the editor and its frame.
 *
 * Queries other than confirmation queries have an editor that the user needs
 * to input the query data. This method does the layout of the editor. 
 *
 * Data queries have a resizable editor and its layout is specified in the LAF.
 * 
 * Other queries have a fixed size editor with layout specified.
 *
 *
 * This method is called from SizeChanged. Depending on the query type, the
 * layout method is chosen accordingly, e.g. data queries use the data query
 * method, other queires use the code query method.
 *
 * The macros at the top are just for avoiding code repetition.
 */
void CAknQueryControl::LayoutEditor(const TLayoutMethod& aLayoutM)
    {
    if ( AknLayoutUtils::PenEnabled() && EmbeddedVirtualInput() )
    	{
    	LayoutEditorForFullScreen( aLayoutM );
    	return;
    	}
    
    TIndex LAFIndex(NbrOfPromptLines());
    
    if (aLayoutM == EDataQueryLayoutM)
        {
        iHasEditor = ETrue;
        
        LayoutEditorFrame(aLayoutM);
        
        LayoutEditorIndicator(aLayoutM);

        TInt promptLines = NbrOfPromptLines();
        TInt numberTextLines = NbrOfEditorLines();

        TInt isNumeric = 0;
        CEikEdwin* editor = iEdwin;
        if (iNumberEdwin)
            {
            editor = iNumberEdwin;
            }
        else if (iFloatingPointEditor)
            {
            editor = iFloatingPointEditor;
            }
        
        if ( editor )
            {
            TRect parentRect = LayoutRect();
            if (promptLines > 1)
                {
                // There isn't way to give number of prompt lines to layout adaptation layer 
                // through Data_query_pop_up_window_texts_Line_2 layout API. Adaptation layer
                // does'n know which layout should be used. For that reason 2nd and 3rd prompt
                // line area is reduced from the parent rect and adaptation layer expects
                // that only one prompt line exists. 
                TAknLayoutText prompt1;
                prompt1.LayoutText(parentRect, AKN_LAYOUT_TEXT_Data_query_pop_up_window_texts_Line_1(0));
                
                TAknLayoutText prompt2;
                prompt2.LayoutText(parentRect, AKN_LAYOUT_TEXT_Data_query_pop_up_window_texts_Line_1(1));

                TInt parentOffset = prompt2.TextRect().iBr.iY - prompt1.TextRect().iBr.iY;
                parentRect.iTl.iY += parentOffset * (promptLines - 1);
                }
            AknLayoutUtils::LayoutEdwin( editor, parentRect,
                AKN_LAYOUT_MULTILINE_TEXT_Data_query_pop_up_window_texts_Line_2( isNumeric, numberTextLines ), EAknsCIQsnTextColorsCG27);
            
            //layout data not correct? if editor height is bigger than frame - reduce editor height by one step
            if (numberTextLines >= KMaxLinesInQuery && editor->Rect().iBr.iY > iEditorFrame.Rect().iBr.iY) 
                {
            	AknLayoutUtils::LayoutEdwin( editor, parentRect,
                    AKN_LAYOUT_MULTILINE_TEXT_Data_query_pop_up_window_texts_Line_2( isNumeric, numberTextLines-1 ), EAknsCIQsnTextColorsCG27);            	
                    
                //last line possibly w/ cursor might disappear - reveal it
                TRAP_IGNORE(editor->MoveDisplayL(TCursorPosition::EFLineDown));
                }

            editor->SetBorder(TGulBorder::ENone); 
            if (IsFocused() && !(editor->IsFocused()) ) 
                editor->SetFocus(ETrue);
            }
		
        AknsUtils::RegisterControlPosition(editor);
        }
    else if (aLayoutM == ECodeQueryLayoutM || aLayoutM == EDateQueryLayoutM || aLayoutM == ETimeQueryLayoutM)
        {
        iHasEditor = ETrue;

        LayoutEditorFrame(aLayoutM);
        
        LayoutEditorIndicator(aLayoutM);

        if (iSecretEd)
            {
            AknLayoutUtils::LayoutSecretEditor(iSecretEd, LayoutRect(), 
            AKN_LAYOUT_TEXT_Code_query_pop_up_window_texts_Line_2(LAFIndex.PromptLine()));
            iSecretEd->SetBorder(TGulBorder::ENone);
            if (IsFocused() && !iSecretEd->IsFocused())
                iSecretEd->SetFocus(ETrue);
            }    
        if (iPinEdwin)
            {
            AknLayoutUtils::LayoutSecretEditor(iPinEdwin, LayoutRect(), 
            AKN_LAYOUT_TEXT_Code_query_pop_up_window_texts_Line_2(LAFIndex.PromptLine()));
            iPinEdwin->SetBorder(TGulBorder::ENone);
            if (IsFocused() && !iPinEdwin->IsFocused())
                iPinEdwin->SetFocus(ETrue);
            }

//LAYOUT for TIME, DATE and DURATION EDITORS 
        CEikMfne* edwin = NULL;
        
        if ( iTimeEdwin )
            {
            edwin = iTimeEdwin;
            }        
        else if ( iDateEdwin )
            {
            edwin = iDateEdwin;
            }
        else if ( iDurationEdwin )
            {
            edwin = iDurationEdwin;
            }
        else if ( LocationEd() )
            {
            edwin = LocationEd();
            }
            
        if ( edwin )
            {
            TInt variety( LAFIndex.PromptLine() );
        
            AknLayoutUtils::LayoutMfne( edwin, LayoutRect(), 
                TAknWindowComponentLayout::ComposeText( 
                    AknLayoutScalable_Avkon::query_popup_pane( variety ),
                    AknLayoutScalable_Avkon::query_popup_pane_t1() ) );

            edwin->SetBorder( TGulBorder::ENone );
            if ( IsFocused() && !edwin->IsFocused() )
                {
                edwin->SetFocus( ETrue );
                }
            edwin->SetUpAndDownKeysConsumed( ETrue );
            }     
        }
    }

/**
 * Layout the editor frame.
 *
 * For queries that do have an editor, this method will position its frame.
 *
 * This method is called by LayoutEditor only if the layout
 * method implies the presence of an editor, hence the panic if
 * the layout is not recognised.
 *
 */
void CAknQueryControl::LayoutEditorFrame(const TLayoutMethod& aLayoutM)
    {
    TIndex LAFIndex(NbrOfPromptLines());

    TRect rect   = LayoutRect();
    TRect parent = DialogRect();
     
    if (aLayoutM == EDataQueryLayoutM)
        {
        iEditorVerShadow.LayoutRect( rect, AKN_LAYOUT_WINDOW_Data_query_pop_up_window_elements_Line_1(LAFIndex.PromptLine()));
        iEditorHorShadow.LayoutRect( rect, AKN_LAYOUT_WINDOW_Data_query_pop_up_window_elements_Line_2(parent,LAFIndex.PromptLine()));
        iEditorFrame.LayoutRect    ( rect, AKN_LAYOUT_WINDOW_Data_query_pop_up_window_elements_Line_3(parent,LAFIndex.PromptLine()));
        }
    else if (aLayoutM == ECodeQueryLayoutM || aLayoutM == EDateQueryLayoutM || aLayoutM == ETimeQueryLayoutM)
        {
        TInt variety( LAFIndex.PromptLine() );
        iEditorVerShadow.LayoutRect( rect, AKN_LAYOUT_WINDOW_Code_query_pop_up_window_elements_Line_1( variety ) );
        iEditorHorShadow.LayoutRect( rect, AKN_LAYOUT_WINDOW_Code_query_pop_up_window_elements_Line_2( variety ) );
               
        iEditorFrame.LayoutRect( rect, AknLayoutScalable_Avkon::query_popup_pane( variety ) );
        }
    else 
        __ASSERT_DEBUG(0,Panic(EAknPanicNotSupported));
    }

/**
 * Layout editor indicator.
 *
 * For queries that do have an editor, this method does
 * layout for its editing state icons.
 *
 * If these icons are not to be displayed then this method
 * returns without doing anything. 
 *
 * This method is called by LayoutEditor only if the layout
 * method implies the presence of an editor, hence the panic if
 * the layout is not recognised.
 */
void CAknQueryControl::LayoutEditorIndicator(const TLayoutMethod& aLayoutM)
    {
    TIndex LAFIndex(NbrOfPromptLines());

    if (!iEditIndicator)
        return;

    if (aLayoutM == EDataQueryLayoutM)
        {
        AknLayoutUtils::LayoutControl(iEditIndicator, LayoutRect(), 
            AKN_LAYOUT_WINDOW_Data_query_pop_up_window_elements_Line_4(LAFIndex.PromptLine()));
        }
    else if (aLayoutM == ECodeQueryLayoutM || aLayoutM == EDateQueryLayoutM || aLayoutM == ETimeQueryLayoutM)
        {
        TInt variety( LAFIndex.PromptLine() );
        
        AknLayoutUtils::LayoutControl(iEditIndicator, LayoutRect(), 
            AknLayoutScalable_Avkon::indicator_popup_pane( variety ) );
        }
    else
        __ASSERT_DEBUG(0,Panic(EAknPanicNotSupported));
    }

//
// Extension
//

CAknQueryExtension* CAknQueryControl::QueryExtension() const
    {
    return CAknQueryExtension::Instance( this );
    }

//
// Prompt related methods
//

/**
 * Read prompt text from resouce
 */
EXPORT_C void CAknQueryControl::ReadPromptL(TResourceReader &aRes)
    {
    delete iPrompt;
    iPrompt = NULL;

    iPrompt = CAknTextControl::NewL(CAknText::EFormatted);
    iPrompt->ConstructFromResourceL(aRes);
    iPrompt->SetContainerWindowL(*this);

    TCallBack cb( StaticPictographCallBack, this );
    iPrompt->SetPictographCallBackL( cb );

    DoSetPromptL();
    }

/**
 * Set new text into prompt and parse the text
 */
EXPORT_C void CAknQueryControl::SetPromptL(const TDesC& aDesC)
    {
    __ASSERT_DEBUG(iPrompt,Panic(EAknPanicNullPointer));
    iPrompt->SetTextL(aDesC);
    DoSetPromptL();
    }

/**
 * Parse the text in the prompt
 *
 * Line widths of prompt depend on layout information and on 
 * query type
 */
void CAknQueryControl::DoSetPromptL()
    {
     __ASSERT_DEBUG(iPrompt,Panic(EAknPanicNullPointer));     

    TAknLayoutText textRect;

    TAknWindowLineLayout dialogLay;
    WindowLayout( dialogLay );

    TAknLayoutRect dialogLayRect;
    dialogLayRect.LayoutRect(iAvkonAppUi->ApplicationRect(), dialogLay);
    TSize dialogSize = dialogLayRect.Rect().Size(); 
    TRect parent(TPoint(0,0),dialogSize);
    
    if (iQueryType == EConfirmationQueryLayout)
        {
        textRect.LayoutText(parent, AKN_LAYOUT_TEXT_Note_pop_up_window_texts_Line_1(1));
        }
    else        
        {
        textRect.LayoutText(parent, AKN_LAYOUT_TEXT_Data_query_pop_up_window_texts_Line_1(1));
        }
           
    SetLineWidthsL();            
    const CFont *font = textRect.Font();
    iPrompt->ParseTextL(font,iLineWidths);
    
    // Next code block inserts line feeds into the given prompt text so that 
    // it always consumes the same amount of vertical space. Prompt should
    // always be placed just above the editor i.e. empty lines are added before
    // the prompt if needed.
    //
    
    if ( EmbeddedVirtualInput() )
        {
        // Set line widths for prompt text using Query Input layout
        
  		TBool landscape = Layout_Meta_Data::IsLandscapeOrientation();
    
    	TAknLayoutRect rect;
 		rect.LayoutRect( LayoutRect(), TAknWindowComponentLayout::Compose(
 			AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ), 
    		AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ) ).LayoutLine() );
    				
    	TAknLayoutText layoutText;
    	layoutText.LayoutText( rect.Rect(),
    		AknLayoutScalable_Apps::area_vitu2_query_pane_t4( 1 ) );
                
        font = layoutText.Font();
    	
    	iLineWidths->Reset();
        for (TInt i = 0; i < 3; i++)
        	{
        	iLineWidths->AppendL(layoutText.TextRect().Width());
        	}
        	
        // text parsing is needed to get correct return value
        // from function NbrOfPromptLines 	
        iPrompt->ParseTextL( font, iLineWidths );
        	
        
        // calculate needed amount of empty lines
        TInt lineFeeds = 3 - NbrOfPromptLines();
        
        // add empty lines if needed
        if ( lineFeeds > 0)
        	{
        	HBufC* oldText = iPrompt->Text().AllocLC();
        	HBufC* newText = oldText->ReAllocL( oldText->Length() + lineFeeds );
        
        	CleanupStack::Pop(); // oldText
        	CleanupStack::PushL( newText );
        
        	// add empty lines
        	for ( TInt i = 0; i < lineFeeds; ++i )
            	{
            	newText->Des().Insert( 0, _L( "\n" ) );
            	}
        	iPrompt->SetTextL( *newText );
        
        	// text parsing is needed because empty lines are added
        	iPrompt->ParseTextL( font, iLineWidths );

        	CleanupStack::PopAndDestroy(); // newText
        	}
        }
    
    Layout();
    }

void CAknQueryControl::SetLineWidthsL() 
    {
    if (!iLineWidths)
        return;
    
    iLineWidths->Reset();

    switch(KQueryTypeToLayout[iQueryType])
        {
        case EConfQueryLayoutM: 
            {
            TAknLayoutRect parentLayoutRect;
            parentLayoutRect.LayoutRect(iAvkonAppUi->ClientRect(), AknLayoutScalable_Avkon::popup_note_window(0));
            TAknLayoutText textRect;
            for (TInt i = 0; i < 5; i++)
                {
                textRect.LayoutText(parentLayoutRect.Rect(), AKN_LAYOUT_TEXT_Note_pop_up_window_texts_Line_1(i));
                iLineWidths->AppendL(textRect.TextRect().Width());
                }
            break;
            }
        case EDataQueryLayoutM:
            {
            TAknLayoutRect parentLayoutRect;
            parentLayoutRect.LayoutRect(iAvkonAppUi->ClientRect(), AknLayoutScalable_Avkon::popup_query_data_window(0));
            TAknLayoutText textRect;
            for (TInt i = 0; i < 3; i++)
                {
                textRect.LayoutText(parentLayoutRect.Rect(), AKN_LAYOUT_TEXT_Data_query_pop_up_window_texts_Line_1(i));
                iLineWidths->AppendL(textRect.TextRect().Width());
                }
            break;
            }
        case ECodeQueryLayoutM:
        case ETimeQueryLayoutM:
        case EDateQueryLayoutM:
            {
            TAknLayoutRect parentLayoutRect;
            parentLayoutRect.LayoutRect(iAvkonAppUi->ClientRect(), AknLayoutScalable_Avkon::popup_query_code_window(0));
            TAknLayoutText textRect;
            for (TInt i = 0; i < 3; i++)
                {                
                textRect.LayoutText(parentLayoutRect.Rect(), AKN_LAYOUT_TEXT_Code_query_pop_up_window_texts_Line_1(i));
                iLineWidths->AppendL(textRect.TextRect().Width());
                }
            break;
            }
        default:
            __ASSERT_DEBUG(0,Panic(EAknPanicNotSupported));
        }
    }


///
/// Editor text related methos
///

/**
 *Get text from editors
 */
EXPORT_C void CAknQueryControl::GetText(TDes &aDes) const 
    {
    if(iEdwin)
        {
        iEdwin->GetText(aDes);
        }
    else if(iSecretEd)
        {
        iSecretEd->GetText(aDes);
        }
    else if(iPinEdwin)
        {
        iPinEdwin->GetText(aDes);
        }
    else if(iNumberEdwin)
        {
        iNumberEdwin->GetText(aDes);
        }
    else if (iFloatingPointEditor)
        {
        iFloatingPointEditor->GetText(aDes);
        }
    }

/**
 *Set default text in editors
 */
EXPORT_C void CAknQueryControl::SetTextL(const TDesC &aDesC)
    {
    if( iEdwin )
        {
        __ASSERT_DEBUG
            (
            iEdwin->MaxLength()>=aDesC.Length(), 
            Panic(EAknPanicOverflow)
            );
        iEdwin->SetTextL(&aDesC);
        }
    else if( iSecretEd )
        {
        __ASSERT_DEBUG
            (
            iSecretEd->MaxLength()>=aDesC.Length(), 
            Panic(EAknPanicOverflow)
            );
        iSecretEd->SetText(aDesC);
        }
    else if( iPinEdwin )
        {
        __ASSERT_DEBUG
            ( // secret editor derived
            iPinEdwin->MaxLength()>=aDesC.Length(), 
            Panic(EAknPanicOverflow)
            );
        iPinEdwin->SetText(aDesC);
        }
    else if( iNumberEdwin )
        {
        __ASSERT_DEBUG
            (
            iNumberEdwin->MaxLength()>=aDesC.Length(), 
            Panic(EAknPanicOverflow)
            );

        iNumberEdwin->SetTextL(&aDesC);
        }
    else if (iFloatingPointEditor)
        {
        __ASSERT_DEBUG
            (
            iFloatingPointEditor->MaxLength()>=aDesC.Length(), 
            Panic(EAknPanicOverflow)
            );

        iFloatingPointEditor->SetTextL(&aDesC);
        }
    }

/**
 *Set max. length in text based editors.
 */
EXPORT_C void CAknQueryControl::SetTextEntryLength(TInt aLength)
    {
    if( iEdwin )
        {
        iEdwin->SetMaxLength(aLength);
        }
    else if( iSecretEd )
        {
        iSecretEd->SetMaxLength(aLength);
        }
    else if( iPinEdwin )
        {
        iPinEdwin->SetMaxLength(aLength);
        }
    else if( iNumberEdwin )
        {
        iNumberEdwin->SetMaxLength(aLength);
        }
    else if ( iFloatingPointEditor )
        {
        iFloatingPointEditor->SetMaxLength(aLength);
        }
    }

/**
 * Get maximum text length in text based editors
 */
EXPORT_C TInt CAknQueryControl::GetTextEntryLength() const
    {
    if( iEdwin )
        {
        return iEdwin->MaxLength();
        }
    if(iSecretEd)
        {
        return iSecretEd->MaxLength();
        }
    if(iPinEdwin)
        {
        return iPinEdwin->MaxLength();
        }
    if(iNumberEdwin)
        {
        return iNumberEdwin->MaxLength();
        }
    if (iFloatingPointEditor)
        {
        return iFloatingPointEditor->MaxLength();
        }
    return -1;
    }

///
/// API Set methods
///

EXPORT_C void CAknQueryControl::SetMinimumAndMaximum(const TTime& aMinimum, const TTime& aMaximum)
    {
    if( iDateEdwin )
        {
        iDateEdwin->SetMinimumAndMaximum(aMinimum, aMaximum);
        }
    else if( iTimeEdwin )
        {
        iTimeEdwin->SetMinimumAndMaximum(aMinimum, aMaximum);
        }
    }

EXPORT_C void CAknQueryControl::SetMinimumAndMaximum(const TTimeIntervalSeconds& aMinimumDuration, const TTimeIntervalSeconds& aMaximumDuration)
    {
    if( iDurationEdwin )
        {
        iDurationEdwin->SetMinimumAndMaximum(aMinimumDuration, aMaximumDuration);
        }
    }

EXPORT_C void CAknQueryControl::SetMinimumAndMaximum(TInt aMinimumValue, TInt aMaximumValue)    
    {
    if( iNumberEdwin )
        {
        iNumberEdwin->SetMinimumIntegerValue(aMinimumValue);
        iNumberEdwin->SetMaximumIntegerValue(aMaximumValue);
        }
    }

EXPORT_C void CAknQueryControl::SetMinimumAndMaximum(const TReal& aMinimumValue, const TReal& aMaximumValue)    
    {
    if( iFloatingPointEditor )
        {
        iFloatingPointEditor->SetMinMax(aMinimumValue, aMaximumValue);
        }
    }



EXPORT_C TBool CAknQueryControl::CheckNumber()    
    {    
    return iNumberEdwin->CheckNumber();
    }

EXPORT_C void CAknQueryControl::SetDuration(TTimeIntervalSeconds& aDuration)
//
//Set duration to editor
//
{
    if( iDurationEdwin )
        {
        iDurationEdwin->SetDuration(aDuration);
        }
}

EXPORT_C void CAknQueryControl::SetNumberL(TInt aNumber)
//
//Set number from editor
//
{
    if( iNumberEdwin )
        {
        iNumberEdwin->SetValueL(aNumber);
        }
}

EXPORT_C void CAknQueryControl::SetTime(TTime& aTime)
//
//Set time or date to editor
//
{
    if( iTimeEdwin )
        {
        iTimeEdwin->SetTime(aTime);
        }
    else if( iDateEdwin )
        {
        iDateEdwin->SetDate(aTime);
        }
}

EXPORT_C void CAknQueryControl::SetFloatingPointNumberL(const TReal* aNumber)
//
//Set number from editor
//
{
    if( iFloatingPointEditor )
        {
        iFloatingPointEditor->SetValueL( aNumber );
        }
}

EXPORT_C void CAknQueryControl::SetLocation(const TPosition &aLocation)
{
	if (iExtension && LocationEd())
		{
		LocationEd()->Set( aLocation );
		if ( AknLayoutUtils::PenEnabled() )
            {
            LocationEd()->SetFeature( CEikMfne::EFingerSupport, CEikMfne::EnableWithAllHighlight );
	        }
		}
}

EXPORT_C void CAknQueryControl::SetNumberOfEditorLines(TInt aNum)
    {
    iNumberOfEditorLines = aNum;
    }

///
/// API Get methods
///

EXPORT_C TInt CAknQueryControl::GetTextLength() const
//
//Get text length
//
{
    if ( iSecretEd )
        {
        return iSecretEd->Buffer().Length();
        }
    if ( iPinEdwin )
        {
        return iPinEdwin->Buffer().Length();
        }
    if( iEdwin )
        {
        return iEdwin->TextLength();
        }
    if( iNumberEdwin )
        {
        return iNumberEdwin->TextLength();
        }
    if (iFloatingPointEditor)
        {
        return iFloatingPointEditor->TextLength();
        }
      
    return -1;
}

EXPORT_C TTime CAknQueryControl::GetTime() const
//
//Get time or date from editor
//
{
    TTime time(0);

    if( iTimeEdwin )
        {
        return iTimeEdwin->Time();
        }

    if( iDateEdwin )
        {
        return iDateEdwin->Date();
        }

    return time;
}

EXPORT_C TReal CAknQueryControl::GetFloatingPointNumberL() const
//
//Set number from editor
//
{
    TReal ret = 0;
    if( iFloatingPointEditor )
        {
        iFloatingPointEditor->GetValueAsReal( ret );
        }
    return ret;
}

EXPORT_C void CAknQueryControl::GetLocation(TPosition &aLocation) const
{
    if (LocationEd())
    	{
    	LocationEd()->Get(aLocation);
    	}
}


EXPORT_C TInt CAknQueryControl::GetNumber() const
{
    TInt value = 0;
    if(iNumberEdwin)
        {
        iNumberEdwin->GetTextAsInteger( value );
        }
    else
        {
        ASSERT(EFalse);
        }
    return value;
}

EXPORT_C TTimeIntervalSeconds CAknQueryControl::GetDuration() const
//
//Get duration from editor
//
{
    if( iDurationEdwin )
        {
        return iDurationEdwin->Duration();
        }
    return NULL;
}

/**
 * Return number of lines in the editor
 * 
 * For data queries this can be 1 to 5 lines except if there are 3 lines
 * of prompt text in which case only 1 line is permitted.
 *
 * For all other queries there is only 1 line of text.
 */
EXPORT_C TInt CAknQueryControl::NbrOfEditorLines() const
    {
    TInt nbrOfLines = 0;
    if(iEdwin &&  KQueryTypeToLayout[iQueryType] == EDataQueryLayoutM)
        {
        if (iNumberOfEditorLines == -1)
            {
            TInt nL = Min(iEdwin->TextLayout()->NumFormattedLines(),KMaxLinesInQuery);
            const TInt mHIL= Min(iEdwin->MaximumHeightInLines(),KMaxLinesInQuery);
            
            if ( mHIL )
                {
                nbrOfLines = Min(nL,mHIL);
                }
            else
                {
                nbrOfLines = nL;
                }
            }
    
        else if (iNumberOfEditorLines >= 0 && iNumberOfEditorLines <= KMaxLinesInQuery)
            {
            nbrOfLines = iNumberOfEditorLines;
            }
        }

    return Max(1,nbrOfLines);
    }

/**
 * Return number of prompt lines
 *
 * Only confirmation queries can have more than 2 lines
 */
EXPORT_C TInt CAknQueryControl::NbrOfPromptLines() const
    {
    if (iPrompt)
        return iPrompt->NumberOfLines();
    return 1;
    }


/**
 * Return text editor depening on query type
 */
EXPORT_C CCoeControl* CAknQueryControl::ControlByLayoutOrNull(TInt aLayout)
    {
    CCoeControl* ctrl=NULL;
    switch ( aLayout )
        {
        case EStaticSizeDataLayout:
        case EDataLayout:
        case EPhoneLayout:
            ctrl=iEdwin;
            break;
        case ECodeLayout:
            ctrl=iSecretEd;
            break;
        case EDateLayout:
            ctrl=iDateEdwin;
            break;
        case ETimeLayout:
            ctrl=iTimeEdwin;
            break;
        case EDurationLayout:
            ctrl=iDurationEdwin;
            break;
        case ENumberLayout:
            ctrl=iNumberEdwin;
            break;
        case EPinLayout:
            ctrl=iPinEdwin;
            break;
        case EFloatingPointLayout:
            ctrl=iFloatingPointEditor;
			break;
		case ELocationLayout:
			ctrl=LocationEd();
			break;
        default:
            break;
        }
    return ctrl;
    }

/**
*
* Sends and ESC key to the app.  This cannot be called from within OfferKeyEventL.  It must be called
* from within some other non-key event that subsequently does not require references to the object
*
*/
void CAknQueryControl::CancelQueryL()
    {
    _AKNTRACE_FUNC_ENTER;
    if (iQueryControlObserver)
        {
        iQueryControlObserver->HandleQueryEditorStateEventL(this, MAknQueryControlObserver::EEmergencyCallAttempted, MAknQueryControlObserver::EEditorValueValid);
        }
    else 
        {
        TKeyEvent key;
        key.iCode=EKeyEscape;
        key.iModifiers=0;
        key.iScanCode = EStdKeyNull;
        iEikonEnv->SimulateKeyEventL(key, EEventKey);
        }
    _AKNTRACE_FUNC_EXIT;
    }

/**
* This method looks at the flags that have been set in the query control and 
* acts upon them if possible
* 
*/
void CAknQueryControl::DeployFlagsL()
    {
    // Handle the Emergency call support flags
    if (!iEcsDetector )
        {
        if ( 
            (iNumberEdwin && iFlags.IsSet( EEmergencyCallsEnabledByAPI) )
            ||
            ( iPinEdwin && iFlags.IsSet( EEmergencyCallsEnabledByAPI) )
            )
            {
            iEcsDetector = CAknEcsDetector::NewL();
            // Set the control to be the CAknEcsDetector observer, if the object exists
            iEcsDetector->SetObserver( iEcsObserver );
            }

        }

    // Handle the T9 suppression in edwins. If the flag has not been set, then
    // suppress the T9
    if ( iFlags.IsClear ( EPredictiveTextEntryPermitted ) )
        {
        if ( iEdwin )
            {
            // set the noT9 flag
            iEdwin->SetAknEditorFlags( EAknEditorFlagNoT9 | iEdwin->AknEdwinFlags() );
            }
        }       

    }

/**
* Method to first set the flags and then to use them on the contained editors
*
*/

void CAknQueryControl::SetAndUseFlagsL(TBitFlags16 aFlags)
    {
    SetFlags( aFlags );
    DeployFlagsL();
    }

void CAknQueryControl::SetFlags(TBitFlags16 aFlags)
    {
    iFlags = aFlags;
    iEditIndicator->SetFlags( aFlags );
    }

EXPORT_C void CAknQueryControl::SetImageL(CEikImage* aImage)
    { // Gets ownership of the aImage
    _AKNTRACE_FUNC_ENTER;
	if ( iImage && iImage->IsPictureOwnedExternally() )
        {
        delete ((CApaMaskedBitmap*) iImage->Bitmap());
        }
    
	delete iImage;
    iImage = aImage;

    if ( iImage )
        {
        iImage->SetContainerWindowL(*this);
        }

    delete iAnimation;
    iAnimation = NULL;

    Layout();
    _AKNTRACE_FUNC_EXIT;
    }

EXPORT_C void CAknQueryControl::SetImageL(const TDesC& aImageFile,
                                          TInt aBmpId, TInt aBmpMaskId)
    {
    _AKNTRACE_FUNC_ENTER;
    CEikImage* image = new(ELeave) CEikImage;
    CleanupStack::PushL( image );
               
    TBool skinnedFound( EFalse );
    if ( aImageFile.CompareF(KAvkonBitmapFile) == 0 ) // Skinning is supported only avkon bitmaps
	    {
        TAknsItemID id;
        id.Set(0,0);
        id = CAknNoteAttributes::GetSkinnedBitmapID(aBmpId);
        if ( id.iMajor && id.iMinor ) // skin id found, try loading
	        {
            CApaMaskedBitmap* bitmap = NULL;
            MAknsSkinInstance* skin = AknsUtils::SkinInstance();
            TRAPD( err, bitmap = AknsUtils::CreateMaskedBitmapL(skin,id));
            if ( !err ) 
	           {
               CFbsBitmap* mask = bitmap->Mask();
               iImage->SetPicture(bitmap,mask);
               iImage->SetPictureOwnedExternally(ETrue);
               skinnedFound = ETrue;
               }
			}
        }
    if ( !skinnedFound) 
		{
        image->CreatePictureFromFileL(aImageFile,aBmpId,aBmpMaskId);
        }

    CleanupStack::Pop(); //image
    SetImageL(image); // gets ownership
    _AKNTRACE_FUNC_EXIT;
    }

EXPORT_C void CAknQueryControl::SetAnimationL(TInt aResource)
    {
    _AKNTRACE_FUNC_ENTER;
    delete iAnimation;
    iAnimation = NULL;
    iAnimation = CAknBitmapAnimation::NewL();
    iAnimation->SetContainerWindowL(*this);

    TAknsItemID iid;
    iid.Set( EAknsMajorAvkon, aResource );
    if( !iAnimation->ConstructFromSkinL( iid ) )
        {
        TResourceReader readerForAnimation;
        iCoeEnv->CreateResourceReaderLC(readerForAnimation,aResource);
        iAnimation->ConstructFromResourceL(readerForAnimation);
        CleanupStack::PopAndDestroy(); // readerForAnimation
        }

    // Save the animation resource id, because this function will be re-called 
    // when handling resource change. 
    iExtension->iAnimationId = aResource;
    
    Layout();
    _AKNTRACE_FUNC_EXIT;
    }

EXPORT_C void CAknQueryControl::StartAnimationL()
    {
    _AKNTRACE_FUNC_ENTER;
    if (iAnimation)
        {
        CBitmapAnimClientData *animClientData = iAnimation->BitmapAnimData();
        if (animClientData != NULL && animClientData->FrameArray().Count() <= 1)
            {
            // Not set background frame, if there is only one frame in animation.
            }
        else
            {
            const TDisplayMode displayMode( 
            CCoeEnv::Static()->ScreenDevice()->DisplayMode() );
            
            CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
            CleanupStack::PushL(bitmap);
            
            User::LeaveIfError( bitmap->Create( iAnimation->Rect().Size(), displayMode ) );
            
            CFbsBitmapDevice* doubleBufferDev = CFbsBitmapDevice::NewL( bitmap );
            CleanupStack::PushL(doubleBufferDev);    
            
            CFbsBitGc* doubleBufferGc = 0;
            User::LeaveIfError( doubleBufferDev->CreateContext( doubleBufferGc ) );    
            CleanupStack::PushL(doubleBufferGc);    
            
            MAknsSkinInstance* skin = AknsUtils::SkinInstance();
            MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
            
            AknsDrawUtils::DrawBackground( skin, cc, this, *doubleBufferGc,
                TPoint(0,0), iAnimation->Rect(), KAknsDrawParamDefault );
            
            CleanupStack::PopAndDestroy(2); // doubleBufferGc, doubleBufferDev
            
            CBitmapFrameData* data = CBitmapFrameData::NewL();
            data->SetBitmapsOwnedExternally( EFalse );
            data->SetBitmap( bitmap );
            
            // Set frame to animation
            iAnimation->BitmapAnimData()->SetBackgroundFrame( data ); // gets ownership
            
            CleanupStack::Pop(bitmap); 
            }

        iAnimation->StartAnimationL();
        }
    _AKNTRACE_FUNC_EXIT;
    }

EXPORT_C TInt CAknQueryControl::CancelAnimation()
    {
	_AKNTRACE_FUNC_ENTER;
	TInt result(KErrGeneral);
	if ( iAnimation )
        {
		result = iAnimation->CancelAnimation();
        }
	_AKNTRACE( "[%s][%s] return %d", "CAknQueryControl", "CancelAnimation", result);
    return result;
    }



/** 
 * Return true if editor content is valid for query, false 
 * otherwise. Some editors always have a valid content. Others
 * (those that have a text associated with them) may or may
 * not have a valid content.
 */ 
TBool CAknQueryControl::EditorContentIsValidL() const
    {
    TInt   ret  = EFalse;
    if (iDateEdwin || iTimeEdwin || iDurationEdwin ||LocationEd()) 
        {
        CEikMfne* editor = iDateEdwin;
        if (!editor && iTimeEdwin)
            editor = iTimeEdwin;
        if (!editor && iDurationEdwin)
            editor = iDurationEdwin;
        if (!editor && LocationEd())
        	editor = static_cast<CEikMfne*>(LocationEd());
        ret = editor->Field(editor->CurrentField())->IsValid();
        }
    else if (iNumberEdwin || iFloatingPointEditor)
        {
        TInt intValue;
        TReal realValue;

        CAknNumericEdwin::TValidationStatus status = iNumberEdwin ?
            iNumberEdwin->GetTextAsInteger(intValue) : iFloatingPointEditor->GetValueAsReal(realValue);

        // At this point too large or small values don't affect the valicy of content,
        // range is checked when OkToExitL-method is called when user tries to confirm the query 
        if (iNumberEdwin && (status == CAknNumericEdwin::EValueTooSmall || 
            status == CAknNumericEdwin::EValueTooLarge ) ) 
            {
            status = CAknNumericEdwin::EValueValid;
	        }
        ret = status == CAknNumericEdwin::EValueValid;
        }
    else
        {//Remaining editors have a non-empty text with at least one char
        // which is not a space and is not a control char
        CAknQueryExtension* extension = QueryExtension();
        if( extension )
            {
            if ( extension->iAllowEmptyInput )
                {
                return ETrue;
                }
            }
        
        HBufC* buf = HBufC::NewLC(GetTextEntryLength()); //max length
        TPtr ptr = buf->Des();
        if (GetTextEntryLength()) //check if zero is set as maxlength
            {
                GetText(ptr);
            }
        ret = AknTextUtils::IsEmptyText( ptr );
        
        if ( !ret && ptr.Length() > 0 && iSecretEd )            
            {
            TBool isSpace = ETrue;
            for ( TInt i = 0; i < ptr.Length(); i++ )            
                {
                TChar c( ptr[i] );
                if ( !c.IsSpace() )
                    {
                    isSpace = EFalse;
                    break;
                    }
                }
            if ( isSpace )
                {
                ret = ETrue;                
                }
            }        

		// Check if pictographs in buffer	
		if (!ret && iEdwin && iPrompt && ptr.Length())
			{
			CAknPictographInterface* picto = iPrompt->PictographInterface();

			if ( picto && picto->Interface() && picto->Interface()->ContainsPictographs( ptr ) )
				{
				ret = ETrue;
				}
			}		
		CleanupStack::PopAndDestroy(); // buf    
        }
    return ret; 
    }

/*****************************************************************
 * CAknQueryControl::TIndex
 *
 * Manage indexes into LAF tables
 *
 * PN stands for "Popup Note"
 *
 * PQD stands for "Popup Query Data'
 *
 * PQC stands for "Popup Query Code'
 *
 * 'DPQ' stands for "Data Query Popup"
 ******************************************************************/

  
CAknQueryControl::TIndex::TIndex(TInt aNumberOfPromptLines)
    : iNumberOfPromptLines(aNumberOfPromptLines)
    {
    }
        
void CAknQueryControl::TIndex::SelfTest() const
    {
    __ASSERT_DEBUG(iNumberOfPromptLines >= 0  && iNumberOfPromptLines <= 5,
        Panic(EAknPanicInvalidValue));
    }

/**
 * Return index into LAF tables that depend directly on number of prompt lines,
 * index is equal to number of prompt lines minus one unless there are no prompt
 * lines in which case the index is zero
 */
TInt CAknQueryControl::TIndex::PromptLine() const
    {
    SelfTest();
    return iNumberOfPromptLines > 0 ? iNumberOfPromptLines - 1 : 0;
    }

/**
 * Return index into Main Pane PQDC Window, which
 * depends on total number of prompt lines minus 2, e.g.
 * index 0 for 2 prompt lines total.
 *
 */
TInt CAknQueryControl::TIndex::DQPWindowTextsLine2(TInt aLineNum) const
    {
    SelfTest();
    __ASSERT_DEBUG(aLineNum > 0 && aLineNum <= 5,Panic(EAknPanicInvalidValue));

    static const TInt  KDataQueryPopupWindowTextsLine2Index[3][5] = 
    {   {0,  1, 2, 3, 4},    //1 PROMPT LINE
        {5,  6, 7, 8, 9},    //2 PROMPT LINES
        {10, 10, 10, 10, 10}  }; //3 PROMPT LINES
    
    return KDataQueryPopupWindowTextsLine2Index[PromptLine()][aLineNum-1];
    }

TInt CAknQueryControl::TIndex::PNWindow() const
    {
    SelfTest();
 
    static const TInt KPopupNoteWindowIndex[5] = { 0,0,0,1,2 };
    
    AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation();
    if (cbaLocation == AknLayoutUtils::EAknCbaLocationRight)
        {
        // variety numbers for right CBA are 3,4 and 5 
        return (KPopupNoteWindowIndex[PromptLine()] + 3);  
        }
    else if (cbaLocation == AknLayoutUtils::EAknCbaLocationLeft)
        {
        /// variety numbers for left CBA are 6,7 and 8 
        return (KPopupNoteWindowIndex[PromptLine()] + 6);
        }
    else // bottom
        {
        return KPopupNoteWindowIndex[PromptLine()];
        }
    }

TInt CAknQueryControl::TIndex::PQDWindow(TInt aLineNum) const
    {
    SelfTest();
    __ASSERT_DEBUG(aLineNum > 0 && aLineNum <= 5,Panic(EAknPanicInvalidValue));

    AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation();
    
    if (cbaLocation == AknLayoutUtils::EAknCbaLocationRight)
        {
        static const TInt KPopupQueryDataWindowIndex[7] = 
            {13, 12, 11, 10, 9, 8, 7}; // variety numbers for right CBA are 7-13 
        return KPopupQueryDataWindowIndex[PromptLine()+aLineNum-1];
        }
    else if (cbaLocation == AknLayoutUtils::EAknCbaLocationLeft)
        {
        static const TInt KPopupQueryDataWindowIndex[7] = 
            {20, 19, 18, 17, 16, 15, 14}; // variety numbers for left CBA are 14-20 
        return KPopupQueryDataWindowIndex[PromptLine()+aLineNum-1];
        }
    else // bottom
        {
        static const TInt KPopupQueryDataWindowIndex[7] = 
            {0, 1, 2, 3, 4, 5, 6}; // variety numbers for bottom CBA are 0-6
        return KPopupQueryDataWindowIndex[PromptLine()+aLineNum-1];
        }
    }
    
TInt CAknQueryControl::TIndex::PQCWindow() const
    {
    SelfTest();
    
    AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation();
    
    if (cbaLocation == AknLayoutUtils::EAknCbaLocationRight)
        {
        // variety numbers for right CBA are 3,4 and 5 
        return iNumberOfPromptLines > 0 ? (iNumberOfPromptLines - 1 + 3) : 3;
        }
    else if (cbaLocation == AknLayoutUtils::EAknCbaLocationLeft)
        {
        // variety numbers for left CBA are 6,7 and 8 
        return iNumberOfPromptLines > 0 ? (iNumberOfPromptLines - 1 + 6) : 6;
        }
    else // bottom
        {
        // variety numbers for bottom CBA are 0,1 and 2 
        return iNumberOfPromptLines > 0 ? (iNumberOfPromptLines - 1) : 0;
        }
    }    

TTypeUid::Ptr CAknQueryControl::MopSupplyObject( TTypeUid aId )
    {
    CAknQueryExtension* extension = QueryExtension();
    if( (aId.iUid == MAknsControlContext::ETypeId) && 
        extension && extension->EditorContext() && iHasEditor )
        {
        // Return specific context iff editor exists and the context
        // has been constructed.
        return MAknsControlContext::SupplyMopObject( 
            aId, extension->EditorContext() );
        }
        
    if ( aId.iUid == CAknQueryControl::ETypeId )
    	{
    	return aId.MakePtr( this );
    	}
        
    return SupplyMopObject( aId, iEditIndicator );
    }

// Callback for doing a redraw when animating pictographs
TInt CAknQueryControl::StaticPictographCallBack( TAny* aPtr )
    {
    _AKNTRACE_FUNC_ENTER;
    CAknQueryControl* me = static_cast<CAknQueryControl*>( aPtr );
    me->PictographCallBack();
    _AKNTRACE_FUNC_EXIT;
    return KErrNone;
    }

void CAknQueryControl::PictographCallBack()
    {
    _AKNTRACE_FUNC_ENTER;
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );

    for ( TInt i = 0 ; i < iPrompt->NumberOfLines() ; i++ )
        {
        CAknPictographInterface* picto = iPrompt->PictographInterface();

        // Only update the note line if it contains pictographs

        if ( picto->Interface()->ContainsPictographs( 
            *( iPrompt->Line( i )->Text() ) ) )
            {
            TRect lineRect = iPrompt->Line(i)->Rect();
            Window().Invalidate( lineRect );

            ActivateGc();
            Window().BeginRedraw();

            AknsDrawUtils::Background(
                skin,
                cc,
                this,
#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
				SystemGc(),
#else				
                iCoeEnv->SystemGc(),
#endif                
                lineRect );

            Window().EndRedraw();
            DeactivateGc();

            // Draw the label after the background.
            iPrompt->Line( i )->ActivateL(); // Never leaves
            iPrompt->Line( i )->DrawNow();
            iPrompt->SetLineModified( i, EFalse );
            }
        }
    _AKNTRACE_FUNC_EXIT;
    }

TBool CAknQueryControl::EmbeddedVirtualInput() const
    {
    if ( !QueryExtension()->iVirtualInputStatusFlags.IsSet( CAknQueryExtension::EVirtualInputCheckedAlready ) )
        {
        QueryExtension()->iVirtualInputStatusFlags.Set( CAknQueryExtension::EVirtualInputCheckedAlready );
        
        CEikDialog* dialog = NULL;

        // Remove constness. This is unfortunate but this method needs to be
        // called from several const methods so better to do it in one place.
        const_cast<CAknQueryControl*>( this )->MopGetObject( dialog );

        if ( dialog )
            {
            if ( dialog->DialogFlags() & EEikDialogFlagVirtualInput )
                {
                QueryExtension()->iVirtualInputStatusFlags.Set( CAknQueryExtension::EVirtualInputEnabled );
                }
            }
        }
        
#ifdef RD_SCALABLE_UI_V2            
    if ( AknLayoutUtils::PenEnabled() )
    	{
    	return QueryExtension()->iVirtualInputStatusFlags.IsSet( CAknQueryExtension::EVirtualInputEnabled );
    	}
#endif
	return false;    	
    }
    
    
CEikDialog* CAknQueryControl::Dialog() const
    {
	_AKNTRACE_FUNC_ENTER;
    CAknQueryControl* control = const_cast<CAknQueryControl*>( this );
    
    CEikDialog* dialog = NULL;
    control->MopGetObject( dialog );
    _AKNTRACE_FUNC_EXIT;
    return dialog;
    }
   
    
void CAknQueryControl::CreateIncAndDecButtonsL()
	{
	if (!iIncreaseValueButton)
		{
		iIncreaseValueButton = 
			CAknButton::NewL(KAvkonBitmapFile,
			EMbmAvkonQgn_indi_button_increase,
			EMbmAvkonQgn_indi_button_increase_mask,
            -1,
            -1,
            EMbmAvkonQgn_indi_button_increase_pressed,
            EMbmAvkonQgn_indi_button_increase_pressed_mask,
            -1,
            -1,
            KNullDesC,
            KNullDesC,
            KAknButtonNoFrame | KAknButtonKeyRepeat,
            0,
            KAknsIIDQgnIndiButtonIncrease,
            KAknsIIDNone,
            KAknsIIDQgnIndiButtonIncreasePressed,
            KAknsIIDNone );
            
        iIncreaseValueButton->SetContainerWindowL(*this);
        iIncreaseValueButton->SetParent(this);
        iIncreaseValueButton->SetObserver(this);
        iIncreaseValueButton->MakeVisible(ETrue);
        iIncreaseValueButton->SetFocusing(EFalse);
		}
		  
	if (!iDecreaseValueButton)
		{
		iDecreaseValueButton = 
        	CAknButton::NewL(KAvkonBitmapFile,
            EMbmAvkonQgn_indi_button_decrease,
            EMbmAvkonQgn_indi_button_decrease_mask,
            -1,
            -1,
            EMbmAvkonQgn_indi_button_decrease_pressed,
			EMbmAvkonQgn_indi_button_decrease_pressed_mask,
			-1,
			-1,
			KNullDesC,
			KNullDesC,
			KAknButtonNoFrame | KAknButtonKeyRepeat,
			0,
			KAknsIIDQgnIndiButtonDecrease,
			KAknsIIDNone,
			KAknsIIDQgnIndiButtonDecreasePressed,
			KAknsIIDNone );
			
		iDecreaseValueButton->SetContainerWindowL(*this);
		iDecreaseValueButton->SetParent(this);
		iDecreaseValueButton->SetObserver(this);
		iDecreaseValueButton->MakeVisible(ETrue);
		iDecreaseValueButton->SetFocusing(EFalse);
		}
	}
    
void CAknQueryControl::CreateBackspaceButtonL()
	{
	if (iExtension && !iExtension->iBackspaceButton)
		{
		iExtension->iBackspaceButton = 
			CAknButton::NewL(KAvkonBitmapFile,
			EMbmAvkonQgn_indi_navi_arrow_left,			
			EMbmAvkonQgn_indi_navi_arrow_left_mask,
			-1,
			-1,
			-1,
			-1,
			-1,
			-1,
			KNullDesC,
			KNullDesC,
			KAknButtonKeyRepeat | KAknButtonReportOnKeyDown,
			0,
			KAknsIIDQgnIndiItutBackspace, 
			KAknsIIDNone,
			KAknsIIDNone,
			KAknsIIDNone );
		iExtension->iBackspaceButton->SetContainerWindowL(*this);
		iExtension->iBackspaceButton->SetParent(this);
		iExtension->iBackspaceButton->SetObserver(this);
		iExtension->iBackspaceButton->MakeVisible(ETrue);
		iExtension->iBackspaceButton->SetFocusing(EFalse);	
		
		
        iExtension->iBackspaceButton->SetBackgroundIds( KAknsIIDQsnFrFunctionButtonNormal,
        	KAknsIIDQsnFrFunctionButtonPressed, KAknsIIDQsnFrFunctionButtonInactive,
        	KAknsIIDQsnFrFunctionButtonPressed, KAknsIIDQsnFrFunctionButtonInactive );
     
		
    	CFbsBitmap *icon = NULL;
    	CFbsBitmap *mask = NULL;    
    
    	MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    	AknsUtils::CreateColorIconL( skin,
    		KAknsIIDQgnIndiItutBackspace,
    		KAknsIIDQsnTextColors,
    		EAknsCIQsnIconColorsCG30,
    		icon, mask,
    		KAvkonBitmapFile,
    		EMbmAvkonQgn_indi_navi_arrow_left,
    		EMbmAvkonQgn_indi_navi_arrow_left_mask,
    		KRgbBlack );    
    
    	CGulIcon* gulIcon = CGulIcon::NewL( icon, mask );
    	iExtension->iBackspaceButton->State()->SetIcon( gulIcon );
		}
	}
 
	
void CAknQueryControl::LayoutEditorForFullScreen( const TLayoutMethod& /*aLayoutM*/ )
	{
	TBool landscape = Layout_Meta_Data::IsLandscapeOrientation();
	
	TIndex LAFIndex(NbrOfPromptLines());
	iHasEditor = ETrue;
    
    TInt variety( LAFIndex.PromptLine() );
    iEditorVerShadow.LayoutRect( LayoutRect(), AKN_LAYOUT_WINDOW_Code_query_pop_up_window_elements_Line_1( variety ) );
    iEditorHorShadow.LayoutRect( LayoutRect(), AKN_LAYOUT_WINDOW_Code_query_pop_up_window_elements_Line_2( variety ) );
    
    TAknLayoutRect layoutRect;
 	layoutRect.LayoutRect( LayoutRect(), TAknWindowComponentLayout::Compose(
 		AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ), 
    	AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ) ).LayoutLine() );
    
    
    // Layout editor frame
 		
 	iEditorFrame.LayoutRect( layoutRect.Rect(), AknLayoutScalable_Apps::input_focus_pane_cp09( 0 ) );
       
   	// Layout editor indicator
        
	TAknWindowLineLayout lineLayout = AknLayoutScalable_Apps::area_vitu2_query_pane_g1( 0 );
	AknLayoutUtils::LayoutControl(iEditIndicator, layoutRect.Rect(), lineLayout );
        
	// Layout secret editor
	
	 if( iSecretEd )
        {
        TAknLayoutRect layoutRect;
 		layoutRect.LayoutRect( LayoutRect(), AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ) ); 
     
        AknLayoutUtils::LayoutSecretEditor( iSecretEd, layoutRect.Rect(),
       		TAknWindowComponentLayout::ComposeText( 
            AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ),
            AknLayoutScalable_Apps::area_vitu2_query_pane_t3( 1 ) ) );
     	
       	iSecretEd->SetBorder( TGulBorder::ENone );
       	if ( IsFocused() && !iSecretEd->IsFocused() )
       		{
       		iSecretEd->SetFocus( ETrue );
       		}
       	}
        
	// Layout pin editor
	
	if( iPinEdwin )
        {
        TAknLayoutRect layoutRect;
 		layoutRect.LayoutRect( LayoutRect(), AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ) ); 
        
        AknLayoutUtils::LayoutSecretEditor( iPinEdwin, layoutRect.Rect(),
       		TAknWindowComponentLayout::ComposeText( 
            AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ),
            AknLayoutScalable_Apps::area_vitu2_query_pane_t3( 1 ) ) );
        		
       	iPinEdwin->SetBorder( TGulBorder::ENone );
       	if ( IsFocused() && !iPinEdwin->IsFocused() )
       		{
       		iPinEdwin->SetFocus( ETrue );
       		}
       	}

	// Layout MFNE editor
	
	CEikMfne* edwin = NULL;
    if ( iTimeEdwin )
    	{
        edwin = iTimeEdwin;
        }        
    else if ( iDateEdwin )
        {
        edwin = iDateEdwin;
        }
    if ( edwin )
    	{

		TAknLayoutRect layoutRect;
 		layoutRect.LayoutRect( LayoutRect(), AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ) ); 
                                               
        AknLayoutUtils::LayoutMfne( edwin, layoutRect.Rect(), 
        	TAknWindowComponentLayout::ComposeText( 
            AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ),
            AknLayoutScalable_Apps::area_vitu2_query_pane_t3( 1 ) ) );
   
        edwin->SetBorder( TGulBorder::ENone );
        if ( IsFocused() && !edwin->IsFocused() )
        	{
            edwin->SetFocus( ETrue );
            }
        edwin->SetUpAndDownKeysConsumed( ETrue );
        }   
        
    // Layout Edwin editor    
        
    if ( iEdwin )
        {      
        TAknLayoutRect layoutRect;
 		layoutRect.LayoutRect( LayoutRect(), TAknWindowComponentLayout::Compose(
 			AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ), 
    		AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ) ).LayoutLine() );
      
        TAknTextComponentLayout textLayout =
            AknLayoutScalable_Apps::area_vitu2_query_pane_t3(1);
         
        TRect rect( layoutRect.Rect() );
        rect.iBr.iX -= 10;        
        AknLayoutUtils::LayoutEdwin( iEdwin,
            rect,
            textLayout.LayoutLine(),
            EAknsCIQsnTextColorsCG27,
            0,
            ETrue );
            
        iEdwin->SetBorder( TGulBorder::ENone ); 
        if ( IsFocused() && !( iEdwin->IsFocused() ) )
            {
            iEdwin->SetFocus(ETrue);
            }
        }
    }
	    
void CAknQueryControl::LayoutPromptForFullScreen()
	{
    if ( NbrOfPromptLines() != 3 )
    	{
    	return;	
    	}
    
    TBool landscape = Layout_Meta_Data::IsLandscapeOrientation();
    
    TAknLayoutRect rect;
 	rect.LayoutRect( LayoutRect(), TAknWindowComponentLayout::Compose(
 		AknLayoutScalable_Apps::popup_vitu2_window( landscape ? 1 : 0 ), 
    	AknLayoutScalable_Apps::area_vitu2_query_pane( landscape ? 1 : 0 ) ).LayoutLine() );
    	
    TAknTextLineLayout lineLayout = AknLayoutScalable_Apps::area_vitu2_query_pane_t4( 1 ).LayoutLine();
    AknLayoutUtils::LayoutLabel(iPrompt->Line(0), rect.Rect(), lineLayout );
          
    lineLayout = AknLayoutScalable_Apps::area_vitu2_query_pane_t5( 1 ).LayoutLine();
    AknLayoutUtils::LayoutLabel(iPrompt->Line(1), rect.Rect(), lineLayout );
  
    lineLayout = AknLayoutScalable_Apps::area_vitu2_query_pane_t6( 1 ).LayoutLine();
    AknLayoutUtils::LayoutLabel(iPrompt->Line(2), rect.Rect(), lineLayout );   
	}

EXPORT_C void CAknQueryControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
    { 
    CEikMfne* edwin = NULL;
    if ( iTimeEdwin )
        {
        edwin = iTimeEdwin;
        }        
    else if ( iDateEdwin )
        {
        edwin = iDateEdwin;
        }
    else if ( LocationEd() )
        {
        edwin = LocationEd();
        }
    else if ( iDurationEdwin )
        {
        edwin = iDurationEdwin;
        }
        
    if ( edwin && iEditorFrame.Rect().Contains(aPointerEvent.iPosition) )
        {
        edwin->HandlePointerEventL(aPointerEvent);
        }
    else
        {
        CAknControl::HandlePointerEventL(aPointerEvent); 
        }
    }

EXPORT_C void* CAknQueryControl::ExtensionInterface( TUid /*aInterface*/ ) 
    { 
    return NULL;
    }
    
EXPORT_C void CAknQueryControl::HandleResourceChange(TInt aType)
    {
    _AKNTRACE_FUNC_ENTER;
    CCoeControl::HandleResourceChange(aType);
    
    if( aType == KAknsMessageSkinChange && iExtension->iAnimationId )
        {
        TRAP_IGNORE(SetAnimationL( iExtension->iAnimationId ));
        TRAP_IGNORE(StartAnimationL());
        }    
    else if( aType == KEikDynamicLayoutVariantSwitch )
        {
        SizeChanged();
        TRAP_IGNORE(DoSetPromptL());
        }
    _AKNTRACE_FUNC_EXIT;
    }    

// ---------------------------------------------------------------------------
// Return prompt text needed by FEP to query dialog
// ---------------------------------------------------------------------------
//
void CAknQueryControl::GetCaption(TDes& aCaption) const
    {
    aCaption = KNullDesC;
    
    TPtr prompt= iPrompt->Text();
    if ( prompt != KNullDesC )
       {
       const TInt maximumLength=aCaption.MaxLength();
       
       if ( prompt.Length() > maximumLength )
          {
          aCaption=prompt.Left(maximumLength);
          }
       else
          {
          aCaption= prompt;
          }
       }
    }


// ---------------------------------------------------------------------------
// Sets the state of ECS number visibility in the query.
// ---------------------------------------------------------------------------
//
void CAknQueryControl::SetEcsCbaVisibleL( TBool aVisible )
    {
    _AKNTRACE( "[%s][%s] aVisible:%d ", "CAknQueryControl", __FUNCTION__,aVisible);
    if ( iExtension &&
         !COMPARE_BOOLS( aVisible, iExtension->iEcsCbaShown ) &&
         iFlags.IsSet( EEmergencyCallsCBASupport ) )
        {
        CEikDialog* dlg;
        MopGetObject( dlg );
        if ( dlg )
            {
            CEikButtonGroupContainer& cba = dlg->ButtonGroupContainer();
            
            if ( aVisible 
                && (GetTextLength() == iEcsDetector->CurrentMatch().Length()) )
                // Further check to ensure that the matched number is the
                // entire buffer. Get the matched text and see if is the same
                // length as the current query length.
                {
                HBufC* cbaLabel =
                    StringLoader::LoadLC( R_AVKON_SOFTKEY_CALL_TEXT );
                cba.AddCommandToStackL( 0,
                                        EAknSoftkeyEmergencyCall,
                                        *cbaLabel );
                CleanupStack::PopAndDestroy( cbaLabel );
                iExtension->iEcsCbaShown = ETrue;
                }
            else
                {
                if ( iExtension->iEcsCbaShown )
                    {
                    cba.RemoveCommandFromStack( 0, EAknSoftkeyEmergencyCall );
                    iExtension->iEcsCbaShown = EFalse;
                    }
                }
            }
        }
    _AKNTRACE_FUNC_EXIT;
    }


// ---------------------------------------------------------------------------
// Attempts an emergency call.
// ---------------------------------------------------------------------------
//
void CAknQueryControl::AttemptEmergencyCallL()
    {
    _AKNTRACE_FUNC_ENTER;
    if ( iEcsDetector )
        {
        if ( iEcsDetector->State() == CAknEcsDetector::ECompleteMatch || 
             iEcsDetector->State() == CAknEcsDetector::EServiceNumMatch )
            {
            // Further check to ensure that the matched number is the
            // entire buffer. Get the matched text and see if is the same
            // length as the current query length.
            if ( GetTextLength() == iEcsDetector->CurrentMatch().Length() )
                {
                iEcsDetector->AddChar( (TText)EKeyYes );
                SetEcsCbaVisibleL( EFalse );
                
                // stop playing tacticons for pincode query
                StopPinCodeTacticonTimer();
                }
            }
        }
    _AKNTRACE_FUNC_EXIT;
    }


/*****************************
 * CAknExtQueryControl
 *****************************/


///
/// Construction and Destruction methods
///

/**
 *
 */
EXPORT_C CAknExtQueryControl::CAknExtQueryControl()  : CAknQueryControl()
    {
    AKNTASHOOK_ADD( this, "CAknExtQueryControl" );
    }

/**
 *
 */
EXPORT_C CAknExtQueryControl::~CAknExtQueryControl()
    {
    AKNTASHOOK_REMOVE();
	if (iFixedPointEditor)
        AknsUtils::DeregisterControlPosition(iFixedPointEditor);
	if (iIpEditor)
        AknsUtils::DeregisterControlPosition(iIpEditor);
    delete iIpEditor;
    delete iFixedPointEditor;
    }


void CAknExtQueryControl::ConstructQueryL(TResourceReader& aRes)
    {   
    _AKNTRACE_FUNC_ENTER;
    if ( iQueryType == EIpLayout)   
        {
        iIpEditor = new(ELeave)CAknIpFieldEditor;
        iIpEditor->SetContainerWindowL(*this);
        iIpEditor->ConstructFromResourceL(aRes);
        iIpEditor->SetObserver(this);
        iIpEditor->SetSkinTextColorL(EAknsCIQsnTextColorsCG27);
        if ( AknLayoutUtils::PenEnabled() )
            {
            iIpEditor->SetFeature( CEikMfne::EFingerSupport, CEikMfne::EnableWithAllHighlight );
	        }
        }
    else if ( iQueryType == EFixedPointLayout)  
        {
        iFixedPointEditor = new(ELeave)CEikFixedPointEditor;
        iFixedPointEditor->SetContainerWindowL(*this);
        iFixedPointEditor->ConstructFromResourceL(aRes);
        iFixedPointEditor->SetAknEditorAllowedInputModes( EAknEditorNumericInputMode );
        iFixedPointEditor->SetObserver(this);
        }
    else
         __ASSERT_DEBUG(0, Panic(EAknPanicLayoutControlResourceProblem));   

    // Construct editor context
    CAknQueryExtension* extension = QueryExtension();
    if( extension )
        {
        extension->CreateEditorContextL();
        }
    _AKNTRACE_FUNC_EXIT;
    }


///
/// CCoeControl methods
///

/**
 *Returns the control owned by this control by the index
 */
CCoeControl* CAknExtQueryControl::ComponentControl(TInt anIndex) const
    {
    CCoeControl* controls[] = { iPrompt, 
                                iEditIndicator, 
                                iIpEditor,
                                iFixedPointEditor,
                                iImage, iAnimation };
    
    for (TUint ii=0;ii<sizeof(controls)/sizeof(CCoeControl*);ii++)
        {
        //subtle: index is decremented only if control is not NULL!
        if (controls[ii] && anIndex-- == 0) 
            {
            return controls[ii];
            }
        }
    return NULL;
    }     

/**
 * Returns the number of controls inside the compound control.
 */
TInt CAknExtQueryControl::CountComponentControls() const
    {
    TInt count = 0;
    CCoeControl* controls[] = { iPrompt,
                                iEditIndicator,
                                iIpEditor,
                                iFixedPointEditor,
                                iImage, iAnimation };
                                
    for (TUint ii=0;ii<sizeof(controls)/sizeof(CCoeControl*);ii++)
        {
        if (controls[ii])
            {
            count++;
            }
        }
    return count;
    }


/**
 * Handle a focus changed
 */
void CAknExtQueryControl::FocusChanged(TDrawNow aDrawNow)
    {
    CCoeControl* ctrl = ControlByLayoutOrNull( iQueryType );
    if (ctrl)
        {
        ctrl->SetFocus( IsFocused(), aDrawNow );
        Layout();
        }
    }

void CAknExtQueryControl::PrepareForFocusLossL()
    {
    CCoeControl* ctrl = ControlByLayoutOrNull( iQueryType );
    if (ctrl)
        {
        ctrl->PrepareForFocusLossL(); 
        }
    }

EXPORT_C void CAknExtQueryControl::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType)
    {
    //CAknQueryControl::HandleControlEventL(NULL, aEventType);
	_AKNTRACE( "[%s][%s] aEventType:%d ", "CAknExtQueryControl", "HandleControlEventL",aEventType);
    if(iQueryControlObserver && aEventType == EEventStateChanged)
        {                
        if(GetTextLength())
            {
            iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorValueValid);
            }
        else
            {
            iQueryControlObserver->HandleQueryEditorStateEventL(this,MAknQueryControlObserver::EQueryControlEditorStateChanging, MAknQueryControlObserver::EEditorEmpty);
            }
        }
    _AKNTRACE( "[%s][%s] EXIT ", "CAknExtQueryControl", "HandleControlEventL");
    }


///
/// DRAWING METHODS
///

/**
 * Layout the ip editor and its frame.
 * 
 * 
 * Queries other than confirmation queries have an editor that the user needs
 * to input the query data. This method does the layout of the editor. 
 *
 * Data queries have a resizable editor and its layout is specified in the LAF.
 * 
 * Other queries have a fixed size editor with layout specified.
 *
 *
 * This method is called from SizeChanged. Depending on the query type, the
 * layout method is chosen accordingly, e.g. data queries use the data query
 * method, other queires use the code query method.
 *
 * The macros at the top are just for avoiding code repetition.
 */
void CAknExtQueryControl::LayoutEditor(const TLayoutMethod& aLayoutM)
    {   
    TIndex LAFIndex(NbrOfPromptLines());
    
    if (aLayoutM == EDataQueryLayoutM)
        {
        iHasEditor = ETrue;
        
        LayoutEditorFrame(aLayoutM);        
        LayoutEditorIndicator(aLayoutM);

        TInt promptLines = NbrOfPromptLines();
        TInt numberTextLines = NbrOfEditorLines();
        TInt isNumeric = 0;

        if ( iFixedPointEditor )
            {
            if ( promptLines >= 3 )
                {
                AknLayoutUtils::LayoutEdwin( iFixedPointEditor,
                                             LayoutRect(),
                                             AKN_LAYOUT_TEXT_Data_query_pop_up_window_texts_Line_2( LAFIndex.DQPWindowTextsLine2(numberTextLines), isNumeric ),
                                             EAknsCIQsnTextColorsCG27 ) ;
                }
            else
                {
                if ( promptLines == 2 )
                    {
                    AknLayoutUtils::LayoutEdwin( iFixedPointEditor,
                                                 LayoutRect(),
                                                 AKN_LAYOUT_TEXT_Data_query_pop_up_window_texts_Line_2( LAFIndex.DQPWindowTextsLine2(1), isNumeric  ),
                                                 EAknsCIQsnTextColorsCG27 );
                    }
                else
                    {
                    AknLayoutUtils::LayoutEdwin( iFixedPointEditor,
                                                 LayoutRect(),
                                                 AKN_LAYOUT_MULTILINE_TEXT_Data_query_pop_up_window_texts_Line_2( isNumeric, numberTextLines ),
                                                 EAknsCIQsnTextColorsCG27 );
                    }
                }
            iFixedPointEditor->SetBorder(TGulBorder::ENone); 
            if (IsFocused() && !(iFixedPointEditor->IsFocused()) ) 
                iFixedPointEditor->SetFocus(ETrue);

            AknsUtils::RegisterControlPosition( iFixedPointEditor );
            }
        }    
    else if (aLayoutM == ETimeQueryLayoutM)
        {
        iHasEditor = ETrue;

        LayoutEditorFrame(aLayoutM);
        
        LayoutEditorIndicator(aLayoutM);

//LAYOUT for IP EDITOR
        if(iIpEditor)
            {
            AknLayoutUtils::LayoutMfne(iIpEditor,LayoutRect(),
              AKN_LAYOUT_TEXT_Code_query_pop_up_window_texts_Line_2(LAFIndex.PromptLine()));

            iIpEditor->SetBorder( TGulBorder::ENone ); 
            if ( IsFocused() && !iIpEditor->IsFocused() ) 
                iIpEditor->SetFocus(ETrue);
            iIpEditor->SetUpAndDownKeysConsumed( ETrue );
            }
        }
    }

EXPORT_C void CAknExtQueryControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) 
    { 
    if ( iIpEditor && iEditorFrame.Rect().Contains(aPointerEvent.iPosition) )
        {
        iIpEditor->HandlePointerEventL(aPointerEvent); 
        }
    else
        {
        CAknQueryControl::HandlePointerEventL(aPointerEvent);
        }
    }

EXPORT_C void* CAknExtQueryControl::ExtensionInterface( TUid /*aInterface*/ ) 
    { 
    return NULL;
    }

EXPORT_C TInetAddr CAknExtQueryControl::GetInetAddress() const
    {   
    TInetAddr ret = TInetAddr();
    if( iIpEditor )
        {
        return iIpEditor->Address();
        }
    return ret; 
    }


EXPORT_C void CAknExtQueryControl::SetInetAddress(TInetAddr& aInetAddress)
    {
    if( iIpEditor )
        {
        iIpEditor->SetAddress(aInetAddress);
        }
    }

EXPORT_C TInt CAknExtQueryControl::GetFixedPointNumber() const
    {   
    TInt ret = 0;
    if( iFixedPointEditor )
        {
        return iFixedPointEditor->Value();
        }
    return ret; 
    }


EXPORT_C void CAknExtQueryControl::SetFixedPointNumberL(const TInt* aNumber)
    {
    if( iFixedPointEditor )
        {
        iFixedPointEditor->SetValueL(aNumber);
        }
    }


EXPORT_C void CAknExtQueryControl::SetMinimumAndMaximum(const TInetAddr& aMinimumAddress, const TInetAddr& aMaximumAddress)
    {
    if( iIpEditor )
        {
        iIpEditor->SetMinimumAndMaximum(aMinimumAddress, aMaximumAddress);
        } 
    }

EXPORT_C void CAknExtQueryControl::SetMinimumAndMaximum(TInt aMinimumValue, TInt aMaximumValue)    
    {
    if( iFixedPointEditor )
        {
        iFixedPointEditor->SetMinMax(aMinimumValue, aMaximumValue);
        }
    }


/**
 * Return text editor depening on query type
 */
EXPORT_C CCoeControl* CAknExtQueryControl::ControlByLayoutOrNull(TInt aLayout)
    {
    CCoeControl* ctrl=NULL;
    if ( aLayout == EIpLayout )
        {
            ctrl = iIpEditor;
        }
    else if ( aLayout == EFixedPointLayout )
        {
            ctrl = iFixedPointEditor;
        }
    return ctrl;
    }


/**
* This method looks at the flags that have been set in the query control and 
* acts upon them if possible
* 
*/
void CAknExtQueryControl::DeployFlagsL()
    {       
    }

/**
* Method to first set the flags and then to use them on the contained editors
*
*/

void CAknExtQueryControl::SetAndUseFlagsL(TBitFlags16 /*aFlags*/)
    {
    }

void CAknExtQueryControl::SetFlags(TBitFlags16 /*aFlags*/)
    {
    }


/** 
 * Return true if editor content is valid for query, false 
 * otherwise. Ip editor always have a valid content.
 * 
 * 
 */ 
TBool CAknExtQueryControl::EditorContentIsValidL() const
    {
    TInt ret = EFalse;
    if ( iIpEditor ) 
        {
        CEikMfne* editor = iIpEditor;
        ret = editor->Field(editor->CurrentField())->IsValid();
        }
    else if ( iFixedPointEditor ) 
        {
        TInt intValue;
        CAknNumericEdwin::TValidationStatus status = iFixedPointEditor->GetValueAsInteger(intValue);
        ret = status == CAknNumericEdwin::EValueValid;
        }
    return ret; 
    }


/*****************************************************************
 * CAknExtQueryControl::TIndex
 *
 * Manage indexes into LAF tables
 *
 * PN stands for "Popup Note"
 *
 * PQD stands for "Popup Query Data'
 *
 * 'DPQ' stands for "Data Query Popup"
 ******************************************************************/

  
CAknExtQueryControl::TIndex::TIndex(TInt aNumberOfPromptLines)
    : iNumberOfPromptLines(aNumberOfPromptLines)
    {
    }
        
void CAknExtQueryControl::TIndex::SelfTest() const
    {
    __ASSERT_DEBUG(iNumberOfPromptLines >= 0  && iNumberOfPromptLines <= 5,
        Panic(EAknPanicInvalidValue));
    }

/**
 * Return index into LAF tables that depend directly on number of prompt lines,
 * index is equal to number of prompt lines minus one unless there are no prompt
 * lines in which case the index is zero
 */
TInt CAknExtQueryControl::TIndex::PromptLine() const
    {
    SelfTest();
    return iNumberOfPromptLines > 0 ? iNumberOfPromptLines - 1 : 0;
    }

/**
 * Return index into Main Pane PQDC Window, which
 * depends on total number of prompt lines minus 2, e.g.
 * index 0 for 2 prompt lines total.
 *
 */
TInt CAknExtQueryControl::TIndex::DQPWindowTextsLine2(TInt aLineNum) const
    {
    SelfTest();
    __ASSERT_DEBUG(aLineNum > 0 && aLineNum <= 5,Panic(EAknPanicInvalidValue));

    static const TInt  KDataQueryPopupWindowTextsLine2Index[3][5] = 
    {   {0,  1, 2, 3, 4},    //1 PROMPT LINE
        {5,  6, 7, 8, 9},    //2 PROMPT LINES
        {10, 10, 10, 10, 10}  }; //3 PROMPT LINES
    
    return KDataQueryPopupWindowTextsLine2Index[PromptLine()][aLineNum-1];
    }

TInt CAknExtQueryControl::TIndex::PNWindow() const
    {
    __ASSERT_DEBUG(0,Panic(EAknPanicNotSupported)); // We should never be here
    return 0;
    /*
    SelfTest();
    static const TInt  KPopupNoteWindowIndex[5] = { 0,0,0,1,2 };
    
    return KPopupNoteWindowIndex[PromptLine()];
    */
    }

TInt CAknExtQueryControl::TIndex::PQDWindow(TInt aLineNum) const
    {
    (void)aLineNum; // to remove warning
    __ASSERT_DEBUG(0,Panic(EAknPanicNotSupported)); // We should never be here
    return 0;
    /*
    SelfTest();
    __ASSERT_DEBUG(aLineNum > 0 && aLineNum <= 5,Panic(EAknPanicInvalidValue));

    static const TInt  KPopupQueryDataWindowIndex[3][5] = 
    {   {0, 1, 3, 6, 8},   //1 PROMPT LINE
        {2, 4, 7, 9, 10},  //2 PROMPT LINES
        {5, 6, 8, 10, 11} }; //3 PROMPT LINES
    
    return KPopupQueryDataWindowIndex[PromptLine()][aLineNum-1];
    */
    }


// Callback for doing a redraw when animating pictographs
TInt CAknExtQueryControl::StaticPictographCallBack( TAny* aPtr )
    {
    _AKNTRACE_FUNC_ENTER;
    CAknExtQueryControl* me = static_cast<CAknExtQueryControl*>( aPtr );
    me->PictographCallBack();
    _AKNTRACE_FUNC_EXIT;
    return KErrNone;
    }

void CAknExtQueryControl::PictographCallBack()
    {
    _AKNTRACE_FUNC_ENTER;
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );

    for ( TInt i = 0 ; i < iPrompt->NumberOfLines() ; i++ )
        {
        CAknPictographInterface* picto = iPrompt->PictographInterface();

        // Only update the note line if it contains pictographs

        if ( picto->Interface()->ContainsPictographs( 
            *( iPrompt->Line( i )->Text() ) ) )
            {
            TRect lineRect = iPrompt->Line(i)->Rect();
            Window().Invalidate( lineRect );

            ActivateGc();
            Window().BeginRedraw();

            AknsDrawUtils::Background(
                skin,
                cc,
                this,
#ifdef RD_UI_TRANSITION_EFFECTS_POPUPS
				SystemGc(),
#else				
                iCoeEnv->SystemGc(),
#endif                
                lineRect );

            Window().EndRedraw();
            DeactivateGc();

            // Draw the label after the background.
            iPrompt->Line( i )->ActivateL(); // Never leaves
            iPrompt->Line( i )->DrawNow();
            iPrompt->SetLineModified( i, EFalse );
            }
        }
    _AKNTRACE_FUNC_EXIT;
    }

// End of File
