diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Phonebook2/xSPExtensionManager/src/CxSPSortViewControl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/xSPExtensionManager/src/CxSPSortViewControl.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,474 @@ +/* +* Copyright (c) 2006 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: Implementation for CxSPSortViewControl. +* +*/ + + +// INCLUDE FILES +#include "CxSPSortViewControl.h" + +// System includes +#include // CAknSingleStyleListBox +#include +#include +#include +#include +#include +#include + +// internal includes +#include "CxSPLoader.h" +#include "MxSPFactory.h" +#include "CxSPViewIdChanger.h" +#include "CxSPViewInfo.h" +#include +#include "xSPOrderOrganizer.h" +#include "CGlobalNoteObserver.h" +#include +#include +#include +#include +#include + +// CONSTANTS +_LIT( KTab, "\t" ); +const TUint KMaxListBoxBufSize( 256 ); // Maximum listbox item text size + + +void CleanUpResetAndDestroy( TAny* aArray ) + { + if( aArray ) + { + CArrayPtrFlat* array = (CArrayPtrFlat*)aArray; + array->ResetAndDestroy(); + delete array; + } + } + +// ================= MEMBER FUNCTIONS ======================= + +CxSPSortViewControl::CxSPSortViewControl( CxSPViewIdChanger& aViewIdChanger, + CxSPArray& aExtensions, + CPbk2UIExtensionView& aView ) : + iViewIdChanger( aViewIdChanger ), + iExtensions(aExtensions), + iGlobalNote(0), + iGlobalNoteObserver(0), + iView( aView ) + { + } + +void CxSPSortViewControl::ConstructL() + { + CreateWindowL(); + + // Initialize the list box + iListBox = new (ELeave) CAknSingleGraphicStyleListBox; + TInt flags = EAknListBoxLoopScrolling | EAknListBoxMarkableList; + iListBox->ConstructL(this, flags); + iListBox->SetContainerWindowL(*this); + iListBox->CreateScrollBarFrameL(ETrue); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL + (CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + SetListBoxContentsL(); + } + +CxSPSortViewControl* CxSPSortViewControl::NewL( CxSPViewIdChanger& aViewIdChanger, + CxSPArray& aExtensions, + CPbk2UIExtensionView& aView ) + { + CxSPSortViewControl* self = NewLC( aViewIdChanger, aExtensions, aView ); + CleanupStack::Pop(self); + return self; + } + +CxSPSortViewControl* CxSPSortViewControl::NewLC( CxSPViewIdChanger& aViewIdChanger, + CxSPArray& aExtensions, + CPbk2UIExtensionView& aView ) + { + CxSPSortViewControl* self = + new (ELeave) CxSPSortViewControl( aViewIdChanger, aExtensions, aView ); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CxSPSortViewControl::~CxSPSortViewControl() + { + delete iListBox; + iSortedOrder.Close(); + delete iGlobalNote; + delete iGlobalNoteObserver; + } + +TKeyResponse CxSPSortViewControl::OfferKeyEventL + (const TKeyEvent& aKeyEvent,TEventCode aType) + { + TKeyResponse result = EKeyWasNotConsumed; + + if( iListBox && result == EKeyWasNotConsumed ) + { + result = iListBox->OfferKeyEventL(aKeyEvent, aType); + } + + // Update popup when moving up or down in the list + switch(aKeyEvent.iCode) + { + case EKeyUpArrow: + case EKeyDownArrow: + { + const CListBoxView::CSelectionIndexArray* inds = NULL; + TInt count = 0; + + if ( iListBox ) + { + inds = iListBox->SelectionIndexes(); + count = inds->Count(); + } + + if ( count <= 0 ) + { + iView.Cba()->SetCommandSetL( R_EXTENSION_MANAGER_SORT_VIEW_SOFTKEYS ); + } + else + { + iView.Cba()->SetCommandSetL( R_AVKON_SOFTKEYS_OK_CANCEL ); + } + iView.Cba()->DrawDeferred(); + + break; + } + case EKeyEnter: + case EKeyOK: + { + const CListBoxView::CSelectionIndexArray* inds = NULL; + TInt count = 0; + + if ( iListBox ) + { + inds = iListBox->SelectionIndexes(); + count = inds->Count(); + } + + if ( count <= 0 ) + { + SetCurrentItemMarkedL( ETrue ); + iView.Cba()->SetCommandSetL( R_AVKON_SOFTKEYS_OK_CANCEL ); + } + else + { + MoveMarkedItemL(); + iView.Cba()->SetCommandSetL( R_EXTENSION_MANAGER_SORT_VIEW_SOFTKEYS ); + } + iView.Cba()->DrawDeferred(); + break; + } + default: + { + break; + } + } + return result; + } + +void CxSPSortViewControl::SizeChanged() + { + if ( iListBox ) + { + iListBox->SetRect(Rect()); + } + } + +TInt CxSPSortViewControl::CountComponentControls() const + { + TInt controls = 0; + if (iListBox) ++controls; + return controls; + } + +CCoeControl* CxSPSortViewControl::ComponentControl + (TInt /*aIndex*/) const + { + return iListBox; + } + +void CxSPSortViewControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + if ( iListBox ) + { + iListBox->HandlePointerEventL( aPointerEvent ); + } + } + +CCoeControl& CxSPSortViewControl::ComponentControl() const + { + return *iListBox; + } + +void CxSPSortViewControl::SetListBoxContentsL() + { + _LIT( KFormat, "%d" ); + + CArrayPtr* icons = new(ELeave) CArrayPtrFlat( 1 ); + CleanupStack::PushL( TCleanupItem( CleanUpResetAndDestroy, icons )); + + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + // Load the avkon "mark" icon + AknIconUtils::CreateIconLC( bitmap, mask, AknIconUtils::AvkonIconFileName(), + EMbmAvkonQgn_indi_marked_add, + EMbmAvkonQgn_indi_marked_add_mask ); + + CGulIcon* icon = CGulIcon::NewL(bitmap,mask); + CleanupStack::Pop( 2 ); // mask, bitmap + CleanupStack::PushL( icon ); + icons->AppendL( icon ); + CleanupStack::Pop( icon ); + + + RPointerArray infoArray; + CleanupClosePushL( infoArray ); + iViewIdChanger.GetTabViewInfoL( infoArray ); + const TInt count = infoArray.Count(); + CDesC16ArrayFlat* texts = new (ELeave) CDesC16ArrayFlat( count ); + CleanupStack::PushL(texts); + + for( TInt i = 0; i < count; i++ ) + { + const CxSPViewInfo& info = *infoArray[i]; + TBool found( EFalse ); + for( TInt j = 0; j < iExtensions.Count() && !found; j++ ) + { + if( info.Id() == iExtensions.At( j )->ExtensionFactory()->Id() ) + { + TBuf buf; + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL; + //info->Name() denotes the ServiceName of the Service in SpSettings + //PBK2 ServiceManager has the brandicons of all the services installed + //to the device. + //So iterate thro the PBK2ServiceManager, to find the service which matches + //the info->Name() + //If matches use this icon else use the default icon for the tabs + //get the XSP ServiceName + + // CPbk2ServiceManager stores all the brandinfo + // related to the services configured to the phone + // use this to show uniform icon throughout PhoneBook + MPbk2ApplicationServices2* servicesExtension = + reinterpret_cast + ( Phonebook2::Pbk2AppUi()->ApplicationServices(). + MPbk2ApplicationServicesExtension( + KMPbk2ApplicationServicesExtension2Uid ) ); + CPbk2ServiceManager& servMan = servicesExtension->ServiceManager(); + const CPbk2ServiceManager::RServicesArray& services = servMan.Services(); + for ( TInt i = 0; i < services.Count(); i++ ) + { + const CPbk2ServiceManager::TService& service = services[i]; + //Found the appropriate service info + if ( service.iName == info.Name() ) + { + if ( service.iBitmap && service.iMask ) + { + TSize size( 25, 25 ); //default size used in PB + + AknIconUtils::SetSize( + service.iBitmap, + size ); + AknIconUtils::SetSize( + service.iMask, + size ); + + bitmap = new (ELeave) CFbsBitmap; + CleanupStack::PushL( bitmap ); + bitmap->Duplicate( service.iBitmap->Handle() ); + + mask = new (ELeave) CFbsBitmap; + CleanupStack::PushL( mask ); + mask->Duplicate( service.iMask->Handle() ); + } + break; + } + } + + buf.Format( KFormat, icons->Count() ); + + if ( !bitmap ) + { + AknIconUtils::CreateIconLC( bitmap, mask, info.SortIconFile(), + info.SortIconId(), info.SortMaskId() ); + } + + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + CleanupStack::Pop( 2 ); // mask, bitmap + CleanupStack::PushL( icon ); + icons->AppendL( icon ); + CleanupStack::Pop( icon ); + + buf.Append( KTab ); + buf.Append( info.Name() ); + buf.Append( KTab ); + buf.Append( KTab ); + texts->AppendL( buf ); + iSortedOrder.AppendL( i ); // create the initial sort order + found = ETrue; + } + } + } + + + iListBox->Model()->SetItemTextArray( texts ); + iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray); + CleanupStack::Pop(texts); + iListBox->HandleItemAdditionL(); + + CleanupStack::PopAndDestroy(); // infoArray + + CleanupStack::Pop( icons ); + + iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons ); + } + + +void CxSPSortViewControl::SetCurrentItemMarkedL( TBool aMark ) + { + if( aMark ) + { + AknSelectionService::HandleMarkableListProcessCommandL( EAknCmdMark, iListBox ); + } + else + { + AknSelectionService::HandleMarkableListProcessCommandL( EAknUnmarkAll, iListBox ); + } + iListBox->DrawNow(); + } + + +void CxSPSortViewControl::MoveMarkedItemL() + { + TInt currentIndex = iListBox->CurrentItemIndex(); + + TInt markedIndex = -1; + + const CListBoxView::CSelectionIndexArray* inds = iListBox->SelectionIndexes(); + TInt count = inds->Count(); + if( count == 1 ) // sanity check, single selection list should have only one selection + { + markedIndex = (*inds)[0]; + if( markedIndex == currentIndex ) + { + AknSelectionService::HandleMarkableListProcessCommandL( EAknUnmarkAll, iListBox ); + iListBox->DrawNow(); + return; + } + } + else + { + AknSelectionService::HandleMarkableListProcessCommandL( EAknUnmarkAll, iListBox ); + iListBox->DrawNow(); + return; + } + + CTextListBoxModel* model = iListBox->Model(); + CDesCArray* texts = static_cast( model->ItemTextArray() ); + if(( texts->Count() > markedIndex ) && ( markedIndex >= 0 )) + { + TBuf markedText = (*texts)[markedIndex]; + texts->Delete( markedIndex ); + iListBox->HandleItemRemovalL(); + + TUint32 moveItem = iSortedOrder[markedIndex]; + iSortedOrder.Remove( markedIndex ); + + texts->InsertL( currentIndex, markedText ); + iListBox->HandleItemAdditionL(); + User::LeaveIfError( iSortedOrder.Insert( moveItem, currentIndex )); + } + else if( markedIndex < 0 ) + { + User::Leave( KErrUnderflow ); + } + else + { + User::Leave( KErrOverflow ); + } + + AknSelectionService::HandleMarkableListProcessCommandL( EAknUnmarkAll, iListBox ); + iListBox->DrawNow(); + } + + +TBool CxSPSortViewControl::CommitSortL( MGlobalNoteObserver* aObserver ) + { + TBool changes = EFalse; + for( TInt i=0; i idArray; + CleanupClosePushL( idArray ); + RPointerArray infoArray; + CleanupClosePushL( infoArray ); + iViewIdChanger.GetTabViewInfoL( infoArray ); + + for( TInt i = 0; i < iSortedOrder.Count(); i++ ) + { + const CxSPViewInfo& info = *infoArray[iSortedOrder[i]]; + TxSPOrderUnit orderUnit; + orderUnit.iId = info.Id(); + orderUnit.iViewId = info.OldViewId(); + idArray.AppendL( orderUnit ); + } + + xSPOrderOrganizer::Reorganize( idArray ); + + CleanupStack::PopAndDestroy( 2 ); // infoArray, idArray + + // Load the used text label from resource + HBufC* stringholder = StringLoader::LoadLC + ( R_QTN_EXTENSION_MANAGER_SHUTDOWN_NOTE, iEikonEnv ); + + // Create observer for listening global note dismissal + delete iGlobalNoteObserver; + iGlobalNoteObserver = 0; + iGlobalNoteObserver = CGlobalNoteObserver::NewL( aObserver ); + + // Create and show global note + // The note cannot be deleted immediately because deleting it also + // causes the observer to be notified with KErrCancel + delete iGlobalNote; + iGlobalNote = 0; + iGlobalNote = CAknGlobalNote::NewL(); + iGlobalNote->SetSoftkeys( R_AVKON_SOFTKEYS_OK_EMPTY ); + iGlobalNote->ShowNoteL( + iGlobalNoteObserver->iStatus, + EAknGlobalInformationNote, + *stringholder ); + + CleanupStack::PopAndDestroy( stringholder ); + } + return changes; + } + +// End of file