diff -r 000000000000 -r eb1f2e154e89 fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/insertionpoint.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/insertionpoint.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,246 @@ +/* +* Copyright (c) 2009 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: +* +*/ + + +#include "insertionpoint.h" +#include "aknfepchineseuidataconv.h" + +//Cursor position offset +const TInt KCursorPosCorrectionX = 0; +//define the timer +const TInt KTimer = 500000; + +// --------------------------------------------------------- +// Cancel and destroy. +// --------------------------------------------------------- +CInsertionPoint::~CInsertionPoint() + { + Cancel(); // Cancel any request, if outstanding + iTimer.Close(); // Destroy the RTimer object + // Delete instance variables if any + } + +// --------------------------------------------------------- +// NewL function. +// --------------------------------------------------------- +CInsertionPoint* CInsertionPoint::NewL( CAknFepUiLayoutDataMgr* aLafDataMgr ) + { + CInsertionPoint* self = CInsertionPoint::NewLC( aLafDataMgr ); + CleanupStack::Pop( self ); // self; + return self; + } + +// --------------------------------------------------------- +// NewLC funciton. +// --------------------------------------------------------- +CInsertionPoint* CInsertionPoint::NewLC( CAknFepUiLayoutDataMgr* aLafDataMgr ) + { + CInsertionPoint* self = new ( ELeave ) CInsertionPoint( aLafDataMgr ); + CleanupStack::PushL( self ) ; + self->ConstructL(); + return self; + } + +// --------------------------------------------------------- +// Set iRefreshObserver member. +// --------------------------------------------------------- +void CInsertionPoint::SetRefreshObserver(MRefreshObserver* aObserver) + { + iRefreshObserver = aObserver; + } + +// --------------------------------------------------------- +// Set the position of cursor. +// --------------------------------------------------------- +void CInsertionPoint::SetPosition(TInt aOffSet) + { + iOffSet = aOffSet; + isVisible = ETrue; + iRefreshObserver->Refresh(); + TPoint point(iTextRect.iTl.iX -1 + iOffSet + KCursorPosCorrectionX, + iCursorRect.iTl.iY); + iCursorRect = TRect(point, TSize(iWidth, iHeight) ) ; + } + +// --------------------------------------------------------- +// Set the rect where visual text will be displayed. +// --------------------------------------------------------- +void CInsertionPoint::SetTextRect(TRect aRect) + { + iTextRect = aRect; + TPoint point(iTextRect.iTl.iX + iOffSet + KCursorPosCorrectionX, + iCursorRect.iTl.iY); + iCursorRect = TRect(point, TSize(iWidth, iHeight) ) ; + if ( 0 == iHeight ) + { + iHeight = + CAknFepChineseUIDataConv::AnyToInt( iLafDataMgr->RequestData(EEEPCursorHeight)); + iWidth = 1; + } + } + +// --------------------------------------------------------- +// Set the height of cursor. +// --------------------------------------------------------- +void CInsertionPoint::SetHeight() + { + TPoint point(iTextRect.iTl.iX + iOffSet + KCursorPosCorrectionX, + iTextRect.iTl.iY - 1 + iTextRect.Height() / 2 - iHeight / 2); + iCursorRect = TRect(point, TSize(iWidth, iHeight) ) ; + } + +// --------------------------------------------------------- +// Draw the cursor on the screen. +// --------------------------------------------------------- +void CInsertionPoint::Draw(CWindowGc& aGc) + { + if (isActive) + { + if ( !this->isVisible) + { + return; + } + else + { + aGc.SetBrushStyle(CGraphicsContext::ESolidBrush) ; + aGc.SetBrushColor(iActiveBrushColor) ; + aGc.SetPenColor(iActivePenColor) ; + aGc.SetPenStyle(CGraphicsContext::ESolidPen) ; + aGc.SetPenSize(TSize( 1, 1) ) ; + aGc.DrawRect(iCursorRect) ; + aGc.SetBrushStyle(CGraphicsContext::ENullBrush) ; + } + } + else + { + aGc.SetBrushStyle(CGraphicsContext::ESolidBrush) ; + aGc.SetBrushColor(iInactiveBrushColor) ; + aGc.SetPenColor(iInactivePenColor) ; + aGc.SetPenStyle(CGraphicsContext::ESolidPen) ; + aGc.SetPenSize(TSize( 1, 1) ) ; + aGc.DrawRect(iCursorRect) ; + aGc.SetBrushStyle(CGraphicsContext::ENullBrush) ; + } + } + +// --------------------------------------------------------- +// Active the cursor into active state. +// --------------------------------------------------------- +void CInsertionPoint::Active() + { + Cancel(); + iTimer.Cancel(); + iTimer.After(iStatus, KTimer); // Set for 1 sec later + SetActive(); // Tell scheduler a request is active + isActive = ETrue; + this->iRefreshObserver->Refresh(); + } + +// --------------------------------------------------------- +// Deactive the cursor into deactive state. +// --------------------------------------------------------- +void CInsertionPoint::Deactive() + { + Cancel(); + isActive = EFalse; + this->iRefreshObserver->Refresh(); + } + +// --------------------------------------------------------- +// Insertion Point. +// --------------------------------------------------------- +CInsertionPoint::CInsertionPoint( CAknFepUiLayoutDataMgr* aLafDataMgr ) : + CActive(EPriorityStandard) + { + iState = EUninitialized; + isVisible = ETrue; + iHeight = 0; + iWidth = 0; + iOffSet = 0; + isActive = EFalse; + iRefreshObserver = NULL; + iLafDataMgr = aLafDataMgr; + } + +// --------------------------------------------------------- +// Two-phrase constructor. +// --------------------------------------------------------- +void CInsertionPoint::ConstructL() + { + User::LeaveIfError(iTimer.CreateLocal() ) ; // Initialize timer + CActiveScheduler::Add( this); // Add to scheduler + iActiveBrushColor = KRgbBlack; + iActivePenColor = KRgbBlack; + iInactiveBrushColor = KRgbGray; + iInactivePenColor = KRgbGray; + } + +// --------------------------------------------------------- +// The callback function used by CActiveScheduler. +// --------------------------------------------------------- +void CInsertionPoint::RunL() + { + if (iState == EUninitialized) + { + // Do something the first time RunL() is called + iState = EInitialized; + } + else + if (iState != EError) + { + // Do something + isVisible = isVisible ? EFalse : ETrue; + if (iRefreshObserver) + { + this->iRefreshObserver->Refresh(); + } + } + + iTimer.Cancel(); + iTimer.After( iStatus, KTimer ) ; // Set for 1 sec later + SetActive(); // Tell scheduler a request is active + } + +// --------------------------------------------------------- +// How to cancel me. +// --------------------------------------------------------- +void CInsertionPoint::DoCancel() + { + iTimer.Cancel(); + } + +// --------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------- +TInt CInsertionPoint::RunError(TInt aError) + { + return aError; + } + +// --------------------------------------------------------- +// Start the cursor with glint if actived or with gray color if deactived. +// --------------------------------------------------------- +void CInsertionPoint::StartL( TTimeIntervalMicroSeconds32 aDelay ) + { + Cancel(); // Cancel any request, just to be sure + iState = EUninitialized; + iTimer.Cancel(); + iTimer.After(iStatus, aDelay) ; // Set for later + SetActive(); // Tell scheduler a request is active + } + +// End of file