homesync/contentmanager/mediaservant/src/msfillcontainer.cpp
changeset 0 7f85d04be362
child 30 5ec426854821
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homesync/contentmanager/mediaservant/src/msfillcontainer.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,1125 @@
+/*
+* 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:  CMSFillContainer class implementation
+*
+*/
+
+
+#include <AknIconArray.h>
+#include <aknlists.h>
+#include <AknsUtils.h>
+#include <eikclbd.h>
+#include <mediaservant.rsg>
+#include <mediaservant.mbg>
+#include <StringLoader.h>
+#include <avkon.mbg>
+#include <aknlistquerydialog.h>
+#include "upnpstring.h"
+#include <e32math.h>
+
+#include "cmdriveinfo.h"
+#include "mserv.hlp.hrh"
+#include "cmfillrule.h"
+#include "msfillview.h"
+#include "msappui.h"
+#include "mediaservantuid.h"
+#include "msengine.h"
+#include "msfillcontainer.h"
+#include "msconstants.h"
+#include "msdebug.h"
+
+// CONSTANTS
+
+// Listbox granularity
+const TInt KListGranularity = 5;
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::CMSFillContainer()
+// --------------------------------------------------------------------------
+//
+CMSFillContainer::CMSFillContainer( CMSAppUi& aAppUi, CMSFillView& aView ) :
+    iMSAppUi( aAppUi ),
+    iView( aView )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::CMSFillContainer"));
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::~CMSFillContainer()
+// --------------------------------------------------------------------------
+//
+CMSFillContainer::~CMSFillContainer()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::~CMSFillContainer"));
+
+    iSelectedLists.Close();
+
+    iView.ClearCurrentNaviPaneText();
+
+    delete iListBox; // Deletes listbox object.
+
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::ConstructL()
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::ConstructL( TRect aRect )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::ConstructL"));
+
+    // fill quota size
+    CalculateFillQuotaL();
+
+    CreateWindowL();
+
+    iListBox = new (ELeave) CAknSingleGraphicStyleListBox;
+
+    // This is multiselection listbox but resource defines it as SELECTION
+    // LIST because we don't want to let framework handle icon changes.
+    // Framework toggles between two icons whereas we have to show multiple
+    // icons.
+    // Special icons are changed every time item selection or priority
+    // changes. Calculations for icons are made in SetIcon()
+    SetListBoxFromResourceL(iListBox, R_FILL_VIEW_LISTBOX);
+
+    // Create icons
+    CAknIconArray* icons = new (ELeave) CAknIconArray( EIconCount );
+    CleanupStack::PushL( icons );
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    // selected and fits icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_white_check,
+                        EMbmMediaservantQgn_mserv_white_check_mask );
+
+    // unselected and fits icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_white_uncheck,
+                        EMbmMediaservantQgn_mserv_white_uncheck_mask );
+
+    // selected and partially fits icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_yellow_check,
+                        EMbmMediaservantQgn_mserv_yellow_check_mask );
+
+    // unselected and partially fits icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_yellow_uncheck,
+                        EMbmMediaservantQgn_mserv_yellow_uncheck_mask );
+
+    // selected and doesn't fit icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_red_check,
+                        EMbmMediaservantQgn_mserv_red_check_mask );
+
+    // unselected and doesn't fit icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_red_uncheck,
+                        EMbmMediaservantQgn_mserv_red_uncheck_mask );
+    // video type -icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_video_list_small,
+                        EMbmMediaservantQgn_mserv_video_list_small_mask );
+
+    // image type -icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_image_list_small,
+                        EMbmMediaservantQgn_mserv_image_list_small_mask );
+
+    // music type -icon
+    AppendIconToArrayL( icons, skin,
+                        KMSMifFileName,
+                        KAknsIIDDefault,
+                        EMbmMediaservantQgn_mserv_music_list_small,
+                        EMbmMediaservantQgn_mserv_music_list_small_mask );
+
+    // mark icon for reordering mode -icon
+    AppendIconToArrayL( icons, skin,
+                        KAvkonMifFileName,
+                        KAknsIIDDefault,
+                        EMbmAvkonQgn_indi_marked_add,
+                        EMbmAvkonQgn_indi_marked_add_mask );
+
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons );
+    CleanupStack::Pop(icons);
+
+
+    // Create icon for context pane
+    AknsUtils::CreateIconL( skin,
+                            KAknsIIDDefault,
+                            iIcon,
+                            iIconMask,
+                            KMSMifFileName,
+                            EMbmMediaservantQgn_mserv_from_home,
+                            EMbmMediaservantQgn_mserv_from_home_mask);
+    // change context icon
+    SetContextPaneIconL( iIcon, iIconMask );
+
+    SetRect(aRect);
+
+    // Get rule controller
+    iFillRuleController = iMSAppUi.FillRuleController();
+    // Update array
+    iFillRuleController->UpdateArrayL();
+    // get fill lists
+    iFillListArray = iFillRuleController->FillListArray();
+    // keep selections safe
+    iSelectedIndexes = iListBox->SelectionIndexes();
+
+    TInt64 capasity;
+    TInt64 free;
+    iMSAppUi.ReadMMCInfoL( capasity, free );
+    iFreeMemory = Min( free, iQuota );
+
+    if ( iFillListArray->Count() > 0 )
+        {
+        // Add data to listbox
+        UpdateListBoxDataL();
+
+        // Enable text scrolling
+        iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+
+        // get item array
+        CDesCArray* itemArray = static_cast<CDesCArray*>
+                                (iListBox->Model()->ItemTextArray());
+
+        iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+        }
+
+    // keep selections safe
+    const CListBoxView::CSelectionIndexArray* selected =
+                                            iListBox->SelectionIndexes();
+
+    for ( TInt index = 0; index < selected->Count(); index++ )
+        {
+        iSelectedLists.Append( (*selected)[index] );
+        }
+
+    // Set highlighted item
+    TInt currentItem = iMSAppUi.ParameterAgent()->FillViewFocusIndex();
+    if ( currentItem >= 0 )
+        {
+        //Set current item
+        iListBox->SetCurrentItemIndex( currentItem );
+        }
+    else
+        {
+        // first item
+        // This is set when new list is created without existing lists
+        iListBox->SetCurrentItemIndex( 0 );
+        }
+
+    UpdateNaviTextL();
+
+	iPreviousItemIndex = 0;
+	iDragItemIndex = 0;
+
+    // Change middle softkey according to selection
+    TBool listSelected = IsCurrentListItemActive();
+    iView.SetCbaL( listSelected );
+
+    ActivateL(); // Activates window. ( Ready to draw )
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::CountComponentControls()
+// Returns number of components.
+// --------------------------------------------------------------------------
+//
+TInt CMSFillContainer::CountComponentControls() const
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::CountComponentControls"));
+
+    return 1; // return number of controls inside this container
+    }
+
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::ComponentControl()
+// Returns pointer to particular component.
+// --------------------------------------------------------------------------
+//
+CCoeControl* CMSFillContainer::ComponentControl(TInt /*aIndex*/) const
+
+    {
+    return iListBox; // return a pointer to the listbox
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::OfferKeyEventL()
+// Handles the key events.
+// --------------------------------------------------------------------------
+//
+TKeyResponse CMSFillContainer::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::OfferKeyEventL"));
+
+    TKeyResponse response = EKeyWasNotConsumed;
+
+    if ( aType != EEventKey )
+        {
+        response =  EKeyWasNotConsumed;
+        }
+
+    else if ( iListBox && iListBox->CurrentItemIndex() >= 0 )
+        {
+        // check if reordering mode is activated
+        if ( iReorderState == EMSFillReorderActive ||
+             aKeyEvent.iCode == EKeyLeftArrow ||
+             aKeyEvent.iCode == EKeyRightArrow )
+            {
+            response = HandleReorderKeyEventL( aKeyEvent, aType );
+            }
+
+        // delete list
+        else if ( aKeyEvent.iCode == EKeyBackspace )
+            {
+            DeleteRuleL();
+            response = EKeyWasConsumed;
+            }
+
+        // activate/deactivate list
+        else if ( aKeyEvent.iCode == EKeyOK )
+            {
+            CCmFillRule* rule =
+                (*iFillListArray)[iListBox->CurrentItemIndex()]->List();
+            if ( rule->Selected() == ECmSelected )
+                {
+                rule->SetSelected( ECmUnSelected );
+                }
+            else
+                {
+                rule->SetSelected( ECmSelected );
+                }
+            iView.SetListUnselected();
+            UpdateListBoxDataL();
+            response = EKeyWasConsumed;
+            }
+
+        // default
+        else
+            {
+            response = iListBox->OfferKeyEventL( aKeyEvent, aType );
+            }
+
+
+        TCmServerState state;
+        iMSAppUi.MSEngine()->ServerState( state );
+        if ( ( aKeyEvent.iCode == EKeyUpArrow ||
+             ( aKeyEvent.iCode == EKeyDownArrow )))
+            {
+            // change navi pane text to match highlighted list size
+            UpdateNaviTextL();
+            }
+        }
+
+#ifndef __SERIES60_31__
+    if ( iReorderState == EMSFillNormal )
+        {
+        // Change middle softkey according to selection
+        TBool listSelected = IsCurrentListItemActive();
+        iView.SetCbaL( listSelected );
+        }
+#endif
+
+    return response;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::HandleDragAndDropEventsL()
+// Handles drag and drop events on touch screen
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::HandleDragAndDropEventsL( const TPointerEvent& aPointerEvent )
+	{
+	if ( aPointerEvent.iType == TPointerEvent::EButton1Down &&
+	     iReorderState != EMSFillNormal )
+		{
+		iReorderState = EMSFillReorderActive;
+	   	iDragItemIndex = iListBox->CurrentItemIndex();
+		}
+	else if ( aPointerEvent.iType == TPointerEvent::EButton1Up &&
+	     iReorderState == EMSFillReorderActive )
+		{
+		iView.HandleCommandL( EMSCmdDrop );
+		TInt listBoxItem = iListBox->CurrentItemIndex();
+		iListBox->SetCurrentItemIndex( iDragItemIndex );
+
+		TKeyEvent keyEvent;
+		// Move dragged item downwards
+		if ( listBoxItem >= iDragItemIndex )
+			{
+			keyEvent.iCode = EKeyDownArrow;
+        	for( TInt c = 0; listBoxItem > iDragItemIndex + c; c++ )
+	        	{
+	        	HandleReorderKeyEventL( keyEvent, EEventKey );
+	        	}
+			}
+		// Move dragged item upwards
+		else
+			{
+			keyEvent.iCode = EKeyUpArrow;
+        	for( TInt c = 0; listBoxItem < iDragItemIndex - c; c++ )
+	        	{
+	        	HandleReorderKeyEventL( keyEvent, EEventKey );
+	        	}
+			}
+        	
+		iListBox->SetCurrentItemIndex( listBoxItem );
+		}
+	}
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::UpdateListBoxDataL()
+// Creates listbox items
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::UpdateListBoxDataL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::UpdateListBoxDataL"));
+    TInt64 freeSpace = iFreeMemory;
+
+    TCmServerState state;
+    iMSAppUi.MSEngine()->ServerState( state );
+
+    // Keep item index safe for reordering mode because we reset the list
+    TInt currentItemIndex = iListBox->CurrentItemIndex();
+
+    // reset list size
+    iSizeOfSelectedLists = 0;
+
+    TBuf<KMaxFileName> item;
+    HBufC* primary_text = HBufC::NewL( KMaxFileName );
+    CleanupStack::PushL( primary_text );
+
+    // Listbox items
+    CDesCArray* itemArray = static_cast<CDesCArray*>
+                                   (iListBox->Model()->ItemTextArray());
+    itemArray->Reset();
+
+    // Marked listbox item indexes
+    CArrayFix<TInt>* selectionArray = new (ELeave )
+                                   CArrayFixFlat<TInt>(KListGranularity);
+
+    CleanupStack::PushL( selectionArray );
+
+    TInt ruleCount = iFillListArray->Count();
+
+    for ( TInt index = 0; index < ruleCount; index++ )
+        {
+        // Get fill rule name and put it to the listbox
+        CCmFillRule* rule = (*iFillListArray)[index]->List();
+        HBufC* listName = UpnpString::ToUnicodeL( rule->Name() );
+        CleanupStack::PushL( listName );
+        primary_text->Des().Copy( *listName );
+        CleanupStack::PopAndDestroy( listName );
+
+
+        // Check if rule is active and mark it in the list
+        TCmFillRuleStatus status = rule->Selected();
+
+        TInt64 listSize = (*iFillListArray)[index]->ListSize();
+
+        if ( status == ECmSelected )
+            {
+            selectionArray->AppendL( index );
+
+            TInt id = rule->ListId();
+            TInt64 size = 0;
+            iMSAppUi.GetFilledFilesSize( size, id );
+            
+            // list selected - add used memory size
+            iSizeOfSelectedLists += ( listSize - size );
+            }
+        // calculate icon index
+        TInt iconIndex = ListItemIconIndex( index,
+                                            listSize,
+                                            freeSpace );
+
+
+        switch ( rule->MediaType() )
+            {
+            case ECmVideo:
+                {
+                item.Format( KSingleGraphicStyleFormatString,
+                             iconIndex, primary_text, EVideoType );
+                break;
+                }
+            case ECmImage:
+                {
+                item.Format( KSingleGraphicStyleFormatString,
+                             iconIndex, primary_text, EImageType );
+                break;
+                }
+            case ECmAudio:
+                {
+                item.Format( KSingleGraphicStyleFormatString,
+                             iconIndex, primary_text, EAudioType );
+                break;
+                }
+            default:
+                {
+                item.Format( KSingleGraphicStyleFormatStringNoTrailIcons,
+                             iconIndex, primary_text);
+                break;
+                }
+            }
+
+        // Check if reorder mode is active and mark current item
+        if ( iReorderState == EMSFillReorderActive &&
+             index == currentItemIndex )
+            {
+            TBuf<2> markIconStr; // Magic: 2 characters reserverd for icon
+            markIconStr.AppendNum( EMark );
+            item.Append(markIconStr);
+            }
+        itemArray->AppendL( item );
+        }
+
+    iListBox->SetSelectionIndexesL( selectionArray );
+
+    CleanupStack::PopAndDestroy( selectionArray );
+    CleanupStack::PopAndDestroy( primary_text );
+
+    UpdateNaviTextL();
+    if( currentItemIndex > KErrNotFound && currentItemIndex < ruleCount )
+        {
+        iListBox->SetCurrentItemIndex( currentItemIndex );
+        }
+    iListBox->HandleItemAdditionL();
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::SetFillRules()
+// Sends fill rules to server
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::SetFillRules()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::SetFillRules"));
+
+    // Get marked items indexes
+    const CListBoxView::CSelectionIndexArray* selected =
+            iListBox->SelectionIndexes();
+
+    // Listbox item count
+    TInt itemCount = iFillListArray->Count();
+
+    // Selected item index
+    TInt itemIdx = 0;
+
+    // Sort criteria, offset = 0
+    TKeyArrayFix sortKey( 0, ECmpTUint );
+
+    // count selected items
+    TInt count = selected->Count();
+
+    for ( TInt index = 0; index < itemCount; index++ )
+        {
+        // check if listbox item is found from selected item list
+        TInt found = selected->Find( index, sortKey, itemIdx );
+
+        CCmFillRule* rule = (*iFillListArray)[index]->List();
+
+        // FOUND
+        if ( found == 0 )
+            {
+            // set rule selected
+            rule->SetSelected( ECmSelected );
+            }
+        // NOT FOUND
+        else
+            {
+            // set rule unselected
+            rule->SetSelected( ECmUnSelected );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::SelectedItemIndex()
+// Highlighted item index
+// --------------------------------------------------------------------------
+//
+TInt CMSFillContainer::SelectedItemIndex()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::SelectedItemIndex"));
+
+    return iListBox->CurrentItemIndex();
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::ListItemCount()
+// coun of list items
+// --------------------------------------------------------------------------
+//
+TInt CMSFillContainer::ListItemCount()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::ListItemCount"));
+
+    return iListBox->Model()->NumberOfItems();
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::SetReorderStateL()
+// Sets reorder state
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::SetReorderStateL( TMSReorderState aState )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::SetReorderStateL"));
+
+    switch ( aState )
+        {
+        case EMSFillNormal:
+            {
+            iReorderState = EMSFillNormal;
+            break;
+            }
+        case EMSFillReorderActive:
+            {
+            iReorderState = EMSFillReorderActive;
+            UpdateListBoxDataL();
+            break;
+            }
+        case EMSFillGrabActive:
+            {
+            iReorderState = EMSFillGrabActive;
+            UpdateListBoxDataL();
+            break;
+            }
+        default:
+            {
+            iReorderState = EMSFillNormal;
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::MoveItem()
+// moves item up/down on the list
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::MoveItem( TInt aDirection )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::MoveItem"));
+
+    TInt currentIdx = iListBox->CurrentItemIndex();
+    TInt totalItem = iListBox->Model()->NumberOfItems();
+
+    // store selection status of all rules
+    StoreSelectionStatus();
+
+    // up
+    if (aDirection == -1 && currentIdx)
+        {
+        iFillRuleController->ChangePriority( totalItem,
+                                             currentIdx,
+                                             aDirection );
+        }
+    // down
+    else if ( aDirection == 1 && currentIdx < totalItem - 1 )
+        {
+        iFillRuleController->ChangePriority( totalItem,
+                                             currentIdx,
+                                             aDirection );
+        }
+    else
+        {
+        // Do nothing
+        }
+    }
+
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::HandleReorderKeyEventL
+// Handle key events in reordering mode.
+// (other items were commented in a header).
+// --------------------------------------------------------------------------
+//
+TKeyResponse CMSFillContainer::HandleReorderKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::HandleReorderKeyEventL"));
+
+    TKeyResponse keyResponse = EKeyWasConsumed;
+
+    TInt currentIdx = iListBox->CurrentItemIndex();
+    TInt totalItems = iListBox->Model()->NumberOfItems();
+
+    TBool reqToRedraw = EFalse;
+    if ( aType == EEventKey )
+        {
+        switch ( aKeyEvent.iCode )
+            {
+            case EKeyUpArrow:
+            // fall through
+            case EKeyLeftArrow:
+                {
+                if ( currentIdx > 0 )
+                    {
+                    MoveItem(-1);
+                    iListBox->SetCurrentItemIndex( currentIdx - 1 );
+                    reqToRedraw = ETrue;
+                    }
+                break;
+                }
+            case EKeyDownArrow:
+            // fall through
+            case EKeyRightArrow:
+                {
+                if ( currentIdx < totalItems-1 ) // because index is 0 based
+                    {
+                    MoveItem(1);
+                    iListBox->SetCurrentItemIndex( currentIdx + 1 );
+                    reqToRedraw = ETrue;
+                    }
+                break;
+                }
+            default:
+                {
+                LOG(_L("[MediaServant]\t CMSFillContainer::\
+                HandleReorderKeyEventL invalid keycode"));
+                break;
+                }
+            }
+        }
+
+    if( reqToRedraw )
+        {
+        // update selected item indexes
+        const CListBoxView::CSelectionIndexArray* selected =
+                                                iListBox->SelectionIndexes();
+        UpdateListBoxDataL();
+        iSelectedLists.Reset();
+        for ( TInt index = 0; index < selected->Count(); index++ )
+            {
+            TInt a = (*selected)[index];
+            iSelectedLists.Append( (*selected)[index] );
+            }
+        }
+
+    return keyResponse;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::StoreSelectionStatus()
+// stores fill rule selection status to rule container
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::StoreSelectionStatus()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::StoreSelectionStatusL"));
+
+    // index of selected item
+    TInt itemIdx = 0;
+    // Sort criteria, offset = 0
+    TKeyArrayFix sortKey( 0, ECmpTUint );
+
+    // Listbox array
+    CDesCArray* itemArray = static_cast<CDesCArray*>
+                                    (iListBox->Model()->ItemTextArray());
+
+    // Listbox item count
+    TInt itemCount = itemArray->Count();
+
+    const CListBoxView::CSelectionIndexArray* selected =
+            iListBox->SelectionIndexes();
+
+    // count selected items
+    TInt count = selected->Count();
+
+    for ( TInt index = 0; index < itemCount; index++ )
+        {
+        // check if listbox item is found from selected item list
+        TInt found = selected->Find( index, sortKey, itemIdx );
+
+        if ( found == 0 )
+            {
+            // found - get correcponding index for rule table with At()
+            CCmFillRule* rule =
+                (*iFillListArray)[selected->At( itemIdx )]->List();
+            // set rule selected
+            rule->SetSelected( ECmSelected );
+            }
+        else
+            {
+            // not found
+            CCmFillRule* rule = (*iFillListArray)[index]->List();
+            // set rule unselected
+            rule->SetSelected( ECmUnSelected );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::DeleteRuleL()
+// Deletes highlighted rule
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::DeleteRuleL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::DeleteRuleL"));
+
+    // Show delete files query
+    CAknQueryDialog* query= CAknQueryDialog::NewL(
+                                   CAknQueryDialog::ENoTone );
+
+    if ( query->ExecuteLD( R_MSERV_DELETE_LIST_QUERY ) )
+        {
+        TInt currentItemIndex = iListBox->CurrentItemIndex();
+        // delete rule
+        iFillRuleController->DeleteRuleL( currentItemIndex );
+
+        // Listbox items
+        CDesCArray* itemArray = static_cast<CDesCArray*>
+                                       (iListBox->Model()->ItemTextArray());
+
+        // delete list item
+        itemArray->Delete( currentItemIndex );
+        iListBox->HandleItemRemovalL();
+        iListDeleted = ETrue;
+
+        if ( currentItemIndex > 0 )
+            {
+            // highligth previous
+            iListBox->SetCurrentItemIndexAndDraw( currentItemIndex - 1 );
+            }
+        iMSAppUi.MSEngine()->DeleteFilledFilesL();
+        iView.ShowNaviTextL();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::IsListDeleted()
+// Returns list delete status
+// --------------------------------------------------------------------------
+//
+TBool CMSFillContainer::IsListDeleted()
+    {
+    return iListDeleted;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::HandlePointerEventL()
+// Handles touchscreen event
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::HandlePointerEventL ( const TPointerEvent& aPointerEvent )
+    {
+	CCoeControl::HandlePointerEventL( aPointerEvent );
+    
+    if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+    	{
+    	// Do not change listbox item state, when highlighting an item or,
+	    // when reordering state is active
+    	if ( iListBox->CurrentItemIndex() == iPreviousItemIndex &&
+             iReorderState == EMSFillNormal )
+	    	{	
+			TKeyEvent keyEvent;
+			keyEvent.iCode = EKeyOK;
+			OfferKeyEventL( keyEvent, EEventKey );
+    		}
+    	else
+    		{
+    		UpdateListBoxDataL();
+    		}
+	   	iPreviousItemIndex = iListBox->CurrentItemIndex();
+		}
+		
+	// Handle Drag and drop events, when reorder state is active
+    if ( iReorderState != EMSFillNormal )
+    	{
+    	HandleDragAndDropEventsL( aPointerEvent );
+    	}
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::CheckIfDublicateName()
+// Checks how many dublicate items is on the fill list
+// --------------------------------------------------------------------------
+//
+TInt CMSFillContainer::CheckIfDublicateNames( const TDesC& aName )
+    {
+    CDesCArray* itemArray = static_cast<CDesCArray*>
+                                   (iListBox->Model()->ItemTextArray());
+    TInt count(0);
+
+    for ( TInt index = 0; index < itemArray->MdcaCount(); index++ )
+        {
+        if ( KErrNotFound != itemArray->MdcaPoint( index ).Match( aName ) )
+            {
+            count++;
+            }
+        }
+    return count;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::UpdateNaviTextL()
+// updates list size on navi pane
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::UpdateNaviTextL()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::UpdateNaviTextL"));
+
+    TInt currentItemIndex = iListBox->CurrentItemIndex();
+
+    if ( currentItemIndex != KErrNotFound )
+        {
+        CArrayFix<TInt>* infoArray = new ( ELeave ) CArrayFixFlat<TInt>(2);
+        CleanupStack::PushL( infoArray );
+
+        CMSFillList* fillList = (*iFillListArray)[currentItemIndex];
+        CCmFillRule* rule = fillList->List();
+
+        HBufC* naviText = NULL;
+
+        TInt64 freeMemory = iFreeMemory - iSizeOfSelectedLists;
+
+        // round values
+        TReal size(0);
+        Math::Round( size, TReal(fillList->ListSize()) / KMega, 0 );
+
+        TReal freeSize(0);
+        Math::Round( freeSize, TReal(freeMemory) / KMega, 0 );
+
+        infoArray->AppendL( size );
+        infoArray->AppendL( freeSize );
+
+        naviText = StringLoader::LoadLC( R_MS_NAVI_LIST_SIZE,
+                                         *infoArray );
+        // do number conversion
+        TPtr ptr = naviText->Des();
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr );
+
+        iView.SetNavigationPaneTextL( *naviText );
+        CleanupStack::PopAndDestroy( naviText );
+        CleanupStack::PopAndDestroy( infoArray );
+        }
+    else
+        {
+        iView.ClearCurrentNaviPaneText();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::ChangeListActivityL()
+// Toggles list item
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::ChangeListActivityL()
+    {
+    CCmFillRule* rule =
+        (*iFillListArray)[iListBox->CurrentItemIndex()]->List();
+    if ( rule->Selected() == ECmSelected )
+        {
+        rule->SetSelected( ECmUnSelected );
+        }
+    else
+        {
+        rule->SetSelected( ECmSelected );
+        }
+    UpdateListBoxDataL();
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::IsCurrentListItemActive()
+// Checks if item is selected
+// --------------------------------------------------------------------------
+//
+TBool CMSFillContainer::IsCurrentListItemActive()
+    {
+    return iListBox->View()->ItemIsSelected( iListBox->CurrentItemIndex() );
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::HasListSelectionsChanged
+// Checks if item is selected
+// --------------------------------------------------------------------------
+//
+TBool CMSFillContainer::HasListSelectionsChanged()
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::HasListSelectionsChanged"));
+
+    TBool status = EFalse;
+
+    TInt originalCount = iSelectedLists.Count();
+
+    const CListBoxView::CSelectionIndexArray* selected =
+                                                iListBox->SelectionIndexes();
+
+    TKeyArrayFix sortKey( 0, ECmpTUint );
+    // dummy index - not interested of this
+    TInt dummy = 0;
+
+    for ( TInt index = 0; index < originalCount; index++ )
+        {
+        // check if listbox item is found from selected item list
+        TInt found = selected->Find(
+                             iSelectedLists[index], sortKey, dummy );
+        if ( found != 0 )
+            {
+            // something has changed on the list
+            status = ETrue;
+            index = originalCount; // break loop
+            }
+        }
+
+    return status;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::ListItemIconIndex
+// Returns icon index based on list size and free space
+// --------------------------------------------------------------------------
+//
+TInt CMSFillContainer::ListItemIconIndex( TInt aIndex,
+                                          TInt64 aListSize,
+                                          TInt64& aFreeSpace )
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::ListItemIconIndex"));
+
+    TInt iconIndex( 0 );
+    // check if item is selected
+    CCmFillRule* rule = (*iFillListArray)[aIndex]->List();
+    if(  ECmSelected == rule->Selected() )
+        {
+        // doesn't fit
+        if ( aFreeSpace <= 0 )
+            {
+            iconIndex = EMSSelectedDoesntFit;
+            aFreeSpace = 0;
+            }
+        // fits
+        else if ( aFreeSpace - aListSize > 0 )
+            {
+            iconIndex = EMSSelectedFits;
+            aFreeSpace -= aListSize;
+            }
+        // fits partially
+        else
+            {
+            iconIndex = EMSSelectedPartiallyFits;
+            aFreeSpace = 0;
+            }
+        }
+    else
+        {
+        // doesn't fit
+        if ( aFreeSpace <= 0)
+            {
+            iconIndex = EMSUnSelectedDoesntFit;
+            aFreeSpace = 0;
+            }
+        // fits
+        else if ( aFreeSpace - aListSize > 0 )
+            {
+            iconIndex = EMSUnselectedFits;
+            aFreeSpace -= aListSize;
+            }
+        // fits partially
+        else
+            {
+            iconIndex = EMSUnselectedPartiallyFits;
+            aFreeSpace = 0;
+            }
+        }
+    return iconIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::CalculateFillQuotaL()
+// Gets selected drives and calculates quota size
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::CalculateFillQuotaL()
+    {
+    RPointerArray<CCmDriveInfo> drives;
+
+    iMSAppUi.MSEngine()->GetDrivesL( drives );
+    for ( TInt i = 0; i < drives.Count(); i++ )
+        {
+        iQuota += drives[i]->DriveQuota();
+        iQuota -= drives[i]->UsedDriveQuota();
+        }
+    drives.ResetAndDestroy();
+    drives.Close();
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::SizeChanged()
+// Called by framework when the view size is changed.
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::SizeChanged()
+    {
+    // container control resize code.
+    if ( iListBox )
+        {
+        iListBox->SetRect( Rect() ); // Set rectangle of listbox.
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CMSFillContainer::HandleResourceChange
+// Handles layout change
+// --------------------------------------------------------------------------
+//
+void CMSFillContainer::HandleResourceChange( TInt aType )
+    {
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        SetRect( iView.ClientRect() );
+        }
+
+    CCoeControl::HandleResourceChange( aType );
+    }
+
+// ---------------------------------------------------------------------------
+// CMSFillContainer::GetHelpContext
+// ---------------------------------------------------------------------------
+//
+void CMSFillContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    LOG(_L("[MediaServant]\t CMSFillContainer::GetHelpContext"));
+
+    aContext.iMajor = TUid::Uid(KMediaServantUID3);
+    aContext.iContext = KMSERV_HLP_FILL_LIST;
+    }
+
+// End of File
+