imageeditor/plugins/TextPlugin/src/ImageEditorTextControl.cpp
changeset 1 edfc90759b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/plugins/TextPlugin/src/ImageEditorTextControl.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,1600 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "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:
+* Ixonos Plc
+*
+* Description: 
+* Image Editor text plugin control class.
+*
+*/
+
+
+//  INCLUDES
+#include <fbs.h>
+#include <badesca.h>
+#include <gdi.h>
+#include <eikenv.h>
+#include <bitdev.h>
+#include <e32math.h>
+
+#include <aknview.h>
+#include <aknutils.h>
+#include <AknBidiTextUtils.h>
+
+#include <ImageEditorUI.mbg>
+#include <AknInfoPopupNoteController.h> 
+#include <text.rsg> 
+#include <bautils.h> 
+#include <ConeResLoader.h> 
+#include <gulalign.h>
+#include <csxhelp/sie.hlp.hrh>
+
+#ifdef RD_TACTILE_FEEDBACK 
+#include <touchfeedback.h>
+#endif /* RD_TACTILE_FEEDBACK  */
+
+#include "ImageEditorUI.hrh"
+#include "ImageEditorPluginBase.hrh"
+#include "text.hrh"
+#include "PluginInfo.h"
+#include "JpTimer.h"
+#include "ImageEditorUids.hrh"
+#include "ImageEditorUiDefs.h"
+#include "SystemParameters.h"
+
+#include "ImageEditorTextControl.h"
+#include "iepb.h" 
+
+// debug log
+#include "imageeditordebugutils.h"
+_LIT(KTextPluginLogFile,"TextPlugin.log");
+
+// resource file name
+_LIT (KPgnResourceFile, "text.rsc");
+
+
+//  CONSTANTS
+const TInt KWait			    	= 1;
+
+const TInt KPosParamStep            = 8;
+
+const TInt KScaleParamStep      	= 10;
+
+const TInt KDegreeMultiplier        = 1000;
+const TInt KAngleParamMax		    = 359000;
+const TInt KAngleParam90Deg         = 90000;
+const TInt KAngleParamDef		    = 0;
+const TInt KAngleParamStep		    = 2000;
+const TInt KTouchScaleMaxStepCount  = 20;
+
+const TInt KMaxColumns		    	= 100;
+const TInt KMaxRows 			    = 10;
+
+const TInt KLogicalFontInUse        = EAknLogicalFontTitleFont;
+
+//	RESOURCE INDICES
+const TInt KMainTextIndex		= 1;
+const TInt KMoveTextIndex		= 2;
+const TInt KResizeTextIndex		= 3;
+const TInt KRotateTextIndex		= 4;
+
+_LIT(KEmptyString, " ");
+
+//=============================================================================
+CImageEditorTextControl * CImageEditorTextControl::NewL (
+	const TRect &		aRect,
+	CCoeControl	*		aParent
+	)
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::NewL()");
+
+    CImageEditorTextControl * self = new (ELeave) CImageEditorTextControl;
+    CleanupStack::PushL (self);
+    self->ConstructL (aRect, aParent);
+    CleanupStack::Pop ();   // self
+    return self;
+}
+
+//=============================================================================
+CImageEditorTextControl::CImageEditorTextControl () : 
+iState (EInsertTextStateFirst),
+iTickCount (0),
+iNaviStepMultiplier (KDefaultSmallNavigationStepMultiplier),
+iDisplayingOkOptionsMenu (EFalse),
+iReadyToRender (EFalse),
+iResLoader ( * CEikonEnv::Static() )
+{
+	  
+}
+
+//=============================================================================
+CImageEditorTextControl::~CImageEditorTextControl ()
+{
+    delete iTimer;
+    iTimer = NULL;
+    delete iIndicator;
+    iIndicator = NULL;
+    delete iIndicatorMask;
+    iIndicatorMask = NULL;
+    iEditorView = NULL;
+    iItem = NULL;
+    iParent = NULL;
+    iSysPars = NULL;
+	delete iPopupController;
+	delete iTooltipResize;
+	delete iTooltipMove;
+	delete iTooltipRotate;
+	iResLoader.Close();
+}
+
+//=============================================================================
+void CImageEditorTextControl::ConstructL (
+	const TRect &		/*aRect*/,
+	CCoeControl	*		aParent
+	)
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::ConstructL()");
+
+	//	Set parent window
+	SetContainerWindowL (*aParent);
+    iParent = aParent;
+    
+    //  Create resource utility
+	TFileName resFile;
+	resFile.Append(KPgnResourcePath);
+	resFile.Append(KPgnResourceFile);
+
+    User::LeaveIfError( CompleteWithAppPath( resFile ) );
+    // Implementation of RConeResourceLoader uses BaflUtils::NearestLanguageFile 
+    // to search for a localised resource in proper search order
+    iResLoader.OpenL ( resFile );
+    
+	//	Create timer for fast key repeat
+	iTimer = CJPTimer::NewL( this );
+
+	iPopupController = CAknInfoPopupNoteController::NewL();    
+	
+	TFileName resourcefile;
+	resourcefile.Append(KPgnResourcePath);
+	resourcefile.Append(KPgnResourceFile);
+    User::LeaveIfError( CompleteWithAppPath( resourcefile ) );
+
+    //	Read tooltip resources  
+    //  (RConeResourceLoader selects the language using BaflUtils::NearestLanguageFile)
+    RConeResourceLoader resLoader ( *CEikonEnv::Static() );
+    CleanupClosePushL ( resLoader );
+		resLoader.OpenL ( resourcefile );
+	
+		iTooltipResize = CEikonEnv::Static()->AllocReadResourceL(R_TOOLTIP_TEXT_RESIZE);    
+		iTooltipMove = CEikonEnv::Static()->AllocReadResourceL(R_TOOLTIP_TEXT_MOVE);    
+		iTooltipRotate = CEikonEnv::Static()->AllocReadResourceL(R_TOOLTIP_TEXT_ROTATE);          
+    CleanupStack::PopAndDestroy(); // resLoader	
+
+#ifdef RD_TACTILE_FEEDBACK 
+    iTouchFeedBack = MTouchFeedback::Instance();
+#endif /* RD_TACTILE_FEEDBACK  */
+    
+    EnableDragEvents();
+        
+	//	Activate control
+    ActivateL();
+}
+
+//=============================================================================
+void CImageEditorTextControl::SetView (CAknView * aView)
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::SetView()");
+    iEditorView = aView;
+}
+
+//=============================================================================
+void CImageEditorTextControl::SetSelectedUiItemL (CPluginInfo * aItem)
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::SetSelectedUiItemL()");
+    iItem = aItem;
+    iNaviPaneText.Copy ( KEmptyString );
+    iEditorView->HandleCommandL (EImageEditorCmdRender);
+}
+
+//=============================================================================
+TKeyResponse CImageEditorTextControl::OfferKeyEventL (
+    const TKeyEvent &   aKeyEvent,
+    TEventCode          aType
+    )
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::OfferKeyEventL()");
+
+    TKeyResponse response = EKeyWasNotConsumed;
+
+    //  If busy, do not handle anything
+    if ( Busy() )
+    {
+        response = EKeyWasConsumed;
+    }
+
+    // In main state handle the OK Options menu
+    else if ( aKeyEvent.iCode == EKeyOK &&
+        (iState == EInsertTextStateMain || iState == EInsertTextStateFirst ) )
+    {
+        iDisplayingOkOptionsMenu = ETrue;
+        iEditorView->HandleCommandL (EImageEditorTryDisplayMenuBar);
+        response = EKeyWasConsumed;
+    }
+
+    //  We handle only event keys
+    else if (EEventKey == aType)
+    {
+
+		switch (aKeyEvent.iCode)
+		{
+		
+			case EKeyDownArrow:
+			case EKeyUpArrow:
+			case EKeyRightArrow:
+            case EKeyLeftArrow:
+			{
+				response = EKeyWasConsumed;
+                break;
+			}
+		
+            case EKeyOK:
+            {
+                if (iState == EInsertTextStateMove || 
+                    iState == EInsertTextStateRotate  ||
+                    iState == EInsertTextStateResize)
+                {
+                    ToMainStateL();
+                    response = EKeyWasConsumed;
+                }
+                break;
+            }
+            
+            case EKeyEnter:
+            {   
+                if (iState == EInsertTextStateMove || 
+                    iState == EInsertTextStateRotate  ||
+                    iState == EInsertTextStateResize)
+                {   
+                    iPopupController->HideInfoPopupNote();
+                    ToMainStateL();
+                }
+                else if ( iState == EInsertTextStateMain )
+                {
+                    // Show context sensitive menu
+        			iEditorView->HandleCommandL( EImageEditorOpenContextMenu );
+                }
+                response = EKeyWasConsumed;
+                break;                
+    			    
+            }
+            
+            case 0x31: // 1		    			    
+		    {
+		        // Rotate only in rotate state
+                if ( iState == EInsertTextStateRotate )
+				{
+                    iAngle -= KAngleParam90Deg;
+                    StoreParameters();
+    	            TRAP_IGNORE( iEditorView->HandleCommandL (EImageEditorCmdRender) );
+				}
+	    		break;
+		    }
+		    
+		    case 0x33: // 3		    			    
+		    {   
+		        // Rotate only in rotate state
+		        if ( iState == EInsertTextStateRotate )
+				{
+                    iAngle += KAngleParam90Deg;
+                    StoreParameters();
+    	            TRAP_IGNORE( iEditorView->HandleCommandL (EImageEditorCmdRender) );
+				}				
+	    		break;
+		    }
+		    
+		    case 0x30: // 0		    		    
+		    case 0x32: // 2
+		    case 0x34: // 4
+		    case 0x35: // 5
+		    case 0x36: // 6
+		    case 0x38: // 8
+			case EStdKeyIncVolume: // zoom in key
+			case EStdKeyDecVolume: // zoom out key
+			case 0x2a: // *	
+			case 0x23: // #	
+		    {
+		    	StorePosAndScaleRelScreen();
+		    	break;
+		    }
+
+			default:
+			{
+				break;
+			}
+		}
+	}
+
+	//	Key pressed down, mark pressed key
+	else if (aType == EEventKeyDown)
+	{
+		switch (aKeyEvent.iScanCode)
+		{
+			case EStdKeyUpArrow:
+			{
+				iKeyCode = 1;
+			    response = EKeyWasConsumed;
+				break;
+			}
+			case EStdKeyDownArrow:
+			{
+				iKeyCode = 2;
+			    response = EKeyWasConsumed;
+				break;
+			}
+			case EStdKeyLeftArrow:
+			{
+				iKeyCode = 3;
+			    response = EKeyWasConsumed;
+				break;
+			}
+			case EStdKeyRightArrow:
+			{
+				iKeyCode = 4;
+			    response = EKeyWasConsumed;
+				break;
+			}
+			default:
+			{
+				iKeyCode = 0;
+				break;
+			}
+		}
+
+		if ( iKeyCode != 0 )
+		{
+		    iNaviStepMultiplier = KDefaultSmallNavigationStepMultiplier;
+		    iTickCount = 0;
+			iTimer->Call( KWait );
+		}
+	}
+	
+	//	Key released, mark all keys to zero
+	else if (aType == EEventKeyUp)
+	{
+		switch (aKeyEvent.iScanCode)
+		{
+			case EStdKeyUpArrow:
+			case EStdKeyDownArrow:
+			case EStdKeyLeftArrow:
+			case EStdKeyRightArrow:
+			{
+				iKeyCode = 0;
+			    response = EKeyWasConsumed;
+			    ShowTooltip();
+				break;
+			}
+			default:
+			{
+				iKeyCode = 0;
+				break;
+			}
+		}
+	}
+
+    return response;
+}
+
+//=============================================================================
+void CImageEditorTextControl::SizeChanged()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::SizeChanged()");
+
+}
+
+//=============================================================================
+TDesC & CImageEditorTextControl::GetParam ()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::GetParam()");
+    LOGDES(KTextPluginLogFile, iParam);
+	return iParam;
+}
+
+//=============================================================================
+void CImageEditorTextControl::SetSystemParameters (const CSystemParameters * aPars) 
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::SetSystemParameters()");
+    iSysPars = aPars;
+}
+
+//=============================================================================
+void CImageEditorTextControl::SetTextL (const TDesC & aText)
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::SetTextL()");
+    iText.Copy (aText);
+}
+
+//=============================================================================
+void CImageEditorTextControl::HandlePluginCommandL (const TInt aCommand)
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::HandlePluginCommandL()");
+
+    switch (aCommand) 
+    {
+        case EImageEditorFocusLost:
+        {
+            if (iTimer)
+            {
+                iTimer->Cancel();
+            }
+            break;
+        }
+        case EPgnSoftkeyIdOk:
+        {
+            iPopupController->HideInfoPopupNote();
+            ToMainStateL();
+            break;
+        }
+        case EPgnSoftkeyIdCancel:
+        {
+            iPopupController->HideInfoPopupNote();
+            if (iState == EInsertTextStateMain ||
+                iState == EInsertTextStateFirst)
+                {
+                // Cancel plugin
+                iState = EInsertTextStateMin;
+
+                //  When plug-in is cancelled, delete text buffer.
+                iEditorView->HandleCommandL (EImageEditorCancelPlugin);
+                }
+            else 
+                {
+                // Return to plugin main view
+                RestoreTempParams();
+				StoreParameters();                
+                ToMainStateL();
+                iEditorView->HandleCommandL (EImageEditorCmdRender);
+                }
+            break;
+        }
+        case EPgnSoftkeyIdDone:
+        case ETextPgnMenuCmdDone:
+        {   
+            iPopupController->HideInfoPopupNote();
+            ToMainStateL();
+            iState = EInsertTextStateMin;
+            iEditorView->HandleCommandL (EImageEditorApplyPlugin);
+            break;
+        }
+        case ETextPgnMenuCmdMove:
+        {
+            ToMoveStateL();
+            break;
+        }
+        case ETextPgnMenuCmdResize:
+        {
+            ToResizeStateL();
+            break;
+        }
+        case ETextPgnMenuCmdRotate:
+        {
+            ToRotateStateL();
+            break;
+        }
+        case ETextPgnMenuCmdColor:
+        {                                                               
+            if ( SDrawUtils::LaunchColorSelectionPopupL (iPreview, 
+                                                         Rect(), 
+                                                         iRgb) )
+            {
+            	StoreParameters();
+                iEditorView->HandleCommandL (EImageEditorCmdRender);
+            }
+            break;
+        }
+        case ETextPgnMenuCmdFont:
+        {
+            // Not implemented
+            break;
+        }
+        case ETextPgnMenuCmdCancel:
+        {
+			iReadyToRender = EFalse;
+            iState = EInsertTextStateMin;
+            iEditorView->HandleCommandL (EImageEditorCancelPlugin);
+            break;
+        }
+        case EImageEditorPreGlobalZoomChange:
+        case EImageEditorPreGlobalPanChange:
+        {
+        	StorePosAndScaleRelScreen();
+        	break;
+        }
+        case EImageEditorGlobalZoomChanged:
+        case EImageEditorGlobalPanChanged:
+        {
+			RestorePosAndScaleRelScreen();
+			ClipPosition();
+			StoreParameters();
+            StoreTempParams();
+	    	iEditorView->HandleCommandL (EImageEditorCmdRender);
+
+			DrawNow();
+	        break;
+        }
+        
+        case EImageEditorPreScreenModeChange:
+        {
+			StorePosAndScaleRelImage();
+        	break;
+        }
+        
+        case EImageEditorPostScreenModeChange:
+        {
+			RestorePosAndScaleRelImage();
+			ClipPosition();
+			StoreParameters();
+            StoreTempParams();
+	    	iEditorView->HandleCommandL (EImageEditorCmdRender);
+			DrawNow();
+        	break;
+        }
+
+        default:
+        {
+            break;
+        }
+    }
+}
+
+//=============================================================================
+TInt CImageEditorTextControl::GetSoftkeyIndexL()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::GetSoftkeyIndexL()");
+
+    TInt state = 0;
+
+    if (iState == EInsertTextStateFirst)
+        {
+        state = 0;  // Options - Cancel
+        }
+    else if (iState == EInsertTextStateMove || 
+             iState == EInsertTextStateRotate  ||
+             iState == EInsertTextStateResize)
+        {
+        state = 1; // Ok - Cancel
+        }
+    else
+        {
+        state = 2; // Options - Done 
+        }
+
+    return state;
+
+}
+
+//=============================================================================
+TInt CImageEditorTextControl::GetContextMenuResourceId()
+{
+return R_TEXT_CONTEXT_MENUBAR;    
+}
+
+//=============================================================================
+TBitField CImageEditorTextControl::GetDimmedMenuItems()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::GetDimmedMenuItems()");
+
+    TBitField dimmedMenuItems;
+    TInt count = iItem->MenuItems().Count();
+
+    if ( iDisplayingOkOptionsMenu )
+    {
+        // Dim the command EImageEditorCancelPlugin
+        for ( TInt i = 0; i < count; i++)
+        {
+            // get the menu item id
+            TInt menuItem = iItem->MenuItems().At(i).iCommandId;
+            if ( menuItem == ETextPgnMenuCmdCancel ) 
+            {
+                dimmedMenuItems.SetBit( i );
+            }
+        }
+        iDisplayingOkOptionsMenu = EFalse;
+    }
+
+    return dimmedMenuItems;
+}
+
+//=============================================================================
+TPtrC CImageEditorTextControl::GetNaviPaneTextL (
+    TBool& aLeftNaviPaneScrollButtonVisibile, 
+    TBool& aRightNaviPaneScrollButtonVisible )
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::GetNaviPaneTextL()");
+
+    aLeftNaviPaneScrollButtonVisibile = EFalse;
+    aRightNaviPaneScrollButtonVisible = EFalse;
+    return iNaviPaneText;
+}
+
+//=============================================================================
+void CImageEditorTextControl::Draw (const TRect & aRect) const
+{
+    CPreviewControlBase::DrawPreviewImage (aRect);
+
+    if ( iIndicator && iIndicator->Handle() && 
+         iIndicatorMask && iIndicatorMask->Handle() )
+    {
+        CWindowGc & gc = SystemGc();
+        
+   		gc.SetPenStyle (CGraphicsContext::ENullPen);
+		gc.SetBrushStyle (CGraphicsContext::ENullBrush);
+        
+        gc.BitBltMasked ( 
+            ComputeIndicatorPosition(),
+            iIndicator, 
+            TRect (iIndicator->SizeInPixels()), 
+            iIndicatorMask, 
+            EFalse
+            );
+       
+    }
+}
+
+//=============================================================================
+void CImageEditorTextControl::NaviDown()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::NaviDown()");
+
+    switch (iState) 
+    {
+        case EInsertTextStateMove:
+        {
+            iY += (KPosParamStep * iNaviStepMultiplier);
+            if ( iY > iSysPars->VisibleImageRect().iBr.iY )
+            {
+            	iY = iSysPars->VisibleImageRect().iBr.iY;
+            }
+    	    break;
+        }
+        case EInsertTextStateResize:
+        {
+            iScale -= (KScaleParamStep * iNaviStepMultiplier);
+            if (iScale < iScaleMin)
+            {
+                iScale = iScaleMin;
+            }
+    	    break;
+        }
+        case EInsertTextStateRotate:
+        {
+            iAngle -= (KAngleParamStep * iNaviStepMultiplier) % KAngleParamMax;
+    	    break;
+        }
+        default:
+        {
+    	    break;
+        }
+    }
+}
+
+//=============================================================================
+void CImageEditorTextControl::NaviUp()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::NaviUp()");
+    
+    switch (iState) 
+    {
+        case EInsertTextStateMove:
+        {
+            iY -= (KPosParamStep * iNaviStepMultiplier);
+            if ( iY < iSysPars->VisibleImageRect().iTl.iY )
+            {
+            	iY = iSysPars->VisibleImageRect().iTl.iY;
+            }
+    	    break;
+        }
+        case EInsertTextStateResize:
+        {
+            iScale += (KScaleParamStep * iNaviStepMultiplier);
+            if (iScale > iScaleMax)
+            {
+                iScale = iScaleMax;
+            }
+    	    break;
+        }
+        case EInsertTextStateRotate:
+        {
+            iAngle += (KAngleParamStep * iNaviStepMultiplier) % KAngleParamMax;
+    	    break;
+        }
+        default:
+        {
+    	    break;
+        }
+    }
+}
+
+//=============================================================================
+void CImageEditorTextControl::NaviRight()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::NaviRight()");
+
+    switch (iState) 
+    {
+        case EInsertTextStateMove:
+        {
+            iX += (KPosParamStep * iNaviStepMultiplier);
+            if ( iX > iSysPars->VisibleImageRect().iBr.iX )
+            {
+            	iX = iSysPars->VisibleImageRect().iBr.iX;
+            }
+    	    break;
+        }
+        case EInsertTextStateResize:
+        {
+            iScale += (KScaleParamStep * iNaviStepMultiplier);
+            if (iScale > iScaleMax)
+            {
+                iScale = iScaleMax;
+            }
+    	    break;
+        }
+        case EInsertTextStateRotate:
+        {
+            iAngle += (KAngleParamStep * iNaviStepMultiplier) % KAngleParamMax;
+    	    break;
+        }
+        default:
+        {
+    	    break;
+        }
+    }
+}
+
+//=============================================================================
+void CImageEditorTextControl::NaviLeft()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::NaviLeft()");
+
+    switch (iState) 
+    {
+        case EInsertTextStateMove:
+        {
+            iX -= (KPosParamStep * iNaviStepMultiplier);
+            if ( iX < iSysPars->VisibleImageRect().iTl.iX )
+            {
+            	iX = iSysPars->VisibleImageRect().iTl.iX;
+            }
+    	    break;
+        }
+        case EInsertTextStateResize:
+        {
+            iScale -= (KScaleParamStep * iNaviStepMultiplier);
+            if (iScale < iScaleMin)
+            {
+                iScale = iScaleMin;
+            }
+    	    break;
+        }
+        case EInsertTextStateRotate:
+        {
+            iAngle -= (KAngleParamStep * iNaviStepMultiplier) % KAngleParamMax;
+    	    break;
+        }
+        default:
+        {
+    	    break;
+        }
+    }
+}
+
+//=============================================================================
+void CImageEditorTextControl::ToMoveStateL()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::ToMoveStateL()");
+
+    iState = EInsertTextStateMove;
+    iNaviPaneText.Copy ( iItem->Parameters()[KMoveTextIndex] );
+    StoreTempParams();
+    iEditorView->HandleCommandL (EImageEditorUpdateSoftkeys);
+    iEditorView->HandleCommandL (EImageEditorUpdateNavipane);
+    LoadIndicatorL (
+        EMbmImageeditoruiQgn_indi_imed_move_super, 
+        EMbmImageeditoruiQgn_indi_imed_move_super_mask);
+    DrawNow();
+    ShowTooltip();
+}
+
+//=============================================================================
+void CImageEditorTextControl::ToResizeStateL()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::ToResizeStateL()");
+
+    iState = EInsertTextStateResize;
+    iNaviPaneText.Copy ( iItem->Parameters()[KResizeTextIndex] );
+    StoreTempParams();
+    iEditorView->HandleCommandL (EImageEditorUpdateSoftkeys);
+    iEditorView->HandleCommandL (EImageEditorUpdateNavipane);
+    LoadIndicatorL (
+        EMbmImageeditoruiQgn_indi_imed_resize_super, 
+        EMbmImageeditoruiQgn_indi_imed_resize_super_mask
+        );
+    DrawNow();
+    ShowTooltip();
+}
+
+//=============================================================================
+void CImageEditorTextControl::ToRotateStateL()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::ToRotateStateL()");
+
+    iState = EInsertTextStateRotate;
+    iNaviPaneText.Copy ( iItem->Parameters()[KRotateTextIndex] );
+    StoreTempParams();
+    iEditorView->HandleCommandL (EImageEditorUpdateSoftkeys);
+    iEditorView->HandleCommandL (EImageEditorUpdateNavipane);
+    LoadIndicatorL (
+        EMbmImageeditoruiQgn_indi_imed_rotate_left_super,
+        EMbmImageeditoruiQgn_indi_imed_rotate_left_super_mask
+        );
+    DrawNow();
+    ShowTooltip();
+}
+
+//=============================================================================
+void CImageEditorTextControl::ToMainStateL()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::ToMainStateL()");
+
+    //  Delete old indicator
+    delete iIndicator;
+    iIndicator = 0;
+    delete iIndicatorMask;
+    iIndicatorMask = 0;
+
+    iState = EInsertTextStateMain;
+    iNaviPaneText.Copy ( iItem->Parameters()[KMainTextIndex] );
+    iEditorView->HandleCommandL (EImageEditorUpdateSoftkeys);
+    iEditorView->HandleCommandL (EImageEditorUpdateNavipane); 
+    DrawNow();
+}
+
+//=============================================================================
+void CImageEditorTextControl::StoreTempParams()
+    {
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::StoreTempParams()");
+
+    iTempX = iX;
+    iTempY = iY;
+    iTempScale = iScale;
+    iTempAngle = iAngle;
+    }
+
+//=============================================================================
+void CImageEditorTextControl::RestoreTempParams()
+    {
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::RestoreTempParams()");
+
+    iX = iTempX;
+    iY = iTempY;
+    iScale = iTempScale;
+    iAngle = iTempAngle;
+    }
+
+//=============================================================================
+void CImageEditorTextControl::GetHelpContext(TCoeHelpContext& aContext) const
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::GetHelpContext()");
+
+    aContext.iMajor = TUid::Uid(UID_IMAGE_EDITOR);
+    aContext.iContext = KSIE_HLP_EDIT_TEXT;
+}
+
+//=============================================================================
+void CImageEditorTextControl::PrepareL ()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::PrepareL()");
+    
+	//	Get current view port
+	TRect rect = iSysPars->VisibleImageRect();
+	
+	//	Set default position
+	iX = (rect.iTl.iX + rect.iBr.iX) / 2;
+	iY = (rect.iTl.iY + rect.iBr.iY) / 2;
+	
+	//	Set default angle
+	iAngle = KAngleParamDef;
+
+	//	Scale to width
+	iScale = ( rect.Height() - 1 ) / 8;
+	iScaleMin = ( rect.Height() - 1 ) / 20;
+	iScaleMax = ( rect.Height() - 1 ) / 3;
+
+	//	Set default color to white
+	iRgb.SetRed (255);
+	iRgb.SetGreen (255);
+	iRgb.SetBlue (255);
+
+	//	Set position
+	iParam.Append (_L("x "));
+	iParam.AppendNum (iX);
+
+	iParam.Append (_L(" y "));
+	iParam.AppendNum (iY);
+
+	//	Set angle
+	iParam.Append (_L(" angle "));
+	iParam.AppendNum (iAngle);
+
+	//	Create screen font	
+    const CFont * font = AknLayoutUtils::FontFromId(KLogicalFontInUse);
+	iParam.Append (_L(" font "));
+	iParam.AppendNum ((TInt)font);
+
+	//	Set maximum text image width and height
+	LOGFMT (KTextPluginLogFile, "fontwidth %d", font->TextWidthInPixels(_L("W") ));
+	iParam.Append (_L(" textwidth "));
+	iParam.AppendNum ( KMaxColumns * font->TextWidthInPixels(_L("W") ));
+	iParam.Append (_L(" textheight "));
+	iParam.AppendNum ( KMaxRows * font->HeightInPixels() );
+
+	//	Set text
+	iParam.Append (_L(" text \""));
+	iParam.Append (iText);
+	iParam.Append (_L("\""));
+
+	//	Set scale
+	iParam.Append (_L(" height "));
+	iParam.AppendNum (iScale);
+	
+	iReadyToRender = ETrue;
+    iEditorView->HandleCommandL (EImageEditorCmdRender);
+    
+    ToMoveStateL();
+}
+
+//=============================================================================
+void CImageEditorTextControl::LoadIndicatorL (
+    TInt    aBitmapInd,
+    TInt    aMaskInd
+    ) 
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::LoadIndicatorL()");
+
+    //  Delete old indicator
+    delete iIndicator;
+    iIndicator = 0;
+    delete iIndicatorMask;
+    iIndicatorMask = 0;
+
+    //  Load new indicator
+	SDrawUtils::GetIndicatorBitmapL (
+		iIndicator,
+		iIndicatorMask,
+		aBitmapInd,
+		aMaskInd
+		);
+}
+
+//=============================================================================
+TPoint CImageEditorTextControl::ComputeIndicatorPosition() const
+{
+	TRect vprect = iSysPars->VisibleImageRect();
+	TRect vpprect = iSysPars->VisibleImageRectPrev();
+    
+    TInt x( 0 );
+	TInt y( 0 );
+	// check if there is no indicator
+	if ( !iIndicator )
+	    {
+	    return TPoint ( x, y );
+	    }
+	    
+	TInt s = (iScale * vpprect.Height()) / vprect.Height();
+	y = ((iY - vprect.iTl.iY) * vpprect.Height()) / vprect.Height();
+	y += vpprect.iTl.iY;
+	y -= iIndicator->SizeInPixels().iHeight / 4;
+	y += s / 2;
+
+    // Does not work if multiple lines
+    TInt tw = AknLayoutUtils::FontFromId(KLogicalFontInUse)->TextWidthInPixels(iText.Left(KMaxColumns));     
+    TInt th = AknLayoutUtils::FontFromId(KLogicalFontInUse)->HeightInPixels();
+
+	x = ((iX  - vprect.iTl.iX) * vpprect.Width()) / vprect.Width();
+	x += vpprect.iTl.iX;
+	x -= iIndicator->SizeInPixels().iWidth / 2;
+	x -= (tw * s) / (2 * th);
+
+    return TPoint (x,y);
+}
+
+//=============================================================================
+TBool CImageEditorTextControl::IsReadyToRender () const
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::IsReadyToRender()");
+
+	return iReadyToRender;
+}
+
+//=============================================================================
+void CImageEditorTextControl::StoreParameters()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::StoreParameters()");
+
+	iParam.Copy (_L("x "));
+	iParam.AppendNum (iX);
+	iParam.Append (_L(" y "));
+	iParam.AppendNum (iY);
+	iParam.Append (_L(" angle "));
+	iParam.AppendNum (iAngle);
+	iParam.Append (_L(" red "));
+	iParam.AppendNum ( iRgb.Red() );
+	iParam.Append (_L(" green "));
+	iParam.AppendNum ( iRgb.Green() );
+	iParam.Append (_L(" blue "));
+	iParam.AppendNum ( iRgb.Blue() );
+	iParam.Append (_L(" height "));
+	iParam.AppendNum (iScale);
+}
+
+//=============================================================================
+void CImageEditorTextControl::TimerCallBack()
+{
+    LOG(KTextPluginLogFile, "CImageEditorTextControl::TimerCallBack()");
+
+    if (iTickCount > KDefaultFastKeyTimerMultiplyThresholdInTicks)
+    {
+        iNaviStepMultiplier = KDefaultBigNavigationStepMultiplier;
+    }
+    else
+    {
+        iTickCount++;
+    }
+
+	if (iKeyCode)
+	{
+
+		switch (iKeyCode)
+		{
+			case 1:
+			{
+	            NaviUp();
+				break;
+			}
+			case 2:
+			{
+	            NaviDown();
+				break;
+			}
+			case 3:
+			{
+				NaviLeft();
+				break;
+			}
+			case 4:
+			{
+	            NaviRight();
+				break;
+			}
+	        default:
+	            break;
+		}
+	    StoreParameters();
+	    TRAP_IGNORE( iEditorView->HandleCommandL (EImageEditorCmdRender) );
+		iTimer->Call (KWait);			
+	}
+}
+
+//=============================================================================
+void CImageEditorTextControl::StorePosAndScaleRelScreen()
+{
+
+    LOG(KTextPluginLogFile, "CImageEditorClipartControl::StorePosAndScaleRelScreen()");
+
+	TReal relscale = iSysPars->Scale();
+	TRect virect = iSysPars->VisibleImageRect();
+	virect.iTl.iX = (TInt)((virect.iTl.iX / relscale) + 0.5);
+	virect.iTl.iY = (TInt)((virect.iTl.iY / relscale) + 0.5);
+	virect.iBr.iX = (TInt)((virect.iBr.iX / relscale) + 0.5);
+	virect.iBr.iY = (TInt)((virect.iBr.iY / relscale) + 0.5);
+	
+	TInt viwidth = virect.iBr.iX - virect.iTl.iX;
+	TInt viheight = virect.iBr.iY - virect.iTl.iY;
+	
+	TRect viprect = iSysPars->VisibleImageRectPrev();
+
+	TInt vipwidth = viprect.iBr.iX - viprect.iTl.iX;
+	TInt vipheight = viprect.iBr.iY - viprect.iTl.iY;
+
+	//	Scale
+	if (iScale == iScaleMax)
+	{
+		iScaleOld = iScaleMax;
+	}
+	else if (iScale == iScaleMin)
+	{
+		iScaleOld = iScaleMin;
+	}
+	else
+	{
+		TInt dimold_pix = (TInt)((iScale / relscale) + 0.5); 
+		if ( viwidth > viheight )
+		{
+			iScaleOld = (TInt)((TReal)(dimold_pix * vipheight) / viheight + 0.5);
+		}
+		else
+		{
+			iScaleOld = (TInt)((TReal)(dimold_pix * vipwidth) / viwidth + 0.5);
+		}
+	}
+
+
+	//	Position
+	TInt xCurrent = (TInt)((iX / relscale) + 0.5); 
+	TInt yCurrent = (TInt)((iY / relscale) + 0.5); 
+	iPosXOld = viprect.iTl.iX + (TReal)((xCurrent - virect.iTl.iX) * vipwidth) / viwidth;			
+	iPosYOld = viprect.iTl.iY + (TReal)((yCurrent - virect.iTl.iY) * vipheight) / viheight;			
+
+	LOGFMT(KTextPluginLogFile, "\tiPosXOld = %d", iPosXOld);
+	LOGFMT(KTextPluginLogFile, "\tiPosYOld = %d", iPosYOld);
+
+	iParam.Copy(_L("nop"));	
+}
+
+//=============================================================================
+void CImageEditorTextControl::RestorePosAndScaleRelScreen()
+{
+	LOG(KTextPluginLogFile, "CImageEditorClipartControl::RestorePosAndScaleRelScreen()");
+
+	TReal relscale = iSysPars->Scale();
+
+	TRect virect = iSysPars->VisibleImageRect();
+	virect.iTl.iX = (TInt)((virect.iTl.iX / relscale) + 0.5);
+	virect.iTl.iY = (TInt)((virect.iTl.iY / relscale) + 0.5);
+	virect.iBr.iX = (TInt)((virect.iBr.iX / relscale) + 0.5);
+	virect.iBr.iY = (TInt)((virect.iBr.iY / relscale) + 0.5);
+
+	TInt viwidth = virect.iBr.iX - virect.iTl.iX;
+	TInt viheight = virect.iBr.iY - virect.iTl.iY;
+	
+	TRect viprect = iSysPars->VisibleImageRectPrev();
+	TInt vipwidth = viprect.iBr.iX - viprect.iTl.iX;
+	TInt vipheight = viprect.iBr.iY - viprect.iTl.iY;
+
+	//	Scale
+	if (iScale == iScaleMax)
+	{
+		iScale = iScaleOld;
+	}
+	else if (iScale == iScaleMin)
+	{
+		iScale = iScaleOld;
+	}
+	else
+	{
+		if ( viwidth > viheight )
+		{
+			iScale = (TInt)((iScaleOld * viheight) / vipheight + 0.5);
+		}
+		else
+		{
+			iScale = (TInt)((iScaleOld * viwidth) / vipwidth + 0.5);
+		}
+		iScale = (TInt)(iScale * relscale + 0.5); 
+
+	}
+
+
+	//	Position
+	iX = (TInt)(virect.iTl.iX + (TReal)((iPosXOld - viprect.iTl.iX) * viwidth) / vipwidth + 0.5);
+	iY = (TInt)(virect.iTl.iY + (TReal)((iPosYOld - viprect.iTl.iY) * viheight) / vipheight + 0.5);
+
+}
+
+
+//=============================================================================
+void CImageEditorTextControl::StorePosAndScaleRelImage()
+{
+    LOG(KTextPluginLogFile, "CImageEditorClipartControl::StorePosAndScaleRelImage()");
+	TReal relscale = iSysPars->RelScale();
+	iPosXOld = (TInt)((iX / relscale) + 0.5);
+	iPosYOld = (TInt)((iY / relscale) + 0.5);
+	iScaleOld = (TInt)(iScale / relscale + 0.5);
+	iParam.Copy(_L("nop"));	
+}
+
+//=============================================================================
+void CImageEditorTextControl::RestorePosAndScaleRelImage()
+{
+    LOG(KTextPluginLogFile, "CImageEditorClipartControl::RestorePosAndScaleRelImage()");
+	TReal relscale = iSysPars->RelScale();
+	iX = (TInt)(iPosXOld * relscale + 0.5);
+	iY = (TInt)(iPosYOld * relscale + 0.5);
+	iScale = (TInt)(iScaleOld * relscale + 0.5);
+}
+
+//=============================================================================
+void CImageEditorTextControl::ClipPosition()
+{
+    if ( iX < iSysPars->VisibleImageRect().iTl.iX )
+    {
+    	iX = iSysPars->VisibleImageRect().iTl.iX;
+    }
+    else if ( iX > iSysPars->VisibleImageRect().iBr.iX )
+    {
+    	iX = iSysPars->VisibleImageRect().iBr.iX;
+    }
+    
+    if ( iY < iSysPars->VisibleImageRect().iTl.iY )
+    {
+    	iY = iSysPars->VisibleImageRect().iTl.iY;
+    }
+    else if ( iY > iSysPars->VisibleImageRect().iBr.iY )
+    {
+    	iY = iSysPars->VisibleImageRect().iBr.iY;
+    }
+}
+
+//=============================================================================
+void CImageEditorTextControl::HandlePointerEventL(
+                                            const TPointerEvent &aPointerEvent)
+    {            
+    if( AknLayoutUtils::PenEnabled() )
+		{
+		TBool render = ETrue;	
+		switch( aPointerEvent.iType )
+			{
+			case TPointerEvent::EButton1Down:
+				{
+				if ( iState == EInsertTextStateMove )
+				    {	
+				    iPopupController->HideInfoPopupNote();				   		    
+				    SetTextPosition( aPointerEvent.iPosition );
+				    }			
+				else if ( iState == EInsertTextStateRotate )
+				    {
+				    iPopupController->HideInfoPopupNote();
+				    // Store current position. Rotating is handled in drag-event
+				    // is pen position has changed
+				    iPointerPosition = aPointerEvent.iPosition;
+				    }
+			    else if ( iState == EInsertTextStateResize )
+				    {
+				    iPopupController->HideInfoPopupNote();
+				    iPointerPosition = aPointerEvent.iPosition;
+				    }    
+				    
+#ifdef RD_TACTILE_FEEDBACK
+				if ( iTouchFeedBack )
+					{
+					iTouchFeedBack->InstantFeedback( ETouchFeedbackBasic );
+					RDebug::Printf( "ImageEditor::ImageEditorTextControl: ETouchFeedback" );
+					}
+#endif /* RD_TACTILE_FEEDBACK  */
+				
+				break;
+				}
+			case TPointerEvent::EDrag:
+				{
+				if ( iState == EInsertTextStateMove )
+				    {
+				    SetTextPosition( aPointerEvent.iPosition );
+				    // store current position for next round
+                    iPointerPosition = aPointerEvent.iPosition;
+				    }				
+				else if ( iState == EInsertTextStateRotate )
+				    {
+				    if ( CalculateRotation( iPointerPosition, aPointerEvent.iPosition ) )
+        			    {
+        			    // store current position for next round
+                        iPointerPosition = aPointerEvent.iPosition;
+        			    }
+        			else
+      			        {
+                        render = EFalse;  			        
+    			        }    			        				    
+				    }				
+				else if ( iState == EInsertTextStateResize )
+				    {
+				    if ( CalculateResize( iPointerPosition, aPointerEvent.iPosition ) )
+        			    {
+        			    // store current position for next round
+                        iPointerPosition = aPointerEvent.iPosition;
+        			    }
+        			else
+      			        {
+                        render = EFalse;  			        
+    			        }    
+				    }    			
+				break;		
+				}
+			case TPointerEvent::EButton1Up:
+				{
+				if ( iState == EInsertTextStateMain )
+    			    {
+    			    // Show context sensitive menu
+    			    iEditorView->HandleCommandL( EImageEditorOpenContextMenu );
+    			    }
+				else
+				    {
+				    ShowTooltip();
+				    }						 			 
+				break;
+				}
+						
+			default:
+				{
+				break;	
+				}	
+			}
+			
+    	StoreParameters();
+    	
+    	if ( render )
+    	    {
+    	    TRAP_IGNORE( iEditorView->HandleCommandL (EImageEditorCmdRender) );    
+    	    }	    
+		
+		CCoeControl::HandlePointerEventL( aPointerEvent );
+
+		}
+    }
+
+//=============================================================================    
+void CImageEditorTextControl::SetTextPosition( TPoint aPointedPosition )
+    {    
+    
+    // Get system parameters
+   	TRect visibleImageRect( iSysPars->VisibleImageRect() );
+   	TRect visibleImageRectPrev( iSysPars->VisibleImageRectPrev() );
+   	
+   	TInt xPosFactorDivider
+   	            ( visibleImageRectPrev.iBr.iX - visibleImageRectPrev.iTl.iX );
+   	TInt yPosFactorDivider
+   	            ( visibleImageRectPrev.iBr.iY - visibleImageRectPrev.iTl.iY );
+   	
+   	// Dividing by zero will cause panic -> check
+   	if ( xPosFactorDivider == 0 || yPosFactorDivider == 0 )
+   	    {
+   	    //	Set default position
+    	iX = (visibleImageRect.iTl.iX + visibleImageRect.iBr.iX) / 2;
+    	iY = (visibleImageRect.iTl.iY + visibleImageRect.iBr.iY) / 2;
+   	    }
+   	else
+   	    {
+   	    // Calculate relative position on the screen
+   	    TReal xPositionFactor 
+   	             ( TReal( aPointedPosition.iX - visibleImageRectPrev.iTl.iX ) /
+	             xPosFactorDivider );
+	                        
+    	TReal yPositionFactor 
+    	         ( TReal( aPointedPosition.iY - visibleImageRectPrev.iTl.iY ) /
+		         yPosFactorDivider );
+		
+		// Calculate position on visible image		                                
+   	    iX = visibleImageRect.iTl.iX + 
+   	         ( visibleImageRect.iBr.iX - visibleImageRect.iTl.iX ) * 
+   	         xPositionFactor;	    
+    	
+    	iY = visibleImageRect.iTl.iY + 
+	         ( visibleImageRect.iBr.iY - visibleImageRect.iTl.iY ) * 
+	         yPositionFactor;		  
+   	    }    
+	
+	// Check that not out of bounds
+    ClipPosition();          
+   
+    }
+    
+//=============================================================================    
+void CImageEditorTextControl::ShowTooltip()
+    {   
+    iPopupController->HideInfoPopupNote();
+
+    TPoint iconPosition = ComputeIndicatorPosition();
+    TRect iconRect( iconPosition.iX, iconPosition.iY, 
+                    iconPosition.iX, iconPosition.iY );
+
+    if ( iState == EInsertTextStateMove )
+        {
+        SDrawUtils::ShowToolTip( iPopupController,
+                                 this,
+                                 iconPosition,
+                                 EHRightVTop,
+                                 *iTooltipMove );
+        }
+    // resize
+    else if ( iState == EInsertTextStateResize )
+        {                                     
+        SDrawUtils::ShowToolTip( iPopupController,
+                                 this,
+                                 iconPosition,
+                                 EHRightVTop, 
+                                 *iTooltipResize );                                 
+        }
+    // rotate
+    else if ( iState == EInsertTextStateRotate ) 
+        {
+        SDrawUtils::ShowToolTip( iPopupController,
+                                 this,
+                                 iconPosition,
+                                 EHRightVTop,
+                                 *iTooltipRotate );
+        }
+    
+    }
+
+//=============================================================================
+TBool CImageEditorTextControl::CalculateRotation( TPoint aStartPoint, 
+                                                 TPoint aEndPoint )
+    {    
+    TBool angleChanged( EFalse );
+    TInt oldAngle = iAngle;
+    
+    // Get system parameters
+   	TRect visibleImageRect( iSysPars->VisibleImageRect() );
+   	TRect visibleImageRectPrev( iSysPars->VisibleImageRectPrev() );
+   	
+   	// Calculate Text real center point on the screen (physical coordinates)	
+   	TReal posFactorX( TReal( iX - visibleImageRect.iTl.iX ) /
+   	                            visibleImageRect.Width() );
+   	TInt textCenterX = posFactorX * visibleImageRectPrev.Width() + 
+   	                                   visibleImageRectPrev.iTl.iX;
+   	
+   	TReal posFactorY( TReal( iY - visibleImageRect.iTl.iY ) / 
+   	                            visibleImageRect.Height() );
+   	TInt textCenterY = posFactorY * visibleImageRectPrev.Height() + 
+   	                                   visibleImageRectPrev.iTl.iY;
+   	
+    // Calculate start and end positions of the movement assuming that
+    // text centre is in origo.
+    // Note! y-axis is mirrored on screen coordinates compared to standard 2-d
+    // co-ordinates->mirror y-axis to ease the calculation
+   	TPoint startPos( ( aStartPoint.iX - textCenterX ), 
+                       ( textCenterY - aStartPoint.iY ) );    
+    TPoint endPos( ( aEndPoint.iX - textCenterX ), 
+                     ( textCenterY - aEndPoint.iY ) );
+
+    TReal angleInRadStart;
+    TReal angleInRadEnd;
+    
+    // Calculate start and end angles in radians
+    TInt err1 = Math::ATan( angleInRadStart, startPos.iY, startPos.iX );
+    TInt err2 = Math::ATan( angleInRadEnd, endPos.iY, endPos.iX );
+    
+    if( !err1 && !err2 )
+        {
+        // Calculate change in angle and convert it to degrees
+        TReal changeInDegrees = 
+                        ( angleInRadEnd - angleInRadStart ) * KRadToDeg;
+        
+        iAngle -= ( KDegreeMultiplier * TInt( changeInDegrees ) ) 
+                  % KAngleParamMax;    
+        }
+        
+    if ( iAngle != oldAngle )
+        {
+        angleChanged = ETrue;
+        }
+        
+    return angleChanged;    
+    }
+
+//=============================================================================
+TBool CImageEditorTextControl::CalculateResize( TPoint aStartPoint, 
+                                                TPoint aEndPoint )
+    {
+        
+    // Whether bubble is resized in this function or not
+    TBool textResized( EFalse );
+    // Store old scale value
+    TInt oldScale = iScale;    
+    
+    // Get system parameters
+    TRect visibleImageRectPrev( iSysPars->VisibleImageRectPrev() );
+            
+    // Compute change on the screen
+    TInt deltaX = aEndPoint.iX - aStartPoint.iX;
+    TInt deltaY = aEndPoint.iY - aStartPoint.iY;
+   	
+   	// Use bigger dimension
+	TInt maxChangeInPixels;
+	if ( visibleImageRectPrev.Height() > visibleImageRectPrev.Width() )
+	    {
+	    maxChangeInPixels = visibleImageRectPrev.Height();
+	    }
+	else
+	    {
+	    maxChangeInPixels = visibleImageRectPrev.Width();
+	    }
+	  
+	TInt oneStepInPixels =  maxChangeInPixels / KTouchScaleMaxStepCount;
+	TInt scaleStep = ( iScaleMax - iScaleMin ) / KTouchScaleMaxStepCount + 1;
+
+    // Relates to second and fourth corners. Defines how steep/gentle the 
+    // moving angle has to be in order to scale.
+    TInt slopeAngleFactor = 3;
+    
+    // The first quarter (movement towards upper-right corner)
+    if( ( deltaX > 0 && deltaY <= 0 ) || ( deltaX >= 0 && deltaY < 0 ) )
+        {
+        // use bigger value
+        if (Abs( deltaX ) >= Abs( deltaY) )
+            {
+            iScale += scaleStep * ( Abs( deltaX ) / oneStepInPixels );
+            }
+        else
+            {
+            iScale += scaleStep * ( Abs( deltaY ) / oneStepInPixels );
+            }				                             
+        }
+    // The second (movement towards lower-right corner)  	
+    else if( ( deltaX > 0 && deltaY >= 0 ) || ( deltaX >= 0 && deltaY > 0 ) )
+        {
+        if( deltaX > slopeAngleFactor * deltaY )
+            {			                
+	        iScale += scaleStep * ( Abs( deltaX ) / oneStepInPixels );    
+            }
+	        			               
+        else if ( slopeAngleFactor * deltaX < deltaY )
+            {			              
+	        iScale -= scaleStep * ( Abs( deltaY ) / oneStepInPixels ); 
+	        }
+        }    
+    // The third (movement towards lower-left corner)
+    else if( ( deltaX < 0 && deltaY >= 0 ) || ( deltaX <= 0 && deltaY > 0 ) )
+        {
+        if (Abs( deltaX ) >= Abs( deltaY) )
+            {
+            iScale -= scaleStep * ( Abs( deltaX ) / oneStepInPixels );    
+            }
+        else
+            {
+            iScale -= scaleStep * ( Abs( deltaY ) / oneStepInPixels ); 
+            }
+        }
+    // The fourth (movement towards upper-left corner)
+    else if( ( deltaX < 0 && deltaY <= 0 ) || ( deltaX <= 0 && deltaY < 0 ) )
+        {
+        if( slopeAngleFactor * Abs( deltaX ) < Abs( deltaY ) )
+            {
+            iScale += scaleStep * ( Abs( deltaY ) / oneStepInPixels ); 
+            }
+        else if ( Abs( deltaX ) > slopeAngleFactor * Abs( deltaY ) )
+            {
+            iScale -= scaleStep * ( Abs( deltaX ) / oneStepInPixels );    
+	        }
+        }
+    
+    // Check the limits        
+    if (iScale > iScaleMax)
+        {
+       	iScale = iScaleMax;
+       	textResized = ETrue;
+        }
+    if (iScale < iScaleMin)
+        {
+        iScale = iScaleMin;
+        textResized = ETrue;
+        }
+    
+    if ( oldScale != iScale )    
+        {
+        textResized = ETrue;
+        }
+        
+    return textResized;
+                
+    }   
+    
+    
+// End of File