--- /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 <PbkView.hrh>
+#include "PbkUID.h"
+#include "PbkViewUtils.h"
+
+#include <PbkView.rsg>
+#include <CPbkContactEngine.h>
+#include <eikspane.h>
+#include <akntitle.h>
+#include <aknnavide.h>
+#include <barsread.h>
+#include <featmgr.h>
+#include <AknWaitDialog.h>
+#include <aknappui.h> //iAvkonAppUi
+#include <StringLoader.h>
+#include <cshelp/phob.hlp.hrh>
+
+/// 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<MEikCommandObserver*>(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<CAknNavigationControlContainer*>
+ (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<CAknTitlePane*>
+ (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<CEikDialog**>(&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