diff -r 000000000000 -r eb1f2e154e89 textinput/peninputarc/src/peninputlayoutcontrol/peninputfullscrlayout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputfullscrlayout.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,290 @@ +/* +* Copyright (c) 2006-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 full screen UI layout +* +*/ + + +#include +#include +#include "peninputfullscrlayout.h" +#include "peninputlayoutrootctrl.h" +#include "peninputlayouttimer.h" +#include "peninputlayouthwrwnd.h" +#include + +const TInt KDefaultMaxStep = 3; +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::CFepFullScreenLayout +// Constructor +// --------------------------------------------------------------------------- +// + +EXPORT_C CFepFullScreenLayout::CFepFullScreenLayout(MLayoutOwner* aLayoutOwner, + TInt aDuration) + :CFepUiLayout(aLayoutOwner), + iBufferEvent(EFalse),iXLeftPos(0),iXRightPos(0), + iYTopPos(0),iYBottomPos(0), + iEventBufDruation(aDuration) + + { + const TInt KDefaultBufferTimer = 1000*250; //1/4 seconds + if(iEventBufDruation <= 0) + iEventBufDruation = KDefaultBufferTimer; + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::~CFepFullScreenLayout +// Destructor +// --------------------------------------------------------------------------- +// +EXPORT_C CFepFullScreenLayout::~CFepFullScreenLayout() + { + delete iBufferTimer; + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::BaseConstructL +// Do basic contructor +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepFullScreenLayout::BaseConstructL() + { + iBufferTimer = CLayoutTimer::NewL(this,CLayoutTimer::EOthers); + + CFepUiLayout::BaseConstructL(); + } + +// --------------------------------------------------------------------------- +// CFepUiLayout::HandleEventL +// handle event from window server +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CFepFullScreenLayout::HandleEventL(TEventType aType, const TAny* aData) + { + TRawEvent event=*((TRawEvent*)aData); + + //if pointer is captured, don't buffer the event. + if(RootControl()->CtrlCapPointer()) + return CFepUiLayout::HandleEventL(aType,aData); + + if((ERawEvent == aType) && (TRawEvent::EButton1Down == event.Type() || + TRawEvent::EButton1Up == event.Type() || + TRawEvent::EPointerMove == event.Type()) ) + { + if(iBufferEvent) + { + if(TRawEvent::EButton1Up == event.Type()) + { + //is the buffer timer still active? if so, cancel it and + //simulate the event to others + if(iBufferTimer->IsActive()) + { + iEventBuf.Append(event); + SimulateEvent(); + return ETrue; + } + else + { + //is this a valid trace? + iEventBuf.Append(event); + if(IsValidStroke()) + HandleBufferedEventL(); + else + SimulateEvent(); + return ETrue; + } + } + + BufferEventL(event); + return ETrue; + } + + + //Check whether buffering should starts. + //Only when pen downs in the area where trace can be started, + //e.g, not in the button, should we start the buffering. + if(!(RootControl()->NonHwrStartingPtRegion().Contains(event.Pos()))) + { + if(IsHwrNewCharacter() && TRawEvent::EButton1Down == event.Type()) + { + StartBufferEvent(event); + return ETrue; + } + } + } + return CFepUiLayout::HandleEventL(aType,aData); + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::StartBufferEvent +// Start bufferring the event +// --------------------------------------------------------------------------- +// +void CFepFullScreenLayout::StartBufferEvent(TRawEvent& aEvent) + { + iBufferEvent = ETrue; + iXLeftPos = aEvent.Pos().iX; + iXRightPos = aEvent.Pos().iX; + iYTopPos = aEvent.Pos().iY; + iYBottomPos = aEvent.Pos().iY; + iEventBuf.Append(aEvent); + iHwrWndPenSize = iHwrWnd->PenSize(); + iHwrWnd->SetPenSize(TSize(0,0)); + iBufferTimer->SetTimer(iEventBufDruation); + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::BufferEventL +// Bufferring theevent +// --------------------------------------------------------------------------- +// +void CFepFullScreenLayout::BufferEventL(TRawEvent& aEvent) + { + iEventBuf.AppendL(aEvent); + if(IsValidStroke()) + HandleBufferedEventL(); + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::SimulateEvent +// Simulates the bufferred event to other app +// --------------------------------------------------------------------------- +// +void CFepFullScreenLayout::SimulateEvent() + { + + iBufferEvent = EFalse; + //resotre the hwr window pen size + iHwrWnd->SetPenSize(iHwrWndPenSize); + + for(TInt i = 0; i < iEventBuf.Count(); i++) + { + TPtrC data; + data.Set(reinterpret_cast(&iEventBuf[i]),sizeof(iEventBuf[i])/sizeof(TUint16)); + + SignalOwner(ESignalSimulateEvent,data); + } + iEventBuf.Reset(); + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::HandleBufferedEventL +// Forward event to iput UI +// --------------------------------------------------------------------------- +// +void CFepFullScreenLayout::HandleBufferedEventL() + { + iBufferEvent = EFalse; + //resotre the hwr window pen size + iHwrWnd->SetPenSize(iHwrWndPenSize); + + for(TInt i = 0; i < iEventBuf.Count(); i++) + { + CFepUiLayout::HandleEventL(ERawEvent,&iEventBuf[i]); + } + + iEventBuf.Reset(); + } + +EXPORT_C void CFepFullScreenLayout::HandleTimerOut(TInt /*aTimeType*/) + { + iBufferEvent = EFalse; + //change pen width for hwr window + TRAP_IGNORE(HandleBufferedEventL()); + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::InitL +// Initialize the layout +// --------------------------------------------------------------------------- +// +EXPORT_C TRect CFepFullScreenLayout::Init() + { + //find hwr window + iHwrWnd =(CHwrWndBase*)(RootControl()->ControlForKindOfType(ECtrlTransparentHwrWnd)); + __ASSERT_ALWAYS(iHwrWnd, User::Panic(_L("peninputserver"), EUiFullscreenWithoutHWRWnd)); + return CFepUiLayout::Init(); + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::IsHwrNewCharacter +// Test whether a new character is starting +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CFepFullScreenLayout::IsHwrNewCharacter() + { + return iHwrWnd->StrokeList().Count() <= 0; + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::SemiTransparencyRequired +// Tell whether this layout require trancparency +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CFepFullScreenLayout::SemiTransparencyRequired() + { + //full screen HWR using full-transparency, so black-white mask is OK. + return EFalse; + } + +// --------------------------------------------------------------------------- +// CFepFullScreenLayout::IsValidStroke +// Tests whether current pen trace is valid for a character +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CFepFullScreenLayout::IsValidStroke() + { + if(iEventBuf.Count() >= KMaxBufferEventNum) + { + return ETrue; //buffer overflow, this is considering to be a valid stroke. + } + + TPoint pt = iEventBuf[iEventBuf.Count()-1].Pos(); + if(pt.iX < iXLeftPos) + { + iXLeftPos = pt.iX; + } + else + { + if(pt.iX > iXRightPos) + { + iXRightPos = pt.iX; + } + } + + if(pt.iY < iYTopPos) + { + iYTopPos = pt.iY; + } + else + { + if(pt.iY > iYBottomPos) + { + iYBottomPos = pt.iY; + } + } + if((iXRightPos - iXLeftPos) >= KDefaultMaxStep || + (iYBottomPos - iYBottomPos) >= KDefaultMaxStep) + { + //HandleBufferedEventL(); + return ETrue; + } + else + return EFalse; + } +//end of file