photosgallery/viewframework/uiutilities/src/glxprogressindicator.cpp
branchRCL_3
changeset 14 ce1c7ad1f18b
child 18 bcb43dc84c44
--- /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 <glxtracer.h>
+#include <glxlog.h>
+#include <StringLoader.h>
+#include <AknProgressDialog.h>
+#include <eikprogi.h>
+#include <e32property.h>
+#include <glxuiutilities.rsg>
+#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<TAny*>( 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<CEikDialog**> (&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);
+    }