phonebookui/Phonebook/View/src/CPbkSettingsDlg.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /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