omads/omadsappui/AspSyncUtil/src/AspSettingViewDialog.cpp
branchRCL_3
changeset 25 4f0867e42d62
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omads/omadsappui/AspSyncUtil/src/AspSettingViewDialog.cpp	Wed Sep 01 12:30:02 2010 +0100
@@ -0,0 +1,756 @@
+/*
+* 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 "AspSettingViewDialog.h"
+#include "AspProfileDialog.h"
+#include "AspContentDialog.h"
+#include "AspScheduleDialog.h"
+
+#include "AspSyncUtil.rh"
+#include "AspDebug.h"
+#include <csxhelp/ds.hlp.hrh>
+
+#include <aspsyncutil.mbg>  // for bitmap enumerations
+#include <AknIconArray.h>   // for GulArray
+
+#include "AspSchedule.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::ShowDialogL
+// 
+// -----------------------------------------------------------------------------
+TBool CAspSettingViewDialog::ShowDialogL(const TAspParam& aParam)
+	{
+    CAspSettingViewDialog* dialog = CAspSettingViewDialog::NewL(aParam);
+
+	TBool ret = dialog->ExecuteLD(R_ASP_SETTING_VIEW_DIALOG);
+
+    return ret;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::NewL
+//
+// -----------------------------------------------------------------------------
+CAspSettingViewDialog* CAspSettingViewDialog::NewL(const TAspParam& aParam)
+    {
+    FLOG( _L("CAspSettingViewDialog::NewL START") );
+
+    CAspSettingViewDialog* self = new ( ELeave )CAspSettingViewDialog (aParam);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    FLOG( _L("CAspSettingViewDialog::NewL END") );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::CAspSettingViewDialog
+// 
+// -----------------------------------------------------------------------------
+//
+CAspSettingViewDialog::CAspSettingViewDialog(const TAspParam& aParam)
+	{
+    iSyncSession = aParam.iSyncSession;
+    iApplicationId = aParam.iApplicationId;
+    iProfile = aParam.iProfile;
+    iContentList = aParam.iContentList;
+    iProfileList = aParam.iProfileList;
+    iEditMode = aParam.iMode;
+	iDataProviderId =aParam.iDataProviderId;
+	iSchedule = aParam.iSchedule;
+    
+       
+	__ASSERT_ALWAYS(iProfile, TUtil::Panic(KErrGeneral));
+	__ASSERT_ALWAYS(iContentList, TUtil::Panic(KErrGeneral));
+	__ASSERT_ALWAYS(iSyncSession, TUtil::Panic(KErrGeneral));
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::ConstructL()
+    {
+    FLOG( _L("CAspSettingViewDialog::ConstructL START") );
+	
+	// contruct menu for our dialog
+	CAknDialog::ConstructL(R_ASP_SETTING_VIEW_DIALOG_MENU);
+
+	iSettingList = new (ELeave) CArrayPtrFlat<CAspListItemData>(1);
+
+	TAspParam param(KErrNotFound, iSyncSession);
+		
+	// get previous title so it can be restored
+	iStatusPaneHandler = CStatusPaneHandler::NewL(iAvkonAppUi);
+	iStatusPaneHandler->StoreOriginalTitleL();
+	
+	FLOG( _L("CAspSettingViewDialog::ConstructL END") );
+    } 
+
+
+// ----------------------------------------------------------------------------
+// Destructor
+//
+// ----------------------------------------------------------------------------
+//
+CAspSettingViewDialog::~CAspSettingViewDialog()
+    {
+    FLOG( _L("CAspSettingViewDialog::~CAspSettingViewDialog START") );
+
+	if (iSettingList)
+		{
+		iSettingList->ResetAndDestroy();
+	    delete iSettingList;
+		}
+
+	delete iStatusPaneHandler;
+	
+	
+    if (iAvkonAppUi)
+    	{
+    	iAvkonAppUi->RemoveFromStack(this);
+    	}
+
+	FLOG( _L("~CAspSettingViewDialog::~~CAspSettingViewDialog END") );
+    }
+
+
+//------------------------------------------------------------------------------
+// CAspSettingViewDialog::ActivateL
+//
+// Called by system when dialog is activated.
+//------------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::ActivateL()
+	{
+    CAknDialog::ActivateL();
+
+	// this cannot be in ConstructL which is executed before dialog is launched
+	iAvkonAppUi->AddToStackL(this);
+    }
+
+
+//------------------------------------------------------------------------------
+// CAspContentListDialog::GetHelpContext
+//
+//------------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::GetHelpContext(TCoeHelpContext& aContext) const
+	{
+	aContext.iMajor = KUidSmlSyncApp;
+	aContext.iContext = KDS_HLP_SETTINGS;    
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::HandleListBoxEventL
+// 
+// -----------------------------------------------------------------------------
+void CAspSettingViewDialog::HandleListBoxEventL(CEikListBox* /*aListBox*/,
+                                            TListBoxEvent aEventType)
+	{
+    switch ( aEventType )
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            HandleOKL();
+            break;
+        default:
+           break;
+        }
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::PreLayoutDynInitL
+// 
+// -----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::PreLayoutDynInitL()
+    {
+    iSettingListBox = (CAknSettingStyleListBox*) ControlOrNull (EAspSettingViewDialogList);
+    
+   	__ASSERT_ALWAYS(iSettingListBox, TUtil::Panic(KErrGeneral));
+    
+	iSettingListBox->SetListBoxObserver(this);
+	iSettingListBox->CreateScrollBarFrameL(ETrue);
+	iSettingListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+	                 CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto);
+	
+	SetIconsL();
+	
+	// create array of setting items (iSettingList)
+	CreateSettingsListL();
+
+	// add setting headers into listbox
+	UpdateListBoxL(iSettingListBox, iSettingList);
+
+	if (iDataProviderId)
+		{
+		iSettingListBox->SetCurrentItemIndex(GetIndexFromProvider(iDataProviderId));
+		}
+    iProfile->GetName(iBuf);
+	iStatusPaneHandler->SetTitleL(iBuf);
+	iStatusPaneHandler->SetNaviPaneTitleL(KNullDesC);
+    }
+
+
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::SetIconsL
+//
+// ----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::SetIconsL()
+    {
+    if (!iSettingListBox)
+    	{
+    	return;
+    	}
+ 
+ 	TFileName bitmapName;
+	CAspResHandler::GetBitmapFileName(bitmapName);
+	CArrayPtr<CGulIcon>* icons = new (ELeave) CAknIconArray(KDefaultArraySize);
+	CleanupStack::PushL(icons);
+	
+	icons->AppendL(IconL(KAknsIIDQgnIndiSettProtectedAdd, bitmapName,
+	                     EMbmAspsyncutilQgn_indi_sett_protected_add,
+	                     EMbmAspsyncutilQgn_indi_sett_protected_add_mask));
+	
+    // delete old icons
+    CArrayPtr<CGulIcon>* arr =
+    iSettingListBox->ItemDrawer()->FormattedCellData()->IconArray();
+    
+    if (arr)
+    	{
+    	arr->ResetAndDestroy();
+	    delete arr;
+	    arr = NULL;
+    	}
+
+	iSettingListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL(icons);
+	CleanupStack::Pop(icons);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::IconL
+// 
+// -----------------------------------------------------------------------------
+//
+CGulIcon* CAspSettingViewDialog::IconL(TAknsItemID aId, const TDesC& aFileName, TInt aFileIndex, TInt aFileMaskIndex)
+	{
+    return TDialogUtil::CreateIconL(aId, aFileName, aFileIndex, aFileMaskIndex);
+	}
+
+
+//------------------------------------------------------------------------------
+// CAspSettingViewDialog::ProcessCommandL
+//
+// Handle commands from menu.
+//------------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::ProcessCommandL(TInt aCommandId)
+	{
+	HideMenu();
+
+	switch (aCommandId)
+		{
+		case EAknCmdHelp:
+			{
+			TUtil::LaunchHelpAppL(iEikonEnv);
+            break;
+			}
+
+		case EAspMenuCmdChange:
+		case EAspMenuCmdOpen:
+			{				
+			HandleOKL();
+			break;
+			}
+		    
+        case EAspMenuCmdExit:
+        case EAknCmdExit:
+        case EEikCmdExit:
+			{
+			// close dialog and exit calling application
+			iAvkonAppUi->ProcessCommandL(EAknCmdExit);
+			break;
+			}
+
+		default:			
+		    break;
+		}
+	}
+
+
+//------------------------------------------------------------------------------
+// CAspSettingViewDialog::OkToExitL
+//
+//------------------------------------------------------------------------------
+//
+TBool CAspSettingViewDialog::OkToExitL(TInt aButtonId)
+	{
+	if (aButtonId == EEikBidCancel || aButtonId == EAknSoftkeyBack)
+		{
+		return ETrue; // close dialog
+		}
+
+	if (aButtonId == EAknSoftkeyOpen)  // MSK
+        {
+	    HandleOKL();
+		return EFalse;  // leave dialog open
+		}
+
+	return CAknDialog::OkToExitL(aButtonId);
+	}
+
+
+
+
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::OfferKeyEventL
+// 
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CAspSettingViewDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+	{
+	if (aType == EEventKey)
+		{
+		switch (aKeyEvent.iCode)
+			{
+			case EKeyEscape:  // framework calls this when dialog must shut down
+				{
+				return CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+        		}
+
+			default:
+				{
+			    break;
+				}
+			}
+		}
+
+	return CAknDialog::OfferKeyEventL( aKeyEvent, aType);
+	}
+
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::HandleResourceChange
+// 
+// ----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::HandleResourceChange(TInt aType)
+    {   
+    if (aType == KEikDynamicLayoutVariantSwitch) //Handle change in layout orientation
+        {
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+        SetRect(mainPaneRect);
+        iSettingListBox->SetSize(mainPaneRect.Size());
+        CCoeControl::HandleResourceChange(aType);
+		DrawDeferred();
+	    return;
+		}
+		
+    if (aType == KAknsMessageSkinChange)
+        {
+        TRAP_IGNORE(SetIconsL());
+        }
+		
+    CCoeControl::HandleResourceChange(aType);
+    }
+
+//------------------------------------------------------------------------------
+// CAspSettingViewDialog::HandleOKL
+//
+//------------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::HandleOKL()
+	{
+	CAspListItemData* item = GetItemForIndex(ListBox()->CurrentItemIndex());
+
+	EditSettingItemL(*item);
+	SetVisibility();
+	UpdateListBoxL(iSettingListBox, iSettingList);
+	
+	}
+
+
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::CreateSettingsListL
+// 
+// Function creates setting list array (iSettingsList).
+// ----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::CreateSettingsListL()
+	{
+	
+	AddProfileSettingItemL();
+#ifdef RD_DSUI_TIMEDSYNC
+
+	AddSchedulingSettingItemL();
+	
+#endif
+	AddContentItemsL();
+	SetVisibility();
+	UpdateListBoxL(iSettingListBox, iSettingList);
+	
+	}
+
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::AddProfileSettingItemL
+// 
+// 
+// ----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::AddProfileSettingItemL()
+	{
+	
+	CAspListItemData* item = CAspListItemData::NewLC();
+	item->SetHeaderL(R_ASP_SETTING_FOLDER_PROFILE);
+	item->iItemId = EAspProfileSetting;
+	item->iItemType = CAspListItemData::ETypeProfileSetting;
+	item->iNumberData = KErrNotFound;
+	iSettingList->AppendL(item);
+	CleanupStack::Pop(item);
+		
+	}
+
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::AddSchedulingSettingItemL
+// 
+// ----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::AddSchedulingSettingItemL()
+	{
+    CAspListItemData* item = CAspListItemData::NewLC();
+	item->SetHeaderL(R_ASP_SETTING_FOLDER_SCHEDULE);
+	item->iItemId = EAspSchedulingSetting;
+	item->iItemType = CAspListItemData::ETypeSchedulingSetting;
+	item->iNumberData = KErrNotFound;
+	iSettingList->AppendL(item);
+	CleanupStack::Pop(item);
+	}
+
+	
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::AddContentItemsL
+// 
+// ----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::AddContentItemsL()
+	{
+   	TInt count = iContentList->ProviderCount();
+
+	for (TInt i=0; i<count; i++)
+		{
+		TAspProviderItem& providerItem = iContentList->ProviderItem(i);
+		TInt appId = TUtil::AppIdFromProviderId(providerItem.iDataProviderId);
+		if (iApplicationId != EApplicationIdSync && iApplicationId != appId)
+			{
+			continue;
+			}
+				
+		HBufC* firstLine = CAspResHandler::GetContentSettingLC(
+		                                   providerItem.iDataProviderId,
+		                                   providerItem.iDisplayName);
+		
+	    CAspListItemData* item = CAspListItemData::NewLC();
+    
+    	item->SetHeaderL(firstLine->Des());
+	    item->iItemId = EAspSyncContent;
+	    item->iItemType = CAspListItemData::ETypeSyncContent;
+	    item->iNumberData = providerItem.iDataProviderId;
+	    iSettingList->AppendL(item);
+	    CleanupStack::Pop(item);
+	    
+	    CleanupStack::PopAndDestroy(firstLine);
+    	}
+	}
+
+
+// ----------------------------------------------------------------------------
+// CAspSettingViewDialog::UpdateListBoxL
+// 
+// Add settings headers into listbox.
+// ----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::UpdateListBoxL(CEikTextListBox* aListBox,
+                                       CAspSettingList* aItemList)
+	{
+		
+	CDesCArray* arr = (CDesCArray*)aListBox->Model()->ItemTextArray();
+	arr->Reset();
+
+	TInt count = aItemList->Count();
+	for (TInt i=0; i<count; i++ )
+		{	
+		CAspListItemData* item = (*aItemList)[i];
+			
+		TBool convert = ETrue;
+		if (item->iHidden != EVisibilityHidden)
+			{
+			HBufC* hBuf = item->ListItemTextL(convert);
+			CleanupStack::PushL(hBuf);
+			
+			arr->AppendL(hBuf->Des());
+			
+			// store listbox index (from zero up) into setting item 
+			item->iIndex = arr->Count() - 1;
+
+			CleanupStack::PopAndDestroy(hBuf);
+			}
+		else
+			{
+			item->iIndex = KErrNotFound;
+			}
+		}
+
+	ListBox()->HandleItemAdditionL();
+	}
+
+
+//------------------------------------------------------------------------------
+// CAspSettingViewDialog::EditSettingItemL
+//
+// Calls setting editing functions. 
+//------------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::EditSettingItemL(CAspListItemData& aItem)
+	{
+	TBool ret = KErrNone;
+	switch (aItem.iItemType)
+		{
+    	case CAspListItemData::ETypeProfileSetting:
+    	ret = EditSettingItemProfileSettingL();
+			break;
+
+		case CAspListItemData::ETypeSchedulingSetting:
+    	ret = EditSettingItemSchedulingSettingL();
+			break;
+
+		case CAspListItemData::ETypeSyncContent:
+			ret = EditSettingItemSyncContentL(aItem);
+			break;
+
+		default:
+		    break;
+		}
+	
+		User::LeaveIfError(ret);
+	
+	
+	}
+
+// -----------------------------------------------------------------------------
+// CAspContentListDialog::EditSettingItemProfileSettingL
+//
+// -----------------------------------------------------------------------------
+//
+TInt CAspSettingViewDialog::EditSettingItemProfileSettingL()
+	{
+ 	TAspParam param(iApplicationId, iSyncSession);
+    param.iProfile = iProfile;
+    param.iProfileList = iProfileList;
+    param.iMode = iEditMode;
+    param.iContentList = iContentList;
+    
+    CAspProfileDialog::ShowDialogL(param);
+    
+    //Update profile name in navi pane ,to reflect any name change during profile editing
+    iProfile->GetName(iBuf);
+	iStatusPaneHandler->SetTitleL(iBuf);
+	iStatusPaneHandler->SetNaviPaneTitleL(KNullDesC);
+     
+    return KErrNone;
+	}
+	
+// -----------------------------------------------------------------------------
+// CAspContentListDialog::EditSettingItemSchedulingSettingL
+//
+// -----------------------------------------------------------------------------
+//
+TInt CAspSettingViewDialog::EditSettingItemSchedulingSettingL()
+	{
+ 	TAspParam param(iApplicationId, iSyncSession);
+    param.iProfileList = iProfileList;
+    param.iProfile = iProfile;
+	param.iContentList = iContentList;
+	param.iSchedule = iSchedule;
+
+	TBool settingEnforcement = TUtil::SettingEnforcementState();
+	
+	CAspSchedule* schedule = CAspSchedule::NewLC();
+	if (schedule->IsAutoSyncEnabled() && !settingEnforcement)
+		{
+		TInt profileId = schedule->ProfileId();
+		if(profileId != iProfile->ProfileId() && profileId != KErrNotFound)
+			{
+			if(!TDialogUtil::ShowConfirmationQueryL(R_ASP_QUERY_AUTO_SYNC_ON))
+				{
+				CleanupStack::PopAndDestroy(schedule);
+				return KErrNone;
+				}
+			}
+		}
+    CleanupStack::PopAndDestroy(schedule);
+
+    CAspScheduleDialog::ShowDialogL(param);
+
+    return KErrNone;
+	}
+
+// -----------------------------------------------------------------------------
+// CAspContentListDialog::EditSettingItemSyncContentL
+//
+// -----------------------------------------------------------------------------
+//
+TInt CAspSettingViewDialog::EditSettingItemSyncContentL(CAspListItemData& aItem)
+	{
+
+	TAspParam param(iApplicationId, iSyncSession);
+    param.iProfile = iProfile;
+    param.iDataProviderId = aItem.iNumberData;
+    param.iSyncTaskId = KErrNotFound;
+    param.iContentList = iContentList;
+
+    CAspContentDialog::ShowDialogL(param);
+
+	    
+    return KErrNone;
+	}
+
+   
+//-----------------------------------------------------------------------------
+// CAspSettingViewDialog::GetItemForIndex
+// 
+// Find item in list position aIndex.
+//-----------------------------------------------------------------------------
+//
+CAspListItemData* CAspSettingViewDialog::GetItemForIndex(TInt aIndex)
+	{
+	CAspListItemData* item = NULL;
+	
+	TInt count = iSettingList->Count();
+	for (TInt i=0; i<count; i++)
+		{
+		CAspListItemData* temp = (*iSettingList)[i];
+		if (temp->iIndex == aIndex)
+			{
+			item = temp;
+			break;
+			}
+		}
+
+	__ASSERT_ALWAYS(item, TUtil::Panic(KErrGeneral));
+
+    return item;
+	}
+
+//-----------------------------------------------------------------------------
+// CAspSettingViewDialog::SetVisibility
+// 
+// -----------------------------------------------------------------------------
+//
+void CAspSettingViewDialog::SetVisibility()
+	{
+	
+	if (iProfile->BearerType() == EAspBearerInternet)
+		{
+		Item(EAspSchedulingSetting)->iHidden = EVisibilityNormal;
+		}
+	else
+		{
+		Item(EAspSchedulingSetting)->iHidden = EVisibilityHidden;
+		}
+	}
+//-----------------------------------------------------------------------------
+// CAspSettingViewDialog::GetIndexFromProvider
+// 
+// Find index for a provider
+//-----------------------------------------------------------------------------
+//
+TInt CAspSettingViewDialog::GetIndexFromProvider(TInt aDataProvider)
+	{
+	
+	TInt count = iSettingList->Count();
+	TInt index;
+	for (index=0; index<count; index++)
+		{
+		CAspListItemData* temp = (*iSettingList)[index];
+		if (temp->iNumberData == aDataProvider)
+			{
+			break;
+			}
+		}
+	return index;
+	}
+	
+
+//-----------------------------------------------------------------------------
+// CAspSettingViewDialog::Item
+// 
+// Find item with aItemId.
+//-----------------------------------------------------------------------------
+//
+CAspListItemData* CAspSettingViewDialog::Item(TInt aItemId)
+	{
+	CAspListItemData* item = NULL;
+
+	TInt count = iSettingList->Count();
+	for (TInt i=0; i<count; i++)
+		{
+		CAspListItemData* temp = (*iSettingList)[i];
+		if (temp->iItemId == aItemId)
+			{
+			item = temp;
+			break;
+			}
+		}
+	
+	__ASSERT_ALWAYS(item, TUtil::Panic(KErrGeneral));
+
+    return item;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CAspSettingViewDialog::ListBox
+// 
+// -----------------------------------------------------------------------------
+//
+CAknSettingStyleListBox* CAspSettingViewDialog::ListBox()
+	{
+	return iSettingListBox;
+	}
+
+
+//  End of File