--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtviewer/SvgtViewerPlugin/UIControlSrc/SvgtController.cpp Wed Sep 01 12:29:59 2010 +0100
@@ -0,0 +1,269 @@
+/*
+* Copyright (c) 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 active objects used for progressive
+* rendering
+*
+*/
+
+
+#include "SvgtController.h"
+#include <eikenv.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <eikspane.h>
+#include "SVGTCustControl.h"
+
+const TInt KAnimationInerval = 100000;
+
+_LIT(KDot, ". ");
+
+/*
+*************************************************************************************
+* ThreadController Implemetation
+*
+***************************************************************************************
+*/
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::NewL
+// Two phase constructor
+// -----------------------------------------------------------------------------
+//
+CSvgtThreadController* CSvgtThreadController::NewL(CSVGTCustControl* aCustControl)
+ {
+ CSvgtThreadController* self = CSvgtThreadController::NewLC(aCustControl);
+ CleanupStack::Pop(self); //self
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::NewLC
+// Two phase constructor
+// -----------------------------------------------------------------------------
+//
+CSvgtThreadController* CSvgtThreadController::NewLC(CSVGTCustControl* aCustControl)
+ {
+ CSvgtThreadController* self = new (ELeave) CSvgtThreadController(aCustControl);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::~CSvgtThreadController
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSvgtThreadController::~CSvgtThreadController()
+ {
+ Cancel();
+ if(iLoadAnimator)
+ {
+ iLoadAnimator->Cancel();
+ }
+
+ delete iLoadAnimator;
+ ClearNaviPaneDecorator();
+ // Reset eikon env pointer
+ iEikEnv = NULL;
+ // Reset the custom control pointer
+ iCustControl = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::DoCancel
+// Cancels all the pending request
+// -----------------------------------------------------------------------------
+//
+void CSvgtThreadController::DoCancel()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::RunL
+// Handles an active object's request completion event.
+// -----------------------------------------------------------------------------
+//
+void CSvgtThreadController::RunL()
+ {
+ iCustControl->SetThreadRunning(EFalse);
+ iLoadAnimator->Cancel();
+ iCount = KAnimationLength;
+ DoLoadAnimationL();
+ TInt lLoadError = iCustControl->DoHandleLoadingThreadError();
+ TInt lPostLoadError = KErrNone;
+
+ // Stop displaying progressive-render indicator
+ ClearNaviPaneDecorator();
+ //iCustControl->StopEventHandler();
+ if( lLoadError == KErrNone )
+ {
+ // No Load error, Do the post load functionality
+ TRAP( lPostLoadError, iCustControl->DoPostLoadFuncL() );
+ }
+
+ // If there were any errors then ask parent to exit
+ if ( ( lLoadError!= KErrNone ) || ( lPostLoadError != KErrNone ) )
+ {
+ // Error has occurred, commence cleanup
+ // Request Observer to Exit
+ iCustControl->DoExitFromDialogL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::CSvgtThreadController
+// Parameterized constructor
+// -----------------------------------------------------------------------------
+//
+CSvgtThreadController::CSvgtThreadController(CSVGTCustControl* aCustControl):
+ CActive(EPriorityStandard),
+ iCustControl(aCustControl)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::ConstructL
+// Two phase constructor
+// -----------------------------------------------------------------------------
+//
+void CSvgtThreadController::ConstructL()
+ {
+ iLoadAnimator = CPeriodic::NewL(CActive::EPriorityStandard);
+
+ // Store the environment pointer to avoid slow static access
+ iEikEnv = CEikonEnv::Static();
+ User::LeaveIfNull( iEikEnv );
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::IssueThreadMonitorRequest
+// Makes it active to get notify on thread death
+// -----------------------------------------------------------------------------
+//
+void CSvgtThreadController::IssueThreadMonitorRequest(const RThread& aThread)
+ {
+ aThread.Logon(iStatus);
+ iMainThread = aThread.Id();
+ SetActive();
+
+ TCallBack callBack(LoadAnimationCallBack, this);
+ iCount = 0;
+ iLoadAnimator->Start(0, KAnimationInerval, callBack);
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::StopThreadExecution
+// Stops the thread execution
+// -----------------------------------------------------------------------------
+//
+void CSvgtThreadController::StopThreadExecution(const RThread& aThread)
+ {
+ aThread.LogonCancel(iStatus);
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::DoLoadAnimationL
+// This fuction does the loading animation
+// -----------------------------------------------------------------------------
+//
+void CSvgtThreadController::DoLoadAnimationL()
+ {
+ CEikStatusPane* sp = iEikEnv->AppUiFactory()->StatusPane();
+ CAknNavigationControlContainer* np =
+ static_cast<CAknNavigationControlContainer*>
+ ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+
+ if(iCount >= KAnimationLength)
+ {
+ iCount = 0;
+ iAnimationText.Zero();
+ }
+ else
+ {
+ iCount++;
+ iAnimationText.Append(KDot);
+ }
+
+ CAknNavigationDecorator* lOldNaviDecorator = iNaviDecorator;
+ iNaviDecorator = NULL;
+ if ( lOldNaviDecorator )
+ {
+ delete lOldNaviDecorator ;
+ lOldNaviDecorator = NULL;
+ }
+
+ // Clear the old Navi-Pane Decorator
+ // Create the navi pane label
+ iNaviDecorator = np->CreateNavigationLabelL( iAnimationText );
+
+ // Save the old Navi Decorator so that it can be deleted after
+ // creating the new navi decorator
+ // Push the new Navi decorator in the Navigation Pane
+ np->PushL( *iNaviDecorator );
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::LoadAnimationCallBack
+// Callback fuction for loading animation
+// -----------------------------------------------------------------------------
+//
+TInt CSvgtThreadController::LoadAnimationCallBack(TAny* aThreadController)
+ {
+ CSvgtThreadController* threadController =
+ static_cast< CSvgtThreadController* >( aThreadController );
+ if ( threadController )
+ {
+ TRAPD( ignore, threadController->DoLoadAnimationL() );
+ if ( ignore != KErrNone )
+ {
+ // No error handling done.
+ }
+ }
+ return 0;
+ }
+
+// -----------------------------------------------------------------------------
+// CSvgtThreadController::ClearNaviPaneDecorator
+// Clears the navi pane indicator when the loading animation gets over
+// -----------------------------------------------------------------------------
+//
+void CSvgtThreadController::ClearNaviPaneDecorator()
+ {
+ // Clear the Navi-Pane Decorator
+ if ( iNaviDecorator )
+ {
+ // Restore the old navi-pane
+ CEikStatusPane* sp = iEikEnv->AppUiFactory()->StatusPane();
+
+ CAknNavigationControlContainer* np = NULL;
+ TRAPD( errGetNaviControl,
+ np = static_cast< CAknNavigationControlContainer* >
+ ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ) );
+ if ( errGetNaviControl == KErrNone && np )
+ {
+ TRAPD( errPushDefNaviControl,
+ np->PushDefaultL ()); // Set default.
+ if ( errPushDefNaviControl != KErrNone )
+ {
+ // No error handling here.
+ }
+ }
+ delete iNaviDecorator;
+ iNaviDecorator = NULL;
+ }
+ }
+// End of file
+