phonebookui/Phonebook2/xSPExtensionManager/src/CxSPSortViewControl.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /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 <aknlists.h>   // CAknSingleStyleListBox
+#include <avkon.mbg>
+#include <eikclbd.h>
+#include <gulicon.h>
+#include <AknGlobalNote.h>
+#include <StringLoader.h>
+#include <avkon.hrh>
+
+// internal includes
+#include "CxSPLoader.h"
+#include "MxSPFactory.h"
+#include "CxSPViewIdChanger.h"
+#include "CxSPViewInfo.h"
+#include <ExtensionManagerRes.rsg>
+#include "xSPOrderOrganizer.h"
+#include "CGlobalNoteObserver.h"
+#include <MPbk2ApplicationServices2.h>
+#include <MPbk2ApplicationServices.h>
+#include <CPbk2ServiceManager.h>
+#include <MPbk2AppUi.h>
+#include <CPbk2UIExtensionView.h>
+
+// CONSTANTS
+_LIT( KTab, "\t" );
+const TUint KMaxListBoxBufSize( 256 ); // Maximum listbox item text size
+
+
+void CleanUpResetAndDestroy( TAny* aArray )
+	{
+	if( aArray )
+		{
+		CArrayPtrFlat<TDesC>* array = (CArrayPtrFlat<TDesC>*)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<CGulIcon>* icons = new(ELeave) CArrayPtrFlat<CGulIcon>( 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<CxSPViewInfo> 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<KMaxListBoxBufSize> 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<MPbk2ApplicationServices2*>
+                        ( 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<CDesCArray*>( model->ItemTextArray() );
+    if(( texts->Count() > markedIndex ) && ( markedIndex >= 0 ))
+    	{
+	    TBuf<KMaxListBoxBufSize> 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<iSortedOrder.Count(); i++)
+		{
+		// check if the order has really changed
+		if( i != iSortedOrder[i] )
+			{
+			changes = ETrue;
+			break;
+			}
+		}
+
+	if( changes )
+		{
+		// new re-sorted array of extension IDs
+		RArray<TxSPOrderUnit> idArray;
+		CleanupClosePushL( idArray );
+		RPointerArray<CxSPViewInfo> 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