diff -r 000000000000 -r eb1f2e154e89 textinput/peninputhwrboxcn/ctrlsrc/peninputhwrboxgroup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputhwrboxcn/ctrlsrc/peninputhwrboxgroup.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,661 @@ +/* +* 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: The class of handwriting box container implemention. +* +*/ + + +#include +#include +#include +#include + +#include "peninputhwrboxgroup.h" +#include "peninputhwrctrlid.h" +#include "peninputhwrevent.h" + +const TUint32 KDefaultWriteBoxBgColor = 0xdddddd; +const TUint32 KDefaultWriteBoxFrameColor = 0x000000; +const TInt32 KInvalidResId = -1; + +// constant definition +const TInt KDefaultStrokeEndMarkX = -65536; +const TInt KDefaultStrokeEndMarkY = -65536; + +// Implementation of Class CAknFepHwrBoxGroup +// The container class of HWR boxes + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::NewL +// factory function +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CAknFepHwrBoxGroup* CAknFepHwrBoxGroup::NewL(CFepUiLayout* aUiLayout, + TInt aBoxGroupId, + TInt aBoxCount) + { + CAknFepHwrBoxGroup* self = new (ELeave) CAknFepHwrBoxGroup(aUiLayout, aBoxGroupId); + CleanupStack::PushL(self); + self->ConstructL(aBoxCount); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::NewLC +// factory function +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CAknFepHwrBoxGroup* CAknFepHwrBoxGroup::NewLC(CFepUiLayout* aUiLayout, + TInt aBoxGroupId, + TInt aBoxCount) + { + CAknFepHwrBoxGroup* self = new (ELeave) CAknFepHwrBoxGroup(aUiLayout, aBoxGroupId); + CleanupStack::PushL(self); + self->ConstructL(aBoxCount); + return self; + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::~CAknFepHwrBoxGroup +// Destructor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CAknFepHwrBoxGroup::~CAknFepHwrBoxGroup() + { + // base class CControlGroup frees all controls in the list + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::ConstructFromResourceL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::ConstructFromResourceL( TResourceReader& aReader) + { + // get write box bg color + TInt32 colorMajorSkinId = aReader.ReadInt32(); + TInt skinitemid= aReader.ReadInt16(); + TInt coloridx = aReader.ReadInt16(); + + TAknsItemID colorid; + colorid.Set(TInt(colorMajorSkinId), skinitemid); + + TRgb boxcolor; + MAknsSkinInstance* skininstance = AknsUtils::SkinInstance(); + TInt error = AknsUtils::GetCachedColor(skininstance, + boxcolor, + colorid, + coloridx); + + if (error != KErrNone) + { + boxcolor = TRgb(KDefaultWriteBoxBgColor); + } + + SetBoxBackColor(boxcolor); + + skinitemid = aReader.ReadInt16(); + coloridx = aReader.ReadInt16(); + + colorid.Set(TInt(colorMajorSkinId), skinitemid); + + TRgb boxframecolor; + error = AknsUtils::GetCachedColor(skininstance, + boxframecolor, + colorid, + coloridx); + + if (error != KErrNone) + { + boxframecolor = TRgb(KDefaultWriteBoxFrameColor); + } + + SetBoxFrameColor(boxframecolor); + + iFirstTimeConstruct = EFalse; + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::ConstructFromResourceL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::ConstructFromResourceL() + { + if (iResourceId == KInvalidResId) + { + User::Leave(KErrArgument); + } + + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC(reader, iResourceId); + + // get write box bg color + TInt32 colorMajorSkinId = reader.ReadInt32(); + TInt skinitemid = reader.ReadInt16(); + TInt coloridx = reader.ReadInt16(); + + TAknsItemID colorid; + colorid.Set(TInt(colorMajorSkinId), skinitemid); + + TRgb boxcolor; + MAknsSkinInstance* skininstance = AknsUtils::SkinInstance(); + TInt error = AknsUtils::GetCachedColor(skininstance, + boxcolor, + colorid, + coloridx); + + if (error != KErrNone) + { + boxcolor = TRgb(KDefaultWriteBoxBgColor); + } + + SetBoxBackColor(boxcolor); + + skinitemid = reader.ReadInt16(); + coloridx = reader.ReadInt16(); + + colorid.Set(TInt(colorMajorSkinId), skinitemid); + + TRgb boxframecolor; + error = AknsUtils::GetCachedColor(skininstance, + boxframecolor, + colorid, + coloridx); + + if (error != KErrNone) + { + boxframecolor = TRgb(KDefaultWriteBoxFrameColor); + } + + SetBoxFrameColor(boxframecolor); + + CleanupStack::PopAndDestroy(); // reader + + iFirstTimeConstruct = EFalse; + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::BoxCount +// Clear current handwriting trail if any. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CAknFepHwrBoxGroup::BoxCount() + { + return NumOfControls(); + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::CancelWriting +// Clear current handwriting trail if any. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::CancelWriting() + { + if( !iActiveBox ) + { + //there is nothing to cancel + return; + } + + iActiveBox->SetWndTransparencyFactor(iInactiveTrans); + iActiveBox->CancelCharWriting(); + } + +const RArray& CAknFepHwrBoxGroup::StrokeList() + { + ASSERT( iActiveBox != NULL ); + + return iActiveBox->StrokeList(); + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SizeChanged +// Hand size change event. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SizeChanged(const TRect& aRect) + { + TInt boxWidth = aRect.Width() / NumOfControls(); + TInt curLeft = aRect.iTl.iX; + + SetRect(aRect); + + for( TInt j = 0; j < NumOfControls(); j++, curLeft += boxWidth ) + { + At(j)->SetRect( TRect(curLeft, aRect.iTl.iY, + curLeft + boxWidth, + aRect.iBr.iY) ); + } + + RefreshUI(); + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SizeChanged +// Hand size change event. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SizeChanged() + { + //load Laf data and set all boxes size + //TRect aRect = somecode_load_laf_data; + //SizeChanged(aRect); + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SetBoxBackColor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetBoxBackColor(const TRgb aCol) + { + for( TInt j = 0; j < NumOfControls(); j++ ) + { + At(j)->SetBkColor(aCol); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SetBoxFrameColor +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetBoxFrameColor(const TRgb aCol) + { + for( TInt j = 0; j < NumOfControls(); j++ ) + { + static_cast(At(j))->SetFrameCol(aCol); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SetTransparency +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetTransparency(const TUint8 aActiveTrans, const TUint8 aInactiveTrans) + { +#ifdef __ALPHA_TRANCEPARENCY__ + iActiveTrans = aActiveTrans; + iInactiveTrans = aInactiveTrans; +#else + iActiveTrans = 255 - aActiveTrans; + iInactiveTrans = 255 - aInactiveTrans; +#endif + + for( TInt j = 0; j < NumOfControls(); j++ ) + { + if( At(j) != iActiveBox) + { + static_cast(At(j))->SetWndTransparencyFactor(iInactiveTrans); + } + else + { + static_cast(At(j))->SetWndTransparencyFactor(iActiveTrans); + } + } + } +// ----------------------------------------------------------------------------- +// from base class MAknFepHwrPropertySubscriber +// CAknFepHwrBoxGroup::SetPropertyL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetPropertyL(const TAknFepHwrProperty aPropertyName, + const TDesC& aPropertyValue) + { + switch( aPropertyName ) + { + case EAknFepHwrPropertyWriteSpeed: + { + const TTimeIntervalMicroSeconds32 speed = + *(TTimeIntervalMicroSeconds32 *)(aPropertyValue.Ptr());//lint !e826 + SetWritingSpeed( speed ); + } + break; + case EAknFepHwrPropertyPenSize: + { + const TSize penSize = *(TSize *)(aPropertyValue.Ptr());//lint !e826 + SetBoxPenSize( penSize ); + } + break; + case EAknFepHwrPropertyPenColor: + { + const TRgb color = *(TRgb *)(aPropertyValue.Ptr());//lint !e826 + SetBoxPenColor( color ); + } + break; + case EAknFepHwrPropertyStrokeEndMark: + { + const TPoint endMark = *(TPoint*)(aPropertyValue.Ptr()); + SetStrokeEndMark(endMark); + } + break; + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// from base class MEventObserver +// CAknFepHwrBoxGroup::HandleEvent +// Clear current handwriting trail if any. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::HandleControlEvent(TInt aEventType, + CFepUiBaseCtrl* aCtrl, + const TDesC& /*aEventData*/) + { + CTransparentHwrWnd* hwrWnd = static_cast( aCtrl ); + + switch( aEventType ) + { + case EEventHwrStrokeStarted: + OnStrokeStarted(hwrWnd); + break; + case EEventHwrStrokeFinished: + OnStrokeFinished(hwrWnd); + break; + case EEventHwrCharacterTimerOut: + OnStrokeCharacterTimerOut(hwrWnd); + break; + case EEventHwrStrokeCanceled: + OnStrokeCanceled(hwrWnd); + break; + default: + //todo: any comments left here + break; + } + }//lint !e715 + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::CAknFepHwrBoxGroup +// C++ constructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CAknFepHwrBoxGroup::CAknFepHwrBoxGroup(CFepUiLayout* aUiLayout, TInt aBoxGroupId) +: CControlGroup(aUiLayout, aBoxGroupId) + { + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::ConstructL +// Symbian secode phase constructor. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::ConstructL(TInt aBoxCount) + { + //leave if invalid aBoxCount + ASSERT( aBoxCount > 0 ); + + //call base construct + CControlGroup::ConstructL(); + + //create two box hwr window + for( TInt i = 0; i < aBoxCount; ++i ) + { + CTransparentHwrWnd* aBox = CTransparentHwrWnd::NewL(TRect(), + UiLayout(), + 0, + EFalse); + CleanupStack::PushL( aBox ); + aBox->AddEventObserver( this ); + aBox->EnableTraceOutsideWindow(EFalse); + AddControlL(aBox); + + // set default stroke end mark + aBox->SetStrokeEndMark(TPoint(KDefaultStrokeEndMarkX, KDefaultStrokeEndMarkY)); + + CleanupStack::Pop(aBox); //aBox + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SetWritingSpeed +// Iterate to set each HWR box writting speed. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetWritingSpeed(const TTimeIntervalMicroSeconds32& aCharDelay) + { + for( TInt j = 0; j < NumOfControls(); j++ ) + { + CTransparentHwrWnd* hwrWnd = static_cast(At(j)); + + if( hwrWnd ) + { + hwrWnd->SetCharacterDelay(aCharDelay); + } + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SetBoxPenSize +// Iterate to set each HWR box trail drawing pen size. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetBoxPenSize(const TSize aSize) + { + for( TInt j = 0; j < NumOfControls(); j++ ) + { + At(j)->SetPenSize(aSize); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SetBoxPenColor +// Iterate to set each HWR box trail drawing pen color. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetBoxPenColor(const TRgb aCol) + { + for( TInt j = 0; j < NumOfControls(); j++ ) + { + At(j)->SetPenColor(aCol); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SetStrokEndMark +// Iterate to set each HWR box stroke end mark. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SetStrokeEndMark(const TPoint& aEndMard) + { + for( TInt j = 0; j < NumOfControls(); j++ ) + { + static_cast(At(j))->SetStrokeEndMark(aEndMard); + } + } +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::OnStrokeStarted +// Handle EEventHwrStrokeStarted event. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::OnStrokeStarted(CTransparentHwrWnd* aBoxFrom) + { + TBool refresh = EFalse; + + if( !iActiveBox ) + { + //change state from not writing to begin writing + iActiveBox = aBoxFrom; + refresh = ETrue; + + ReportEvent(EHwrEventBeginWriting); + //set current box transparency + iActiveBox->SetWndTransparencyFactor(iActiveTrans); + } + else + { + if( iActiveBox != aBoxFrom ) + { + // current active box will turn into inactive state + iActiveBox->SetWndTransparencyFactor(iInactiveTrans); + // user switches to another box + if( iActiveBox->HasNewTrace() ) + { + OnStrokeFinished(iActiveBox); + } + // handler of EHwrEventNewWriting submit default candidate + // reset state + ReportEvent(EHwrEventNewWriting); + // clear writing of the last box + CancelWriting(); + + iActiveBox = aBoxFrom; + refresh = ETrue; + + //set current box transparency + iActiveBox->SetWndTransparencyFactor(iActiveTrans); + } + else + { + ReportEvent(EHwrEventBeginWriting); + } + } + + if( refresh ) + { + // only active box need update + // inactive box is already update by CancelWriting + RefreshUI(iActiveBox); + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::StrokeStrokeFinished +// Handle EEventHwrStrokeFinished event. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::OnStrokeFinished(CTransparentHwrWnd* /* aBoxFrom */) + { + // Get stroke list is called by event handler + TPtrC ptr; + RArray* strokeList = const_cast* >(&(StrokeList())); + ptr.Set(reinterpret_cast(strokeList), sizeof(strokeList)); + ReportEvent(EHwrEventEndStroke, ptr); + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::StrokeCharacterTimerOut +// Handle EEventHwrCharacterTimerOut event. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::OnStrokeCharacterTimerOut(CTransparentHwrWnd* aBoxFrom) + { + aBoxFrom->SetWndTransparencyFactor(iInactiveTrans); + ReportEvent(EHwrEventEndWriting); + + if( iActiveBox == aBoxFrom ) + { + iActiveBox = NULL; + } + + RefreshUI(aBoxFrom); + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::OnStrokeCanceled +// Handle EEventHwrStrokeCanceled event. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::OnStrokeCanceled(CTransparentHwrWnd* aBoxFrom) + { + if( iActiveBox == aBoxFrom ) + { + iActiveBox = NULL; + } + } +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::RefreshUI +// Explicit refresh HWR boxes UI. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::RefreshUI(CTransparentHwrWnd* aBox) + { + if( !aBox ) + { + if( Hiden() ) + { + return; + } + + Draw(); + UpdateArea(Rect(), EFalse); + } + else + { + if( !aBox->Hiden() ) + { + aBox->Draw(); + UpdateArea(aBox->Rect(), EFalse); + } + } + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::SubmitWriting +// Submit first candidate in candidate buffer immediatelly. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CAknFepHwrBoxGroup::SubmitWriting() + { + if( !iActiveBox ) + { + return; + } + + //iActiveBox->SetTransparency(iInactiveTrans); + //todo call some base method to clear and submit + //iActiveBox->EndStrokeDirectly(); + } + +// ----------------------------------------------------------------------------- +// CAknFepHwrBoxGroup::StrokeEndMark +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TPoint CAknFepHwrBoxGroup::StrokeEndMark() + { + if (NumOfControls() >= 1) + { + return static_cast(At(0))->StrokeEndMark(); + } + + return TPoint(KDefaultStrokeEndMarkX, KDefaultStrokeEndMarkY); + } + +//End Of File