--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtviewer/SvgtViewerPlugin/UIControlSrc/SVGTCustControl.cpp Wed Sep 01 12:29:59 2010 +0100
@@ -0,0 +1,4850 @@
+/*
+* 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 Custom Control which
+* is used to display SVGT content
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <aknnotewrappers.h>
+#include <AknWaitNoteWrapper.h>
+#include <AknIconUtils.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <AknsConstants.h>
+#include <AknsSkinInstance.h>
+#include <AknsUtils.h>
+#include <AknWaitDialog.h>
+#include <bitdev.h>
+#include <StringLoader.h>
+#include <DRMHelper.h>
+#include <eikenv.h> //CEikonEnv
+#include <e32math.h>
+#include <uri16.h>
+#include <ctsydomainpskeys.h> // for call handling
+#include <data_caging_path_literals.hrh>
+#include <gdi.h>
+#include <svgtuicontrol.rsg>
+#include <svgtuicontrol.mbg>
+// User Includes
+#include "SVGTUIControlDbgFlags.hrh"
+#include "SVGTAppObserver.h"
+#include "SVGTCustControl.h"
+#include "SVGTUIDialog.hrh"
+
+#include "SvgtController.h"
+#include "SvgtApplicationExitObserver.h"
+#include "SvgtEventHandlerAO.h"
+#include "SvgtEvent.h"
+#include <svgtfileviewdetails.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <avkon.mbg>
+
+#ifdef RD_SVGT_AUDIO_SUPPORT
+#include <AknVolumePopup.h>
+#include<remconinterfaceselector.h> //for CRemConInterfaceSelector
+#include<remconcoreapitarget.h> //for CRemConCoreApiTarget
+
+#endif //RD_SVGT_AUDIO_SUPPORT
+// Constants
+
+// Panning Constants
+// KSccPanNumPixelsX - Amount of Pixels to Pan in X Direction when Pan is
+// performed once.
+// KSccPanNumPixelsY - Amount of Pixels to Pan in Y Direction when Pan is
+// performed once.
+const TInt KSccPanNumPixelsX = 30;
+const TInt KSccPanNumPixelsY = 30;
+
+// Pointer Constants
+// When pointer is moved in a particular direction, the movement also
+// acceleration. The below constants define the delta for the acceleration.
+// KSccCursorMinDeltaX - For X Direciton
+// KSccCursorMinDeltaY - For Y Direciton
+const TInt KSccCursorMinDeltaX = 5;
+const TInt KSccCursorMinDeltaY = 5;
+
+// Zoom Constants
+// KSccZoomInFactor - Indicates zoom factor to use while zooming in.
+// This Value should be > 1.0
+// KSccZoomOutFactor - Indicates zoom factor to use while zooming out.
+// This value should be > 0 and < 1.0
+const TReal32 KSccZoomInFactor = 2.0; // 2X Zoom In
+const TReal32 KSccZoomOutFactor = 0.5;// 2X Zoom Out
+
+// Key Constants
+const TInt KSccZoomInKey = ENumberKey5;//'5';
+const TInt KSccZoomOutKey =ENumberKey0; //'0';
+
+// Number of milli seconds per second
+const TUint32 KSccNumMSecPerSec = 1000;
+
+
+
+// Time in microsecs after which Pointer Inactivity should be declared
+const TUint KSccPointerHideTimerStartAfter = 15000000;
+
+// Time in microsecs per second
+const TInt KSccOneSecond = 1000000;
+
+// General Constants
+const TInt KSccConstMinusOne = -1;
+const TInt KSccConstZero = 0;
+const TInt KSccConstOne = 1;
+const TInt KSccConstTwo = 2;
+
+// set the name of the multi-bitmap file containing the bitmaps
+_LIT( KSccIconFile,"Z:SVGTUIControl.mif" );
+
+// SMIL Fit Value
+_LIT( KSccSmilFitValue,"meet" );
+
+// Font Ids for use with Engine-Init
+const TInt KApacFontId = EApacPlain16;
+const TInt KLatintFontId = ELatinBold12;
+
+// Duration const returned by engine when indefinite animations are present
+const TUint KSccIndefiniteDur = 0xffffffff;
+
+
+// Interval between two consecutive timer ticks in microseconds.
+const TUint32 KSccProgIndTimerYieldDur = 100000;
+
+//constant for converting radians to degrees
+const TReal32 KDegreesToRadiansFactor = 0.01745329252;
+
+// Maximum length of text in a text element
+const TInt KSccMaxTextLength = 250;
+const TInt KBackLightTimeInterval = 9;
+const TInt KMaxEditorTextLength = 5120;
+const TInt KEmbededImageTagLength = 5;
+const TInt KSchemaLength = 4;
+
+#ifdef RD_SCALABLE_UI_V2
+const TInt KInitRepeatInterval = 10000;
+#endif // RD_SCALABLE_UI_V2
+
+// Background colour which is used by engine before rendering as a base colour
+const TUint32 KSccArgbWhite = 0xffffffff;
+
+//TOUCH
+#ifdef RD_SVGT_AUDIO_SUPPORT
+const TInt KDefaultVolumeLevel = 3;
+const TInt KMinVolume = 0;
+const TInt KMaxVolume = 10;
+#endif // RD_SVGT_AUDIO_SUPPORT
+//TOUCH
+#ifdef _DEBUG
+// Backlight Strings
+_LIT( KSccBacklightOnStr, "Backlight On" );
+_LIT( KSccBacklightOffStr, "Backlight Off" );
+#endif
+
+//Loading thread name
+_LIT(KSvgThread,"SvgThread");
+
+_LIT(KJpg, ".jpg" );
+_LIT(KJpeg, ".jpeg" );
+_LIT(KPng, ".png" );
+_LIT(KBmp, ".bmp" );
+_LIT(KSvg, ".svg" );
+_LIT(KSvgz, ".svgz" );
+
+_LIT( KWww, "www" );
+_LIT( KHttp, "http://");
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::CSVGTCustControl
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+CSVGTCustControl::CSVGTCustControl(
+ RFile& aFileHandle, // File Handle of SVGT content
+ TBool aProgressiveRendering,
+ TInt aFlag ) :
+ // Animation State
+ iTotalNumerOfAnimation( KSccConstMinusOne ),
+ iAnimationStatus( ESvgNoAnimationsPresent ),
+ iAnimState( ESvgAnimStoppedState ),
+ iContentFileHandle( aFileHandle ),
+ // SVG Engine
+ iIsLoadingDone( EFalse ),
+ iFetchImageError( 0 ),
+ // Control State Variables
+ iZoomLevel( 0 ),
+ iIsLoopOn( EFalse ),
+ iIsFullScreenOn( EFalse ),
+ // Pointer Variables
+ iPointerDx( 0 ),
+ iPointerDy( 0 ),
+ iPointerX( 0 ),
+ iPointerY( 0 ),
+ // Current Match is invalid
+ iIsSearchStrValid( EFalse ),
+ iCurSearchMatchId( 0 ),
+ iNumAnimInProgress( 0 ),
+ iIsPointerDisplayed( ETrue ),
+ iFindTextHiColor( KRgbBlack ),
+ iIgnorePointerKeyEvent( EFalse ),
+ iPointerType( ESvgPointerDefault ),
+ iEnableTextOps( ETrue ),
+ iIsTextEditOn( EFalse ),
+ iIsTextSelectOn(EFalse),
+ iProgressiveRendering(aProgressiveRendering),
+ iDisplayFlags( aFlag ),
+ iEventHandlerAO(NULL),
+ iThreadController(NULL),
+ iIsWaitNoteDisplayed(EFalse),
+#ifdef RD_SVGT_AUDIO_SUPPORT
+ iVolumeLevel(KDefaultVolumeLevel),
+ iPrevVolume(KDefaultVolumeLevel),
+#endif //RD_SVGT_AUDIO_SUPPORT
+ iIsTextChanged( EFalse ),
+ iViewerCommand(EFalse),
+ iPlayMSKLabel(EFalse),
+ iContextMenuActivated(EFalse),
+ iAElement(EFalse),
+ iScrollKey(EFalse),
+ iPointerDownAnimation(EFalse),
+ iInteractiveElementEnteredCnt(0),
+ iDownKeyOccurred(EFalse),
+ iIsVolumeMuted(EFalse),
+ iIsForeground(ETrue)
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ConstructL
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ConstructL(
+ MSvgtAppObserver* aAppObs, // User Implementation of Mixin
+ MSVGTProgressBarDrawImpl* aPBDrawImpl , // Implementation for rendering
+ // progress indicator
+ MSVGTMSKImpl* aMSKImpl, //Interface for MSK labelling
+ MSvgtApplicationExitObserver* aExitObserver,
+ const CCoeControl* aParent )
+ {
+ iEngineInitialized = EFalse;
+ // Save the user parameters for later access.
+ iAppObserver = aAppObs;
+ iProgressBarDrawImpl = aPBDrawImpl;
+ iMSKImpl=aMSKImpl;
+ iExitObserver = aExitObserver;
+
+ TRect lRect;
+ GetNormalScreenLayoutRect( lRect );
+ // Frame buffers creation
+ CreateBitmapsL( lRect.Size() );
+
+ // Icons(Pointer, Pan Ind) creation
+ CreateIconsL();
+
+#ifdef RD_SVGT_AUDIO_SUPPORT
+ iVolumePopup = CAknVolumePopup::NewL(NULL, ETrue);
+ iVolumePopup->SetObserver(this);
+ _LIT( KVolumePopupTitle, "Presentation volume");
+ iVolumePopup->SetTitleTextL(KVolumePopupTitle);
+ iVolumePopup->SetRange( KMinVolume, KMaxVolume);
+ iVolumePopup->SetValue( KDefaultVolumeLevel );
+
+
+ // Open a connection to receive Volume Key events.
+ iSelector = CRemConInterfaceSelector::NewL();
+ iInterfaceSelector = CRemConCoreApiTarget::NewL(*iSelector,*this);
+ TRAPD(err, iSelector->OpenTargetL());
+ if(err != KErrNone)
+ {
+ #ifdef _DEBUG
+ RDebug::Printf("Leave occured in OpenTargetL. Error code returned %d",err);
+ #endif
+ }
+
+#endif //RD_SVGT_AUDIO_SUPPORT
+
+ // DrmHelper to display save related query
+ iSvgDrmHelper = CSVGTDrmHelper::NewL();
+
+ // Check if it is a preview file
+ iPreviewMode = iSvgDrmHelper->IsPreviewL( iContentFileHandle );
+
+ // Initialise the SVG engine.
+ InitializeEngineL();
+
+
+//############################################################
+ // Create the timer for Pointer Inactivity
+ if ( iDisplayFlags & ESvgDrawPointer )
+ {
+ iInactivityTimer = CSVGTPointerHideTimer::NewL( this );
+ iInactivityTimer->After( KSccPointerHideTimerStartAfter );
+ }
+
+ // Create the timer for blinking Pause
+ if ( iDisplayFlags & ESvgDrawPauseIndicator )
+ {
+
+ iBlinker = CPeriodic::NewL( CTimer::EPriorityStandard );
+ }
+
+ // Create the timer for removal of info note
+ if ( iDisplayFlags & ESvgDisplayErrorNotes)
+ {
+ // Create the timer for removal of info note
+ iNoteRemoverTimer = CPeriodic::NewL( CTimer::EPriorityHigh );
+ }
+
+ if ( iDisplayFlags & ESvgDisplayErrorNotes )
+ {
+ // Create instance of DRM Helper for checking rights for content
+ iSvgDrmHelper->CheckRightsAmountL( iContentFileHandle );
+ }
+
+ //Initialize the backlight time to current time
+ iPreviousBackLightTimeStamp.HomeTime();
+ if(iProgressiveRendering)
+ {
+ iEventHandlerAO = CSvgtEventHandlerAO::NewL( aAppObs, this,
+RThread().Id());
+
+ iThreadController = CSvgtThreadController::NewL(this);
+ //Separate thread is created to load the content
+ // set up parameters to thread generate thread, leave if fails
+ TInt result = iMainThread.Create( KSvgThread,
+ ( TThreadFunction )LoadSvgContent,
+ KDefaultStackSize,
+ NULL, this, EOwnerProcess );
+ User::LeaveIfError( result );
+ // log on to thread & requests notification of thread completion
+ iThreadController->IssueThreadMonitorRequest( iMainThread );
+
+ // give thread low priority
+ iMainThread.SetPriority( EPriorityMuchLess );
+ // resume thread (wake it up sometime after this function returns)
+ iMainThread.Resume();
+ }
+ else
+ {
+ // Start displaying wait note
+ LaunchWaitNoteL( R_QTN_SVGT_WAITING_OPENING );
+
+ // Load the SVGT content
+ LoadContentL( iContentFileHandle );
+
+ // Dismiss the wait note
+ DismissWaitNote();
+
+ TInt lLoadErr = DoHandleLoadingThreadError();
+ if ( lLoadErr != KErrNone )
+ {
+ if ( lLoadErr != KErrNoMemory )
+ {
+ // All errors other than memory failure related are
+ // ignored.
+ lLoadErr = KErrNone;
+ }
+ User::Leave( lLoadErr );
+ }
+
+ // Do the post load functionality
+ DoPostLoadFuncL();
+ }
+ if ( aParent && (iDisplayFlags & ESvgWindowOwning ))
+ {
+ CreateWindowL( aParent );
+ }
+//############################################################
+ // Set the windows size
+ SetRect( lRect );
+
+ // Activate the window, which makes it ready to be drawn
+ ActivateL();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::NewL
+// Factory function for creating CSVGTCustControl objects.
+// Returns: CSVGTCustControl* ; Pointer to the created object.
+// Leaves if error occurs during creation.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSVGTCustControl* CSVGTCustControl::NewL(
+ RFile& aFileHandle, // File Handle for the content
+ MSvgtAppObserver* aAppObs, // User Implementation of Mixin
+ MSVGTProgressBarDrawImpl* aPBDrawImpl , // Implementation for rendering
+ // progress indicator
+ MSVGTMSKImpl* aMSKImpl, //Interface for MSK labelling
+ MSvgtApplicationExitObserver* aExitObserver,
+ TBool aProgressiveRendering,
+ const CCoeControl* aParent,
+ TInt aDisplayFlag )
+ {
+ CSVGTCustControl* self = CSVGTCustControl::NewLC( aFileHandle,
+ aAppObs,
+ aPBDrawImpl,
+ aMSKImpl,
+ aExitObserver,
+ aProgressiveRendering,
+ aParent,
+ aDisplayFlag );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::NewLC
+// Factory function for creating CSVGTCustControl objects.
+// Returns: CSVGTCustControl* ; Pointer to the created object.
+// Leaves if error occurs during creation.
+// -----------------------------------------------------------------------------
+//
+CSVGTCustControl* CSVGTCustControl::NewLC(
+ RFile& aFileHandle, // File handle for the content
+ MSvgtAppObserver* aAppObs , // User Implementation of Mixin
+ MSVGTProgressBarDrawImpl* aPBDrawImpl , // Implementation for rendering
+ // progress indicator
+ MSVGTMSKImpl* aMSKImpl, //Interface for MSK labelling
+ MSvgtApplicationExitObserver* aExitObserver,
+ TBool aProgressiveRendering,
+ const CCoeControl* aParent,
+ TInt aDisplayFlag )
+ {
+ CSVGTCustControl* self = new ( ELeave ) CSVGTCustControl( aFileHandle,
+
+aProgressiveRendering,
+ aDisplayFlag );
+ CleanupStack::PushL( self );
+ self->ConstructL( aAppObs, aPBDrawImpl ,aMSKImpl, aExitObserver, aParent );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::~CSVGTCustControl
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSVGTCustControl::~CSVGTCustControl()
+ {
+
+#ifdef RD_SVGT_AUDIO_SUPPORT
+ // if non volume key is pressed <br>
+ if(iVolumePopup)
+ {
+ iVolumePopup->CloseVolumePopup();
+ delete iVolumePopup;
+ iVolumePopup=NULL;
+ }
+ if(iSelector)
+ {
+ delete iSelector;
+ iInterfaceSelector=NULL;
+ iSelector=NULL; //iSelector has been deleted by "delete iInterfaceSelector"
+ }
+
+#endif //RD_SVGT_AUDIO_SUPPORT
+
+ if(iProgressiveRendering)
+ {
+ TInt count = 0;
+ if(iSvgModule)
+ {
+ if ( iSvgModule->IsLoading() )
+ {
+ iSvgModule->CancelLoad();
+ do
+ {
+ User::After( 10 * 1000 ); // milliseconds
+ }while ( iSvgModule->IsLoading() && count++ < 100 );
+ }
+ }
+
+ if(iThreadController)
+ {
+ iThreadController->StopThreadExecution(iMainThread);
+ }
+
+ iMainThread.Kill(KErrNone);
+ iMainThread.Close();
+
+ delete iEventHandlerAO;
+
+ delete iThreadController;
+ }
+
+ // Hyperlink Handler
+ if ( iSvgModule )
+ {
+ iSvgModule->RemoveHyperlinkListener(
+ static_cast< MSvgHyperlinkListener*> ( this ) );
+ iSvgModule->RemoveListener( static_cast<MSvgLoadingListener*>(this),
+ ESvgLoadingListener);
+ iSvgModule->RemoveListener( static_cast<MSvgLoadingListener*>(this),
+ ESvgHyperlinkListener);
+ iSvgModule->RemoveListener( static_cast<MSvgInteractiveElementListener*>(this), ESvgInteractiveElementListener);
+ }
+
+ // SVG Engine
+ delete iSvgModule;
+
+ // Free the icons
+ FreeIcons();
+
+ // Screen Bitmaps + Masks
+ delete iSVGTBitMap;
+ delete iSVGTBitMapMask;
+
+ // delete SVG drmHelper
+ delete iSvgDrmHelper;
+
+
+ // Delete the arrays
+ iBoundBoxArray.Close();
+ iFoundTextArray.Close();
+ iTextElemIdArray.Close();
+
+ // Reset App Observer
+ iAppObserver = NULL;
+
+ // Reset Progress Bar Draw Implementation Callback
+ iProgressBarDrawImpl = NULL;
+ // Current Match is invalid
+ iIsSearchStrValid = EFalse;
+ iCurSearchMatchId = KSccConstZero;
+
+ // Backlight Timer
+
+ // Progress Indicator Timer
+ delete iProgressBarTimer;
+
+ // Pointer Inactivity Hide Timer
+ delete iInactivityTimer;
+
+ // Pause Blink Timer
+ delete iBlinker;
+
+ // Framebuffer Bitmap
+ delete iSVGTFrameBufBitMap;
+
+ // Framebuffer Bitmap Context
+ delete iSVGTFrameBufContext;
+
+ // Framebuffer Bitmap Device
+ delete iSVGTFrameBufDevice;
+
+ // Delete the wait dialog
+ delete iWaitDialog;
+
+ // Delete the info note
+ delete iInfoNote;
+
+ // Delete the info note remover timer
+ delete iNoteRemoverTimer;
+
+ // Close the System RProperty
+ iSystemState.Close();
+
+ // Reset the loading thread error
+ iLoadingThreadError = NULL;
+
+ // Reset the exit observer
+ iExitObserver = NULL;
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ProcessViewerCommandL
+// Process commands for handling SVGT content
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ProcessViewerCommandL( TInt aCommandId ) // Command ID
+ // be processed
+ {
+ //Set the flag to indicate that the selection key is for options selection
+ iViewerCommand=ETrue;
+ switch( aCommandId )
+ {
+ case ESvgtDlgSaveCommand:
+ break;
+ case ESvgtDlgZoomInCommand:
+ // Perform Zoom operation
+ iSvgModule->Zoom( KSccZoomInFactor );
+ // Do a Redraw
+ iSvgModule->Redraw();
+ //dummy mouse move
+ iSvgModule->MouseMove( iPointerX, iPointerY );
+ iZoomLevel++;
+ UpdatePointer();
+ break;
+ case ESvgtDlgZoomOutCommand:
+ if ( iZoomLevel > KSccConstZero )
+ {
+ iZoomLevel--;
+ // Perform Zoom operation
+ iSvgModule->Zoom( KSccZoomOutFactor );
+ // Do a Redraw
+ iSvgModule->Redraw();
+ //dummy mouse move
+ iSvgModule->MouseMove( iPointerX, iPointerY );
+ UpdatePointer();
+ }
+ break;
+ case ESvgtDlgZoomOptimalCommand:
+ if ( iZoomLevel != KSccConstZero )
+ {
+ //This is to nullify only the zooming effect
+ //Other transformations(panning, rotation) won't be restored
+ TReal reducedFactor = 0.0;
+ Math::Pow(reducedFactor, KSccZoomOutFactor, iZoomLevel);
+ iZoomLevel = KSccConstZero;
+ iSvgModule->Zoom(reducedFactor);
+ iSvgModule->Redraw();
+ }
+ break;
+ case ESvgtDlgSelectTextCommand:
+ {
+ if ( iEnableTextOps )
+ {
+ HBufC* lStrPtr = HBufC::NewLC( KMaxEditorTextLength );
+ TPtr lPtr = lStrPtr->Des();
+
+ if ( iCurrentTextElementId )
+ {
+ if ( iIsCurrentTextElement )
+ {
+ iSvgModule->GetTextForTextElement(
+ iCurrentTextElementId,
+ iIsTextEditOn,
+ lPtr );
+ }
+ else
+ {
+ iSvgModule->GetTextForTextAreaElement(
+ iCurrentTextElementId,
+ iIsTextEditOn,
+ lPtr );
+ }
+
+ DoTextSelectionL( lPtr );
+ }
+ CleanupStack::PopAndDestroy( lStrPtr );
+ }
+ }
+ break;
+ case ESvgtDlgEditTextCommand:
+ {
+ if ( iEnableTextOps )
+ {
+ if ( iCurrentTextElementId )
+ {
+ HBufC* lStrPtr = HBufC::NewLC( KMaxEditorTextLength );
+ TPtr lPtr = lStrPtr->Des();
+
+ if ( iIsCurrentTextElement )
+ {
+ iSvgModule->GetTextForTextElement(
+ iCurrentTextElementId,
+ iIsTextEditOn,
+ lPtr );
+ }
+ else
+ {
+ iSvgModule->GetTextForTextAreaElement(
+ iCurrentTextElementId,
+ iIsTextEditOn,
+ lPtr );
+ }
+
+
+ DoTextEditingL( iIsCurrentTextElement,
+ iCurrentTextElementId,
+ lPtr );
+ CleanupStack::PopAndDestroy( lStrPtr );
+ }
+ }
+ }
+ break;
+ case ESvgtDlgPlayCommand:
+ ProcessPlayCmd();
+ break;
+ case ESvgtDlgPauseCommand:
+ ProcessPauseCmd();
+ break;
+ case ESvgtDlgStopCommand:
+ ProcessStopCmd();
+ break;
+//TOUCH SUPPORT START
+#ifdef RD_SVGT_AUDIO_SUPPORT
+ case ESvgtDlgSetVolumeCommand:
+ {
+ // The volume popup will close itself after 1s
+ // unless another call to ShowVolumePopupL() is made
+ if(iIsVolumeMuted)
+ {
+ // Set the volume of pop to zero if muted.
+ iVolumePopup->SetValue( 0 );
+ iVolumePopup->ShowVolumePopupL();
+ }
+ else
+ {
+ // If not muted, then show the previous volume
+ iVolumePopup->SetValue( iPrevVolume );
+ iVolumePopup->ShowVolumePopupL();
+ }
+ break;
+ }
+#endif //RD_SVGT_AUDIO_SUPPORT
+//TOUCH SUPPORT END
+ case ESvgtDlgLoopOnCommand:
+ if ( IsContentFinite() )
+ {
+ iIsLoopOn = ETrue;
+ }
+ break;
+ case ESvgtDlgLoopOffCommand:
+ if ( IsContentFinite() )
+ {
+ iIsLoopOn = EFalse;
+ }
+ break;
+ case ESvgtDlgFindTextCommand:
+ ProcessFindTextCmdL();
+ break;
+ case ESvgtDlgFullScreenCommand: // Fall Through
+ case ESvgtDlgNormalScreenCommand:
+ // No processing here. The Command is processed by the dialog.
+ // Dialog sets the size of the control, because of which
+ // SizeChanged() of control is called. This queries the
+ // layout rectangles and recreates the framebuffer.
+ break;
+ case ESvgtDlgViewDetailsCommand:
+ {
+ CSvgtFileViewDetailsDialog* fileDetailsDialog =
+ CSvgtFileViewDetailsDialog::NewL();
+ fileDetailsDialog->ExecuteLD( iContentFileHandle );
+
+ break;
+ }
+ case ESvgtDlgAngle90:
+ {
+ DoRotation( ERotationAngle90 );
+ }
+ break;
+ case ESvgtDlgAngle180:
+ {
+ DoRotation( ERotationAngle180 );
+ }
+ break;
+ case ESvgtDlgAngle270:
+ {
+ DoRotation( ERotationAngle270 );
+ }
+ break;
+ case ESvgtDlgHelpCommand:
+ break;
+ default:
+ break;
+ }
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+}
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::GetCurrentZoomLevel
+// Get function for current zoom level. Zoom level is the number of times the
+// user has zoomed in.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::GetCurrentZoomLevel(
+ TInt& aZoomLevel ) const // Current Zoom Level
+ {
+ aZoomLevel = iZoomLevel;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::GetCurrentAnimState
+// Get function for current animation state
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::GetCurrentAnimState(
+ TSvgtViewerAnimStatus& aAnimState ) const // Playing/Paused/Stopped
+ {
+ aAnimState = iAnimState;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::GetCurrentFullScreenStatus
+// Get function for current viewing mode.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::GetCurrentFullScreenStatus(
+ TBool& aIsFullScreenOn ) const // Full Screen( ETrue )/Normal( EFalse )
+ {
+ aIsFullScreenOn = iIsFullScreenOn;
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::GetCurrentLoopStatus
+// Get function for current loop mode.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::GetCurrentLoopStatus(
+ TBool& aIsLoopOn ) const // Loop On( ETrue )/Loop Off( EFalse )
+ {
+ aIsLoopOn = iIsLoopOn;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::GetNormalScreenLayoutRect
+// Gets the normal screen layout rectangle for control from LAF.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::GetNormalScreenLayoutRect(
+ TRect& aRect ) const // Rectangle specifying extent of control
+ {
+ // Get parent client rect.
+ TRect myRect = iEikonEnv->EikAppUi()->ClientRect();
+
+ if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
+ {
+ TAknLayoutRect lNormalLayoutRect;
+ lNormalLayoutRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane( 0 ) ); // Normal Screen
+ aRect = lNormalLayoutRect.Rect();
+ }
+ else
+ {
+ aRect = myRect;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsLoopAllowed
+// Indicates whether the Loop feature is allowed for the Control.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsLoopAllowed() const
+ {
+ return ( IsContentFinite() );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsAnimationPresent
+// Finds whether the content has any animations
+// @return TBool - ETrue indicates content contains animations,
+// EFalse otherwise
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsAnimationPresent() const
+ {
+ return ( iAnimationStatus != ESvgNoAnimationsPresent );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsContentFinite
+// Finds whether the content is of finite duration.
+// @return TBool - ETrue indicates Finite Duration,
+// EFalse otherwise
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsContentFinite() const
+ {
+ // Does it not have any infinite repeat count
+ // animations
+ if ( ( iDuration != 0 ) &&
+ ( iDuration != KSccIndefiniteDur ) )
+ {
+ return ETrue;
+ }
+ // Content contains atlease one infinite animation
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsProcessDone
+// Returns ETrue if loading is done.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsProcessDone() const
+ {
+ return iIsLoadingDone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SetCurrentFullScreenStatus
+// Set function for current viewing mode.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::SetCurrentFullScreenStatus(
+ TBool aIsFullScreenOn ) // Full Screen( ETrue )/Normal( EFalse )
+ {
+ iIsFullScreenOn = aIsFullScreenOn;
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::HandleApplicationForegroundEvent
+// Does the handling of foreground event occurring.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::HandleApplicationForegroundEvent( TBool aForeground )
+ {
+ iIsForeground = aForeground;
+ if ( !aForeground )
+ {
+ // Application going into background, pause presentation.
+ // We need to check first if there are any
+ // animations at all in this presentation and pause
+ // makes sense or not.
+ if ( IsAnimationPresent() && iAnimState == ESvgAnimPlayingState )
+ {
+ TRAPD(errProcessViewerCmd,
+ ProcessViewerCommandL( ESvgtDlgPauseCommand ));
+
+ if ( errProcessViewerCmd != KErrNone )
+ {
+ // Error occurred , Stop Processing
+ return;
+ }
+
+ if ( iBlinker->IsActive() )
+ {
+ iBlinker->Cancel();
+ iPauseIconVisible = ETrue;
+ }
+ }
+ }
+ else
+ {
+ // Application coming into foreground.
+ // May need to start a flashing pause indicator so
+ // that user would come to know presentation is paused.
+ if ( IsAnimationPresent() && iAnimState == ESvgAnimPausedState )
+ {
+ if ( iPauseIconVisible )
+ {
+ ShowPauseIcon( ETrue );
+ }
+ }
+ // Perform a redraw to avoid corrupted bitmap
+ iSvgModule->Redraw();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsTextSelectOn
+// Indicates whether the "Select Text" menu item be displayed.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsTextSelectOn() const
+ {
+ return ( iIsTextSelectOn );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsTextEditOn
+// Indicates whether the "Edit Text" menu item be displayed.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsTextEditOn() const
+ {
+ return ( iIsTextEditOn );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsTextContentChanged
+// Indicates whether the text in the content was modified.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsTextContentChanged() const
+ {
+ return ( iIsTextChanged );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SaveComplete
+// Used to perform any cleanup once save is complete.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::SaveComplete( const TInt aError )
+ {
+ if ( !aError )
+ {
+ iIsTextChanged = EFalse;
+
+ //Upadate the MSK label once saving is done
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::UpdateScreen
+// Implements MSvgRequestObserver::UpdateScreen.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::UpdateScreen()
+ {
+ if ( IsContentFinite() )
+ {
+ ResetBacklightTime();
+ }
+ if ( iSVGTBitMapMask )
+ {
+ // Generate the mask for the bitmap
+ iSvgModule->GenerateMask( iSVGTBitMapMask );
+ }
+ iSvgModule->IsPanPossibleFourWay(iPanLt,iPanRt,iPanUp,iPanDn);
+
+ // Find the new position of bounding boxes if
+ // Find Text was performed
+ if ( iIsSearchStrValid )
+ {
+ CalcFindTextBBox();
+ }
+ if ( iIsLoadingDone )
+ {
+ DrawNow();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ScriptCall
+// Implements MSvgRequestObserver::ScriptCall.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::ScriptCall( const TDesC& /*aScript*/,
+ CSvgElementImpl* /*aCallerElement*/ )
+ {
+ return EFalse;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::FetchImage
+// Implements MSvgRequestObserver::FetchImage. It executes asynchronously.
+// To fetch the image each time the KErrGeneral should be return.
+// -----------------------------------------------------------------------------
+//
+TInt CSVGTCustControl::FetchImage( const TDesC& aUri,
+ RFs& aSession, RFile& aFileHandle )
+ {
+
+ TInt ret = 0;
+
+ iImageFileType = ImageFileType(aUri);
+ if ( iAppObserver )
+ {
+ ret = iAppObserver->FetchImage( aUri, aSession, aFileHandle ) ;
+ }
+ else
+ {
+ return KErrNotFound;
+ }
+
+ if ( !iFetchImageError )
+ {
+ iFetchImageError = ret;
+ }
+
+ if(iImageFileType == ELocalImageFile)
+ {
+ return ret;
+ }
+ else
+ {
+ return KErrGeneral;
+ }
+ }
+
+TInt CSVGTCustControl::FetchFont( const TDesC& aUri ,
+ RFs& aSession , RFile& aFileHandle )
+ {
+ _LIT(KPath, "C:\\data\\images\\");
+ TBuf<KMaxPath> fileName;
+ fileName.Copy(KPath);
+ fileName.Append(aUri);
+ return aFileHandle.Open( aSession, fileName, EFileShareReadersOnly);
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl:: GetSmilFitValue
+// Implements the MSvgRequestObserver::GetSmilFitValue.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::GetSmilFitValue( TDes& aSmilValue )
+ {
+ aSmilValue.Copy( KSccSmilFitValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::UpdatePresentation
+// Implements MSvgRequestObserver::UpdatePresentation.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::UpdatePresentation( const TInt32& aNoOfAnimation )
+ {
+ if ( iTotalNumerOfAnimation == KSccConstMinusOne )
+ {
+ if ( aNoOfAnimation == KSccConstZero )
+ {
+ iAnimationStatus = ESvgNoAnimationsPresent;
+ return;
+ }
+ else
+ {
+ // First time Update Presentation is called
+ // and animations are present.
+ iTotalNumerOfAnimation = aNoOfAnimation;
+ }
+ }
+ else
+ {
+ iTotalNumerOfAnimation -= aNoOfAnimation;
+ }
+
+ if ( iTotalNumerOfAnimation == KSccConstZero )
+ {
+ iAnimationStatus = ESvgAllAnimationsComplete;
+ return;
+ }
+
+ iAnimationStatus = ESvgAnimationsNotComplete;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::OfferKeyEventL
+// Handles Key events by reimplementing CCoeControl::OfferKeyEventL.
+// Returns:
+// EKeyWasConsumed: If this control uses this key.
+// EKeyWasNotConsumed: Otherwise.
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CSVGTCustControl::OfferKeyEventL(
+ const TKeyEvent& aKeyEvent, // Key Event
+ TEventCode aType ) // Event Code
+ {
+
+ TKeyResponse retVal = EKeyWasNotConsumed;
+ TInt keyScanCode = aKeyEvent.iScanCode;
+ TInt keyCode = aKeyEvent.iCode;
+ switch ( aType )
+ {
+ case EEventKeyDown:
+ {
+ // reset the repeat count
+ iKeyRepeatCount = 0;
+ // Reset the select cause
+ iSelectCause = ESvgInvalidSelectCause;
+ // UI Spec: Pointer should be displayed when
+ // Select Key or Pointer is moved
+ if ( keyScanCode == EStdKeyEnter ||
+ keyScanCode == EStdKeyDevice3 ||
+ keyScanCode == EStdKeyUpArrow ||
+ keyScanCode == EStdKeyDownArrow ||
+ keyScanCode == EStdKeyLeftArrow ||
+ keyScanCode == EStdKeyRightArrow )
+ {
+ if ( !iInactivityTimer )
+ {
+ // Ignore subsequent key events as the pointer should be
+ // displayed and no event is to be processed until key
+ // up event is received.
+ iIgnorePointerKeyEvent = ETrue;
+ }
+ if( keyScanCode != EStdKeyDevice3 && keyScanCode != EStdKeyEnter && !iIsPointerDisplayed )
+ {
+ iScrollKey=ETrue; //needed to check when the pointer hidden
+ // and scroll key is pressed.
+ }
+
+
+ if( ( keyScanCode == EStdKeyDevice3 || keyScanCode == EStdKeyEnter )&&!iIsPointerDisplayed )
+ {
+ // Key has been lifted,
+ // Reset the Pointer Delta Values
+ iPointerDx = KSccConstZero;
+ iPointerDy = KSccConstZero;
+
+ // UI Spec: Pointer should be hidden after 15 sec of
+ // user inactivity
+ if ( iInactivityTimer )
+ {
+ // Should not be the case!
+ delete iInactivityTimer;
+ iInactivityTimer = NULL;
+ }
+ iInactivityTimer = CSVGTPointerHideTimer::NewL( this );
+ iInactivityTimer->After( KSccPointerHideTimerStartAfter );
+ }
+ if(keyScanCode == EStdKeyDevice3 || keyScanCode == EStdKeyEnter )
+ {
+ iDownKeyOccurred = ETrue;
+ iSvgModule->MouseDown( iPointerX, iPointerY );
+ }
+ SetPointerDisplayStatusAndRedraw( ETrue );
+
+ retVal = EKeyWasConsumed;
+ }
+ }
+ break;
+ case EEventKeyUp:
+ {
+ if ( keyScanCode == EStdKeyEnter ||
+ keyScanCode == EStdKeyDevice3 ||
+ keyScanCode == EStdKeyUpArrow ||
+ keyScanCode == EStdKeyDownArrow ||
+ keyScanCode == EStdKeyLeftArrow ||
+ keyScanCode == EStdKeyRightArrow )
+ {
+ // Key has been lifted,
+ // Reset the Pointer Delta Values
+ iPointerDx = KSccConstZero;
+ iPointerDy = KSccConstZero;
+
+ // UI Spec: Pointer should be hidden after 15 sec of
+ // user inactivity
+ if ( iInactivityTimer )
+ {
+ // Should not be the case!
+ delete iInactivityTimer;
+ iInactivityTimer = NULL;
+ }
+ iInactivityTimer = CSVGTPointerHideTimer::NewL( this );
+ iInactivityTimer->After( KSccPointerHideTimerStartAfter );
+
+ // Once the pointer is un-hidden, Ignore subsequent key events
+ // and no event is to be processed until key up event is received.
+ if ( iIgnorePointerKeyEvent )
+ {
+ iIgnorePointerKeyEvent = EFalse;
+ retVal = EKeyWasConsumed;
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+ else
+ {
+ // Assume key will be consumed
+ retVal = EKeyWasConsumed;
+
+ if( ( keyScanCode == EStdKeyDevice3 || keyScanCode == EStdKeyEnter )&& iDownKeyOccurred)
+ {
+ iSvgModule->MouseUp(iPointerX,iPointerY);
+ iDownKeyOccurred= EFalse;
+ }
+ }
+
+ }
+ }
+ break;
+ case EEventKey:
+ {
+ retVal = EKeyWasConsumed;
+ iKeyRepeatCount++;
+
+ // Once the pointer is un-hidden, Ignore subsequent joystick
+ // key events and no joystick event is to be processed until
+ // key up event is received.
+ switch ( keyCode /*keyScanCode*/ )
+ {
+ case KSccZoomInKey: // Zoom In Key
+ {
+ if ( iKeyRepeatCount == 1 )
+ {
+ ProcessViewerCommandL( ESvgtDlgZoomInCommand );
+ }
+
+ break;
+ }
+ case EKeyUpArrow: // Pointer Up
+ {
+ if ( iIgnorePointerKeyEvent == EFalse)
+ {
+ iPointerDx = KSccConstZero;
+ iPointerDy -= KSccCursorMinDeltaY;
+ }
+ break;
+ }
+ case EKeyDownArrow: // Pointer Down
+ if ( iIgnorePointerKeyEvent == EFalse)
+ {
+ iPointerDx = KSccConstZero;
+ iPointerDy += KSccCursorMinDeltaY;
+ }
+ break;
+ case EKeyLeftArrow: // Pointer Left
+ if ( iIgnorePointerKeyEvent == EFalse)
+ {
+ iPointerDx -= KSccCursorMinDeltaX;
+ iPointerDy = KSccConstZero;
+ }
+ break;
+ case EKeyRightArrow: // Pointer Right
+ if ( iIgnorePointerKeyEvent == EFalse)
+ {
+ iPointerDx += KSccCursorMinDeltaX;
+ iPointerDy = KSccConstZero;
+ }
+ break;
+ case ENumberKey1: //key 1
+ DoRotation(ERotationAngle90);
+ break;
+ case ENumberKey3: //key 3
+ DoRotation(-ERotationAngle90);
+ break;
+ case ENumberKey7: //key 7
+ DoRotation(ERotationAngle45);
+ break;
+ case ENumberKey9: //key 9
+ DoRotation(-ERotationAngle45);
+ break;
+ case KSccZoomOutKey: // Zoom out key
+ // Zoom out if "zoom-out" key was pressed once
+ {
+ if ( iKeyRepeatCount == 1 )
+ {
+ ProcessViewerCommandL( ESvgtDlgZoomOutCommand );
+ }
+ else if ( ( iZoomLevel > 0 ) && ( iKeyRepeatCount == 2 ) )
+ {
+ ProcessViewerCommandL(ESvgtDlgZoomOptimalCommand );
+ }
+ break;
+ }
+ default:
+ {
+ // Unknown Key
+ retVal = EKeyWasNotConsumed;
+ }
+ }
+ }
+ break;
+ default:
+ {
+ // Unknown Key
+ retVal = EKeyWasNotConsumed;
+ }
+ break;
+ }
+ if ( ( iPointerDx != KSccConstZero ) ||
+ ( iPointerDy != KSccConstZero ) )
+ {
+ UpdatePointer();
+ }
+ return retVal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::HandleResourceChange
+// This function is called by the framework when there is a layout switch/skin
+// change
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::HandleResourceChange( TInt aType )
+ {
+ if ( aType == KAknsMessageSkinChange )
+ {
+ // Recreate the icons
+ TRAPD( err, CreateIconsL() );
+ if ( err != KErrNone )
+ {
+ // No Error Handling done here.
+ }
+ // Find Text Highlight Colour
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+ // Color is not updated if it not found from the skin
+ AknsUtils::GetCachedColor(skin, iFindTextHiColor,
+ KAknsIIDQsnHighlightColors,
+ EAknsCIQsnHighlightColorsCG2);
+ SetSize(Rect().Size());
+ }
+
+ CCoeControl::HandleResourceChange( aType );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::LinkEntered
+// Callback Function called by the engine when the pointer enters a hyperlink
+// -----------------------------------------------------------------------------
+//
+
+TBool CSVGTCustControl::LinkEntered( const TDesC& aUri)
+ {
+
+ CXmlElementImpl* ptr=NULL;
+
+ // Get the elementID
+ ptr=iSvgModule->GetElementById(iSvgModule->SvgDocument(),aUri);
+
+ // Check for "a" element or an element which has animation on
+ // mousedown/mouseup
+ if(!ptr)
+ {
+ iAElement=ETrue;
+ iPointerType = ESvgPointerHand;
+ // Sets the MSK label
+ if(iMSKImpl && !iPreviewMode )
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+ }
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::LinkExited
+// Callback Function called by the engine when the pointer exits a hyperlink
+// -----------------------------------------------------------------------------
+//
+
+TBool CSVGTCustControl::LinkExited( const TDesC& /*aUri*/ )
+ {
+
+ iPointerType = ESvgPointerDefault;
+
+ // Reset the flag for a element
+ iAElement=EFalse;
+
+ //Set the MSK label
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+
+ return ETrue;
+ }
+// ---------------------------------------------------------------------------
+// CSVGTCustControl::LinkActivated
+// Callback Function called by the engine when a hyperlink is activated
+// ---------------------------------------------------------------------------
+//
+
+TBool CSVGTCustControl::LinkActivated(
+ const TDesC& aUri )
+ {
+ if (iSelectCause != ESvgInvalidSelectCause )
+ {
+ // Ignore this callback as it was already processed.
+ return ETrue;
+ }
+ // Set the cause for select operation as Hyperlink so that
+ // subsequent events trigerred are ignored.
+ iSelectCause = ESvgHyperLinkSelectCause;
+
+ if( iAppObserver )
+ {
+ if( IsThreadRunning() )
+ {
+ CSvgtEventLinkActivated* event = new
+ CSvgtEventLinkActivated( aUri );
+ iEventHandlerAO->AddEventToList( event );
+ iEventHandlerAO->MakeRequestComplete( KErrNone );
+ return ETrue;
+ }
+ else
+ {
+ return iAppObserver->LinkActivated( aUri );
+ }
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+// --------------------------------------------------------------------
+// CSVGTCustControl::LinkActivatedWithShow
+// Callback Function called by the engine when a hyperlink with show
+// attribute is activated
+// --------------------------------------------------------------------
+//
+TBool CSVGTCustControl::LinkActivatedWithShow(
+ const TDesC& aUri ,
+ const TDesC& aShow )
+ {
+ if (iSelectCause != ESvgInvalidSelectCause )
+ {
+ // Ignore this callback as it was already processed.
+ return ETrue;
+ }
+ // Set the cause for select operation as Hyperlink so that
+ // subsequent events trigerred are ignored.
+ iSelectCause = ESvgHyperLinkSelectCause;
+ if( iAppObserver )
+ {
+ if( IsThreadRunning() )
+ {
+ CSvgtEventLinkActivatedWithShow* event =
+ new CSvgtEventLinkActivatedWithShow( aUri, aShow );
+ iEventHandlerAO->AddEventToList( event );
+ iEventHandlerAO->MakeRequestComplete( KErrNone );
+
+ return ETrue;
+ }
+ else
+ {
+ return iAppObserver->LinkActivatedWithShow( aUri, aShow );
+ }
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::CreateBitmapsL
+// This function is called to create the bitmaps used by the SVG engine
+// for rendering.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::CreateBitmapsL(
+ const TSize& aBitmapSize ) // Bitmap Size used to render content
+ {
+
+ if( iSVGTBitMap && (iSVGTBitMap->SizeInPixels() == aBitmapSize))
+ {
+ return ;
+ }
+
+ TDisplayMode dispMode = iEikonEnv->ScreenDevice()->DisplayMode();
+ TInt errCode = KErrNone;
+ // Modes currently supported by SVG engine are:
+ // EGray2, EColor4K, EColor64K, EColor16M, EColor16MU.
+ switch ( dispMode )
+ {
+ case EGray2:
+ case EColor16M:
+ {
+ break;
+ }
+ case EColor16MU:
+ {
+ break;
+ }
+ default:
+ {
+ dispMode = EColor64K;
+ break;
+ }
+ }
+ // Create the bitmaps using local variables and assign
+ // to member variable if successful
+ CFbsBitmap* lTempBitmap = new ( ELeave ) CFbsBitmap();
+
+ // Create the bitmap with size and display mode
+ errCode = lTempBitmap->Create( aBitmapSize, dispMode );
+ if ( errCode != KErrNone )
+ {
+ delete lTempBitmap;
+ User::Leave( errCode );
+ }
+
+ // Check and destroy existing bitmap
+ if ( iSVGTBitMap )
+ {
+ delete iSVGTBitMap;
+ }
+
+ // Assign newly created bitmap
+ iSVGTBitMap = lTempBitmap;
+
+ // Create the bitmap mask
+ lTempBitmap = new ( ELeave ) CFbsBitmap();
+
+ // Create the bitmap with size and display mode
+ errCode = lTempBitmap->Create( aBitmapSize, EGray256 );
+ if ( errCode != KErrNone )
+ {
+ delete lTempBitmap;
+ User::Leave( errCode );
+ }
+
+ // Check and destroy existing bitmap
+ if ( iSVGTBitMapMask )
+ {
+ delete iSVGTBitMapMask;
+ }
+
+ // Assign newly created bitmap
+ iSVGTBitMapMask = lTempBitmap;
+
+ // Create the Framebuffer Bitmap
+ lTempBitmap = new ( ELeave ) CFbsBitmap();
+
+ // Create the bitmap with size and display mode
+ errCode = lTempBitmap->Create( aBitmapSize, dispMode );
+ if ( errCode != KErrNone )
+ {
+ delete lTempBitmap;
+ User::Leave( errCode );
+ }
+
+ // Check and destroy existing bitmap
+ if ( iSVGTFrameBufBitMap )
+ {
+ delete iSVGTFrameBufBitMap;
+ }
+
+ // Assign newly created bitmap
+ iSVGTFrameBufBitMap = lTempBitmap;
+
+ // Create the Bitmap Device and Contexts, used to reduce the number
+ // of interactions with the windows server
+ CFbsBitmapDevice* lTempBitmapDev = CFbsBitmapDevice::NewL(
+ iSVGTFrameBufBitMap );
+
+ CFbsBitGc* lTempBitmapCtx = NULL;
+ // Create framebuffer context
+ errCode = lTempBitmapDev->CreateContext( lTempBitmapCtx );
+ if ( errCode != KErrNone )
+ {
+ delete lTempBitmapDev;
+ User::Leave( errCode );
+ }
+
+ // Check and destroy existing bitmap device
+ if ( iSVGTFrameBufDevice )
+ {
+ delete iSVGTFrameBufDevice;
+ }
+
+ // Check and destroy existing bitmap context
+ if ( iSVGTFrameBufContext )
+ {
+ delete iSVGTFrameBufContext;
+ }
+
+ // Assign newly created bitmap device
+ iSVGTFrameBufDevice = lTempBitmapDev;
+ iSVGTFrameBufContext = lTempBitmapCtx;
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::CreateIconsL
+// This function is called to create the icons used by the control.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::CreateIconsL()
+ {
+ // Skin instance
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+ // Cleanup the old icons.
+ FreeIcons();
+
+ // Construct the MBM file name
+ TParse parse;
+ parse.Set( KSccIconFile, &KDC_APP_BITMAP_DIR, NULL);
+ TPtrC iconFile = parse.FullName();
+
+ //Create icon for drawing the pointer
+ iPointerIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiViewerPointer,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_viewer_pointer,
+ EMbmSvgtuicontrolQgn_indi_viewer_pointer_mask );
+
+ //Create icon for drawing the hyperlink pointer
+ iHandIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiViewerPointerHand,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_viewer_pointer_hand,
+ EMbmSvgtuicontrolQgn_indi_viewer_pointer_hand_mask );
+
+ //Create icon for drawing the hyperlink pointer
+ iTextIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiViewerPointerText,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_viewer_pointer_text,
+ EMbmSvgtuicontrolQgn_indi_viewer_pointer_text_mask );
+
+ // Panning Indicators
+ // Create icon for drawing the Pan Left
+ iPanIndLeftIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiViewerPanningLeft,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_left,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_left_mask );
+
+ // Create icon for drawing the Pan Right
+ iPanIndRightIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiViewerPanningRight,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_right,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_right_mask );
+
+ // Create icon for drawing the Pan Up
+ iPanIndUpIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiViewerPanningUp,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_up,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_up_mask );
+
+ // Create icon for drawing the Pan Down
+ iPanIndDownIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiViewerPanningDown,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_down,
+ EMbmSvgtuicontrolQgn_indi_viewer_panning_down_mask );
+
+ // Create icon for drawing the Pause
+ iPauseIcon = AknsUtils::CreateGulIconL(
+ skin,
+ KAknsIIDQgnIndiCamsPaused,
+ iconFile,
+ EMbmSvgtuicontrolQgn_indi_cams_paused,
+ EMbmSvgtuicontrolQgn_indi_cams_paused_mask );
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::InitializeEngineL
+// Initiliazes the interface with the SVG engine.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::InitializeEngineL()
+ {
+ if ( !iSvgModule )
+ {
+ TInt fontId = KLatintFontId;
+
+ switch ( AknLayoutUtils::Variant() )
+ {
+ case EApacVariant:
+ {
+ fontId = KApacFontId;
+ }
+ break;
+ case EEuropeanVariant:
+ default:
+ break;
+ }
+
+ const CFont* font = AknLayoutUtils::FontFromId( fontId );
+ TFontSpec spec = font->FontSpecInTwips();
+
+ iSvgModule = CSvgEngineInterfaceImpl::NewL( iSVGTBitMap,
+ this, spec );
+ iSvgModule->SetBackgroundColor( KSccArgbWhite );
+ iSvgModule->AddHyperlinkListener( static_cast < MSvgHyperlinkListener* >
+ (this) );
+ // Register for notification of Animation Start/Stop.
+ iSvgModule->AddAnimationListener( static_cast < MSvgAnimationListener* >
+ ( this ) );
+ iSvgModule->AddListener(static_cast<MSvgLoadingListener*>(this),
+ ESvgLoadingListener);
+ iSvgModule->AddListener(static_cast<MSvgLoadingListener*>(this),
+ ESvgHyperlinkListener);
+ iSvgModule->AddListener( static_cast < MSvgInteractiveElementListener* >
+ (this), ESvgInteractiveElementListener);
+
+#ifdef SVGTUICONTROL_DBG_TEXT_EDIT_SELECT_API_ENABLE
+ // In DRM protected contents, disable the text operations:
+ iEnableTextOps = !( iSvgDrmHelper->IsProtected()||iPreviewMode );
+
+ if ( iEnableTextOps )
+ {
+ // Add textArea element listener
+ iSvgModule->AddListener( static_cast<MSvgTextAreaListener *>(this),
+ ESvgTextAreaListener );
+
+ // Add text element listener
+ iSvgModule->AddListener( static_cast<MSvgTextListener *>(this),
+ ESvgTextListener );
+ }
+#endif // SVGTUICONTROL_DBG_TEXT_EDIT_SELECT_API_ENABLE
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::LoadContentL
+// This function uses the SVG Engine to load the SVGT content.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::LoadContentL(
+ RFile& aFileHandle ) // Filename of SVGT content
+ {
+ // Enable DRM mode of engine
+ iSvgModule->SetDRMMode( ETrue );
+
+ // Rewind the file
+ TInt pos = 0;
+ aFileHandle.Seek( ESeekStart, pos );
+
+ iLoadingThreadError = iSvgModule->Load( aFileHandle );
+
+#ifdef SVGTUICONTROL_DBG_OPENVG_TESTING_ENABLE
+ iSvgModule->CustomOption( ETrue );
+#endif // SVGTUICONTROL_DBG_OPENVG_TESTING_ENABLE
+ }
+
+TInt CSVGTCustControl::LoadSvgContent(TAny* aAny)
+ {
+ CSVGTCustControl& loader = *( CSVGTCustControl* )aAny;
+ CTrapCleanup* theTrapCleanup = CTrapCleanup::New();
+ loader.SetThreadRunning(ETrue);
+ TRAP_IGNORE( loader.InitSvgContentL() );
+ delete theTrapCleanup;
+ return 0;
+ }
+
+void CSVGTCustControl::InitSvgContentL()
+ {
+ CActiveScheduler* threadScheduler = new (ELeave) CActiveScheduler;
+ CleanupStack::PushL( threadScheduler );
+ CActiveScheduler::Install(threadScheduler);
+
+ // Load the SVGT content
+ LoadContentL( iContentFileHandle );
+ CleanupStack::PopAndDestroy( threadScheduler );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DisplayInfoNoteL
+// This is a utility function for displaying the info notes
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DisplayInfoNoteL( TInt aResourceId, // Resource Id of
+ // string
+ TBool aIsWaitingDialog ) // Indicate whether \
+ // dialog should wait
+ {
+ if(iDisplayFlags & ESvgDisplayErrorNotes )
+ {
+ // Show information note
+ HBufC* prompt = iCoeEnv->AllocReadResourceLC( aResourceId );
+ CAknInformationNote* note = new ( ELeave ) CAknInformationNote(
+ aIsWaitingDialog );
+ note->ExecuteLD( *prompt );
+ CleanupStack::PopAndDestroy( prompt );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DoPostLoadFuncL
+// This is a utility function for performing post-load functionality
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DoPostLoadFuncL()
+ {
+ if ( iSvgModule )
+ {
+#ifdef RD_SVGT_AUDIO_SUPPORT
+ SetPresentationVolume( iVolumeLevel );
+#endif //RD_SVGT_AUDIO_SUPPORT
+
+ // give thread normal priority
+ iMainThread.SetPriority( EPriorityNormal );
+ // Attach to property for call state property
+ User::LeaveIfError( iSystemState.Attach( KPSUidCtsyCallInformation,
+ KCTsyCallState ) );
+ // Attach to property for call type property
+ User::LeaveIfError( iSystemState.Attach( KPSUidCtsyCallInformation,
+ KCTsyCallType ) );
+ // Indicate that the content loading is complete
+ iIsLoadingDone = ETrue;
+
+ // Store SVG duration
+ iDuration = iSvgModule->Duration();
+
+ // Start the rendering process
+ iAnimState = ESvgAnimPlayingState;
+ iSvgModule->Start();
+
+ //Drawing the MSK label for the first time
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+
+ // Check whether the content is finite, inorder to display the
+ // progress timer
+ if ( IsContentFinite() )
+ {
+ // Start immediately so that the first count is displayed
+ StartProgIndTimer( 0 );
+ }
+
+ if ( IsVoiceCallActive() )
+ {
+ ProcessPauseCmd();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SaveSvgDom
+// This function is a helper function to save the modified svg content
+// given the file name.
+// -----------------------------------------------------------------------------
+TInt CSVGTCustControl::SaveSvgDom( const TDesC& aFileName )
+ {
+ TInt retVal = KErrNone;
+ MSvgError* lSvgErr = iSvgModule->SaveSvgDom(
+ (TInt)iSvgModule->SvgDocument(), aFileName );
+ if ( ( !lSvgErr ) || ( lSvgErr->HasError() ) )
+ {
+ if ( lSvgErr )
+ {
+ // Attempt to find the system error code
+ retVal = lSvgErr->SystemErrorCode();
+ }
+ else
+ {
+ // No free memory available
+ retVal = KErrNoMemory;
+ }
+
+ // No error code found, indicate general error
+ if ( retVal == KErrNone )
+ {
+ retVal = KErrGeneral;
+ }
+ }
+ return retVal;
+ }
+ // -----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+void CSVGTCustControl::GetViewPort( TInt getWidth ,
+ TInt getHeight ,
+ TBool isWidthInPercentage,
+ TBool isHeightInPercentage,
+ TInt& setWidth, TInt& setHeight )
+ {
+ if(!iSvgModule)
+ {
+ return;
+ }
+ if(!iSVGTBitMap)
+ {
+ return;
+ }
+ TSize svgSize = iSvgModule->ContentDimensionsInPercentage();
+ TInt per=100;
+ TSize tempSize = iSvgModule->ContentDimensions();
+ TInt scrW = iSVGTBitMap->SizeInPixels().iWidth;
+ TInt scrH = iSVGTBitMap->SizeInPixels().iHeight;
+ //both not in percentage
+ if(!isWidthInPercentage && !isHeightInPercentage)
+ {
+ setWidth = tempSize.iWidth;
+ setHeight = tempSize.iHeight;
+ }
+ //if width in percentage
+ else if(isWidthInPercentage && !isHeightInPercentage)
+ {
+ setWidth = svgSize.iWidth * scrW / per;
+ //if svg had valid height take it else use default
+ if(tempSize.iHeight)
+ {
+ setHeight = getHeight;
+ }
+ }
+ //if height in percentage
+ else if(!isWidthInPercentage && isHeightInPercentage)
+ {
+ setHeight = svgSize.iHeight * scrH / per;
+ if(tempSize.iWidth)
+ {
+ setWidth = getWidth;
+ }
+ }
+ //if both height and width are in percentage
+ else
+ {
+ setHeight = svgSize.iHeight * scrH / per;
+ setWidth = svgSize.iWidth * scrW / per;
+ }
+
+ //if height is greater than screenHeight
+ //or if width is greater than screenwidth
+ //set the width and height by preserving the aspect ratio
+ TReal32 sx,sy;
+
+ if(setHeight > scrH || setWidth > scrW)
+ {
+ sx = (TReal32) (scrW) / (TReal32) (setWidth);
+ sy = (TReal32) (scrH) / (TReal32) (setHeight);
+ if ( sx > sy )
+ {
+ sx = sy;
+ }
+ else // ( sx < sy )
+ {
+ sy = sx;
+ }
+ setWidth = sx * setWidth;
+ setHeight = sy * setHeight;
+ }
+
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DrawPointer
+// This function blits the pointer bitmap on the screen at the current mouse
+// co-ordinates which are maintained as data-members of CSVGTCustControl.
+// -----------------------------------------------------------------------------
+//
+
+void CSVGTCustControl::DrawPointer() const
+ {
+
+ iSVGTFrameBufContext->SetPenStyle( CGraphicsContext::ENullPen );
+ iSVGTFrameBufContext->SetBrushStyle( CGraphicsContext::ENullBrush );
+
+
+ // Use the aid for the hotspot from the LAF.
+ // This value is set in the SizeChanged function.
+ // The hotspot information is used so that the bitmap is drawn in
+ // correct position with respect to the mouse position.
+ switch ( iPointerType )
+ {
+ case ESvgPointerHand:
+ {
+ // Draw the hand icon at the mouse position
+ TPoint pointerStart( iPointerX - iHandAidRect.Rect().Width(),
+ iPointerY - iHandAidRect.Rect().Height() );
+ iSVGTFrameBufContext->BitBltMasked( pointerStart,
+ iHandIcon->Bitmap(),
+ iHandRect.Rect(),
+ iHandIcon->Mask(),
+ EFalse );
+ break;
+ }
+ case ESvgPointerText:
+ {
+ // Draw the hand icon at the mouse position
+ TPoint pointerStart( iPointerX - iTextAidRect.Rect().Width(),
+ iPointerY - iTextAidRect.Rect().Height() );
+ iSVGTFrameBufContext->BitBltMasked( pointerStart,
+ iTextIcon->Bitmap(),
+ iTextRect.Rect(),
+ iTextIcon->Mask(),
+ EFalse );
+ break;
+ }
+ case ESvgPointerDefault: // Fall Through
+ default: // Fall Through - Should never be the case
+ {
+ // Draw the pointer icon at the mouse position
+ TPoint pointerStart( iPointerX - iPointerAidRect.Rect().Width(),
+ iPointerY - iPointerAidRect.Rect().Height() );
+ iSVGTFrameBufContext->BitBltMasked( pointerStart,
+ iPointerIcon->Bitmap(),
+ iPointerRect.Rect(),
+ iPointerIcon->Mask(),
+ EFalse );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::UpdatePointer
+// Called when pointer needs to be redrawn
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::UpdatePointer()
+ {
+ // Get the size of the content
+ TSize svgSize = iSvgModule->Size();
+ TInt rgnw = svgSize.iWidth;
+ TInt rgnh = svgSize.iHeight;
+
+ // This is to store whether the framebuffer changed
+ TBool lFrameBufChange = EFalse;
+
+ // iPointerDx contains the delta increment in X axis
+ // Add it to the pointer coordinates
+ iPointerX += iPointerDx;
+
+ // If pointer coordinate becomes negative then reset it
+ // and perform panning.
+ if ( iPointerX < KSccConstZero )
+ {
+ iPointerX = KSccConstZero;
+ if(iPanLt)
+ {
+ iSvgModule->Pan( KSccPanNumPixelsX, KSccConstZero );
+ }
+ lFrameBufChange = ETrue;
+ }
+
+ // If pointer coordinate becomes greater than content size
+ // then set it back to (content width - 1) and
+ // perform panning.
+ if ( rgnw <= iPointerX )
+ {
+ iPointerX = rgnw - KSccConstOne;
+ if(iPanRt)
+ {
+ iSvgModule->Pan( -KSccPanNumPixelsX, KSccConstZero );
+ }
+ lFrameBufChange = ETrue;
+ }
+
+ // iPointerDy contains the delta increment in Y axis
+ // Add it to the pointer coordinates.
+ iPointerY += iPointerDy;
+
+ // If pointer coordinate becomes negative then reset it
+ // and perform panning.
+ if ( iPointerY < KSccConstZero )
+ {
+ iPointerY = KSccConstZero;
+ if(iPanUp)
+ {
+ iSvgModule->Pan( KSccConstZero, KSccPanNumPixelsY );
+ }
+ lFrameBufChange = ETrue;
+ }
+
+ // If pointer coordinate becomes greater than content size
+ // then set it back to (content height - 1) and
+ // perform panning.
+ if ( iPointerY >= rgnh )
+ {
+ iPointerY = rgnh - KSccConstOne;
+ if(iPanDn)
+ {
+ iSvgModule->Pan( KSccConstZero, -KSccPanNumPixelsY );
+ }
+ lFrameBufChange = ETrue;
+ }
+
+ // If Framebuffer changed, perform an engine redraw and recalculate
+ // bound box coordinates
+ if ( lFrameBufChange )
+ {
+ iSvgModule->Redraw();
+ CalcFindTextBBox();
+ }
+
+ // Indicate new mouse position to engine
+ iSvgModule->MouseMove( iPointerX, iPointerY );
+
+ // Perform a redraw to reflect new position of pointer
+ DrawDeferred();
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SetMSKLabel
+// This function is called to set the MSK labels under various circumstances.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::SetMSKLabelL()
+{
+ TInt lResourceID=0;
+ TInt lCommandID=0;
+ if(!iIsPointerDisplayed)
+ {
+ if (IsAnimationPresent())
+ {
+ lResourceID=R_SVGT_MSK_LABEL_CONTEXT;
+ lCommandID=EAknSoftkeyContextOptions;
+ }
+ else if ( !IsAnimationPresent() &&
+ (iAppObserver->CanShowSave() || IsTextContentChanged() ) )
+ {
+ lResourceID=R_SVGT_MSK_LABEL_SAVE;
+ lCommandID=EAknSoftkeySave;
+ }
+ else
+ {
+ lResourceID=R_SVGT_MSK_LABEL_CONTEXT;
+ lCommandID=EAknSoftkeyOptions;
+ }
+ }
+ else
+ {
+ switch(iPointerType)
+ {
+ case ESvgPointerHand:
+ {
+ lCommandID=EAknSoftkeySelect;
+ if(iAElement)
+ {
+ lResourceID=R_SVGT_MSK_LABEL_OPEN;
+ }
+ else
+ {
+ iPlayMSKLabel=ETrue;
+ lResourceID=R_SVGT_MSK_LABEL_PLAY;
+ }
+ }
+ break;
+ case ESvgPointerText:
+ {
+ lCommandID=EAknSoftkeySelect;
+ if(IsTextEditOn())
+ {
+ lResourceID=R_SVGT_MSK_LABEL_EDIT;
+ }
+ else
+ {
+ lResourceID=R_SVGT_MSK_LABEL_SELECT;
+ }
+ }
+ break;
+ case ESvgPointerDefault:
+ {
+ if (IsAnimationPresent())
+ {
+ lResourceID=R_SVGT_MSK_LABEL_CONTEXT;
+ lCommandID=EAknSoftkeyContextOptions;
+ }
+ else if( !IsAnimationPresent() &&
+ ( iAppObserver->CanShowSave() || IsTextContentChanged() ) )
+ {
+ lResourceID=R_SVGT_MSK_LABEL_SAVE;
+ lCommandID=EAknSoftkeySave;
+ }
+ else
+ {
+ lResourceID=R_SVGT_MSK_LABEL_CONTEXT;
+ lCommandID=EAknSoftkeyOptions;
+ }
+ }
+ break;
+ }
+ }
+ iMSKImpl->RemoveMSKLabel();
+ iMSKImpl->DrawMSKLabelL(lResourceID,lCommandID);
+}
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::GetMSKLabelFlag
+// This function is called to get either iPlayMSKLabel or
+// iContextMenuActivated flag
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::GetMSKLabelFlag(TInt aButtonId) const
+{
+ if (aButtonId==EAknSoftkeyContextOptions)
+ {
+ return iContextMenuActivated;
+ }
+ else //Else the case will be for EAknSoftkeySelect for which the
+ // iPlayMSKLabel has to be returned
+ {
+ return iPlayMSKLabel;
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SetMSKLabelFlag
+// This function is called to set/reset either iPlayMSKLabel or
+// iContextMenuActivated flag
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ChangeMSKLabelFlag(TInt aButtonId)
+{
+ if (aButtonId==EAknSoftkeyContextOptions)
+ {
+ iContextMenuActivated = !iContextMenuActivated;
+ }
+ else //Else the case will be for EAknSoftkeySelect
+ {
+ iPlayMSKLabel=!iPlayMSKLabel;
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SwitchScreenModeL
+// This function is called to change the viewing mode to Normal Screen/Full
+// Screen.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::SwitchScreenModeL()
+ {
+ // When control mode is being switched, following
+ // processing needs to happen:
+ // a. Save the current framebuffer
+ // b. Create the New Framebuffer by calling CreateBitmaps()
+ // c. Set the framebuffer to the new framebuffer
+ // d. Pause the content if it was paused.
+ // e. Also processing in following functions is affected:
+ // i. UpdateScreen - This is the callback of the engine to indicate
+ // that it has rendered the frame on the bitmap, and is ready to be
+ // drawn. Here we need to generate mask with correct bitmap
+ // ii. Draw - This function needs to bitblt the bitmap
+ // along with the mask
+
+ if ( iSvgModule )
+ {
+ // Create new bitmaps
+ CreateBitmapsL( Rect().Size() );
+ iSvgModule->Pause();
+ // Change the rendering bitmap to the appropriate Screen Bitmap
+ iSvgModule->SetFrameBuffer( iSVGTBitMap );
+
+ // Check if content was playing
+ if ( iAnimState != ESvgAnimPlayingState )
+ {
+ // Stop it, as content is paused
+ iSvgModule->Pause();
+ // Redraw the screen, to prevent blank screen from appearing
+ iSvgModule->Redraw();
+ }
+ // Find Text Update
+ // Get new position of Bounding Boxes
+ CalcFindTextBBox();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::CalcFindTextBBox
+// This function is called to recalculate the bounding boxes for the find text.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::CalcFindTextBBox()
+ {
+
+ // Clear the Arrays
+ iBoundBoxArray.Reset();
+ iFoundTextArray.Reset();
+ iTextElemIdArray.Reset();
+
+ // If the Search String is not valid, then
+ // no need to do anything.
+ if ( !iIsSearchStrValid )
+ {
+ return EFalse;
+ }
+
+ // Invoke Engine call for searching text.
+ TBool retVal = iSvgModule->SearchForText(
+ iLastSearchText,
+ iBoundBoxArray,
+ iFoundTextArray,
+ iTextElemIdArray,
+ EFalse );
+
+ if ( retVal == EFalse )
+ {
+ // Set the search string as invalid
+ iIsSearchStrValid = EFalse;
+ // Reset the string
+ //Himanshu iLastSearchText.Zero();
+ }
+
+ return ( retVal );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::PanToCurBBox
+// This function is called to pan the content inorder that the current
+// bounding box is visible.
+// -----------------------------------------------------------------------------
+//
+
+void CSVGTCustControl::PanToCurBBox()
+ {
+ TPoint lRefPos( Rect().Center() );
+
+ // We need to pan in such a way that the Top Left of the Bounding box
+ // coincides with the current view's Center
+ TPoint lPanAmount( lRefPos - FPRCenter(
+ iBoundBoxArray[ iCurSearchMatchId ] ) );
+ iSvgModule->Pan( lPanAmount.iX, lPanAmount.iY );
+ // Do a Redraw
+ iSvgModule->Redraw();
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ProcessFindTextCmd
+// This function is called to perform the necessary processing for the find
+// text command.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ProcessFindTextCmdL()
+ {
+ // The Processing involved is
+ // 1. Query the text to be searched for from the User
+ // 2. Is the text same as the text input before? (Case Insensitive Match)
+ // 3. If Yes, then
+ // Perform "Find Next" functionality
+ // a. If the bounding box is not in view then
+ // move to the same bound box
+ // Else,
+ // Cycle through the list of bound-boxes by incrementing
+ // with wrap around the iCurSearchMatchId while the text
+ // is not visible
+ // else // New text entered
+ // Perform "Find First" Functionality
+ // If no Match is found then,
+ // Display an "Text not found" info note
+ // Reset the Last Searched Text
+ // return to caller
+ // Else,
+ // Find the List of Bound Boxes
+ // Set the Current Match as the Index Zero of the BBox Array
+ // 4. If the current bound box is not in view
+ // Pan to the Bound Box
+ // Recalculate the Bound Box Co-ordinates
+ // 5. Move the mouse to the center of the bound box
+ // 6. Return to caller.
+
+ TBuf<KFindTextQueryMaxLen> lText( iLastSearchText );
+ // Query the text to be searched for from the User
+ CAknTextQueryDialog* dlg = new ( ELeave ) CAknTextQueryDialog(
+ iLastSearchText );
+ if( dlg->ExecuteLD( R_FIND_TEXT_QUERY_DIALOG ) )
+ {
+ // User entered text
+ if ( lText.CompareF( iLastSearchText ) == 0 &&
+ iIsSearchStrValid==1 ) // Case insensitive comparison
+ {
+ // Searching for same text = Find Next
+ // If current bound box is not in view and is visible, then
+ // move to the same bound box
+ // else ; Bound Box is in view or is Not Visible
+ // find next visible box with wraparound.
+ TBool lIsBoxInView = FPRIntersects(
+ iBoundBoxArray[ iCurSearchMatchId ] ,
+ Rect() );
+ if ( lIsBoxInView ||
+ ( !iSvgModule->IsElementVisible(
+ iTextElemIdArray[ iCurSearchMatchId ] ) ) )
+ {
+ // Store the current match Index so that the end of the list
+ // can be identified.
+ TInt lastSearchMatchId = iCurSearchMatchId;
+ // Increment iIsCurMatchId to point to next matching text
+ iCurSearchMatchId = ( iCurSearchMatchId + KSccConstOne ) %
+ ( iBoundBoxArray.Count() );
+ while ( ( iCurSearchMatchId != lastSearchMatchId ) &&
+ ( !iSvgModule->IsElementVisible(
+ iTextElemIdArray[ iCurSearchMatchId ] ) ) )
+ {
+ // Increment iIsCurMatchId to point to next matching text
+ iCurSearchMatchId = ( iCurSearchMatchId + KSccConstOne ) %
+ ( iBoundBoxArray.Count() );
+ }
+ if( iCurSearchMatchId == lastSearchMatchId ||
+ (iCurSearchMatchId==0 ) )
+ {
+ ProcessNoTextFoundL();
+ return;
+ }
+ }
+ }
+ else
+ {
+ // New Search String
+ iCurSearchMatchId = KSccConstZero;
+ iIsSearchStrValid = ETrue;
+
+ if ( !CalcFindTextBBox() )
+ {
+ ProcessNoTextFoundL();
+ return;
+ }
+ else
+ {
+ // Match Found,
+ // Find the first box in the list that is visible
+ if ( !iSvgModule->IsElementVisible(
+ iTextElemIdArray[ iCurSearchMatchId ] ) )
+ {
+ // Store the current match Index so that the end of the
+ // list can be identified.
+ TInt lastSearchMatchId = iCurSearchMatchId;
+ // Increment iIsCurMatchId to point to next matching
+ // text
+ iCurSearchMatchId = ( iCurSearchMatchId +
+ KSccConstOne ) % ( iBoundBoxArray.Count() );
+ while ( ( iCurSearchMatchId != lastSearchMatchId ) &&
+ ( !iSvgModule->IsElementVisible(
+ iTextElemIdArray[ iCurSearchMatchId ] ) ) )
+ {
+ // Increment iIsCurMatchId to point to next
+ // matching text
+ iCurSearchMatchId = ( iCurSearchMatchId +
+ KSccConstOne ) % ( iBoundBoxArray.Count() );
+ }
+ if ( iCurSearchMatchId == lastSearchMatchId )
+ {
+ ProcessNoTextFoundL();
+ return;
+ }
+ }
+ }
+ }
+
+ // To determine if a bounding-box is in view:
+ // Take the intersection ( TRect::Intersects ) of the
+ // Cust Control's rect and the bounding-box. If Intersects()
+ // returns true, bounding-box is in view
+ TRect myRect= Rect();
+ TBool lIsBoxInView = FPRIntersects( iBoundBoxArray[ iCurSearchMatchId ],
+ myRect );
+
+ if ( !lIsBoxInView )
+ {
+ // Box is not in view
+
+ // Pan Content to bring the text in view
+ PanToCurBBox();
+
+ // Get new position of Bounding Boxes
+ CalcFindTextBBox();
+ }
+
+ // Make the mouse visible
+ SetPointerDisplayStatusAndRedraw( ETrue );
+ // Move Mouse over to the centre of the Bound Box
+ TPoint lMousePos =
+ FPRCenter( iBoundBoxArray[ iCurSearchMatchId ] );
+ iPointerX = lMousePos.iX;
+ iPointerY = lMousePos.iY;
+
+ UpdatePointer();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DrawFindTextBBox
+// Draws the Bounding Box for the current match in the SVGT content.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DrawFindTextBBox(
+ const TRect& aRect ) const // Rectangle which needs to be redrawn
+ {
+ // Is there any text to highlight?
+ if ( iIsSearchStrValid )
+ {
+ // To determine if a bounding-box can be drawn:
+ // Need to check whether it is in view && It is visible
+ //
+ // Check whether it is in view:
+ // Take the intersection ( TRect::Intersects ) of the CoeControl-rect
+ // and the bounding-box.if Intersects() returns true,
+ // bounding-box is in view
+ // Check whether it is visible:
+ // Call Engine API to check whether the text elem is visible.
+
+ TBool lCanDrawBox = ( FPRIntersects(
+ iBoundBoxArray[ iCurSearchMatchId ], aRect ) &&
+ iSvgModule->IsElementVisible( iTextElemIdArray[
+ iCurSearchMatchId ] ) );
+
+ if ( lCanDrawBox )
+ {
+ // Set the Draw Mode to XOR
+ iSVGTFrameBufContext->SetDrawMode( CGraphicsContext::EDrawModeXOR );
+
+ // Set the Brush Style to No Fill
+ iSVGTFrameBufContext->SetBrushStyle(
+ CGraphicsContext::ESolidBrush );
+
+ // Set the Pen Style to Solid and color to one obtd from LAF
+ iSVGTFrameBufContext->SetPenStyle( CGraphicsContext::ESolidPen );
+ iSVGTFrameBufContext->SetPenColor( iFindTextHiColor );
+
+ // Set the line thickness
+ iSVGTFrameBufContext->SetPenSize( TSize( KSccConstTwo,
+ KSccConstTwo ) );
+
+ // Set the brush to White so that when the color is XORed with it
+ // it is displayed in its complementary colours.
+ iSVGTFrameBufContext->SetBrushColor( KRgbWhite );
+ // Form the clipping rectangle so that text beyound the
+ // framebuffer is not displayed
+ TRect lClipRect( TPoint( 0,0 ), iSvgModule->Size() );
+
+ iSVGTFrameBufContext->SetClippingRect( lClipRect);
+ CArrayFix<TPoint>* lArray = NULL;
+ TRAPD( err,
+ FPR2PointArrayL( iBoundBoxArray[ iCurSearchMatchId ],
+ lArray ) );
+ if ( err != KErrNone )
+ {
+ delete lArray;
+ return;
+ }
+
+ iSVGTFrameBufContext->DrawPolygon(
+ lArray );
+
+ delete lArray;
+ lArray = NULL;
+
+ // Reset the graphic context parameters so that subsequent
+ // Draw() functions are not affected.
+ iSVGTFrameBufContext->Reset();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ProcessNoTextFoundL
+// This function is called to perform the necessary procesing when
+// text being searched using Find Text command is not found.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ProcessNoTextFoundL()
+ {
+ // Set the search string as invalid
+ iIsSearchStrValid = EFalse;
+ // Reset the string
+ //Himanshu iLastSearchText.Zero();
+
+ // No match found, display an information note
+ TInt resourceId;
+
+ resourceId = R_SVGT_TEXT_NOT_FOUND;
+ // Read from Resource
+ HBufC* prompt = iCoeEnv->AllocReadResourceLC(
+ resourceId );
+
+ // Start a timer to delete the note after 3 seconds.
+ if (!iNoteRemoverTimer->IsActive())
+ {
+ iNoteRemoverTimer->Start( KSccOneSecond * 3, KSccOneSecond * 3,
+ TCallBack( RemoveInfoNote, this ) );
+ }
+ // Create and display the note
+ iInfoNote = new ( ELeave ) CAknInformationNote(
+ ETrue ); // ETrue - Waiting Dialog
+ iInfoNote->ExecuteLD( *prompt );
+
+ // Reset the pointer
+ iInfoNote = NULL;
+
+ CleanupStack::PopAndDestroy( prompt );
+
+ // Do a deferred draw in order to refresh the highlight
+ DrawDeferred();
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DrawPanInd
+// Draws the Panning indicators for the SVGT content.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DrawPanInd() const
+ {
+ // Get current Control Rectangle
+ TRect myRect = Rect();
+ // Set the Brush Style and Pen Style to NULL type
+ // so that the background of bitmap is correctly blitted.
+ iSVGTFrameBufContext->SetPenStyle( CGraphicsContext::ENullPen );
+ iSVGTFrameBufContext->SetBrushStyle( CGraphicsContext::ENullBrush );
+
+ if ( iSvgModule )
+ {
+ // Pan Left?
+ if ( iPanLt )
+ {
+ // Draw the indicator
+ iSVGTFrameBufContext->BitBltMasked( iPanIndLeftRect.Rect().iTl,
+ iPanIndLeftIcon->Bitmap(),
+ myRect,
+ iPanIndLeftIcon->Mask(),
+ EFalse );
+
+ }
+
+ // Pan Right?
+ if ( iPanRt )
+ {
+ // Draw the indicator
+ iSVGTFrameBufContext->BitBltMasked( iPanIndRightRect.Rect().iTl,
+ iPanIndRightIcon->Bitmap(),
+ myRect,
+ iPanIndRightIcon->Mask(),
+ EFalse );
+ }
+
+ // Pan Up?
+ if ( iPanUp )
+ {
+ // Draw the indicator
+ iSVGTFrameBufContext->BitBltMasked( iPanIndUpRect.Rect().iTl,
+ iPanIndUpIcon->Bitmap(),
+ myRect,
+ iPanIndUpIcon->Mask(),
+ EFalse );
+ }
+
+ // Pan Down?
+ if ( iPanDn )
+ {
+ // Draw the indicator
+ iSVGTFrameBufContext->BitBltMasked( iPanIndDownRect.Rect().iTl,
+ iPanIndDownIcon->Bitmap(),
+ myRect,
+ iPanIndDownIcon->Mask(),
+ EFalse );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::CountAnimStarted
+// Counts the number of animations started in the SVGT content.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::CountAnimStarted()
+ {
+ iNumAnimInProgress++;
+#ifdef _DEBUG
+ iDbgNumAnimStarted++;
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::CountAnimPaused
+// Counts the number of animations paused in the SVGT content.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::CountAnimPaused()
+ {
+ // Pause is for the whole content, rather than per animation.
+ // Do not reset the count of animations in progress. Once the
+ // animation is resumed it would receive as many AnimStopped()(as in
+ // iNumAnimInProgress) as the animation progresses towards completion.
+#ifdef _DEBUG
+ iDbgNumAnimPaused++;
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::CountAnimStopped
+// Counts the number of animations stopped in the SVGT content.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::CountAnimStopped()
+ {
+ iNumAnimInProgress--;
+#ifdef _DEBUG
+ iDbgNumAnimStopped++;
+#endif
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsAnimFirst
+// Function indicates whether the animation currently in progress is first one.
+// @return TBool - ETrue - First one
+// EFalse Otherwise.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsAnimFirst() const
+ {
+ return( iNumAnimInProgress == 0 );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsAnimLast
+// Function indicates whether the animation currently in progress is the last
+// one.
+// @return TBool - ETrue - Last one
+// EFalse Otherwise.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsAnimLast() const
+ {
+ return( iNumAnimInProgress == 0 );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SetPointerDisplayStatusAndRedraw
+// Function sets the Pointer display status and redraws the whole control
+// inorder to update display status. Called when Pointer Hide Timer times out.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::SetPointerDisplayStatusAndRedraw(
+ TBool aIsPointerDisplayed )
+ {
+ if ( iIsPointerDisplayed != aIsPointerDisplayed )
+ {
+ iIsPointerDisplayed = aIsPointerDisplayed;
+ //Set the MSK label
+ if(iMSKImpl && iScrollKey && !iPreviewMode )
+ {
+ iScrollKey=EFalse;
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+ DrawDeferred();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ShowPauseIcon()
+// This function updates the pause indicator display in the main pane
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ShowPauseIcon(
+ TBool aPauseIconVisible ) // ETrue - Start Pause Blink
+ {
+ if ( iDisplayFlags & ESvgDrawPauseIndicator )
+ {
+ if (aPauseIconVisible && !iBlinker->IsActive())
+ {
+ iBlinker->Start( KSccOneSecond/2, KSccOneSecond/2,
+ TCallBack( BlinkPauseIcon, this ) );
+ }
+ if (!aPauseIconVisible && iBlinker->IsActive())
+ {
+ iBlinker->Cancel();
+ }
+ iPauseIconVisible = aPauseIconVisible;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::BlinkPauseIcon
+// Callback function of blink timer
+// -----------------------------------------------------------------------------
+//
+TInt CSVGTCustControl::BlinkPauseIcon( TAny* aPtr )
+ {
+ if ( aPtr )
+ {
+ static_cast< CSVGTCustControl* >( aPtr )->DoBlinkPauseIcon();
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DoBlinkPauseIcon
+// Function which does the actual work of toggling pause indicator
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DoBlinkPauseIcon()
+ {
+ iPauseIconVisible = !iPauseIconVisible;
+ DrawDeferred();
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::FreeIcons
+// Function which frees the icons created by CreateIcons
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::FreeIcons()
+ {
+ // Pointer Icons - owned
+ delete iPointerIcon;
+ iPointerIcon = NULL;
+
+ delete iHandIcon;
+ iHandIcon = NULL;
+
+ delete iTextIcon;
+ iTextIcon = NULL;
+
+ // Panning Indicator Icons - owned
+ delete iPanIndLeftIcon;
+ iPanIndLeftIcon = NULL;
+
+ delete iPanIndRightIcon;
+ iPanIndRightIcon = NULL;
+
+ delete iPanIndUpIcon;
+ iPanIndUpIcon = NULL;
+
+ delete iPanIndDownIcon;
+ iPanIndDownIcon = NULL;
+
+ // Pause Indicator Icons - owned
+ delete iPauseIcon;
+ iPauseIcon = NULL;
+ }
+
+// ----------------------------------------------------------------------------
+// CSVGTCustControl::LaunchWaitNoteL
+// Helper function for launching wait note.
+// ----------------------------------------------------------------------------
+//
+void CSVGTCustControl::LaunchWaitNoteL(
+ TInt aResourceId ) // Resource ID indicating
+ // string to be displayed
+ // while waiting.
+ {
+ if ( iDisplayFlags & ESvgDisplayWaitNote )
+ {
+ if( iWaitDialog )
+ {
+ delete iWaitDialog;
+ iWaitDialog = NULL;
+ }
+
+ iWaitDialog = new( ELeave ) CAknWaitDialog(
+ reinterpret_cast<CEikDialog**>(
+ &iWaitDialog ),
+ ETrue /* No visibility delay =
+ Display Wait note immediately */ );
+
+ iWaitDialog->PrepareLC( R_SVGT_WAIT_NOTE );
+
+ HBufC* lNoteTextPtr = StringLoader::LoadLC( aResourceId );
+ iWaitDialog->SetTextL( *lNoteTextPtr );
+ CleanupStack::PopAndDestroy( lNoteTextPtr );
+
+ // Launch dialog
+ iWaitDialog->RunLD();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CSVGTCustControl::DismissWaitNote
+// Helper function for dismissing wait note.
+// ----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DismissWaitNote()
+ {
+ if ( iDisplayFlags & ESvgDisplayWaitNote )
+ {
+ if( iWaitDialog )
+ {
+ TRAPD( err, iWaitDialog->ProcessFinishedL() );
+ if( err )
+ {
+ delete iWaitDialog;
+ iWaitDialog = NULL;
+ }
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CSVGTCustControl::StartProgIndTimer
+// Helper function for starting the progress indicator timer.
+// ----------------------------------------------------------------------------
+//
+void CSVGTCustControl::StartProgIndTimer( TInt aAfter ) // Time period in
+ // micro-seconds after
+ // after which timer
+ // expires
+ {
+ // Stop the progress indicator timer if exists
+ StopProgIndTimer();
+
+ TRAPD(err, iProgressBarTimer =
+ CSVGTProgressBarTimer::NewL( this,
+ iDisplayFlags & ESvgUseBackLight ) );
+
+ if ( err == KErrNone )
+ {
+ // Expire after aAfter microseconds.
+ iProgressBarTimer->After( aAfter );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CSVGTCustControl::StopProgIndTimer
+// Helper function for stopping the progress indicator timer.
+// ----------------------------------------------------------------------------
+//
+void CSVGTCustControl::StopProgIndTimer()
+ {
+ // Delete the Progress Bar timer
+ if ( iProgressBarTimer )
+ {
+ delete iProgressBarTimer;
+ iProgressBarTimer = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ProcessPlayCmd
+// This function is called to perform the necessary processing for the Play
+// command.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ProcessPlayCmd()
+ {
+ // Play Command is applicable only if animations are present
+ if ( IsAnimationPresent() )
+ {
+ if ( iAnimState != ESvgAnimPlayingState )
+ {
+ // Start the backlight timer if the content is of finite duration
+ if ( IsContentFinite() )
+ {
+ if ( ( iDisplayFlags & ESvgUseBackLight ) )
+ {
+#ifdef _DEBUG
+ iEikonEnv->InfoMsg( KSccBacklightOnStr );
+#endif
+/*
+ TRAPD( err, iBacklightTimer = CSVGTBacklightTimer::NewL() );
+ if ( err == KErrNone )
+ {
+ iBacklightTimer->After( KSccBacklightTimerStartAfter );
+ }
+*/
+ }
+ }
+
+ // Start the Progress Ind Timer if the content is of finite duration
+ if ( IsContentFinite() )
+ {
+ // Start immediately so that current count is updated.
+ StartProgIndTimer( 0 );
+ }
+
+ if ( iAnimState == ESvgAnimStoppedState )
+ {
+ // Rewind the content
+ iSvgModule->Replay();
+ }
+ else
+ {
+ // Resume playback of the content
+ iSvgModule->Resume();
+ }
+ // Set the state variable to indicate content is playing
+ iAnimState = ESvgAnimPlayingState;
+
+ // Hide the display of Pause content
+ ShowPauseIcon( EFalse );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ProcessPauseCmd
+// This function is called to perform the necessary processing for the Pause
+// command.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ProcessPauseCmd()
+ {
+ // Pause Command is applicable only if animations are present
+ if ( IsAnimationPresent() )
+ {
+ if ( iAnimState == ESvgAnimPlayingState )
+ {
+ if ( IsContentFinite() )
+ {
+ // Stop the progress Bar timer
+ StopProgIndTimer();
+ }
+ // Set the state variable.
+ iAnimState = ESvgAnimPausedState;
+ // Pause the content
+ iSvgModule->Pause();
+ // Show the pause indicator
+ ShowPauseIcon( ETrue );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ProcessStopCmd
+// This function is called to perform the necessary processing for the Stop
+// command.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ProcessStopCmd()
+ {
+ // Stop Command is applicable only if animations are present
+ if ( IsAnimationPresent() )
+ {
+ if ( IsContentFinite() )
+ {
+ // Stop the progress Bar timer
+ StopProgIndTimer();
+ }
+ // Stop playing the content
+ // Do a pause so that the content is not rewound.
+ iSvgModule->Stop();
+
+ // Reset the state variables
+ iAnimState = ESvgAnimStoppedState;
+ iProgIndTimeElap = 0;
+
+ // Reset the number of animations in progress.
+ iNumAnimInProgress = 0;
+
+ // Stop the display of the Pause indicator
+ ShowPauseIcon( EFalse );
+
+ // Redraw the screen - so that pause icon is cleaned up
+ DrawDeferred();
+ }
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::IsVoiceCallActive
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::IsVoiceCallActive()
+ {
+ TBool call;
+ TInt type = 0;
+ // Check whether a call is a voice call
+ TInt error = iSystemState.Get( KPSUidCtsyCallInformation,
+ KCTsyCallType, type );
+ if ( !error && type == EPSCTsyCallTypeCSVoice )
+ {
+ call = ETrue;
+ }
+ else
+ {
+ call = EFalse;
+ }
+
+ TInt state = 0;
+ // Check whether the voice call is active
+ error = iSystemState.Get( KPSUidCtsyCallInformation,
+ KCTsyCallState, state );
+ if ( call && !error && state == EPSCTsyCallStateConnected )
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::RemoveInfoNote
+// This function is called by the periodic timer to remove the info note that
+// is not removed because of starvation.
+// -----------------------------------------------------------------------------
+//
+TInt CSVGTCustControl::RemoveInfoNote( TAny* aPtr )
+ {
+ CSVGTCustControl* thisPtr = static_cast< CSVGTCustControl* >( aPtr );
+ if ( thisPtr && thisPtr->iInfoNote )
+ {
+ delete thisPtr->iInfoNote;
+ thisPtr->iInfoNote = NULL;
+ }
+ if ( thisPtr )
+ {
+ if ( thisPtr->iNoteRemoverTimer->IsActive() )
+ {
+ thisPtr->iNoteRemoverTimer->Cancel();
+ }
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DoRotation()
+// This function rotates the presentation in clockwise direction with given
+// angle about bitmap center
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DoRotation( const TInt aAngle )
+ {
+ const TInt xCenter = iSVGTBitMap->SizeInPixels().iWidth / 2;
+ const TInt yCenter = iSVGTBitMap->SizeInPixels().iHeight / 2;
+ const TReal32 angleInRadians = KDegreesToRadiansFactor * TReal32( aAngle );
+ iSvgModule->Rotate( angleInRadians, xCenter, yCenter );
+ // Do a Redraw
+ iSvgModule->Redraw();
+ UpdatePointer();
+ }
+
+#ifdef SVGTUICONTROL_DBG_TEXT_EDIT_SELECT_API_ENABLE
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DoTextSelectionL()
+// This function displays the existing text in the text/textArea in a
+// read-only dialog so that the user can copy text into system clipboard
+// from it.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DoTextSelectionL(
+ TDes& aText // Text Content descriptor
+ ) const
+ {
+ CAknTextQueryDialog* dlgPtr = CAknTextQueryDialog::NewL( aText );
+ dlgPtr->ExecuteLD( R_SVGT_TEXT_SELECTION_DIALOG );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DoTextEditingL()
+// This function displays the existing text in the text/textArea element which
+// is editable and returns the modified text in the same descriptor.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::DoTextEditingL(
+ TBool aIsTextElement, // Bool indicating whether element is text/textArea
+ TInt aElemHandle, // Element handle from engine
+ TDes& aText ) // Text Content descriptor
+ {
+ const TChar KOpeningBraces ='<';
+ const TChar KClosingBraces ='>';
+ TBool lTextQueryDone = EFalse;
+
+ while ( !lTextQueryDone )
+ {
+ CAknTextQueryDialog* dlgPtr = CAknTextQueryDialog::NewL( aText );
+ dlgPtr->SetPredictiveTextInputPermitted( ETrue );
+ TInt retVal = dlgPtr->ExecuteLD( R_SVGT_EDIT_TEXT_QUERY_DIALOG );
+ if (retVal)
+ {
+ if ( !iIsTextChanged )
+ {
+ // Set iIsTextChanged to indicate that text content is
+ // changed and changes need to be saved
+ iIsTextChanged = ETrue;
+ }
+
+ if( aText.Locate( KOpeningBraces ) != KErrNotFound ||
+ aText.Locate( KClosingBraces ) != KErrNotFound )
+ {
+ // display a error not with the msg that the text area
+ // cant contain < or > since it will fuddle up the xml parsing
+ DisplayInfoNoteL(R_SVGT_BRACES_FOUND_IN_TEXTAREA, ETrue );
+ }
+ else
+ {
+ // User entered valid text, go out of loop
+ lTextQueryDone = ETrue;
+ }
+ }
+ else
+ {
+ // User pressed cancel, no need to change the text
+ // return back to caller
+ return;
+ }
+ }
+
+ if ( aIsTextElement )
+ {
+ // Update the text element in the engine
+ iSvgModule->SetTextForTextElement( aElemHandle, aText );
+ }
+ else
+ {
+ // Update the textArea element in the engine
+ iSvgModule->SetTextForTextAreaElement( aElemHandle, aText );
+ }
+ // Redraw the screen to reflect the new changes
+ iSvgModule->Redraw();
+
+
+ }
+#endif // SVGTUICONTROL_DBG_TEXT_EDIT_SELECT_API_ENABLE
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::FPRCenter()
+// This function calculates the center of the four point rectangle
+// -----------------------------------------------------------------------------
+//
+TPoint CSVGTCustControl::FPRCenter(
+ const MRect* aBBoxRect // Four point rect
+ ) const
+ {
+ TPoint pt1( 0, 0 ), pt2( 0, 0 ), pt3( 0, 0 ), pt4( 0, 0 );
+ TPoint lCentre;
+
+ if ( aBBoxRect )
+ {
+ aBBoxRect->GetPoints( pt1, pt2, pt3, pt4 );
+ // Center of the rectangle is the center of the diagonal as
+ // diagonals are congruent in a rectangle
+ lCentre = TPoint( ( pt1.iX + pt3.iX ) / 2, ( pt1.iY + pt3.iY )/2 );
+ }
+ return lCentre;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::FPRIntersects()
+// This function calculates whether the FPR intersects with the rectangle
+// -----------------------------------------------------------------------------
+TBool CSVGTCustControl::FPRIntersects(
+ const MRect* aBBoxRect, // Four point rect
+ const TRect& aRect // Rectangle
+ ) const
+ {
+ TPoint pt1( 0, 0 ), pt2( 0, 0 ), pt3( 0, 0 ), pt4( 0, 0 );
+ if ( aBBoxRect )
+ {
+ aBBoxRect->GetPoints( pt1, pt2, pt3, pt4 );
+ // TODO: Need to use clipping algorithm here - to check whether line is
+ // within rectangle.
+ TInt32 maxx,maxy,minx,miny;
+
+ maxx = pt1.iX;
+ if(pt2.iX > maxx)
+ maxx = pt2.iX;
+ if(pt3.iX > maxx)
+ maxx = pt3.iX;
+ if(pt4.iX > maxx)
+ maxx = pt4.iX;
+
+ maxy = pt1.iY;
+ if(pt2.iY > maxy)
+ maxy = pt2.iY;
+ if(pt3.iY > maxy)
+ maxy = pt3.iY;
+ if(pt4.iY > maxy)
+ maxy = pt4.iY;
+
+ minx = pt1.iX;
+ if(pt2.iX < minx)
+ minx = pt2.iX;
+ if(pt3.iX < minx)
+ minx = pt3.iX;
+ if(pt4.iX < minx)
+ minx = pt4.iX;
+
+ miny = pt1.iY;
+ if(pt2.iY < miny)
+ miny = pt2.iY;
+ if(pt3.iY < miny)
+ miny = pt3.iY;
+ if(pt4.iY < miny)
+ miny = pt4.iY;
+
+
+ TPoint topleft(aRect.iTl);
+ TPoint bottomright(aRect.iBr);
+
+ if ( ( bottomright.iX < minx ) || ( maxx < topleft.iX ) ||
+ ( bottomright.iY < miny) || ( maxy < topleft.iY ) )
+ {
+ return EFalse;
+ }
+
+ return ETrue;
+ }
+ return EFalse;
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::FPR2PointArrayL()
+// This function converts a Four Point Rect into an array of points
+// -----------------------------------------------------------------------------
+void CSVGTCustControl::FPR2PointArrayL(
+ const MRect* aBBoxRect, // Four Point Rect
+ CArrayFix<TPoint>*& aArrayPtr // Array of Points
+ ) const
+ {
+ aArrayPtr = new (ELeave) CArrayFixFlat<TPoint> ( 4 );
+ CleanupStack::PushL( aArrayPtr );
+ TPoint pt1( 0, 0 ), pt2( 0, 0 ), pt3( 0, 0 ), pt4( 0, 0 );
+
+ if ( aBBoxRect )
+ {
+ aBBoxRect->GetPoints( pt1, pt2, pt3, pt4 );
+ }
+ aArrayPtr->AppendL( pt1 );
+ aArrayPtr->AppendL( pt2 );
+ aArrayPtr->AppendL( pt4 );
+ aArrayPtr->AppendL( pt3 );
+
+ CleanupStack::Pop( aArrayPtr ); // Ownership transferred to caller
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::Draw
+// Reimplements CCoeControl::Draw to draw this control's view to the screen
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::Draw(
+ const TRect& aRect ) const
+ {
+ iSVGTFrameBufContext->Clear();
+
+ if ( iSVGTBitMap && iSVGTBitMapMask )
+ {
+ iSVGTFrameBufContext->BitBltMasked( iViewerPaneRect.Rect().iTl,
+ iSVGTBitMap,
+ iViewerPaneRect.Rect(),
+ iSVGTBitMapMask,
+ ETrue );
+ }
+
+ // Draw the bounding box
+ DrawFindTextBBox( aRect );
+
+ if ( iDisplayFlags & ESvgDrawPanIndicator )
+ {
+ // Draw Panning Indicator
+ DrawPanInd();
+ }
+
+ // draw paused icon
+ if ( iPauseIconVisible )
+ {
+ iSVGTFrameBufContext->BitBltMasked( iPauseRect.Rect().iTl,
+ iPauseIcon->Bitmap(),
+ Rect(),
+ iPauseIcon->Mask(),
+ EFalse );
+ }
+
+
+ // Draw Pointer
+ if ( iIsPointerDisplayed && iDisplayFlags & ESvgDrawPointer )
+ {
+ DrawPointer();
+ }
+
+ // Get the standard graphics context
+ CWindowGc& gc = SystemGc();
+ // Blit our framebuffer bitmap to the System GC
+ gc.BitBlt( iViewerPaneRect.Rect().iTl, iSVGTFrameBufBitMap );
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ConstructFromResourceL
+// Since this control is to be displayed in a dialog, this function is
+// reimplented from CCoeControl::ConstructFromResourceL inorder to read
+// resource values from resource file.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ConstructFromResourceL(
+ TResourceReader& /*aReader*/) // Resource Reader
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::SizeChanged
+// Handles resizing of control reimplementing CCoeControl::SizeChanged.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::SizeChanged()
+ {
+ TRect myRect = Rect();
+
+ // Commented this section because,Indicators were not displaying in
+ // case of theme change
+ // if ( myRect == iCurrentLayout )
+ // {
+ // Layout has not changed, do nothing
+ // return;
+ // }
+ //
+
+ if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
+ {
+ TInt lVariety = 0; // Normal Screen
+ if ( iIsFullScreenOn )
+ {
+ lVariety = 1; // Full Screen
+ }
+
+ // Main Viewer Pane
+ iViewerPaneRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane( lVariety ) );
+
+ // Panning Indicators
+ iPanIndLeftRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g3( lVariety ) );
+ iPanIndRightRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g4( lVariety ) );
+ iPanIndUpRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g1( lVariety ) );
+ iPanIndDownRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g2( lVariety ) );
+ // Panning Indicators Rectangle for Touch Area
+ iPanIndLeftAidRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::aid_main_viewer_pane_g3( lVariety ) );
+ iPanIndRightAidRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::aid_main_viewer_pane_g4( lVariety ) );
+ iPanIndUpAidRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::aid_main_viewer_pane_g1( lVariety ) );
+ iPanIndDownAidRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::aid_main_viewer_pane_g2( lVariety ) );
+
+ // Pointers
+ iPointerRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g5( lVariety ) );
+ iHandRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g7( lVariety ) );
+ iTextRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g7( lVariety ) );
+
+ // Pause Indicator
+ iPauseRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::main_viewer_pane_g8( lVariety ) );
+
+ // Aid for display of pointer
+ // In order to draw the cursor in the correct location on
+ // the screen, the viewer needs to know the offsetX and offSetY
+ // of the cursor hotspot in the icon bitmap.
+ // Because of Scalable UI the size of the icons can be changed
+ // and this would result in the change of these co-ordinates.
+ // he viewer needs to get this information from the LAF
+ // so that viewer can draw the cursor in the correct position
+ // on the screen.
+
+ iPointerAidRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::aid_hotspot_pointer_arrow_pane() );
+ iHandAidRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::aid_hotspot_pointer_hand_pane() );
+ iTextAidRect.LayoutRect( myRect,
+ AknLayoutScalable_Apps::aid_hotspot_pointer_text2_pane() );
+ }
+ else
+ {
+ // Hardcode the values for normal resolution (172x208)
+
+ iViewerPaneRect.LayoutRect( myRect,
+ 0, 0, 0, 0, 0, myRect.Width(), myRect.Height() );
+
+ iPanIndLeftRect.LayoutRect( myRect,
+ 0, 0, ( myRect.Height() / KSccConstTwo ) - 8, 0, 0, 6, 15 );
+ iPanIndRightRect.LayoutRect( myRect,
+ 0, ( myRect.Width() - 6 ),
+ (myRect.Height() / KSccConstTwo ) - 8, 0, 0, 6, 15 );
+ iPanIndUpRect.LayoutRect( myRect,
+ 0, ( ( myRect.Width() / KSccConstTwo ) - 8 ), 0, 0, 0,
+ 15, 6 );
+ iPanIndDownRect.LayoutRect( myRect,
+ 0, ( ( myRect.Width() / KSccConstTwo ) - 8 ),
+ myRect.Height() - 6, 0, 0, 15, 6 );
+
+ iPointerRect.LayoutRect( myRect,
+ 0, 0, 0, 0, 0, 18, 24 );
+ iHandRect.LayoutRect( myRect,
+ 0, 0, 0, 0, 0, 18, 24 );
+ iTextRect.LayoutRect( myRect,
+ 0, 0, 0, 0, 0, 18, 24 );
+
+
+ iPauseRect.LayoutRect(myRect,
+ 0, 0, 0, 0, 0, 13, 13 );
+
+ iPointerAidRect.LayoutRect( myRect,
+ 0, 0, 0, 0, 0, 0, 0 );
+ iHandAidRect.LayoutRect( myRect,
+ 0, 0, 0, 0, 0, 0, 0 );
+ iTextAidRect.LayoutRect( myRect,
+ 0, 0, 0, 0, 0, 0, 0 );
+ }
+
+ // Set the size of the bitmaps
+ // No Error Handling for SetSize
+ // Pointers
+ AknIconUtils::SetSize( iPointerIcon->Bitmap(), iPointerRect.Rect().Size() );
+ AknIconUtils::SetSize( iHandIcon->Bitmap(), iHandRect.Rect().Size() );
+ AknIconUtils::SetSize( iTextIcon->Bitmap(), iTextRect.Rect().Size() );
+
+ // Panning Indicators
+
+ // Left Ind
+ AknIconUtils::SetSize( iPanIndLeftIcon->Bitmap(),
+ iPanIndLeftRect.Rect().Size() );
+
+ // Right Ind
+ AknIconUtils::SetSize( iPanIndRightIcon->Bitmap(),
+ iPanIndRightRect.Rect().Size() );
+
+ // Up Ind
+ AknIconUtils::SetSize( iPanIndUpIcon->Bitmap(),
+ iPanIndUpRect.Rect().Size() );
+
+ // Down Ind
+ AknIconUtils::SetSize( iPanIndDownIcon->Bitmap(),
+ iPanIndDownRect.Rect().Size() );
+
+ // Pause Ind
+ AknIconUtils::SetSize( iPauseIcon->Bitmap(),
+ iPauseRect.Rect().Size() );
+
+ // Recreate the framebuffer.
+ TRAPD( errSwitchMode, SwitchScreenModeL() );
+ if ( errSwitchMode != KErrNone )
+ {
+ // Let environment handle error
+ iCoeEnv->HandleError( errSwitchMode );
+ }
+
+ // Dummy mouse-move to the engine
+ iSvgModule->MouseMove( iPointerX, iPointerY );
+
+ // Save current layout so that we know if the Layout changed.
+ iCurrentLayout = myRect;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::AnimationStarted
+// Handles callback notification from SVG engine indicating Animation Started.
+// Reimplements MSvgAnimationListener::AnimationStarted.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::AnimationStarted( TBool aIsAnimationIndefinite )
+ {
+ // If the content contains any infinite animations - then the
+ // backlight behaves normally.
+ if ( !IsContentFinite() )
+ {
+ return ETrue;
+ }
+
+ if ( aIsAnimationIndefinite )
+ {
+#ifdef _DEBUG
+ iEikonEnv->InfoMsg( KSccBacklightOffStr );
+#endif
+
+ }
+ else
+ {
+ if ( IsAnimFirst() )
+ {
+#ifdef _DEBUG
+ iEikonEnv->InfoMsg( KSccBacklightOnStr );
+#endif
+ if ( ( iDisplayFlags & ESvgUseBackLight ) )
+ {
+
+ }
+ }
+ CountAnimStarted();
+ }
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::AnimationEnded
+// Handles callback notification from SVG engine indicating Animation Ended.
+// Reimplements MSvgAnimationListener::AnimationEnded.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::AnimationEnded()
+ {
+ // If the content contains any infinite animations - then the
+ // backlight behaves normally.
+ if ( !IsContentFinite() )
+ {
+ return ETrue;
+ }
+
+ CountAnimStopped();
+ if ( IsAnimLast() )
+ {
+#ifdef _DEBUG
+ iEikonEnv->InfoMsg( KSccBacklightOffStr );
+#endif
+ // All animations have ended
+
+ }
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::AnimationPaused
+// Handles callback notification from SVG engine indicating Animation Paused.
+// Reimplements MSvgAnimationListener::AnimationPaused.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::AnimationPaused()
+ {
+ // If the content contains any infinite animations - then the
+ // backlight behaves normally.
+ if ( !IsContentFinite() )
+ {
+ return ETrue;
+ }
+
+#ifdef _DEBUG
+ iEikonEnv->InfoMsg( KSccBacklightOffStr );
+#endif
+ // Animation is paused,
+ CountAnimPaused();
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::UpdateProgressBar
+// This function updates the progress bar in the navi pane. It is called back
+// by the progress bar timer.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::UpdateProgressBar()
+ {
+
+ TReal lSecElapsedRounded = 0.0;
+ TReal lSecElapsedReal = 0.0;
+ TReal lTotalTimeReal = 0.0;
+ TReal lTotalTimeRounded = 0.0;
+ TUint32 lTimeElapsed = 0;
+
+ lSecElapsedReal = (TReal)iSvgModule->MediaTime()
+ / KSccNumMSecPerSec;
+
+ lTotalTimeReal = (TReal)iDuration / KSccNumMSecPerSec;
+ if ( iProgressBarDrawImpl )
+ {
+
+
+ // Round off the Elapsed time inorder to display time accurately.
+ Math::Round( lSecElapsedRounded, lSecElapsedReal, 0 );
+
+ // Round off the Total time inorder to display time accurately.
+ Math::Round( lTotalTimeRounded, lTotalTimeReal, 0 );
+
+ lTimeElapsed = lSecElapsedRounded;
+ TRAPD( err, iProgressBarDrawImpl->DrawProgressBarL( lTimeElapsed,
+ lTotalTimeRounded ) );
+ if ( err != KErrNone )
+ {
+ // Error Case, Nothing is done now.
+ }
+
+
+ // Stop the Progress Bar timer
+ StopProgIndTimer();
+ iProgIndTimeElap = lSecElapsedReal ;
+
+ }
+
+ // Check whether end of animation is reached.
+ // 01-Feb-2008 Fix for TSW Id "CGSR-7B6DFW"
+ // Earlier this check was happening only if iProgressBarDrawImpl is there
+ // for screen saver iProgressBarDrawImpl is not there but still the animation
+ // should work for the duration set for ScreenSaver
+
+ if ( lSecElapsedReal >= (TReal)iDuration / KSccNumMSecPerSec )
+ {
+ TInt err = 0;
+ // Reset the state variables
+ iProgIndTimeElap = 0;
+
+ // Stop the animation and rewind.
+ TRAP(err, ProcessViewerCommandL( ESvgtDlgStopCommand ) );
+ if ( err != KErrNone )
+ {
+ // Error Case, Nothing is done now.
+ }
+ // If loop is on then replay the content.
+ if ( !iIsLoopOn )
+ {
+ // Animation is done, no need to continue progress bar.
+ return;
+ }
+ else
+ {
+ // Loop option enabled. Replay content.
+ TRAP( err, ProcessViewerCommandL( ESvgtDlgPlayCommand ));
+ if ( err != KErrNone )
+ {
+ // Error Case, Nothing is done now.
+ }
+ return;
+ }
+ }
+
+
+
+
+ // Restart the timer
+ StartProgIndTimer( KSccProgIndTimerYieldDur );
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::PointerInactivityTimeout()
+// This function updates the pointer display status in the navi pane.
+// It is called back by the pointer hide timer.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::PointerInactivityTimeout()
+ {
+ // UI Spec: Hide Pointer as time of inactivity has passed
+ SetPointerDisplayStatusAndRedraw( EFalse );
+
+ //Set the MSK label
+ if(iMSKImpl && !iPreviewMode )
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+
+ // Delete the inactivity timer
+ delete iInactivityTimer;
+ iInactivityTimer = NULL;
+ }
+
+#ifdef SVGTUICONTROL_DBG_TEXT_EDIT_SELECT_API_ENABLE
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::TextAreaEntered()
+// This callback is called to notify when a pointer enters a textbox element.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::TextAreaEntered( TInt aTextAreaHandle )
+ {
+ // Save the current element handle
+ iCurrentTextElementId = aTextAreaHandle;
+
+ // Indicate that it is a text area element
+ iIsCurrentTextElement = EFalse;
+
+ // check if there is a 'a' element or interactive element
+ // within which text is present
+
+ if(iAElement || iPointerDownAnimation)
+ {
+ iPointerType=ESvgPointerHand;
+ }
+ else
+ {
+ // Text symbol to indicate user can perform some action by clicking
+ iPointerType = ESvgPointerText;
+ }
+ // Remember that textArea element is entered, so that
+ // subsequent text element notifications are ignored
+ iTextAreaEntered = ETrue;
+
+ // Enable Select Menu Option
+ iIsTextSelectOn = ETrue;
+ HBufC* lStrPtr = HBufC::New( KSccMaxTextLength );
+ if ( !lStrPtr )
+ {
+ // Error while allocation, no memory
+ iCoeEnv->HandleError( KErrNoMemory );
+ return ETrue;
+ }
+ TPtr lPtr = lStrPtr->Des();
+
+ // Check whether the Text is editable
+ iSvgModule->GetTextForTextAreaElement( aTextAreaHandle,
+ iIsTextEditOn,
+ lPtr );
+
+ delete lStrPtr;
+
+ //Display MSK label Select/Edit
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::TextAreaExited()
+// This callback is called to notify when a pointer exits a textbox element.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::TextAreaExited( TInt /* aTextAreaHandle */)
+ {
+ // Reset the current element handle
+ iCurrentTextElementId = 0;
+
+ // Reset the element flag to text element
+ iIsCurrentTextElement = ETrue;
+
+ // check if there is a 'a' element or interactive element
+ // within which text is present
+ if(iAElement || iPointerDownAnimation)
+ {
+ iPointerType=ESvgPointerHand;
+ }
+ else
+ {
+ // Reset the pointer to default pointer
+ iPointerType = ESvgPointerDefault;
+ }
+ // Remember that textArea element is exitted
+ iTextAreaEntered = EFalse;
+
+ // Disable the Select and Edit menu option
+ iIsTextSelectOn = EFalse;
+ iIsTextEditOn = EFalse;
+ //Set the MSK label
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::TextAreaActivated()
+// This callback is called to notify that a text element has been activated.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::TextAreaActivated( TInt aTextAreaHandle )
+ {
+ if (iSelectCause != ESvgInvalidSelectCause )
+ {
+ // Ignore this callback as it was already processed.
+ return ETrue;
+ }
+ // Set the cause for select operation as text area so that
+ // subsequent events trigerred are ignored.
+ iSelectCause = ESvgTextAreaSelectCause;
+
+ HBufC* lStrPtr = HBufC::New( KMaxEditorTextLength );
+ if ( !lStrPtr )
+ {
+ // Error while allocation, no memory
+ iCoeEnv->HandleError( KErrNoMemory );
+ return ETrue;
+ }
+ TPtr lPtr = lStrPtr->Des();
+
+ // Check whether the Text is editable
+ iSvgModule->GetTextForTextAreaElement( aTextAreaHandle,
+ iIsTextEditOn,
+ lPtr );
+
+ if ( iIsTextEditOn && !iSvgModule->IsLoading() )
+ {
+ TRAPD( err, DoTextEditingL(
+ EFalse, // Text Area Element
+ aTextAreaHandle, // Element Handle
+ lPtr ) ); // buffer pointer
+ if ( err != KErrNone )
+ {
+ // No error handling done.
+ }
+
+ }
+ else
+ {
+ TRAPD( err,
+ DoTextSelectionL( lPtr );
+ );
+ if ( err != KErrNone )
+ {
+ // No error handling done.
+ }
+ }
+
+ delete lStrPtr;
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::TextEntered()
+// This callback is called to notify that a text element has been entered.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::TextEntered( TInt aTextHandle )
+ {
+ if ( iTextAreaEntered )
+ {
+ // Ignore all text element notifications when cursor is
+ // within a textArea element
+ return ETrue;
+ }
+
+ // Save the current element handle
+ iCurrentTextElementId = aTextHandle;
+
+ // Set the flag to indicate element type is text element
+ iIsCurrentTextElement = ETrue;
+
+ // check if there is a 'a' element or interactive element
+ // within which text is present
+
+ if(iAElement || iPointerDownAnimation)
+ {
+ iPointerType=ESvgPointerHand;
+ }
+ else
+ {
+ // Text symbol to indicate user can perform some action by clicking
+ iPointerType = ESvgPointerText;
+ }
+ // Enable Select Menu Option
+ iIsTextSelectOn = ETrue;
+
+ HBufC* lStrPtr = HBufC::New( KSccMaxTextLength );
+
+ if ( !lStrPtr )
+ {
+ // Error while allocation, no memory
+ iCoeEnv->HandleError( KErrNoMemory );
+ return ETrue;
+ }
+
+ TPtr lPtr = lStrPtr->Des();
+
+ // Check whether the Text is editable
+ iSvgModule->GetTextForTextElement( aTextHandle,
+ iIsTextEditOn,
+ lPtr );
+
+ delete lStrPtr;
+ // Display MSK label Select/Edit
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::TextExited()
+// This callback is called to notify that a text element has been exited.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::TextExited( TInt /* aTextHandle */ )
+ {
+ if ( iTextAreaEntered )
+ {
+ // Ignore all text element notifications when cursor is
+ // within a textArea element
+ return ETrue;
+ }
+
+ // Reset the current element handle
+ iCurrentTextElementId = 0;
+
+ // check if there is a 'a' element or interactive element
+ // within which text is present
+ if(iAElement || iPointerDownAnimation)
+ {
+ iPointerType=ESvgPointerHand;
+ }
+ else
+ {
+ // Reset the pointer to default
+ iPointerType = ESvgPointerDefault;
+ }
+ // Disable the Select and Edit menu option
+ iIsTextSelectOn = EFalse;
+ iIsTextEditOn = EFalse;
+
+ //Set the MSK label
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::TextActivated()
+// This callback is called to notify that a text element has been activated.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::TextActivated( TInt aTextHandle )
+ {
+ if (iSelectCause != ESvgInvalidSelectCause )
+ {
+ // Ignore this callback as it was already processed.
+ return ETrue;
+ }
+ // Set the cause for select operation as text so that
+ // subsequent events trigerred are ignored.
+ iSelectCause = ESvgTextSelectCause;
+ HBufC* lStrPtr = HBufC::New( KMaxEditorTextLength );
+ if ( !lStrPtr )
+ {
+ // Error while allocation, no memory
+ iCoeEnv->HandleError( KErrNoMemory );
+ return ETrue;
+ }
+ TPtr lPtr = lStrPtr->Des();
+
+ // Check whether the Text is editable
+ iSvgModule->GetTextForTextElement( aTextHandle,
+ iIsTextEditOn,
+ lPtr );
+
+ if ( iIsTextEditOn && !iSvgModule->IsLoading())
+ {
+ TRAPD( err,
+ DoTextEditingL( ETrue, // Text Element
+ aTextHandle , // Element Handle
+ lPtr ); // Buffer Pointer
+ );
+ if ( err != KErrNone )
+ {
+ // No Error handling done.
+ }
+ }
+ else
+ {
+ TRAPD( err,
+ DoTextSelectionL( lPtr );
+ );
+ if ( err != KErrNone )
+ {
+ // No Error handling done.
+ }
+ }
+ delete lStrPtr;
+ return ETrue;
+ }
+
+#endif // SVGTUICONTROL_DBG_TEXT_EDIT_SELECT_API_ENABLE
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::InteractiveElementEntered()
+// This callback is called to notify that an interactive element has been entered.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::InteractiveElementEntered(TPtrC /*aElementIdPtr*/, TUint16 aInteractonTypeList )
+ {
+
+ if( (aInteractonTypeList & ESvgInteractiveEventClick )||
+ (aInteractonTypeList & ESvgInteractiveEventMousedown ) ||
+ (aInteractonTypeList & ESvgInteractiveEventMouseup ) )
+ {
+
+ iPointerType = ESvgPointerHand;
+
+ // Increment the count maintained for overlapping interactive elements
+ // with pointer-down events so that the iPointertype is set properly
+ iInteractiveElementEnteredCnt++;
+
+ // Need to set flag so that when the element is within
+ // textarea or text
+ iPointerDownAnimation=ETrue;
+
+ // Sets the MSK label
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+ }
+ return ETrue;
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::InteractiveElementExited()
+// This callback is called to notify that an interactive element has been exited.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::InteractiveElementExited(TPtrC /*aElementIdPtr*/)
+ {
+
+ // The count of interactive elements with pointer down events registered
+ // is decremented
+ if(iPointerDownAnimation)
+ {
+ iInteractiveElementEnteredCnt--;
+ }
+
+
+ if(!iInteractiveElementEnteredCnt)
+ {
+ iPointerType = ESvgPointerDefault;
+
+ iPointerDownAnimation=EFalse;
+ //Set the MSK label
+ if(iMSKImpl && !iPreviewMode)
+ {
+ TRAP_IGNORE(SetMSKLabelL());
+ }
+ }
+
+ return ETrue;
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ReportAllElements
+// Implements MSvgLoadingListener::ReportAllElements.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::ReportAllElements()
+ {
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::WillAssignImageData
+// Implements MSvgLoadingListener::WillAssignImageData.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::WillAssignImageData()
+ {
+ // Return ETrue to indicate that AssignImageData will be used to
+ // asynchronously load the image in the engine
+ if(iProgressiveRendering)
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ImageDataReference
+// Implements MSvgLoadingListener::ImageDataReference.
+// -----------------------------------------------------------------------------
+//
+void CSVGTCustControl::ImageDataReference( const TDesC& aUri )
+ {
+ CSvgtEvent* event = NULL;
+ if ( aUri.Length() > KEmbededImageTagLength &&
+ aUri.Left(KEmbededImageTagLength) == KDataTagName )
+ {
+ event = new CSvgtEventEmbededImage(aUri);
+ }
+ else
+ {
+ event = new CSvgtEventFetchImage(aUri);
+ }
+ if ( iEventHandlerAO )
+ {
+ iEventHandlerAO->AddEventToList( event );
+ iEventHandlerAO->MakeRequestComplete( KErrNone );
+ }
+ }
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ReportAllElements
+// Implements MSvgLoadingListener::DocumentStart.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::DocumentStart()
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::DocumentEnd
+// Implements MSvgLoadingListener::DocumentEnd.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::DocumentEnd()
+ {
+ if(iProgressiveRendering)
+ {
+ iEventHandlerAO->SetDocumentComplete();
+ iEventHandlerAO->AddRedrawEventToList( ETrue );
+ iEventHandlerAO->MakeRequestComplete( KErrNone );
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ElementStart
+// Implements MSvgLoadingListener::ElementStart.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::ElementStart( const TDesC& aTagName,
+ MSvgAttributeList& /*aAttributeList*/)
+ {
+ if ( iProgressiveRendering && aTagName == KSvgTagName && iEngineInitialized
+ == EFalse )
+ {
+ iEngineInitialized = ETrue;
+ iSvgModule->AddListener( static_cast < MSvgViewPortListener*>(this), ESvgViewPortListener );
+ iSvgModule->InitializeEngine( NULL, EFalse);
+ }
+ else if ( iProgressiveRendering )
+ {
+// iEventHandlerAO->RequestRedraw();
+// User::After( 10 * 1000 );
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ElementEnd
+// Implements MSvgLoadingListener::ElementEnd.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::ElementEnd( const TDesC& /* aTagName */)
+ {
+ if(iProgressiveRendering)
+ {
+ iEventHandlerAO->AddRedrawEventToList();
+ iEventHandlerAO->MakeRequestComplete( KErrNone );
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ExternalDataRequested
+// Implements MSvgLoadingListener::ExternalDataRequested.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::ExternalDataRequested( const TDesC& /* aUri */)
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ExternalDataReceived
+// Implements MSvgLoadingListener::ExternalDataReceived.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::ExternalDataReceived( const TDesC& /* aUri */)
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::ExternalDataRequestFailed
+// Implements MSvgLoadingListener::ExternalDataRequestFailed.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::ExternalDataRequestFailed( const TDesC& /* aUri */)
+ {
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CSVGTCustControl::UnsupportedElement
+// Implements MSvgLoadingListener::UnsupportedElement.
+// -----------------------------------------------------------------------------
+//
+TBool CSVGTCustControl::UnsupportedElement( const TDesC& /* aTagName */,
+ MSvgAttributeList& /* aAttributeList*/ )
+ {
+ return EFalse;
+ }
+void CSVGTCustControl::ImagesLoaded(TInt aError)
+ {
+ if(aError != KErrNone)
+ {
+ if(!iIsWaitNoteDisplayed)
+ {
+ iIsWaitNoteDisplayed = ETrue;
+ TRAP_IGNORE( DisplayInfoNoteL( R_SVGT_FILE_NOT_COMPLETE, ETrue ) );
+ }
+ }
+ }
+
+void CSVGTCustControl::DoExitFromDialogL()
+ {
+ if ( iExitObserver )
+ {
+ iExitObserver->HandleApplicationExitL(EEikCmdExit);
+ }
+ }
+
+void CSVGTCustControl::AssignImageData( const TDesC& aUri, HBufC8* aData )
+ {
+ if(aData)
+ {
+ iSvgModule->AssignImageData(aUri, aData);
+ // Do a redraw to reflect the image loaded
+ iSvgModule->Redraw();
+ }
+ else
+ {
+ // Show information note
+ if(!iIsWaitNoteDisplayed)
+ {
+ iIsWaitNoteDisplayed = ETrue;
+ TRAP_IGNORE( DisplayInfoNoteL( R_SVGT_FILE_NOT_COMPLETE, ETrue ) );
+ }
+ }
+ }
+TInt CSVGTCustControl::DoHandleLoadingThreadError()
+ {
+ TInt lErrCode = KErrNone;
+ // An error note "Unable to open file" for eg. should be displayed
+ // in the following conditions
+ // a. Error Object contains NULL. This means possible out of memory
+ // when create error object.
+ // b. Error Object has an error which is not a warning - This
+ // indicates unrecoverable error in parsing -
+ // invalid/corrupted content
+ if ( (! iLoadingThreadError ) || ( iLoadingThreadError &&
+ iLoadingThreadError->HasError() &&
+ !iLoadingThreadError->IsWarning() ) )
+ {
+ TRAP_IGNORE( DisplayInfoNoteL( R_SVGT_FILE_OPEN_FAILURE, ETrue ) );
+
+ // Exiting from the dialog
+ if ( iLoadingThreadError )
+ {
+ lErrCode = iLoadingThreadError->SystemErrorCode();
+ if ( lErrCode == KErrNone )
+ {
+ lErrCode = KErrGeneral;
+ }
+ }
+ else
+ {
+ lErrCode = KErrNoMemory;
+ }
+ }
+
+ if ( lErrCode == KErrNone )
+ {
+// Placed into the DoPostLoadFuncL
+ }
+
+ return lErrCode;
+ }
+
+CSVGTCustControl::TFileType
+ CSVGTCustControl::ImageFileType( const TDesC& aUri ) const
+ {
+
+ TUriParser UriParser;
+
+ TBuf<KMaxFileName> localUri;
+ // url starts with www so append http://
+ if ( !aUri.Left( KSchemaLength ).Compare( KWww ) )
+ {
+ localUri.Append( KHttp );
+ localUri.Append( aUri );
+ if ( UriParser.Parse( localUri ) )
+ {
+ return ( EInvalidFilePath );
+ }
+ }
+ else
+ {
+ if ( UriParser.Parse( aUri ) )
+ {
+ return ( EInvalidFilePath );
+ }
+ }
+
+ if ( UriParser.IsPresent( EUriHost ) )
+ {
+ // Extract the Path, filename and extension from the uri
+ TFileName filename = UriParser.Extract( EUriPath );
+ TParsePtrC fileParser( filename );
+
+ if ( fileParser.NamePresent() && fileParser.ExtPresent() )
+ {
+ if ( fileParser.Ext().Compare( KJpg ) == 0 ||
+ fileParser.Ext().Compare( KJpeg ) == 0 ||
+ fileParser.Ext().Compare( KBmp ) == 0 ||
+ fileParser.Ext().Compare( KPng ) == 0 ||
+ fileParser.Ext().Compare( KSvg ) == 0 ||
+ fileParser.Ext().Compare( KSvgz ) == 0 )
+ {
+ // file name and ext present and
+ // it is amy of the supported image types
+ return ERemoteImageFile;
+ }
+ else
+ {
+ //file Extension present but not a supported image ext,
+ //may be some html file
+ return ENotAnImageFile;
+ }
+ }
+ else
+ {
+ //Should be a domain name so return ENotAnImageFile
+ return ENotAnImageFile;
+ }
+ }
+ else
+ {
+ return ELocalImageFile;
+ }
+ }
+
+/**
+* CSVGTCustControl::ResetBacklightTime
+* Resets the backlight time for finite content
+*/
+void CSVGTCustControl::ResetBacklightTime()
+ {
+ TTimeIntervalSeconds secondCount;
+ TTime currTime;
+ currTime.HomeTime();
+ currTime.SecondsFrom(iPreviousBackLightTimeStamp, secondCount);
+
+ if ( iDisplayFlags & ESvgUseBackLight )
+ {
+ if(secondCount.Int() >= KBackLightTimeInterval)
+ {
+ User::ResetInactivityTime();
+ iPreviousBackLightTimeStamp = currTime;
+ }
+ }
+ }
+
+void CSVGTCustControl::StopEventHandler()
+ {
+ if ( iEventHandlerAO )
+ {
+ iEventHandlerAO->Cancel();
+ }
+ }
+
+void CSVGTCustControl::SetThreadRunning(TBool aIsRunning)
+ {
+ iIsThreadRunning = aIsRunning;
+ }
+
+TBool CSVGTCustControl::IsThreadRunning() const
+ {
+ return iIsThreadRunning;
+ }
+
+void CSVGTCustControl::PerformEngineRedraw()
+ {
+ iSvgModule->Redraw();
+ }
+
+//TOUCH SUPPORT START
+#ifdef RD_SCALABLE_UI_V2
+void CSVGTCustControl::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+ {
+ if(aPointerEvent.iType == TPointerEvent::EButton1Down)
+ {
+ if(iPntrObserver && iPntrObserver->HandleCustControlPointerEventL(aPointerEvent))
+ return;
+
+ // Reset the select cause
+ iSelectCause = ESvgInvalidSelectCause;
+
+ TIndicatorType indicatorType =
+ ActiveIndicator(aPointerEvent.iPosition);
+ if (indicatorType != ENoIndicator)
+ {
+ if(indicatorType == EPauseIndicator)
+ {
+ ProcessPlayCmd();
+ }
+ else
+ {
+ PanPresentation( indicatorType );
+ }
+ }
+
+ // Get the size of the content
+ TSize svgSize = iSvgModule->Size();
+ TInt rgnw = svgSize.iWidth;
+ TInt rgnh = svgSize.iHeight;
+ if ( aPointerEvent.iPosition.iX >= rgnw || aPointerEvent.iPosition.iY >= rgnh )
+ return;
+ iPointerX = aPointerEvent.iPosition.iX;
+ iPointerY = aPointerEvent.iPosition.iY;
+ iSvgModule->MouseDown( iPointerX, iPointerY );
+
+ SetPointerDisplayStatusAndRedraw(ETrue);
+ UpdatePointer();
+
+ Window().RequestPointerRepeatEvent(KInitRepeatInterval, ActiveIndicatorRect(indicatorType));
+ }
+ else if(aPointerEvent.iType == TPointerEvent::EButtonRepeat)
+ {
+ UpdatePointer();
+ TIndicatorType indicatorType =
+ ActiveIndicator(aPointerEvent.iPosition);
+ PanPresentation( indicatorType );
+ Window().RequestPointerRepeatEvent(KInitRepeatInterval, ActiveIndicatorRect(indicatorType));
+ }
+ else if(aPointerEvent.iType == TPointerEvent::EButton1Up)
+ {
+ Window().CancelPointerRepeatEventRequest();
+ // UI Spec: Pointer should be hidden after 15 sec of
+ // user inactivity
+ if ( iInactivityTimer )
+ {
+ // Should not be the case!
+ delete iInactivityTimer;
+ iInactivityTimer = NULL;
+ }
+ iInactivityTimer = CSVGTPointerHideTimer::NewL( this );
+ iInactivityTimer->After( KSccPointerHideTimerStartAfter );
+
+ TIndicatorType indicatorType =
+ ActiveIndicator(aPointerEvent.iPosition);
+ if (indicatorType == ENoIndicator)
+ {
+ iSvgModule->MouseUp( iPointerX, iPointerY );
+ }
+ }
+ else if(aPointerEvent.iType == TPointerEvent::EDrag)
+ {
+ // Get the size of the content
+ TSize svgSize = iSvgModule->Size();
+ TInt rgnw = svgSize.iWidth;
+ TInt rgnh = svgSize.iHeight;
+ if ( aPointerEvent.iPosition.iX >= rgnw || aPointerEvent.iPosition.iY >= rgnh )
+ return;
+ iPointerX = aPointerEvent.iPosition.iX;
+ iPointerY = aPointerEvent.iPosition.iY;
+
+ iSvgModule->MouseMove( iPointerX, iPointerY );
+ SetPointerDisplayStatusAndRedraw(ETrue);
+ UpdatePointer();
+ }
+ }
+
+void CSVGTCustControl::SetContainerWindowL(const CCoeControl &aContainer)
+ {
+ CCoeControl::SetContainerWindowL(aContainer);
+ EnableDragEvents();
+ }
+
+void CSVGTCustControl::PanPresentation(
+ const CSVGTCustControl::TIndicatorType aIndicatorType )
+ {
+ switch( aIndicatorType )
+ {
+ case ELeftIndicator:
+ {
+ iSvgModule->Pan( KSccPanNumPixelsX, KSccConstZero );
+ break;
+ }
+ case ERightIndicator:
+ {
+ iSvgModule->Pan( -KSccPanNumPixelsX, KSccConstZero );
+ break;
+ }
+ case EUpIndicator:
+ {
+ iSvgModule->Pan( KSccConstZero, KSccPanNumPixelsY );
+ break;
+ }
+ case EDownIndicator:
+ {
+ iSvgModule->Pan( KSccConstZero, -KSccPanNumPixelsY );
+ break;
+ }
+ }
+ iSvgModule->Redraw();
+ DrawDeferred();
+ }
+
+CSVGTCustControl::TIndicatorType CSVGTCustControl::ActiveIndicator(
+ const TPoint aPosition ) const
+ {
+ TIndicatorType indicatorType = ENoIndicator;
+
+ if( iPanIndLeftAidRect.Rect().Contains( aPosition ) && iPanLt)
+ {
+ indicatorType = ELeftIndicator;
+ }
+ else if( iPanIndRightAidRect.Rect().Contains( aPosition ) && iPanRt)
+ {
+ indicatorType = ERightIndicator;
+ }
+ else if( iPanIndUpAidRect.Rect().Contains( aPosition ) && iPanUp)
+ {
+ indicatorType = EUpIndicator;
+ }
+ else if( iPanIndDownAidRect.Rect().Contains( aPosition ) && iPanDn)
+ {
+ indicatorType = EDownIndicator;
+ }
+
+ return indicatorType ;
+ }
+
+TRect CSVGTCustControl::ActiveIndicatorRect( TIndicatorType aIndicator) const
+ {
+ TRect indicatorRect(0,0,0,0);
+
+ switch(aIndicator)
+ {
+ case ELeftIndicator:
+ {
+ indicatorRect = iPanIndLeftAidRect.Rect();
+ }
+ break;
+ case ERightIndicator:
+ {
+ indicatorRect = iPanIndRightAidRect.Rect();
+ }
+ break;
+ case EUpIndicator:
+ {
+ indicatorRect = iPanIndUpAidRect.Rect();
+ }
+ break;
+ case EDownIndicator:
+ {
+ indicatorRect = iPanIndDownAidRect.Rect();
+ }
+ break;
+ }
+
+ return indicatorRect;
+ }
+
+#endif //RD_SCALABLE_UI_V2
+
+#ifdef RD_SVGT_AUDIO_SUPPORT
+void CSVGTCustControl::HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType)
+ {
+ if((aControl == iVolumePopup) && ( aEventType == MCoeControlObserver::EEventStateChanged))
+ {
+#ifdef _DEBUG
+ TName msg;
+ msg.Format(_L("Volume level: %d"), iVolumePopup->Value());
+ iEikonEnv->InfoMsgWithAlignment(TGulAlignment(EHCenterVCenter), msg);
+#endif
+ // Save the current volume as previous volume before setting
+ // new volume level
+ iPrevVolume=iVolumeLevel;
+ iVolumeLevel = iVolumePopup->Value();
+ SetPresentationVolume( iVolumeLevel );
+ }
+ }
+
+void CSVGTCustControl::SetPresentationVolume( TInt aVolumeLevel )
+ {
+ TInt volumeInPercent = aVolumeLevel * 10;
+
+ if(volumeInPercent)
+ {
+
+ iSvgModule->SetAudioVolume(volumeInPercent);
+ if(iIsVolumeMuted)
+ {
+ iIsVolumeMuted = EFalse;
+ if(iAudioMuteListener)
+ {
+ iAudioMuteListener->VolumeMuted(EFalse);
+ }
+
+ }
+ }
+
+ else
+ {
+ iSvgModule->MuteAudioVolume();
+ if(!iIsVolumeMuted)
+ {
+ iIsVolumeMuted = ETrue;
+ if(iAudioMuteListener)
+ {
+ iAudioMuteListener->VolumeMuted(ETrue);
+ }
+
+ }
+
+ }
+
+ }
+
+TInt CSVGTCustControl::PresentationVolume() const
+ {
+ return iVolumeLevel;
+ }
+
+void CSVGTCustControl::MrccatoCommand(TRemConCoreApiOperationId aOperationId,
+ TRemConCoreApiButtonAction aButtonAct )
+ {
+ switch(aOperationId)
+ {
+ case ERemConCoreApiVolumeUp:
+ {
+ switch (aButtonAct)
+ {
+ case ERemConCoreApiButtonPress:
+ {
+ break;
+ }
+ case ERemConCoreApiButtonRelease:
+ {
+ break;
+ }
+ case ERemConCoreApiButtonClick:
+ {
+ FilterAndSendCommand(EStdKeyIncVolume);
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ break;
+ }
+ case ERemConCoreApiVolumeDown:
+ {
+ switch (aButtonAct)
+ {
+ case ERemConCoreApiButtonPress:
+ {
+ break;
+ }
+ case ERemConCoreApiButtonRelease:
+ {
+ break;
+ }
+ case ERemConCoreApiButtonClick:
+ {
+ FilterAndSendCommand(EStdKeyDecVolume);
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+void CSVGTCustControl::FilterAndSendCommand(TInt aCommandId)
+ {
+ TInt currentVolume = iVolumeLevel;
+
+ if(!iIsForeground)
+ {
+ return;
+ }
+
+ switch(aCommandId)
+ {
+ case EStdKeyIncVolume:
+ currentVolume=(currentVolume< KMaxVolume)? ++currentVolume : KMaxVolume;
+ break;
+ case EStdKeyDecVolume:
+ currentVolume=(currentVolume> KMinVolume)? --currentVolume : KMinVolume;
+ break;
+ default:
+ break;
+ }
+
+ iVolumePopup->SetValue( currentVolume );
+ TRAP_IGNORE(iVolumePopup->ShowVolumePopupL());
+ iVolumePopup->DrawNow();
+
+ TRAP_IGNORE(HandleControlEventL( iVolumePopup, MCoeControlObserver::EEventStateChanged ));
+}
+
+EXPORT_C void CSVGTCustControl::AddListener(MSvgCustControlListener *aListener, TCustControlListener aType)
+ {
+ if(aType == EAudioListener)
+ {
+ iAudioMuteListener = (MSvgAudioMuteListener *)aListener;
+ }
+
+ }
+TInt CSVGTCustControl::GetPrevVolume() const
+ {
+ return iPrevVolume;
+ }
+#endif //RD_SVGT_AUDIO_SUPPORT
+
+//TOUCH SUPPORT END
+
+// End of File