fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/insertionpoint.cpp
changeset 0 eb1f2e154e89
--- /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