upnpsettings/multiselectionui/src/upnpappmultiselectiondialog.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:00 +0200
changeset 0 7f85d04be362
permissions -rw-r--r--
Revision: 200947 Kit: 200951

/*
* 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 <eikcmbut.h>
#include "upnpappmultiselectiondialog.h"
#include "upnpfilesharingengine.h"

#include "cupnpmultiselectionui.hrh"
#include <cupnpmultiselectionui.rsg>

_LIT( KComponentLogfile, "multiselectionui.txt");
#include "upnplog.h"


//CONSTANTS
const TInt KOkSoftkeyCode = 63585;

// ================= MEMBER FUNCTIONS =======================

// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::NewL
// Two-phased constructor.
// --------------------------------------------------------------------------
//
CUPnPAppMultiselectionDialog* CUPnPAppMultiselectionDialog::NewL(
                        THomeConnectMediaType aMediaType,
                        CUPnPFileSharingEngine* aFileSharingEngine,
                        CArrayFix<TInt>* aSelectionIndexArray )
    {
    __LOG("CUPnPAppMultiselectionDialog::NewL begin");

    CUPnPAppMultiselectionDialog* self =
                        new(ELeave) CUPnPAppMultiselectionDialog();

    CleanupStack::PushL(self);
    self->ConstructL( aMediaType, aFileSharingEngine, aSelectionIndexArray );
    CleanupStack::Pop(self);
    __LOG("CUPnPAppMultiselectionDialog::NewL end");
    return self;
    }


// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::ConstructL
// Symbian 2nd phase constructor can leave.
// --------------------------------------------------------------------------
//
void CUPnPAppMultiselectionDialog::ConstructL(
                        THomeConnectMediaType aMediaType,
                        CUPnPFileSharingEngine* aFileSharingEngine,
                        CArrayFix<TInt>* aSelectionIndexArray )
    {
    __LOG("CUPnPAppMultiselectionDialog::ConstructL begin");
    CAknSelectionListDialog::ConstructL( R_AVKON_SOFTKEYS_EMPTY );
    iMediaType = aMediaType;
    iFileSharingEngine = aFileSharingEngine;

    iMarkedItems = aSelectionIndexArray;
    iUtility = new (ELeave) CUpnpMultiselectionUtility();

    iMskSelectText = 
        StringLoader::LoadL( R_UPNP_MULTISELECTION_SELECT_TEXT );
    iMskUnselectText = 
        StringLoader::LoadL( R_UPNP_MULTISELECTION_UNSELECT_TEXT );

    __LOG("CUPnPAppMultiselectionDialog::ConstructL end");
    }


// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::CUPnPAppMultiselectionDialog
// C++ default constructor can NOT contain any code, that
// might leave.
// --------------------------------------------------------------------------
//
CUPnPAppMultiselectionDialog::CUPnPAppMultiselectionDialog()
: CAknSelectionListDialog(iSelectedItem, NULL, NULL), iSelectedItem(0)
    {
    __LOG("CUPnPAppMultiselectionDialog::CUPnPAppMultiselectionDialog");
    }

// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::CUPnPAppMultiselectionDialog
// C++ default destructor.
// --------------------------------------------------------------------------
//
CUPnPAppMultiselectionDialog::~CUPnPAppMultiselectionDialog()
    {
    __LOG("CUPnPAppMultiselectionDialog::~CUPnPAppMultiselectionDialog");

    iFileSharingEngine = NULL;

    delete iUtility;
    delete iMskSelectText;
    delete iMskUnselectText;

    __LOG("CUPnPAppMultiselectionDialog::~CUPnPAppMultiselectionDialog end");
    }


// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::OkToExitL(TInt aButtonId)
// called by framework when the softkey is pressed
// --------------------------------------------------------------------------
//
TBool CUPnPAppMultiselectionDialog::OkToExitL(TInt aButtonId)
    {
    __LOG("CUPnPAppMultiselectionDialog::OkToExitL begin");
    TBool ret( EFalse );
    if ( aButtonId == EAknSoftkeyOk )
        {
        TBool showWaitNote( ETrue );

        const CArrayFix<TInt>* selected;

        //get the true indexes of marked items
        CAknListBoxFilterItems* filter 
                = static_cast < CAknFilteredTextListBoxModel* >     
                                ( iListBox->Model() )->Filter();
        if ( filter )
            {
            // Filter knows all.
            filter->UpdateSelectionIndexesL();
            selected = filter->SelectionIndexes();
            }
        else
            {
            // No filter.
            selected = ListBox()->View()->SelectionIndexes();
            }
            
        // Show wait note if needed.
        CAknWaitNoteWrapper* waitNoteWrapper( NULL );
        if ( selected->Count() == 1 && selected->At( 0 ) == 0 )
            {
            showWaitNote = EFalse;
            }
        if ( showWaitNote )
            {
            waitNoteWrapper = CAknWaitNoteWrapper::NewL();
            CleanupStack::PushL(reinterpret_cast<CBase*>(waitNoteWrapper));
            waitNoteWrapper->ExecuteL(
                R_UPNP_MULTISELECTION_COLLECTING_FILES_NOTE,      // TInt aResId,
                *this,            // MAknBackgroundProcess& aBackgroundProcess
                ETrue);
            }

        // give the selection indexes to filesharing engine
        iMarkedItems->Reset();
        for( TInt i(0); i<selected->Count(); i++ )
            {
            iMarkedItems->AppendL( selected->At( i ) );
            }
        iUtility->ConvertSelectionsForEngineL( *iMarkedItems );

        if ( showWaitNote )
            {
            CleanupStack::PopAndDestroy(waitNoteWrapper);
            }
        ret = ETrue;
        }

   else if ( aButtonId == EAknSoftkeySelect )
       {
       // msk event    
       __LOG("CUPnPAppMultiselectionDialog::msk event");
       TKeyEvent tmpEvent;
       tmpEvent.iCode = EKeyOK;
       tmpEvent.iModifiers = 0;
       tmpEvent.iRepeats = 0;
       tmpEvent.iScanCode = 0;
       TEventCode eventType = EEventKey;
       OfferKeyEventL( tmpEvent, eventType );
       
       }
   else if ( aButtonId == EAknSoftkeyBack )
        {
        ret = ETrue;
        }

    __LOG("CUPnPAppMultiselectionDialog::OkToExitL end");
    return ret;
    }


// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::PreLayoutDynInitL();
// called by framework before dialog is shown
// --------------------------------------------------------------------------
//
void CUPnPAppMultiselectionDialog::PreLayoutDynInitL()
    {
    __LOG("CUPnPAppMultiselectionDialog::PreLayoutDynInitL begin");

    iListBox = static_cast<CAknSingleGraphicStyleListBox*>
        (Control(EMultiSelectionListBoxId));

    // display find box
    SetupFind( CAknSelectionListDialog::EAdaptiveFind );

    // get pointer to listbox data array
    iModel = STATIC_CAST(
        CAknFilteredTextListBoxModel*, iListBox->Model() );
    iSettingsTextArray = static_cast<CDesCArray*>(
        iModel->ItemTextArray() );

    iUtility->AppendShareAllSelectionL( iSettingsTextArray );

 
    iFileSharingEngine->RequestSelectionContentL( iMediaType );
    iState = ELoadContent;

    CAknWaitNoteWrapper* waitNoteWrapper = CAknWaitNoteWrapper::NewL();
    CleanupStack::PushL(reinterpret_cast<CBase*>(waitNoteWrapper));
    waitNoteWrapper->ExecuteL(
        R_UPNP_MULTISELECTION_SEARCHING_FILES_NOTE,      // TInt aResId,
        *this,           // MAknBackgroundProcess& aBackgroundProcess
        EFalse);   // ETrue = Show immediately

    CleanupStack::PopAndDestroy(waitNoteWrapper);

    CAknIconArray* icons = new (ELeave) CAknIconArray(2);
    CleanupStack::PushL( icons );

    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    TFileName iconsPath( AknIconUtils::AvkonIconFileName( ) );

    iUtility->AppendIconToArrayL( icons, skin,
                        iconsPath,
                        KAknsIIDQgnPropCheckboxOn,
                        EMbmAvkonQgn_prop_checkbox_on,
                        EMbmAvkonQgn_prop_checkbox_on_mask );

    iUtility->AppendIconToArrayL( icons, skin,
                        iconsPath,
                        KAknsIIDQgnPropCheckboxOff,
                        EMbmAvkonQgn_prop_checkbox_off,
                        EMbmAvkonQgn_prop_checkbox_off_mask );


    iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons );
    CleanupStack::Pop( icons );

    iListBox->ActivateL();


    // set dialog title
    CEikStatusPane* statusPane =
                    (( CAknAppUi* )iEikonEnv->EikAppUi() )->StatusPane();
    iTitlePane = (CAknTitlePane*)statusPane->ControlL(
                    TUid::Uid(EEikStatusPaneUidTitle));

    if ( iMediaType == EImageAndVideo )
        {
        iTitlePane->SetTextL( *StringLoader::LoadLC(
                                R_UPNP_MULTISELECTION_SHARING_VISUAL_TITLE_TEXT) );
        }
    else
        {
        iTitlePane->SetTextL( *StringLoader::LoadLC(
                                R_UPNP_MULTISELECTION_SHARING_MUSIC_TITLE_TEXT) );
        }
    CleanupStack::PopAndDestroy();

    CAknSelectionListDialog::PreLayoutDynInitL();
    __LOG("CUPnPAppMultiselectionDialog::PreLayoutDynInitL end");
    }


// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::PostLayoutDynInitL()
// Called by framework before dialog is shown.
// Needed because filter is not active until PreLayoutDynInitL().
// --------------------------------------------------------------------------
//
void  CUPnPAppMultiselectionDialog::PostLayoutDynInitL()
    {
    __LOG("CUPnPAppMultiselectionDialog::PostLayoutDynInitL begin");

    // Get state of do not share and share all selections and set them 
    // to utility.
    TShareSelectionState selectionState = 
        iUtility->ShareSelectionStateFromArray( *iMarkedItems );
    iUtility->SetShareSelectionState( selectionState );
    
    // filter out the first character of the search string
    FindBox()->SetListColumnFilterFlags(0xFFFFFFFE);
    
    //mark selected albums
    if ( iMarkedItems )
        {
        if ( iMarkedItems->Count() )
            {
            //
            iListBox->SetSelectionIndexesL( iMarkedItems );
            }
        }
    iUtility->CollectSelectedItemsL( iListBox, ETrue );

    //set msk's label depending on is item selected or not
    HBufC* mskLabel( iMskSelectText );
    if( iListBox->View()->ItemIsSelected( iListBox->CurrentItemIndex() ) )
        {
        mskLabel = iMskUnselectText;
        }
    ButtonGroupContainer().SetCommandL( EAknSoftkeySelect, *mskLabel );

    __LOG("CUPnPAppMultiselectionDialog::PostLayoutDynInitL end");
    }


// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::OfferKeyEventL();
// called by framework when key is pressed
// --------------------------------------------------------------------------
//
TKeyResponse CUPnPAppMultiselectionDialog::OfferKeyEventL(
            const TKeyEvent &aKeyEvent,
            TEventCode aType)
    {
    __LOG("CUPnPAppMultiselectionDialog::OfferKeyEventL begin"); 
    
    TKeyResponse status( EKeyWasNotConsumed );
    if ( aType == EEventKey ) // Is not key event
        {
        if (aKeyEvent.iCode == EKeyOK)
            {
            status = iListBox->OfferKeyEventL( aKeyEvent, aType );
            iUtility->CollectSelectedItemsL( iListBox );
            }
        else if (aKeyEvent.iCode == KOkSoftkeyCode)
            {
            // disable draw
            iListBox->View()->SetDisableRedraw(ETrue);
            status = CAknSelectionListDialog::OfferKeyEventL(aKeyEvent,aType);
            }
        else
            {
            // Let the Akn dialog handle the key event.
            // EKeyEscape key event deletes this dialog.
            status = CAknSelectionListDialog::OfferKeyEventL(aKeyEvent,aType);
            }
        }

    //
    // Set msk's label depending on is item selected or not.
    //
    // In case of EKeyEscape we cannot access objects in heap any more.
    // Only local variables in stack. This is because CAknSelectionListDialog
    // ::OfferKeyEventL deletes this dialog. When call returns heap memory is cleared
    // and we cannot rely on values of member variables.
    //
    if ( status == EKeyWasConsumed &&
         aKeyEvent.iCode != EKeyEscape )
        {
        HBufC* mskLabel(iMskSelectText);
        if( iListBox->View()->ItemIsSelected( 
                iListBox->CurrentItemIndex() ) )
            {
            mskLabel = iMskUnselectText;
            }
        ButtonGroupContainer().SetCommandL( EAknSoftkeySelect, *mskLabel );
        ButtonGroupContainer().DrawDeferred();
        }

    __LOG("CUPnPAppMultiselectionDialog::OfferKeyEventL end");
    return status;
    }

    
// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::StepL
// Step done during wait note
// --------------------------------------------------------------------------
//
void CUPnPAppMultiselectionDialog::StepL(void)
    {
    switch ( iState )
        {
        case ELoadContent:
            {
            TRAPD( err, iFileSharingEngine->GetSelectionContentL( 
                *iSettingsTextArray ) );
            if ( err == KErrNone )
                {
                iState = ELoadIndexes;
                iFileSharingEngine->RequestSelectionIndexesL( iMediaType );
                }
            else if ( err == KErrInUse )
                {
                //do nothing, request is being proceeded
                }
            else
                {
                User::Leave( err );
                }
            break;
            }
        case ELoadIndexes:
            {
            TRAPD( err, iFileSharingEngine->GetSelectionIndexesL( 
                *iMarkedItems ) );
            if ( err == KErrNone )
                {
                iState = ELoadDone;
                iDone = ETrue;
                }
            else if ( err == KErrInUse )
                {
                //do nothing, request is being proceeded
                }
            else
                {
                User::Leave( err );
                }
            break;
            }
        case ELoadDone:
            {
            break;
            }
        default:
            {
            __PANICD( __FILE__, __LINE__ );
            break;
            }
        }
    }


// --------------------------------------------------------------------------
// CUPnPAppMultiselectionDialog::IsProcessDone
// Returns ETrue if process finished
// --------------------------------------------------------------------------
//
TBool CUPnPAppMultiselectionDialog::IsProcessDone(void) const
    {
    return iDone;
    }

// End of file