--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/View/src/CPbkMemoryEntryAddItemDlg.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,364 @@
+/*
+* 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:
+* Methods for field type selection dialog for Phonebook's Create
+* New / Edit Memory entry functions.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkMemoryEntryAddItemDlg.h" // This class
+
+// System classes
+#include <aknPopup.h> // CAknPopupList
+#include <aknlists.h> // EikControlFactory
+
+// PbkView classes
+#include <PbkView.rsg>
+#include <CPbkIconArray.h>
+
+// PbkEng classes
+#include <CPbkFieldsInfo.h>
+#include <CPbkFieldInfo.h>
+#include <DigCleanupResetPointer.h>
+#include <CPbkExtGlobals.h>
+#include <MPbkExtensionFactory.h>
+
+// Unnamed namespace for local definitions
+namespace {
+
+// LOCAL CONSTANTS AND MACROS
+#ifdef _DEBUG
+enum TPanicCode
+ {
+ EPanicPostCond_Constructor = 1,
+ EPanicPreCond_MdcaCount,
+ EPanicPreCond_MdcaPoint,
+ EPanicPreCond_SetArray,
+ EPanicPreCond_ExecuteLD,
+ EPanicPreCond_ResetWhenDestroyed
+ };
+
+void Panic(TPanicCode aReason)
+ {
+ _LIT(KPanicText, "CPbkMemoryEntryAddItemDlg");
+ User::Panic(KPanicText, aReason);
+ }
+#endif // _DEBUG
+
+} // namespace
+
+
+
+// MODULE DATA STRUCTURES
+
+NONSHARABLE_CLASS(CPbkMemoryEntryAddItemDlg::CListBoxModel) :
+ public CBase,
+ public MDesCArray
+ {
+ public: // Interface
+ void SetArray(CArrayPtr<CPbkFieldInfo>* aArray, CPbkIconArray* aIconArray, TBool aSortFieldInfos);
+ void Sort();
+ inline CArrayPtr<CPbkFieldInfo>& Array() { return *iArray; }
+
+ public: // From MDesCArray
+ TInt MdcaCount() const;
+ TPtrC16 MdcaPoint(TInt aIndex) const;
+
+ private: // implementation
+ class TAddItemSortKey;
+
+ private: // data members
+ // Ref: array of CPbkFieldInfo objects to show
+ CArrayPtr<CPbkFieldInfo>* iArray;
+ /// Maximum list box row buffer size
+ enum { KMaxRowBuf=128 };
+ /// Own: Buffer for formatting a list box row text
+ __MUTABLE TBuf<KMaxRowBuf> iRowBuf;
+ /// Ref: icons for field types
+ CPbkIconArray* iIconArray;
+ };
+
+
+NONSHARABLE_CLASS(CPbkMemoryEntryAddItemDlg::CListBoxModel::TAddItemSortKey) :
+ public TKeyArrayFix
+ {
+ public:
+ inline TAddItemSortKey(CArrayPtr<CPbkFieldInfo>* aArray)
+ : TKeyArrayFix(0, ECmpTInt32), iArray(aArray) { }
+
+ public: // from TKey
+ TInt Compare(TInt aLeft,TInt aRight) const;
+
+ private: // data members
+ // Ref: field info array
+ CArrayPtr<CPbkFieldInfo>* iArray;
+ };
+
+// ==================== LOCAL FUNCTIONS ====================
+
+TInt CPbkMemoryEntryAddItemDlg::CListBoxModel::TAddItemSortKey::Compare
+ (TInt aLeft,
+ TInt aRight) const
+ {
+ return (*iArray)[aLeft]->AddItemOrdering() - (*iArray)[aRight]->AddItemOrdering();
+ }
+
+// ================= MEMBER FUNCTIONS =======================
+
+EXPORT_C CPbkMemoryEntryAddItemDlg::CPbkMemoryEntryAddItemDlg() :
+ iSortFieldInfos(EFalse)
+ {
+ // CBase::operator new() will reset members
+ __ASSERT_DEBUG(!iListBox && ! iPopupList,
+ Panic(EPanicPostCond_Constructor));
+ }
+
+EXPORT_C void CPbkMemoryEntryAddItemDlg::ResetWhenDestroyed
+ (CPbkMemoryEntryAddItemDlg** aSelfPtr)
+ {
+ __ASSERT_DEBUG(!aSelfPtr || *aSelfPtr==this, Panic(EPanicPreCond_ResetWhenDestroyed));
+
+ iSelfPtr = aSelfPtr;
+ }
+
+EXPORT_C CPbkFieldInfo* CPbkMemoryEntryAddItemDlg::ExecuteLD
+ (CArrayPtrFlat<CPbkFieldInfo>& aFieldInfos,
+ TInt aCbaResource)
+ {
+ PrepareLC(aFieldInfos, aCbaResource, KNullDesC);
+ return RunLD();
+ }
+
+EXPORT_C CPbkFieldInfo* CPbkMemoryEntryAddItemDlg::ExecuteLD
+ (CArrayPtr<CPbkFieldInfo>& aFieldInfos,
+ TInt aCbaResource,
+ const TDesC& aTitleText)
+ {
+ PrepareLC(aFieldInfos, aCbaResource, aTitleText);
+ return RunLD();
+ }
+
+EXPORT_C CPbkFieldInfo* CPbkMemoryEntryAddItemDlg::ExecuteLD
+ (CArrayPtr<CPbkFieldInfo>& aFieldInfos)
+ {
+ PrepareLC(aFieldInfos, R_AVKON_SOFTKEYS_OK_CANCEL, KNullDesC);
+ return RunLD();
+ }
+
+CPbkMemoryEntryAddItemDlg::~CPbkMemoryEntryAddItemDlg()
+ {
+ if (iSelfPtr)
+ {
+ *iSelfPtr = NULL;
+ }
+ // Tells RunLD this object has been destroyed
+ if (iDestroyedPtr) *iDestroyedPtr = ETrue;
+ if (iPopupList) iPopupList->CancelPopup();
+ delete iListBox;
+ }
+
+void CPbkMemoryEntryAddItemDlg::SortFieldInfoArray()
+ {
+ iSortFieldInfos = ETrue;
+ }
+
+void CPbkMemoryEntryAddItemDlg::PrepareLC
+ (CArrayPtr<CPbkFieldInfo>& aFieldInfos,
+ TInt aCbaResource,
+ const TDesC& aTitle)
+ {
+ __ASSERT_DEBUG(!iListBox && ! iPopupList && !iDestroyedPtr,
+ Panic(EPanicPreCond_ExecuteLD));
+
+ // "D" function semantics
+ CleanupStack::PushL(this);
+ CleanupResetPointerPushL(iPopupList);
+
+ // Create a list box
+ iListBox = static_cast<CEikFormattedCellListBox*>
+ (EikControlFactory::CreateByTypeL(EAknCtSingleGraphicPopupMenuListBox).iControl);
+
+ // Create a popup list
+ CAknPopupList* popupList = CAknPopupList::NewL
+ (iListBox, aCbaResource, AknPopupLayouts::EMenuGraphicWindow);
+ CleanupStack::PushL(popupList);
+ if (aTitle.Length() > 0)
+ {
+ popupList->SetTitleL(aTitle);
+ }
+
+ // Init list box
+ iListBox->ConstructL(popupList, CEikListBox::ELeftDownInViewRect);
+ iListBox->CreateScrollBarFrameL(ETrue);
+ iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+
+ // Load icons
+ CPbkIconArray* iconArray = new(ELeave) CPbkIconArray(4);
+ CleanupStack::PushL(iconArray);
+ iconArray->ConstructFromResourceL(R_PBK_FIELDTYPE_ICONS);
+
+ // get extension factory for setting extension icons
+ CPbkExtGlobals* extGlobal = CPbkExtGlobals::InstanceL();
+ extGlobal->PushL();
+ MPbkExtensionFactory& factory = extGlobal->FactoryL();
+ factory.AddPbkFieldIconsL(NULL, iconArray);
+ CleanupStack::PopAndDestroy(extGlobal);
+
+ CleanupStack::Pop(); // iconArray
+ iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
+
+ // Create listbox model
+ CListBoxModel* listBoxModel = new(ELeave) CListBoxModel;
+ listBoxModel->SetArray(&aFieldInfos, iconArray, iSortFieldInfos);
+ iListBox->Model()->SetItemTextArray(listBoxModel);
+ iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+
+ // Prepare to execute popup list
+ CleanupStack::Pop(); // popupList
+ iPopupList = popupList;
+ }
+
+CPbkFieldInfo* CPbkMemoryEntryAddItemDlg::RunLD()
+ {
+ TBool thisDestroyed = EFalse;
+ iDestroyedPtr = &thisDestroyed;
+
+ TBool res = iPopupList->ExecuteLD();
+
+ CPbkFieldInfo* result = NULL;
+ if (thisDestroyed)
+ {
+ // this object has been destroyed
+ CleanupStack::Pop(2); // CleanupResetPointerPushL(iPopupList), this
+ }
+ else
+ {
+ if (res)
+ {
+ // Retrieve and return selection
+ const TInt index = iListBox->CurrentItemIndex();
+ if (index >= 0)
+ {
+ CListBoxModel* model = static_cast<CListBoxModel*>(iListBox->Model()->ItemTextArray());
+ result = model->Array()[index];
+ }
+ }
+ CleanupStack::PopAndDestroy(2); // CleanupResetPointerPushL(iPopupList), this
+ }
+
+ return result;
+ }
+
+EXPORT_C void CPbkMemoryEntryAddItemDlg::Reserved_1()
+ {
+ }
+
+EXPORT_C void CPbkMemoryEntryAddItemDlg::Reserved_2()
+ {
+ }
+
+
+// CPbkMemoryEntryAddItemDlg::CListBoxModel
+
+void CPbkMemoryEntryAddItemDlg::CListBoxModel::SetArray
+ (CArrayPtr<CPbkFieldInfo>* aArray,
+ CPbkIconArray* aIconArray,
+ TBool aSortFieldInfos)
+ {
+ //PreCond:
+ __ASSERT_DEBUG(aArray, Panic(EPanicPreCond_SetArray));
+
+ iArray = aArray;
+ iIconArray = aIconArray;
+
+ if (aSortFieldInfos)
+ {
+ // sort the field infos according to the add item ordering
+ TAddItemSortKey key(iArray);
+ iArray->Sort(key);
+ }
+ }
+
+TInt CPbkMemoryEntryAddItemDlg::CListBoxModel::MdcaCount() const
+ {
+ //PreCond:
+ __ASSERT_DEBUG(iArray->Count() > 0, Panic(EPanicPreCond_MdcaCount));
+
+ return iArray->Count();
+ }
+
+// format according to correct listbox style, show fields in predefined order
+TPtrC16 CPbkMemoryEntryAddItemDlg::CListBoxModel::MdcaPoint(TInt aIndex) const
+ {
+ //PreCond:
+ __ASSERT_DEBUG(aIndex >= 0 && aIndex < iArray->Count(), Panic(EPanicPreCond_MdcaPoint));
+
+ _LIT(KIconFormat, "%d\t");
+
+ // insert icon index
+ TInt iconIndex = iIconArray->FindIcon((*iArray)[aIndex]->IconId());
+ if (iconIndex < 0)
+ {
+ // If icon is not found by Id fall back to empty icon
+ iconIndex = iIconArray->FindIcon(EPbkqgn_prop_nrtyp_empty);
+ }
+
+ MUTABLE_CAST(CListBoxModel*, this)->iRowBuf.Format(KIconFormat, iconIndex);
+ const TDesC& fieldName = (*iArray)[aIndex]->AddItemText();
+ const TInt chars = Min(iRowBuf.MaxLength()-iRowBuf.Length(), fieldName.Length());
+ MUTABLE_CAST(CListBoxModel*, this)->iRowBuf.Append(fieldName.Left(chars));
+
+ return iRowBuf;
+ }
+
+EXPORT_C CPbkItemTypeSelectCreateNew::CPbkItemTypeSelectCreateNew()
+ {
+ }
+
+EXPORT_C CPbkItemTypeSelectCreateNew::~CPbkItemTypeSelectCreateNew()
+ {
+ delete iTitleBuf;
+ }
+
+EXPORT_C CPbkFieldInfo* CPbkItemTypeSelectCreateNew::ExecuteLD
+ (CArrayPtr<CPbkFieldInfo>& aFieldInfos)
+ {
+ iTitleBuf = CCoeEnv::Static()->AllocReadResourceL(R_QTN_PHOB_QTL_ENTRY_CREATE);
+ CPbkFieldInfo* result = CPbkMemoryEntryAddItemDlg::ExecuteLD
+ (aFieldInfos, R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT, *iTitleBuf);
+ return result;
+ }
+
+EXPORT_C CPbkItemTypeSelectAddToExisting::CPbkItemTypeSelectAddToExisting()
+ {
+ }
+
+EXPORT_C CPbkItemTypeSelectAddToExisting::~CPbkItemTypeSelectAddToExisting()
+ {
+ delete iTitleBuf;
+ }
+
+EXPORT_C CPbkFieldInfo* CPbkItemTypeSelectAddToExisting::ExecuteLD
+ (CArrayPtr<CPbkFieldInfo>& aFieldInfos)
+ {
+ iTitleBuf = CCoeEnv::Static()->AllocReadResourceL(R_QTN_PHOB_QTL_ENTRY_ADD_TO);
+ CPbkFieldInfo* result = CPbkMemoryEntryAddItemDlg::ExecuteLD
+ (aFieldInfos, R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT, *iTitleBuf);
+ return result;
+ }
+
+
+// End of File