diff -r 12af337248b1 -r bd7edf625bdd calendarui/settings/settingsui/src/calensettingsuicontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/settings/settingsui/src/calensettingsuicontainer.cpp Wed Sep 01 12:32:31 2010 +0100 @@ -0,0 +1,1483 @@ +/* +* Copyright (c) 2007 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: Calendar settings container +* +*/ + + +//debug +#include "calendarui_debug.h" + +// INCLUDES +#include "calensettingsuicontainer.h" + +#include "CalenFileListSettingItem.h" +#include "calenglobaldata.h" +#include "CalenInterimUtils2.h" +#include "CalenSliderSettingItem.h" +#include "CalenUid.h" +#include "RImplInfoPtrArrayOwn.inl" +#include "CleanupResetAndDestroy.h" +#include "calencheckboxsettingitem.h" +#include "calennestedsettingitem.h" +#include "calenbooleansettingitem.h" +#include "calenviewinfo.h" + +#include +#include +#include "calencustomisationmanager.h" +//#include + +#include +#include // for CAknSettingStyleListBox +#include // CColumnListBoxData +#include +#include // CEnvironmentChangeNotifier +#include // CRepository +#include // KCRUidCalendar + + +#ifdef RD_CALEN_EXTERNAL_CAL +#include + +// MIME types +_LIT8(KContentTypeCalendar, "text/calendar"); + +#endif //RD_CALEN_EXTERNAL_CAL + + +#include + + + +const TInt KDisablePluginEnablement = 2; + +void ListMailboxesL( + CMRMailboxUtils& aMbUtils, + RArray& aMailBoxes ) + { + aMbUtils.ListMailBoxesL( aMailBoxes ); + + // Get MR Viewer implementations + RImplInfoPtrArrayOwn implArray; + CleanupClosePushL( implArray ); + const TUid mrViewersIface = {KMRViewersInterfaceUID}; + REComSession::ListImplementationsL( mrViewersIface, implArray ); + TBuf16 mbName; + + TInt index(0); + while (index < aMailBoxes.Count() ) + { + TBool matchingMRViewerFound( EFalse ); + TInt mrviewerImplCount( implArray.Count() ); + for( TInt j=0; j < mrviewerImplCount && !matchingMRViewerFound; ++j ) + { + CnvUtfConverter::ConvertToUnicodeFromUtf8( mbName, implArray[j]->DataType() ); + if( aMailBoxes[index].iMtmUid.Name().CompareF(mbName) == 0 ) + { + // Found a match. This mailbox would have been shown in the settings list. + matchingMRViewerFound = ETrue; + } + } + + if ( !matchingMRViewerFound ) + { + aMailBoxes.Remove( index ); + } + else + { + ++index; + } + } + CleanupStack::PopAndDestroy(); // implArray + } + +// ========================= MEMBER FUNCTIONS ================================ + + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::NewL +// Symbian two-phased constructor. +// Two-phased constructor. Does NOT take ownership of aParentControl or aListBox. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +EXPORT_C CCalenSettingsUiContainer* CCalenSettingsUiContainer::NewL( + CCoeControl* aParentControl, + CAknSettingStyleListBox& aListBox, + CCalenGlobalData& aGlobalData, + CCalenCustomisationManager& aCustomisationManager ) + { + TRACE_ENTRY_POINT; + + CCalenSettingsUiContainer* self = new(ELeave) CCalenSettingsUiContainer( aParentControl, + aListBox, + aGlobalData, + aCustomisationManager ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + TRACE_EXIT_POINT; + return self; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::ConstructL +// Symbian OS default constructor +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::ConstructL() + { + TRACE_ENTRY_POINT; + + iSetting = CCalenSetting::InstanceL(); + + // Initialize TLocale watcher + TCallBack callback( LocaleCallbackL, this ); + iLocaleChangeNotifier = + CEnvironmentChangeNotifier::NewL( EActivePriorityLogonA, callback ); + + // Initialize Central Repository watcher + iRepository = CRepository::NewL( KCRUidCalendar ); + iCenRepNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iRepository ); + + iSettingItemArray = new( ELeave )CAknSettingItemArray( 2, 0, 0 ); + + if( iGlobalData.InterimUtilsL().MRViewersEnabledL() ) + { + LoadMailboxSettingsL(); + } + + iLocaleChangeNotifier->Start(); + iCenRepNotifyHandler->StartListeningL(); + + iPageStatus = EFalse; + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::~CCalenSettingsUiContainer +// Destructor +// ---------------------------------------------------------------------------- +// +CCalenSettingsUiContainer::~CCalenSettingsUiContainer() + { + TRACE_ENTRY_POINT; + + delete iLocaleChangeNotifier; + if( iCenRepNotifyHandler ) + { + iCenRepNotifyHandler->StopListening(); + delete iCenRepNotifyHandler; + } + + delete iRepository; + + iMailBoxes.Close(); + if( iSettingItemArray ) + { + iSettingItemArray->ResetAndDestroy(); + delete iSettingItemArray; + } + + if ( iSetting ) + { + iSetting->Release(); + } + +#ifdef RD_CALEN_EXTERNAL_CAL + delete iServiceHandler; +#endif //RD_CALEN_EXTERNAL_CAL + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::CCalenSettingsUiContainer +// Default constructor +// ---------------------------------------------------------------------------- +// +CCalenSettingsUiContainer::CCalenSettingsUiContainer( CCoeControl* aParentControl, + CAknSettingStyleListBox& aListBox, + CCalenGlobalData& aGlobalData, + CCalenCustomisationManager& aCustomisationManager ) + : iGlobalData( aGlobalData ), + iParentControl( aParentControl ), + iListBox( aListBox ), + iCustomisationManager( aCustomisationManager ), + iIgnoreNextSettingsNotification( EFalse ), + iIgnoreFirstLocaleChange( ETrue ) + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddCustomSettingsWithLinkL +// Adds all settings from customisations. This will get a link from the front +// settings page. Removes items from the array when ownership transferred +// away from the array. +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddCustomSettingsWithLinkL( RPointerArray& aSettings, + const TDesC& aName, + TInt aOrdinal ) + { + TRACE_ENTRY_POINT; + + // CCalenNestedSettingItem will take items out of aSettings array and + // take ownership of removed items. + CCalenNestedSettingItem* item = new( ELeave )CCalenNestedSettingItem( 0, + aSettings, + aName ); + CleanupStack::PushL( item ); + + // The followng text should never actually be displayed on screen + item->SetEmptyItemTextL( KNullDesC ); + + // Construct setting item with parametrized values + item->ConstructL( EFalse, aOrdinal, aName, NULL, + R_CALEN_EMPTY_SETTING_PAGE, EAknSetListBox, + NULL, R_CALEN_EMPTY_POPUP_SETTING_TEXTS ); + + iSettingItemArray->InsertL( aOrdinal, item ); + + CleanupStack::Pop( item ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddSingleCustomSettingL +// Adds a setting from customisations. This will go directly into the front +// settings page. Takes ownership of aSetting when the function completes. +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddSingleCustomSettingL( CAknSettingItem* aSetting, + TInt aOrdinal ) + { + TRACE_ENTRY_POINT; + + iSettingItemArray->InsertL( aOrdinal, aSetting ); // Takes ownership of aSetting. + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddCustomSettingsItemsL +// Adds all settings from customisations. +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddCustomSettingsItemsL( TInt& aOrdinal ) + { + TRACE_ENTRY_POINT; + + const RArray& plugins = iCustomisationManager.ActivePlugins(); + + RPointerArray settings; + CleanupResetAndDestroyPushL( settings ); + + for ( TInt i( 0 ); i 1 ) + { + const RImplInfoPtrArray& pluginInfo = iCustomisationManager.PluginInfoArray(); + TInt pluginIndex = KErrNotFound; + + for ( TInt j( 0 ); jImplementationUid() == plugins[i] ) + { + pluginIndex = j; + break; + } + } + + ASSERT( pluginIndex != KErrNotFound ); + const TDesC& pluginName = pluginInfo[pluginIndex]->DisplayName(); + + AddCustomSettingsWithLinkL( settings, pluginName, aOrdinal++ ); + } + else if ( settings.Count() == 1 ) + { + // This function takes ownership of the setting item we pass it, + // when the function completes. + AddSingleCustomSettingL( settings[0], aOrdinal++ ); + settings.Remove( 0 ); + } + + ASSERT( settings.Count() == 0 ); + } + + CleanupStack::PopAndDestroy( &settings ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddPluginSettingItemL +// Adds a settings item allowing the user to enable/disable plugins and +// change their priority. +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddPluginSettingItemL( TInt& aOrdinal ) + { + TRACE_ENTRY_POINT; + + const RImplInfoPtrArray& plugins = iCustomisationManager.PluginInfoArray(); + TInt pluginCount = plugins.Count(); + + if ( pluginCount > 0 ) + { + // Check to see if any of the plugins are able to be be enable or + // disabled + TBool pluginFound( EFalse ); + TBuf<100> displayName; + for ( TInt index(0); index < pluginCount && !pluginFound; ++index ) + { + // if the display name is empty and the plugin is in ROM the + // plugin can not be disabled + TInt version = plugins[index]->Version(); + TBool romBased = plugins[index]->RomBased(); + displayName = plugins[index]->DisplayName(); + + if ( ( version != KDisablePluginEnablement ) || !romBased ) + { + pluginFound = ETrue; + } + } + + + + if ( pluginFound ) + { + //There will not be any sort of settings item for plugins which are not part of settings + TInt countOfAvailability = iSetting->PluginAvailability().Count(); + + if(countOfAvailability) + { + //If available plugins(which has settings) count is > 1 its check box or toggle button. + if(countOfAvailability > 1 ) + { + CCalenCheckboxSettingItem* settingItem + = new( ELeave )CCalenCheckboxSettingItem( ECalenPluginListItemId, + iCustomisationManager ); + + CleanupStack::PushL( settingItem ); + + // The followng text should never actually be displayed on screen + settingItem->SetEmptyItemTextL( KNullDesC ); + + + // Construct setting item with parametrized values + HBufC* itemTitle = StringLoader::LoadLC( R_CALEN_SETTING_PLUGINLIST_TITLE ); + settingItem->ConstructL( EFalse, aOrdinal, *itemTitle, NULL, + R_CALEN_SETTING_PLUGINLIST, EAknSetListBox, + NULL, R_CALEN_EMPTY_POPUP_SETTING_TEXTS ); + + iSettingItemArray->InsertL( aOrdinal, settingItem ); + + CleanupStack::PopAndDestroy( itemTitle ); + CleanupStack::Pop( settingItem ); + aOrdinal++; + } + else + { + CCalenBooleanSettingItem* settingItem = + CCalenBooleanSettingItem::NewLC(ECalenPluginListItemId,aOrdinal,iCustomisationManager); + iSettingItemArray->InsertL( aOrdinal, settingItem ); + CleanupStack::Pop( settingItem ); + aOrdinal++; + } + } + } + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddDefaultViewItemL +// Adds a setting item to allow selection of the default view. Includes custom +// views in the view cycle array. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddDefaultViewItemL( TInt& aBuffer, + TInt aId, + TInt aTitleResource, + TInt aSettingPageResource, + TInt aOrdinal ) + { + TRACE_ENTRY_POINT; + + // Create new setting item + CAknEnumeratedTextPopupSettingItem* settingItem = + new( ELeave )CAknEnumeratedTextPopupSettingItem( aId, aBuffer ); + CleanupStack::PushL( settingItem ); + + // The followng text should never actually be displayed on screen + _LIT( KNone, "None" ); + settingItem->SetEmptyItemTextL( KNone ); + + // Construct setting item with parametrized values + HBufC* itemTitle = StringLoader::LoadLC( aTitleResource ); + settingItem->ConstructL( EFalse, aOrdinal, *itemTitle, NULL, + aSettingPageResource, EAknCtPopupSettingList, + NULL, R_CALEN_EMPTY_POPUP_SETTING_TEXTS ); + + CArrayPtr* items = settingItem->EnumeratedTextArray(); + + const RPointerArray& views = iCustomisationManager.Views(); + const RArray& activePlugins = iCustomisationManager.ActivePlugins(); + + TBool isDefViewValid( EFalse ); + + TInt numViews = views.Count(); + for ( TInt i( 0 ); iPluginUid(); + TInt position = activePlugins.Find( pluginUid ); + + // If the view is from plugin or native view with cycle position, + // then add it to the default view list + if((position != KErrNotFound) || + ( view->CyclePosition() != CCalenView::ENoCyclePosition )) + { + TInt viewUidInt = view->ViewUid().iUid; + + if ( viewUidInt == iDefView ) + { + isDefViewValid = ETrue; + } + + CAknEnumeratedText* item = new( ELeave )CAknEnumeratedText( viewUidInt, + view->SettingsName().AllocL() ); + items->AppendL( item ); + } + } + + if ( !isDefViewValid ) + { + // Default view is no longer valid (could be first ever load, or could be + // a 3rd party plugin's view used to be the default but is not removed). + // Set default to the first in the view cycle array. + TInt defViewIndex( 0 ); + while ( views[defViewIndex]->CyclePosition() == CCalenView::ENoCyclePosition ) + { + defViewIndex++; + } + + iDefView = views[defViewIndex]->ViewUid().iUid; + iSetting->SetDefaultView( TUid::Uid( iDefView ) ); + } + + settingItem->HandleTextArrayUpdateL(); + + // Append item to settingitem-array + iSettingItemArray->InsertL( aOrdinal, settingItem ); + + CleanupStack::PopAndDestroy( itemTitle ); + CleanupStack::Pop( settingItem ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddSnoozeTimeItemL +// Adds an alarm snooze time item +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddSnoozeTimeItemL( TInt aOrdinal, + CArrayPtr* aIconArray, + TInt& aSnoozeTime) + { + TRACE_ENTRY_POINT; + + CCalenSliderSettingItem* settingItem = + new( ELeave )CCalenSliderSettingItem( ECalenSnoozeTimeItemId, + aSnoozeTime, + R_SNOOZE_TIME_SLIDER ); + CleanupStack::PushL( settingItem ); + + HBufC* itemTitle = StringLoader::LoadLC( R_QTN_CALE_SET_SNOOZE_TIME ); + + settingItem->ConstructL( EFalse, + aOrdinal, + *itemTitle, + aIconArray, + R_SNOOZE_TIME_SETTING_PAGE, + EAknCtSlider ); + + iSettingItemArray->InsertL( aOrdinal, settingItem ); + + CleanupStack::PopAndDestroy( itemTitle ); + CleanupStack::Pop( settingItem ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// AddEnumerationItemL() +// Add integer type of settings item +// Integer type item can have multiple choices shown as radiobutton list. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddEnumerationItemL( TInt& aBuffer, + TInt aId, + TInt aTitleResource, + TInt aSettingPageResource, + TInt aAssociatedResource, + TInt aOrdinal ) + { + TRACE_ENTRY_POINT; + + // Create new setting item + CAknSettingItem* settingItem = + new ( ELeave ) CAknEnumeratedTextPopupSettingItem( aId, aBuffer ); + CleanupStack::PushL( settingItem ); + + // Construct setting item with parametrized values + HBufC* itemTitle = StringLoader::LoadLC( aTitleResource ); + settingItem->ConstructL( EFalse, aOrdinal, *itemTitle, NULL, + aSettingPageResource, EAknCtPopupSettingList, + NULL, aAssociatedResource ); + + // Append item to settingitem-array + iSettingItemArray->InsertL( aOrdinal, settingItem ); + + CleanupStack::PopAndDestroy( itemTitle ); + CleanupStack::Pop( settingItem ); + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddBinaryItemL() +// Add binary type (true/false) settings item +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddBinaryItemL( TBool& aBuffer, + TInt aId, + TInt aTitleResource, + TInt aSettingPageResource, + TInt aAssociatedResource, + TInt aOrdinal ) + { + TRACE_ENTRY_POINT; + + // Create new setting item + CAknSettingItem* settingItem = + new ( ELeave ) CAknBinaryPopupSettingItem( aId, aBuffer ); + CleanupStack::PushL( settingItem ); + + // Construct setting item with parametrized values + HBufC* itemTitle = StringLoader::LoadLC( aTitleResource ); + settingItem->ConstructL( EFalse, aOrdinal, *itemTitle, NULL, + aSettingPageResource, EAknCtPopupSettingList, + NULL, aAssociatedResource ); + + // Append item to settingitem-array + iSettingItemArray->InsertL( aOrdinal, settingItem ); + + CleanupStack::PopAndDestroy( itemTitle ); + CleanupStack::Pop( settingItem ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::AddAlarmToneItemL +// Adds an item to the settings page which contains information about +// which tone should be played when an alarm expires. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::AddAlarmToneItemL( TInt aOrdinal ) + { + TRACE_ENTRY_POINT; + + CCalenFileListSettingItem* settingItem = + new ( ELeave ) CCalenFileListSettingItem( ECalenAlarmToneItemId ); + CleanupStack::PushL( settingItem ); + + // Construct setting item with parametrized values + HBufC* itemTitle = StringLoader::LoadLC( R_CALEN_SETTING_ALARMTONE_TITLE ); + settingItem->ConstructL( EFalse, aOrdinal, *itemTitle, NULL, + NULL, NULL, NULL, NULL ); + + // Append item to settingitem-array + iSettingItemArray->InsertL( aOrdinal, settingItem ); + + CleanupStack::PopAndDestroy( itemTitle ); + CleanupStack::Pop( settingItem ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::CreateMailboxSettingsItemL +// Creates the settings item for selection of the default meeting request +// mailbox. This should only be called when MR viewers are enabled. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::CreateMailboxSettingsItemL( TInt aOrdinal ) + { + TRACE_ENTRY_POINT; + + // Mailbox settings are shown when we have a MR viewers implementation. + ASSERT( iGlobalData.InterimUtilsL().MRViewersEnabledL() ); + CMRMailboxUtils& mailboxUtils = iGlobalData.MRMailboxUtilsL(); + CAknEnumeratedTextPopupSettingItem* settingItem = + new ( ELeave ) CAknEnumeratedTextPopupSettingItem( ECalenDefaultMailboxId, + iDefMailbox ); + CleanupStack::PushL( settingItem ); + + // Construct setting item with parametrized values + HBufC* itemTitle = StringLoader::LoadLC( R_CALEN_SETTING_DEFAULTMAILBOX_TITLE ); + // The resources loaded up here are empty as the items need to be dynamically updated. + + settingItem->SetEmptyItemTextL( KNullDesC ); + + settingItem->ConstructL( EFalse, aOrdinal, *itemTitle, NULL, + R_CALEN_SETTING_DEFAULTMAILBOX, EAknCtPopupSettingList, + NULL, R_CALEN_EMPTY_POPUP_SETTING_TEXTS ); + + CArrayPtr* items = settingItem->EnumeratedTextArray(); + + RImplInfoPtrArrayOwn implArray; + CleanupClosePushL( implArray ); + //Get all MRViewers Implementation + CMRMailboxUtils::TMailboxInfo defaultMailbox; + const TUid mrViewersIface = {KMRViewersInterfaceUID}; + REComSession::ListImplementationsL( mrViewersIface, implArray ); + + TBuf16 mbName; + TInt enumerationCounter = 0; + + for( TInt i=0; i < iMailBoxes.Count(); ++i ) + { + for( TInt j=0; j < implArray.Count(); ++j ) + { + CnvUtfConverter::ConvertToUnicodeFromUtf8( mbName, implArray[j]->DataType() ); + if( iMailBoxes[i].iMtmUid.Name().CompareF(mbName) == 0 ) + { + // Found a match + CAknEnumeratedText* item = new(ELeave) CAknEnumeratedText( enumerationCounter, + iMailBoxes[i].iName.AllocL() ); + items->AppendL( item ); + ++enumerationCounter; + } + } + } + + CleanupStack::PopAndDestroy(); //implArray + + settingItem->HandleTextArrayUpdateL(); + + // Append item to settingitem-array + iSettingItemArray->InsertL( aOrdinal, settingItem ); + + CleanupStack::PopAndDestroy( itemTitle ); + CleanupStack::Pop( settingItem ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::UpdateListBoxL +// Update listbox item +// ---------------------------------------------------------------------------- +// +EXPORT_C void CCalenSettingsUiContainer::UpdateListBoxL() + { + TRACE_ENTRY_POINT; + + iListBox.HandleItemAdditionL(); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::ConstructListBoxL +// Update listbox item +// Items are added manually, instead of loading them from resources +// ---------------------------------------------------------------------------- +// +EXPORT_C void CCalenSettingsUiContainer::ConstructListBoxL() + { + TRACE_ENTRY_POINT; + + iListBox.ConstructL( iParentControl, EAknListBoxSelectionList ); + + LoadCurrentValuesL(); + + // Create items to array + CreateListBoxItemsL(); + + // Set array to listbox + CTextListBoxModel* model = iListBox.Model(); + model->SetItemTextArray( iSettingItemArray ); + // Ownership retained by us + model->SetOwnershipType( ELbmDoesNotOwnItemArray ); + + iSettingItemArray->RecalculateVisibleIndicesL(); + iListBox.CreateScrollBarFrameL(); + iListBox.ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::CreateListBoxItemsL +// Update listbox item +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::CreateListBoxItemsL() + { + TRACE_ENTRY_POINT; + + TInt ordinal = 0; + + AddAlarmToneItemL( ordinal++ ); + + CArrayPtr* iconArray = iListBox.ItemDrawer()->ColumnData()->IconArray(); + + if( !iconArray ) + { + iconArray = new( ELeave )CArrayPtrFlat( 1 ); + iListBox.ItemDrawer()->ColumnData()->SetIconArrayL( iconArray ); // ownership transfered + } + + AddSnoozeTimeItemL( ordinal++, iconArray, iSnoozeTime ); + + AddDefaultViewItemL( iDefView, + ECalenDefaultViewItemId, + R_CALEN_SETTING_DEFAULTVIEW_TITLE, + R_CALEN_SETTING_DEFAULTVIEW, + ordinal++ ); + + AddEnumerationItemL( iWeekFormat, + ECalenWeekFormatItemId, + R_CALEN_SETTING_WEEKFORMAT_TITLE, + R_CALEN_SETTING_WEEKFORMAT, + R_CALEN_WEEKFORMAT_TEXTS, + ordinal++ ); + + AddEnumerationItemL( iWeekNumberEnable, + ECalenWeekNumberItemId, + R_CALEN_SETTING_WEEKNUMBER_TITLE, + R_CALEN_SETTING_WEEKNUMBER, + R_CALEN_WEEKNUMBER_TEXTS, + ordinal++ ); + + // Always add this in. We will set it hidden when it's not needed (i.e. when the + // week start is set to anything other than "Monday") at the bottom of this function. + AddEnumerationItemL( iWeekTitle, + ECalenWeekTitleItemId, + R_CALEN_SETTING_WEEKTITLE_TITLE, + R_CALEN_SETTING_WEEKTITLE, + R_CALEN_WEEKTITLE_TEXTS, + ordinal++ ); + + +#ifdef RD_CALEN_EXTERNAL_CAL + // add external calendar support if available. + TBool isExt=ExtCalendarAvailableL(); + if (isExt) + { + AddEnumerationItemL( iExtCalendar, + ECalenExtCalendarItemId, + R_CALEN_SETTING_EXT_CALENDAR_TITLE, + R_CALEN_EXT_CALENDAR_SETTING_PAGE, + R_CALEN_EXT_CALENDAR_SETTING_TEXTS, + ordinal++ ); + } + +#endif //RD_CALEN_EXTERNAL_CAL + + // Only add the mailbox choice when the Meeting Request functionality is there. + if( iGlobalData.InterimUtilsL().MRViewersEnabledL() ) + { + CreateMailboxSettingsItemL( ordinal++ ); // increments ordinal + } + +#ifdef RD_SCALABLE_UI_V2_NO_TOOLBAR_SETTING + if( AknLayoutUtils::PenEnabled() ) + { + AddBinaryItemL( iToolbar, + ECalenToolbarItemId, + R_CALEN_SETTING_TOOLBAR_TITLE, + R_CALEN_SETTING_TOOLBAR, + R_CALEN_TOOLBAR_TEXTS, + ordinal++ ); + } +#endif // RD_SCALABLE_UI_V2_NO_TOOLBAR_SETTING + + AddPluginSettingItemL( ordinal ); + + AddCustomSettingsItemsL( ordinal ); + ++ordinal; + + // Hide the week title setting if the week start is anything other than Monday. + Item( ECalenWeekTitleItemId )->SetHidden( !ShouldShowWeekTitleItem() ); + Item( ECalenWeekNumberItemId )->SetHidden( !ShouldShowWeekTitleItem() ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::CurrentFeatureId +// Get the currently selected feature +// ---------------------------------------------------------------------------- +// +EXPORT_C TInt CCalenSettingsUiContainer::CurrentFeatureId() const + { + TRACE_ENTRY_POINT; + + if ( iSettingItemArray ) + { + TRACE_EXIT_POINT; + return iSettingItemArray->MdcaCount(); + } + else + { + TRACE_EXIT_POINT; + return 0; + } + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::GetHelpContext +// Get help for this view +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + TRACE_ENTRY_POINT; + + aContext.iMajor = KUidCalendar; + // This is specified in HRH file. + aContext.iContext = KCALE_HLP_SETTINGS; + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::ShouldShowWeekTitleItem +// Returns ETrue if the start of the week is set to Monday. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +TBool CCalenSettingsUiContainer::ShouldShowWeekTitleItem() const + { + TRACE_ENTRY_POINT; + TDay day = static_cast( iWeekFormat ); + TRACE_EXIT_POINT; + return ( day == EMonday ); + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::Item +// Returns the settings item associated with the given setting list item id. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +CAknSettingItem* CCalenSettingsUiContainer::Item( TSettingListItemId aId ) + { + TRACE_ENTRY_POINT; + for( TInt i = 0; i < iSettingItemArray->Count(); ++i ) + { + if( iSettingItemArray->At(i)->Identifier() == aId ) + { + TRACE_EXIT_POINT; + return iSettingItemArray->At( i ); + } + } + ASSERT( EFalse ); + TRACE_EXIT_POINT; + return NULL; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::ValidateWeekTitleItemL +// Hides or shows the week title item based on whether the beginning of the +// week is set to Monday or not. This should only be called on the week format item. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::ValidateWeekTitleItemL( CAknSettingItem *aItem ) + { + TRACE_ENTRY_POINT; + + ASSERT( aItem->Identifier() == ECalenWeekFormatItemId ); + TBool wasShown = ShouldShowWeekTitleItem(); + aItem->StoreL(); // Updates iWeekFormat variable + TBool doShow = ShouldShowWeekTitleItem(); + + if ( wasShown != doShow ) + { + Item( ECalenWeekTitleItemId )->SetHidden( !doShow ); + Item( ECalenWeekNumberItemId )->SetHidden( !doShow ); + + if ( !doShow ) + { + Item( ECalenWeekTitleItemId )->LoadL(); + Item( ECalenWeekNumberItemId )->LoadL(); + } + + iSettingItemArray->RecalculateVisibleIndicesL(); + iListBox.HandleItemAdditionL(); + iListBox.UpdateScrollBarsL(); + } + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::ShowOrHideWeekTitleL +// Shows or hides the week title setting as appropriate. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::ShowOrHideWeekTitleL() + { + TRACE_ENTRY_POINT; + + CAknSettingItem* wkTitle = Item( ECalenWeekTitleItemId ); + const TInt currentIndex( iListBox.CurrentItemIndex() ); + + const TBool wasLookingAtWeekTitle( currentIndex == wkTitle->VisibleIndex() ); + const TBool doShow( ShouldShowWeekTitleItem() ); + + wkTitle->SetHidden( !doShow ); + + // Make sure we're still looking at a setting item after one was removed. + if ( !doShow && wasLookingAtWeekTitle ) + { + iListBox.SetCurrentItemIndex( Item( ECalenWeekFormatItemId )->VisibleIndex() ); + } + + iSettingItemArray->RecalculateVisibleIndicesL(); + iListBox.HandleItemAdditionL(); + iListBox.UpdateScrollBarsL(); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::HandleListBoxSelectionL +// Handles list box selection events. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +EXPORT_C void CCalenSettingsUiContainer::HandleListBoxSelectionL( TInt aCommand ,TBool& aPageStatus) + { + TRACE_ENTRY_POINT; + + TInt index( iListBox.CurrentItemIndex() ); + + if ( index >= 0 ) // index is -1 if there are no items in the list + { + CAknSettingItem* item; + TDay day = static_cast( iWeekFormat ); + + // If the starting day of a week is other than Monday, "Title of week view" setting item + // is not displayed. For the item below "Week Format", the index in iSettingItemArray + // is one more than CurrentItemIndex(). + if( ( day != EMonday && index >= 4 ) ) + { + item = iSettingItemArray->At( index + 1); + } + else + { + item = iSettingItemArray->At( index ); + } + // Open edit dialog if EAknCmdOpen, invert the value otherwise + aPageStatus = ETrue; + iPageStatus = aPageStatus; + // for week title only two options available + // so let's toggle instead of opening setting page + if( (item->Identifier() != ECalenWeekTitleItemId) && (item->Identifier() != ECalenWeekNumberItemId)) + { + item->EditItemL( aCommand == EAknCmdOpen ); + } + aPageStatus = EFalse; + iPageStatus = aPageStatus; + TBool isNativeSettingChange = ETrue; + + if(item->Identifier() > 0 ) + { + // Save the settings change, so if we have two settings windows open + // the background one can be updated. + switch( item->Identifier() ) + { + case ECalenWeekFormatItemId: + // item->StoreL() gets called in ValidateWeekTitleItemL + ValidateWeekTitleItemL( item ); + iSetting->SetWeekFormat( static_cast( iWeekFormat ) ); + break; + case ECalenAlarmToneItemId: + item->StoreL(); + // CCalenFileListSettingItem::StoreL saves the filename to cenrep. + break; + case ECalenSnoozeTimeItemId: + item->StoreL(); + iSetting->SetSnoozeTime( iSnoozeTime ); + break; + case ECalenDefaultViewItemId: + item->StoreL(); + iSetting->SetDefaultView( TUid::Uid( iDefView ) ); + break; + case ECalenWeekTitleItemId: + //item->StoreL(); + // toggling option done here + iSetting->SetWeekTitle( static_cast( iWeekTitle ) == EWeekTitleNumber ? + EWeekTitleDuration : EWeekTitleNumber ); + iWeekTitle = iSetting->WeekTitle(); + item->LoadL(); + item->UpdateListBoxTextL(); + break; + case ECalenWeekNumberItemId: + // toggling option done here + iSetting->SetWeekNumber( static_cast( iWeekNumberEnable ) == EWeekNumberOn ? + EWeekNumberOff : EWeekNumberOn ); + iWeekNumberEnable = iSetting->WeekNumberEnable(); + item->LoadL(); + item->UpdateListBoxTextL(); + break; + case ECalenDefaultMailboxId: + item->StoreL(); + StoreMailboxSettingsL(); + break; + #ifdef RD_CALEN_EXTERNAL_CAL + case ECalenExtCalendarItemId: + item->StoreL(); + iSetting->SetExtCalendar( iExtCalendar); + break; + #endif // RD_CALEN_EXTERNAL_CAL + #ifdef RD_SCALABLE_UI_V2_NO_TOOLBAR_SETTING + case ECalenToolbarItemId: + item->StoreL(); + iSetting->SetToolbar( iToolbar ); + break; + #endif // RD_SCALABLE_UI_V2_NO_TOOLBAR_SETTING + case ECalenPluginListItemId: + // No item to store, CCalenCheckboxSettingItem updated + // the customisation manager and CCalenSetting. Need to + // redraw the listboc + item->StoreL(); + PluginListChangedL(); + + break; + default: // Custom setting. + item->StoreL(); + // Custom settings won't generate a repository change, so keep listening. + isNativeSettingChange = EFalse; + break; + } + + if ( isNativeSettingChange ) + + { + // Don't listen for changes to cenrep/TLocale for this settings change. + iIgnoreNextSettingsNotification = ETrue; + iSetting->SaveL(); + } + + + iListBox.DrawItem( index ); + } + } + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::PluginListChangedL() +// Cenrep watcher callback +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::PluginListChangedL() + { + iSettingItemArray->ResetAndDestroy(); + + // Update the default view as it would have changed after enabling/disabling plugins + iDefView = iSetting->DefaultView().iUid; + iWeekFormat = iSetting->WeekFormat(); + iWeekTitle = iSetting->WeekTitle(); + iSnoozeTime = iSetting->SnoozeTime(); + CreateListBoxItemsL(); + + iSettingItemArray->RecalculateVisibleIndicesL(); + iListBox.HandleItemAdditionL(); + iListBox.UpdateScrollBarsL(); + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::HandleNotifyGeneric +// Cenrep watcher callback +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::HandleNotifyGeneric( TUint32 aId ) + { + TRACE_ENTRY_POINT; + + // Make sure it wasn't this object that generated the settings change. + if ( iIgnoreNextSettingsNotification ) + { + iIgnoreNextSettingsNotification = EFalse; + } + else + { + PIM_TRAPD_HANDLE( HandleExternalSettingsChangedL(aId)); + } + + // Use another trap to make sure we start listening again, regardless + // of whether the previous function left or not. + PIM_TRAPD_HANDLE( iCenRepNotifyHandler->StartListeningL() ); + + TRACE_EXIT_POINT + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::HandleNotifyError +// Cenrep watcher error callback +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::HandleNotifyError( TUint32 /*aId*/, + TInt /*aError*/, + CCenRepNotifyHandler* /*aHandler*/ ) + { + TRACE_ENTRY_POINT; + + PIM_TRAPD_HANDLE( iCenRepNotifyHandler->StartListeningL() ); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::LocaleCallbackL +// Locale watcher callback +// ---------------------------------------------------------------------------- +// +TInt CCalenSettingsUiContainer::LocaleCallbackL( TAny* aThisPtr ) + { + TRACE_ENTRY_POINT; + + CCalenSettingsUiContainer* ptr = static_cast( aThisPtr ); + ptr->DoLocaleCallbackL(); + + TRACE_EXIT_POINT; + return FALSE; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::DoLocaleCallbackL +// Implementation of locale watcher callback +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::DoLocaleCallbackL() + { + TRACE_ENTRY_POINT; + + if ( iLocaleChangeNotifier->Change() & EChangesLocale ) + { + if( iIgnoreFirstLocaleChange ) + { + // When initialising the locale change observer, we get a notification + // when observing starts. We ignore this as we don't need to act on it. + iIgnoreFirstLocaleChange = EFalse; + } + else + { + // Make sure it wasn't this object that generated the settings change. + if ( iIgnoreNextSettingsNotification ) + { + iIgnoreNextSettingsNotification = EFalse; + } + else + { + HandleExternalSettingsChangedL(); + ShowOrHideWeekTitleL(); +// ValidateWeekTitleItemL( Item( ECalenWeekFormatItemId ) ); + } + } + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::HandleExternalSettingsChangedL +// Called when something else changed our settings +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::HandleExternalSettingsChangedL(TUint32 aId) + { + TRACE_ENTRY_POINT; + // Load from cenrep to member data. + LoadCurrentValuesL(); + + switch(aId) + { + case KCalendarPluginAvailability: + { + HandlePluginChange(); + if(!iPageStatus) + { + PluginListChangedL(); + } + } + break; + + default: + { + // If the starting day of a week is Monday, "Title of week view" setting item + // is also displayed. so the number of default items will be 5. + TInt maxDefaultSettingItems = ShouldShowWeekTitleItem()?5:4; + + for( TInt i=0; iAt( i )->LoadL(); + iSettingItemArray->At( i )->UpdateListBoxTextL(); + } + } + } + iListBox.HandleItemAdditionL(); + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::LoadCurrentValuesL +// Loads current values from cenrep. +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::LoadCurrentValuesL() + { + TRACE_ENTRY_POINT; + iSetting->LoadL(); + + iDefView = iSetting->DefaultView().iUid; + iWeekFormat = iSetting->WeekFormat(); + iWeekTitle = iSetting->WeekTitle(); + iWeekNumberEnable = iSetting->WeekNumberEnable(); + iSnoozeTime = iSetting->SnoozeTime(); +#ifdef RD_SCALABLE_UI_V2_NO_TOOLBAR_SETTING + iToolbar = iSetting->Toolbar(); +#endif + +#ifdef RD_CALEN_EXTERNAL_CAL + iExtCalendar = iSetting->ExtCalendar(); +#endif + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::StoreMailboxSettingsL +// Stores the mailbox settings. +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::StoreMailboxSettingsL() + { + TRACE_ENTRY_POINT; + + if( iGlobalData.InterimUtilsL().MRViewersEnabledL() ) + { + // iHasSelectedMailbox will be EFalse if we didn't select a MR MB previously. + // However, they might have selected one this time. + if( !iHasSelectedMailbox && iDefMailbox != 0 ) + { + iHasSelectedMailbox = ETrue; + --iDefMailbox; // This gets decremented as the first menu item was a blank, unselected choice. + } + + if( iHasSelectedMailbox ) + { + CMRMailboxUtils& mbUtils = iGlobalData.MRMailboxUtilsL(); + + ListMailboxesL( mbUtils, iMailBoxes ); + + RImplInfoPtrArrayOwn implArray; + CleanupClosePushL( implArray ); + const TUid mrViewersIface = {KMRViewersInterfaceUID}; + REComSession::ListImplementationsL( mrViewersIface, implArray ); + TBuf16 mbName; + + TInt enumValue = 0; // How many mailboxes we have been through so far that are visible to the user. + // Convert from the enumeration to the default mailbox id. + for( TInt i=0; i < iMailBoxes.Count(); ++i ) + { + for( TInt j=0; jDataType() ); + if( iMailBoxes[i].iMtmUid.Name().CompareF(mbName) == 0 ) + { + // Found a match. This mailbox would have been shown in the settings list. + if( enumValue == iDefMailbox ) + { + User::LeaveIfError( mbUtils.SetDefaultMRMailBoxL( iMailBoxes[iDefMailbox].iEntryId ) ); + break; + } + ++enumValue; + } + } + } + CleanupStack::PopAndDestroy(); // implArray + } + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::LoadMailboxSettingsL +// Loads the MR mailbox settings, if MR functionality is enabled. +// ---------------------------------------------------------------------------- +// +void CCalenSettingsUiContainer::LoadMailboxSettingsL() + { + TRACE_ENTRY_POINT; + + if( iGlobalData.InterimUtilsL().MRViewersEnabledL() ) + { + iHasSelectedMailbox = EFalse; + CMRMailboxUtils::TMailboxInfo defaultMailbox; + CMRMailboxUtils& mbUtils = iGlobalData.MRMailboxUtilsL(); + + ListMailboxesL( mbUtils, iMailBoxes ); + + TInt res = KErrNone; + TRAPD( err, res = mbUtils.GetDefaultMRMailBoxL( defaultMailbox ) ); + if( res == KErrNone && err == KErrNone ) + { + // Convert from the default mailbox to an enumeration. + for( TInt i=0; iSetServiceClass( TUid::Uid( KAiwClassBase ) ); + crit->SetMaxProviders( 1 ); + //crit->SetId(0x10282e42); + RCriteriaArray array; + array.Append( crit ); + // attach to the service provider if available, owenership of array is not transferred. + iServiceHandler->AttachL( array ); + + // if there is a provider here is count of suitable ones, if not it is zero + TInt num=iServiceHandler->NbrOfProviders( crit ); + + // if we detach, dll is unloaded, we don't want that as it is likely that we need it again. + // iServiceHandler->DetachL( array ); + array.ResetAndDestroy(); + CleanupStack::Pop( crit ); + + TBool res = EFalse; + + if ( num > 0 ) + { + res = ETrue; + } + + TRACE_EXIT_POINT; + return res; + } + +#endif //RD_CALEN_EXTERNAL_CAL + +// ---------------------------------------------------------------------------- +// CCalenSettingsUiContainer::PluginUidFinder +// Matches a uid and a plugin uid. Used by when finding a uid to match the +// setting's array against the customisation manager's array. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +TBool CCalenSettingsUiContainer::PluginUidFinder( const TUid* aUid, + const CImplementationInformation& aArrayItem ) + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + return ( *aUid == aArrayItem.ImplementationUid() ); + } + +void CCalenSettingsUiContainer::HandlePluginChange() + { + TRACE_ENTRY_POINT; + + pluginAvail& pluginAvailablity = iSetting->PluginAvailability(); + for(TInt index = 0;index < pluginAvailablity.Count(); index++) + { + TRAP_IGNORE(iCustomisationManager.SetPluginAvailabilityL(pluginAvailablity[index].iUid, + pluginAvailablity[index].iEnabled)); + } + TRACE_EXIT_POINT; + } + +// End of file +