imageeditor/plugins/DrawPlugin/src/imageeditordrawcontrol.cpp
changeset 1 edfc90759b9f
child 12 18b321db4884
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/plugins/DrawPlugin/src/imageeditordrawcontrol.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,1065 @@
+/*
+* 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 plugin control class.
+*
+*/
+
+
+//  INCLUDES
+#include "imageeditordrawcontrol.h"
+#include "draw.hrh"
+
+#include "ImageEditorUI.hrh"
+#include "ImageEditorPluginBase.hrh"
+
+#include "PluginInfo.h"
+#include "JpTimer.h"
+#include "ImageEditorUids.hrh"
+#include "ImageEditorUiDefs.h"
+#include "SystemParameters.h"
+#include "drawpath.h"
+#include "selectionpopup.h"
+
+#include "iepb.h" 
+// debug log
+#include "imageeditordebugutils.h"
+
+#include <fbs.h>
+#include <badesca.h>
+#include <gdi.h>
+#include <eikenv.h>
+#include <bitdev.h>
+
+#include <aknview.h>
+#include <aknutils.h>
+
+#include <ImageEditorUI.mbg>
+#include <AknInfoPopupNoteController.h> 
+#include <draw.rsg> 
+#include <bautils.h> 
+#include <ConeResLoader.h> 
+#include <gulalign.h>
+#include <csxhelp/sie.hlp.hrh>
+
+// Log file
+_LIT(KDrawPluginLogFile,"drawplugin.log");
+
+//  CONSTANTS
+const TInt KWait			    	= 1;
+const TInt KMainTextIndex           = 0;
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CImageEditorDrawControl* CImageEditorDrawControl::NewL(
+	const TRect& aRect,
+	CCoeControl* aParent )
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::NewL()");
+
+    CImageEditorDrawControl * self = new (ELeave) CImageEditorDrawControl;
+    CleanupStack::PushL (self);
+    self->ConstructL (aRect, aParent);
+    CleanupStack::Pop ();   // self
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CImageEditorDrawControl
+// ---------------------------------------------------------------------------
+//
+CImageEditorDrawControl::CImageEditorDrawControl() : 
+iTickCount(0),
+iNaviStepMultiplier(KDefaultSmallNavigationStepMultiplier),
+iDisplayingOkOptionsMenu(EFalse),
+iReadyToRender(EFalse),
+iResLoader( *ControlEnv() )
+{}
+
+// ---------------------------------------------------------------------------
+// ~CImageEditorDrawControl()
+// ---------------------------------------------------------------------------
+//
+CImageEditorDrawControl::~CImageEditorDrawControl()
+    {
+    LOG(KDrawPluginLogFile, 
+            "CImageEditorDrawControl::~CImageEditorDrawControl()");    
+    delete iTimer;
+    delete iIndicator;
+    delete iIndicatorMask;
+	delete iPopupController;
+	delete iTooltipResize;
+	iPaths.ResetAndDestroy();
+    delete iNaviPaneText;	
+	iResLoader.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::ConstructL(
+	const TRect& /*aRect*/, CCoeControl* aParent )
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::ConstructL()");
+	//	Set parent window
+	SetContainerWindowL(*aParent);
+    
+    //  Create resource utility
+	TFileName resFile;
+	// resource file name
+	_LIT (KResourceFile, "draw.rsc");	
+	resFile.Append(KPgnResourcePath);
+	resFile.Append(KResourceFile);
+
+    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();    
+	iTooltipResize = ControlEnv()->AllocReadResourceL(R_TOOLTIP_TEXT_RESIZE);           
+	    
+    EnableDragEvents();
+        
+	//	Activate control
+    ActivateL();
+    }
+
+// ---------------------------------------------------------------------------
+// SetView
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::SetView(CAknView* aView)
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::SetView()");
+    ASSERT( aView );
+    iEditorView = aView;
+    }
+
+// ---------------------------------------------------------------------------
+// SetSelectedUiItemL
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::SetSelectedUiItemL(CPluginInfo* aItem)
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::SetSelectedUiItemL()");
+    ASSERT( aItem );
+    iItem = aItem;
+    delete iNaviPaneText;
+    iNaviPaneText = NULL;
+    iNaviPaneText = (iItem->Parameters()[KMainTextIndex]).AllocL();
+    iEditorView->HandleCommandL(EImageEditorCmdRender);
+    }
+
+// ---------------------------------------------------------------------------
+// OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CImageEditorDrawControl::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType)
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::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 )
+        {
+        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:
+			{		
+			    SetPositionOnImage( ComputeIndicatorPosition() );
+		    	StoreParameters( EFalse, EFalse );			    
+				response = EKeyWasConsumed;
+                break;
+			}
+		
+            case EKeyOK:
+                {           
+                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
+		    {
+		    	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;
+			}
+		}
+
+		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;
+			}
+		}
+	}
+
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::SizeChanged()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::SizeChanged()");
+    }
+
+// ---------------------------------------------------------------------------
+// GetParam
+// ---------------------------------------------------------------------------
+//
+TDesC& CImageEditorDrawControl::GetParam()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::GetParam()");
+    LOGDES(KDrawPluginLogFile, iParam);
+	return iParam;
+    }
+
+// ---------------------------------------------------------------------------
+// SetSystemParameters
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::SetSystemParameters(const CSystemParameters* aPars) 
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::SetSystemParameters()");
+    ASSERT( aPars );
+    iSysPars = aPars;
+    }
+
+// ---------------------------------------------------------------------------
+// HandlePluginCommandL
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::HandlePluginCommandL(const TInt aCommand)
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::HandlePluginCommandL()");
+
+    switch (aCommand) 
+        {
+        case EImageEditorFocusLost:
+            {
+            if (iTimer)
+                {
+                iTimer->Cancel();
+                }
+            break;
+            }
+        case EPgnSoftkeyIdOk:
+            {
+            iPopupController->HideInfoPopupNote();
+            break;
+            }
+        case EPgnSoftkeyIdCancel:
+            {
+            iPopupController->HideInfoPopupNote();
+            iEditorView->HandleCommandL (EImageEditorCancelPlugin);
+            break;
+            }
+        case EPgnSoftkeyIdDone:
+            // FALLTROUHG
+        case EDrawPgnMenuCmdDone:
+            {   
+            iPopupController->HideInfoPopupNote();
+            StoreParameters(EFalse, ETrue);
+            iEditorView->HandleCommandL( EImageEditorCmdRender );//results Draw call
+            iEditorView->HandleCommandL(EImageEditorApplyPlugin);
+            break;
+            }
+        case EDrawPgnMenuCmdResize:
+            {
+            StoreParameters(ETrue, ETrue);
+            iEditorView->HandleCommandL( EImageEditorCmdRender );//results Draw call
+            SelectSizeL();         
+            break;
+            }
+        case EDrawPgnMenuCmdColor:
+            {
+            StoreParameters(ETrue, ETrue);
+            iEditorView->HandleCommandL( EImageEditorCmdRender );//results Draw call            
+            SDrawUtils::LaunchColorSelectionPopupL(iPreview, Rect(), iRgb);
+            break;
+            }
+        case EDrawPgnMenuCmdCancel:
+            {
+			iReadyToRender = EFalse;
+            iEditorView->HandleCommandL(EImageEditorCancelPlugin);
+            break;
+            }
+        
+        case EImageEditorGlobalZoomChanged:
+            // FALLTROUGHT
+        case EImageEditorGlobalPanChanged:
+            {
+			RestorePosAndScaleRelScreen();
+			//StoreParameters();
+            StoreTempParams();
+	    	iEditorView->HandleCommandL (EImageEditorCmdRender);
+
+			//DrawNow();
+	        break;
+            }
+        
+        case EImageEditorPreScreenModeChange:
+            {
+			StorePosAndScaleRelImage();
+        	break;
+            }
+        
+        case EImageEditorPostScreenModeChange:
+            {
+			RestorePosAndScaleRelImage();
+			ClipPosition();
+			//StoreParameters();
+            StoreTempParams();
+	    	iEditorView->HandleCommandL (EImageEditorCmdRender);
+			//DrawNow();
+        	break;
+            }
+
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// GetSoftkeyIndexL
+// ---------------------------------------------------------------------------
+//
+TInt CImageEditorDrawControl::GetSoftkeyIndexL()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::GetSoftkeyIndexL()");
+    // : Check needed states
+    TInt state(2);
+    return state;
+    }
+
+// ---------------------------------------------------------------------------
+// GetContextMenuResourceId
+// ---------------------------------------------------------------------------
+//
+TInt CImageEditorDrawControl::GetContextMenuResourceId()
+    {
+    return R_TEXT_CONTEXT_MENUBAR;    
+    }
+
+// ---------------------------------------------------------------------------
+// GetDimmedMenuItems
+// ---------------------------------------------------------------------------
+//
+TBitField CImageEditorDrawControl::GetDimmedMenuItems()
+{
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::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 == EDrawPgnMenuCmdCancel ) 
+            {
+                dimmedMenuItems.SetBit( i );
+            }
+        }
+        iDisplayingOkOptionsMenu = EFalse;
+    }
+    
+    for ( TInt i = 0; i < count; i++)
+    {
+        // get the menu item id
+        TInt menuItem = iItem->MenuItems().At(i).iCommandId;
+        if ( menuItem == EDrawPgnMenuCmdMax )
+        	{
+        	dimmedMenuItems.SetBit( i );
+        	}    
+    }
+    return dimmedMenuItems;
+}
+
+// ---------------------------------------------------------------------------
+// GetNaviPaneTextL
+// ---------------------------------------------------------------------------
+//
+TPtrC CImageEditorDrawControl::GetNaviPaneTextL(
+    TBool& aLeftNaviPaneScrollButtonVisibile, 
+    TBool& aRightNaviPaneScrollButtonVisible )
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::GetNaviPaneTextL()");
+
+    aLeftNaviPaneScrollButtonVisibile = EFalse;
+    aRightNaviPaneScrollButtonVisible = EFalse;
+    return *iNaviPaneText;
+    }
+
+// ---------------------------------------------------------------------------
+// Draw
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::Draw(const TRect& aRect) const
+    {
+    CWindowGc & gc = SystemGc();
+    if( IsReadyToRender() )
+        {
+        CPreviewControlBase::DrawPreviewImage(aRect);
+        }
+
+    if( iPaths.Count() )
+        {
+        ASSERT( iSysPars ); 
+        for( TInt i(0); i<iPaths.Count(); ++i)
+            {
+            CDrawPath* path = iPaths[i];
+            CArrayFix<TPoint>* pathPoints = path->ItemArray();
+            gc.SetPenStyle( CGraphicsContext::ESolidPen );
+            gc.SetPenColor( path->Color() );
+            gc.SetPenSize( ScaledLineSize( path->Size() ) );
+            gc.DrawPolyLine( pathPoints );
+            }
+        }
+    
+  /*  
+   * : Too slow cause we need to redraw preview image everytime
+   * if( iIndicator && iIndicator->Handle() && 
+         iIndicatorMask && iIndicatorMask->Handle() )
+        {                
+        gc.BitBltMasked ( 
+            ComputeIndicatorPosition(),
+            iIndicator, 
+            TRect (iIndicator->SizeInPixels()), 
+            iIndicatorMask, 
+            EFalse
+            );
+        }*/       	
+    }
+
+// ---------------------------------------------------------------------------
+// NaviDown
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::NaviDown()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::NaviDown()");
+    }
+
+// ---------------------------------------------------------------------------
+// NaviUp
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::NaviUp()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::NaviUp()");
+    }
+
+// ---------------------------------------------------------------------------
+// NaviRight
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::NaviRight()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::NaviRight()");
+    }
+
+// ---------------------------------------------------------------------------
+// NaviLeft
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::NaviLeft()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::NaviLeft()");
+    }
+
+// ---------------------------------------------------------------------------
+// SelectSizeL
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::SelectSizeL()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::SelectSizeL()");
+    // Symmetric line width / height
+    TInt size(iSize.iWidth);
+    CSelectionDialog::RunDlgLD( iPreview, Rect(), size );
+    iSize = TSize(size,size);
+    }
+
+// ---------------------------------------------------------------------------
+// StoreTempParams
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::StoreTempParams()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::StoreTempParams()");
+    }
+
+// ---------------------------------------------------------------------------
+// RestoreTempParams
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::RestoreTempParams()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::RestoreTempParams()");
+    }
+
+// ---------------------------------------------------------------------------
+// GetHelpContext
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::GetHelpContext(TCoeHelpContext& aContext) const
+{
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::GetHelpContext()");
+
+    aContext.iMajor = TUid::Uid(UID_IMAGE_EDITOR);
+    aContext.iContext = KSIE_HLP_EDIT_TEXT;
+}
+
+// ---------------------------------------------------------------------------
+// PrepareL
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::PrepareL()
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::PrepareL()");
+    
+	//	Get current view port
+	TRect rect = iSysPars->VisibleImageRectPrev();
+	
+	//	Set default position
+	iX = (rect.iTl.iX + rect.iBr.iX) / 2;
+	iY = (rect.iTl.iY + rect.iBr.iY) / 2;
+	
+	//	Set default color to white
+	iRgb = KRgbWhite;
+
+	// Set default size
+	TInt defaultSize(8);
+	iSize = TSize(defaultSize, defaultSize);
+    iReadyToRender = ETrue;
+
+    iEditorView->HandleCommandL( EImageEditorCmdRender );        
+    }
+
+// ---------------------------------------------------------------------------
+// LoadIndicatorL
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::LoadIndicatorL(
+    TInt aBitmapInd, TInt aMaskInd ) 
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::LoadIndicatorL()");
+
+    //  Delete old indicator
+    delete iIndicator;
+    iIndicator = 0;
+    delete iIndicatorMask;
+    iIndicatorMask = 0;
+
+    //  Load new indicator
+	SDrawUtils::GetIndicatorBitmapL (
+		iIndicator,
+		iIndicatorMask,
+		aBitmapInd,
+		aMaskInd
+		);
+    }
+
+// ---------------------------------------------------------------------------
+// ComputeIndicatorPosition
+// ---------------------------------------------------------------------------
+//
+TPoint CImageEditorDrawControl::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 );
+	    }
+	    
+	y = ((iY - vprect.iTl.iY) * vpprect.Height()) / vprect.Height();
+	y += vpprect.iTl.iY;
+	//y -= iIndicator->SizeInPixels().iHeight; /// 4;
+
+	x = ((iX  - vprect.iTl.iX) * vpprect.Width()) / vprect.Width();
+	x += vpprect.iTl.iX;
+	//x -= iIndicator->SizeInPixels().iWidth / 2;
+
+    return TPoint (x,y);
+	}
+
+// ---------------------------------------------------------------------------
+// IsReadyToRender
+// ---------------------------------------------------------------------------
+//
+TBool CImageEditorDrawControl::IsReadyToRender() const
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::IsReadyToRender()");
+	return iReadyToRender;
+    }
+
+// ---------------------------------------------------------------------------
+// StoreParameters
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::StoreParameters(TBool aLastItem, TBool aDone)
+    {
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::StoreParameters()");
+    RDebug::Print(_L("CImageEditorDrawControl::StoreParameters color[%d]"), 
+    	iRgb.Internal());    
+
+	iParam.Copy(_L("x "));
+	iParam.AppendNum (iX);
+	iParam.Append(_L(" y "));
+	iParam.AppendNum (iY);
+	
+	if( aLastItem )
+		{	
+	    iParam.Append(_L(" size "));
+	    iParam.AppendNum (iSize.iHeight);
+	    iParam.Append(_L(" color "));
+	    iParam.AppendNum ( iRgb.Value() );  		
+		iParam.Append(_L(" lastItem "));
+		}	
+    if( aDone )
+        {   
+        iParam.Append(_L("done"));
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// TimerCallBack
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::TimerCallBack()
+{
+    LOG(KDrawPluginLogFile, "CImageEditorDrawControl::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);			
+	}
+}
+
+// ---------------------------------------------------------------------------
+// StorePosAndScaleRelScreen
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::StorePosAndScaleRelScreen()
+    {
+    LOG(KDrawPluginLogFile, 
+            "CImageEditorClipartControl::StorePosAndScaleRelScreen()");
+	iParam.Copy(_L("nop"));	
+    }
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::RestorePosAndScaleRelScreen()
+    {
+	LOG(KDrawPluginLogFile, 
+	        "CImageEditorClipartControl::RestorePosAndScaleRelScreen()");
+    }
+
+
+// ---------------------------------------------------------------------------
+// StorePosAndScaleRelImage
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::StorePosAndScaleRelImage()
+    {
+    TReal relscale = iSysPars->RelScale();    
+    LOGFMT(KDrawPluginLogFile,
+            "CImageEditorClipartControl::StorePosAndScaleRelImage():%g",
+            relscale);
+    }
+
+// ---------------------------------------------------------------------------
+// RestorePosAndScaleRelImage
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::RestorePosAndScaleRelImage()
+    {
+    TReal relscale = iSysPars->RelScale();
+    LOGFMT(KDrawPluginLogFile,
+            "CImageEditorClipartControl::RestorePosAndScaleRelImage():%g",
+            relscale);
+    }
+
+// ---------------------------------------------------------------------------
+// ClipPosition
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::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;
+    }
+}
+
+// ---------------------------------------------------------------------------
+// HandlePointerEventL
+// ---------------------------------------------------------------------------
+//
+void CImageEditorDrawControl::HandlePointerEventL(
+    const TPointerEvent &aPointerEvent)
+    {
+    RDebug::Print(_L("CImageEditorDrawControl::HandlePointerEventL pen[%d]"), 
+    	AknLayoutUtils::PenEnabled());        
+    if( AknLayoutUtils::PenEnabled() && !Busy())
+		{
+		RDebug::Print(_L("CImageEditorDrawControl::iType [%d]"), 
+			aPointerEvent.iType);
+		TBool lastItem( EFalse );
+		switch( aPointerEvent.iType )
+			{
+			case TPointerEvent::EButton1Down:
+				{
+				iReadyToRender = EFalse;
+
+				CDrawPath* lastPath = CDrawPath::NewL();
+				CleanupStack::PushL( lastPath );
+				lastPath->SetColor( iRgb );
+				lastPath->SetSize( iSize );								
+                SetPositionOnImage( aPointerEvent.iPosition );
+                lastPath->AddItemL( aPointerEvent.iPosition );
+                iPaths.AppendL( lastPath );
+                CleanupStack::Pop( lastPath );
+                break;
+				}
+			case TPointerEvent::EDrag:
+				{  
+				if( iPaths.Count() )
+    				{
+    				CDrawPath* path = iPaths[iPaths.Count()-1];
+    				// store current position for next round
+                    iPointerPosition = aPointerEvent.iPosition;    
+    			    SetPositionOnImage( aPointerEvent.iPosition );
+    			    path->AddItemL( aPointerEvent.iPosition );
+    				}
+				break;		
+				}
+			case TPointerEvent::EButton1Up:
+				{
+				iReadyToRender = ETrue;
+				ShowTooltip();
+				lastItem = ETrue;
+				break;
+				}
+						
+			default:
+				{
+				break;	
+				}	
+			}
+			
+    	StoreParameters( lastItem, EFalse ); 
+	    iEditorView->HandleCommandL( EImageEditorCmdRender );//results Draw call
+		CCoeControl::HandlePointerEventL( aPointerEvent );
+		}
+    }
+
+// ---------------------------------------------------------------------------
+// SetPositionOnImage
+// ---------------------------------------------------------------------------
+//    
+void CImageEditorDrawControl::SetPositionOnImage( TPoint aPointedPosition )
+    {    
+    ASSERT( iSysPars );
+    // Get system parameters
+   	TRect visibleImageRect( iSysPars->VisibleImageRect() );
+   	TRect visibleImageRectPrev( iSysPars->VisibleImageRectPrev() );
+
+   	TInt xPosFactorDivider( visibleImageRectPrev.Width() );
+   	TInt yPosFactorDivider( visibleImageRectPrev.Height() );
+    
+   	LOGFMT2(KDrawPluginLogFile, "CImageEditorDrawControl::vir w:%d h:%d", 
+   	        visibleImageRect.Width(), visibleImageRect.Height());
+    LOGFMT2(KDrawPluginLogFile, "CImageEditorDrawControl::virp w:%d h:%d", 
+            visibleImageRectPrev.Width(), visibleImageRectPrev.Height());
+   	   	
+   	// 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 );
+        LOGFMT2(KDrawPluginLogFile, "CImageEditorDrawControl::pfx:%g pfy:%g", 
+                xPositionFactor, yPositionFactor);		
+		// Calculate position on visible image		
+
+   	    iX = visibleImageRect.iTl.iX + 
+   	        visibleImageRect.Width() * xPositionFactor + 0.5;	    
+    	
+    	iY = visibleImageRect.iTl.iY + 
+    	    visibleImageRect.Height() * yPositionFactor + 0.5;    	
+   	    }    
+
+    LOGFMT4(KDrawPluginLogFile, "CImageEditorDrawControl::Draw x:%d iX:%d y:%d iY:%d", 
+            aPointedPosition.iX, iX, aPointedPosition.iY, iY);
+	// Check that not out of bounds    
+    //ClipPosition();          
+    }
+    
+// ---------------------------------------------------------------------------
+// GetPositionOnView
+// ---------------------------------------------------------------------------
+// 
+TPoint CImageEditorDrawControl::GetPositionOnView()
+    {
+    ASSERT( iSysPars );
+    // Get system parameters 
+    TRect visibleImageRect( iSysPars->VisibleImageRect() );
+    TRect visibleImageRectPrev( iSysPars->VisibleImageRectPrev() );
+
+    TInt xPosFactorDivider( visibleImageRectPrev.Width() );
+    TInt yPosFactorDivider( visibleImageRectPrev.Height() );
+    
+    // Calculate relative position on the screen
+    TReal xPositionFactor( TReal( iX + visibleImageRectPrev.iTl.iX ) /
+             xPosFactorDivider );
+                        
+    TReal yPositionFactor( TReal( iY + visibleImageRectPrev.iTl.iY ) /
+             yPosFactorDivider );    
+
+    LOGFMT2(KDrawPluginLogFile, 
+            "CImageEditorDrawControl::GetPositionOnView xf:%g yf:%g", 
+            xPositionFactor , yPositionFactor );    
+    
+    LOGFMT2(KDrawPluginLogFile, 
+            "CImageEditorDrawControl::GetPositionOnView xf:%d yf:%d", 
+            xPosFactorDivider , yPosFactorDivider );     
+    
+    LOGFMT2(KDrawPluginLogFile, 
+            "CImageEditorDrawControl::GetPositionOnView w:%d h:%d", 
+            iX , iY );  
+    
+    TInt xPosition(iX + visibleImageRectPrev.iTl.iX);
+    TInt yPosition(iY + visibleImageRectPrev.iTl.iY);  
+    
+    LOGFMT3(KDrawPluginLogFile, 
+            "CImageEditorDrawControl::GetPositionOnView w:%d h:%d S:%g", 
+            xPosition, yPosition, iSysPars->RelScale());  
+    
+    return TPoint(xPosition, yPosition);
+    }
+
+// ---------------------------------------------------------------------------
+// ShowTooltip
+// ---------------------------------------------------------------------------
+//    
+void CImageEditorDrawControl::ShowTooltip()
+    {   
+    iPopupController->HideInfoPopupNote();
+
+    TPoint iconPosition = ComputeIndicatorPosition();
+    TRect iconRect( iconPosition.iX, iconPosition.iY, 
+                    iconPosition.iX, iconPosition.iY );
+
+                              
+    /*SDrawUtils::ShowToolTip( iPopupController,
+                             this,
+                             iconPosition,
+                             EHRightVTop, 
+                             *iTooltipResize );                                 
+    */
+    
+    }
+
+// ---------------------------------------------------------------------------
+// ScaledLineSize
+// ---------------------------------------------------------------------------
+//    
+TSize CImageEditorDrawControl::ScaledLineSize( TSize aOriginalSize ) const 
+    {
+    TInt sizew(aOriginalSize.iWidth * iSysPars->RelScale() + 0.5);
+    TInt sizeh(aOriginalSize.iHeight * iSysPars->RelScale() + 0.5);
+    if( sizew < 1 )
+        {
+        sizew++;
+        }
+    if( sizeh < 1 )
+        {
+        sizeh++;
+        }
+
+    LOGFMT3(KDrawPluginLogFile, 
+            "CImageEditorDrawControl::ScaledLineSize w:%d h:%d S:%g", 
+            sizew, sizeh, iSysPars->RelScale());    
+    return TSize(sizew , sizeh);
+    }
+        
+// End of File