omads/omadsappui/AspSyncUtil/src/AspProgressDialog.cpp
changeset 0 dab8a81a92de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omads/omadsappui/AspSyncUtil/src/AspProgressDialog.cpp	Mon Nov 23 14:46:41 2009 +0200
@@ -0,0 +1,531 @@
+/*
+* 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:  
+*
+*/
+
+
+// INCLUDE FILES
+#include "AspProgressDialog.h"
+#include "AspSyncUtil.rh"
+#include "AspUtil.h"
+#include "AspDebug.h"
+#include "AspDefines.h"
+#include "AspResHandler.h"
+#include "AspDialogUtil.h"
+
+
+#include <eikprogi.h>
+#include <notecontrol.h>
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+
+/*******************************************************************************
+ * class CAspProgressDialog
+ *******************************************************************************/
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::CAspProgressDialog
+//
+// -----------------------------------------------------------------------------
+//
+CAspProgressDialog::CAspProgressDialog(MAspProgressDialogObserver* aObserver) : iObserver(aObserver)
+    {
+    FLOG( _L("CAspProgressDialog: CAspProgressDialog") );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::NewL
+//
+// -----------------------------------------------------------------------------
+//
+CAspProgressDialog* CAspProgressDialog::NewL(MAspProgressDialogObserver* aObserver)
+    {
+    FLOG( _L("CAspProgressDialog::NewL START") );
+
+    CAspProgressDialog* self = new (ELeave) CAspProgressDialog(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    FLOG( _L("CAspProgressDialog::NewL END") );
+    return(self);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::ConstructL()
+    {
+    FLOG( _L("CAspProgressDialog::ConstructL START") );
+
+	iLastText = KNullDesC;
+	iAnimation = EFalse;
+	iResHandler = CAspResHandler::NewL();
+	iProgressDialogRunning = EFalse;
+    
+	FLOG( _L("CAspProgressDialog::ConstructL END") );
+    } 
+
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+// -----------------------------------------------------------------------------
+//
+CAspProgressDialog::~CAspProgressDialog()
+    {
+    FLOG( _L("CAspProgressDialog::~CAspProgressDialog START") );
+
+	delete iResHandler;
+    delete iProgressDialog;
+
+	FLOG( _L("CAspProgressDialog::~CAspProgressDialog END") );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::LaunchProgressDialogL
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::LaunchProgressDialogL(const TDesC& aLabel, TAknsItemID aId, const TDesC& aFileName, TInt aFileBitmapId, TInt aFileMaskId)
+	{
+    FLOG( _L("CAspProgressDialog::LaunchProgressDialogL START") );
+
+	iProgressDialog = new(ELeave) CAspProgressDialog2(reinterpret_cast<CEikDialog**>(&iProgressDialog), iApplicationId);
+    
+	iProgressDialog->PrepareLC(R_ASP_PROGRESS_NOTE);
+    iProgressDialog->SetTextL(aLabel);
+	
+	CEikImage* image = TDialogUtil::CreateImageLC(aId, aFileName, aFileBitmapId, aFileMaskId);
+    iProgressDialog->SetImageL(image);
+	CleanupStack::Pop(image);
+
+    // get reference to progress info bar
+    iProgressInfo = iProgressDialog->GetProgressInfoL();
+    iProgressDialog->SetCallback(this);
+    
+    iProgressDialog->RunLD();
+    iProgressDialogRunning = ETrue;
+
+	FLOG( _L("CAspProgressDialog::LaunchProgressDialogL END") );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::CancelProgressDialogL
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::CancelProgressDialogL()
+    {
+    FLOG( _L("CAspProgressDialog::CancelProgressDialogL START") );
+
+	if (!iProgressDialogRunning)
+		{
+		return; // dialog is already closed
+		}
+		
+	if(iProgressDialog)
+        {        
+        iProgressDialog->ProcessFinishedL();
+        iProgressDialogRunning = EFalse;
+        }    
+
+	FLOG( _L("CAspProgressDialog::CancelProgressDialogL END") );
+    }
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::ProgressDialog
+//
+// -----------------------------------------------------------------------------
+//
+CAspProgressDialog2* CAspProgressDialog::ProgressDialog()
+	{
+	return iProgressDialog;
+	}
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::UpdateTextL
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::UpdateTextL(const TDesC& aText)
+    {
+    FLOG( _L("CAspProgressDialog::UpdateTextL START") );
+
+	__ASSERT_DEBUG(iProgressDialog, TUtil::Panic(KErrGeneral));
+
+	if (iLastText.Compare(aText) == 0)
+		{
+		return;  // text has not changed
+		}
+    
+    iProgressDialog->SetTextL(aText);
+	TUtil::StrCopy(iLastText, aText);
+	
+	FLOG( _L("aText is '%S'"), &aText );
+
+	FLOG( _L("CAspProgressDialog::UpdateTextL END") );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::SetProgress
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::SetProgress(TInt aValue)
+    {
+    FLOG( _L("CAspProgressDialog::SetProgress START") );
+    
+	__ASSERT_DEBUG(iProgressDialog  && iProgressInfo, TUtil::Panic(KErrGeneral));
+
+	CEikProgressInfo::SInfo info = iProgressInfo->Info();
+
+	TInt val = aValue;
+	if (val > info.iFinalValue)
+		{
+		val = info.iFinalValue;
+		}
+	
+	iProgressInfo->SetAndDraw(val);
+	
+	FLOG( _L("aValue is %d"), aValue );
+    
+	FLOG( _L("CAspProgressDialog::SetProgress END") );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::SetFinalProgress
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::SetFinalProgress(TInt aFinalValue)
+	{
+    FLOG( _L("CAspProgressDialog::SetFinalProgress START") );
+    
+    __ASSERT_DEBUG(iProgressInfo, TUtil::Panic(KErrGeneral));
+
+    if (aFinalValue < 0)
+    	{
+    	iProgressInfo->SetFinalValue(0);
+    	}
+    else
+    	{
+    	iProgressInfo->SetFinalValue(aFinalValue);
+    	}
+    	
+	iProgressInfo->SetAndDraw(0);
+
+	FLOG( _L("aFinalValue is %d"), aFinalValue );
+	
+	FLOG( _L("CAspProgressDialog::SetFinalProgress END") );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::NoteControl
+//
+// -----------------------------------------------------------------------------
+//
+CAknNoteControl* CAspProgressDialog::NoteControl()
+	{
+    CAknNoteControl* note = STATIC_CAST(CAknNoteControl*, iProgressDialog->ControlOrNull(EAspSyncProgressNote));
+
+	__ASSERT_DEBUG(note, TUtil::Panic(KErrGeneral));
+
+	return note;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::CancelAnimation
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::CancelAnimation()
+	{
+	FLOG( _L("CAspProgressDialog::CancelAnimation START") );
+	
+	NoteControl()->CancelAnimation();
+	iAnimation = EFalse;
+
+	FLOG( _L("CAspProgressDialog::CancelAnimation END") );
+	}
+
+
+// ----------------------------------------------------------------------------
+// CAspProgressDialog::StartAnimationL
+//
+// ----------------------------------------------------------------------------
+//
+void CAspProgressDialog::StartAnimationL()
+	{
+	FLOG( _L("CAspProgressDialog::StartAnimationL START") );
+	
+	if (!iAnimation)
+		{
+		NoteControl()->StartAnimationL();
+		iAnimation = ETrue;
+		
+		FLOG( _L("animation started") );
+		}
+		
+    FLOG( _L("CAspProgressDialog::StartAnimationL END") );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::DialogDismissedL (From MProgressDialogCallback)
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::DialogDismissedL(TInt aButtonId)
+    {
+    FLOG( _L("CAspProgressDialog::DialogDismissedL START" ) );
+  
+    if (!iObserver)
+		{
+		FLOG( _L("### no observer ###") );
+		FLOG( _L("CAspProgressDialog::DialogDismissedL END") );
+		return; // no observer
+		}
+	
+	// end key handling
+	if (aButtonId == EKeyPhoneEnd)
+	    {
+        TRAP_IGNORE(iObserver->HandleDialogEventL(EKeyPhoneEnd));
+        }
+
+	// this dialog only sends one cancel event - other events are ignored 
+	if (aButtonId == EEikBidCancel)
+		{
+        TRAP_IGNORE(iObserver->HandleDialogEventL(EEikBidCancel));
+        }
+
+    FLOG( _L("CAspProgressDialog::DialogDismissedL END") );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog::HideButtonL
+//
+// -----------------------------------------------------------------------------
+//
+void CAspProgressDialog::HideButtonL()
+    {
+    const TInt KLastButtonIndex = 2;
+    
+   	CEikButtonGroupContainer& container = iProgressDialog->ButtonGroupContainer();
+	
+	container.RemoveCommandFromStack(KLastButtonIndex, EAknSoftkeyCancel);
+	container.AddCommandToStackL(KLastButtonIndex, EAknSoftkeyEmpty, KNullDesC);
+	container.DrawDeferred();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CAspProgressDialog::SetApplicationId
+// 
+// ----------------------------------------------------------------------------
+//
+void CAspProgressDialog::SetApplicationId(TInt aApplicationId)
+	{
+	iApplicationId = aApplicationId;
+	}
+
+
+
+
+
+/*******************************************************************************
+ * class CAspProgressDialog2
+ *******************************************************************************/
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog2::CAspProgressDialog2
+//
+// -----------------------------------------------------------------------------
+//
+CAspProgressDialog2::CAspProgressDialog2(CEikDialog** aSelfPtr, TInt aApplicationId)
+ : CAknProgressDialog(aSelfPtr)
+	{
+	FLOG( _L("CAspProgressDialog2::CAspProgressDialog2 START") );
+	
+    iCloseEventReceived = EFalse;
+    iCancelEventReceived = EFalse;
+    iClosed = EFalse;
+    iCanceled = EFalse;
+	iApplicationId = aApplicationId;
+	
+	if (iApplicationId != EApplicationIdSync)
+		{
+		// to make sure that wserv does not change our priority even we lose foreground.
+	    // this is needed for receiving event EKeyPhoneEnd without delay.
+	    
+	    RWsSession& wsSession = iEikonEnv->WsSession();
+	    wsSession.ComputeMode(RWsSession::EPriorityControlDisabled);
+	    
+	    FLOG( _L("RWsSession::ComputeMode(RWsSession::EPriorityControlDisabled)") );
+	    
+		}
+		
+	FLOG( _L("CAspProgressDialog2::CAspProgressDialog2 END") );
+	}
+
+
+// -----------------------------------------------------------------------------
+// Destructor
+//
+// -----------------------------------------------------------------------------
+//
+CAspProgressDialog2::~CAspProgressDialog2()
+    {
+    FLOG( _L("CAspProgressDialog2::~CAspProgressDialog2 START") );
+
+	if (iApplicationId != EApplicationIdSync)
+		{
+		RWsSession& wsSession = iEikonEnv->WsSession();
+	    wsSession.ComputeMode(RWsSession::EPriorityControlComputeOff);
+	    
+	    FLOG( _L("RWsSession::ComputeMode(RWsSession::EPriorityControlComputeOff)") );
+		}
+
+    if (iAvkonAppUi)
+        {
+        iAvkonAppUi->RemoveFromStack(this);
+        }
+
+	FLOG( _L("CAspProgressDialog2::~CAspProgressDialog2 END") );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspProgressDialog2::OkToExitL
+//
+// -----------------------------------------------------------------------------
+//
+TBool CAspProgressDialog2::OkToExitL(TInt aButtonId)
+    {
+    FLOG( _L("CAspProgressDialog2::OkToExitL START") );
+    
+    // close key handling
+    if (iCloseEventReceived && !iClosed)
+        {
+   	    if (iCallback)
+   	    	{
+   	    	TRAP_IGNORE(iCallback->DialogDismissedL(EKeyPhoneEnd));
+   	    	
+   	    	FLOG( _L("CAspProgressDialog2::OkToExitL: close handling done") );
+  	    	}
+   		    
+        if (iAvkonAppUi)
+            {
+            // prevent further close events
+            iAvkonAppUi->RemoveFromStack(this);
+            }
+            
+        FLOG( _L("CAspProgressDialog2::OkToExitL END") );
+
+        iClosed = ETrue;
+        return ETrue;
+        }
+
+    // cancel key handling
+    if (aButtonId == EEikBidCancel && iCancelEventReceived && !iCanceled && !iClosed)
+        {
+        if (iCallback)
+        	{
+        	TRAP_IGNORE(iCallback->DialogDismissedL(EEikBidCancel));
+        	
+        	FLOG( _L("CAspProgressDialog2::OkToExitL: cancel key handling done") );
+        	}
+        
+		FLOG( _L("CAspProgressDialog2::OkToExitL END") );
+		
+		iCanceled = ETrue;
+		return EFalse; // leave dialog open - let observer close it
+		}
+
+
+    FLOG( _L("CAspProgressDialog2::OkToExitL END") );
+    
+    return CAknProgressDialog::OkToExitL(aButtonId);
+    }
+
+
+// ----------------------------------------------------------------------------
+// CAspProgressDialog2::OfferKeyEventL
+// 
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CAspProgressDialog2::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+	{
+	FLOG( _L("CAspProgressDialog2::OfferKeyEventL START") );
+	
+	if (aKeyEvent.iScanCode == EStdKeyDevice1)
+		{
+		iCancelEventReceived = ETrue;
+		FLOG( _L("CAspProgressDialog2::OfferKeyEventL: EStdKeyDevice1 received") );
+     	}
+		
+
+	if (aType == EEventKey)
+		{
+		switch (aKeyEvent.iCode)
+			{
+
+            case EKeyEscape:  // iCode 27 (0x1b)
+            	{
+            	iCloseEventReceived = ETrue;
+            	FLOG( _L("CAspProgressDialog2::OfferKeyEventL: EKeyEscape received") );
+            	break;
+            	}
+            	
+            case EKeyPhoneEnd:
+             	{
+             	iCloseEventReceived = ETrue;
+                FLOG( _L("CAspProgressDialog2::OfferKeyEventL: EKeyPhoneEnd received") );
+                break;
+               	}
+
+            default:
+                FLOG( _L("event key code is %d"),  aKeyEvent.iCode);        
+			    break;
+			}
+		}
+
+
+    FLOG( _L("CAspProgressDialog2::OfferKeyEventL END") );
+    
+	return CAknProgressDialog::OfferKeyEventL(aKeyEvent, aType);
+	}
+
+
+
+
+//  End of File