/*
* 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 <peninputlayoutchoicelist.h>

#include "peninputgenericitutwindowmanager.h"
#include "peninputgenericitutwindow.h"
#include "peninputgenericitutdatamgr.h"
#include "peninputgenericitutuimgrbase.h"
#include "peninputgenericitutuistatebase.h"
#include "peninputgenericitutconverter.h"

_LIT(KEmptyString, "");
const TInt KPeriodicTimerIntervalSec(2500000);
/* Teleca change end, 18.05.2009 ssal */

const TInt KSCTPreventTime = 1000 * 1000;

TInt PreventSCTTimerCallback( TAny* aData )
	{
	CGenericItutWindowManager* windowMgr = 
			static_cast<CGenericItutWindowManager*>( aData );
	windowMgr->SetAllowHandleRawKeyEventFlag( ETrue );
	windowMgr->StopPreventSCTTimer();
	return 0;
	}

CGenericItutWindowManager* CGenericItutWindowManager::NewL(CGenericItutUiLayout* aLayoutOwner,
                                                           CGenericItutDataMgr* aDataMgr)
    {
    CGenericItutWindowManager* layout = new (ELeave) 
                                                CGenericItutWindowManager(aLayoutOwner,aDataMgr);
    CleanupStack::PushL(layout);
    layout->ConstructL();
    CleanupStack::Pop(layout);
    return layout;
    }

CGenericItutWindowManager::CGenericItutWindowManager(CGenericItutUiLayout* aLayoutOwner,
                                                     CGenericItutDataMgr* aDataMgr)
                                          :iLayoutOwner(aLayoutOwner),
                                           iDataMgr(aDataMgr),
                                           iLastRawKeyDown(EStdKeyNull),
                                           iAllowHandleRawKeyEvent( ETrue ),
                                           iPreventCSTTimer( NULL )
                                           
    {
    iInEditWordQueryDlg = EFalse;
    }

CGenericItutWindowManager::~CGenericItutWindowManager()
    {
    delete iWindow;
    /* Teleca change begin, 18.05.2009 ssal */
    if (iInfoTimer)
    	{
    	iInfoTimer->Cancel();
    	}
   	delete iInfoTimer;
    /* Teleca change end, 18.05.2009 ssal */
   	
	iPreventCSTTimer->Cancel();
	delete iPreventCSTTimer;
    }

void CGenericItutWindowManager::SetPropertyL(MItutPropertySubscriber::TItutProperty aPropertyName, 
                                        const TDesC& aPropertyValue)
    {
    iWindow->SetPropertyL(aPropertyName, aPropertyValue);
    
    }

void CGenericItutWindowManager::ConstructL()
    {
    iWindow = CGenericItutWindow::NewL(this, iLayoutOwner,iDataMgr);
    /* Teleca change begin, 18.05.2009 ssal */
    iInfoTimer = CPeriodic::NewL(CActive::EPriorityStandard);
    /* Teleca change end, 18.05.2009 ssal */
    
    iPreventCSTTimer = CPeriodic::NewL( CActive::EPriorityStandard );
    }

void CGenericItutWindowManager::SimulateRawEvent(TInt aScanCode, TRawEvent::TType aType)
    {
    iLayoutOwner->SimulateRawEvent(aScanCode, aType);
    }

// ---------------------------------------------------------------------------
// 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 CGenericItutWindowManager::SimulateImmeRawEvent( TInt aScanCode, TRawEvent::TType aType )
	{
	iLayoutOwner->SimulateImmeRawEvent(aScanCode, aType );
	}

void CGenericItutWindowManager::ShowInputModeSwitchL()
    {
    iWindow->DisplayInputmodeSwitchL();   
    }
                
void CGenericItutWindowManager::HandleCtrlEventL(TInt aEventType, 
                                                 CFepUiBaseCtrl* aCtrl, 
                                                 const TDesC& aEventData)
    {
    switch(aEventType)
        {
        case EEventRawKeyDownEvent:
            {
            if ( iAllowHandleRawKeyEvent )
            	{
				const TKeyEvent *key = reinterpret_cast<const TKeyEvent*>(aEventData.Ptr());
				SimulateRawEvent(key->iScanCode,TRawEvent::EKeyDown);
				SetLastRawKeyDown(key->iScanCode, ETrue, aCtrl);
            	}
            }
            break;
        case EEventRawKeyUpEvent:
            {
            if ( iAllowHandleRawKeyEvent )
            	{
				const TKeyEvent *key = reinterpret_cast<const TKeyEvent*>(aEventData.Ptr());
				SimulateRawEvent(key->iScanCode,TRawEvent::EKeyUp);
				SetLastRawKeyDown(key->iScanCode, EFalse, aCtrl);
            	}
            }
            break;
        case EItutCmdEnterSpellMode:
            {
            StartPreventSCTTimer();
            iLayoutOwner->SignalOwner(ESignalEnterSpellMode);
            }
            break;        
        case EEventButtonUp:
            {
            if ( iAllowHandleRawKeyEvent )
            	{
				//from pen input switch button
				if (aCtrl->ControlId() == ECtrlIdSwitch)
					{
					TRAP_IGNORE( iWindow->Icf()->UpdateSecretTextL() );
					ShowInputModeSwitchL();
					}
				else if (aCtrl->ControlId() == ECtrlIdArrowUp)
					{
					TRAP_IGNORE(iWindow->Icf()->HandleArrowBtnEventL(
															  CFepLayoutMultiLineIcf::EArrowUp));
					}
				else if (aCtrl->ControlId() == ECtrlIdArrowDown)
					{
					TRAP_IGNORE(iWindow->Icf()->HandleArrowBtnEventL(
															  CFepLayoutMultiLineIcf::EArrowDown));
					}
				else if (aCtrl->ControlId() == ECtrlIdClose)
					{
					iLayoutOwner->SignalOwner(ESignalLayoutClosed);
					}
				else if (aCtrl->ControlId() == ECtrlIdOptions)
					{
					iLayoutOwner->SignalOwner(ESignalLaunchOptionsMenu);
	//                static_cast<CAknFepCtrlCommonButton*>(aCtrl)->SetDimmed(ETrue);
					}
				else if (aCtrl->ControlId() == ECtrlIdIndicator)
					{
					iLayoutOwner->SignalOwner(ESignalGetEditMenuData);
					}
            	}
            }
            break;
        case EItutCmdArrowUp:
            {
            if (aCtrl->ControlId() == ECtrlIdArrowUp)
                {
                TRAP_IGNORE(iWindow->Icf()->HandleArrowBtnEventL(
                                                          CFepLayoutMultiLineIcf::EArrowUp));
                }
            }
            break;
        case EItutCmdArrowDown:
            {
            if (aCtrl->ControlId() == ECtrlIdArrowDown)
                {
                TRAP_IGNORE(iWindow->Icf()->HandleArrowBtnEventL(
                                                          CFepLayoutMultiLineIcf::EArrowDown));
                }
            }
            break;
        case EEventChoiceSelected:
            {
            CFepLayoutChoiceList::SEvent* event = 
                (CFepLayoutChoiceList::SEvent*)aEventData.Ptr();
                
            if (aCtrl->ControlId() == ECtrlIdInputSwitch)
                {
                if (event->iIndex == -1)
                    {
                    iWindow->InputModeSwitch()->CloseWindow();
                    break;
                    }

                if (EPluginInputModeItut != event->iCommand)
                    {
                    TBool switchByMode = ETrue;
                    TInt  mode = event->iCommand;

                    TBuf<8> buf;
                    buf.Append(reinterpret_cast<TText*>(&switchByMode), 
                               sizeof(TBool)/sizeof(TText));
                    buf.Append(reinterpret_cast<TText*>(&mode), 
                               sizeof(TInt)/sizeof(TText));
                    iLayoutOwner->SignalOwner(ESignalLayoutUIChanged,buf);
                    }
                }
            else if (aCtrl->ControlId() == ECtrlIdMatchSelection)
                {
                if (event->iCommand == EItutCmdPredictItemSelected)
                    ReportItemSelected(ESignalSelectMatchSelectionText, event->iIndex, ETrue);
                else if (event->iCommand == EItutCmdEnterSpellMode)
                	{
					StartPreventSCTTimer();
                    iLayoutOwner->SignalOwner(ESignalEnterSpellMode);
                	}
                }
            else if (aCtrl->ControlId() == ECtrlIdEditorMenu)
                {
                if (event->iIndex == -1)
                    {
                    iWindow->EditorMenu()->CloseWindow();
                    break;
                    }
                else
                    {                        
                    TInt command = event->iCommand;
                    TBuf<8> buf;
                    buf.Append(reinterpret_cast<TText*>(&command), sizeof(TInt)/sizeof(TText));
                    iLayoutOwner->SignalOwner(ESignalEditorMenuCommand,buf);
                    }
                }                
            }
            break;
        case EEventCapturePointer:
            {
            if (iRawKeyDown)
                {
                SimulateRawEvent(iLastRawKeyDown, TRawEvent::EKeyUp);
                iRawKeyCtrl->CancelPointerDownL();
                SetLastRawKeyDown(iLastRawKeyDown, EFalse, NULL);
                }
            }
            break;
        default:
            break;
        };
    }

TInt CGenericItutWindowManager::OnAppEditorTextComing(const TFepInputContextFieldData& aData)
    {
    TRAPD(err, iWindow->Icf()->SetTextL(aData));

    if (!iWindow->MatchSelection()->Hiden())
        {
        iWindow->MatchSelection()->Draw();
        }
    
    return err;
    }

void CGenericItutWindowManager::SetPromptTextL(TUint8* aData)
    {
    iWindow->SetPromptTextL(aData);
    }

TBool CGenericItutWindowManager::HandleCommandL(TInt aCmd, TUint8* aData)
    {
    TBool handle = EFalse;
    TInt* data = (TInt*) aData;
    switch (aCmd)
        {
        case ECmdPenInputIsSecretText:
            {
            iWindow->Icf()->SetTextIsSecret(*aData);
            CPeninputLayoutInputmodelChoice* choice = 
                iWindow->InputModeSwitch();
            if ( choice )
                {
                choice->SetSecretEditor(*aData);
                }
            }
            break;
        case ECmdPenInputIsNumberGrouping:
            {
            iWindow->Icf()->SetNumberGrouping(*aData);
            }
            break;
        case ECmdPenInputDimArrowKeys:
            {
            TBool IsDimArrowKeys = *aData;
            DimArrowKeys( IsDimArrowKeys );
            }
            break;
        case ECmdPenInputFingerMatchIndicator:
            {
            if ( iDataMgr->IsPortraitWest() && ( !iDataMgr->IsChineseSpellMode()))
                {
                iWindow->UpdateIndiBubbleL( aData );
                }
            else
                {
                UpdateIndicatorL( aData );
                }
            handle = ETrue;
            }
            break;
        case ECmdPenInputSetPromptText:
            {
            SetPromptTextL(aData);
            handle = ETrue;
            }
            break;
        case ECmdPenInputSendEditMenuData:
            {
            // Show menu command list
            iWindow->ShowEditorMenuL(data);
            }
            break;
        case ECmdPenInputEnableSettingBtn:
            {
            CAknFepCtrlCommonButton * optionsbtn;
            TBool enable = *data;            
            optionsbtn = static_cast<CAknFepCtrlCommonButton *>(iWindow->Control(ECtrlIdOptions));
            if(optionsbtn && !enable)
                {
                optionsbtn->SetDimmed(ETrue);
                handle = ETrue;
                iDimOperationBtn = ETrue;
                }
            else if(optionsbtn && enable)
                {
                optionsbtn->SetDimmed(EFalse);
                handle = ETrue;
                iDimOperationBtn = EFalse;
                }
            break;
            }

        case ECmdPenInputEnableIndicatorButton:
            {
            if ( NULL != static_cast<CAknFepCtrlCommonButton*>(Control(ECtrlIdIndicator)))
                {
                if (*data)
                    {
                    static_cast<CAknFepCtrlCommonButton*>(
                                                  Control(ECtrlIdIndicator))->SetDimmed(EFalse);
                    }
                else
                    {
                    static_cast<CAknFepCtrlCommonButton*>(
                                                  Control(ECtrlIdIndicator))->SetDimmed(ETrue);
                    }
                }
            }
        break;
        case ECmdPenInputSymbolOfHardKeyOne:
            {
            iWindow->SetHardKeyOneSymbol(aData);
            handle = ETrue;
            }
            break;
        case ECmdPenInputRotation:
            {
            if (iWindow->InputModeSwitch())
                {
                iWindow->InputModeSwitch()->CloseWindow();    
                }
            
            if (iWindow->EditorMenu()) 
                {
                iWindow->EditorMenu()->CloseWindow();    
                }
            }
        break;

        case ECmdPenInputInEditWordQueryDlg:
            {
            iInEditWordQueryDlg = *data;
            }
            break;
        case ECmdPeninputSpellICFDisplayContent:
        	{
        	iWindow->SetSpellDisplayContentL( aData );
        	handle = ETrue;
        	}
        	break;
        default:
        break;
            
        };
    return handle;
    }


TInt CGenericItutWindowManager::SizeChanged(TBool aIcfOverlap)
    {
    return iWindow->SizeChanged(aIcfOverlap);
    }

void CGenericItutWindowManager::SubmitText(const TDesC& aEventData)
    {
    iLayoutOwner->SignalOwner(ESignalKeyEvent, aEventData);
    }

TInt CGenericItutWindowManager::OnSkinChange()
    {
    TRAPD(err,
          iWindow->ConstructSpellCtrlFromResourceL(); 
          iWindow->ConstructItutKeypadFromResourceL(iWindow->ItutKeypad()->ResourceId());
          iWindow->ConstructIcfFromResourceL());
   
    iWindow->OnSkinChange();
    return err;
    }

void CGenericItutWindowManager::ShowArrowBtn(TInt aShowFlag)
    {
    iWindow->Control(ECtrlIdArrowLeft)->Hide(!(EBtnArrowLeft & aShowFlag));
    iWindow->Control(ECtrlIdArrowRight)->Hide(!(EBtnArrowRight & aShowFlag));
    iWindow->Control(ECtrlIdArrowUp)->Hide(!(EBtnArrowUp & aShowFlag));
    iWindow->Control(ECtrlIdArrowDown)->Hide(!(EBtnArrowDown & aShowFlag));
    }
    
CFepUiLayout* CGenericItutWindowManager::UiLayout()
    {
    return iLayoutOwner;
    }
    
void CGenericItutWindowManager::HandleAppInfoChangeL(const TDesC& aInfo)
    {
    CGenericItutUiLayout * itutLayoutOwner;
    itutLayoutOwner = static_cast<CGenericItutUiLayout *>(UiLayout());
    if ( aInfo.Length() > 0 && 
         itutLayoutOwner->UiMgr()->CurrentState() &&
         itutLayoutOwner->UiMgr()->CurrentState()->StateType() !=
            CGenericItutUiMgrBase::EStateSpelling && 
         !iInEditWordQueryDlg)
        {
        if ( iDataMgr->IsPortraitWest() && (!iDataMgr->IsChineseSpellMode()))
            {
                  //iWindow->Icf()->HideBubble();
            iWindow->SetIndiWithTextFlag( ETrue );
            iWindow->IndiBubbleWithText();
            }
        else
            {
                  //iWindow->Icf()->HideBubble();
                  iWindow->MsgBubbleForChinese();
            }
        iWindow->Icf()->ShowBubble(aInfo,iWindow->Icf()->MsgBubbleCtrl()->Rect());
        }
    else
        {
        if ((!iDataMgr->IsPortraitWest()) || iDataMgr->IsChineseSpellMode())
            {
            iWindow->Icf()->HideBubble();
            }
        else
            {
                  if ( itutLayoutOwner->UiMgr()->CurrentState() &&
                       itutLayoutOwner->UiMgr()->CurrentState()->StateType() !=
                              CGenericItutUiMgrBase::EStateSpelling )
                        {
                        //iWindow->Icf()->HideBubble();
                        iWindow->SetIndiWithTextFlag( EFalse );
                        iWindow->IndiBubbleWithoutText();
                        }
            
            iWindow->Icf()->ShowBubble( KEmptyString, 
                    iWindow->Icf()->MsgBubbleCtrl()->Rect());
            }
        }
    }

/* Teleca change begin, 19.05.2009 ssal */
void CGenericItutWindowManager::DisplayWarningNote(const TDesC& aInfo)
    {
	if (!iInfoTimer->IsActive())
		{
		iInfoTimer->Start(KPeriodicTimerIntervalSec,
                          KPeriodicTimerIntervalSec, 
                          TCallBack(CGenericItutWindowManager::HideByteWarningBubble, this));
		}	                                       
    iWindow->Icf()->ShowByteWarningBubble(aInfo);
    }
/* Teleca change end, 19.05.2009 ssal */
void CGenericItutWindowManager::ApplyVariantLafDataL(TBool aResolutionChange)
    {
    iWindow->ApplyVariantLafDataL(aResolutionChange);
    }

void CGenericItutWindowManager::CreateChineseSpecificCtrlsIfNeededL()
    {
    iWindow->CreateChineseSpecificCtrlsIfNeededL();   
    }
    
void CGenericItutWindowManager::SetLanguageL(TInt aLanguage)
    {
    iWindow->Icf()->SetLanguageId(aLanguage);    
    }
    
void CGenericItutWindowManager::SetLastRawKeyDown(TInt aScanCode,  TBool aKeyDown, 
                                                  CFepUiBaseCtrl* aCtrl)
    {
    !aKeyDown ? iLastRawKeyDown = EStdKeyNull : iLastRawKeyDown = aScanCode;
    iRawKeyDown = aKeyDown;
    iRawKeyCtrl = aCtrl;
    } 
    
void CGenericItutWindowManager::ResetIndicatorL(CFepUiBaseCtrl* aIndicator)
	{
    iWindow->SetIndicatorImageL(aIndicator, 
                       iDataMgr->IndicatorData().iIndicatorImgID,
                       iDataMgr->IndicatorData().iIndicatorMaskID,
                       iDataMgr->IndicatorData().iIndicatorTextImgID,
                       iDataMgr->IndicatorData().iIndicatorTextMaskID);
	}

void CGenericItutWindowManager::UpdateIndicatorL(TUint8* aData)
    {
    iWindow->UpdateIndicatorL(aData);
    }

void CGenericItutWindowManager::ReportItemSelected(TInt aCmdId, TInt aIdx, TBool aCommit)
    {
    TBuf<8> buf;
    buf.Append(reinterpret_cast<TText*>(&aIdx), sizeof(TInt)/sizeof(TText));
    buf.Append(reinterpret_cast<TText*>(&aCommit), sizeof(TBool)/sizeof(TText));

    iLayoutOwner->SignalOwner(aCmdId, buf);
    }
    
CFepUiBaseCtrl* CGenericItutWindowManager::Control(TInt aCtrlId)  
    {
    return iWindow->Control(aCtrlId);   
    }

void CGenericItutWindowManager::OnActivate()
    {
    //static_cast<CAknFepCtrlCommonButton*>(Control(ECtrlIdOptions))->SetDimmed(EFalse);
    if (iDimOperationBtn)
        {
        static_cast<CAknFepCtrlCommonButton*>(Control(ECtrlIdOptions))->SetDimmed(ETrue);    
        }
    else
        {
        static_cast<CAknFepCtrlCommonButton*>(Control(ECtrlIdOptions))->SetDimmed(EFalse);      
        }
    }
void CGenericItutWindowManager::DimArrowKeys( TBool aDimArrow )
    {
    if (iDataMgr->IsChinese())
        {
        CAknFepCtrlRawKeyButton * leftbtn;
        CAknFepCtrlRawKeyButton * rightbtn;
        CAknFepCtrlRawKeyButton * upbtn;
        CAknFepCtrlRawKeyButton * downbtn;
        leftbtn = static_cast<CAknFepCtrlRawKeyButton *>(iWindow->Control(ECtrlIdArrowLeft));
        rightbtn = static_cast<CAknFepCtrlRawKeyButton *>(iWindow->Control(ECtrlIdArrowRight));
        upbtn = static_cast<CAknFepCtrlRawKeyButton *>(iWindow->Control(ECtrlIdArrowUp));
        downbtn = static_cast<CAknFepCtrlRawKeyButton *>(iWindow->Control(ECtrlIdArrowDown));

        leftbtn->SetDimmed(aDimArrow);   
        rightbtn->SetDimmed(aDimArrow);   
        upbtn->SetDimmed(aDimArrow);   
        downbtn->SetDimmed(aDimArrow);   

        }
    else
        {
        CAknFepCtrlRawKeyButton * leftbtn;
        CAknFepCtrlRawKeyButton * rightbtn;
        leftbtn = static_cast<CAknFepCtrlRawKeyButton *>(iWindow->Control(ECtrlIdArrowLeft));
        rightbtn = static_cast<CAknFepCtrlRawKeyButton *>(iWindow->Control(ECtrlIdArrowRight));

        leftbtn->SetDimmed(aDimArrow);   
        rightbtn->SetDimmed(aDimArrow);   
        }                
    }
    
void CGenericItutWindowManager::ShowBubble(TInt aShow)
    {
    CFepCtrlDropdownList* spell = 
        static_cast<CFepCtrlDropdownList*>(iWindow->Control(ECtrlIdSpellCandsList));
    CFepCtrlDropdownList* standard = 
        static_cast<CFepCtrlDropdownList*>(iWindow->Control(ECtrlIdStdCandsList));
    CFepCtrlDropdownList* punctuation = 
        static_cast<CFepCtrlDropdownList*>(iWindow->Control(ECtrlIdPuncCandsList));
    
    if (aShow > 0)
        {
    	TRect outrect,innerrect;
    	outrect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(EPreviewBubbleRect));  
    	innerrect = TItutDataConverter::AnyToRect(iDataMgr->RequestData(EPreviewBubbleInnerRect));
        TAknTextLineLayout bubbleTextLayout = 
            TItutDataConverter::AnyToTextLine(iDataMgr->RequestData(EPreviewBubbleTextlayout));
        CFont* bubbleFont = TItutDataConverter::AnyToFont(iDataMgr->RequestData(EPreviewBubbleFont));
        
        if( spell )
            {
            spell->ShowBubble(ETrue);
            spell->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); 	
         	
        	spell->SetTextFormat(bubbleTextLayout);
        	spell->SetBubbleTextFont(bubbleFont);
        	spell->SetBubbleSize(TSize(outrect.Width(),outrect.Height()));  // Read laf
        	spell->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX,
        	               innerrect.iTl.iY - outrect.iTl.iY,
        	               outrect.iBr.iX - innerrect.iBr.iX,
        	               outrect.iBr.iY - innerrect.iBr.iY);
            }
        
        if( standard )
            {
            standard->ShowBubble(ETrue);
            standard->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); 	
         	
        	standard->SetTextFormat(bubbleTextLayout);
        	standard->SetBubbleTextFont(bubbleFont);
        	standard->SetBubbleSize(TSize(outrect.Width(),outrect.Height()));  // Read laf
        	standard->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX,
        	               innerrect.iTl.iY - outrect.iTl.iY,
        	               outrect.iBr.iX - innerrect.iBr.iX,
        	               outrect.iBr.iY - innerrect.iBr.iY);
            }
    
        if ( punctuation )
            {
            punctuation->ShowBubble(ETrue);
            punctuation->SetBubbleBitmapParam(NULL,NULL,KAknsIIDQsnFrInputCharPreview); 	
         	
        	punctuation->SetTextFormat(bubbleTextLayout);
        	punctuation->SetBubbleTextFont(bubbleFont);
        	punctuation->SetBubbleSize(TSize(outrect.Width(),outrect.Height()));  // Read laf
        	punctuation->SetFrameDiff(innerrect.iTl.iX - outrect.iTl.iX,
        	               innerrect.iTl.iY - outrect.iTl.iY,
        	               outrect.iBr.iX - innerrect.iBr.iX,
        	               outrect.iBr.iY - innerrect.iBr.iY);
            }
        }
    else
        {
        if( spell )
            {
            spell->ShowBubble(EFalse);
            }
        if( standard )
            {
            standard->ShowBubble(EFalse);
            }
        if ( punctuation )
            {
            punctuation->ShowBubble(EFalse);
            }
        }
    }    
/* Teleca change begin, 18.05.2009 ssal */
TInt CGenericItutWindowManager::HideByteWarningBubble(TAny* aPointer)
    {
    CGenericItutWindowManager* manager = static_cast<CGenericItutWindowManager*>(aPointer);
    manager->HideByteWarningBubble();
    return KErrNone;
    }
       
TBool CGenericItutWindowManager::IsAllowHandleRawKeyEvent()
	{
	return iAllowHandleRawKeyEvent;
	}

void CGenericItutWindowManager::SetAllowHandleRawKeyEventFlag( TBool aFlag )
	{
	iAllowHandleRawKeyEvent = aFlag;
	}

void CGenericItutWindowManager::StartPreventSCTTimer()
	{
	iAllowHandleRawKeyEvent =  EFalse;
	
	TTimeIntervalMicroSeconds32 t = KSCTPreventTime;
	iPreventCSTTimer->Start( t, t, 
			TCallBack(PreventSCTTimerCallback, this));
	}

void CGenericItutWindowManager::StopPreventSCTTimer()
	{
	iPreventCSTTimer->Cancel();
	}

void CGenericItutWindowManager::HideByteWarningBubble()
    {
    if (!iInfoTimer)
        {
        return;
        }
        
    if (iInfoTimer->IsActive())
        {
        iInfoTimer->Cancel();
        iWindow->Icf()->HideInfoBubble();
        }
    }    

void CGenericItutWindowManager::CreateKoreanSpecificCtrlsIfNeededL()
    {
    iWindow->CreateKoreanSpecificCtrlsIfNeededL();
    }
// End Of File
