diff -r 000000000000 -r eb1f2e154e89 textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutcursor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputarc/src/peninputlayoutcontrol/peninputlayoutcursor.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,450 @@ +/* +* Copyright (c) 2005-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: Implementation for insertion point +* +*/ + + + +#include "peninputlayoutcursor.h" +#include "peninputlayouteditareabase.h" +#include "peninputlayouttimer.h" +#include "peninputlayoutrootctrl.h" + +const TInt KDefaultCursorHeight = 10; +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CFepUiCursor::CFepUiCursor +// C++ default constructor can NOT contain any code, that might leave +// --------------------------------------------------------------------------- +// +CFepUiCursor::CFepUiCursor(const TRect& aRect,CFepUiLayout* aUiLayout,TInt aId) + :CFepUiBaseCtrl(aRect,aUiLayout,aId), + iPosition(0, 0), + iHeight(KDefaultCursorHeight), + iIsOn(EFalse), + iIsVisible(EFalse), + //iEditor(aOwner), + //iBitmapDevice(aBitmapDevice), + //iGc(aGc), + iCursorTempDisabled(EFalse) + { + SetControlType(ECtrlCursor); + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CFepUiCursor::ConstructL() + { + CFepUiBaseCtrl::BaseConstructL(); + iCursorBlinkingTimer = CPeriodic::NewL(CActive::EPriorityStandard); + iRestoreCursorTimer = CLayoutTimer::NewL(this,CLayoutTimer::EOthers); + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::NewL +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CFepUiCursor* CFepUiCursor::NewL(const TRect& aRect,CFepUiLayout* aUiLayout,TInt aId) + { + CFepUiCursor* self = new(ELeave) CFepUiCursor(aRect, aUiLayout,aId); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); // insertionPoint + return self; + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::~CFepUiCursor +// Destructor +// --------------------------------------------------------------------------- +// +CFepUiCursor::~CFepUiCursor() + { + if(iCursorBlinkingTimer) + { + iCursorBlinkingTimer->Cancel(); + delete iCursorBlinkingTimer; + } + + delete iRestoreCursorTimer; + } + + +// --------------------------------------------------------------------------- +// CFepUiCursor::SetPosition +// Sets the position of the sprite if it has been turned on +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepUiCursor::SetPosition(const TPoint& aPosition) + { + + TBool isOn = iIsOn; + if (isOn) + { + SetOn(EFalse); + } + iPosition=aPosition; + TPoint correction(KCursorPosCorrectionX,KCursorPosCorrectionY ); + TRect rect = TRect(iPosition + correction , TSize(KCursorWidth,iHeight)); + if(rect != iCursorRect) + { + SetRect(rect); + iCursorRect = rect; + //must update clip region again. + for(TInt i = 0 ; i < RootControl()->PopCtrlList().Count(); ++i) + { + UpdateValidRegion(RootControl()->PopCtrlList()[i],EFalse); + } + } + + if (isOn) + { + SetOn(ETrue); + } + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::Position +// get the cursor position +// --------------------------------------------------------------------------- +// +EXPORT_C TPoint CFepUiCursor::Position() + { + return iPosition; + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::SetLayoutOwner +// Sets the layout owner +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +/*void CFepUiCursor::SetLayoutOwner(MLayoutOwner* aOwner) + { + iLayoutOwner = aOwner; + } +*/ + +// --------------------------------------------------------------------------- +// CFepUiCursor::SetOn +// Turns the sprite on and off +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepUiCursor::SetOn(TBool aOn, TBool aImmediately) + { + //aOn = EFalse; + iIsOn = aOn; + + // If cursor will bee set off and timer is active, Cancel timer + if ( !iIsOn ) + { + CancelDelayCursorShown(); + if ( iCursorBlinkingTimer->IsActive()) + { + iCursorBlinkingTimer->Cancel(); + } + } + else + { + if(iCursorTempDisabled) + { + return; + } + // Activate blinking timer, if it is not already activated + if ( !iCursorBlinkingTimer->IsActive() ) + { + iCursorBlinkingTimer->Start(aImmediately ? 0: KCursorBlinkPerioid, + KCursorBlinkPerioid,TCallBack(CursorBlinkCallBack , this)); + } + } + + // Invalidate InsertionPoint's rect, so it will be removed from editarea + InvalidateInsertionPoint(); + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::SetHeight +// Sets caret height +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepUiCursor::SetHeight(TInt aHeight) + { + if(aHeight > 0 && aHeight != iHeight ) + { + TBool isOn = iIsOn; + if (isOn) + { + SetOn(EFalse); + } + + iHeight = aHeight; + //change the cursor rect + TPoint correction(KCursorPosCorrectionX,KCursorPosCorrectionY ); + iCursorRect = TRect(iPosition + correction , + TSize(KCursorWidth,iHeight)); + if (isOn) + { + SetOn(ETrue); + } + } + + } + +EXPORT_C void CFepUiCursor::ReDraw(TBool aReset) + { + if(aReset) + iIsVisible = EFalse; + Draw(); + UpdateArea(iCursorRect,EFalse); + } + + +// --------------------------------------------------------------------------- +// CFepUiCursor::Draw +// Draws insertion point's Rect and starts blinking timer +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CFepUiCursor::Draw()//CBitmapContext* aGc, TBool aReset) + { + if(!AbleToDraw()) + { + return; + } + + /*if (aReset) + { + iIsVisible = EFalse; + } + */ + + CFbsBitGc* gc = static_cast(BitGc()); + gc->Activate( BitmapDevice()); + if(iIsOn) + { + // draw cursor by inverting colors in the selected text rectancle + gc->SetClippingRegion(ValidClipRegion()); + + gc->SetBrushStyle(CGraphicsContext::ESolidBrush); + gc->SetBrushColor(KRgbBlack); + gc->SetDrawMode(CGraphicsContext::EDrawModeNOTSCREEN); + + gc->SetPenColor(KRgbBlack); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->SetPenSize( TSize(1,1)); + + // When the blink timer out and cursor is visible, do nothing + // else draw the cursor and set the visible flag + gc->DrawRect(iCursorRect); + iIsVisible = !iIsVisible; + + // restore normal draw mode + gc->SetDrawMode(CGraphicsContext::EDrawModePEN); + gc->SetBrushStyle(CGraphicsContext::ENullBrush); + + //if (iEditor) + { + // iEditor->UpdateArea(iCursorRect,EFalse); + } + + // UpdateArea(iCursorRect,EFalse); + } + else + { + if(iIsVisible) //only do when already shown + { + //CFbsBitmapDevice* bitmapDevice = iEditor->BitmapDevice(); + //static_cast(gc)->Activate(iBitmapDevice); + gc->SetClippingRegion(ValidClipRegion()); + gc->SetPenColor(KRgbBlack); + gc->SetBrushStyle(CGraphicsContext::ESolidBrush); + gc->SetBrushColor(KRgbBlack); + gc->SetDrawMode(CGraphicsContext::EDrawModeNOTSCREEN); + gc->SetPenStyle(CGraphicsContext::ESolidPen); + gc->SetPenSize( TSize(1,1)); + gc->DrawRect(iCursorRect); + + // restore normal draw mode + gc->SetDrawMode(CGraphicsContext::EDrawModePEN); + gc->SetBrushStyle(CGraphicsContext::ENullBrush); + + iIsVisible = EFalse; + + /*if (iEditor) + { + iEditor->UpdateArea(iCursorRect,EFalse); + }*/ + // UpdateArea(iCursorRect,EFalse); + } + } + gc->CancelClippingRegion(); + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::CursorBlinkCallBack +// Invalidates cursor rect, when timer gets out. +// With periodic caused draw/undraw of cursor will cause cursor blinking +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CFepUiCursor::CursorBlinkCallBack(TAny *aPtr) + { + CFepUiCursor* self = static_cast(aPtr); + + self->InvalidateInsertionPoint(); + + return(ETrue); + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::InvalidateCursor +// Invalidates InsertionPoint's rect +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CFepUiCursor::InvalidateInsertionPoint() + { + //if(iEditor) + { + Draw(); + UpdateArea(iCursorRect,EFalse); + } + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::DelayCursorWhileDraging +// Disable the cursor while pen is draging +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepUiCursor::DelayCursorWhileDraging() + { + DelayCursorShown(); + } + +// --------------------------------------------------------------------------- +// CFepUiCursor::DelayCursorShown +// Disable the cursor while pen is draging +// (other items were commented in a header). +// --------------------------------------------------------------------------- +EXPORT_C void CFepUiCursor::DelayCursorShown() + { + if(!iIsOn && !iCursorTempDisabled) // do nothing is cursor is off + return; + + if(!iCursorTempDisabled) + { + SetOn(EFalse); // disable the cursor + iCursorTempDisabled = ETrue; + } + iRestoreCursorTimer->SetTimer(KCursorBlinkPerioid); + } +// --------------------------------------------------------------------------- +// cancel delay shown process +// --------------------------------------------------------------------------- +// +void CFepUiCursor::CancelDelayCursorShown() + { + iRestoreCursorTimer->Cancel(); + iCursorTempDisabled = EFalse; + } +// --------------------------------------------------------------------------- +// CFepUiCursor::HandleTimerOut +// Set the cursor on +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CFepUiCursor::HandleTimerOut(TInt /*aTimeType*/) + { + iCursorTempDisabled = EFalse; + iIsOn = ETrue; + //To avoid the ugly first shown, we draw the cursor directly here. + InvalidateInsertionPoint(); + SetOn(ETrue, EFalse); + } + + +// --------------------------------------------------------------------------- +// CFepUiCursor::UpdateValidRegion +// Update control's valid region when other control show or hide. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +EXPORT_C void CFepUiCursor::UpdateValidRegion(CFepUiBaseCtrl* aCtrl,TBool aRemoveFlag) + { + if(!iUpdateFlagEnabled) + return; + + if(aRemoveFlag) + { + } + else + { + if(aCtrl->Hiden()) + return; + TRect rect = Rect(); + rect.Intersection(aCtrl->Rect()); + iValidRegion.SubRect(rect); + iClipRegion.SubRect(rect); + } + //iValidRegion.AddRect(iRect); + return; + } + +TInt CFepUiCursor::OrderPos() + { + TInt ret = 0; + TRAP_IGNORE(ret = OrderPosL()); + return ret; + } + +TInt CFepUiCursor::OrderPosL() + { + __ASSERT_DEBUG(iEditor,User::Leave(EUiCursorNoOwner)); + return iEditor->OrderPos(); + } + + +void CFepUiCursor::ResetValidClipRegion() + { + iValidRegion.Clear(); + iClipRegion.Clear(); + iValidRegion.AddRect(iRect); + iClipRegion.AddRect(iRect); + } + +void CFepUiCursor::UpdateCursorArea(const TRect& aRect, TBool aFlag) + { + CFepUiBaseCtrl* parent = iEditor->ParentCtrl(); + + if(parent) + { + if(parent->IsKindOfControl(ECtrlControlGroup)) + static_cast(parent)->UpdateAreaInGrp(iEditor,aRect,aFlag); + else + iEditor->ParentCtrl()->UpdateArea(aRect,aFlag); + } + else + UpdateArea(aRect,aFlag); + } +// End of File