--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsettings/multiselectionui/src/upnpmultiselectionutility.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,503 @@
+/*
+* Copyright (c) 2008 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: Multiselection dialog implementation
+*
+*/
+
+
+
+
+
+
+// INCLUDE FILES
+#include <StringLoader.h>
+#include <avkon.mbg>
+#include <eikclbd.h>
+#include <aknlists.h>
+#include <AknsUtils.h>
+
+#include <cupnpmultiselectionui.rsg>
+#include "upnpmultiselectionutility.h"
+#include "upnpfilesharingengine.h"
+
+_LIT( KComponentLogfile, "multiselectionui.txt");
+#include "upnplog.h"
+
+
+//CONSTANTS
+
+// Format string for listbox items
+_LIT( KItemFormatString, "1\t%S" );
+
+const TInt KShareNoneIndex = 0; // listbox index of "do not share"
+const TInt KShareAllIndex = 1; // listbox index of "share all"
+const TInt KPredefinedSelections = 2; // Share none and share all
+
+// ================= MEMBER FUNCTIONS =======================
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::CUpnpMultiselectionUtility
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CUpnpMultiselectionUtility::CUpnpMultiselectionUtility()
+ {
+ __LOG("CUpnpMultiselectionUtility::CUpnpMultiselectionUtility");
+ iShareNoneSelected = EFalse;
+ iShareAllSelected = EFalse;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::CUpnpMultiselectionUtility
+// C++ default destructor.
+// --------------------------------------------------------------------------
+//
+CUpnpMultiselectionUtility::~CUpnpMultiselectionUtility()
+ {
+ __LOG("CUpnpMultiselectionUtility::~CUpnpMultiselectionUtility");
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::CollectSelectedItemsL()
+// Collects selected items to member variable for later use
+// --------------------------------------------------------------------------
+//
+void CUpnpMultiselectionUtility::CollectSelectedItemsL(
+ CEikListBox* aListBox, TBool aFirstRun )
+ {
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL begin");
+
+ const CArrayFix<TInt>* indexes = NULL;
+
+ //get the true indexes of marked items
+ CAknListBoxFilterItems* filter
+ = static_cast < CAknFilteredTextListBoxModel* >
+ ( aListBox->Model() )->Filter();
+ if ( filter )
+ {
+ // Filter knows all.
+ filter->UpdateSelectionIndexesL();
+ indexes = filter->SelectionIndexes();
+ }
+ else
+ {
+ // No filter.
+ indexes = aListBox->View()->SelectionIndexes();
+ }
+
+ if ( indexes->Count() > 0 )
+ {
+ // obtain selection state
+ TShareSelectionState selectionState =
+ ShareSelectionStateFromArray( *indexes );
+
+ // make some decisions based on the tabs selected
+ DoSelectionLogicL( aListBox, aFirstRun,
+ indexes, filter, selectionState );
+
+ }
+ else // no items selected
+ {
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL: \
+No items selected");
+
+ filter->ResetFilteringL();
+ aListBox->View()->SelectItemL( KShareNoneIndex );
+ }
+
+ // update iShareNoneSelected and iShareAllSelected member variables
+ iShareNoneSelected = EFalse;
+ iShareAllSelected = EFalse;
+
+ const CArrayFix<TInt>* indexesAfter = NULL;
+
+ if ( filter )
+ {
+ // Filter knows all.
+ filter->UpdateSelectionIndexesL();
+ indexesAfter = filter->SelectionIndexes();
+ }
+ else
+ {
+ // No filter.
+ indexesAfter = aListBox->View()->SelectionIndexes();
+ }
+
+ for ( TInt i = 0 ; i < indexesAfter->Count() ; i++ )
+ {
+ if ( indexesAfter->At( i ) == KShareNoneIndex )
+ {
+ iShareNoneSelected = ETrue;
+ }
+ else if ( indexesAfter->At( i ) == KShareAllIndex )
+ {
+ iShareAllSelected = ETrue;
+ }
+ }
+
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL end");
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::DoSelectionLogicL
+// Do some decisions based on the selection state
+// --------------------------------------------------------------------------
+//
+void CUpnpMultiselectionUtility::DoSelectionLogicL(
+ CEikListBox* aListBox,
+ TBool aFirstRun,
+ const CArrayFix<TInt>* aIndexes,
+ CAknListBoxFilterItems* aFilter,
+ TShareSelectionState aSelectionState )
+ {
+ const TInt arrayGranularity( aIndexes->Count() + 1 );
+
+ // If "do not share" was not selected before and it is now, unselect
+ // all except "do not share".
+ if ( ( aSelectionState == EShareNoneSelected ||
+ aSelectionState == EShareNoneAndShareAllSelected ) &&
+ !iShareNoneSelected )
+ {
+ // Create new selectionindexarray with only "do not share"
+ // selected and assign it to the listbox.
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL:\
+Do not share selected");
+ CListBoxView::CSelectionIndexArray* noneArr =
+ new (ELeave) CArrayFixFlat<TInt>( arrayGranularity );
+ CleanupStack::PushL( noneArr );
+ noneArr->AppendL( KShareNoneIndex );
+ aListBox->SetSelectionIndexesL( noneArr );
+ CleanupStack::PopAndDestroy( noneArr );
+ }
+ // if "share all" was not selected before and it is now, select all
+ // except "do not share".
+ // OR if this method is executed first time (from PostLayoutDynInitL)
+ // and share all is selected, then we trust that all items should be
+ // selected.
+ else if ( ( ( aSelectionState == EShareAllSelected ||
+ aSelectionState == EShareNoneAndShareAllSelected ) &&
+ !iShareAllSelected )
+ || aSelectionState == EShareAllSelected && aFirstRun )
+ {
+ // Create new selectionindexarray with "share all" and all other
+ // items except "do not share" selected and assign it to the
+ // listbox.
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL: \
+All files selected");
+ TInt itemCount = aFilter->NonFilteredNumberOfItems();
+
+ CListBoxView::CSelectionIndexArray* allArr =
+ new (ELeave) CArrayFixFlat<TInt>( arrayGranularity );
+ CleanupStack::PushL( allArr );
+ allArr->AppendL( KShareAllIndex );
+ for ( TInt i( KPredefinedSelections ); i < itemCount; i++ )
+ {
+ allArr->AppendL( i );
+ }
+ aFilter->ResetFilteringL();
+ aListBox->SetSelectionIndexesL( allArr );
+ CleanupStack::PopAndDestroy( allArr );
+ }
+ // if share all selection is removed
+ else if ( aSelectionState == EItemsSelected &&
+ iShareAllSelected )
+ {
+ // Create new selectionindexarray with only "do not share"
+ // selected and assign it to the listbox.
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL: \
+Do not share selected");
+ CListBoxView::CSelectionIndexArray* noneArr =
+ new (ELeave) CArrayFixFlat<TInt>( arrayGranularity );
+ CleanupStack::PushL( noneArr );
+ noneArr->AppendL( KShareNoneIndex );
+ aListBox->SetSelectionIndexesL( noneArr );
+ CleanupStack::PopAndDestroy( noneArr );
+ }
+ // if only some individual items have been modified
+ else if ( aSelectionState == EItemsSelected &&
+ !iShareAllSelected &&
+ !iShareNoneSelected )
+ {
+ // do nothing. selections are kept as they are
+ }
+ // if share none is selected with some individual item,
+ // unselect share none
+ else if ( aSelectionState == EShareNoneSelected && aIndexes->Count() > 1 )
+ {
+ // Create similar selectionindexarray without "do not share"
+ // selected and assign it to the listbox.
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL: \
+Do not share selected");
+
+ for( TInt y=0; y < aIndexes->Count(); y++ )
+ {
+ TInt itemIndex = aIndexes->At(y);
+ if ( itemIndex == 0 || itemIndex == 1 )
+ {
+ aListBox->View()->DeselectItem(
+ aFilter->VisibleItemIndex(itemIndex) );
+ }
+ }
+ }
+ else if ( aSelectionState == EShareAllSelected &&
+ aIndexes->Count() < aFilter->NonFilteredNumberOfItems() - 1 )
+ {
+ if ( aIndexes->Count() > 0 )
+ {
+ // all items were selected and some item (not share all) has
+ // been unselected -> remove selection also from share all.
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL: \
+Do not share selected");
+
+ for( TInt y=0; y < aIndexes->Count(); y++ )
+ {
+ TInt itemIndex = aIndexes->At(y);
+ if ( itemIndex == KShareAllIndex )
+ {
+ aListBox->View()->DeselectItem(
+ aFilter->VisibleItemIndex( itemIndex ) );
+ }
+ }
+
+ if ( !aListBox->View()->SelectionIndexes()->Count() )
+ {
+ // Last individual item has been unselected.
+ // Create new selectionindexarray with only
+ // "do not share" selected and assign it to the listbox.
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL: \
+Do not share selected");
+ CListBoxView::CSelectionIndexArray* noneArr =
+ new (ELeave) CArrayFixFlat<TInt>( arrayGranularity );
+ CleanupStack::PushL( noneArr );
+ noneArr->AppendL( KShareNoneIndex );
+ aListBox->SetSelectionIndexesL( noneArr );
+ CleanupStack::PopAndDestroy( noneArr );
+ }
+ }
+ else
+ {
+ // some item unselected and no other items left except
+ // "share all"
+
+ // Create new selectionindexarray with only "do not share"
+ // selected and assign it to the listbox.
+ __LOG("CUpnpMultiselectionUtility::CollectSelectedItemsL: \
+Do not share selected");
+ CListBoxView::CSelectionIndexArray* noneArr =
+ new (ELeave) CArrayFixFlat<TInt>( arrayGranularity );
+ CleanupStack::PushL( noneArr );
+ noneArr->AppendL( KShareNoneIndex );
+ aListBox->SetSelectionIndexesL( noneArr );
+ CleanupStack::PopAndDestroy( noneArr );
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::ConvertSelectionsForEngineL
+// Convert the selections from UI to engine as "old style selections"
+// Has effect only if "Share All" is selected
+// --------------------------------------------------------------------------
+//
+void CUpnpMultiselectionUtility::ConvertSelectionsForEngineL(
+ CArrayFix<TInt>& aSelections ) const
+ {
+ __LOG("CUpnpMultiselectionUtility::ConvertSelectionsForEngineL begin");
+
+ for ( TInt i(0); i < aSelections.Count(); i++ )
+ {
+ if ( aSelections.At( i ) == KShareAllIndex )
+ {
+ aSelections.Reset();
+ aSelections.AppendL( KShareAllIndex );
+ i = aSelections.Count();
+ }
+ }
+
+ __LOG("CUpnpMultiselectionUtility::ConvertSelectionsForEngineL end");
+ }
+
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::AppendIconToArray
+// Load a possibly skinned icon (with mask) and append it to an
+// icon array.
+// --------------------------------------------------------------------------
+//
+void CUpnpMultiselectionUtility::AppendIconToArrayL(CAknIconArray* aArray,
+ MAknsSkinInstance* aSkin,
+ const TDesC& aMbmFile,
+ const TAknsItemID& aID,
+ TInt aBitmapId,
+ TInt aMaskId) const
+ {
+ __LOG("CUpnpMultiselectionUtility::AppendIconToArrayL begin");
+
+ __ASSERT_DEBUG(aArray != NULL, User::Leave(KErrArgument));
+
+ CFbsBitmap* bitmap = NULL;
+ CFbsBitmap* mask = NULL;
+
+ AknsUtils::CreateIconLC( aSkin, aID,
+ bitmap, mask, aMbmFile, aBitmapId, aMaskId );
+
+ CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
+ icon->SetBitmapsOwnedExternally( EFalse );
+
+ // icon now owns the bitmaps, no need to keep on cleanup stack.
+ CleanupStack::Pop(2); // mask, bitmap
+ bitmap = NULL;
+ mask = NULL;
+
+ CleanupStack::PushL( icon );
+
+ aArray->AppendL( icon );
+
+ // aArray now owns the icon, no need to delete.
+ CleanupStack::Pop(icon);
+ __LOG("CUpnpMultiselectionUtility::AppendIconToArrayL end");
+
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::AppendShareAllSelectionL
+// Appends "share all files" item to the listbox
+// --------------------------------------------------------------------------
+//
+void CUpnpMultiselectionUtility::AppendShareAllSelectionL(
+ CDesCArray* aListBoxArray ) const
+ {
+ __LOG("CUpnpMultiselectionUtility::AppendShareAllSelectionL begin");
+ HBufC* item = HBufC::NewL( KMaxFileName );
+ CleanupStack::PushL( item );
+ HBufC* item2 = HBufC::NewL( KMaxFileName );
+ CleanupStack::PushL( item2 );
+ HBufC* itemText1 = StringLoader::LoadLC(
+ R_UPNP_MULTISELECTION_SHARE_ALL_TEXT );
+ HBufC* itemText2 = StringLoader::LoadLC(
+ R_UPNP_MULTISELECTION_DO_NOT_SHARE_TEXT );
+ // create item string for the listbox (icon + album name)
+ item->Des().Format( KItemFormatString, itemText1 );
+ item2->Des().Format( KItemFormatString, itemText2 );
+ // append "share all files" -selection to the listbox
+ aListBoxArray->AppendL( item2->Des() );
+ aListBoxArray->AppendL( item->Des() );
+
+ CleanupStack::PopAndDestroy(2); // stringloader
+ CleanupStack::PopAndDestroy(2); // item item2
+ __LOG( "CUpnpMultiselectionUtility::AppendShareAllSelectionL end" );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::SetShareSelectionState
+// (Commented in the header)
+// --------------------------------------------------------------------------
+//
+void CUpnpMultiselectionUtility::SetShareSelectionState(
+ TShareSelectionState aSelectionState )
+ {
+ switch ( aSelectionState )
+ {
+ case EShareNoneSelected:
+ {
+ iShareNoneSelected = ETrue;
+ iShareAllSelected = EFalse;
+ break;
+ }
+ case EShareAllSelected:
+ {
+ iShareNoneSelected = EFalse;
+ iShareAllSelected = ETrue;
+ break;
+ }
+ case ENoShareNoneOrShareAllSelected:
+ {
+ iShareNoneSelected = EFalse;
+ iShareAllSelected = EFalse;
+ break;
+ }
+ default:
+ {
+ // Should not be reached.
+ break;
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpMultiselectionUtility::ShareSelectionStateFromArray
+// (Commented in the header)
+// --------------------------------------------------------------------------
+//
+TShareSelectionState
+ CUpnpMultiselectionUtility::ShareSelectionStateFromArray(
+ const CArrayFix<TInt>& aIndexes ) const
+ {
+ TShareSelectionState retval = EUndefined;
+ TBool shareNoneFound = EFalse;
+ TBool shareAllFound = EFalse;
+ TBool itemsSelected = EFalse;
+
+ // Check if the indexes array contains do not share or share all.
+ for ( TInt i = 0 ; i < aIndexes.Count() ; i++ )
+ {
+ if ( aIndexes.At( i ) == KShareNoneIndex )
+ {
+ shareNoneFound = ETrue;
+ }
+ else if ( aIndexes.At( i ) == KShareAllIndex )
+ {
+ shareAllFound = ETrue;
+ }
+ }
+
+ //
+ if ( !shareAllFound && !shareNoneFound )
+ {
+ // "do not share" or "share all" are not selected. Check if there are
+ // other items selected.
+ if ( aIndexes.Count() )
+ {
+ itemsSelected = ETrue;
+ }
+ }
+
+ // set retval
+ if ( itemsSelected )
+ {
+ retval = EItemsSelected;
+ }
+ else if ( shareNoneFound && !shareAllFound )
+ {
+ retval = EShareNoneSelected;
+ }
+ else if ( !shareNoneFound && shareAllFound )
+ {
+ retval = EShareAllSelected;
+ }
+ else if ( shareNoneFound && shareAllFound )
+ {
+ retval = EShareNoneAndShareAllSelected;
+ }
+ else if ( !shareNoneFound && !shareAllFound )
+ {
+ retval = ENoShareNoneOrShareAllSelected;
+ }
+
+ return retval;
+ }
+
+
+// End of file