omads/omadsappui/AspSyncUtil/src/AspSettingViewDialog.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:02 +0100
branchRCL_3
changeset 25 4f0867e42d62
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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