imageeditor/ImageEditorUI/src/ImageEditorUIView.cpp
changeset 1 edfc90759b9f
child 12 18b321db4884
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorUI/src/ImageEditorUIView.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,1516 @@
+/*
+* 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's view class that handles all view related issues.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <eikmenub.h>
+#include <eikbtgpc.h>
+#include <bautils.h>
+
+#include <avkon.hrh>
+#include <aknviewappui.h>
+#include <aknconsts.h>
+#include <akntitle.h> 
+#include <aknnavi.h>
+#include <aknnavide.h> 
+#include <aknglobalnote.h> 
+#include <sendui.h>
+#include <aknpopup.h> 
+#include <CMessageData.h>
+#include <AknInfoPopupNoteController.h>
+#include <Avkon.rsg>
+
+#include <apgcli.h>
+#include <apadef.h>
+#include <apaid.h>
+#include <StringLoader.h>
+#include <pathinfo.h> 
+
+#include <ImageEditorUI.rsg>
+#include "ImageEditorUI.hrh"
+#include "ImageEditorUIPanics.h"
+#include "ImageEditorUIView.h"
+#include "ImageEditorUIContainer.h" 
+#include "ImageEditorUtils.h"
+
+#include "DrawUtils.h" 
+#include "PluginInfo.h" 
+#include "ResolutionUtil.h"
+
+#include "ImageEditorControlBase.h" 
+#include "SingleParamControl.h" 
+#include "imageeditordebugutils.h"
+#include "plugingrid.h"	
+//#include "platform_security_literals.hrh"
+
+#ifdef AIW_PRINT_PROVIDER_USED
+#include <AiwServiceHandler.h>
+#include <AiwMenu.h>
+#include <AiwCommon.hrh>
+#endif
+
+// CONSTANTS
+_LIT (KResourceDir, "\\resource\\apps\\");
+_LIT (KResourceFile, "imageeditorui.rsc");
+_LIT (KComponentName, "ImageEditorUI");
+
+#define KMediaGalleryUID3           0x101F8599 
+
+// MACRO DEFINITIONS
+#ifdef LANDSCAPE_SUPPORT
+#define LANDSCAPE_ARG(x) x
+#else
+#define LANDSCAPE_ARG(x)
+#endif
+
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ConstructL()
+{
+    LOG(KImageEditorLogFile, "CImageEditorUIView::ConstructL()");
+
+    //	Read resource	
+	TFileName resourcefile;
+	resourcefile.Append(KResourceDir);
+	resourcefile.Append(KResourceFile);
+
+    User::LeaveIfError( CompleteWithAppPath( resourcefile ) );
+    // Implementation of RConeResourceLoader uses BaflUtils::NearestLanguageFile 
+    // to search for a localised resource in proper search order
+    iResLoader.OpenL ( resourcefile );
+    
+    //	Construct base view
+    BaseConstructL (R_IMAGEEDITORUI_VIEW);
+
+    //  Get reference to status pane 
+    CEikStatusPane * sp = AppUi()->StatusPane();
+
+    //  Get reference to navi pane
+    iNaviPane = 
+        (CAknNavigationControlContainer *) sp->ControlL (TUid::Uid (EEikStatusPaneUidNavi));
+
+    //  Get reference to title pane
+    iTitlePane = 
+        (CAknTitlePane *) sp->ControlL (TUid::Uid (EEikStatusPaneUidTitle));
+
+	// Initialize soft key ID:s (needs to be changed if cba resource in 
+	// R_IMAGEEDITORUI_VIEW changes)
+	iSoftkey1 = EAknSoftkeyEmpty;
+	iSoftkey2 = EAknSoftkeyEmpty;
+	iMSK = EAknSoftkeyEmpty;
+	
+    iInPlugin = EFalse;
+        
+    iPopupController = CAknInfoPopupNoteController::NewL();
+    
+	// Read strings needed for zoom popup
+    HBufC8 * res8 = CEikonEnv::Static()->AllocReadResourceAsDes8LC ( R_ZOOM_TEXTS );
+    TResourceReader resource;
+    //Set resource reader buffer
+    resource.SetBuffer( res8 );
+
+    //Read zoom text count
+    TInt16 arraycount = ( TInt16 )resource.ReadInt16();
+    
+    // There have to be as many zoom texts as there are zoom states
+    __ASSERT_ALWAYS( arraycount == ENumOfZooms, User::Panic(KComponentName, 
+                                    EImageEditorPanicZoomTextCountDoesntMatch) );
+    
+    if ( arraycount > 0 )
+        {
+        //Construct a new descriptor array
+        if ( !iZoomTexts )
+            {
+            iZoomTexts = new ( ELeave ) CDesCArraySeg( 16 );
+            }
+
+        //Read text to array
+        for ( TInt i = 0; i < arraycount; ++i )
+            {
+            //Construct a flat descriptor array and read all the texts
+            HBufC * parameter = resource.ReadHBufCL();
+            CleanupStack::PushL( parameter );
+            TPtrC ptr = parameter->Des();
+            iZoomTexts->AppendL ( ptr );
+            CleanupStack::PopAndDestroy(); // parameter
+            }
+        }
+    CleanupStack::PopAndDestroy (); // res8
+
+
+#ifdef AIW_PRINT_PROVIDER_USED
+    iServiceHandler = CAiwServiceHandler::NewL();
+	// Attach menu services.
+	iServiceHandler->AttachMenuL(R_IMAGEEDITORUI_MENUPANE, R_IMAGE_EDITOR_INTEREST);
+#endif   
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Constructred succesfully");
+}
+
+//=============================================================================
+EXPORT_C CImageEditorUIView::CImageEditorUIView() :
+CAknView (),
+iResLoader ( *iEikonEnv ), 
+iBusy(ETrue),
+iContainerInStack(EFalse)
+{
+
+}
+
+//=============================================================================
+EXPORT_C CImageEditorUIView::~CImageEditorUIView()
+{
+	LOG(KImageEditorLogFile, "CImageEditorUIView::~CImageEditorUIView()");
+
+	iResLoader.Close();
+
+#ifdef AIW_PRINT_PROVIDER_USED
+    delete iServiceHandler;
+#endif
+
+    if (iNaviPane && iNaviDecorator)
+    {
+        iNaviPane->Pop (iNaviDecorator);
+        delete iNaviDecorator;
+        iNaviDecorator = 0;
+    }
+    iNaviDecorator = 0;
+	
+	if ( iNaviPane && iPreviousNaviDecorator )
+    {
+        iNaviPane->Pop ( iPreviousNaviDecorator );
+        delete iPreviousNaviDecorator;
+        iPreviousNaviDecorator = 0;
+    }
+    iPreviousNaviDecorator = 0;
+    
+	RemoveContainerFromStack();
+    if ( iContainer )
+	{
+        delete iContainer;
+        iContainer = 0;
+    }
+     
+    iArray.Reset();
+
+    iNaviPane = NULL;
+    iTitlePane = NULL;
+    iControl = NULL;
+    iPreview = NULL;
+    iSendAppUi = NULL;
+    
+    if ( iPopupController )
+        {
+        delete iPopupController;    
+        }
+        
+    if ( iZoomTexts )
+        {
+        iZoomTexts->Reset();  
+        delete iZoomTexts;
+        }
+	
+	LOG(KImageEditorLogFile, "CImageEditorUIView: View deleted");
+}
+
+//=============================================================================
+EXPORT_C TUid CImageEditorUIView::Id() const
+{
+    return KViewId;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::UpdateLayoutL ( TInt LANDSCAPE_ARG(aScreenMode) ) const
+    {
+    CEikStatusPane* sp = StatusPane();
+    __ASSERT_ALWAYS( sp, User::Panic(KComponentName, EImageEditorPanicStatusPaneNotAccessible) );
+
+#ifdef LANDSCAPE_SUPPORT
+
+    TPixelsAndRotation rotation;
+    iEikonEnv->ScreenDevice()->GetScreenModeSizeAndRotation(aScreenMode, rotation);
+
+	LOGFMT2(KImageEditorLogFile, "CImageEditorUIView: View mode: ScreenMode: %d, Rotation: %d", aScreenMode, rotation.iRotation);
+
+    switch (rotation.iRotation)
+    {
+    case CFbsBitGc::EGraphicsOrientationRotated270: // view mode
+        {
+		LOG(KImageEditorLogFile, "CImageEditorUIView: EGraphicsOrientationRotated270");
+
+#ifndef SWAP_SOFTKEY_POSITIONS		
+		sp->SwitchLayoutL(R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_RIGHT);
+#else								
+		sp->SwitchLayoutL(R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_LEFT);
+#endif
+        break;
+        }
+
+    case CFbsBitGc::EGraphicsOrientationRotated90: // camcorder mode
+        {
+		LOG(KImageEditorLogFile, "CImageEditorUIView: EGraphicsOrientationRotated90");
+
+#ifndef SWAP_SOFTKEY_POSITIONS		
+		sp->SwitchLayoutL(R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_LEFT);
+#else						
+		sp->SwitchLayoutL(R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_RIGHT);
+#endif
+        break;
+        }
+
+    case CFbsBitGc::EGraphicsOrientationNormal:
+    default:
+        {
+        if( CResolutionUtil::Self()->GetLandscape() )
+            {
+            sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL /*R_AVKON_WIDESCREEN_PANE_LAYOUT_USUAL_FLAT*/ );
+            }
+        else
+            {
+            sp->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
+            }            
+        break;
+        }
+    }
+
+#endif  
+
+    if (iFullScreen)
+        {
+        //  Hide status pane
+        sp->MakeVisible (EFalse);
+        }
+    else
+        {
+        //  Make status pane visible
+        sp->MakeVisible (ETrue);
+
+#ifdef LANDSCAPE_SUPPORT
+
+        // And now the CBA...
+	    TRect rect = ClientRect();
+
+        CEikButtonGroupContainer* cba = Cba();
+        __ASSERT_ALWAYS( cba, User::Panic(KComponentName, EImageEditorPanicCbaNotAccessible) );
+
+	    MEikButtonGroup* bgrp = cba->ButtonGroup();
+	    STATIC_CAST( CEikCba*, bgrp)->SetBoundingRect(rect);
+	    cba->HandleResourceChange(KEikDynamicLayoutVariantSwitch);
+
+#endif
+        }
+
+    }
+
+//=============================================================================
+EXPORT_C TBool CImageEditorUIView::ViewScreenModeCompatible(TInt /*aScreenMode*/)
+    {
+    // Supports any screen size
+    return ETrue;
+    }
+
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::HandleCommandL (TInt aCommand)
+{   
+
+    // If focus is gained or lost
+    if ( (aCommand == EImageEditorFocusGained) || (aCommand == EImageEditorFocusLost) )
+    {
+    	if (iContainer && iControl)
+    	{
+          	((CImageEditorControlBase *)iControl)->HandlePluginCommandL (aCommand);
+		}
+    }
+  	//  If soft key 1 pressed
+   	else if ( iInPlugin &&  (aCommand == iSoftkey1) && (aCommand != EAknSoftkeyOptions) )
+   	{
+    	if ( iContainer && iContainer->Busy() )
+    	{
+			return;
+		}
+        else
+    	{
+       	((CImageEditorControlBase *)iControl)->HandlePluginCommandL (aCommand);
+		}
+   	}
+
+   	//  If soft key 2 pressed
+   	else if ( iInPlugin && (aCommand == iSoftkey2)  )
+   	{
+    	if ( iContainer && iContainer->Busy() )
+    	{
+			return;
+		}
+        else
+    	{
+            ((CImageEditorControlBase *)iControl)->HandlePluginCommandL (aCommand);
+		}
+   	}
+   	
+   	//  If msk pressed
+   	else if ( iInPlugin && (aCommand == iMSK)  )
+   	{
+    	if ( iContainer && iContainer->Busy() )
+    	{
+			return;
+		}
+        else
+    	{
+            ((CImageEditorControlBase *)iControl)->HandlePluginCommandL (aCommand);
+		}
+   	}
+   	
+    //  Menu plug-in item selected
+    else if ( iInPlugin && MenuItemPressedL(aCommand) )
+    {
+        ((CImageEditorControlBase *)iControl)->HandlePluginCommandL (aCommand);
+    }
+
+    else
+    {
+        switch (aCommand)
+        {
+            case EImageEditorPreGlobalZoomChange:
+            case EImageEditorGlobalZoomChanged:
+            case EImageEditorGlobalCropChanged:
+            case EImageEditorPreGlobalPanChange:
+            case EImageEditorGlobalPanChanged:
+            case EImageEditorGlobalRotationChanged:
+			case EImageEditorPreScreenModeChange:
+			case EImageEditorPostScreenModeChange:
+			{
+                if (iInPlugin)
+                {
+					((CImageEditorControlBase *)iControl)->HandlePluginCommandL (aCommand);
+				}
+				return;
+			}
+
+            case EAknSoftkeyBack:
+            {
+   			if ( iContainer && iContainer->Busy() )
+    			{
+				return;
+				}
+        	else
+    			{
+                AppUi()->HandleCommandL (EImageEditorSoftkeyCmdBack);
+                break;
+				}				
+            }
+            case EImageEditorUpdateSoftkeys:
+            {
+                if (iInPlugin)
+                {
+                    UpdateSoftkeysL();
+                }
+                break;
+            }
+            case EImageEditorUpdateNavipane:
+            {
+                if (iInPlugin)
+                {
+                    UpdateNaviPaneL();
+                }
+                break;
+            }
+            case EImageEditorTryDisplayMenuBar:
+            {
+                CEikMenuBar* menu = MenuBar();
+                __ASSERT_ALWAYS( menu, User::Panic(KComponentName, EImageEditorPanicMenuNotAccessible) );
+                menu->TryDisplayMenuBarL();
+                break;
+            }
+            case EImageEditorDoPrint:
+            {
+#ifdef AIW_PRINT_PROVIDER_USED
+
+                CAiwGenericParamList& in = iServiceHandler->InParamListL();
+
+		        TFileName filename(iImageFileName);
+		        TAiwVariant variant(filename);
+		        TAiwGenericParam param(EGenericParamFile, variant);
+            
+		        in.AppendL(param);	
+
+                iServiceHandler->ExecuteMenuCmdL(
+                    iSelectedPrintMenuCmd, 
+                    in, 
+                    iServiceHandler->OutParamListL()
+                    );
+#endif       
+                break;
+            }
+            default:
+            {
+                // Print and save
+                if (aCommand >= EImageEditorMenuAiwPrintBase &&
+                    aCommand <= EImageEditorMenuAiwPrintLast)
+                    {
+                    iSelectedPrintMenuCmd = aCommand;
+                    AppUi()->HandleCommandL (EImageEditorSaveAndPrint);
+                    }
+                else
+                    {
+                    AppUi()->HandleCommandL (aCommand);
+                    }
+                break;
+            }
+        }
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::HandleClientRectChange()
+{
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Client rect changed");
+
+    if (iContainer)
+    {
+        iContainer->SetRect ( ClientRect() );
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetImageL (CFbsBitmap * aBitmap)
+{
+    iPreview = aBitmap;
+    if (iContainer)
+    {
+	    iContainer->SetImageL (aBitmap);
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetImageFileName (const TDesC& aFileName)
+{
+    iImageFileName.Copy(aFileName);
+}
+
+
+
+//=============================================================================
+EXPORT_C CCoeControl * CImageEditorUIView::GetContainer () const
+{
+	return iContainer;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ActivatePluginL (CCoeControl * aControl)
+{
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Activating plugin");
+
+    // Activate the plugin based on UI type
+    switch ( iArray[iIndex]->PluginUiType() ) 
+    {
+    case 1: // EPluginUiTypeNone
+        {
+            // For non-UI plug-ins active main view and render
+            iInPlugin = EFalse;
+            ActivateMainViewL();
+            HandleCommandL (EImageEditorCmdRender);
+            break;
+
+
+        }
+    case 2: // EPluginUiTypeSingleParam
+    case 3: // EPluginUiTypeMultiParam
+    case 4: // EPluginUiTypeCustomized
+        {
+            iInPlugin = ETrue;
+
+            //  Set control
+            iControl = aControl;
+            if (iContainer)
+            {
+                iContainer->SetControl (iControl);
+            }
+
+            //  Set plug-in item
+            if (iControl)
+            {
+                LOG(KImageEditorLogFile, "CImageEditorUIView: Activating plugin: calling SetSelectedUiItemL");
+
+                ((CImageEditorControlBase *)iControl)->SetSelectedUiItemL (iArray[iIndex]);
+            }
+
+            //  Prepare the plug-in item
+            if (iControl)
+            {
+                LOG(KImageEditorLogFile, "CImageEditorUIView: Activating plugin: calling PrepareL");
+
+                ((CImageEditorControlBase *)iControl)->PrepareL ();
+            }
+
+            //  Update soft keys
+            UpdateSoftkeysL();
+
+            //  Update navigation pane
+            UpdateNaviPaneL();
+			
+            break;
+        }
+    default:
+        {
+            iInPlugin = ETrue;
+
+            //  Set control
+            iControl = aControl;
+            if (iContainer)
+            {
+                iContainer->SetControl (iControl);
+            }
+    	    break;
+        }
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ActivateMainViewL()
+{
+
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Activating main view");
+
+    iInPlugin = EFalse;
+
+    //  Reset buttons
+	iSoftkey1 = EAknSoftkeyOptions;
+	iSoftkey2 = EAknSoftkeyBack;
+	iMSK = EImageEditorMenuCmdApplyEffect;
+	
+    if ( InZoomingState() )
+        {
+        if ( iZoomMode == ( ENumOfZooms - 1 ) )
+            {
+            SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_CANCEL );
+            }
+        else
+            {
+            SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_CANCEL_ZOOMIN );
+            }        
+        }
+     else
+        {
+        SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_BACK_APPLY );
+        }
+
+    //  Reset navi pane
+    ClearNaviPaneTextL();
+
+    //  Set control in container to NULL
+    iControl = 0;
+    if (iContainer)
+    {
+        iContainer->SetControl (iControl);
+    }
+    
+}
+
+//=============================================================================
+EXPORT_C CPluginInfo * CImageEditorUIView::GetSelectedPluginInfoL ()
+{
+    TInt selectedItem;
+    TInt dialog_ok = CPluginSelectionDialog::RunDlgLD(&iPreview, selectedItem, &iArray, ClientRect());
+
+    if (dialog_ok && selectedItem != KErrCancel)
+    {
+        iIndex = selectedItem;
+        return iArray[selectedItem];
+    }
+    else
+    {
+     if ( InZoomingState() )
+        {
+        if ( iZoomMode == ( ENumOfZooms - 1 ) )
+            {
+            SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_CANCEL );
+            }
+        else
+            {
+            SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_CANCEL_ZOOMIN );
+            }        
+        }
+     else
+        {
+        SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_BACK_APPLY );
+        }           
+        return NULL;
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::AddPluginUiItemL (const CPluginInfo * aPluginInfo)
+{
+    TLinearOrder<CPluginInfo> order (CPluginInfo::ComparePluginOrder);
+    iArray.InsertInOrder (aPluginInfo, order);
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetCustomButtonsL (TInt aResourceID) const
+{
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Setting buttons");
+
+    CEikButtonGroupContainer* cba = Cba();
+    __ASSERT_ALWAYS( cba, User::Panic(KComponentName, EImageEditorPanicCbaNotAccessible) );
+
+    cba->SetCommandSetL (aResourceID);
+    cba->DrawDeferred();
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorUIView::LaunchSaveChangesQueryL () const
+{
+	//	Create dialog prompt
+    HBufC * prompt = iEikonEnv->AllocReadResourceLC (R_LIST_QUERY_SAVE_CONFIRMATION);
+    
+	//	Execute query dialog
+	TInt ret = SDrawUtils::LaunchQueryDialogL (*prompt);
+
+	CleanupStack::PopAndDestroy(); // prompt
+
+	return ret;
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorUIView::LaunchExitWithoutSavingQueryL () const
+{
+	//	Create dialog prompt
+    HBufC * prompt = iEikonEnv->AllocReadResourceLC (R_LIST_QUERY_EXIT_WITHOUT_SAVING_CONFIRMATION);
+    
+	//	Execute query dialog
+	TInt ret = SDrawUtils::LaunchQueryDialogL (*prompt);
+
+	CleanupStack::PopAndDestroy(); // prompt
+
+	return ret;
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorUIView::LaunchCancelTextInputQueryL () const
+{
+   
+	// Create dialog prompt
+	// At the moment query is not in use and corresponding string is removed
+	// from the loc file. To enable this, a new string has to be defined. 
+    HBufC * prompt = iEikonEnv->AllocReadResourceLC(R_LIST_QUERY_CANCEL_TEXT_INPUT);
+    
+	//	Execute query dialog
+	TInt ret = SDrawUtils::LaunchQueryDialogOkOnlyL (*prompt);
+
+	CleanupStack::PopAndDestroy(); // save_conf, prompt
+
+	return ret;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::LaunchSendQueryL (
+    const TSendingCapabilities& aCaps,
+    TFileName& aFileName
+    ) const
+{
+    if (iSendAppUi)
+    {
+        CMessageData* msgData = CMessageData::NewLC();        
+        msgData->AppendAttachmentL(aFileName);       	
+
+        iSendAppUi->ShowQueryAndSendL (msgData, aCaps);
+
+		CleanupStack::PopAndDestroy(msgData);
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::LaunchSendQueryL (
+    const TSendingCapabilities& aCaps,
+    RFile& aFileHandle
+    ) const
+{
+    if (iSendAppUi)
+    {
+        CMessageData* msgData = CMessageData::NewLC();        
+        msgData->AppendAttachmentHandleL(aFileHandle);       	
+
+        iSendAppUi->ShowQueryAndSendL (msgData, aCaps);
+
+		CleanupStack::PopAndDestroy(msgData);
+    }
+}
+
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::LaunchSaveWaitDialogL(
+    CAknProgressDialog** 			aSelfPtr,
+	TInt							aFinalValue,
+    MProgressDialogCallback*		aCallback
+    ) const
+{
+	//	Create dialog prompt
+	HBufC * prompt;
+		    
+    TApaAppCaption caption;
+    TRAPD( err, ResolveCaptionNameL( caption ) );
+    
+    // If something goes wrong, show basic "Saving" note
+    if ( err )
+        {
+        prompt = iEikonEnv->AllocReadResourceLC( R_WAIT_NOTE_SAVING );
+        }
+    else
+        {
+        prompt =  StringLoader::LoadLC( R_WAIT_NOTE_SAVING_TO, caption );
+        }        
+        
+	//	Launch wait dialog with Cancel softkey
+	SDrawUtils::LaunchProgressNoteL (
+        aSelfPtr, 
+        R_PROGRESS_DIALOG, 
+        *prompt, 
+        aFinalValue, 
+        aCallback
+        );
+
+	CleanupStack::PopAndDestroy(); // prompt
+}
+
+//=============================================================================
+void CImageEditorUIView::ResolveCaptionNameL( TApaAppCaption& aCaption ) const
+    {   
+    RApaLsSession appArcSession;
+    CleanupClosePushL( appArcSession );
+    User::LeaveIfError( appArcSession.Connect() );       	    
+    
+    // Get Media Gallery caption
+    TApaAppInfo appInfo;
+    User::LeaveIfError( appArcSession.GetAppInfo( appInfo, TUid::Uid( KMediaGalleryUID3 ) ) );
+    
+    aCaption = appInfo.iCaption;
+    
+    CleanupStack::PopAndDestroy( &appArcSession );  
+    }
+    
+//=============================================================================
+EXPORT_C void CImageEditorUIView::LaunchLoadWaitDialogL(
+    CAknWaitDialog** 				aSelfPtr,
+    MProgressDialogCallback*		aCallback
+    ) const
+{
+	//	Create dialog prompt
+	HBufC * prompt = iEikonEnv->AllocReadResourceLC (R_WAIT_NOTE_LOADING);
+
+	//	Launch wait dialog with empty softkeys
+	SDrawUtils::LaunchWaitNoteL (
+        aSelfPtr, 
+        R_WAIT_DIALOG, 
+        *prompt, 
+        aCallback
+        );
+
+	CleanupStack::PopAndDestroy(); // prompt
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::LaunchWaitDialog() const
+{   
+    // Show empty set of cba buttons while animation on the screen
+    SetCustomButtonsL ( R_AVKON_SOFTKEYS_EMPTY );
+	iContainer->ShowWaitNote();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::HideWaitDialog() const
+{
+	iContainer->HideWaitNote();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ShowInformationNoteL (const TDesC& aNoteText) const
+{
+
+    CAknGlobalNote * globalnote = CAknGlobalNote::NewLC();
+    globalnote->ShowNoteL (EAknGlobalInformationNote, aNoteText); 
+
+    CleanupStack::PopAndDestroy(); // globalnote
+
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ShowConfirmationNoteL (const TDesC& aNoteText) const
+{
+
+    CAknGlobalNote * globalnote = CAknGlobalNote::NewLC();
+    globalnote->ShowNoteL (EAknGlobalConfirmationNote, aNoteText); 
+
+    CleanupStack::PopAndDestroy(); // globalnote
+
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetNaviPaneTextL (
+    const TDesC & aText,
+	TBool aLeftNaviPaneScrollButtonVisibile, 
+	TBool aRightNaviPaneScrollButtonVisible )
+    {
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Setting navi pane text");
+
+    if (iNaviPane )
+        {
+        //  Create a new decorator
+        CAknNavigationDecorator* newNaviDecorator = 
+                                    iNaviPane->CreateNavigationLabelL (aText);
+        CleanupStack::PushL (newNaviDecorator);
+  
+        // Set the navi scroll indicators for the new decorator
+        newNaviDecorator->SetScrollButtonDimmed( 
+                            CAknNavigationDecorator::ELeftButton, 
+                            !aLeftNaviPaneScrollButtonVisibile );
+        newNaviDecorator->SetScrollButtonDimmed( 
+                            CAknNavigationDecorator::ERightButton, 
+                            !aRightNaviPaneScrollButtonVisible );        
+        if ( aLeftNaviPaneScrollButtonVisibile || aRightNaviPaneScrollButtonVisible )
+            {
+            newNaviDecorator->MakeScrollButtonVisible( ETrue );
+            }
+        
+        // Set new decorator on top of Navi Pane's decorator stack 
+        // (topmost decorator is the one to show)
+        iNaviPane->PushL (*newNaviDecorator);
+
+        // remove old "previous decorator" from decorator stack and delete it
+        if ( iPreviousNaviDecorator )
+            {   
+            iNaviPane->Pop( iPreviousNaviDecorator );
+            delete iPreviousNaviDecorator;
+            iPreviousNaviDecorator = NULL;               
+            }
+        
+        // update decorator pointers to new ones    
+        iPreviousNaviDecorator = iNaviDecorator;
+        iNaviDecorator = newNaviDecorator;
+        
+        // set observer for the currently shown decorator
+        (iNaviPane->Top())->SetNaviDecoratorObserver( iContainer );
+
+        CleanupStack::Pop (newNaviDecorator);  
+        }
+
+    }
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ClearNaviPaneTextL()
+{
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Clearing navi pane text");
+    if (iNaviPane)
+    {
+        if (iNaviDecorator)
+        {
+            iNaviPane->Pop (iNaviDecorator);
+            delete iNaviDecorator;
+            iNaviDecorator = 0;
+        }
+        
+        if (iPreviousNaviDecorator)
+        {
+            iNaviPane->Pop (iPreviousNaviDecorator);
+            delete iPreviousNaviDecorator;
+            iPreviousNaviDecorator = 0;
+        }
+	    HBufC * title = iEikonEnv->AllocReadResourceLC (R_MAIN_VIEW_TITLE);
+        iNaviDecorator = iNaviPane->CreateNavigationLabelL ( title->Des() );
+        iPreviousNaviDecorator = iNaviPane->CreateNavigationLabelL ( title->Des() );
+                
+        iNaviPane->PushL (*iPreviousNaviDecorator); 
+        iNaviPane->PushL (*iNaviDecorator);
+        iNaviPane->DrawDeferred();
+        iNaviDecorator->DrawDeferred();
+        CleanupStack::PopAndDestroy(); // title
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetTitlePaneTextL (const TDesC & aText)
+{
+    iTitlePane->SetTextL (aText);
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ClearTitlePaneTextL()
+{
+    iTitlePane->SetTextL ( KNullDesC );
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetSoftKey1L (
+	const TDesC &	aText,
+	const TInt		aCommand
+	)
+{
+    CEikButtonGroupContainer * cba = Cba();
+   // TInt replace_position = cba->PositionById (iSoftkey1);
+    TInt replace_position( CEikButtonGroupContainer::ELeftSoftkeyPosition );
+    cba->SetCommandL (replace_position, aCommand, aText);
+    cba->DrawDeferred();
+    iSoftkey1 = aCommand;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetSoftKey2L (
+	const TDesC &	aText,
+	const TInt		aCommand
+	)
+{
+    CEikButtonGroupContainer * cba = Cba();
+    //TInt replace_position = cba->PositionById (iSoftkey2); 
+    TInt replace_position( CEikButtonGroupContainer::ERightSoftkeyPosition );
+    cba->SetCommandL (replace_position, aCommand, aText);
+    cba->DrawDeferred();
+    iSoftkey2 = aCommand;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetMiddleSoftKeyL (
+	const TDesC &	aText,
+	const TInt		aCommand
+	)
+{
+    CEikButtonGroupContainer * cba = Cba();
+    
+    if ( aCommand == EAknSoftkeyContextOptions )
+        {
+        TInt contextMenuId = 
+            ((CImageEditorControlBase *)iControl)->GetContextMenuResourceId();  
+        if ( contextMenuId )
+            {
+            MenuBar()->SetContextMenuTitleResourceId( contextMenuId );
+            }
+        }
+        
+    TInt replace_position( CEikButtonGroupContainer::EMiddleSoftkeyPosition );
+    cba->SetCommandL ( replace_position, aCommand, aText );
+    cba->DrawDeferred();
+    iMSK = aCommand;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetBusy()
+{
+    
+	if (iContainer)
+	{
+		iContainer->SetBusy();
+	}
+	
+	iBusy = ETrue;
+	RemoveContainerFromStack();	
+
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ResetBusy()
+{
+
+	AddContainerToStack();
+	iBusy = EFalse;
+    
+    if (iContainer)
+	{
+		iContainer->ResetBusy();
+	}
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetUndoFlag (const TBool aUndo)
+{
+    iCanUndo = aUndo;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetSaveFlag (const TBool aSave)
+{
+    iCanSave = aSave;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetFullScreen()
+{
+    if (iContainer)
+    {
+        iContainer->SetFullScreen();
+    }
+    iFullScreen = ETrue;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::ResetFullScreen()
+{
+    if (iContainer)
+    {
+        iContainer->ResetFullScreen();
+    }
+    iFullScreen = EFalse;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetZoomModeL ( const TZoomMode& aMode )
+{
+	iZoomMode = aMode;
+	
+	HandleZoomModeChangeL();
+	
+}
+
+//=============================================================================
+void CImageEditorUIView::HandleZoomModeChangeL()
+    {
+    
+    if ( !iInPlugin && iZoomMode != EZoomNormal )
+	    {
+	    if ( iZoomMode != ( ENumOfZooms - 1 ) )
+	        {
+	        SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_CANCEL_ZOOMIN );
+	        }
+	    else
+	        {
+	        SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_CANCEL );
+	        }	    
+	    }
+	else if ( !iInPlugin && iZoomMode == EZoomNormal )
+	    {
+
+	    SetCustomButtonsL( R_IMAGEEDITORUI_SK_OPTIONS_BACK_APPLY );
+	    }
+	
+	// hide previous tooltip
+	iPopupController->HideInfoPopupNote();
+    
+    // show tooltip (also if in plugin)
+    if ( iZoomMode != EZoomNormal )
+        {
+                
+        SDrawUtils::ShowToolTip ( iPopupController,
+                                  ( CCoeControl* )iContainer, 
+                                  TPoint( iContainer->Rect().iTl.iX,
+                                          iContainer->Rect().iTl.iY ),
+                                  EHRightVTop,
+                                  iZoomTexts->MdcaPoint( iZoomMode ) ); 
+        }
+    
+    }
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::DynInitMenuPaneL (
+	TInt			aResourceId,
+	CEikMenuPane *	aMenuPane
+	)
+    {
+    // This is called by the framework, aMenuPane should never be null pointer...
+    __ASSERT_ALWAYS( aMenuPane, User::Panic(KComponentName, EImageEditorPanicMenuNotAccessible) );
+
+#ifdef AIW_PRINT_PROVIDER_USED
+    if ( iServiceHandler->HandleSubmenuL( *aMenuPane ) )
+        {
+        // Return if AIW submenu 
+        return;    
+        }
+#endif    
+        
+	if ( aResourceId != R_IMAGEEDITORUI_MENUPANE )
+	    {
+        return;
+        }    
+
+    // In busy mode
+    if ( iBusy )  
+        {
+        DimAllL ( aResourceId, *aMenuPane );
+        }
+    // In idle mode
+    else
+        {
+        //  In plug-in mode
+        if ( iInPlugin )
+            {
+            DimAllL ( aResourceId, *aMenuPane );
+            InsertPluginItemsL ( *aMenuPane );
+            
+#ifdef FULLSCREEN_AVAILABLE            
+            // After plugin specific items, add menu commands that are common
+            // for all plugins' options menus
+            // In normal screen mode
+            if ( !iFullScreen )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdFullScreen, EFalse );
+                }
+
+            // In full screen mode
+            else
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdNormalScreen, EFalse );
+                }
+#endif // FULLSCREEN_AVAILABLE        
+   
+            aMenuPane->SetItemDimmed ( EImageEditorMenuCmdHelp, EFalse );
+            aMenuPane->SetItemDimmed ( EImageEditorMenuCmdExit, EFalse );    
+            }
+        else if ( InZoomingState() )
+            {
+            aMenuPane->SetItemDimmed( EImageEditorMenuCmdUndo, ETrue );
+#ifdef FULLSCREEN_AVAILABLE
+            aMenuPane->SetItemDimmed( EImageEditorMenuCmdFullScreen, ETrue );
+            aMenuPane->SetItemDimmed( EImageEditorMenuCmdNormalScreen, ETrue );
+#endif // FULLSCREEN_AVAILABLE  
+            
+            if ( !iCanSave || IsMemoryInCriticalLevel() )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdSave, ETrue );
+                }      
+            
+            TInt position;
+            if ( aMenuPane->MenuItemExists( EImageEditorMenuCmdSend, 
+                                            position ) )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdSend, ETrue );
+                }                           
+            if ( aMenuPane->MenuItemExists( EImageEditorAiwCriteriaPrint, 
+                                            position ) )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorAiwCriteriaPrint, ETrue );
+                }    
+            
+            if ( iZoomMode == EZoomIn3 )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdZoomIn, ETrue );
+                }
+            // Set "Apply Effect" item to be after "Zoom Out" in zooming 
+            // state's options menu
+            if ( aMenuPane->MenuItemExists( EImageEditorMenuCmdApplyEffect, 
+                                            position ) )
+                {
+                CEikMenuPaneItem::SData data = 
+                        aMenuPane->ItemData( EImageEditorMenuCmdApplyEffect );
+                aMenuPane->DeleteMenuItem( EImageEditorMenuCmdApplyEffect );
+                aMenuPane->AddMenuItemL( data, EImageEditorMenuCmdZoomOut );
+                }
+            }
+        //  In main view mode
+        else
+            {
+
+#ifdef AIW_PRINT_PROVIDER_USED
+    
+#else
+            aMenuPane->SetItemDimmed( EImageEditorAiwCriteriaPrint, ETrue );
+#endif   
+
+            //  Display CSendUi menu item
+            if ( iSendAppUi )
+                {
+         		iSendAppUi->AddSendMenuItemL( 
+         			*aMenuPane,
+         			SIE_SENDUI_MENU_ITEM_INDEX,
+         			EImageEditorMenuCmdSend,
+         			TSendingCapabilities (0, 0, TSendingCapabilities::ESupportsAttachments) );
+                }
+
+            //  Nothing to undo
+            if ( !iCanUndo )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdUndo, ETrue );
+                }
+#ifdef FULLSCREEN_AVAILABLE
+            // In full screen mode
+            if ( iFullScreen )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdFullScreen, ETrue );
+                }
+
+            // In normal screen mode
+            else
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdNormalScreen, ETrue );
+                }
+#endif // FULLSCREEN_AVAILABLE
+            if ( !iCanSave || IsMemoryInCriticalLevel() )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdSave, ETrue );
+                }
+                
+            if ( iZoomMode == EZoomNormal )
+                {
+                aMenuPane->SetItemDimmed( EImageEditorMenuCmdZoomOut, ETrue );
+		        aMenuPane->SetItemDimmed( EImageEditorMenuCmdFitToScreen, ETrue );
+                }
+			    
+#ifdef AIW_PRINT_PROVIDER_USED
+            if ( iServiceHandler->IsAiwMenu( aResourceId ) )
+    		    {
+                CAiwGenericParamList& in = iServiceHandler->InParamListL();
+    	
+    		    TFileName filename( iImageFileName );
+    		    TAiwVariant variant( filename );
+    		    TAiwGenericParam param( EGenericParamFile, variant );
+                
+    		    in.AppendL( param );	
+
+    		    iServiceHandler->InitializeMenuPaneL( *aMenuPane, 
+    		                                          aResourceId, 
+    		                                          EImageEditorMenuAiwPrintBase, 
+    		                                          in);
+    		    }  
+#endif
+
+            }
+        }
+    }
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::SetSendAppUi(CSendUi* aSendAppUi)
+    {
+    iSendAppUi = aSendAppUi;
+    }
+
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::HandleStatusPaneSizeChange()
+{
+
+}
+
+//=============================================================================
+void CImageEditorUIView::DimAllL (
+	TInt			/*aResourceId*/,
+	CEikMenuPane &	aMenuPane
+	) const
+{
+	LOG(KImageEditorLogFile, "CImageEditorUIView::DimAllL");
+
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdApplyEffect, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdExit, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdUndo, ETrue);
+#ifdef FULLSCREEN_AVAILABLE    
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdFullScreen, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdNormalScreen, ETrue);
+#endif // FULLSCREEN_AVAILABLE    
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdZoomIn, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdZoomOut, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdSave, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorAiwCriteriaPrint, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdHelp, ETrue);
+    aMenuPane.SetItemDimmed (EImageEditorMenuCmdFitToScreen, ETrue);    
+}
+
+//=============================================================================
+void CImageEditorUIView::UpdateSoftkeysL ()
+{
+    __ASSERT_ALWAYS( iControl, User::Panic(KComponentName, EImageEditorPanicControlIsNull) );
+
+    //  Get plug-in info
+    CPluginInfo * pgn_info = iArray[iIndex];
+
+    //  Get soft key pair index 
+    TInt sk_index = ((CImageEditorControlBase *)iControl)->GetSoftkeyIndexL();
+
+    //  Set soft key 1
+    SetSoftKey1L ( 
+        pgn_info->Sk1Texts()[sk_index], 
+        pgn_info->Sk1Cmds()[sk_index] 
+        );
+
+    //  Set soft key 2
+    SetSoftKey2L ( 
+        pgn_info->Sk2Texts()[sk_index], 
+        pgn_info->Sk2Cmds()[sk_index] 
+        );
+        
+    //  Set middle soft key
+    SetMiddleSoftKeyL ( 
+        pgn_info->MSKTexts()[sk_index], 
+        pgn_info->MSKCmds()[sk_index] 
+        );    
+}
+
+//=============================================================================
+void CImageEditorUIView::UpdateNaviPaneL()
+{
+    __ASSERT_ALWAYS( iControl, User::Panic(KComponentName, EImageEditorPanicControlIsNull) );
+
+    TBool leftNaviPaneScrollButtonVisibile;
+    TBool rightNaviPaneScrollButtonVisible;
+    TPtrC naviText =  ((CImageEditorControlBase *)iControl)->GetNaviPaneTextL(
+        leftNaviPaneScrollButtonVisibile,
+        rightNaviPaneScrollButtonVisible );
+
+    SetNaviPaneTextL ( 
+        naviText,
+        leftNaviPaneScrollButtonVisibile,
+        rightNaviPaneScrollButtonVisible );
+}
+
+//=============================================================================
+void CImageEditorUIView::InsertPluginItemsL (CEikMenuPane &	aMenuPane)
+{
+    __ASSERT_ALWAYS( iControl, User::Panic(KComponentName, EImageEditorPanicControlIsNull) );
+
+    // Insert the plug-in commands
+    CMenuItemArray & menu_items = iArray[iIndex]->MenuItems();
+    TBitField dimmed = ((CImageEditorControlBase *)iControl)->GetDimmedMenuItems();
+    for (TInt i = 0; i < menu_items.Count(); ++i)
+    {
+        // Check the visibility for each menu item.
+        if ( ! dimmed.GetBit(i) )
+        {
+            aMenuPane.InsertMenuItemL ( menu_items[i], i );
+        }
+    }
+}
+
+//=============================================================================
+TBool CImageEditorUIView::MenuItemPressedL (TInt aCommand)
+{ 
+    CMenuItemArray & menu_items = iArray[iIndex]->MenuItems();
+    for (TInt i = 0; i < menu_items.Count(); ++i)
+    {
+        if ( menu_items[i].iCommandId == aCommand )
+        {
+            return ETrue;
+        }
+    }
+    return EFalse;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::DoActivateL (
+   const TVwsViewId &		/*aPrevViewId*/,
+   TUid						/*aCustomMessageId*/,
+   const TDesC8 &			/*aCustomMessage*/
+   )
+{
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Activating view");
+    //  Construct container
+    iContainer = new (ELeave) CImageEditorUIContainer;
+    iContainer->SetMopParent (this);
+    iContainer->ConstructL ( ClientRect() );
+	iContainer->SetView (this);
+    HandleCommandL (EImageEditorCmdViewReady);
+  
+}
+
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::DoDeactivate()
+{
+    LOG(KImageEditorLogFile, "CImageEditorUIView: Deactivating view");
+    
+    RemoveContainerFromStack();
+    
+    if ( iContainer )
+	{
+		delete iContainer;
+		iContainer = 0;
+    }
+}
+
+//=============================================================================
+void CImageEditorUIView::AddContainerToStack()
+{
+	if (!iContainerInStack && iContainer)
+	{
+		TRAPD(err, AppUi()->AddToViewStackL (*this, iContainer); );
+		if (err == KErrNone)
+		{
+			iContainerInStack = ETrue;		
+		}
+	}	
+}
+
+
+
+//=============================================================================
+void CImageEditorUIView::RemoveContainerFromStack()
+{
+	if (iContainerInStack)
+	{
+		AppUi()->RemoveFromViewStack (*this, iContainer);	
+		iContainerInStack = EFalse;	
+	}	
+}
+
+//=============================================================================
+EXPORT_C TBool CImageEditorUIView::InZoomingState()
+    {
+    if ( iZoomMode == EZoomIn1 || 
+         iZoomMode == EZoomIn2 ||
+         iZoomMode == EZoomIn3 )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+//=============================================================================
+EXPORT_C TInt CImageEditorUIView::LaunchSaveImageQueryL () const
+{
+
+	//	Create dialog heading and options
+    HBufC * heading = CEikonEnv::Static()->AllocReadResourceLC (R_SIE_LIST_QUERY_HEADING_SAVE);
+    HBufC * option1 = CEikonEnv::Static()->AllocReadResourceLC (R_SIE_LIST_QUERY_SAVE_NEW); 
+    HBufC * option2 = CEikonEnv::Static()->AllocReadResourceLC (R_SIE_LIST_QUERY_SAVE_REPLACE);       
+                
+	//	Query dialog texts
+	CDesCArray * options = new (ELeave) CDesCArraySeg (2);
+	CleanupStack::PushL (options);
+	options->AppendL( option1->Des() );
+	options->AppendL( option2->Des() );
+
+	//	Execute query dialog
+	TInt ret = SDrawUtils::LaunchListQueryDialogL (options, *heading);
+
+	options->Reset();
+	
+	CleanupStack::PopAndDestroy(4); //options, option2, option1, heading
+	
+	return ret;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorUIView::GetTouchPanDirections( TInt& xMovement, 
+                                                         TInt& yMovement )
+    {
+
+    xMovement = 0;
+    yMovement = 0;
+    iContainer->GetDragDirections( xMovement, yMovement );
+    }
+    
+EXPORT_C TBool CImageEditorUIView::IsMemoryInCriticalLevel()
+	{
+	TEntry entry;
+	RFs & fs = iEikonEnv->FsSession(); 
+	fs.Entry( iImageFileName, entry );
+	TFileName driveAndPath;
+	driveAndPath.Copy( PathInfo::PhoneMemoryRootPath() );
+	driveAndPath.Append( PathInfo::ImagesPath() );
+	return !ImageEditorUtils::ImageFitsToDriveL( fs, iImageFileName, driveAndPath);
+	}
+
+// End of File
+