/*
* Copyright (c) 2002-2005 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:  split itut data manager
*
*/


#ifndef C_SPLITITUTDATAMGR_H
#define C_SPLITITUTDATAMGR_H

#include <e32base.h>
#include <PtiDefs.h>
#include <AknLayout2Def.h>

#include "peninputsplititutpropertysubscriber.h"
#include "peninputsplititutdata.h"

class CPtiEngine;
class CFont;
class MSplitItutLayoutContext;
class CSplitItutWindowManager;

extern const TInt KInvalidResId;
extern const TInt KMaxPredictCandCnt;
extern const TInt KInvalidImMode;
const TInt KMaxFileLength = 80;

/**
* Class  CSplitItutDataMgr
*  
* Wrapper of L&F data.
*
* @lib peninputsplititut.lib
* @since S60 v5.0
*/

class CSplitItutDataMgr : public CBase
    {  
public:
    /**
     * Symbian constructor.
     *
     * @since S60 v5.0
     * @return Pointer to created object.
     */ 
    static CSplitItutDataMgr* NewL( MSplitItutLayoutContext* aLayoutContext, 
                                    CPtiEngine* aPtiEngine );

    /**
     * standard c++ destructor.
     *
     * @since S60 v5.0
     * @return None
     */ 
    ~CSplitItutDataMgr();

    /**
     * Add subscriber
     *
     * @since S60 v5.0
     * @param aSubscriber sub scriber
     * @return None
     */
    void AddSubscriber(MItutPropertySubscriber* aSubscriber);

    /**
     * read laf data.
     *
     * @since S60 v5.0
     * @return None
     */
    void ReadLafInfo();

    /**
     * Set input language
     *
     * @since S60 v5.0
     * @param aLanguage input language
     * @return None
     */
    void SetLanguageL(TInt aLanguage);

    /**
     * read laf data.
     *
     * @since S60 v5.0
     * @param aMode input mode  
     * @return None
     */
    void SetInputModeL(TInt aMode);

    /**
     * Set input case
     *
     * @since S60 v5.0
     * @param aCase input case  
     * @return None
     */
    void SetCase(TInt aCase);

    /**
     * Request data
     *
     * @since S60 v5.0
     * @param aDataType data type 
     * @return date
     */
    TAny* RequestData(TInt aDataType);

    /**
     * Get ptiengine pointer
     *
     * @since S60 v5.0
     * @return ptiengine
     */
    inline CPtiEngine* PtiEngine();

    /**
     * Notify change control layout
     *
     * @since S60 v5.0
     * @param aPropertyName property name
     * @param aCtrlResId control id  
     * @return None
     */
    void NotifyChangeControlLayout(MItutPropertySubscriber::TItutProperty aPropertyName, 
                                   TInt aCtrlResId);

    /**
     * Get input language
     *
     * @since S60 v5.0
     * @return language id
     */
    inline TInt InputLanguage();
    
    /**
     * Is valid language
     *
     * @since S60 v5.0
     * @param aLanguage language id    
     * @return TBool
     */
	inline TBool IsValidLanguage(TInt aLanguage);
	
    /**
     * Get input mode
     *
     * @since S60 v5.0
     * @return input mode
     */
    inline TInt InputMode();
    
    /**
     * Get text case
     *
     * @since S60 v5.0
     * @return text case
     */
    inline TInt TextCase();

    /**
     * Is exist plus char
     *
     * @since S60 v5.0
     * @return TBool
     */
    TBool IsExistPlusChar();
    
    /**
     * Set latin only flag
     *
     * @since S60 v5.0
     * @param aLatinOnly latin only flag
     * @return TBool
     */
    inline void SetLatinOnly( TBool aLatinOnly );

    /**
     * Is in Spell mode
     *
     * @since S60 v5.0
     * @return TBool
     */    
    inline TBool IsSpellMode();
    
    /**
     * Set Spell mode flag
     *
     * @since S60 v5.0
     * @param aSpellMode Spell mode flag
     * @return void
     */
    inline void SetSpellMode(TBool aSpellMode);
    
    /**
     * Set Indicator Data
     *
     * @since S60 v5.0
     * @param aIndicatorData Indicator Data
     * @return void
     */
    inline void SetIndicatorData(TFepIndicatorInfo &aIndicatorData);
    
    /**
     * Get Indicator Data
     *
     * @since S60 v5.0
     * @return TFepIndicatorInfo
     */
    inline TFepIndicatorInfo IndicatorData();
    
    /**
     * Set update flag
     *
     * @since S60 v5.0
     * @param aNeedUpdate need update flag
     * @return None
     */
	void SetUpdate(TBool aNeedUpdate);

    /**
     * get update flag
     *
     * @since S60 v5.0
     * @return update flag
     */
	TBool IsUpdate() const;

//    TInt GetNextPageCandidateL(RPointerArray<HBufC>& aList);

//    TBool NextPageCandidateExist();

//    void ClearChnCandidates(TInt aCmd);

    /**
     * get keypad resource id
     *
     * @since S60 v5.0
     * @return keypad resource id
     */
    TInt KeypadResourceId();
    
    /**
     * Is chinese
     *
     * @since S60 v5.0
     * @return TBool
     */
    TBool IsChinese();
    
    /**
     * Is Hindi
     *
     * @since S60 v5.0
     * @return TBool
     */
    TBool IsHindi();
    
    /**
     * Is Thai
     *
     * @since S60 v5.0
     * @return TBool
     */
    TBool IsThai();

    /**
     * Is right to left language
     *
     * @since S60 v5.0
     * @return TBool
     */
    TBool IsRtoLLanguage();
    
    /**
     * Is right to left language
     *
     * @since S60 v5.0
     * @param aLanguage language id
     * @return TBool
     */
    TBool IsRtoLLanguage( TInt aLanguage );
    
    /**
     * Is language direction switch
     *
     * @since S60 v5.0
     * @return TBool
     */
    TBool IsLangDirectionSwitch() const;
    
    /**
     * set language direction switch
     *
     * @since S60 v5.0
     * @param aIsChange change flag
     * @return None
     */
    inline void SetLangDirectionSwitch( TBool aIsChange );
    
    /**
     * set numeric keymap
     *
     * @since S60 v5.0
     * @param aKeymap
     * @return None
     */
    void SetNumericKeymap( const TInt aKeymap );
    
    /**
     * set numeric keymap data
     *
     * @since S60 v5.0
     * @param aKeymapData
     * @return None
     */
    void SetNumericKeymapData( TInt* aKeymapData );
    
    /**
     * is char flag changed
     *
     * @since S60 v5.0
     * @return TBool
     */
    inline TBool IsCharFlagChanged();
    
    /**
     * set numeric only
     *
     * @since S60 v5.0
     * @param aIsNumberOnly
     * @return None
     */
    inline void SetNumericOnly( TBool aIsNumberOnly );
    
    /**
     * get numeric only flag
     *
     * @since S60 v5.0
     * @return TBool
     */
    inline TBool IsNumericOnly() const;
	
	TRect iShiftIconRect;
	
private:
    /**
     * C++ constructor
     *
     * @since S60 v5.0
     * @return None
     */
    CSplitItutDataMgr(MSplitItutLayoutContext* aLayoutContext, CPtiEngine* aPtiEngine );

    /**
     * Symbian second-phase constructor
     *
     * @since S60 v5.0
     * @return None
     */
    void ConstructL();

    /**
     * Notify subscriber
     * 
     * @since S60 v5.0
     * @param aPropertyName
     * @param aValue
     * @return None
     */
    void NotifySubscriber( MItutPropertySubscriber::TItutProperty aPropertyName, 
                           const TDesC& aValue);

    /**
     * Get config resource file name
     * 
     * @since S60 v5.0
     * @param aLang Language id
     * @return None
     */
    TInt GetConfigResFileName(TInt aLang);
    
    /**
     * Find language in an array
     * 
     * @since S60 v5.0
     * @param aArray
     * @param aEndIdx
     * @param aLang
     * @return index in the array
     */
    TInt FindLang(const TInt* aArray, TInt aEndIdx, TInt aLang);
    
    /**
     * get resource file string
     * 
     * @since S60 v5.0
     * @param aIndex
     * @return resource file
     */
    static const TDesC& ResFileExtByScriptIdx(const TScriptExtIndex aIndex);
   
    /**
     * Get chinese keypad resource id
     * 
     * @since S60 v5.0
     * @return resource id
     */
    TInt ChineseKeypadResourceId();
    
    /**
     * Get chinese keypad resource id
     * 
     * @since S60 v5.0
     * @return resource id
     */
    TInt HindiKeypadResourceId();
public: 
    TInt iIcfTextLeftMargin;
	TInt iIcfTextRightMargin;
	TInt iIcfTextTopMargin;
	TInt iIcfTextBottomMargin;
	TInt iIcfTextLineSpaceMargin;
	TInt iIcfTextHeight;
    
private: // data member
    RPointerArray<MItutPropertySubscriber> iSubscriberList;
    CPtiEngine* iPtiEngine;
    TInt iLanguage;
    TInt iInputMode;
    TInt iCase;

    TSize iScreenSize;

    // offset of layout, compare to screen
    TPoint iLayoutOffset;
    TRect iLayoutRect;
    TRect iLayoutRectSpell;
    TRect iBackgroundRect;

    TRect iBackspaceRect;
    TRect iBackspaceInnerRect;
    TRect iBackspaceCnRect;
    TRect iBackspaceInnerCnRect;
    TRect iArrowLeftRect;
    TRect iArrowLeftInnerRect;
    TRect iArrowLeftCnRect;
    TRect iArrowLeftInnerCnRect;
    TRect iArrowRightRect;
    TRect iArrowRightInnerRect;
    TRect iArrowRightCnRect;
    TRect iArrowRightInnerCnRect;
    TRect iArrowUpRect;
    TRect iArrowDownRect;  
    TRect iArrowUpInnerRect;
    TRect iArrowDownInnerRect;

    TRect iKeypadRect;  
    TRect iKeypadRectCn;
    TRect iKeypadRectQuery;
    RArray<TRect> iKeypadCellRects;
//    RArray<TRect> iKeypadCellRectsCn;
	
    // properties of candidate list
    /*
    TInt iCandsUnitWidth;
    TInt iCandsUnitHeight;
    TInt iCandsHorizontalMargin;
    TInt iCandsVerticalMargin;
    TInt iCandsNaviWidth;
    TInt iCandsSpinBtnHeight;    
    TPoint iCandsSpellLTPos;
    TPoint iCandsLTPos;
    TPoint iCandsPuncLTPos;
    CFont* iCandsFont;
    TInt iCandsTextMargin;
    TRgb iCandsTextColor;    
    */

    TAknTextLineLayout iVkAlphaText1;
    TAknTextLineLayout iVkAlphaText2;
    TAknTextLineLayout iVkAlphaText3;
    TAknTextLineLayout iVkNumText;

    // resource id for generic itut resource file
    TInt iCommonResId;
    TInt iConfigResId;

    TInt iAvkonResId;
    
    // not own
    MSplitItutLayoutContext* iLayoutContext;

    // chinese related candidates
//    RPointerArray<HBufC> iCandidates;
//    RPointerArray<HBufC> iPuncCandidates;

    TRect iOptionsRect;
    TRect iCloseRect;
    TRect iCloseInnerRect;
    TRect iOptionInnerRect;
    TRect iOptionsRectCn;
    TRect iCloseRectCn;    
    TRect iCloseInnerRectCn;
    TRect iOptionInnerRectCn;
    
    // preview bubble
    TRect iPreviewWndRect;
    TRect iPreviewWndInnerRect;
    CFont* iBubbleFont;
	TAknTextLineLayout iPreviewWndText;

    TBuf<KMaxFileLength> iResourceFilename;
    TBool iLangCaseSensitive;
    TInt iCurrentScriptIdx;

    TAknTextLineLayout iBtnTextFormat;
    TAknTextLineLayout iBtnTextFormat1; 
    

    TBool iNeedUpdate;
    TBool iLatinOnly;
	
	TBool iIsLangDirectionSwitch;    
	
	TInt iNumericKeymap;
	HBufC* iNumericKeymapData;
	TBool iExistPlusChar;
	TBool iPlusCharFlagChanged;
	TBool iNumberOnly;
	// For spell mode
	TBool iSpellMode;
	TRect iSpellICFRect;
	TRect iSpellEditIndicator;
	TRect iOkRect;
	TRect iCancelRect;
	CFont* iIcfFont;
	TInt iIcfTextAlignment;
	
	// Spell Back space rect
	TRect iSpellBackSpcace;
	TRect iSpellBackSpcaceInner;
	
	// Left&Right arrow
	TRect iSpellArrowLeftRect;
	TRect iSpellArrowLeftRectInner;
	TRect iSpellArrowRightRect;
	TRect iSpellArrowRightRectInner;
	
    //TRect iIndiPaneRectWithTextForPrtWest;
    TRect iIndiPaneRectWithoutTextForPrtWest;
    //TRect iIndiIconRectWithTextForPrtWest;
    TRect iIndiIconRectWithoutTextForPrtWest;
    TAknTextLineLayout iIndiTextForPrtWest;

	TAknTextLineLayout iSpellBtnTextFormat;
	TFepIndicatorInfo iIndicatorData;
    };

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::PtiEngine
// ---------------------------------------------------------------------------
//
inline CPtiEngine* CSplitItutDataMgr::PtiEngine()
    {
    return iPtiEngine;
    }

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::InputMode
// ---------------------------------------------------------------------------
//
inline TInt CSplitItutDataMgr::InputMode()
    {
    return iInputMode;
    }
    
// ---------------------------------------------------------------------------
// CSplitItutDataMgr::InputLanguage
// ---------------------------------------------------------------------------
//
inline TInt CSplitItutDataMgr::InputLanguage()
    {
    return iLanguage;
    }

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::TextCase
// ---------------------------------------------------------------------------
//
inline TInt CSplitItutDataMgr::TextCase()
    {
    return iCase;
    }
    
// ---------------------------------------------------------------------------
// CSplitItutDataMgr::SetLatinOnly
// ---------------------------------------------------------------------------
//
inline void CSplitItutDataMgr::SetLatinOnly( TBool aLatinOnly )
    {
    iLatinOnly = aLatinOnly;
    } 

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::IsSpellMode
// ---------------------------------------------------------------------------
//
inline TBool CSplitItutDataMgr::IsSpellMode()
    {
    return iSpellMode;
    }

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::SetSpellMode
// ---------------------------------------------------------------------------
//
inline void CSplitItutDataMgr::SetSpellMode(TBool aSpellMode)
    {
    iSpellMode = aSpellMode;
    }
 
// ---------------------------------------------------------------------------
// CSplitItutDataMgr::SetIndicatorData
// ---------------------------------------------------------------------------
//
inline void CSplitItutDataMgr::SetIndicatorData(TFepIndicatorInfo &aIndicatorData)
    {
    iIndicatorData.iIndicatorImgID = aIndicatorData.iIndicatorImgID;
    iIndicatorData.iIndicatorMaskID = aIndicatorData.iIndicatorMaskID;
    iIndicatorData.iIndicatorTextImgID = aIndicatorData.iIndicatorTextImgID;
    iIndicatorData.iIndicatorTextMaskID = aIndicatorData.iIndicatorTextMaskID;
    }
 
// ---------------------------------------------------------------------------
// CSplitItutDataMgr::IndicatorData
// ---------------------------------------------------------------------------
//
inline TFepIndicatorInfo CSplitItutDataMgr::IndicatorData()
    {
    return iIndicatorData;
    } 


// ---------------------------------------------------------------------------
// CSplitItutDataMgr::IsValidLanguage
// ---------------------------------------------------------------------------
//
inline TBool CSplitItutDataMgr::IsValidLanguage(TInt aLanguage)
	{
	return (aLanguage != ELangTest && aLanguage != ELangNone);	
	}
	
// ---------------------------------------------------------------------------
// CSplitItutDataMgr::SetLangDirectionSwitch
// ---------------------------------------------------------------------------
//
inline void CSplitItutDataMgr::SetLangDirectionSwitch( TBool aIsChange )
	{
	iIsLangDirectionSwitch = aIsChange;
	}

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::IsCharFlagChanged
// ---------------------------------------------------------------------------
//
inline TBool CSplitItutDataMgr::IsCharFlagChanged()
    {
    if( iExistPlusChar != IsExistPlusChar() )
    	{
    	iExistPlusChar = IsExistPlusChar();
        iPlusCharFlagChanged = ETrue;
    	}
    else
    	{
        iPlusCharFlagChanged = EFalse;
    	}
    return iPlusCharFlagChanged;
    }

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::SetNumericOnly
// ---------------------------------------------------------------------------
//
inline void CSplitItutDataMgr::SetNumericOnly( TBool aIsNumberOnly )
	{
	iNumberOnly = aIsNumberOnly;
	}

// ---------------------------------------------------------------------------
// CSplitItutDataMgr::IsNumericOnly
// ---------------------------------------------------------------------------
//
inline TBool CSplitItutDataMgr::IsNumericOnly() const
	{
	return iNumberOnly;
	}

#endif // C_SPLITITUTDATAMGR_H
