remotestoragefw/gsplugin/src/rsfwgsplugindrivelistcontainer.cpp
changeset 0 3ad9d5175a89
child 1 1c07d7ba3e3d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/gsplugin/src/rsfwgsplugindrivelistcontainer.cpp	Thu Dec 17 09:07:59 2009 +0200
@@ -0,0 +1,735 @@
+/*
+* Copyright (c) 2003 - 2005 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:  The control container (view) of the remote drives list view
+*
+*/
+
+
+// INCLUDE FILES
+#include    <aknappui.h> 
+#include    <eikspane.h>
+#include    <StringLoader.h>
+#include    <aknlists.h>
+#include 	<AknIconArray.h> 
+#include	<eikclbd.h>
+#include    <rsfwgspluginrsc.rsg>
+#include 	<avkon.mbg>
+#include	<AknQueryDialog.h>
+#include 	<rsfwgsplugin.mbg>
+#include    <aknnotewrappers.h>
+
+#include   	"rsfwgslocalviewids.h"
+#include    "rsfwgsplugindrivelistcontainer.h"
+#include    "rsfwgsplugin.h"
+#include	"rsfwmountman.h"
+#include    "rsfwcontrol.h"
+#include	"rsfwmountentry.h"
+
+ _LIT(KTabulator, "\t");
+ _LIT(KConnectedIcon, "\t0");
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::CRsfwGsPluginDriveListContainer()
+// ---------------------------------------------------------------------------
+//
+CRsfwGsPluginDriveListContainer::CRsfwGsPluginDriveListContainer(CRsfwGsPlugin* aView) : iView(aView)
+    {
+    
+    }
+    
+
+// -----------------------------------------------------------------------------
+// GSSettListRemoteDrivesListContainer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::ConstructL(
+    const TRect& aRect,
+   	CRsfwMountMan* aMountMan)
+    {
+	iMountMan = aMountMan;
+
+    CEikStatusPane* sp = static_cast<CAknAppUi*> 
+        ( iEikonEnv->EikAppUi() )->StatusPane();
+    iTitlePane = static_cast<CAknTitlePane*> 
+        ( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+    // Set title
+    StringLoader::Load ( iTitle, R_STR_REMOTE_DRIVES_VIEW_TITLE );
+    iTitlePane->SetTextL(iTitle);// FromResourceL( rReader );
+    CreateWindowL(); // Makes the control a window-owning control
+
+    // Main List creation and initialization
+    iMainList = new(ELeave) CAknSingleStyleListBox();
+    iMainList->SetContainerWindowL(*this);
+    iMainList->ConstructL(this, EAknListBoxLoopScrolling);
+
+    // Main list scroll bar issues
+    iMainList->CreateScrollBarFrameL(EFalse);
+    iMainList->ScrollBarFrame()->SetScrollBarVisibilityL(
+    CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+
+	 // Empty text processing
+	 _LIT (KStringHeader, "%S\n%S");
+    HBufC* emptyText = iEikonEnv->AllocReadResourceLC(R_GS_RSFW_NO_REMOTE_DRIVES);  
+    HBufC* emptyText2 = iEikonEnv->AllocReadResourceLC(R_GS_RSFW_NO_REMOTE_DRIVES_EXPLANATORY); 
+  	HBufC* myString = HBufC::NewLC(emptyText->Length() + emptyText2->Length() + 5);
+  	TPtr emptyStringPtr = myString->Des();
+  	emptyStringPtr.Format(KStringHeader, emptyText, emptyText2);
+    
+    iMainList->SetListBoxObserver(this);
+    iMainList->View()->SetListEmptyTextL(*myString);
+    CleanupStack::PopAndDestroy( 3 ); //emptyText, emptyText2, myString
+	
+	CArrayPtrFlat<CGulIcon>* iconArray = new(ELeave) CAknIconArray(4);
+	
+	CGulIcon* icon2;
+	icon2 = AknsUtils::CreateGulIconL(
+        AknsUtils::SkinInstance(), 
+        KAknsIIDQgnIndiConnectionOnAdd, 
+        KGSPluginBitmapFile,
+        EMbmRsfwgspluginQgn_indi_connection_on_add,
+        EMbmRsfwgspluginQgn_indi_connection_on_add_mask);
+
+	CleanupStack::PushL(icon2);
+	iconArray->AppendL(icon2);
+	CleanupStack::Pop(icon2);  
+	
+	CGulIcon* icon3;
+	icon3 = AknsUtils::CreateGulIconL(
+        AknsUtils::SkinInstance(), 
+        KAknsIIDQgnIndiMarkedAdd, 
+        AknIconUtils::AvkonIconFileName(),
+        EMbmAvkonQgn_indi_marked_add,
+        EMbmAvkonQgn_indi_marked_add_mask);
+
+	CleanupStack::PushL(icon3);
+	iconArray->AppendL(icon3);
+	CleanupStack::Pop(icon3);  
+	
+	(static_cast<CAknSingleStyleListBox *>(iMainList))->
+	    ItemDrawer()->ColumnData()->SetIconArray(iconArray);
+ 
+    SetupListL();
+    
+    // Start receiving P&S notifier about the changes in drive connection states
+    // if the key is not found, will leave with an error code
+    // just ignore for now...
+    TRAP_IGNORE(iDriveConnectObserver = CRsfwGsPropertyWatch::NewL(this));
+        
+    SetRect( aRect );
+    ActivateL();
+    
+    iCoeEnv->AddForegroundObserverL( *this );
+    }
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::~CRsfwGsPluginDriveListContainer()
+// Destructor
+//  
+// ---------------------------------------------------------------------------
+//
+CRsfwGsPluginDriveListContainer::~CRsfwGsPluginDriveListContainer()
+    {
+    if (iMainList)
+        {
+         delete iMainList;
+        }
+   
+   if (iDriveConnectObserver)
+        {
+         delete iDriveConnectObserver;
+        }   
+    iCoeEnv->RemoveForegroundObserver( *this );     
+    }
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::SizeChanged()
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::SizeChanged()
+    {
+    iMainList->SetRect(Rect());
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::CountComponentControls() const
+// ---------------------------------------------------------------------------
+//
+TInt CRsfwGsPluginDriveListContainer::CountComponentControls() const
+    {
+    return 1;
+    }
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::ComponentControl() const
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CRsfwGsPluginDriveListContainer::ComponentControl( TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            return iMainList;
+        default:
+            return NULL;
+        }
+    }
+    
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::EditCurrentItemL()
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::EditCurrentItemL()
+    { 
+    HBufC* currentDriveName = GetCurrentRemoteDriveNameLC();
+    if (!(iView->IsDriveConnectedL())) 
+        {       
+        TPtrC drivePtr = currentDriveName->Ptr();
+        iCurrentItemIndex=iMainList->CurrentItemIndex();
+        TPtrC namePtr = drivePtr.Left(currentDriveName->Length());
+        iView->LoadSettingsViewL(EEditExisting, namePtr, ETrue); 
+          
+        }
+    else 
+        {
+        HBufC* myDisplayMessage = NULL;
+        if ( currentDriveName->Length() )
+            {
+            myDisplayMessage = StringLoader::LoadLC( R_STR_RSFW_ERROR_EDIT_CONNECTED, *currentDriveName );
+            }
+        else
+            {
+            myDisplayMessage = StringLoader::LoadLC( R_STR_RSFW_ERROR_EDIT_CONNECTED );
+            }
+        CAknErrorNote* errorNote = new CAknErrorNote(EFalse);
+        errorNote->ExecuteLD(*myDisplayMessage);
+        CleanupStack::PopAndDestroy(myDisplayMessage);
+        }
+    CleanupStack::PopAndDestroy(currentDriveName);    
+    }
+    
+
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::GetCurrentRemoteDriveNameLC()
+// ---------------------------------------------------------------------------
+//
+HBufC* CRsfwGsPluginDriveListContainer::GetCurrentRemoteDriveNameLC()
+    {
+    TPtrC16 remoteDriveName, remoteDriveNameClipped, remoteDriveNamePtr;
+    TInt currentItemIndex = iMainList->CurrentItemIndex();
+    if (currentItemIndex == KErrNotFound)
+	    {
+	    User::Leave(KErrNotFound);
+	    }
+    remoteDriveName.Set(iRemoteDriveListArray->MdcaPoint(currentItemIndex));
+    // remove '\t' from the beginning 
+    remoteDriveNameClipped.Set(remoteDriveName.Mid(1)); 
+   	// remove the trailing '\tn'if exists
+    TInt posit = remoteDriveNameClipped.Find(KTabulator);
+    if (posit != KErrNotFound) 
+        {
+        remoteDriveNamePtr.Set(remoteDriveNameClipped.Left(posit));
+        }
+    else 
+        {
+        remoteDriveNamePtr.Set(remoteDriveNameClipped);
+        }
+
+    return remoteDriveNamePtr.AllocLC();    
+    }
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::GetRemoteDriveNameLC(TInt aIndex)
+// ---------------------------------------------------------------------------
+//
+TPtrC CRsfwGsPluginDriveListContainer::GetRemoteDriveNameL(TInt aIndex)
+    {
+	TPtrC16 remoteDriveName, remoteDriveNameClipped, remoteDriveNamePtr;
+    remoteDriveName.Set(iRemoteDriveListArray->MdcaPoint(aIndex));
+    // remove '\t' from the beginning 
+    remoteDriveNameClipped.Set(remoteDriveName.Mid(1)); 
+   	// remove the trailing '\tn'
+    TInt posit = remoteDriveNameClipped.Find(KTabulator);
+    if (posit != KErrNotFound) 
+        {
+        remoteDriveNamePtr.Set(remoteDriveNameClipped.Left(posit));
+        }
+    else 
+        {
+        remoteDriveNamePtr.Set(remoteDriveNameClipped);
+        }
+
+    return remoteDriveNamePtr;    
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::OfferKeyEventL()
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CRsfwGsPluginDriveListContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, 
+                                                            TEventCode aType )
+    {
+    if (iMainList)
+        {
+        // if cancel key is pressed and list is not empty, invoke deletion
+        if ((aKeyEvent.iCode == EKeyBackspace ) && (aType == EEventKey) )
+            {
+            if(!IsListEmpty())
+                {
+                CRsfwGsPlugin* iTempView = static_cast<CRsfwGsPlugin*> (iView);
+                iTempView->DeleteRemoteDriveL();
+                }  
+            return EKeyWasConsumed;
+            }
+        else 
+            {
+            TKeyResponse returnValue = iMainList->OfferKeyEventL (aKeyEvent, aType);
+            if ((aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow ) 
+                        && (aType == EEventKey))
+                {
+                // Cba needs to be updated any time the user goes through the drive list
+                // as MSK "Edit" is dependent on connection state
+                // Note that we had to call iMainList->OfferKeyEventL() first 
+                // to make sure that the correct drive is highlighted
+                iCurrentItemIndex = iMainList->CurrentItemIndex();
+                iView->UpdateCbaL();            
+                }
+            return returnValue;
+            }
+        }
+    return EKeyWasNotConsumed;    
+    }
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::HandleListBoxEventL()
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent)
+    {
+    // if the Select Key has been pressed
+    if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) ||
+    (aListBoxEvent == MEikListBoxObserver::EEventItemClicked))
+        {
+        EditCurrentItemL();           
+        }
+    }
+      
+    
+  
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::SetupListL()
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::SetupListL()
+    {
+    CTextListBoxModel* model = iMainList->Model();
+    model->SetOwnershipType(ELbmOwnsItemArray);
+    
+    iRemoteDriveListArray = static_cast<CDesCArray*>(model->ItemTextArray());
+    LoadRemoteDriveListArrayL();
+    }    
+    
+
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::LoadSettingsListArrayL()
+// ---------------------------------------------------------------------------
+//
+TInt CRsfwGsPluginDriveListContainer::LoadRemoteDriveListArrayL()
+    {
+    iTitlePane->SetTextL(iTitle);
+    
+    CDesCArray* remoteDriveList = NULL;
+    remoteDriveList = GetRemoteDriveNamesL();
+    CleanupStack::PushL(remoteDriveList);
+    TInt remoteDriveListCount = remoteDriveList->Count();
+    iRemoteDriveListArray->Reset();
+    for (TInt i = 0; i< remoteDriveListCount; i++)
+        {
+        TBuf <KMaxFriendlyNameLength+5> string; // maximum name + \t + \tn
+   		string.Append(KTabulator);
+        string.Append(remoteDriveList->MdcaPoint(i));
+        if ( IsDriveConnectedL(remoteDriveList->MdcaPoint(i))) 
+       		{
+       		string.Append(KConnectedIcon);
+        	}
+        iRemoteDriveListArray->AppendL(string);	
+ 
+        }
+    CleanupStack::PopAndDestroy(remoteDriveList); 
+    iMainList->HandleItemRemovalL();
+    iMainList->HandleItemAdditionL();
+    return remoteDriveListCount;
+    }
+
+
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::IsListEmpty()
+// ---------------------------------------------------------------------------
+//
+TBool CRsfwGsPluginDriveListContainer::IsListEmpty()
+    {
+    if (iRemoteDriveListArray->Count())
+        return EFalse;
+    return ETrue;    
+    }
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::IsLastItem()
+// ---------------------------------------------------------------------------
+//
+TBool CRsfwGsPluginDriveListContainer::IsLastItem()
+    {
+    if (iRemoteDriveListArray->Count() == 1)
+        return ETrue;
+    return EFalse;    
+    }    
+    
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::DeleteCurrentRemoteDriveL()
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::DeleteCurrentRemoteDriveL()
+    {
+    TBool deletingLast = EFalse;
+    if (iMainList->CurrentItemIndex() == iMainList->BottomItemIndex()) 
+        {
+    	deletingLast = ETrue;
+        }
+    
+    HBufC* currentDriveName = GetCurrentRemoteDriveNameLC();
+    TPtrC drivePtr = currentDriveName->Ptr();
+    iMountMan->DeleteMountEntryL(drivePtr.Left(currentDriveName->Length()));  
+    iRemoteDriveListArray->Delete(iMainList->CurrentItemIndex());
+    iMainList->HandleItemRemovalL();
+    iMainList->DrawDeferred();
+    CleanupStack::PopAndDestroy(currentDriveName);
+    
+    if (deletingLast) 
+        {
+    	if (iRemoteDriveListArray->Count() > 0) 
+    		{
+    		iMainList->SetCurrentItemIndex(iMainList->BottomItemIndex());	
+    		}
+    	
+        }
+    }    
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::IsDriveConnectedL()
+// ---------------------------------------------------------------------------
+//    
+TBool CRsfwGsPluginDriveListContainer::IsDriveConnectedL(const TDesC& aName)
+    {
+    
+    TInt err;
+    const CRsfwMountEntry* mountEntry;
+    TRsfwMountInfo mountInfo;
+    TChar driveL;
+    mountEntry = mountEntry = iMountMan->MountEntryL(aName);
+    if (!mountEntry) 
+        {
+        User::Leave(KErrNotFound);
+        }
+    const HBufC* drive = (mountEntry->Item(EMountEntryItemDrive));
+    if (drive && drive->Length())
+        {
+        driveL =(*drive)[0];
+        } 
+    else 
+    	{
+    	// getting drive letter failed
+    	return EFalse;
+    	}
+    err = iMountMan->GetMountInfo(driveL, mountInfo);
+    if ((err == KErrNone) && (mountInfo.iMountStatus.iConnectionState == KMountStronglyConnected)) 
+    	{
+    	return ETrue;
+    	}
+    return EFalse;  
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::SetDriveConnectedStateL()
+// ---------------------------------------------------------------------------
+// 
+void CRsfwGsPluginDriveListContainer::SetDriveConnectedStateL(const TDesC& aName, TBool aConnected)
+	{
+	TInt i;
+	for (i=0; i < iRemoteDriveListArray->Count(); i++) 
+		{
+		TPtrC driveString =  GetRemoteDriveNameL(i);
+		if (driveString.Compare(aName) == 0) 
+			{
+			// newString has space for the friendly name, tabulator and connected icon
+			TBuf<KMaxFriendlyNameLength+5> newString; 
+			newString.Append(KTabulator);
+		    newString.Append(driveString);	
+   			if (aConnected) 
+   				{
+   				newString.Append(KConnectedIcon);
+   				}
+   			iRemoteDriveListArray->Delete(i);
+    		iRemoteDriveListArray->InsertL(i, newString);	
+    		iMainList->DrawDeferred();
+    		// Cba needs to be updated as MSK "Edit" is dependent on connection state
+    		iView->UpdateCbaL();		
+		break;
+			}
+	
+		}
+	
+	}
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::ConnectCurrentRemoteDriveL()
+// ---------------------------------------------------------------------------
+//  
+void CRsfwGsPluginDriveListContainer::ConnectCurrentRemoteDriveL() 
+{  
+	User::LeaveIfError(iMountMan->SetMountConnectionStateBlind(GetCurrentRemoteDriveIdL(), 
+	                                    KMountStronglyConnected));
+}
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::DisconnectCurrentRemoteDriveL()
+// ---------------------------------------------------------------------------
+//  
+void CRsfwGsPluginDriveListContainer::DisconnectCurrentRemoteDriveL() 
+{
+	User::LeaveIfError(iMountMan->SetMountConnectionState(GetCurrentRemoteDriveIdL(), 
+	                                    KMountNotConnected));
+
+}
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::GetNextRemoteDriveNameL
+// ---------------------------------------------------------------------------
+//
+TDesC& CRsfwGsPluginDriveListContainer::GetNextRemoteDriveNameL()
+    {
+    // Always return "New drive" as the default starting name
+    // in case there is already a drive with the name "new name"
+    // user is not allowed to save the new drive before changing the name.
+    StringLoader::Load(iSettingNewName, R_STR_REMOTE_DRIVE_NEW_NAME);
+    return iSettingNewName; 
+    }
+    
+    
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::GetCurrentRemoteDriveIdL
+// ---------------------------------------------------------------------------
+//
+TChar CRsfwGsPluginDriveListContainer::GetCurrentRemoteDriveIdL()
+    {
+    const CRsfwMountEntry* mountEntry;
+   	HBufC* currentDriveName = GetCurrentRemoteDriveNameLC();
+   	TPtrC drivePtr = currentDriveName->Ptr();
+ 	mountEntry = iMountMan->MountEntryL(drivePtr.Left(currentDriveName->Length()));
+ 	if (!mountEntry) 
+ 	    {
+ 	    User::Leave(KErrNotFound);
+ 	    }
+   	CleanupStack::PopAndDestroy(currentDriveName);
+   	const HBufC* drive = (mountEntry->Item(EMountEntryItemDrive));
+    if (drive && drive->Length())
+        {
+        return (*drive)[0];
+        }
+    
+    // should not come here....
+    // return the drive letter of the default drive
+    RFs fs;
+	User::LeaveIfError(fs.Connect());
+	TChar defaultd;
+	fs.DriveToChar(EDriveC, defaultd);
+	fs.Close();
+	return defaultd;
+    }    
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::GetRemoteDriveNamesL
+// ---------------------------------------------------------------------------
+//
+CDesCArray* CRsfwGsPluginDriveListContainer::GetRemoteDriveNamesL()
+    {
+    CDesCArray* myArray = new (ELeave) CDesC16ArraySeg(4);
+    iMountMan->GetMountNamesL(myArray);
+    return myArray;
+    }
+          
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::RemoteDriveCount
+// ---------------------------------------------------------------------------
+//
+TInt CRsfwGsPluginDriveListContainer::RemoteDriveCount()
+    {
+   	return iRemoteDriveListArray->Count();
+    }
+          
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::HandleResourceChange()
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::HandleResourceChange( TInt aType )
+    {
+    if ( aType == KAknsMessageSkinChange ||
+         aType == KEikDynamicLayoutVariantSwitch )
+        {
+        if (aType != KAknsMessageSkinChange) 
+            {
+            TRect mainPaneRect;
+            AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
+                                           mainPaneRect);
+            SetRect( mainPaneRect );
+            }
+        DrawDeferred();
+        CRsfwGsPlugin* iTempView = static_cast<CRsfwGsPlugin*> (iView);    
+
+        iTempView->HandleResourceChangeManual(aType);      
+        }
+    CCoeControl::HandleResourceChange( aType );
+    }
+  
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::HandleResourceChangeManual()
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::HandleResourceChangeManual(TInt aType)
+    {
+    if (aType != KAknsMessageSkinChange) 
+        {
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane,
+                                       mainPaneRect);
+        SetRect( mainPaneRect );
+        }
+    DrawDeferred();
+    iMainList->HandleResourceChange(aType);
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::FocusChanged
+// Set focus on the selected listbox. For animated skins feature.
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::FocusChanged(TDrawNow /*aDrawNow*/)
+    {
+    if(iMainList)
+        {
+        iMainList->SetFocus( IsFocused() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::GetHelpContext
+// This function is called when Help application is launched.
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KGSRsfwPluginUID;
+    }    
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::HandleGainingForeground
+// ---------------------------------------------------------------------------
+//    
+void CRsfwGsPluginDriveListContainer::HandleGainingForeground() 
+    {
+    TRAP_IGNORE(HandleGainingForegroundL());
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::HandleGainingForegroundL
+// Called from HandleGainingForeground in order to trap potential leaves.
+// ---------------------------------------------------------------------------
+//    
+void CRsfwGsPluginDriveListContainer::HandleGainingForegroundL() 
+    {
+    if (iView->CurrentContainer() == this) 
+        {
+        // update the drive list
+        LoadRemoteDriveListArrayL();
+        SetFocus();
+        iView->ProcessDeletingDialog();
+        iView->UpdateCbaL();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::HandleLosingForeground
+// ---------------------------------------------------------------------------
+//        
+void CRsfwGsPluginDriveListContainer::HandleLosingForeground() 
+    {
+    
+    }   
+    
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::SetFocus
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::SetFocus()
+    { 
+    TInt remoteDriveCount = iRemoteDriveListArray->Count();
+    
+    if (remoteDriveCount > 0) 
+        {
+        if (iCurrentItemIndex >= remoteDriveCount) 
+            {
+            // set to the beginning of the list
+            iCurrentItemIndex = 0;
+            }
+        
+        iMainList->SetCurrentItemIndex(iCurrentItemIndex);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CRsfwGsPluginDriveListContainer::SetFocusL
+// finds the given name on the drive list and sets focus accordingly
+// ---------------------------------------------------------------------------
+//
+void CRsfwGsPluginDriveListContainer::SetFocusL(const TDes& aDriveName)
+    {
+    CDesCArray* remoteDriveList = NULL;
+    remoteDriveList = GetRemoteDriveNamesL();
+    CleanupStack::PushL(remoteDriveList);
+    
+    for ( TInt i = 0; i < remoteDriveList->Count(); i++ )
+        { 
+        if (aDriveName.Compare(remoteDriveList->MdcaPoint(i)) == 0)
+            {
+            iMainList->SetCurrentItemIndex(i);
+            CleanupStack::PopAndDestroy(remoteDriveList); 
+            return;
+            }
+        }
+    CleanupStack::PopAndDestroy(remoteDriveList);
+        
+    // if drive name not found on the list, use default behaviour
+    SetFocus();
+    }
+    
+        
+//  End of File