phonebookui/Phonebook/View/src/CPbkSelectFieldDlg.cpp
branchRCL_3
changeset 20 f4a778e096c2
child 21 9da50d567e3c
equal deleted inserted replaced
19:5b6f26637ad3 20:f4a778e096c2
       
     1 /*
       
     2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include    "CPbkSelectFieldDlg.h"
       
    21 #include    <avkon.rsg>     // AVKON resources
       
    22 #include    <aknPopup.h>    // CAknPopupList
       
    23 #include    <aknlists.h>    // CAknSingleGraphicHeadingPopupMenuStyleListBox
       
    24 #include    <eikclbd.h>     // CColumnListBoxData
       
    25 #include    <calslbs.h>     // AknTextUtils
       
    26 
       
    27 #include    <PbkView.rsg>   // View DLL resource Ids
       
    28 #include    "CPbkFieldListBoxModel.h"
       
    29 #include    "MPbkControlKeyObserver.h"
       
    30 #include    <CPbkIconArray.h>
       
    31 #include    "MPbkClipListBoxText.h"
       
    32 #include    "CPbkFieldAnalyzer.h"
       
    33 
       
    34 #include    <CPbkContactItem.h> // CPbkFieldArray
       
    35 #include    <CPbkExtGlobals.h>
       
    36 #include    <MPbkExtensionFactory.h>
       
    37 #include    <CPbkContactEngine.h>
       
    38 
       
    39 // Unnamed namespace for local definitions
       
    40 namespace {
       
    41 
       
    42 // MODULE DATA STRUCTURES
       
    43 #ifdef _DEBUG
       
    44 enum TPanicCode
       
    45     {
       
    46     EPanicPostCond_Constructor = 1,
       
    47     EPanicPreCond_ExecuteLD,
       
    48     EPanicPreCond_AttemptExitL,
       
    49     EPanicPreCond_ResetWhenDestroyed
       
    50     };
       
    51 
       
    52 void Panic(TPanicCode aReason)   
       
    53     {
       
    54     _LIT(KPanicText, "CPbkSelectFieldDlg");
       
    55     User::Panic(KPanicText, aReason);
       
    56     }
       
    57 #endif // _DEBUG
       
    58 
       
    59 
       
    60 /**
       
    61  * Creates and returns an icon array with phonebook 
       
    62  * default and extension icons.
       
    63  * 
       
    64  * @return array filled with icons
       
    65  */
       
    66 CPbkIconArray* CreateListBoxIconArrayL()
       
    67     {
       
    68     // create icon array with default icons
       
    69     CPbkIconArray* iconArray = new (ELeave) CPbkIconArray(2);
       
    70     CleanupStack::PushL(iconArray);
       
    71     iconArray->ConstructFromResourceL(R_PBK_FIELDTYPE_ICONS);
       
    72     
       
    73     // get extension factory for setting extension icons
       
    74     CPbkExtGlobals* extGlobal = CPbkExtGlobals::InstanceL();
       
    75     extGlobal->PushL();
       
    76     MPbkExtensionFactory& factory = extGlobal->FactoryL();
       
    77     factory.AddPbkFieldIconsL(NULL, iconArray);
       
    78     CleanupStack::PopAndDestroy(extGlobal);
       
    79 
       
    80     CleanupStack::Pop();  // iconArray
       
    81     return iconArray;
       
    82     }
       
    83 
       
    84 } // namespace
       
    85 
       
    86 
       
    87 /**
       
    88  * Specialized CAknPopupList for CPbkSelectFieldDlg.
       
    89  */
       
    90 NONSHARABLE_CLASS(CPbkSelectFieldDlg::CPopupList) : 
       
    91         public CAknPopupList
       
    92     {
       
    93     public:  // New functions
       
    94         /**
       
    95          * Like CAknPopupList::NewL.
       
    96 		 * @see CAknPopupList::NewL
       
    97          */
       
    98         static CPopupList* NewL(
       
    99             CEikListBox* aListBox, 
       
   100             TInt aCbaResource, 
       
   101             AknPopupLayouts::TAknPopupLayouts aType =
       
   102 				AknPopupLayouts::EMenuWindow);
       
   103 
       
   104         /**
       
   105          * Sets the listbox item to focus intially. By default focus is on 
       
   106          * the first item.
       
   107          * @param aFocusIndex  index of the listbox item to focus initially.
       
   108          */
       
   109         inline void SetInitialFocus(TInt aFocusIndex);
       
   110 
       
   111         /**
       
   112          * Like CAknPopupList::AttemptExitL.
       
   113 		 * @see CAknPopupList::AttemptExitL
       
   114          */
       
   115         inline void AttemptExitL(TBool aAccept);
       
   116 
       
   117     private:  // from CAknPopupList
       
   118 	    void SetupWindowLayout(AknPopupLayouts::TAknPopupLayouts aType);
       
   119 
       
   120     private:  // Implementation
       
   121         inline CPopupList();
       
   122 
       
   123     private:  // Data
       
   124 		/// Own: focus index
       
   125         TInt iFocusIndex;
       
   126     };
       
   127 
       
   128 /**
       
   129  * Specialized listbox for CPbkSelectFieldDlg.
       
   130  */
       
   131 NONSHARABLE_CLASS(CPbkSelectFieldDlg::CListBox) : 
       
   132         public CAknDoubleGraphicPopupMenuStyleListBox,
       
   133         public MPbkClipListBoxText
       
   134     {
       
   135     public:  // New functions
       
   136         /**
       
   137          * Constructor.
       
   138          */
       
   139         inline CListBox();
       
   140 
       
   141         /**
       
   142          * Sets the observer aKeyObserver.
       
   143          */
       
   144         inline void SetObserver(MPbkControlKeyObserver* aKeyObserver);
       
   145 
       
   146         /**
       
   147          * Returns CONE environment.
       
   148          */
       
   149         inline CCoeEnv* CoeEnv();
       
   150 
       
   151     private:  // from CCoeControl
       
   152 	    TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
       
   153 
       
   154     private:  // from MPbkClipListBoxText
       
   155         TBool ClipFromBeginning(TDes& aBuffer, TInt aItemIndex, TInt aSubCellNumber);
       
   156 
       
   157     private:  // Data
       
   158 		/// Ref: observer
       
   159         MPbkControlKeyObserver* iKeyObserver;
       
   160     };
       
   161 
       
   162 
       
   163 // ================= MEMBER FUNCTIONS =======================
       
   164 
       
   165 // CPbkSelectFieldDlg::CPopupList
       
   166 inline CPbkSelectFieldDlg::CPopupList::CPopupList() :
       
   167     iFocusIndex(-1)
       
   168     {
       
   169 	// Initializes the focus to -1 which is surely an errornous value
       
   170     }
       
   171 
       
   172 CPbkSelectFieldDlg::CPopupList* CPbkSelectFieldDlg::CPopupList::NewL
       
   173         (CEikListBox* aListBox, 
       
   174         TInt aCbaResource, 
       
   175         AknPopupLayouts::TAknPopupLayouts aType)
       
   176     {
       
   177     CPopupList* self = new(ELeave) CPopupList;
       
   178     CleanupStack::PushL(self);
       
   179     self->ConstructL(aListBox, aCbaResource, aType);
       
   180     CleanupStack::Pop();  // self
       
   181     return self;
       
   182     }
       
   183 
       
   184 inline void CPbkSelectFieldDlg::CPopupList::SetInitialFocus(TInt aFocusIndex)
       
   185     {
       
   186     iFocusIndex = aFocusIndex;
       
   187     }
       
   188 
       
   189 inline void CPbkSelectFieldDlg::CPopupList::AttemptExitL(TBool aAccept)
       
   190     {
       
   191     CAknPopupList::AttemptExitL(aAccept);
       
   192     }
       
   193 
       
   194 void CPbkSelectFieldDlg::CPopupList::SetupWindowLayout
       
   195         (AknPopupLayouts::TAknPopupLayouts aType)
       
   196     {
       
   197     // Call base class
       
   198     CAknPopupList::SetupWindowLayout(aType);
       
   199     // Set initial focus
       
   200     if (iFocusIndex >= 0)
       
   201         {
       
   202         ListBox()->SetCurrentItemIndex(iFocusIndex);
       
   203         }
       
   204     }
       
   205 
       
   206 // CPbkSelectFieldDlg::CListBox
       
   207 inline CPbkSelectFieldDlg::CListBox::CListBox()
       
   208     {
       
   209     }
       
   210 
       
   211 inline void CPbkSelectFieldDlg::CListBox::SetObserver(MPbkControlKeyObserver* aKeyObserver)
       
   212     {
       
   213     iKeyObserver = aKeyObserver;
       
   214     }
       
   215 
       
   216 inline CCoeEnv* CPbkSelectFieldDlg::CListBox::CoeEnv()
       
   217     {
       
   218     return iCoeEnv;
       
   219     }
       
   220 
       
   221 TKeyResponse CPbkSelectFieldDlg::CListBox::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
       
   222     {
       
   223     if (iKeyObserver &&
       
   224         iKeyObserver->PbkControlKeyEventL(aKeyEvent,aType) == EKeyWasConsumed)
       
   225         {
       
   226         return EKeyWasConsumed;
       
   227         }
       
   228     return CAknDoubleGraphicPopupMenuStyleListBox::OfferKeyEventL(aKeyEvent, aType);
       
   229     }
       
   230 
       
   231 TBool CPbkSelectFieldDlg::CListBox::ClipFromBeginning
       
   232         (TDes& aBuffer, TInt aItemIndex, TInt aSubCellNumber)
       
   233     {
       
   234     return AknTextUtils::ClipToFit
       
   235         (aBuffer, 
       
   236         AknTextUtils::EClipFromBeginning, 
       
   237         this, 
       
   238         aItemIndex, 
       
   239         aSubCellNumber);
       
   240     }
       
   241 
       
   242 EXPORT_C CPbkSelectFieldDlg::CPbkSelectFieldDlg()
       
   243     {
       
   244     __ASSERT_DEBUG(
       
   245         !iListBox && !iPopupList && !iKeyObserver && !iDestroyedPtr,
       
   246         Panic(EPanicPostCond_Constructor));
       
   247     }
       
   248 
       
   249 EXPORT_C TPbkContactItemField* CPbkSelectFieldDlg::ExecuteLD
       
   250         (CPbkFieldArray& aArray, 
       
   251         TInt aCbaResourceId,
       
   252         const TDesC& aHeading /*=KNullDesC*/,
       
   253         TInt aFocusIndex /*=-1*/)
       
   254     {
       
   255     __ASSERT_DEBUG(!iListBox && !iPopupList, Panic(EPanicPreCond_ExecuteLD));
       
   256 
       
   257     // "D" function semantics
       
   258     CleanupStack::PushL(this);
       
   259     TBool thisDestroyed = EFalse;
       
   260     // Destructor will set thisDestroyed to ETrue if this object is destroyed
       
   261     iDestroyedPtr = &thisDestroyed;
       
   262 
       
   263     // Create a list box
       
   264     iListBox = new(ELeave) CListBox;
       
   265 
       
   266     // Create a popup list
       
   267     CPopupList* popupList = CPopupList::NewL
       
   268         (iListBox, aCbaResourceId, AknPopupLayouts::EMenuDoubleLargeGraphicWindow);
       
   269     CleanupStack::PushL(popupList);
       
   270     	
       
   271     // Init list box
       
   272     iListBox->ConstructL(popupList, CEikListBox::ELeftDownInViewRect);
       
   273     iListBox->SetObserver(iKeyObserver);
       
   274 
       
   275     // set title of popuplist
       
   276     if(aHeading.Length() > 0)
       
   277         {
       
   278         popupList->SetTitleL(aHeading);
       
   279         }
       
   280     
       
   281     CPbkIconArray* iconArray = CreateListBoxIconArrayL();
       
   282     iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
       
   283 
       
   284     HBufC* timeFormat = iListBox->CoeEnv()->AllocReadResourceLC(R_QTN_DATE_USUAL);
       
   285 
       
   286     CPbkFieldListBoxModel::TParams params( aArray, *timeFormat, *iconArray);
       
   287 
       
   288     CPbkFieldAnalyzer* fieldAnalyzer = NULL;
       
   289     // IF the contact item is set, initialize and add the field analyzer into
       
   290     // the param for list box model.
       
   291     fieldAnalyzer = CPbkFieldAnalyzer::NewL( aArray );
       
   292     params.iFieldAnalyzer = fieldAnalyzer;
       
   293     CleanupStack::PushL( fieldAnalyzer );
       
   294 
       
   295     CPbkFieldListBoxModel* listBoxModel = CPbkFieldListBoxModel::NewL(params);
       
   296     
       
   297     CleanupStack::PopAndDestroy( fieldAnalyzer ); // fieldAnalyzer
       
   298     params.iFieldAnalyzer = NULL;
       
   299 
       
   300     CleanupStack::PopAndDestroy();  // timeFormat
       
   301     listBoxModel->SetClipper(*iListBox); 
       
   302     iListBox->Model()->SetItemTextArray(listBoxModel);
       
   303     iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
       
   304     iListBox->Reset();
       
   305 
       
   306     if (aFocusIndex >= 0 && aFocusIndex < iListBox->Model()->NumberOfItems())
       
   307         {
       
   308         popupList->SetInitialFocus(aFocusIndex);
       
   309         }
       
   310 
       
   311 	iListBox->CreateScrollBarFrameL(ETrue);
       
   312 	iListBox->ScrollBarFrame()->SetScrollBarVisibilityL
       
   313 		(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
       
   314 
       
   315     TPbkContactItemField* result = NULL;
       
   316     CleanupStack::Pop();  // listBox
       
   317     iPopupList = popupList;
       
   318     TInt dlgResult = 0;
       
   319     TRAPD(err, dlgResult = iPopupList->ExecuteLD());
       
   320     if (!thisDestroyed)
       
   321 		{
       
   322 		iPopupList = NULL;
       
   323 		}
       
   324     if (err != KErrNone)
       
   325 		{
       
   326 		User::Leave(err);
       
   327 		}
       
   328 
       
   329     if (thisDestroyed)
       
   330         {
       
   331         // this object has been destroyed
       
   332         CleanupStack::Pop();  // this
       
   333         }
       
   334     else
       
   335         {
       
   336         if (dlgResult)
       
   337             {
       
   338             TInt index = iListBox->CurrentItemIndex();
       
   339             result = &aArray[index];
       
   340             }
       
   341         CleanupStack::PopAndDestroy(); // this
       
   342         }
       
   343 
       
   344     return result;
       
   345     }
       
   346 
       
   347 EXPORT_C CPbkSelectFieldDlg::~CPbkSelectFieldDlg()
       
   348     {
       
   349     if (iSelfPtr)
       
   350 		{
       
   351 		*iSelfPtr = NULL;
       
   352 		}
       
   353     if (iDestroyedPtr)
       
   354 		{
       
   355 		*iDestroyedPtr = ETrue;
       
   356 		}
       
   357     if (iPopupList)
       
   358 		{
       
   359 		iPopupList->CancelPopup();
       
   360 		}
       
   361     delete iListBox;
       
   362     }
       
   363 
       
   364 EXPORT_C void CPbkSelectFieldDlg::SetObserver(MPbkControlKeyObserver* aKeyObserver)
       
   365     {
       
   366     iKeyObserver = aKeyObserver;
       
   367     }
       
   368 
       
   369 EXPORT_C void CPbkSelectFieldDlg::AttemptExitL(TBool aAccept)
       
   370     {
       
   371     __ASSERT_DEBUG(iPopupList, Panic(EPanicPreCond_AttemptExitL));
       
   372 
       
   373     iPopupList->AttemptExitL(aAccept);
       
   374     }
       
   375 
       
   376 EXPORT_C void CPbkSelectFieldDlg::ResetWhenDestroyed(CPbkSelectFieldDlg** aSelfPtr)
       
   377     {
       
   378     __ASSERT_DEBUG(!aSelfPtr || *aSelfPtr==this, 
       
   379         Panic(EPanicPreCond_ResetWhenDestroyed));
       
   380 
       
   381     iSelfPtr = aSelfPtr;
       
   382     }
       
   383 //  End of File