homesync/contentmanager/homesyncgsplugin/src/msmultiselectionpopup.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homesync/contentmanager/homesyncgsplugin/src/msmultiselectionpopup.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,415 @@
+/*
+* 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 popup implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include <avkon.mbg>
+#include <aknlists.h>
+
+#include "cmmediaserverfull.h"
+#include "msmultiselectionpopup.h"
+#include "msconstants.h"
+#include "msdebug.h"
+
+// CONSTANTS
+const TInt KSoftkeyOk = 63585;
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMSMultiselectionPopup* CMSMultiselectionPopup::NewL(
+    TBool aUploadCapabilitySupport,
+    RPointerArray<CCmMediaServerFull>* aMediaServerArray,
+    CListBoxView::CSelectionIndexArray* aSelectionIndexArray )
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::NewL begin"));
+
+    CMSMultiselectionPopup* self = CMSMultiselectionPopup::NewLC( 
+													aUploadCapabilitySupport,
+                                                    aMediaServerArray,
+                                                    aSelectionIndexArray );
+
+    CleanupStack::Pop( self );
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::NewL end"));
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CMSMultiselectionPopup* CMSMultiselectionPopup::NewLC(
+    TBool aUploadCapabilitySupport,
+    RPointerArray<CCmMediaServerFull>* aMediaServerArray,
+    CListBoxView::CSelectionIndexArray* aSelectionIndexArray )
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::NewLC begin"));
+
+    CMSMultiselectionPopup* self =
+                 new(ELeave) CMSMultiselectionPopup( aUploadCapabilitySupport,
+                                                     aMediaServerArray,
+                                                     aSelectionIndexArray );
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::NewLC end"));
+    return self;
+    }
+	
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::ConstructL
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CMSMultiselectionPopup::ConstructL()
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::ConstructL begin"));
+
+    for (TInt i=0;i<iServers->Count();i++)
+        {
+        if ( iUploadCapabilitySupport && (*iServers)[i]->StoreUsage() )
+            {
+            iPreviousSelection->AppendL(i);
+            }
+        else if (!iUploadCapabilitySupport && (*iServers)[i]->FillUsage() )
+            {
+            iPreviousSelection->AppendL(i);
+            }
+        else
+            {
+            LOG(_L("[MediaServant]\t CMSMultiselectionPopup::ConstructL \
+            server not used"));
+            }            
+        }
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::ConstructL end"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::CMSMultiselectionPopup
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------------------------
+//
+CMSMultiselectionPopup::CMSMultiselectionPopup(
+    TBool aUploadCapabilitySupport,   
+    RPointerArray<CCmMediaServerFull>* aMediaServerArray,
+    CListBoxView::CSelectionIndexArray* aSelectionIndexArray )
+    : CAknListQueryDialog( aSelectionIndexArray ),    
+    iUploadCapabilitySupport ( aUploadCapabilitySupport ),
+    iServers( aMediaServerArray ),
+    iPreviousSelection( aSelectionIndexArray )
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            CMSMultiselectionPopup"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::~CMSMultiselectionPopup
+// C++ default destructor.
+// ---------------------------------------------------------------------------
+//
+CMSMultiselectionPopup::~CMSMultiselectionPopup()
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            ~CMSMultiselectionPopup"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::UpdateAndDrawPopupL
+//
+// ---------------------------------------------------------------------------
+//
+void CMSMultiselectionPopup::UpdateAndDrawPopupL(
+                                CCmMediaServerFull* aMediaServer )
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            UpdateAndDrawPopupL begin"));
+
+    // Listbox items
+    CDesCArray* device_array = static_cast<CDesCArray*>
+                     (ListControl()->listbox()->Model()->ItemTextArray());
+
+    HBufC* item = CreateListBoxItemLC( aMediaServer );
+    device_array->AppendL( *item );
+    CleanupStack::PopAndDestroy( item );
+
+    iListBox->HandleItemAdditionL(); // Update listbox
+
+    Layout();
+    SizeChanged();
+    DrawNow();
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            UpdateAndDrawPopupL ends"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::HandlePointerEventL
+//
+// ---------------------------------------------------------------------------
+//
+void CMSMultiselectionPopup::HandlePointerEventL 
+                               ( const TPointerEvent& aPointerEvent )
+	{
+	CCoeControl::HandlePointerEventL( aPointerEvent );
+
+    if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+    	{
+		TKeyEvent keyEvent;
+		keyEvent.iCode = EKeyOK;
+		this->OfferKeyEventL( keyEvent, EEventKey );
+	    }
+	}
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::AppendIconToArrayL
+//
+// ---------------------------------------------------------------------------
+//
+void CMSMultiselectionPopup::AppendIconToArrayL( CAknIconArray* aArray,
+                                                 MAknsSkinInstance* aSkin,
+                                                 const TDesC& aMbmFile,
+                                                 const TAknsItemID& aID,
+                                                 TInt aBitmapId,
+                                                 TInt aMaskId ) const
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            AppendIconToArrayL begin"));
+
+    __ASSERT_DEBUG( aArray, 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);
+
+    // ownership transferred
+    aArray->AppendL(icon);
+
+    // aArray now owns the icon, no need to delete.
+    CleanupStack::Pop(icon);
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            AppendIconToArrayL end"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::OkToExitL(TInt aButtonId)
+// called by framework when the softkey is pressed
+// ---------------------------------------------------------------------------
+//
+TBool CMSMultiselectionPopup::OkToExitL( TInt /*aButtonId*/ )
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::OkToExitL"));
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::AppendMediaServersL
+// Appends items to the listbox
+// ---------------------------------------------------------------------------
+//
+void CMSMultiselectionPopup::AppendMediaServersL()
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            AppendMediaServersL begin"));
+
+    TInt serverCount = iServers->Count();
+
+    CDesCArray* listBoxArray = static_cast<CDesCArray*>
+                   (ListControl()->listbox()->Model()->ItemTextArray());
+
+    for ( TInt i = 0; i < serverCount; i++ )
+        {
+        CCmMediaServerFull* server = (*iServers)[i];
+
+        HBufC* item = CreateListBoxItemLC( server );
+
+        listBoxArray->AppendL( *item );
+
+        CleanupStack::PopAndDestroy( item );
+        }
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            AppendMediaServersL end"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::PreLayoutDynInitL()
+// called by framework before dialog is shown
+// ---------------------------------------------------------------------------
+//
+void CMSMultiselectionPopup::PreLayoutDynInitL()
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            PreLayoutDynInitL begin"));
+
+    CAknListQueryDialog::PreLayoutDynInitL();
+
+    CAknIconArray* icons = new (ELeave) CAknIconArray( EIconLast );
+    CleanupStack::PushL( icons );
+
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    TFileName iconsPath( AknIconUtils::AvkonIconFileName() );
+
+    AppendIconToArrayL( icons, skin,
+                        iconsPath,
+                        KAknsIIDQgnPropCheckboxOn,
+                        EMbmAvkonQgn_indi_checkbox_on,
+                        EMbmAvkonQgn_indi_checkbox_on_mask );
+
+    AppendIconToArrayL( icons, skin,
+                        iconsPath,
+                        KAknsIIDQgnPropCheckboxOff,
+                        EMbmAvkonQgn_indi_checkbox_off,
+                        EMbmAvkonQgn_indi_checkbox_off_mask );
+
+    AppendIconToArrayL( icons, skin,
+                        iconsPath,
+                        KAknsIIDQgnIndiNaviArrowRight,
+                        EMbmAvkonQgn_indi_navi_arrow_right,
+                        EMbmAvkonQgn_indi_navi_arrow_right_mask );
+
+    CAknListQueryDialog::SetIconArrayL( icons );
+
+    CleanupStack::Pop( icons );
+
+    iListBox = ListBox();
+    SetOwnershipType( ELbmOwnsItemArray );
+
+    AppendMediaServersL();
+
+    iListBox->ActivateL();
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            PreLayoutDynInitL end"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::PostLayoutDynInitL()
+// Called by framework before dialog is shown.
+// Needed because filter is not active until PreLayoutDynInitL().
+// ---------------------------------------------------------------------------
+//
+void  CMSMultiselectionPopup::PostLayoutDynInitL()
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            PostLayoutDynInitL begin"));
+
+    CAknListQueryDialog::PostLayoutDynInitL();
+    ListBox()->ActivateL();
+
+    if ( iPreviousSelection && iPreviousSelection->Count() )
+        {
+        iListBox->SetSelectionIndexesL( iPreviousSelection );
+        }
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            PostLayoutDynInitL end"));
+    }
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::OfferKeyEventL()
+// called by framework when key is pressed
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CMSMultiselectionPopup::OfferKeyEventL (
+                                    const TKeyEvent &aKeyEvent,
+                                    TEventCode aType )
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::OfferKeyEventL begin"));
+
+    TKeyResponse status( EKeyWasNotConsumed );
+
+    // check if user has selected something
+    if (aKeyEvent.iCode == EKeyOK)
+        {
+        status = ListBox()->OfferKeyEventL( aKeyEvent, aType );
+
+        TInt itemNbr = iListBox->CurrentItemIndex();
+        if( iListBox->View()->ItemIsSelected( itemNbr ) )
+            {
+            iPreviousSelection->AppendL( itemNbr );
+            }
+        else
+            {
+            TKeyArrayFix sortKey( 0, ECmpTInt );
+            TInt itemIndex( 0 );
+
+            if( iPreviousSelection->Find( 
+                itemNbr, sortKey, itemIndex ) == 0 )
+                {
+                // remove selection
+                iPreviousSelection->Delete( itemIndex );
+                }
+            }
+        }
+    else
+        {
+        // prevents to mark item if dialog is accepted with OK key
+        if ( aKeyEvent.iCode == KSoftkeyOk )
+            {
+            iListBox->View()->SetDisableRedraw(ETrue);    
+            }
+           
+        status = CAknListQueryDialog::OfferKeyEventL(aKeyEvent,aType);
+        }
+
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup::OfferKeyEventL end"));
+    return status;
+}
+
+// ---------------------------------------------------------------------------
+// CMSMultiselectionPopup::CreateListBoxItemLC()
+// Creates listbox item
+// ---------------------------------------------------------------------------
+//
+HBufC* CMSMultiselectionPopup::CreateListBoxItemLC(
+                                const CCmMediaServerFull* aServer )
+    {
+    LOG(_L("[MediaServant]\t CMSMultiselectionPopup:: \
+            CreateListBoxItemLC"));
+
+    TBuf<KMaxFileName> serverName;
+    serverName.Copy( aServer->MediaServerName().Left( KMaxFileName ) );
+
+    HBufC* item = HBufC::NewLC( serverName.Size() +
+            sizeof( KSingleGraphicStyleFormatStringNoTrailIcons() ) );
+            item->Des().Format( KSingleGraphicStyleFormatStringNoTrailIcons,
+            EUnCheckedBox,
+            &serverName );
+
+    return item;
+    }
+
+// End of file