--- /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