phonebookui/Phonebook2/GroupExtension/src/CPguGroupPopup.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/GroupExtension/src/CPguGroupPopup.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,466 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 group popup.
+*
+*/
+
+
+#include "CPguGroupPopup.h"
+
+// Phonebook 2
+#include <CPbk2InputAbsorber.h>
+#include <MPbk2ContactNameFormatter.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+
+// Virtual Phonebook
+#include <MVPbkContactViewBase.h>
+#include <MVPbkViewContact.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkContactLinkArray.h>
+#include <CVPbkFilteredContactView.h>
+#include <CVPbkContactManager.h>
+
+// System includes
+#include <aknlists.h>
+#include <aknPopup.h>
+#include <avkon.rsg>
+#include <StringLoader.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+const TInt KMaxListBoxText( 256 );
+
+} /// namespace
+
+// CLASS DECLARATION
+
+class CPopupList : public CAknPopupList
+    {
+    public: // Construction and destruction
+
+        /**
+         * Creates a new instance of this class.
+         *
+         * @param aListbox      The listbox to use in the list.
+         * @param aCbaResource  Softkey resource id.
+         * @return  A new instance of this class.
+         */
+        static CPopupList* NewLC(
+                CEikListBox* aListBox,
+                TInt aCbaResource );
+
+        /**
+         * Destructor.
+         */
+        ~CPopupList();
+
+    public: // Interface
+
+        /**
+         * Sets the object to resets the self pointer after destruction.
+         *
+         * @param aSelf     Self pointer.
+         */
+        void ResetWhenDestroyed(
+                CPopupList** aSelf );
+
+    protected: // Implementation
+        CPopupList();
+
+    private: // Data
+        /// Ref: Self pointer
+        CPopupList** iSelfPtr;
+    };
+
+class CListBoxModel : public CBase,
+                      public MDesCArray
+    {
+    public: // Construction
+
+        /**
+         * Constructor.
+         *
+         * @param aView             View.
+         * @param aNameFormatter    Name formatter
+         */
+        CListBoxModel(
+                MVPbkContactViewBase& aView,
+                MPbk2ContactNameFormatter& aNameFormatter ) :
+                    iView( aView ),
+                    iNameFormatter( aNameFormatter )
+                        {
+                        }
+
+    public: // From MDesCArray
+        TInt MdcaCount() const;
+        TPtrC MdcaPoint(
+                TInt aIndex ) const;
+
+    private: // Implementation
+        void FormatBufferL(
+                TInt aIndex ) const;
+
+    private: // Data
+        // Ref: View
+        MVPbkContactViewBase& iView;
+        // Ref: Name formatter
+        MPbk2ContactNameFormatter& iNameFormatter;
+        // Own: Formatting buffer
+        mutable TBuf<KMaxListBoxText> iFormattingBuffer;
+        // Own: Counter
+        mutable TInt iPreviousCount;
+    };
+
+// --------------------------------------------------------------------------
+// CListBoxModel::MdcaCount
+// --------------------------------------------------------------------------
+//
+TInt CListBoxModel::MdcaCount() const
+    {
+    TInt result = iPreviousCount;
+    TRAPD( err, result = iView.ContactCountL() );
+    if ( err != KErrNone )
+        {
+        CCoeEnv::Static()->HandleError( err );
+        }
+    iPreviousCount = result;
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CListBoxModel::MdcaPoint
+// --------------------------------------------------------------------------
+//
+TPtrC CListBoxModel::MdcaPoint( TInt aIndex ) const
+    {
+    iFormattingBuffer.Zero();
+
+    TRAPD( err, FormatBufferL( aIndex ) );
+    switch ( err )
+        {
+        case KErrNone:
+            {
+            // OK
+            break;
+            }
+        case KErrNotFound:      // FALLTHROUGH
+        case KErrAccessDenied:
+            {
+            // Do not report these errors as they occur sometimes when
+            // the view is under a massive update
+            break;
+            }
+        default:
+            {
+            // Report error
+            CCoeEnv::Static()->HandleError( err );
+            break;
+            }
+        }
+    return iFormattingBuffer;
+    }
+
+// --------------------------------------------------------------------------
+// CListBoxModel::FormatBufferL
+// --------------------------------------------------------------------------
+//
+void CListBoxModel::FormatBufferL( TInt aIndex ) const
+    {
+    const TInt KDefaultListFormatting =
+        MPbk2ContactNameFormatter::EUseSeparator |
+        MPbk2ContactNameFormatter::EPreserveLeadingSpaces;
+
+    const MVPbkViewContact& contact = iView.ContactAtL( aIndex );
+    HBufC* name = iNameFormatter.GetContactTitleL(
+        contact.Fields(),
+        KDefaultListFormatting );
+    iFormattingBuffer.Append( *name );
+    delete name;
+    }
+
+// --------------------------------------------------------------------------
+// CPopupList::CPopupList
+// --------------------------------------------------------------------------
+//
+inline CPopupList::CPopupList()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPopupList::NewLC
+// --------------------------------------------------------------------------
+//
+CPopupList* CPopupList::NewLC( CEikListBox* aListBox, TInt aCbaResource )
+    {
+    CPopupList* self = new(ELeave) CPopupList;
+    CleanupStack::PushL(self);
+    self->CAknPopupList::ConstructL(
+            aListBox,
+            aCbaResource,
+            AknPopupLayouts::EMenuWindow );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPopupList::~CPopupList
+// --------------------------------------------------------------------------
+//
+CPopupList::~CPopupList()
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::CPguGroupPopup
+// --------------------------------------------------------------------------
+//
+CPguGroupPopup::CPguGroupPopup
+        ( MVPbkContactLinkArray* aGroupsJoined, TInt32 aTitleResId,
+          TInt32 aEmptyTextResId, TInt32 aSoftKeyResId,
+          TInt32 aListBoxFlags ) :
+            iTitleResId( aTitleResId ),
+            iEmptyTextResId( aEmptyTextResId ),
+            iSoftKeyResId( aSoftKeyResId ),
+            iListBoxFlags( aListBoxFlags ),
+            iGroupsJoined( aGroupsJoined )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPguGroupPopup::ConstructL
+        ( MVPbkContactViewBase& aAllGroupsView )
+    {
+    iGroupView = CVPbkFilteredContactView::NewL
+        ( aAllGroupsView, *this, *this );
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::NewL
+// --------------------------------------------------------------------------
+//
+CPguGroupPopup* CPguGroupPopup::NewL
+        ( MVPbkContactLinkArray* aGroupsJoined,
+          TInt32 aTitleResId, TInt32 aEmptyTextResId,
+          TInt32 aSoftKeyResId, TInt32 aListBoxFlags,
+          MVPbkContactViewBase& aAllGroupsView )
+    {
+    CPguGroupPopup* self = new ( ELeave ) CPguGroupPopup
+        ( aGroupsJoined, aTitleResId, aEmptyTextResId,
+          aSoftKeyResId, aListBoxFlags );
+    CleanupStack::PushL( self );
+    self->ConstructL( aAllGroupsView );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::~CPguGroupPopup
+// --------------------------------------------------------------------------
+//
+CPguGroupPopup::~CPguGroupPopup()
+    {
+    if ( iGroupView )
+        {
+        iGroupView->RemoveObserver( *this );
+        }
+
+    delete iGroupView;
+    delete iInputAbsorber;
+    delete iSelectedGroup;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ExecuteLD
+// --------------------------------------------------------------------------
+//
+MVPbkContactLink* CPguGroupPopup::ExecuteLD()
+    {
+    CleanupStack::PushL( this );
+
+    iInputAbsorber = CPbk2InputAbsorber::NewL( R_AVKON_SOFTKEYS_CANCEL );
+    iInputAbsorber->SetCommandObserver( this );
+
+    iInputAbsorber->Wait();
+
+    MVPbkContactLink* result = iSelectedGroup;
+    iSelectedGroup = NULL;
+    CleanupStack::PopAndDestroy( this );
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ContactViewReady
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::ContactViewReady( MVPbkContactViewBase& /*aView*/ )
+    {
+    TRAPD( err, RunPopupL() );
+    if ( err != KErrNone )
+        {
+        CCoeEnv::Static()->HandleError( err );
+        Close();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ContactViewUnavailable
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::ContactViewUnavailable
+        ( MVPbkContactViewBase& /*aView*/ )
+    {
+    //Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ContactAddedToView
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::ContactAddedToView(
+        MVPbkContactViewBase& /*aView*/,
+        TInt /*aIndex*/,
+        const MVPbkContactLink& /*aContactLink*/ )
+    {
+    //Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ContactRemovedFromView
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::ContactRemovedFromView(
+        MVPbkContactViewBase& /*aView*/,
+        TInt /*aIndex*/,
+        const MVPbkContactLink& /*aContactLink*/ )
+    {
+    //Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ContactViewError
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::ContactViewError(
+        MVPbkContactViewBase& /*aView*/,
+        TInt /*aError*/,
+        TBool /*aErrorNotified*/ )
+    {
+    //Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::ProcessCommandL
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::ProcessCommandL( TInt aCommandId )
+    {
+    switch ( aCommandId )
+        {
+        case EAknSoftkeyCancel: // FALLTHROUGH
+        case EAknSoftkeyBack:   // FALLTHROUGH
+        case EAknSoftkeyNo:     // FALLTHROUGH
+        case EAknSoftkeyClose:  // FALLTHROUGH
+        case EAknSoftkeyExit:
+            {
+            Close();
+            break;
+            }
+
+        default:
+            break;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::Close
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::Close()
+    {
+    delete this;
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::RunPopupL
+// --------------------------------------------------------------------------
+//
+void CPguGroupPopup::RunPopupL()
+    {
+    CEikColumnListBox* listBox = static_cast<CEikColumnListBox*>(
+        EikControlFactory::CreateByTypeL(
+            EAknCtSinglePopupMenuListBox ).iControl );
+    CleanupStack::PushL( listBox );
+
+    CPopupList* popupList = CPopupList::NewLC( listBox, iSoftKeyResId );
+    listBox->ConstructL( popupList,
+        iListBoxFlags | CEikListBox::ELeftDownInViewRect );
+
+    // Create own listbox model
+    CListBoxModel* listBoxModel =
+            new (ELeave) CListBoxModel( *iGroupView,
+            Phonebook2::Pbk2AppUi()->ApplicationServices().NameFormatter() );
+
+    listBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+    listBox->Model()->SetItemTextArray( listBoxModel );
+    listBox->CreateScrollBarFrameL( ETrue );
+    listBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+            CEikScrollBarFrame::EOff,
+            CEikScrollBarFrame::EAuto );
+
+    HBufC* prompt = StringLoader::LoadLC( iTitleResId );
+    popupList->SetTitleL( *prompt );
+    CleanupStack::PopAndDestroy(); // prompt
+
+    HBufC* empty = StringLoader::LoadLC( iEmptyTextResId );
+    listBox->View()->SetListEmptyTextL( *empty );
+    CleanupStack::PopAndDestroy(); // empty
+
+    iResult = popupList->ExecuteLD();
+    CleanupStack::Pop( popupList ); // destroyed in ExecuteLD
+    if ( iResult )
+        {
+        TInt index = listBox->CurrentItemIndex();
+        iSelectedGroup = iGroupView->ContactAtL( index ).CreateLinkLC();
+        CleanupStack::Pop();
+        }
+    CleanupStack::PopAndDestroy( listBox );
+
+    // Wait is started in ExecuteLD()
+    iInputAbsorber->StopWait();
+    }
+
+// --------------------------------------------------------------------------
+// CPguGroupPopup::IsContactIncluded
+// --------------------------------------------------------------------------
+//
+TBool CPguGroupPopup::IsContactIncluded(
+        const MVPbkBaseContact& aContact )
+    {
+    TBool result = EFalse;
+    const TInt count = iGroupsJoined->Count();
+    for ( TInt i(0); i < count; ++i )
+        {
+        if ( iGroupsJoined->At( i ).RefersTo( aContact ) )
+            {
+            result = ETrue;
+            break;
+            }
+        }
+    return result;
+    }
+//  End of File