textinput/peninputarc/src/peninputlayoutcontrol/peninputfullscrlayout.cpp
changeset 0 eb1f2e154e89
--- /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 <w32std.h>
+#include <peninputcmd.h>
+#include "peninputfullscrlayout.h"
+#include "peninputlayoutrootctrl.h"
+#include "peninputlayouttimer.h"
+#include "peninputlayouthwrwnd.h"
+#include <coemain.h>
+
+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<TUint16*>(&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