svgtviewer/SvgtViewerPlugin/UIControlSrc/SVGTUIDialog.cpp
branchRCL_3
changeset 20 5fd161fa28b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtviewer/SvgtViewerPlugin/UIControlSrc/SVGTUIDialog.cpp	Thu Sep 09 11:17:40 2010 +0300
@@ -0,0 +1,1310 @@
+/*
+* Copyright (c) 2004,2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This file implements the SVGT Dialog which
+*                is used to display SVGT content
+*
+*/
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <uikon/eikctrlstatus.h>
+#endif
+
+#include <e32std.h>
+#include <AknDialog.h>
+#include <coeaui.h>
+#include <eikenv.h>
+#include <bautils.h>
+#include <eikdialg.h>
+#include <eikmenup.h>
+#include <eikspane.h>
+
+#ifdef __SERIES60_HELP
+#include <hlplch.h>
+#endif // __SERIES60_HELP
+
+#include <coeaui.h>
+#include <aknnavi.h> 
+#include <aknnavide.h> 
+#include <AknWaitNoteWrapper.h>
+#include <SVGRequestObserver.h>
+#include <aknnotewrappers.h>
+#include <akntitle.h>
+#include <data_caging_path_literals.hrh>
+#include <StringLoader.h>
+#include <svgtuicontrol.rsg>
+#include <csxhelp/svgt.hlp.hrh>
+//-----------
+
+// User Includes
+#include "SVGTAppObserver.h"
+#include "SVGTCustControl.h"
+#include "SVGTUIDialog.h"
+#include "svgtfileviewdetails.h"
+
+#include "SVGTUIDialog.hrh"
+#include "SvgtDecoratorControl.h"
+
+const TInt KButtonContainerDisplayTime = 5000000;
+
+// Constants
+
+// The Middle softkey has position 3 at button group's stack
+const TInt KMiddleSKId=3;
+_LIT( KResourceFileName, "Z:SVGTUIControl.rsc" );
+#ifdef _DEBUG
+//_LIT( KUnknownCommandStr, "Unknown Command" );
+#endif
+
+#ifdef __SERIES60_HELP
+// Help Context UID = DLL UID3
+const TUid KSvgtHelpContextUid = { 0x101F8749 };
+#endif // __SERIES60_HELP
+
+// Times longer than this many seconds are shown using the long format
+const TInt KShortTimeLimit = 59*60 + 59; 
+
+// Maximum number of seconds shown in the time duration field
+const TInt KMaxTotalTimeSeconds = 9*60*60 + 59*60 + 59; // 59:59
+
+// Maximum length for both the time elapsed/remaining string "mm:ss/mm:ss"
+// and post-recording text "Length: mm:ss"
+const TInt KMaxTimeTextLength = 40;
+
+// This many microseconds in a second
+const TInt KMicro = 1000000;  
+
+// Key Constant for toggling between Full/Normal Screen
+const TInt KSvgScreenToggleKey = '*';
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::CSVGTUIDialog
+// Default Constructor. Initialises Dialog State Variables.
+// -----------------------------------------------------------------------------
+//
+CSVGTUIDialog::CSVGTUIDialog()
+    {
+    // SVGT Viewer State Variables
+    iSaveEnable = EFalse;
+    iPreview = EFalse;
+    iCustControl = NULL;
+    iAppObserver = NULL;
+    iIsVolumeMuted = EFalse;
+    iLastCommandID = EAknSoftkeyOptions;
+    iIsButtonContainerVisible = ETrue;
+    iQuietExitWhenOrientationChange = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::ConstructL
+// Second Phase Constructor for CSVGTUIDialog. Opens resource file, reads the
+// dialog menu resource and calls CAknDialog::ConstructL with the resource as
+// param.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::ConstructL()
+    {
+    // Find which drive this DLL is installed.
+    TFileName fileName;
+
+    // Get the full resource file
+    TParse lParse;
+
+    // Add the resource dir
+    lParse.Set( KResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL);
+
+    // Get the filename with full path
+    fileName = lParse.FullName();
+
+    BaflUtils::NearestLanguageFile( iEikonEnv->FsSession(), fileName ); //for
+                                                               // localization
+    iResourceOffset = iEikonEnv->AddResourceFileL( fileName );
+
+    // Read time format strings from AVKON resource
+    iTimeFormatShort = 
+        iEikonEnv->AllocReadResourceL( R_QTN_TIME_DURAT_MIN_SEC_WITH_ZERO );
+    iTimeFormatLong =
+        iEikonEnv->AllocReadResourceL( R_QTN_TIME_DURAT_LONG );
+
+    iBtnCntrTimer = CPeriodic::NewL( CActive::EPriorityStandard);
+    CAknDialog::ConstructL( R_SVGT_DIALOG_MENUBAR );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::NewL
+// Factory function for creating CSVGTUIDialog objects.
+// Returns: CSVGTUIDialog* ; Pointer to the created object.
+//          Leaves if error occurs during creation.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSVGTUIDialog* CSVGTUIDialog::NewL()
+    {
+    CSVGTUIDialog* self = CSVGTUIDialog::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::NewLC
+// Factory function for creating CSVGTUIDialog objects. It also pushes the
+// created dialog object onto the cleanup stack.
+// Returns: CSVGTUIDialog* ; Pointer to the created object.
+//          Leaves if error occurs during creation.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSVGTUIDialog* CSVGTUIDialog::NewLC()
+    {
+    CSVGTUIDialog* self = new ( ELeave ) CSVGTUIDialog();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// Destructor
+CSVGTUIDialog::~CSVGTUIDialog()
+    {
+    if ( iResourceOffset != 0 )
+        {
+        iEikonEnv->DeleteResourceFile( iResourceOffset );
+        }
+    // Custom Control will be automatically destroyed by dialog framework
+    iCustControl = NULL;
+    // App Observer is reset.
+    iAppObserver = NULL;
+
+    // Set the text in status pane to the stored one            
+    if (iAppTitleText)
+        {
+        // Get the Status Pane Control
+        CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+        // Get the title pane 
+        CAknTitlePane* tp = NULL;
+        TRAPD( errGetControl, 
+            tp = static_cast< CAknTitlePane* >( sp->ControlL( 
+            TUid::Uid( EEikStatusPaneUidTitle ) ) ) );
+        if ( errGetControl == KErrNone && tp )
+            {
+            //set application name in the title pane
+            TRAPD( errSetText, 
+                tp->SetTextL(*iAppTitleText) );
+            if ( errSetText != KErrNone )
+                {
+                // No error handling here
+                }
+            }
+        
+        delete iAppTitleText;
+        iAppTitleText = NULL;
+
+        delete iProgressText;
+        iProgressText = NULL;
+        }
+    
+    // Clear the Navi-Pane Decorator    
+    if ( iNaviDecorator )
+        {
+        // Restore the old navi-pane
+        CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+        
+        CAknNavigationControlContainer* np = NULL;
+        TRAPD( errGetNaviControl, 
+            np = static_cast< CAknNavigationControlContainer* >
+            ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ) );
+        if ( errGetNaviControl == KErrNone && np )
+            {
+            TRAPD( errPushDefNaviControl, 
+                np->PushDefaultL ()); // Set default.    
+            if ( errPushDefNaviControl != KErrNone )
+                {
+                // No error handling here.
+                }
+            }
+        delete iNaviDecorator;
+        }    
+    iCbaGroup=NULL;
+    // Callers responsibility of closing the file handle.
+    iFileHandlePtr = NULL;
+    // Delete the format strings
+    delete iTimeFormatShort;
+    delete iTimeFormatLong;
+    
+    delete iBtnCntrTimer;
+    }
+
+TInt CSVGTUIDialog::ButtonContainerTimerCallBack(TAny* aAny)
+    {
+    CSVGTUIDialog* dlg = (CSVGTUIDialog*)(aAny);
+    dlg->iBtnCntrTimer->Cancel();
+    dlg->iIsButtonContainerVisible = EFalse;
+    TRAP_IGNORE(dlg->SwitchDialogLayoutL( ETrue ));
+    
+    return KErrNone;
+    }
+
+TBool CSVGTUIDialog::HandleCustControlPointerEventL(const TPointerEvent& /* aPointerEvent */)
+    {
+	TBool fullScreenStatus;
+	TBool isEventHandled = EFalse;
+    TCallBack callBack(CSVGTUIDialog::ButtonContainerTimerCallBack, this);
+
+    iBtnCntrTimer->Cancel();
+    
+    if(iIsButtonContainerVisible)
+        {
+        return isEventHandled;
+        }
+    
+	iCustControl->GetCurrentFullScreenStatus(fullScreenStatus);
+    if(fullScreenStatus)
+        {
+        TRect appRect = iEikonEnv->EikAppUi()->ApplicationRect();
+        
+        if(iBtnGrpPos.iX && iBtnGrpPos.iY)
+            SetSize(TSize(appRect.Width() - iBtnGrpSize.iWidth, appRect.Height() - iBtnGrpSize.iHeight));
+        if(iBtnGrpPos.iX)
+            SetSize(TSize(appRect.Width() - iBtnGrpSize.iWidth, appRect.Height()));
+        else if(iBtnGrpPos.iY)
+            SetSize(TSize(appRect.Width(), appRect.Height() - iBtnGrpSize.iHeight));
+        
+        CEikButtonGroupContainer& bgc = ButtonGroupContainer();
+        //bgc.MakeVisible(ETrue);
+        //bgc.SetSize(iBtnGrpSize);
+        //bgc.SetExtent(iBtnGrpPos, iBtnGrpSize);
+        //bgc.DrawDeferred();
+        iIsButtonContainerVisible = ETrue;
+        isEventHandled = ETrue;
+        iBtnCntrTimer->Start(KButtonContainerDisplayTime, 0, callBack);
+        }
+        
+    return isEventHandled;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::ExecuteLD
+// Reimplements CAknDialog::ExecuteLD. It initialises the member variables of
+// the class and calls CAknDialog::ExecuteLD() with the dialog resource.
+// -----------------------------------------------------------------------------
+//
+TInt CSVGTUIDialog::ExecuteLD(
+    RFile& aFileHandle,         // Filename of SVGT Content
+    MSvgtAppObserver* ptr )     // Applications Implementation of callbacks
+    {
+    // Save this pointer since there are leaving functions in the flow
+    CleanupStack::PushL( this );    
+
+    iFileHandlePtr = &aFileHandle;
+    iIsFileHandleValid = ETrue;
+    iAppObserver = ptr;
+    iQuietExitWhenOrientationChange = iAppObserver->ExitWhenOrientationChange();
+
+    // Get the Status Pane Control
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    
+    // Get the Title Pane Control
+    CAknTitlePane* tp = static_cast< CAknTitlePane* >( sp->ControlL(
+            TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+    // Store the Application's title text
+    iAppTitleText = HBufC::NewL(tp->Text()->Length());
+    *iAppTitleText = *tp->Text();
+    
+    // Display the filename in the title pane of application
+    
+    TFileName lFileName;
+    // Get the file name from the file handle
+    if ( !aFileHandle.Name( lFileName ) )
+        {
+        TParse p;
+        p.Set( lFileName, NULL, NULL);
+
+        // SetTextL also ensures that if the length exceeds the layout space
+        // available the text is truncated from the end.
+        tp->SetTextL( p.NameAndExt() ); // p.NameAndExt() gives "Filename.ext"
+        
+        }
+
+    CSVGTDrmHelper *drmHelper = CSVGTDrmHelper::NewLC();
+    // Check if the "Save" Option should be shown or not.
+    // The calling application of the dialog decides this.
+    if ( iAppObserver )
+        {
+        iSaveEnable = iAppObserver->CanShowSave();
+        }       
+     
+    // Check Rights Status
+    iPreview = drmHelper->IsPreviewL( aFileHandle );
+    
+    CleanupStack::PopAndDestroy( drmHelper );
+    
+    // ExecuteLD will delete this, so we have to Pop it...
+    CleanupStack::Pop( this );
+    
+    if ( iPreview )
+        {              
+        return  CAknDialog::ExecuteLD( R_SVGT_VIEWER_PREVIEW_DIALOG );  
+        }
+    else
+        {
+        return CAknDialog::ExecuteLD( R_SVGT_VIEWER_DIALOG );       
+        }
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::FormatTimeL
+// Convert a time given in seconds to a descriptor.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::FormatTimeL( 
+                              const TUint& aDuration, // duration in 
+                                                      // seconds
+                              TDes& aBuf   // Buffer holding formatted 
+                                           // string
+                               ) const
+                                           
+    {
+    TTime time( TInt64( aDuration ) * KMicro );
+
+    if ( time.Int64() > TInt64( KMaxTotalTimeSeconds ) * KMicro )
+        {
+        time = TInt64( KMaxTotalTimeSeconds ) * KMicro;
+        }
+
+    if ( time.Int64() < TInt64( KShortTimeLimit ) * KMicro )
+        {
+        time.FormatL( aBuf, *iTimeFormatShort );
+        }
+    else
+        {
+        time.FormatL( aBuf, *iTimeFormatLong );
+        }
+
+    // Arabic number conversion
+    AknTextUtils::LanguageSpecificNumberConversion( aBuf );
+    }
+    
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::SaveNeededL
+// This function checks if Save is displayed and saving is already done
+// and prompts a confirmation query to the user and then calls DoSaveL
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTUIDialog::SaveNeededL( TInt aButtonId )
+    {
+    if ( ( iAppObserver->CanShowSave() || 
+           iCustControl->IsTextContentChanged()) &&
+         !iAppObserver->IsSavingDone() && 
+         !iPreview &&            
+         LaunchSaveQueryDialogL() )
+        {
+        iAppObserver->DoSaveL( aButtonId );
+        return ETrue;       
+        }
+    else
+        {
+        return EFalse;
+        }          
+    }
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::LaunchSaveQueryDialogL
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTUIDialog::LaunchSaveQueryDialogL() const
+    {
+    HBufC* titleText = NULL;
+
+    TFileName lFileName;
+    if ( iFileHandlePtr )
+        {
+        iFileHandlePtr->Name( lFileName );
+        }
+    else
+        {
+        return EFalse;
+        }
+    titleText = StringLoader::LoadLC( R_QTN_SVGT_QUERY_CONF_SAVE_DOWNLOADED, 
+                              lFileName );
+
+    CAknQueryDialog* query = CAknQueryDialog::NewL( );
+    TBool retVal = query->ExecuteLD( R_SVGT_CONFIRMATION_QUERY_YES_NO, 
+                                                   *titleText );
+    CleanupStack::PopAndDestroy( titleText );
+    
+    if ( retVal == EAknSoftkeyOk || retVal == EAknSoftkeyYes )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::SwitchDialogLayoutL
+// This function changes the layout of the dialog
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::SwitchDialogLayoutL( TBool aIsFullScreen )
+    {
+    if ( aIsFullScreen )
+        {
+        // Full Screen Mode
+        // Expand Dialog Window to occupy full screen
+        SetExtentToWholeScreen();
+        // Hide the Status Pane
+        CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+        sp->MakeVisible( EFalse );
+        
+        // Hide the CBA
+        CEikButtonGroupContainer* cp = &( ButtonGroupContainer() );
+        //cp->SetExtent( TPoint( 0, 0 ), TSize( 0, 0) );
+        cp->SetSize( TSize( 0, 0) );
+        
+        }
+    else
+        {
+        // Normal Screen Mode
+        // Show the Status Pane
+        CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+        sp->MakeVisible( ETrue );
+        
+        // Restore the size and position of the dialog
+        // to normal screen size(Client Rectangle)
+        TRect lRect;
+        iCustControl->GetNormalScreenLayoutRect( lRect );
+        SetSizeAndPosition( lRect.Size() );
+        // Restore original layout
+        Layout();
+        iBtnCntrTimer->Cancel();
+        }
+    
+    iIsButtonContainerVisible = !aIsFullScreen;
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::DynInitMenuPaneL
+// Reimplements CAknDialog::DynInitMenuPaneL inorder to support dynamic hiding
+// of menu items based on current state of the viewer.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::DynInitMenuPaneL(
+    TInt aResourceId,           // Resource Id for which this func is called
+    CEikMenuPane* aMenuPane )   // Menupane object pointer for manipulation
+    {
+    iBtnCntrTimer->Cancel();
+   
+if(
+  (aResourceId==R_SVGT_DIALOG_MENU)
+  &&iCustControl->GetMSKLabelFlag(EAknSoftkeyContextOptions)
+  &&(aMenuPane)
+  )
+    	{
+    	iCustControl->ChangeMSKLabelFlag(EAknSoftkeyContextOptions);
+    	if ( iAppObserver )
+    		{
+    		iSaveEnable = iAppObserver->CanShowSave();
+    		}
+    	aMenuPane->SetItemDimmed(ESvgtDlgSaveCommand,
+    	                        !( iSaveEnable||
+    	                        iCustControl->IsTextContentChanged() ) );
+          
+        TSvgtViewerAnimStatus lAnimState;
+        iCustControl->GetCurrentAnimState( lAnimState );
+        TBool isLoadingDone = iCustControl->IsProcessDone();
+        aMenuPane->SetItemDimmed(ESvgtDlgPlayCommand,
+        						!isLoadingDone ||
+        						(lAnimState == ESvgAnimPlayingState ));
+        aMenuPane->SetItemDimmed(ESvgtDlgPauseCommand,
+                                !isLoadingDone ||
+                                (lAnimState != ESvgAnimPlayingState ));                                                
+        aMenuPane->SetItemDimmed(ESvgtDlgStopCommand,
+                                !isLoadingDone ||
+                                (lAnimState ==ESvgAnimStoppedState));                                
+                                         
+          
+        //All the other menu items are dimmed since they are not the part of
+        // context menu
+        aMenuPane->SetItemDimmed(ESvgtDlgZoomInCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgZoomOutCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgSelectTextCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgEditTextCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgLoopCascadeCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgFindTextCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgFullScreenCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgNormalScreenCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgListRotateCascadeCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgViewDetailsCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgListDownloadCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgHelpCommand,ETrue);
+        aMenuPane->SetItemDimmed(EAknCmdExit,ETrue);           
+        #ifdef RD_SVGT_AUDIO_SUPPORT
+        aMenuPane->SetItemDimmed( ESvgtDlgMuteCommand,ETrue);
+        aMenuPane->SetItemDimmed( ESvgtDlgUnmuteCommand,ETrue);
+        aMenuPane->SetItemDimmed(ESvgtDlgSetVolumeCommand,ETrue);
+        #endif //RD_SVGT_AUDIO_SUPPORT         
+        }
+    
+    else if ( ( aResourceId == R_SVGT_DIALOG_MENU ) && ( aMenuPane ) )
+        {
+        if ( iAppObserver )
+            {
+            iSaveEnable = iAppObserver->CanShowSave();
+            }
+        aMenuPane->SetItemDimmed(
+                        ESvgtDlgSaveCommand,
+                        !( iSaveEnable || 
+                        iCustControl->IsTextContentChanged() ) );
+        TInt zoomLvl = 0;
+        iCustControl->GetCurrentZoomLevel( zoomLvl );
+        aMenuPane->SetItemDimmed(
+                        ESvgtDlgZoomOutCommand,
+                        ( zoomLvl == 0 ) );
+        
+        // Select Text Option
+        aMenuPane->SetItemDimmed( ESvgtDlgSelectTextCommand, 
+            !iCustControl->IsTextSelectOn() );
+        
+        // Edit Text Option
+        aMenuPane->SetItemDimmed( ESvgtDlgEditTextCommand, 
+            !iCustControl->IsTextEditOn() );
+            
+        if ( !iCustControl->IsAnimationPresent() )
+            {
+            // No Animations case - dim the Play/Pause/Stop buttons
+            aMenuPane->SetItemDimmed(
+                        ESvgtDlgPlayCommand,
+                        ETrue );
+
+            aMenuPane->SetItemDimmed(
+                        ESvgtDlgPauseCommand,
+                        ETrue );
+            
+            aMenuPane->SetItemDimmed(
+                        ESvgtDlgStopCommand,
+                        ETrue );
+            aMenuPane->SetItemDimmed(
+                        ESvgtDlgLoopCascadeCommand,
+                        ETrue );                            
+            }
+            else
+                {
+                // Animations case - normal behaviour
+                // Play/Pause Options
+                TSvgtViewerAnimStatus lAnimState;
+                iCustControl->GetCurrentAnimState( lAnimState );
+                TBool isLoadingDone = iCustControl->IsProcessDone();
+                
+                aMenuPane->SetItemDimmed(
+                                ESvgtDlgPlayCommand,
+                                !isLoadingDone || 
+                                 ( lAnimState == ESvgAnimPlayingState ) );
+
+                aMenuPane->SetItemDimmed(
+                                ESvgtDlgPauseCommand,
+                                !isLoadingDone || 
+                                 ( lAnimState != ESvgAnimPlayingState ) );
+                
+                aMenuPane->SetItemDimmed(
+                                ESvgtDlgStopCommand,
+                                !isLoadingDone || 
+                                 ( lAnimState == ESvgAnimStoppedState ) );
+                // Loop Option 
+                aMenuPane->SetItemDimmed(
+                                ESvgtDlgLoopCascadeCommand,
+                                !isLoadingDone || 
+                                !iCustControl->IsLoopAllowed() );
+                }
+#ifdef RD_SVGT_AUDIO_SUPPORT            
+        aMenuPane->SetItemDimmed( ESvgtDlgMuteCommand, iIsVolumeMuted );
+
+        aMenuPane->SetItemDimmed( ESvgtDlgUnmuteCommand, !iIsVolumeMuted );
+#endif //RD_SVGT_AUDIO_SUPPORT
+        TBool isFullScreenOn;
+        iCustControl->GetCurrentFullScreenStatus( isFullScreenOn );
+        aMenuPane->SetItemDimmed(
+                        ESvgtDlgFullScreenCommand,
+                        isFullScreenOn );
+
+        aMenuPane->SetItemDimmed(
+                        ESvgtDlgNormalScreenCommand,
+                        !isFullScreenOn );
+
+        aMenuPane->SetItemDimmed(
+                        ESvgtDlgFindTextCommand,
+                        EFalse );
+
+        aMenuPane->SetItemDimmed(
+                        ESvgtDlgViewDetailsCommand,
+                        !iIsFileHandleValid);
+        aMenuPane->SetItemDimmed(
+                        ESvgtDlgListDownloadCommand,
+                         !iAppObserver->CanShowDownload() );
+        }
+        else 
+            {
+            if ( ( aResourceId == R_SVGT_LOOP_SUBMENU ) && ( aMenuPane ) )
+                {
+                // Loop On/Off Submenu option
+                TBool isLoopOn = ETrue;
+                iCustControl->GetCurrentLoopStatus( isLoopOn );
+                if ( isLoopOn )
+                    {
+                    aMenuPane->SetItemButtonState( ESvgtDlgLoopOnCommand, 
+                                                   EEikMenuItemSymbolOn );
+                    aMenuPane->SetItemButtonState( ESvgtDlgLoopOffCommand,
+                                             EEikMenuItemSymbolIndeterminate );
+                    }
+                    else
+                        {
+                        aMenuPane->SetItemButtonState( ESvgtDlgLoopOffCommand, 
+                                                       EEikMenuItemSymbolOn );
+                        aMenuPane->SetItemButtonState( ESvgtDlgLoopOnCommand, 
+                                             EEikMenuItemSymbolIndeterminate );
+                        }
+                }
+            }
+    }
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::DrawMSKLabelL
+// Reimplements MSVGTMSKImplL::DrawMSKLabelL.This function is called by the
+// CSVGTCustControl whenever MSK label needs to be updated.
+// -----------------------------------------------------------------------------
+// 
+void CSVGTUIDialog::DrawMSKLabelL(TInt aResourceID,TInt aCommandID)
+{
+    iLastCommandID = aCommandID;
+	iCbaGroup= &( ButtonGroupContainer() );
+  	HBufC* middleSKText = StringLoader::LoadLC(aResourceID );
+    iCbaGroup->AddCommandToStackL(KMiddleSKId, aCommandID,*middleSKText );
+    iCbaGroup->MakeCommandVisible(aCommandID, ETrue);
+	CleanupStack::PopAndDestroy( middleSKText );
+	iCbaGroup->DrawDeferred();		
+}
+
+// ----------------------------------------------------------------------------
+// CSVGTUIDialog::RemoveMSKLabel
+// Reimplements MSVGTMSKImplL::RemoveMSKLabel.This function is called by the 
+// CSVGTCustControl before adding new MSK label to button group stack.   
+// ----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::RemoveMSKLabel()
+{
+	iCbaGroup= &( ButtonGroupContainer() );
+	MEikButtonGroup* lButtonGroup=iCbaGroup->ButtonGroup();
+	TInt lCmdID=lButtonGroup->CommandId(KMiddleSKId);
+	iCbaGroup->RemoveCommandFromStack(KMiddleSKId,lCmdID);
+	iCbaGroup->DrawDeferred();
+
+}
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::OkToExitL
+// Reimplements CAknDialog::OkToExitL inorder to display custom menu and
+// trap the back softkey to provide restore view functionality/exit.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTUIDialog::OkToExitL( TInt aButtonId ) // ButtonId of button pressed
+    {
+    if ( aButtonId == EAknSoftkeyOptions )
+        {
+        DisplayMenuL();
+        return EFalse;
+        }
+    else if(aButtonId==EAknSoftkeyContextOptions)
+   		{
+        //Flag to differentiate context menu from normal options menu
+       	iCustControl->ChangeMSKLabelFlag(aButtonId);
+         		
+       	//Display context menu 
+       	iMenuBar->SetContextMenuTitleResourceId( R_SVGT_DIALOG_MENUBAR );
+  		iMenuBar-> TryDisplayContextMenuBarL();
+    		    
+    	//No task swapper for context menu
+   	    iMenuBar->SetMenuType(CEikMenuBar::EMenuOptionsNoTaskSwapper);
+      			
+     	//Restore the options menu
+   		iMenuBar->SetMenuTitleResourceId( R_SVGT_DIALOG_MENUBAR );
+   		iMenuBar->SetMenuType(CEikMenuBar::EMenuOptions);
+          
+       	return EFalse;
+        }
+    else if(aButtonId ==EAknSoftkeySave)
+    	{
+    	//Save the content
+    	ProcessCommandL(ESvgtDlgSaveCommand);   
+    	return EFalse;
+    	}
+  
+    else
+        {
+        if ( aButtonId == EAknSoftkeyBack )
+            {
+            // Check whether full screen is active
+            TBool isFullScreenActive;
+            iCustControl->GetCurrentFullScreenStatus( isFullScreenActive );
+
+            if ( isFullScreenActive )
+                {
+                //  Yes[FullScreen]: revert back to normal screen
+                ProcessCommandL( ESvgtDlgNormalScreenCommand );
+                return EFalse;
+                }
+
+            // Check whether content is zoomed in
+            TInt zoomLvl = 0;
+            iCustControl->GetCurrentZoomLevel( zoomLvl );
+
+            if ( zoomLvl > 0 )
+                {
+                //  Yes[ZoomedIn]: restore to original view
+                iCustControl->ProcessViewerCommandL(
+                    ESvgtDlgZoomOptimalCommand );
+                return EFalse;
+                }
+            return !SaveNeededL( aButtonId );            
+            }
+            else
+                {
+                // Ignore Select Key..
+                if ( aButtonId == EAknSoftkeySelect || aButtonId == EEikBidOk )
+                    {
+					//If animation on mousedown/mouseup is present trigger it
+					if(iCustControl->GetMSKLabelFlag(aButtonId))
+						{
+						TKeyEvent lKeyEvent;
+						lKeyEvent.iScanCode=EStdKeyDevice3;
+						iCustControl->OfferKeyEventL(lKeyEvent,EEventKey);	
+						iCustControl->ChangeMSKLabelFlag(aButtonId);
+						TRAP_IGNORE(iCustControl->SetMSKLabelL());
+						}
+					
+						
+				
+                    // Select button pressed, ignore.
+                    return EFalse;
+                    }
+                if ( aButtonId == EEikCmdExit )
+                    {
+                    return !SaveNeededL( aButtonId ); 
+                    }
+                }
+            
+        }
+        
+    return ETrue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::IsLoadingDone
+// This function is called by the application to check whether the
+// loading of the svg content is done.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTUIDialog::IsLoadingDone()
+    {
+    return iCustControl->IsProcessDone();
+    }   
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::HandleApplicationForegroundEvent
+// This API is used by the application to give background/foreground events
+// to the Dialog. The dialog inturn passes the events to custom control.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::HandleApplicationForegroundEvent( TBool aForeground )
+    {
+    if ( iCustControl )
+        {
+        iCustControl->HandleApplicationForegroundEvent( aForeground );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::StopUsingContentFileHandle
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::StopUsingContentFileHandle()
+    {
+    // NOTE: Currently the custom control and the engine are
+    // not actively using the File handle. e.g. Engine uses
+    // the file handle only during loading of content. And custom
+    // control uses it when File Details are shown. 
+    // If required, in future need to pass this event to custom control.
+    // Block the filedetails option now.
+    iIsFileHandleValid = EFalse;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::StartUsingContentFileHandle
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::StartUsingContentFileHandle()
+    {
+    iIsFileHandleValid = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::IsTextContentChanged
+// Function used by the client to check if text in the content was modified, 
+// to check if save is needed.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTUIDialog::IsTextContentChanged()
+    {
+    return (iCustControl->IsTextContentChanged());    
+    }
+        
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::SaveSvgDom
+// Function used by the client to save the modified svg content
+// -----------------------------------------------------------------------------
+//
+TInt CSVGTUIDialog::SaveSvgDom( const TDesC& aFileName )
+    {
+    if ( iCustControl )
+        {
+        return ( iCustControl->SaveSvgDom( aFileName ) );
+        }
+        else 
+            {
+            return KErrGeneral;            
+            }
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::SaveComplete
+// Function used by the client to indicate saving is complete
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::SaveComplete( const TInt aError )
+    {
+    if ( !aError )
+        {
+        // Indicate to Custom Control to perform any cleanup
+        // once save is complete
+        iCustControl->SaveComplete( aError );
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::ProcessCommandL
+// Reimplements CAknDialog::ProcessCommandL inorder to handle dialog menu
+// commands.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::ProcessCommandL( TInt aCommandId )  // Command Id
+    {
+    // The Commands are handled by the custom CCoe Control and
+    // a boolean varialble is used inorder to keep track whether
+    // the control command processing needs to be invoked or not.
+    TBool procCmdReqd = ETrue;
+    CAknDialog::ProcessCommandL( aCommandId );
+    switch ( aCommandId )
+        {
+        case ESvgtDlgSaveCommand: 
+            if ( iAppObserver )
+                {
+                iAppObserver->DoSaveL( ESvgtDlgCommand1 );
+                }
+            break;
+        case ESvgtDlgHelpCommand:
+#ifdef __SERIES60_HELP            
+            procCmdReqd = EFalse;
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+                iEikonEnv->EikAppUi()->AppHelpContextL() );
+#endif // __SERIES60_HELP           
+            break;
+        case ESvgtDlgFindTextCommand:
+            break;
+        case ESvgtDlgViewDetailsCommand:
+            break;
+        case ESvgtDlgListDownloadCommand:    
+            {          
+            if ( iAppObserver )
+                {
+                iAppObserver->DisplayDownloadMenuL();
+                }                           
+            break;              
+            }
+        case ESvgtDlgFullScreenCommand:
+            {
+            if ( iCustControl )
+                {
+                iCustControl->SetCurrentFullScreenStatus( ETrue );
+                SwitchDialogLayoutL( ETrue ); // ETrue = Full Screen Mode
+                // Redraw Status Pane and CBA by doing a draw on dialog
+                DrawNow();
+                }
+            break;
+            }
+        case ESvgtDlgNormalScreenCommand:
+            {
+            if ( iCustControl )
+                {
+                iCustControl->SetCurrentFullScreenStatus( EFalse );            
+                SwitchDialogLayoutL( EFalse ); // EFalse = Normal Screen Mode
+                // Redraw Status Pane and CBA by doing a draw on dialog
+                DrawNow();                
+                }
+            break;
+            }
+//@@ Touch support
+#ifdef RD_SVGT_AUDIO_SUPPORT
+        case ESvgtDlgMuteCommand:
+            iIsVolumeMuted = !iIsVolumeMuted;
+            iCustControl->SetPresentationVolume(0);
+
+            if(iCustControl->IsContentFinite())
+                SetNaviPaneInfoL(iIsVolumeMuted, *iProgressText);
+            else
+                SetNaviPaneInfoL(iIsVolumeMuted, KNullDesC);
+            break;
+            
+        case ESvgtDlgUnmuteCommand:
+            iIsVolumeMuted = !iIsVolumeMuted;
+            // Set the volume level to the value it was before muting
+            iCustControl->SetPresentationVolume(iCustControl->GetPrevVolume());
+            
+            if(iCustControl->IsContentFinite())
+                SetNaviPaneInfoL(iIsVolumeMuted, *iProgressText);
+            else
+                SetNaviPaneInfoL(iIsVolumeMuted, KNullDesC);
+            break;            
+        case ESvgtDlgSetVolumeCommand:       // Fall Through
+#endif //RD_SVGT_AUDIO_SUPPORT        
+//@@ Touch support
+        case ESvgtDlgLoopOnCommand:     // Fall Through
+        case ESvgtDlgLoopOffCommand:    // Fall Through
+        case ESvgtDlgPlayCommand:       // Fall Through
+        case ESvgtDlgPauseCommand:      // Fall Through
+        case ESvgtDlgStopCommand:       // Fall Through
+        case ESvgtDlgZoomInCommand:     // Fall Through
+        case ESvgtDlgZoomOutCommand:    // Fall Through
+        case ESvgtDlgAngle90:           // Fall Through
+        case ESvgtDlgAngle180:          // Fall Through
+        case ESvgtDlgAngle270:          // Fall Through
+        case ESvgtDlgSelectTextCommand: // Fall Through
+        case ESvgtDlgEditTextCommand:   // Fall Through
+            break;
+        case EAknSoftkeyBack: // Fall Through
+        case EEikCmdExit:
+            // Close this dialog
+            procCmdReqd = EFalse; // No Further Processing required.
+            TryExitL( aCommandId );
+            break;
+        case EAknCmdExit:          
+            // Close this dialog
+            procCmdReqd = EFalse; // No Further Processing required.
+            if ( !SaveNeededL( aCommandId ) )
+                {
+                TryExitL( aCommandId );  
+                iAvkonAppUi->ProcessCommandL( EAknCmdExit );                
+                }
+            break;
+        default:
+            procCmdReqd = EFalse;
+            break;
+        }
+    // If custom control has been created and control needs
+    // to process the command invoke the control's ProcessViewerCommandL()
+    // function
+    if ( procCmdReqd && iCustControl )
+        {
+        iCustControl->ProcessViewerCommandL( aCommandId );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::CreateCustomControlL
+// Reimplements CAknDialog::CreateCustomControlL inorder to add the SVGT
+// custom control as part of the dialog in the UI framework.
+// Returns: SEikControlInfo which contains the SVGT Cust Control, if
+//                          aControlType == ESVGTCustControl
+//                     else,
+//                           the structure does not contain any control.
+// -----------------------------------------------------------------------------
+//
+SEikControlInfo CSVGTUIDialog::CreateCustomControlL(
+        TInt aControlType ) // Control Type
+    {
+    SEikControlInfo controlInfo;
+    controlInfo.iControl = NULL;
+    controlInfo.iTrailerTextId = 0;
+    controlInfo.iFlags = EEikControlHasEars;//EEikControlIsNonFocusing;
+
+    switch ( aControlType )
+        {
+        case ESVGTCustControl:
+            iCustControl = CSVGTCustControl::NewL(
+                            *iFileHandlePtr,
+                            iAppObserver,
+                            this,
+                            this, 
+                            this, 
+                            ETrue,    // Progressive rendering enabled.
+                                      // To enable it pass ETrue 
+                                      // otherwise EFalse.
+                            NULL,
+                            ESvgDisplayIcons|
+                            ESvgDrawPanIndicator|
+                            ESvgDrawPointer |
+                            ESvgDisplayErrorNotes |
+                            ESvgDrawPauseIndicator | 
+                            ESvgUseBackLight
+                            ); 
+            iCustControl->AddListener(this,EAudioListener);
+            controlInfo.iControl = iCustControl;
+            controlInfo.iControl->SetContainerWindowL(*this);                
+            iCustControl->SetPointerObserver(this);
+            break;
+        default:
+			return CAknDialog::CreateCustomControlL(aControlType);
+        }
+    return controlInfo;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::SizeChanged
+// Reimplements CAknDialog::SizeChanged inorder to support the resize of the
+// dialog when functions such as SetRect, SetExtent are called on the dialog.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::SizeChanged()
+    {
+    CAknDialog::SizeChanged();
+    iCustControl->SetExtent( Rect().iTl, Rect().Size() );
+    AknLayoutUtils::LayoutMetricsPosition(AknLayoutUtils::EControlPane, iBtnGrpPos);
+    AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EControlPane, iBtnGrpSize);
+    DrawNow();
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::OfferKeyEventL
+// Handles Key events by reimplementing CCoeControl::OfferKeyEventL.
+// Returns:
+//      EKeyWasConsumed: If this control uses this key.
+//      EKeyWasNotConsumed: Otherwise.
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CSVGTUIDialog::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent, // Key Event
+    TEventCode aType)           // Event Code
+    {
+    if ( iCustControl )
+        {
+        if ( aType == EEventKey )
+            {
+            if ( aKeyEvent.iScanCode == EStdKeyEnter  )
+                {
+                TryExitL( iLastCommandID );
+                
+                return iCustControl->OfferKeyEventL( aKeyEvent, aType );
+                }
+            
+            if ( aKeyEvent.iCode == KSvgScreenToggleKey && 
+                 aKeyEvent.iRepeats == 0 ) // Ignore Repeat Events
+                {
+                // Screen Mode Change Handling
+                TBool isFullScreenOn;
+                iCustControl->GetCurrentFullScreenStatus( isFullScreenOn );
+                if ( isFullScreenOn )
+                    {
+                    // Toggle to Normal Screen
+                    ProcessCommandL( ESvgtDlgNormalScreenCommand );
+                    }
+                    else
+                        {
+                        // Toggle to Full Screen
+                        ProcessCommandL( ESvgtDlgFullScreenCommand );
+                        }
+                // No further processing required.
+                return EKeyWasConsumed;
+                }
+            }
+        // Pass the key to the custom control
+        TKeyResponse lCcRetVal = iCustControl->OfferKeyEventL( aKeyEvent, 
+                                                               aType );
+        if ( lCcRetVal == EKeyWasConsumed )
+            {
+            return EKeyWasConsumed;
+            }
+        }
+    return CAknDialog::OfferKeyEventL( aKeyEvent, aType );        
+    }
+
+#ifdef __SERIES60_HELP
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::OfferKeyEventL
+// Handles Key events by reimplementing CCoeControl::OfferKeyEventL.
+// Returns:
+//      EKeyWasConsumed: If this control uses this key.
+//      EKeyWasNotConsumed: Otherwise.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KSvgtHelpContextUid;    
+    aContext.iContext = KSVGT_HLP_VIEWER;
+    }
+#endif // __SERIES60_HELP
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::HandleResourceChange
+// Handles change of skin/Layout
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::HandleResourceChange( TInt aType )
+    {
+    CAknDialog::HandleResourceChange( aType );
+
+    
+    if ( aType == KAknsMessageSkinChange )
+        {
+        // No skin related action performed.
+        }
+        else if ( aType == KEikDynamicLayoutVariantSwitch )
+            {
+        
+            if( iQuietExitWhenOrientationChange )
+                {
+                   TryExitL( EAknCmdExit );  
+                   return;
+                }
+            
+            if ( iCustControl )
+                {
+                TBool isFullScreenOn;
+                // Check whether the custom control is using full-screen or
+                // normal screen
+                iCustControl->GetCurrentFullScreenStatus( isFullScreenOn );                
+                // Change the layout to reflect layout switch
+                TRAP_IGNORE( SwitchDialogLayoutL( isFullScreenOn ) );
+                }
+            
+            // If it is a Layout switch, need to do a redraw
+            if ( aType == KEikDynamicLayoutVariantSwitch )
+                {
+                // Redraw the dialog
+                DrawDeferred();
+                }
+            
+            }
+
+    }
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::DrawProgressBarL
+// This function updates the progress bar in the navi pane. It is called back 
+// by the custom control.
+// -----------------------------------------------------------------------------
+//
+void CSVGTUIDialog::DrawProgressBarL( TUint aTimeElapsed, // Time Elapsed in 
+                                                          // Seconds
+    TUint aTimeTotal ) // Total time in seconds
+    {
+        
+    TBuf<KMaxTimeTextLength> timeElapsedBuf; // Time Elapsed, e.g. "00:12"
+    TBuf<KMaxTimeTextLength> totalTimeBuf; // Total duration, e.g. "00:55"
+    
+    // Format the time to user readable format. The format is locale dependent
+    FormatTimeL( aTimeElapsed, timeElapsedBuf );  
+    FormatTimeL( aTimeTotal, totalTimeBuf );  
+
+    // Format label text based on resource
+    CDesCArrayFlat* strings = new (ELeave) CDesCArrayFlat( 2 ); // Allocate 2 
+                                                                // strings for
+                                                                // elapsed time
+                                                                // and total 
+                                                                // time strings
+    CleanupStack::PushL( strings );
+    strings->AppendL( timeElapsedBuf );
+    strings->AppendL( totalTimeBuf );
+
+    delete iProgressText;
+    iProgressText = NULL;
+    iProgressText = StringLoader::LoadL( R_QTN_SVGT_TIME_INDIC, 
+                                      *strings, 
+                                      iEikonEnv );
+    // Destroy the array of strings
+    CleanupStack::PopAndDestroy( strings );
+    
+    SetNaviPaneInfoL( iIsVolumeMuted, *iProgressText);
+    }    
+
+void CSVGTUIDialog::HandleApplicationExitL( TInt aExitCommand )
+    {
+    if((aExitCommand == EAknSoftkeyBack) || ( aExitCommand == EEikCmdExit))
+        {
+        this->TryExitL(aExitCommand);
+        }
+    else
+        {
+        User::LeaveIfError(KErrArgument);
+        }
+    }
+
+EXPORT_C void CSVGTUIDialog::AssignImageData( const TDesC& aUri, HBufC8* aData )
+    {
+    iCustControl->AssignImageData(aUri, aData);
+    }
+
+// -----------------------------------------------------------------------------
+// CSVGTUIDialog::SetNaviPaneInfoL
+// Sets the mute icon & text to the navi pane.
+// -----------------------------------------------------------------------------
+void CSVGTUIDialog::SetNaviPaneInfoL(TBool aIsVolumeMuted, const TDesC& aText)
+    {
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    CAknNavigationControlContainer* np = 
+            static_cast<CAknNavigationControlContainer*>
+            ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+    // Save the old Navi Decorator so that it can be deleted after 
+    // creating the new navi decorator 
+    CAknNavigationDecorator* lOldNaviDecorator = iNaviDecorator;
+            
+    iNaviDecorator = NULL;
+
+    CSvgtDecoratorControl* decoControl = new (ELeave) CSvgtDecoratorControl;
+    CleanupStack::PushL(decoControl);
+    decoControl->ConstructL();
+    decoControl->ShowVolumeMutedIcon(aIsVolumeMuted);
+    decoControl->SetTextL(aText);
+    iNaviDecorator = CAknNavigationDecorator::NewL(np, decoControl);
+    iNaviDecorator->SetContainerWindowL(*this);
+    CleanupStack::Pop(decoControl);
+        
+    // Clear the old Navi-Pane Decorator
+    if ( lOldNaviDecorator )
+        {
+        delete lOldNaviDecorator ;
+        lOldNaviDecorator = NULL;
+        }
+    // Push the new Navi decorator in the Navigation Pane
+    np->PushL( *iNaviDecorator );
+    }    
+    
+void CSVGTUIDialog::VolumeMuted(TBool aVolumeMuted)
+    {
+    if(iCustControl->IsContentFinite())
+        {
+        TRAP_IGNORE( SetNaviPaneInfoL(aVolumeMuted, *iProgressText));
+        }
+    else
+        {
+        TRAP_IGNORE(SetNaviPaneInfoL(aVolumeMuted, KNullDesC));
+        }
+    iIsVolumeMuted = aVolumeMuted;
+    }
+// End of File