--- /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