diff -r 000000000000 -r eb1f2e154e89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayouthwrwindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayouthwrwindow.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1532 @@ +/* +* 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 hwr window base and transparent window +* +*/ + + + +#include +#include "peninputlayouthwrwnd.h" +#include "peninputlayoutrootctrl.h" +#include "peninputlayouttimer.h" +#include "peninputlayout.h" + +#include + +#include "peninputpentracedecorator.h" + +const TUint8 KDefaultTransparency = 128; +const TInt KDefaultPenSize = 3; +const TInt KFadeAreaCount = 30; + +/******************** start of CHwrWndBase **********************************/ +// Implementation of Class CHwrWndBase +// + +// --------------------------------------------------------------------------- +// CHwrWndBase::CHwrWndBase +// C++ default constructor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CHwrWndBase::CHwrWndBase(const TRect& aRect,CFepUiLayout* aUiLayout,TInt aControlId): + CFepUiBaseCtrl(aRect,aUiLayout,aControlId), + iHasNewTrace(EFalse), + iSubmitted(ETrue) + { + const TTimeIntervalMicroSeconds32 KDefaultCharDelay = 1000*500; //1/2 seconds + const TTimeIntervalMicroSeconds32 KDefaultStrokeDelay = 1000*300; //1/10 seconds + + + SetControlType(ECtrlHwrWnd); + SetPenColor(KRgbBlack); + SetPenSize(TSize(KDefaultPenSize,KDefaultPenSize)); + iStrokeEndMark=TPoint(0xffff,0); + iStrokeDelay = KDefaultStrokeDelay; + iCharDelay = KDefaultCharDelay; + iDirtyRect.SetRect(0,0,0,0); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::~CHwrWndBase +// Destructor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CHwrWndBase::~CHwrWndBase() + { + + iListOfPoints.Close(); + delete iCharacterTimer; + iCharacterTimer = NULL; + delete iStrokeTimer; + iStrokeTimer = NULL; + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::ClearStroke +// Clear the stroke +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::ClearStroke() + { + iDirtyRect.Intersection(iRect); + + ClearRect( iRect ); + + iListOfPoints.Reset(); + + iHasNewTrace=EFalse; + iSubmitted = ETrue; + + if(AbleToDraw()) + { + RootControl()->DrawRect(iRect); + UpdateArea(iRect, EFalse); + } + + iDirtyRect.SetRect(0,0,0,0); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::AddGuidingLine +// Add a guilding line. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::AddGuidingLine(const TPoint& /*aStart*/, const TPoint& /*aEnd*/) + { + //not implemented + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::EndStrokeL +// Do recognition after a stroke is ended. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CHwrWndBase::EndStrokeL(TBool aCharacterTimerFlag) + { + if(iHasNewTrace) //only do this when we have new trace + { + if(aCharacterTimerFlag) + { + iCharacterTimer->SetTimer(iCharDelay); //set character timer + //only send finish event when character timer starter, + //otherwise, send charater timer out event. + ReportEvent(EEventHwrStrokeFinished); + iSubmitted = EFalse; + } + else + { + ReportEvent(EEventHwrCharacterTimerOut); + iSubmitted = ETrue; + } + + iHasNewTrace=EFalse; //Current stroke is ended,reset the flag. + + } + else + { + //no new trace, no need to update the candidate content, just show it. + if(!aCharacterTimerFlag) + { + ReportEvent(EEventHwrCharacterTimerOut); + iSubmitted = ETrue; + } + } + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::CancelCharWriting +// Cancel current drawing. Clears the stroke and stops the timer +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::CancelCharWriting() + { + SetPointerDown(EFalse); + + //cancel timer + iCharacterTimer->Cancel(); + iStrokeTimer->Cancel(); + + //reset the stroke + ClearStroke(); + ReportEvent(EEventHwrStrokeCanceled); + } +// --------------------------------------------------------------------------- +// CHwrWndBase::Draw +// Draw the window and stroke +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::Draw() + { + if(!AbleToDraw()) + return; + + //draw back ground + DrawBackground(); + DrawStroke(ETrue); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::DrawLine +// Draw a line +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TRect CHwrWndBase::DrawLine(const TPoint& aPt1,const TPoint& aPt2,TBool /*aDrawFlag*/) + { + //do nothing + return TRect(aPt1,aPt2); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::HandlePointerDownEventL +// handle pointer down event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CHwrWndBase::HandlePointerDownEventL( const TPoint& aPt) + { + CFepUiBaseCtrl::HandlePointerDownEventL(aPt); + + iPtPrev = aPt; + + iListOfPoints.AppendL(aPt- Rect().iTl); + iStrokeTimer->Cancel(); + iCharacterTimer->Cancel(); + + iHasNewTrace=ETrue; + iSubmitted = EFalse; + + TRect rect; + rect = DrawPoint(aPt,ETrue); + if(iDirtyRect.IsEmpty()) + iDirtyRect = rect; + else + { + iDirtyRect.BoundingRect(rect); + } + + UpdateArea(rect,EFalse); + + ReportEvent(EEventHwrStrokeStarted); + return this; + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::HanldePointerUpEventL +// handle pointer up event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CHwrWndBase::HandlePointerUpEventL( const TPoint& aPoint) + { + iListOfPoints.AppendL(iStrokeEndMark); + iStrokeTimer->SetTimer(iStrokeDelay); + CFepUiBaseCtrl::HandlePointerUpEventL(aPoint); + // For EKZG-7JCBGW + // iCtrlWithPointerDown of its CControlGroup must be set to NULL + // when its up event occurs. + CFepUiBaseCtrl* parent = ParentCtrl(); + while ( parent ) + { + parent->CancelPointerDownL(); + parent = parent->ParentCtrl(); + } + return this; + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::HandleButtonMoveEventL +// Handle button move event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CHwrWndBase::HandlePointerMoveEventL(const TPoint& aPoint) + { + if(!PointerDown()) + return this; + + iListOfPoints.AppendL(aPoint - Rect().iTl); + + TRect rect=DrawLine(iPtPrev,aPoint,ETrue); + + /*if(!rect.IsEmpty()) + { + TRect& drawrect = DirtyRect(); + drawrect.BoundingRect(rect); //find the bounding rect and set the rect + } */ + UpdateArea(rect,EFalse); + iPtPrev=aPoint; + return this; + } + + +// --------------------------------------------------------------------------- +// CHwrWndBase::CancelPointerDownL +// Cancel the pointer down event in HWR window +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CHwrWndBase::CancelPointerDownL() + { + if( !PointerDown() ) + { + return; + } + //allow pen up in other control. Do us normal pen up + if( iListOfPoints.Count() > 0 ) + { + iListOfPoints.AppendL(iStrokeEndMark); + iStrokeTimer->SetTimer(iStrokeDelay); + } + + SetPointerDown(EFalse); + CFepUiBaseCtrl::CancelPointerDownL(); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::UpdateRegion +// Updates the area where other control made dirty +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CHwrWndBase::UpdateRegion(CFepUiBaseCtrl* aCtrl) + { + if(aCtrl) + { + TRect rect; + if(iDirtyRect.Intersects(aCtrl->Rect())) + { + DrawStroke(ETrue); + rect.Intersection(iDirtyRect); + UpdateArea(rect,EFalse); + } + } + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::HandleTimerOut +// Handle timer out event. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::HandleTimerOut(TInt aTimeType) + { + switch(aTimeType) + { + case CLayoutTimer::ECharacterTimer: + { + TRAP_IGNORE(EndStrokeAndClearL()); + } + break; + case CLayoutTimer::EStrokeTimer: + { + TRAP_IGNORE(EndStrokeL(ETrue)); + } + break; + default: + //Do nothing + break; + } + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::ConstructL +// Symbian second phrase constructor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::ConstructL() + { + BaseConstructL(); + iCharacterTimer = CLayoutTimer::NewL(this,CLayoutTimer::ECharacterTimer); + iStrokeTimer = CLayoutTimer::NewL(this); + } + + +// --------------------------------------------------------------------------- +// CHwrWndBase::DrawStroke +// Draw stroke +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C TRect CHwrWndBase::DrawStroke(TBool /*aDrawFlag*/) + { + //not implemented + return TRect(); + } + + +// --------------------------------------------------------------------------- +// CHwrWndBase::EndStrokeAndClearL +// Called when character timer out. Not implemented, it's for derivated class. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CHwrWndBase::EndStrokeAndClearL() + { + EndStrokeL(EFalse); + ClearStroke(); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::OnDeActivate +// Response to layout de activation event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::OnDeActivate() + { + CFepUiBaseCtrl::OnDeActivate(); + iStrokeTimer->Cancel(); + iCharacterTimer->Cancel(); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::OnLayoutDraggingStart +// Response to layout dragging start event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::OnLayoutDraggingStart() + { + if ( iHasNewTrace ) + { + ReportEvent(EEventHwrStrokeFinished); + iHasNewTrace=EFalse; + } + iStrokeTimer->Cancel(); + + if ( !iSubmitted ) + { + ReportEvent(EEventHwrCharacterTimerOut); + iSubmitted = ETrue; + } + iCharacterTimer->Cancel(); + iListOfPoints.Reset(); + } + +// --------------------------------------------------------------------------- +// CHwrWndBase::OnLayoutDraggingEnd +// Response to layout dragging end event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CHwrWndBase::OnLayoutDraggingEnd() + { + } + +/******************** end of CHwrWndBase **********************************/ + + + + +//class CTransparentHwrWnd +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::CTransparentHwrWnd +// C++ default constructor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CTransparentHwrWnd::CTransparentHwrWnd(const TRect& aRect, + CFepUiLayout* aUiLayout,TInt aCtrlId, + TBool aFullScreenFlag) + :CHwrWndBase(aRect,aUiLayout,aCtrlId), + iIsFullScreen(aFullScreenFlag), + iTraceOutsideWindowFlag(EFalse), + iTransparencyFactor(KDefaultTransparency) + { + SetControlType(ECtrlTransparentHwrWnd); + + const TRgb KDefaultMaskCol(200,200,200); + + if(iIsFullScreen) + { + SetMaskBkCol( TRgb(KTransparentColor)); //full transparent + } + else + SetMaskBkCol(KDefaultMaskCol); + + SetBorderColor(TRgb(KOpaqueColor)); + //transparent window allow dragging on top of it + SetAllowOverlap(ETrue); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::~CTransparentHwrWnd +// Destructor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CTransparentHwrWnd::~CTransparentHwrWnd() + { + if(iTraceOutsideWindowFlag) + { + TRAP_IGNORE(RequireRegionUpdateL(EFalse)); + } + + if ( iPenTraceDecorator ) + { + delete iPenTraceDecorator; + iPenTraceDecorator = NULL; + } + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::NewL +// Factory function +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CTransparentHwrWnd* CTransparentHwrWnd::NewL(const TRect& aRect, + CFepUiLayout* aUiLayout,TInt aCtrlId, + TBool aFullScreenFlag) + { + CTransparentHwrWnd* wnd=new(ELeave) CTransparentHwrWnd(aRect,aUiLayout, + aCtrlId,aFullScreenFlag); + CleanupStack::PushL(wnd); + wnd->ConstructL (); + CleanupStack::Pop(wnd); + return wnd; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::SetWndTransparencyFactor +// Set the transparency factor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void EXPORT_C CTransparentHwrWnd::SetWndTransparencyFactor(TUint8 aFactor) + { + if(iTransparencyFactor != aFactor) + { + //change mask col + TUint8 col = aFactor; + + SetMaskBkCol(TRgb( 255- col, 255 - col, 255 - col)); + + iTransparencyFactor = aFactor; + Draw(); + UpdateArea(Rect(),ETrue); + UiLayout()->LayoutOwner()->FlushUi(); + } + } + + +// ----------------------------------------------------------------------------- +// CTransparentHwrWnd::EnableTraceOutsideWindow +// Enable/disable trace outside of hwr window. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWnd::EnableTraceOutsideWindow(TBool aFlag) + { + iTraceOutsideWindowFlag = aFlag; + TRAP_IGNORE(RequireRegionUpdateL(aFlag)); + } + + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::Draw +// Draw hwr window +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWnd::Draw() + { + if(!AbleToDraw()) + return; + + if(iIsFullScreen) + { + DrawStroke(ETrue); + return; + } + + CFbsBitGc* gc= static_cast (BitGc()); + + DrawMaskBackground(); + // ----- draw bitmaps ----- + DrawBackground(); + DrawFrame( Rect() ); + //draw stroke + gc->SetPenSize( PenSize() ); + gc->SetPenColor( PenColor() ); + + if ( PenTraceDecorationActivated() ) + { + //clear decoration buffer + if ( StrokeList().Count() > 0 ) + { + iPenTraceDecorator->Clear(); + } + } + + DrawStroke(ETrue); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::DrawStroke +// Draw stroke +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C TRect CTransparentHwrWnd::DrawStroke(TBool aDrawFlag) + { + TRect DirtyRect; + TRect rect; + TPoint pt; + TPoint prevPt; + + //rect = DrawPoint(pt,aDrawFlag); + //DirtyRect = rect; + TBool bBeginStroke = ETrue; + for(TInt i = 0; i < StrokeList().Count(); ++i) + { + pt = StrokeList()[i] ; + //skip the stroke end mark, plot the start point for the stroke + if(pt == StrokeEndMark()) + { + bBeginStroke = ETrue; + continue; + } + + pt += Rect().iTl; + if(bBeginStroke) + { + //plot the start point for the new line + rect = DrawPoint(pt,aDrawFlag); + bBeginStroke = EFalse; + } + else + { + rect = DrawLine(prevPt,pt,aDrawFlag); + } + DirtyRect.BoundingRect(rect); //find the bounding rect + prevPt = pt; + } + + return DirtyRect; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::DrawPoint +// Draw a point +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TRect CTransparentHwrWnd::DrawPoint(const TPoint& aPoint,TBool aDrawFlag) + { + TRect affectedRect(0,0,0,0); + + if ( PenTraceDecorationActivated( ) ) + { + TRect wndRect = Rect(); + + TPoint pt1 = aPoint - wndRect.iTl; //decorator's coordinate system + TRect changedRect = iPenTraceDecorator->DrawPoint( pt1 ); //decorator's coordinate system + TPoint drawpos = changedRect.iTl + wndRect.iTl; + + CFbsBitGc* gc = static_cast( BitGc() ); + + gc->Activate( BitmapDevice() ); + gc->SetBrushColor( BkColor() ); + gc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + + gc->BitBltMasked( drawpos, iPenTraceDecorator->BitsBitmap(), + changedRect, iPenTraceDecorator->MaskBitmap(), EFalse ); + + gc->RectDrawnTo( affectedRect ); //get the affected rect since last draw + + //gc->Activate( MaskBitmapDevice() ); + //gc->BitBlt( drawpos, iPenTraceDecorator->MaskBitmap(), changedRect ); + } + else + { + CFbsBitGc* gc= static_cast (BitGc()); + + gc->Activate( BitmapDevice() ); + gc->SetPenSize( PenSize()); + if(aDrawFlag) + gc->SetPenColor( PenColor() ); + else //erase the point + gc->SetPenColor( BkColor()); + gc->Plot( aPoint ); + gc->RectDrawnTo(affectedRect); //get the affected rect since last draw + + TRect maskRect; + + gc->Activate( MaskBitmapDevice()); + gc->SetPenColor( KOpaqueColor ); + //use same color to get opague point + gc->Plot( aPoint ); + gc->RectDrawnTo(maskRect); + + affectedRect.BoundingRect(maskRect); //find the bounding rect + if(!iTraceOutsideWindowFlag) + affectedRect.Intersection(iRect); //drawing not allowed outside of + + } + return affectedRect; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::DrawLine +// Draw a line +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TRect CTransparentHwrWnd::DrawLine(const TPoint& aPt1,const TPoint& aPt2,TBool aDrawFlag) + { + TRect affectedRect(0,0,0,0); + + if ( PenTraceDecorationActivated() ) + { + TRect wndRect = Rect(); + + TPoint pt1 = aPt1 - wndRect.iTl; //decorator's coordinate system + TPoint pt2 = aPt2 - wndRect.iTl; //decorator's coordinate system + + TRect changedRect = iPenTraceDecorator->DrawNextLine( pt1, pt2 ); //decorator's coordinate system + + TPoint drawpos = changedRect.iTl + wndRect.iTl; + + CFbsBitGc* gc= static_cast( BitGc() ); + + gc->Activate( BitmapDevice() ); + gc->SetBrushColor( BkColor() ); + gc->SetBrushStyle( CGraphicsContext::ESolidBrush ); + + gc->BitBltMasked( drawpos, iPenTraceDecorator->BitsBitmap(), + changedRect, iPenTraceDecorator->MaskBitmap(), EFalse ); + + gc->RectDrawnTo( affectedRect ); //get the affected rect since last draw + + //gc->Activate( MaskBitmapDevice() ); + //gc->BitBlt( drawpos, iPenTraceDecorator->MaskBitmap(), changedRect ); + } + + else + { + CFbsBitGc* gc= static_cast (BitGc()); + + gc->Activate( BitmapDevice() ); + SetClipRegion(); + gc->SetPenSize( PenSize()); + if(aDrawFlag) + gc->SetPenColor( PenColor() ); + else + gc->SetPenColor( BkColor()); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->DrawLine( aPt1,aPt2 ); + + gc->RectDrawnTo(affectedRect); //get the affected rect since last draw + CancelClipRegion(); + + TRect maskRect; + + gc->Activate( MaskBitmapDevice() ); + SetClipRegion(); + gc->SetPenColor( KOpaqueColor ); + + //use same color as in bitmap to get opague line + //gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->DrawLine( aPt1,aPt2 ); + gc->RectDrawnTo(maskRect); + + //affectedRect.BoundingRect(maskRect); //find the bounding rect +/* if(!iTraceOutsideWindowFlag) + { + TRect r = affectedRect; + affectedRect.Intersection(iRect); //drawing not allowed outside of + + }*/ + CancelClipRegion(); + } + return affectedRect; + } + +void CTransparentHwrWnd::DrawFrame( const TRect& aFrameRect ) + { + CFbsBitGc* gc= static_cast ( BitGc() ); + + gc->Activate( MaskBitmapDevice() ); + gc->SetPenColor( KOpaqueColor ); + gc->SetPenSize( BorderSize() ); + gc->SetPenStyle( CGraphicsContext::ESolidPen ); + gc->SetBrushStyle( CGraphicsContext::ENullBrush ); + gc->DrawRect( aFrameRect ); + + gc->Activate( BitmapDevice() ); + gc->SetPenColor( BorderColor() ); + gc->SetPenSize( BorderSize() ); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->SetBrushStyle( CGraphicsContext::ENullBrush ); + gc->DrawRect( aFrameRect ); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::HandlePointerDownL +// handle pointer down event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CTransparentHwrWnd::HandlePointerDownEventL(const TPoint& aPoint) + { + if ( PenTraceDecorationActivated() ) + { + iPenTraceDecorator->SetPenTraceColor( PenColor() ); + iPenTraceDecorator->SetDisplayModeL( BitmapDevice()->DisplayMode(), EFalse ); + iPenTraceDecorator->ResizeL( Rect().Size() ); + } + + // handle drawing in first box + //capture pointer + CHwrWndBase::HandlePointerDownEventL(aPoint); + CapturePointer(); + return this; + } + + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::HandlePointerUpL +// Handle point up event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CTransparentHwrWnd::HandlePointerUpEventL( + const TPoint& aPoint) + { + //release capture + CHwrWndBase::HandlePointerUpEventL(aPoint); + CapturePointer(EFalse); + return this; + } +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::HandlePointerMoveEventL +// Handle point move event +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CTransparentHwrWnd::HandlePointerMoveEventL( + const TPoint& aPoint) + { + if(!PointerDown()) + return this; + + //ignore events outside of window if it's TraceOutSideWindow flag is not set + TRect r; + TSize s(PenSize()); + TSize s2(3*s.iWidth/2,3*s.iHeight/2); + + r.SetRect(TPoint(aPoint-TSize(s.iWidth/2,s.iHeight/2)),s2); + TRect r1 = r; + r.Intersection(Rect()); + TBool inside = (r == r1); + + //if(iTraceOutsideWindowFlag || inside)//Rect().Contains(aPoint)) + if(iTraceOutsideWindowFlag || Rect().Contains(aPoint)) + { + return CHwrWndBase::HandlePointerMoveEventL(aPoint); + } + + return this; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::UpdateValidRegion +// Update the valid region when one control hiden or shown +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWnd::UpdateValidRegion(CFepUiBaseCtrl* aCtrl, + TBool aRemovedFlag) + { + RRegion region(8); + region.Copy(Region()); + if(iTraceOutsideWindowFlag) //Ignore if trace can not be outside of hwr window + { + if(aCtrl) + { + if(aCtrl->Hiden() || aRemovedFlag) + { + region.Union(aCtrl->Region()); + } + else + region.SubRegion(aCtrl->Region()); + + } + else // recalculate the region + { + + region.Clear(); + region.AddRect(UiLayout()->Rect()); + CFepUiBaseCtrl* ctrl; + for(TInt i = 0; i < RootControl()->ControlList().Count(); i++) + { + ctrl = RootControl()->ControlList()[i]; + if(ctrl->Ready() && !ctrl->Hiden() && + !ctrl->IsKindOfControl(ECtrlTransparentHwrWnd)) + { + region.SubRect(ctrl->Rect()); + } + } + } + } + else + { + region.Clear(); + region.AddRect(Rect()); + } + + SetRegion(region); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::ClearStroke +// Clear all strokes. +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWnd::ClearStroke() + { + if ( PenTraceDecorationActivated() ) + { + iPenTraceDecorator->Clear(); + } + + CHwrWndBase::ClearStroke(); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::InstallPenTraceDecoratorL +// Install a new pen trace decorator. +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CTransparentHwrWnd::InstallPenTraceDecoratorL(const TDesC& /*aDecoratorName*/, TBool aEnable ) + { + if ( iPenTraceDecorator ) + { + delete iPenTraceDecorator; + iPenTraceDecorator = NULL; + } + + iPenTraceDecorator = CPeninputPenTraceDecorator::NewL(); + if ( aEnable ) + { + iPenTraceDecorator->Enable(); + } + return ETrue; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::SupportPenTraceDecoration +// Test whether this window support trace decoration. +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CTransparentHwrWnd::SupportPenTraceDecoration() + { + return iPenTraceDecorator ? ETrue : EFalse; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::PenTraceDecorationActivated +// Test whether pen trace decoration is activated. +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CTransparentHwrWnd::PenTraceDecorationActivated() + { + if ( iPenTraceDecorator ) + { + return iPenTraceDecorator->Enabled(); + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWnd::ActivatePenTraceDecoration +// Activate/deactivate pen trace decoration. +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWnd::ActivatePenTraceDecoration(TBool aActive, TBool aReleaseBuffer ) + { + if ( iPenTraceDecorator ) + { + if ( aActive ) + { + iPenTraceDecorator->Enable(); + } + else + { + iPenTraceDecorator->Disable( aReleaseBuffer ); + } + } + } +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::CTransparentHwrWndExt +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CTransparentHwrWndExt::CTransparentHwrWndExt( const TRect& aRect, + CFepUiLayout* aUiLayout, + TInt aControlId, + TBool aFullScreenFlag, + TBool aShowGuideLine ) + :CTransparentHwrWnd( aRect, aUiLayout, aControlId, aFullScreenFlag ), + iShowGuideLine( aShowGuideLine ), iGuideLineStyle( EGuideLineNone ), + iGuideLineColor( TRgb(0) ), iGuideLineWidth( 1 ), iEnableFade( EFalse ) + { + + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::~CTransparentHwrWndExt +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CTransparentHwrWndExt* CTransparentHwrWndExt::NewL( const TRect& aRect, + CFepUiLayout* aUiLayout, + TInt aControlId, + TBool aFullScreenFlag, + TBool aShowGuideLine ) + { + CTransparentHwrWndExt* wnd=new (ELeave) CTransparentHwrWndExt( aRect, + aUiLayout, + aControlId, + aFullScreenFlag, + aShowGuideLine ); + CleanupStack::PushL(wnd); + wnd->ConstructL (); + CleanupStack::Pop(wnd); + return wnd; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::ConstructL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::ConstructL() + { + iStrokeEndMark=TPoint(0xffff,0); + iFadeTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + // Construct GS CenRep + if(iGSRepository == NULL) + { + TRAP_IGNORE(iGSRepository + = CRepository::NewL(KCRUidPersonalizationSettings) ); + } + TInt newValue = 3; + if ( iGSRepository ) + { + iGSRepository->Get( KSettingsWritingSpeed, newValue ); + } + SetFadingSpeed(newValue); + iFadeBeginPos = Rect().iTl.iX; + iFadeEndPos = Rect().iTl.iX; + CHwrWndBase::ConstructL(); + } +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::~CTransparentHwrWndExt +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CTransparentHwrWndExt::~CTransparentHwrWndExt() + { + iListOfShownPoints.Close(); + delete iFadeTimer; + delete iGSRepository; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::HideGuideLine +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::HideGuideLine( TBool aHideFlag ) + { + iShowGuideLine = aHideFlag; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::SetTopGuideLinePosition +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::SetTopGuideLinePosition( const TPoint& aLeftTop, + const TPoint& aRightBottom ) + { + iTlOfTopGuideLine = aLeftTop; + iBrOfTopGuideLine = aRightBottom; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::SetBottomGuideLinePosition +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::SetBottomGuideLinePosition( const TPoint& aLeftTop, + const TPoint& aRightBottom ) + { + iTlOfBottomGuideLine = aLeftTop; + iBrOfBottomGuideLine = aRightBottom; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::SetGuideLineStyle +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::SetGuideLineStyle( TInt aGuideLineStyle ) + { + iGuideLineStyle = aGuideLineStyle; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::RefreshUI +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::RefreshUI() + { + if( !Hiden() ) + { + Draw(); + UpdateArea(Rect(), ETrue); + } + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::SetGuideLineColor +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::SetGuideLineColor( const TRgb& aColor ) + { + iGuideLineColor = aColor; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::SetGuideLineWidth +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::SetGuideLineWidth( TInt aWidth ) + { + iGuideLineWidth = aWidth; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::Draw +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::Draw() + { + //if(Hiden() || !Ready() || !UiLayout()->LayoutReady()) + // return; + if(!AbleToDraw()) + return; + CTransparentHwrWnd::Draw(); + + if ( iShowGuideLine && iShowGuideLine != EGuideLineNone ) + { + DrawGuidingLine(); + } + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::DrawStroke +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C TRect CTransparentHwrWndExt::DrawStroke(TBool aDrawFlag) + { + TRect DirtyRect; + if(iListOfShownPoints.Count()) + { + TRect rect; + TPoint pt; + TPoint prevPt; + + TBool beginStroke = ETrue; + for(TInt i=0;i (BitGc()); + + gc->Activate( BitmapDevice() ); + gc->SetPenSize( PenSize()); + if(aDrawFlag) + gc->SetPenColor( PenColor() ); + else //erase the point + gc->SetPenColor( BkColor()); + gc->Plot( aPoint ); + gc->RectDrawnTo(affectedRect); //get the affected rect since last draw + + TRect maskRect; + + gc->Activate( MaskBitmapDevice()); + if ( ( aPoint.iX > iFadeBeginPos ) && ( aPoint.iX <= iFadeEndPos ) ) + { + + TRgb rgb( 128 - TransparencyFactor()/2, + 128 - TransparencyFactor()/2, + 128 - TransparencyFactor()/2 ); + gc->SetPenColor( rgb ); + } + else + { + gc->SetPenColor( KOpaqueColor ); + } + //use same color to get opague point + gc->Plot( aPoint ); + gc->RectDrawnTo(maskRect); + + affectedRect.BoundingRect(maskRect); //find the bounding rect + //if(!TraceOutsideWindowFlag()) + affectedRect.Intersection(iRect); //drawing not allowed outside of + + } + return affectedRect; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::DrawLine +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TRect CTransparentHwrWndExt::DrawLine(const TPoint& aPt1,const TPoint& aPt2,TBool aDrawFlag) + { + TRect affectedRect(0,0,0,0); + { + CFbsBitGc* gc= static_cast (BitGc()); + + gc->Activate( BitmapDevice() ); + gc->SetClippingRect(Rect()); + gc->SetPenSize( PenSize()); + if(aDrawFlag) + gc->SetPenColor( PenColor() ); + else + gc->SetPenColor( BkColor()); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->DrawLine( aPt1,aPt2 ); + + gc->RectDrawnTo(affectedRect); //get the affected rect since last draw + gc->CancelClippingRect(); + + TRect maskRect; + + gc->Activate( MaskBitmapDevice() ); + gc->SetClippingRect(Rect()); + if ( ( Min(aPt1.iX, aPt2.iX) > iFadeBeginPos ) && + ( Max(aPt1.iX, aPt2.iX) <= iFadeEndPos ) ) + { + TRgb rgb( 128 - TransparencyFactor()/2, + 128 - TransparencyFactor()/2, + 128 - TransparencyFactor()/2 ) ; + gc->SetPenColor( rgb ); +// gc->SetPenColor( KRgbRed ); + } + else + { + gc->SetPenColor( KOpaqueColor ); + } + + //use same color as in bitmap to get opague line + //gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->DrawLine( aPt1,aPt2 ); + gc->RectDrawnTo(maskRect); + + //affectedRect.BoundingRect(maskRect); //find the bounding rect +/* if(!iTraceOutsideWindowFlag) + { + TRect r = affectedRect; + affectedRect.Intersection(iRect); //drawing not allowed outside of + + }*/ + gc->CancelClippingRect(); + } + return affectedRect; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::OnDeActivate +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::OnDeActivate() + { + CHwrWndBase::OnDeActivate(); + iFadeTimer->Cancel(); + iListOfShownPoints.Reset(); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::OnLayoutDraggingStart +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CTransparentHwrWndExt::OnLayoutDraggingStart() + { + iFadeTimer->Cancel(); + iListOfShownPoints.Reset(); + CHwrWndBase::OnLayoutDraggingStart(); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::EndStrokeAndClearL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CTransparentHwrWndExt::EndStrokeAndClearL() + { + iFadeTimer->Cancel(); + iListOfShownPoints.Reset(); + iFadeBeginPos = Rect().iTl.iX; + iFadeEndPos = Rect().iTl.iX; + CHwrWndBase::EndStrokeAndClearL(); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::CancelPointerDownL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CTransparentHwrWndExt::CancelPointerDownL() + { + if( !PointerDown() ) + { + return; + } + //allow pen up in other control. Do us normal pen up + if( iListOfShownPoints.Count() > 0 ) + { + iListOfShownPoints.AppendL(iStrokeEndMark); + iFadeTimer->Cancel(); + } + + CHwrWndBase::CancelPointerDownL(); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::HandlePointerDownEventL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CTransparentHwrWndExt::HandlePointerDownEventL(const TPoint& aPoint) + { + iListOfShownPoints.AppendL(aPoint); + iFadeMaxPos = aPoint.iX; + + if ( aPoint.iX < iFadeEndPos ) + { + iFadeTimer->Cancel(); + EndStrokeAndClearL(); + } + if( !iFadeTimer->IsActive() && iEnableFade) + { + iFadeTimer->Start( iFadeBeginTime, iFadeIntervalTime, TCallBack( UpdateShownArea, this ) ); + } + + return CTransparentHwrWnd::HandlePointerDownEventL(aPoint); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::HandlePointerMoveEventL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CTransparentHwrWndExt::HandlePointerMoveEventL(const TPoint& aPoint) + { + if(!PointerDown()) + return this; + + iListOfShownPoints.AppendL(aPoint); + + if( aPoint.iX < iFadeMaxPos ) + { + iFadeMaxPos = aPoint.iX; + } + + return CTransparentHwrWnd::HandlePointerMoveEventL(aPoint); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::HandlePointerUpEventL +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C CFepUiBaseCtrl* CTransparentHwrWndExt::HandlePointerUpEventL(const TPoint& aPoint) + { + iListOfShownPoints.AppendL(iStrokeEndMark); + iFadeMaxPos = Rect().iBr.iX; + return CTransparentHwrWnd::HandlePointerUpEventL(aPoint); + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::UpdateShownArea +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CTransparentHwrWndExt::UpdateShownArea( TAny* aAny ) + { + CTransparentHwrWndExt* self = static_cast(aAny); + self->DoUpdateShownArea(); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CTransparentHwrWndExt::DoUpdateShownArea +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CTransparentHwrWndExt::DoUpdateShownArea() + { + iFadeBeginPos = iFadeEndPos > iFadeMaxPos ? iFadeMaxPos : iFadeEndPos; + iFadeEndPos = iFadeBeginPos + Rect().Width()/KFadeAreaCount; + iFadeEndPos = iFadeEndPos > iFadeMaxPos ? iFadeMaxPos : iFadeEndPos; + + TRect eraseRect(Rect()); + eraseRect.iTl.iX = eraseRect.iBr.iX = iFadeBeginPos; + + for( TInt i = iListOfShownPoints.Count()-1; i >= 0; i-- ) + { + if ( iListOfShownPoints[i].iX <= iFadeBeginPos ) + { + if( iListOfShownPoints[i].iX < eraseRect.iTl.iX ) + { + eraseRect.iTl.iX = iListOfShownPoints[i].iX; + } + iListOfShownPoints.Remove(i); + } + } + eraseRect.iTl.iX -= PenSize().iWidth; + eraseRect.iBr.iX += PenSize().iWidth; + Draw(); + UpdateArea( eraseRect, EFalse ); + } + +EXPORT_C void CTransparentHwrWndExt::CancelCharWriting() + { + iFadeTimer->Cancel(); + iListOfShownPoints.Reset(); + iFadeBeginPos = Rect().iTl.iX; + iFadeEndPos = Rect().iTl.iX; + CHwrWndBase::CancelCharWriting(); + } + +void CTransparentHwrWndExt::DrawGuidingLine() + { + CFbsBitGc* gc= static_cast ( BitGc() ); + + gc->Activate( MaskBitmapDevice() ); + gc->SetPenSize( TSize( iGuideLineWidth, iGuideLineWidth ) ); + gc->SetPenColor( KOpaqueColor ); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + + switch ( iGuideLineStyle ) + { + case EGuideLineTop: + { + gc->DrawLine( iTlOfTopGuideLine, iBrOfTopGuideLine ); + } + break; + case EGuideLineBottom: + { + gc->DrawLine( iTlOfBottomGuideLine, iBrOfBottomGuideLine ); + } + break; + case EGuideLineBoth: + { + gc->DrawLine( iTlOfTopGuideLine, iBrOfTopGuideLine ); + gc->DrawLine( iTlOfBottomGuideLine, iBrOfBottomGuideLine ); + } + break; + default: + // Do nothing + break; + } + + gc->Activate( BitmapDevice() ); + gc->SetPenSize( TSize( iGuideLineWidth, iGuideLineWidth ) ); + gc->SetPenColor( iGuideLineColor ); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + + switch ( iGuideLineStyle ) + { + case EGuideLineTop: + { + gc->DrawLine( iTlOfTopGuideLine, iBrOfTopGuideLine ); + } + break; + case EGuideLineBottom: + { + gc->DrawLine( iTlOfBottomGuideLine, iBrOfBottomGuideLine ); + } + break; + case EGuideLineBoth: + { + gc->DrawLine( iTlOfTopGuideLine, iBrOfTopGuideLine ); + gc->DrawLine( iTlOfBottomGuideLine, iBrOfBottomGuideLine ); + } + break; + default: + // Do nothing + break; + } + } +// end of file +