/*
* 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:  drop-down list control
*
*/


#include <aknlayoutscalable_apps.cdl.h>
#include <peninputgeneralitutnew.rsg>
#include <peninputitutconfig_chinese.rsg>
#include <skinlayout.cdl.h>
#include <AknsDrawUtils.h>
#include <AknsUtils.h>
#include <AknUtils.h> 
#include <peninputrawkeybutton.h>
#include <peninputrepeatbutton.h>
#include <peninputcommonbutton.h>
#include "peninputrepeatbuttonex.h"
#include <AknFepGlobalEnums.h>
#include <aknfeppeninputenums.h>
#include <peninputdropdownlist.h>
#include <peninputlayoutchoicelist.h>
#include <peninputscrollablelist.h>
#include <s32mem.h>
#include <peninputlabel.h>
#include <peninputlayoutinputmodechoice.h>
#include <peninputlayoutbubblectrl.h>

#include "peninputgenericitutlayout.h"
#include "peninputgenericitutdatamgr.h"
#include "peninputgenericitutuimgrbase.h"
#include "peninputgenericitutuistatebase.h"
#include "peninputitutchnuimgr.h"
#include "peninputitutwesternuimgr.h"
#include "peninputgenericitutconverter.h"
#include "peninputgenericitutwindowmanager.h"

const TInt KChineseSpell = 100;
const TInt KWesternSpell = 101;


CGenericItutUiLayout* CGenericItutUiLayout::NewL(MLayoutOwner* aLayoutOwner,
                                                 const TAny* aInitData)
    {
    CGenericItutUiLayout* layout = new (ELeave) CGenericItutUiLayout(aLayoutOwner);

    CleanupStack::PushL(layout);
    layout->ConstructL(aInitData);
    CleanupStack::Pop(layout);

    return layout;
    }

CGenericItutUiLayout::CGenericItutUiLayout(MLayoutOwner* aLayoutOwner)
                                          :CFepUiLayout(aLayoutOwner)
    {
    }

CGenericItutUiLayout::~CGenericItutUiLayout()
    {
    delete iDataMgr;
    delete iChnUiMgr;
    delete iWesternUiMgr;
    delete iWindowMgr;
    }

void CGenericItutUiLayout::ConstructL(const TAny* aInitData)
    {
    BaseConstructL();

    TPeninputLayoutData* layoutData = (TPeninputLayoutData*)aInitData;
    
    iDataMgr = CGenericItutDataMgr::NewL(this, layoutData->iPtiEngine );
    

    SetScreenSize(TItutDataConverter::AnyToSize(iDataMgr->RequestData(EScreenSize)));

    SetRect(TItutDataConverter::AnyToRect(iDataMgr->RequestData(ELayoutRect)));
   
    // western ui mgr is default ui mgr
    iWindowMgr = CGenericItutWindowManager::NewL(this, iDataMgr);
    iDataMgr->AddSubscriber(iWindowMgr);    
    iWesternUiMgr = CWesternItutUiMgr::NewL(this, iDataMgr, iWindowMgr);
    }


void CGenericItutUiLayout::SimulateRawEvent(TInt aScanCode, TRawEvent::TType aType)
    {
    TRawEvent event; 
    event.Set(aType,aScanCode);
    
    TPtrC eventPtr(reinterpret_cast<const TUint16*>(&event),sizeof(event)/sizeof(TUint16));

    SignalOwner(ESignalSimulateEvent,eventPtr);
    }

// ---------------------------------------------------------------------------
// Simulate raw event to window server immediately.
// simulating raw event command won't be scheduled by AO 
// because it won't be added into CPeninputAnimObj::iAnimCmd.
// ---------------------------------------------------------------------------
//    
void CGenericItutUiLayout::SimulateImmeRawEvent( TInt aScanCode, TRawEvent::TType aType )
    {
    TRawEvent event; 
    event.Set(aType,aScanCode);    
    TPtrC eventPtr(reinterpret_cast<const TUint16*>(&event),sizeof(event)/sizeof(TUint16));
    SignalOwner( ESignalImmeSimulateEvent, eventPtr );   	
    }

void CGenericItutUiLayout::HandleControlEvent(TInt aEventType, 
                                              CFepUiBaseCtrl* aCtrl, 
                                              const TDesC& aEventData)
    {
    TBool handled = EFalse;

    if (UiMgr())
        {
        TRAP_IGNORE(handled = UiMgr()->HandleCtrlEventL(aEventType,
                                                        aCtrl,
                                                        aEventData));
        }

    if (handled)
        {
        return;   
        }

    TRAP_IGNORE(iWindowMgr->HandleCtrlEventL(aEventType,
                                             aCtrl,
                                             aEventData));
   }

TInt CGenericItutUiLayout::OnAppEditorTextComing(const TFepInputContextFieldData& aData)
    {
    TInt err = iWindowMgr->OnAppEditorTextComing(aData);

    if (UiMgr()->CurrentState() &&
        UiMgr()->CurrentState()->StateType() == CGenericItutUiMgrBase::EStateSpelling)
        {
        TRAP_IGNORE(UiMgr()->HandleCommandL(EItutCmdCheckIcfEmpty, NULL));
        }
 
     return err;
    }


TInt CGenericItutUiLayout::HandleCommand(TInt aCmd, TUint8* aData)
    {
    if ( KErrNone == CFepUiLayout::HandleCommand( aCmd, aData ) )
        {
        return KErrNone;
        }

    TUint* data = (TUint*) aData;

    switch(aCmd)
        {
        case ECmdPenInputLanguage:
            {
            TRAP_IGNORE(SetInputLanguageL(*data));
            }
            break;
        case ECmdPenInputRange:
        	{
        	iDataMgr->SetLatinOnly( *data );
        	}
        	break;
        case ECmdPenInputFingerInputMode:
            {
            TRAP_IGNORE(SetInputModeL(*data));
            }
            break;
        case ECmdPenInputFingerKeyPress:
        case ECmdPenInputFingerLongKeyPress:
        case EItutExtCmdCustomerState:
        case EItutExtCmdSetLayout:
        case EItutExtCmdDimKey:
        case EItutExtCmdHideKey:
        case EItutExtCmdAddKey:
        case EItutExtCmdSizeChanged:
        case EItutExtCmdSetIcfData:
        case ECmdPenInputCase:
        case ECmdPenInputFingerMatchSelection:
            {
            if (UiMgr())
                {
                TInt handled = KErrNone;
                TRAP_IGNORE(handled = UiMgr()->HandleCommandL(aCmd, aData));
                return handled;
                }
            }
            break;
        case ECmdPenInputFingerSpelling:
            {

            if ( iWesternUiMgr )
                {
                TInt handled = KErrNone;
                TRAP_IGNORE( handled = iWesternUiMgr->HandleCommandL( aCmd, aData ));
                return handled;
                }
            }
            break;
        case ECmdPenInputFingerMatchList:
            {
            if (UiMgr())
                {
                TInt handled = KErrNone;
                TRAP_IGNORE(handled = UiMgr()->HandleCommandL(aCmd, aData));
                return handled;
                }
            }
            break;
        case ECmdPenInputSetTextAlignment:
            {
            iDataMgr->SetIcfTextAlignment(*data);
            iDataMgr->SetTextAlignment();
            }
            break;
        case ECmdPenInputNoFreeSpace:
        	{
            TRAP_IGNORE(ChineseUiManager()->HandleCommandL(ECmdPenInputNoFreeSpace, NULL));
        	}
        case ECmdPenInputSetPromptText:        	
        case ECmdPenInputFingerMatchIndicator:
        case ECmdPenInputSendEditMenuData:
        case ECmdPenInputEnableSettingBtn:
        case ECmdPenInputDimArrowKeys:
        case ECmdPenInputRotation:
            {
            TRAP_IGNORE(iWindowMgr->HandleCommandL(aCmd, aData));
            }
            break;
        case ECmdPenInputIsSecretText:
            {
            TRAP_IGNORE(iWindowMgr->HandleCommandL(aCmd, aData));
            *data ? iIsSecret = ETrue: iIsSecret = EFalse;             
             if (UiMgr())
                {
                TInt handled = KErrNone;
                TRAP_IGNORE(handled = UiMgr()->HandleCommandL(aCmd, aData));
                return handled;
                }
            }
        break;
        case ECmdPenInputEnableIndicatorButton:
            {
            TRAP_IGNORE(iWindowMgr->HandleCommandL(aCmd, aData));
            } 
        break;
        case ECmdPenInputSymbolOfHardKeyOne:
        case ECmdPenInputInEditWordQueryDlg:
            {
            TRAP_IGNORE(iWindowMgr->HandleCommandL(aCmd, aData));
            }
            break;
        case ECmdPenInputIsNumberGrouping:
            {
            TRAP_IGNORE(iWindowMgr->HandleCommandL(aCmd, aData));
            }
            break;
        case ECmdPenInputEditorNumericKeyMap:
        	{
        	iDataMgr->SetNumericKeymap( *data );
        	}
            break;
        case ECmdPenInputEditorCustomNumericKeyMap:
        	{
        	iDataMgr->SetNumericKeymapData( (TInt*) data );
        	}
        	break;
        case ECmdPenInputPermittedRange:
        	{
        	iDataMgr->SetNumericOnly( *data );
        	}
        	break;
        case ECmdPenInputCharacterPreview:
            {
            iWindowMgr->ShowBubble(*aData);    
            }
            break;
        case ECmdPeninputSpellLanguageMode:
        	{
            if ( *data == KChineseSpell )
            	{
				iDataMgr->SetChineseSpellFlag( ETrue );
				return KErrNone;
            	}
            
            if ( *data == KWesternSpell )
            	{
				iDataMgr->SetChineseSpellFlag( EFalse );
				return KErrNone;
            	}
        	}
        	break;
        case ECmdPeninputSpellICFDisplayContent:
        	{
        	TRAP_IGNORE( iWindowMgr->HandleCommandL( aCmd, aData ));
        	}
        	break;
        default:
            break;
        }

    return KErrNone;
    }

TInt CGenericItutUiLayout::PenInputType()
    {
    return EPluginInputModeItut;
    }

TInt CGenericItutUiLayout::SizeChanged(const TAny* /*pData*/)
    {

    // For avoiding that NULL pointer is called
    // add UiMgr() and CurrentState() condition
    if( !( UiMgr() && UiMgr()->CurrentState()))
        {
        return KErrBadHandle;
        }

    TBool overLap = UiMgr()->CurrentState()->StateType() 
        == CGenericItutUiMgrBase::EStateMatchSelection ? ETrue: EFalse;
        
    iDataMgr->ReadLafInfo();

    // set layout rect
    SetRect(TItutDataConverter::AnyToRect(iDataMgr->RequestData(ELayoutRect)));
        
    iWindowMgr->SizeChanged(overLap);

    return KErrNone;    
    }

void CGenericItutUiLayout::SubmitText(const TDesC& aEventData)
    {
    SignalOwner(ESignalKeyEvent, aEventData);
    }

TInt CGenericItutUiLayout::OnSkinChange()
    {
    CFepUiLayout::OnSkinChange();
    
    TInt err = iWindowMgr->OnSkinChange();

    return err;
    }


TBool CGenericItutUiLayout::PressOnCtrls(TPoint aPt)
    {
    const RPointerArray<CFepUiBaseCtrl>& ctrllist = RootControl()->ControlList();

    for (TInt i = 0; i < ctrllist.Count(); i++)
        {
        if (!ctrllist[i]->Hiden() && ctrllist[i]->Rect().Contains(aPt))
            {
            return ETrue;
            }
        }

    return EFalse;    
    }

CGenericItutUiMgrBase* CGenericItutUiLayout::UiMgr()
    {
    if (iDataMgr->IsChinese())
       {
       iCurrentUiMgr = ChineseUiManager();
       }
    else
       {
       iCurrentUiMgr = iWesternUiMgr;
       }

    return iCurrentUiMgr;        
    }
    
void CGenericItutUiLayout::SetInputModeL(TInt aMode)
    {
	// Input mode can not be set to EnativeNumber in Thai
    TInt inputLanguage = iDataMgr->InputLanguage();
    if ( aMode ==  ENativeNumber && inputLanguage == ELangThai )
        {
        aMode = ENumber;
        }
    
    TBool numericOnlyChanged = iDataMgr->IsCharFlagChanged() ? ETrue : EFalse;
    //only number mode need judge it

    //  both EStrokeFind and EStroke will be stored as Estroke  ///// 
    if ( aMode != iDataMgr->InputMode() || 
        aMode == EStroke || aMode == EStrokeFind || 
        aMode == EZhuyin || aMode == EZhuyinFind || 
        numericOnlyChanged )
        {
        // deactivate original uimgr first
        if (iCurrentUiMgr 
            && iCurrentUiMgr->CurrentState()
            && iCurrentUiMgr->CurrentState()->StateType() != CGenericItutUiMgrBase::EStateSpelling)
            {
            iCurrentUiMgr->DeactivateUI();
            }

        iDataMgr->SetInputModeL(aMode);

        UiMgr()->ActivateUiL();
        }
    }

void CGenericItutUiLayout::SetInputLanguageL(TInt aLanguage)
    {
    TInt previousLang = iDataMgr->InputLanguage();
    iDataMgr->SetLanguageL(aLanguage);
    iWindowMgr->SetLanguageL(aLanguage);
    
    if (previousLang != aLanguage)
        {
        // When state is spelling, don¡¯t apply LAF Data   
        if(iCurrentUiMgr 
           && iCurrentUiMgr->CurrentState()
           && iCurrentUiMgr->CurrentState()->StateType() == CGenericItutUiMgrBase::EStateSpelling) 
            {
        	return;
            }
        //

        ApplyVariantLafDataL();   
        }
    }

void CGenericItutUiLayout::OnDeActivate()
    {
    TRAP_IGNORE(UiMgr()->HandleCommandL(ECmdPenInputDeActive, NULL));

    CFepUiLayout::OnDeActivate();
    }
void CGenericItutUiLayout::OnActivate()
    {
    CFepUiLayout::OnActivate();
     
    iWindowMgr->OnActivate();
    }

CFepUiLayout* CGenericItutUiLayout::UiLayout()
    {
    return this;
    }

   
void CGenericItutUiLayout::EnterMatchSelectionState(TBool aOn)
    {
    TBuf<4> buf;
    buf.Append(reinterpret_cast<TText*>(&aOn), sizeof(TBool)/sizeof(TText));
    SignalOwner(ESignalEnterMatchSelection, buf);
    }

void CGenericItutUiLayout::HandleAppInfoChange(const TDesC& aInfo, 
                                               TPeninputAppInfo aType)
    {
    if ( aType == EAppIndicatorMsg )
        {
        TRAP_IGNORE(iWindowMgr->HandleAppInfoChangeL(aInfo));
        }
    /* Teleca change begin, 19.05.2009 ssal */    
    if ( aType == EAppByteWarningMsg || aType == EAppMessageTypeChangeMsg)
        {
        TRAP_IGNORE(iWindowMgr->DisplayWarningNote(aInfo));
        } 
    /* Teleca change end, 19.05.2009 ssal */       
    }
    
void CGenericItutUiLayout::ShowArrowBtn(TInt aShowFlag)
    {
    iWindowMgr->ShowArrowBtn(aShowFlag);    
    }
    
void CGenericItutUiLayout::ApplyVariantLafDataL(TBool aResolutionChange)
    {
    iWindowMgr->ApplyVariantLafDataL(aResolutionChange);
    }
    
CGenericItutWindowManager* CGenericItutUiLayout::UiManager()
    {
    return iWindowMgr;   
    }

CFepUiBaseCtrl* CGenericItutUiLayout::Control(TInt aCtrlId)
    {
    return iWindowMgr->Control(aCtrlId); 
    }

CGenericItutUiMgrBase* CGenericItutUiLayout::ChineseUiManager()
    {
    if (!iChnUiMgr)
        {
        TRAP_IGNORE( iChnUiMgr = CChnItutUiMgr::NewL(this, iDataMgr, iWindowMgr) );
        }
        
    return iChnUiMgr;
        
    }
    
// End Of File
