diff -r 71da52165949 -r ce1c7ad1f18b photosgallery/viewframework/uiutilities/src/glxprogressindicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/photosgallery/viewframework/uiutilities/src/glxprogressindicator.cpp Mon Mar 15 12:40:30 2010 +0200 @@ -0,0 +1,282 @@ +/* +* Copyright (c) 2008-2009 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: Progressdialog +* +*/ +#include "glxprogressindicator.h" +#include +#include +#include +#include +#include +#include +#include +#include "glxuiutility.h" +const TInt KPeriodicStartDelay = 500000; + + +// --------------------------------------------------------- +// CGlxProgressIndicator::NewL +// --------------------------------------------------------- +// +EXPORT_C CGlxProgressIndicator* CGlxProgressIndicator::NewL + (MDialogDismisedObserver& aGlxGridViewNotifyObserver) + { + CGlxProgressIndicator* self = CGlxProgressIndicator::NewLC + (aGlxGridViewNotifyObserver); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------- +// CGlxProgressIndicator::NewLC +// --------------------------------------------------------- +// +CGlxProgressIndicator* CGlxProgressIndicator::NewLC + (MDialogDismisedObserver& aGlxGridViewNotifyObserver) + { + + CGlxProgressIndicator* self = new(ELeave) + CGlxProgressIndicator(aGlxGridViewNotifyObserver); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------- +// CGlxProgressIndicator::CGlxProgressIndicator +// --------------------------------------------------------- +// +CGlxProgressIndicator::CGlxProgressIndicator + (MDialogDismisedObserver& aGlxGridViewNotifyObserver) + :iGlxGridViewNotifyObserver(aGlxGridViewNotifyObserver) + { + } + +// --------------------------------------------------------- +// CGlxProgressIndicator::~CGlxProgressIndicator +// --------------------------------------------------------- +// +CGlxProgressIndicator::~CGlxProgressIndicator() + { + if (iProgressbarTicker && iProgressbarTicker->IsActive()) + { + iProgressbarTicker->Cancel(); + delete iProgressbarTicker; + } + if(iProgressDialog) + { + iProgressDialog->ProcessFinishedL(); + } + + // Stop force generation of thumbnails when progress dialog is dismissed + CGlxUiUtility* uiUtility = CGlxUiUtility::UtilityL(); + CleanupClosePushL(*uiUtility); + if ( uiUtility ) + { + uiUtility->StopTNMDaemonL(); + } + CleanupStack::PopAndDestroy(uiUtility); + } + +// --------------------------------------------------------- +// CGlxProgressIndicator::ConstructL +// --------------------------------------------------------- +// +void CGlxProgressIndicator::ConstructL() + { + CGlxUiUtility* uiUtility = CGlxUiUtility::UtilityL(); + CleanupClosePushL(*uiUtility); + TRAPD(err,uiUtility->StartTNMDaemonL()); + + if(err != KErrNone) + { + GLX_LOG_INFO1("CGlxProgressIndicator RProperty::Set errorcode %d",err); + //need to check what to do in fail cases + } + if(!iProgressbarTicker) + { + iProgressbarTicker = CPeriodic::NewL(CActive::EPriorityStandard); + } + + iFinalCount = uiUtility->GetItemsLeftCountL(); + GLX_LOG_INFO1("final count in viewactivate = %d",iFinalCount); + + + if(iFinalCount) + { + StartProgressNoteL(iFinalCount,ETrue); + if ( !iProgressbarTicker->IsActive()) + { + iProgressbarTicker->Start( KPeriodicStartDelay, KPeriodicStartDelay, TCallBack( + &PeriodicCallbackL, static_cast( this ) ) ); + } + } + else + { + GLX_LOG_INFO("Reset the RProperty flag to EFalse"); + uiUtility->StopTNMDaemonL(); + } + CleanupStack::PopAndDestroy(uiUtility); + } + + +// ----------------------------------------------------------------------------- +// Callback from periodic timer +// ----------------------------------------------------------------------------- +// +TInt CGlxProgressIndicator::PeriodicCallbackL(TAny* aPtr ) + { + TRACER("CGlxProgressIndicator::PeriodicCallbackL"); + static_cast< CGlxProgressIndicator* >( aPtr )->DisplayProgressBarL(); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// Callback from periodic timer-- non static +// ----------------------------------------------------------------------------- +// +inline void CGlxProgressIndicator::DisplayProgressBarL() + { + TRACER("CGlxProgressIndicator::DisplayProgressBarL"); + CGlxUiUtility* uiUtility = CGlxUiUtility::UtilityL(); + CleanupClosePushL(*uiUtility); + TInt itemsLeft = uiUtility->GetItemsLeftCountL(); + CleanupStack::PopAndDestroy(uiUtility); + GLX_LOG_INFO1("itemsLeft in DisplayProgressBarL = %d",iFinalCount); + if(itemsLeft) + { + UpdateProgressBar(); + } + else + { + if(iProgressbarTicker->IsActive()) + { + iProgressbarTicker->Cancel(); + } + StartProgressNoteL(iFinalCount,EFalse); + } + } + +// ----------------------------------------------------------------------------- +// StartProgressNoteL +// ----------------------------------------------------------------------------- +// +void CGlxProgressIndicator::StartProgressNoteL(TInt aFinalValue,TBool aShow) + { + TRACER("CGlxProgressIndicator::StartProgressNoteL()"); + + if(aShow) + { + if(!iProgressDialog) + { + iProgressDialog = new (ELeave)CAknProgressDialog((reinterpret_cast (&iProgressDialog)),ETrue); + } + iProgressDialog->PrepareLC(R_PROGRESS_NOTE); + + iProgressInfo = iProgressDialog->GetProgressInfoL(); + + iProgressDialog->SetCallback(this); + + HBufC* processingInfo = + StringLoader::LoadLC(R_GLX_MAIN_LIST_VIEW_PROCESSING_DIALOG); + iProgressDialog->SetTextL(*processingInfo); + CleanupStack::PopAndDestroy(processingInfo ); + iProgressInfo->SetFinalValue(aFinalValue); + + iProgressDialog->RunLD(); + } + else + { + iProgressDialog->ProcessFinishedL(); + if(iProgressDialog) + { + iProgressDialog = NULL; + iProgressInfo = NULL; + } + } + + } + +// ----------------------------------------------------------------------------- +// UpdateProgressBar +// ----------------------------------------------------------------------------- +// +void CGlxProgressIndicator::UpdateProgressBar() + { + TRACER("CGlxProgressIndicator::UpdateProgressBar()"); + if(iProgressInfo) + { + /* + * to show a number string in the progress bar use the below code + * in rss it should have %d or %N format + * TBuf<256> text; + * GlxGeneralUiUtilities::FormatString(text,*processingInfo,-1,count,ETrue); + * CleanupStack::PopAndDestroy(processingInfo); + */ + iProgressInfo->SetAndDraw(CalculateDisplayBarIncrementL()); + } + } + +// ----------------------------------------------------------------------------- +// DialogDismissedL +// ----------------------------------------------------------------------------- +// +void CGlxProgressIndicator::DialogDismissedL(TInt aButtonId) + { + TRACER("CGlxProgressIndicator::DialogDismissedL()"); + CGlxUiUtility* uiUtility = CGlxUiUtility::UtilityL(); + CleanupClosePushL(*uiUtility); + uiUtility->StopTNMDaemonL(); + CleanupStack::PopAndDestroy(uiUtility); + if(iProgressbarTicker) + { + iProgressbarTicker->Cancel(); + delete iProgressbarTicker; + iProgressbarTicker = NULL; + } + + if (aButtonId == EAknSoftkeyCancel) + { + // cancel any process in here + iGlxGridViewNotifyObserver.HandleDialogDismissedL(); + } + if(iProgressDialog) + { + iProgressDialog = NULL; + iProgressInfo = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CalculateDisplayBarIncrementL +// ----------------------------------------------------------------------------- +// +TInt CGlxProgressIndicator::CalculateDisplayBarIncrementL() + { + TRACER("CGlxProgressIndicator::CalculateDisplayBarIncrement()"); + CGlxUiUtility* uiUtility = CGlxUiUtility::UtilityL(); + CleanupClosePushL(*uiUtility); + TInt itemsLeft = uiUtility->GetItemsLeftCountL(); + CleanupStack::PopAndDestroy(uiUtility); + GLX_LOG_INFO1("CalculateDisplayBarIncrement = %d ",(iFinalCount - itemsLeft)); + + if(iFinalCount < itemsLeft) + { + iProgressInfo->SetFinalValue( itemsLeft ); + iFinalCount = itemsLeft; + } + + return (iFinalCount - itemsLeft); + }