diff -r 000000000000 -r eb1f2e154e89 textinput/peninputhwrfscn/src/peninputhwrfscnlayout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputhwrfscn/src/peninputhwrfscnlayout.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,716 @@ +/* +* Copyright (c) 2005-2006 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 for chinese peninput full screen hwr +* +*/ + +//SYSTEM INCLUDES +#include +#include + +//FEP Includes +#include +#include +#include + +//USER INCLUDES +#include "peninputhwrfscncandidatepanel.h" +#include "peninputhwrfscncontrolbar.h" +#include "peninputhwrfscndatastore.h" +#include "peninputhwrfscnstatemanager.h" +#include "peninputhwrfscnwritingbox.h" +#include "peninputhwrfscnevent.h" +#include "peninputhwrfscnlayout.h" + +//CONST DEFINATION +_LIT( KFSHWRRssFile, "\\resource\\peninputhwrfscreencn.rsc" ); +const TUint8 KTempBufSize = 8; +const TUint8 KIntLen = sizeof( TInt )/2; +const TUint8 KIntSize = sizeof( TInt ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::NewL() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnLayout* CPeninputHwrfscnLayout::NewL( + MLayoutOwner* aLayoutOwner, const TAny* aInitData ) + { + CPeninputHwrfscnLayout* self = new( ELeave ) + CPeninputHwrfscnLayout( aLayoutOwner ); + CleanupStack::PushL( self ); + self->ConstructL( aInitData ); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::CPeninputHwrfscnLayout() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnLayout::CPeninputHwrfscnLayout( MLayoutOwner* aLayoutOwner ) + :CPenInputFullScreenLayoutBase( aLayoutOwner ) + { + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::~CPeninputHwrfscnLayout() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnLayout::~CPeninputHwrfscnLayout() + { + CCoeEnv::Static()->DeleteResourceFile( iResId ); + + delete iDataStore; + delete iStateMgr; + delete iFsHwrBox; + delete iCandidatePanel; + delete iControlBar; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::ConstructL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::ConstructL( const TAny* aInitData ) + { + BaseConstructL(); + //load resource + TFileName resFileName( KFSHWRRssFile ); + CCoeEnv* coeEnv = CCoeEnv::Static(); + BaflUtils::NearestLanguageFile( coeEnv->FsSession(), resFileName ); + iResId = coeEnv->AddResourceFileL( resFileName ); + + //initialze the data store + TPeninputLayoutData* layoutData = (TPeninputLayoutData*)aInitData; + + iDataStore = CPeninputHwrfscnDataStore::NewL( (*layoutData).iPtiEngine); + + //create state manager + CreateStateManagerL(); + + //create the transparent window + CreateHwrWindowL(); + + //create the candidate panel + CreateCandidatePanelL(); + + //create the control panel + CreateControlBarL(); + + //set screen layout extent + SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::OnDeActivate() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::OnDeActivate() + { + //CFepUiLayout::OnDeActivate(); + CPenInputFullScreenLayoutBase::OnDeActivate(); + iFsHwrBox->CancelCharWriting(); + TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::CreateControlBarL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::CreateControlBarL() + { + iControlBar = CPeninputHwrfscnControlBar::NewL( this ); + iControlBar->AddEventObserver( this ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::CreateCandidatePanelL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::CreateCandidatePanelL() + { + iCandidatePanel = CPeninputHwrfscnCandidatePanel::NewL( this ); + iCandidatePanel->AddEventObserver( this ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::CreateHwrWindowL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::CreateHwrWindowL() + { + iFsHwrBox = CPeninputHwrfscnWritingBox::NewL( this ); + iFsHwrBox->AddEventObserver( this ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::CreateStateManagerL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::CreateStateManagerL() + { + iStateMgr = CPeninputHwrfscnStateManager::NewL( this ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::HandleCommand() +// handle the command from Fep +// ----------------------------------------------------------------------------- +// +TInt CPeninputHwrfscnLayout::HandleCommand( TInt aCmd, TUint8* aData ) + { + if( CFepUiLayout::HandleCommand( aCmd, aData ) == KErrNone ) + { + return KErrNone; + } + + TInt ret = KErrUnknown; + switch( aCmd ) + { + case ECmdPenInputEditorNumericKeyMap: + { + iDataStore->SetNumberMode( *( TAknEditorNumericKeymap* )aData ); + + ret = KErrNone; + } + break; + + case ECmdPenInputPermittedRange: + { + TInt ranges = *( TInt* )aData; + iDataStore->SetPermittedRanges( ranges ); + + ret = KErrNone; + } + break; + + case ECmdPenInputLanguage: + { + TInt language = *( TInt* )aData; + TRAP_IGNORE( iDataStore->SetLanguageL( language ) ); + + ret = KErrNone; + } + break; + + case ECmdPenInputRange: + { + TInt range = *( TInt* )aData; + iDataStore->SetPrimaryRange( range ); + + TBuf buf; + buf.Append( reinterpret_cast( aData ), KIntLen ); + + SignalOwner( ESignalRange, buf ); + + ret = KErrNone; + } + break; + + case ECmdPenInputPermittedCase: + { + TInt cs = *( TInt* )aData; + iDataStore->SetPermittedCases( cs ); + + ret = KErrNone; + } + break; + + case ECmdPenInputCase: + { + TInt cs = *( TInt* )aData; + iDataStore->SetCase( cs ); + + ret = KErrNone; + } + break; + + case ECmdPenInputEditorCustomNumericKeyMap: + { + TInt len = *( TInt* )( aData - KIntSize ); + TPtrC16 keymapRes( ( TUint16* )aData, len / 2 ); + TRAP_IGNORE( iDataStore->SetNumberModeL( keymapRes ) ); + + ret = KErrNone; + } + break; + + case ECmdPenInputWindowOpen: + { + LayoutOwner()->Hide( EFalse ); + TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) ); + RootControl()->UpdateValidRegion(NULL, EFalse); + TPixelsTwipsAndRotation size; + CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(size); + TSize wndSize(size.iPixelSize.iWidth,size.iPixelSize.iHeight); + iDataStore->SetInputAreaSize(wndSize); + iDataStore->SetScreenSize(wndSize); + ret = KErrNone; + } + break; + + case ECmdPenInputWindowClose: + { + // clear stroke on the screen when close FS-HWR before writing time out + //iFsHwrBox->CancelCharWriting(); + TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) ); + LayoutOwner()->Hide( ETrue ); + + ret = KErrNone; + } + break; + + case ECmdPenInputEnableSettingBtn: + { + iControlBar->SetEnableSettingBtn(*aData); + ret = KErrNone; + } + break; + + default: + break; + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::SizeChanged() +// +// ----------------------------------------------------------------------------- +// +TInt CPeninputHwrfscnLayout::SizeChanged( const TAny* /*pData*/ ) + { + //Handle size change event + + // To clear the stroke on the screen when rotate device + //iFsHwrBox->CancelCharWriting(); + SetRect( TRect( TPoint( 0, 0 ), ScreenSize() ) ); + iFsHwrBox->SizeChanged(); + iCandidatePanel->SizeChanged(); + iControlBar->SizeChanged(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::HandleControlEvent() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::HandleControlEvent( TInt aEventType, + CFepUiBaseCtrl* aCtrl, const TDesC& aEventData ) + { + switch( aEventType ) + { + case EHwrEventKeyBack: + case EHwrEventBtnMoreFunction: + case EHwrEventSetRangeChinese: + case EHwrEventSetRangeEnglish: + case EHwrEventSetRangeNumber: + case EHwrEventRangeClick: + case EEventButtonDown: + case EHwrEventClose: + case EHwrEventTouchInputOption: + case EEventChoiceSelected: + { + TRAP_IGNORE( HandleControlBarEventL( aEventType, aCtrl, aEventData ) ); + } + break; + + case EHwrEventKeySpace: + case EHwrEventKeyEnter: +// case EHwrEventInputLangSwitch: + case EHwrEventVkbSwitch: + case EEventVirtualKeyUp: + { + TRAP_IGNORE( HandleFunctionListEventL( aEventType, aCtrl, aEventData ) ); + } + break; + + case EHwrEventBeginWriting: + case EHwrEventEndStroke: + case EHwrEventEndWriting: + case EHwrEventCandidateSelected: + case EHwrEventPredictiveSelected: + { + TRAP_IGNORE( HandleHwrWndEventL( aEventType, aEventData ) ); + } + break; + + case EHwrEventGetNextCandidatePage: + { + TRAP_IGNORE( HandleCandidateWndEventL( aEventType, aEventData ) ); + } + break; + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::HandleRawKeyEventL() +// . +// ----------------------------------------------------------------------------- +// +TBool CPeninputHwrfscnLayout::HandleRawKeyEventL( const TRawEvent& /*aKeyEvent*/ ) + { + NotifyOutsideEventL( ECandidatePanel | ECtrlBar ); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::HandleControlBarEventL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::HandleControlBarEventL( TInt aEventType, + CFepUiBaseCtrl* /*aCtrl*/, + const TDesC& aEventData ) + { + switch( aEventType ) + { + case EHwrEventKeyBack: + { + if ( !StrokeFilter() ) + { + iFsHwrBox->CancelCharWriting(); + } + else + { + TBuf<1> bufBck; + bufBck.Append( EKeyBackspace ); + SubmitStringToFep( bufBck ); + } + NotifyOutsideEventL( ECandidatePanel ); + } + break; + + case EHwrEventSetRangeChinese: + { + iDataStore->SetPrimaryRange( ERangeNative ); + iDataStore->SaveRange( ERangeNative ); + NotifyPrimaryRangeChanged( ERangeNative ); + iControlBar->Draw(); + } + break; + + case EHwrEventSetRangeEnglish: + { + iDataStore->SetPrimaryRange( ERangeEnglish ); + iDataStore->SaveRange( ERangeEnglish ); + NotifyPrimaryRangeChanged( ERangeEnglish ); + iControlBar->Draw(); + } + break; + + case EHwrEventSetRangeNumber: + { + iDataStore->SetPrimaryRange( ERangeNumber ); + iDataStore->SaveRange( ERangeNumber ); + NotifyPrimaryRangeChanged( ERangeNumber ); + iControlBar->Draw(); + } + break; + + case EHwrEventRangeClick: + case EHwrEventBtnMoreFunction: + { + iFsHwrBox->CancelCharWriting(); + NotifyOutsideEventL( ECandidatePanel ); + } + break; + + case EHwrEventTouchInputOption: + { + SignalOwner( ESignalLaunchOptionMenu ); + } + break; + + case EEventChoiceSelected: + { + CFepLayoutChoiceList::SEvent* event = + ( CFepLayoutChoiceList::SEvent* )aEventData.Ptr(); + if ( event->iIndex == -1 ) + { + return; + } + + TBool switchByMode = ETrue; + TInt mode = event->iCommand; + + TBuf buf; + buf.Append( reinterpret_cast( &switchByMode ), + sizeof( TBool )/sizeof( TText ) ); + buf.Append( reinterpret_cast( &mode ), + sizeof( TInt )/sizeof( TText ) ); + SignalOwner( ESignalLayoutUIChanged, buf ); + } + break; + + case EHwrEventClose: + { + SignalOwner(ESignalLayoutClosed); + } + break; + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::HandleFunctionListEventL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::HandleFunctionListEventL( TInt aEventType, + CFepUiBaseCtrl* /*aCtrl*/, + const TDesC& aEventData ) + { + switch( aEventType ) + { + case EHwrEventKeyEnter: + { + TBuf<1> bufEnter; + bufEnter.Append( EKeyEnter ); + SubmitStringToFep( bufEnter ); + } + break; + + case EHwrEventKeySpace: + { + if ( !iDataStore->IsNumberOnly() ) + { + TBuf<1> bufSpace; + bufSpace.Append( EKeySpace ); + SubmitStringToFep( bufSpace ); + } + } + break; + + case EEventVirtualKeyUp: + { + TBuf buf; + TVirtualKeyEventData* event = ( TVirtualKeyEventData* ) aEventData.Ptr(); + buf.Append( event->iKeyData ); + //the special char: smilefont char and cryfont char + if( iDataStore->IsSpecialDisplayChars( buf ) ) + { + HBufC* convertedBuf = iDataStore->ConvertDisplayChars( buf ); + buf = *convertedBuf; + delete convertedBuf; + } + SubmitStringToFep( buf ); + } + break; + } + + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::HandleHwrWndEventL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::HandleHwrWndEventL( TInt aEventType, + const TDesC& aEventData ) + { + if( aEventType == EHwrEventBeginWriting ) + { + NotifyOutsideEventL( ECandidatePanel | ECtrlBar ); + } + + iStateMgr->HandleEventL( aEventType, aEventData ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::HandleCandidateWndEventL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::HandleCandidateWndEventL( TInt /*aEventType*/, + const TDesC& /*aEventData*/ ) + { + iDataStore->GetNextPredictivePageL(); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::DataStore() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnDataStore& CPeninputHwrfscnLayout::DataStore() + { + return *iDataStore; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::OnAppEditorTextComing() +// . +// ----------------------------------------------------------------------------- +// +TInt CPeninputHwrfscnLayout::OnAppEditorTextComing( + const TFepInputContextFieldData& aData ) + { + iCandidatePanel->HandleCommand( EHwrEventCursorPosChanged, + ( TUint8* )&aData.iRect ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::PreHandleEvent() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::PreHandleEvent( TEventType /*aType*/, + const TRawEvent& /*aEvent*/ ) + { + + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::BeforeSendingEventsToBackground() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::BeforeSendingEventsToBackground() + { + TRAP_IGNORE( NotifyOutsideEventL( ECandidatePanel | ECtrlBar ) ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::PenInputUiType() +// . +// ----------------------------------------------------------------------------- +// +TInt CPeninputHwrfscnLayout::PenInputType() + { + return EPluginInputModeFSc; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::NotifyOutsideEventL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::NotifyOutsideEventL( TInt aPanel ) + { + if( aPanel & ECandidatePanel && aPanel & ECtrlBar ) + { + iCandidatePanel->HandleCommand( EHwrEventPointerOutsideWnd, NULL ); + iControlBar->HandleCommand( EHwrEventPointerOutsideWnd, NULL ); + iStateMgr->HandleEventL( EHwrEventPointerOutsideWnd, KNullDesC ); + } + else if( aPanel & ECandidatePanel ) + { + iCandidatePanel->HandleCommand( EHwrEventPointerOutsideWnd, NULL ); + iStateMgr->HandleEventL( EHwrEventPointerOutsideWnd, KNullDesC ); + } + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::NotifyPrimaryRangeChanged() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::NotifyPrimaryRangeChanged( TInt aPrimaryRange ) + { + TBuf buf; + buf.Append( ( TUint16* )( &aPrimaryRange ), KIntLen ); + SignalOwner( ESignalRange, buf ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::Replace() +// Delete the previous charcode and submit the new one +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::Replace( const TDesC& aOldCharCode, + const TDesC& aNewCharCode ) + { + // user tries to correct the previous selection + // Delete the previous character and append the new one + HBufC* newCharBuf = HBufC::New( aNewCharCode.Length() + KIntLen ); + if( newCharBuf ) + { + TInt len = aOldCharCode.Length(); + newCharBuf->Des().Append( ( TUint16* )&len, KIntLen ); + newCharBuf->Des().Append( aNewCharCode ); + SignalOwner( ESignalReplaceText, *newCharBuf ); + + delete newCharBuf; + } + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::SubmitStringToFep() +// Submit the char code. +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnLayout::SubmitStringToFep( const TDesC& aCharCode ) + { + SignalOwner( ESignalKeyEvent, aCharCode ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::OnResourceChange() +// Submit the char code. +// ----------------------------------------------------------------------------- +// +TInt CPeninputHwrfscnLayout::OnResourceChange(TInt aType) + { + CFepUiLayout::OnResourceChange(aType); + if( aType == KAknsMessageSkinChange ) + { + // Do other things when skin change + iControlBar->HandleSkinChanged(); + } + return KErrNone; + } +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnLayout::CandidatePanel() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnCandidatePanel& CPeninputHwrfscnLayout::CandidatePanel() + { + return *iCandidatePanel; + } + +void CPeninputHwrfscnLayout::ClearScreen() + { + if (iFsHwrBox) + { + iFsHwrBox->CancelCharWriting(); + TRAP_IGNORE(NotifyOutsideEventL( ECandidatePanel )); + } + } + +CPeninputHwrfscnWritingBox& CPeninputHwrfscnLayout::HwrfscnWritingBox() + { + return *iFsHwrBox; + } +//End of file