/*
* 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