diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/View/src/CPbkSettingsDlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/View/src/CPbkSettingsDlg.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,465 @@ +/* +* Copyright (c) 2002 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: +* Provides methods for Settings list dialog for Phonebook. +* +*/ + + +// INCLUDE FILES +#include "CPbkSettingsDlg.h" // This class +#include "CPbkSettingsList.h" +#include +#include "PbkUID.h" +#include "PbkViewUtils.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include //iAvkonAppUi +#include +#include + +/// Unnamed namespace for local definitons +namespace { + +#ifdef _DEBUG +enum TPanicCode + { + EPanicPreCond_SetupPanesL, + EPanicPreCond_SaveTitlePaneL, + EPanicPreCond_ProcessCommandL, + EPanicPreCond_OfferKeyEventL + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbkSettingsDlg"); + User::Panic(KPanicText, aReason); + } +#endif // _DEBUG + +} // namespace + + +// ================= MEMBER FUNCTIONS ======================= + +/** + * Default constructor. + */ +CPbkSettingsDlg::CPbkSettingsDlg(CPbkContactEngine& aEngine) : + iEngine(aEngine), iUnderlyingViewReady(ETrue) + { + } + +/** + * Destructor. + */ +CPbkSettingsDlg::~CPbkSettingsDlg() + { + delete iSettingsList; + delete iNaviDecorator; + delete iWaitNote; + + // Restore the titlepane text + if (iTitlePane && iStoredTitlePaneText) + { + //iTitlePane takes ownership of iStoredTitlePaneText + iTitlePane->SetText(iStoredTitlePaneText); + } + + if (iAllContactsView) + { + iAllContactsView->Close(*this); + } + + iEikonEnv->RemoveFromStack(this); + } + +EXPORT_C CPbkSettingsDlg* CPbkSettingsDlg::NewL + (CPbkContactEngine& aEngine) + { + CPbkSettingsDlg* self = new(ELeave) CPbkSettingsDlg(aEngine); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +void CPbkSettingsDlg::ConstructL() + { + CAknDialog::ConstructL(R_PBK_SETTINGS_MENUBAR); + SaveTitlePaneL(); + + if (!iAllContactsView) + { + iAllContactsView = &iEngine.AllContactsView(); + // Register to receive view events + iAllContactsView->OpenL(*this); + } + + } + +EXPORT_C void CPbkSettingsDlg::ExecuteLD() + { + CAknDialog::ExecuteLD(R_PBK_SETTINGS_DIALOG); + } + +void CPbkSettingsDlg::PreLayoutDynInitL() + { + SetupPanesL(); + iEikonEnv->EikAppUi()->AddToStackL(this, ECoeStackPriorityDialog); + CreateSettingsListL(); + } + + +/** + * Creates the settings list. + */ +void CPbkSettingsDlg::CreateSettingsListL() + { + delete iSettingsList; + iSettingsList = NULL; + iSettingsList = CPbkSettingsList::NewL(iEngine); + iSettingsList->SetMopParent(this); + iSettingsList->MakeVisible(ETrue); + iSettingsList->ActivateL(); + iSettingsList->DrawDeferred(); + } + +void CPbkSettingsDlg::ProcessCommandL + (TInt aCommandId) + { + __ASSERT_DEBUG(iSettingsList, Panic(EPanicPreCond_ProcessCommandL)); + + // Hide all menus + HideMenu(); + + // Process view-specific commands + switch (aCommandId) + { + case EEikCmdExit: // FALLTHROUGH + case EAknCmdExit: // Exit calling application + { + CEikAppUi* appUi = iEikonEnv->EikAppUi(); + // Close this dialog first + delete this; + // Exit application + static_cast(appUi)->ProcessCommandL(aCommandId); + break; + } + + case EPbkCmdEditSetting: + { + TInt count = iSettingsList->SettingItemArray()->Count(); + for (TInt index = 0; index < count; ++index) + { + if (iSettingsList->SettingItemArray()->At(index)->Identifier() + == EPbkSettingNameOrder) + { + iSettingsList->SettingItemArray()-> + At(index)->EditItemL(ETrue); + iSettingsList->DrawDeferred(); + SaveSettingsL(); + } + } + break; + } + + default: + { + // Command not handled here, forward it to the app ui. + iEikonEnv->EikAppUi()->HandleCommandL(aCommandId); + break; + } + } + } + + +TKeyResponse CPbkSettingsDlg::OfferKeyEventL + (const TKeyEvent& aKeyEvent, + TEventCode aType) + { + __ASSERT_DEBUG(iSettingsList, Panic(EPanicPreCond_OfferKeyEventL)); + + // Handle ok key + if (aType == EEventKey && aKeyEvent.iCode == EKeyOK) + { + // Now that there are more than two choices, we must open the + // selection popup + TKeyResponse response = + iSettingsList->OfferKeyEventL(aKeyEvent, aType); + SaveSettingsL(); + return response; + } + + if (aType == EEventKey && aKeyEvent.iCode == EKeyEscape) + { + AttemptExit(); + return EKeyWasConsumed; + } + + // Let the base class handle the event + return CAknDialog::OfferKeyEventL(aKeyEvent, aType); + } + +void CPbkSettingsDlg::AttemptExit() + { + delete this; + } + +/** + * Setups the title and navi pane. + */ +void CPbkSettingsDlg::SetupPanesL() + { + __ASSERT_DEBUG(!iNaviDecorator && iTitlePane, + Panic(EPanicPreCond_SetupPanesL)); + + // Read and display the new text in title pane + HBufC* titleText = iCoeEnv->AllocReadResourceLC + (R_QTN_PHOB_SET_TITLE); + iTitlePane->SetTextL(*titleText); + CleanupStack::PopAndDestroy(); // titleText + + // Setup navi pane + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + if (statusPane && statusPane->PaneCapabilities + (TUid::Uid(EEikStatusPaneUidNavi)).IsPresent()) + { + // Get pane + CAknNavigationControlContainer* naviPane = + static_cast + (statusPane->ControlL(TUid::Uid(EEikStatusPaneUidNavi))); + TResourceReader reader; + iCoeEnv->CreateResourceReaderLC(reader, R_PBK_SETTINGS_NAVILABEL); + + // Create new navi decorator + iNaviDecorator = naviPane->ConstructNavigationDecoratorFromResourceL + (reader); + naviPane->PushL(*iNaviDecorator); + CleanupStack::PopAndDestroy(); // reader + } + } + +/** + * Saves title pane. + */ +void CPbkSettingsDlg::SaveTitlePaneL() + { + __ASSERT_DEBUG(!iTitlePane && !iStoredTitlePaneText, + Panic(EPanicPreCond_SaveTitlePaneL)); + + CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane(); + if (statusPane && statusPane->PaneCapabilities + (TUid::Uid(EEikStatusPaneUidTitle)).IsPresent()) + { + // Store the title pane + CAknTitlePane* titlePane = static_cast + (statusPane->ControlL(TUid::Uid(EEikStatusPaneUidTitle))); + + delete iTitlePane; + iTitlePane = NULL; + iTitlePane = titlePane; + + // Store the old text + iStoredTitlePaneText = titlePane->Text()->AllocL(); + } + } + +/** + * Saves settings. + */ +void CPbkSettingsDlg::SaveSettingsL() + { + // Get name order value + TInt nameOrder = iSettingsList->SettingValueL(EPbkSettingNameOrder); + TBool separatorBetweenNames = EFalse; + + // Map the setting value to the NameOrder system used by Phonebook engine + if (nameOrder == EPbkSettingNameOrderLastSpaceFirst) + { + nameOrder = CPbkContactEngine::EPbkNameOrderLastNameFirstName; + } + else if (nameOrder == EPbkSettingNameOrderLastSeparatorFirst) + { + nameOrder = CPbkContactEngine::EPbkNameOrderLastNameFirstName; + separatorBetweenNames = ETrue; + } + else if (nameOrder == EPbkSettingNameOrderFirstSpaceLast) + { + nameOrder = CPbkContactEngine::EPbkNameOrderFirstNameLastName; + } + + // Do not change the name ordering if it wasn't really changed + // and most importantly if the view is not ready, otherwise contacts + // server crashes + TChar tempChar = iEngine.NameSeparator(); + if ((iUnderlyingViewReady && nameOrder != KErrNotFound) + && (nameOrder != iEngine.NameDisplayOrderL() || + (separatorBetweenNames == tempChar.Eos()))) + { + // Set underlying view flag + iUnderlyingViewReady = EFalse; + + // Show wait note + CAknWaitDialog* waitNote = + new(ELeave) CAknWaitDialog(reinterpret_cast(&iWaitNote)); + waitNote->ExecuteLD(R_QTN_GEN_NOTE_PROCESSING); + CleanupStack::PushL(waitNote); + + // Change the name ordering + iEngine.SetNameDisplayOrderL + ((CPbkContactEngine::TPbkNameOrder)nameOrder); + TChar separatorChar(0); + + if (separatorBetweenNames) + { + separatorChar = PbkViewUtils::ResolveNameOrderSeparatorL(iEngine); + } + iEngine.SetNameSeparatorL(separatorChar); + + CleanupStack::Pop(waitNote); + iWaitNote = waitNote; + } + } + +void CPbkSettingsDlg::HandleContactViewEvent + (const CContactViewBase& aView, + const TContactViewEvent& aEvent) + { + if (&aView==iAllContactsView) + { + switch (aEvent.iEventType) + { + case TContactViewEvent::EReady: // FALLTHROUGH + case TContactViewEvent::ESortOrderChanged: + { + // The view is ready + iUnderlyingViewReady = ETrue; + + // Dismiss the wait note, if any + if (iWaitNote) + { + TRAPD(err, iWaitNote->ProcessFinishedL()); + if (err != KErrNone) + { + delete iWaitNote; + iWaitNote = NULL; + } + } + break; + } + default: + { + iUnderlyingViewReady = EFalse; + break; + } + } + } + } + +TBool CPbkSettingsDlg::OkToExitL + (TInt aButtonId) + { + TBool result = ETrue; + + if (aButtonId == EAknSoftkeyOptions) + { + // Launch menu + DisplayMenuL(); + result = EFalse; + } + else if (aButtonId == EAknSoftkeyBack) + { + // Do not exit here, let AttempExit do it + AttemptExit(); + result = EFalse; + } + + return result; + } + +void CPbkSettingsDlg::DynInitMenuPaneL + (TInt aResourceId, + CEikMenuPane* aMenuPane) + { + switch (aResourceId) + { + case R_PBK_SETTINGS_MENU: + { + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + // remove non-supported help from menu + aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue); + } + } + break; + + default: + { + break; + } + } + } + +void CPbkSettingsDlg::GetHelpContext + (TCoeHelpContext& aContext) const + { + aContext.iMajor.iUid = KPbkUID3; + aContext.iContext = KPHOB_HLP_SETTINGS; + } + +void CPbkSettingsDlg::SizeChanged() + { + CAknDialog::SizeChanged(); + if (iSettingsList) + { + TRect parent; + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, parent); + AknLayoutUtils::LayoutControl( + iSettingsList, parent, AknLayout::list_gen_pane(0)); + } + } + +void CPbkSettingsDlg::HandleResourceChange(TInt aType) + { + CAknDialog::HandleResourceChange(aType); + + CEikStatusPane* statusPane = iAvkonAppUi->StatusPane(); + if (statusPane) + { + statusPane->HandleResourceChange(aType); + } + if (iSettingsList) + { + iSettingsList->HandleResourceChange(aType); + } + } + +void CPbkSettingsDlg::FocusChanged( TDrawNow aDrawNow ) + { + CAknDialog::FocusChanged( aDrawNow ); + if( iSettingsList ) + { + iSettingsList->SetFocus( IsFocused(), aDrawNow ); + } + } + +// End of File