diff -r 88ee4cf65e19 -r 1aa8c82cb4cb remotestoragefw/gsplugin/src/rsfwgsplugindrivelistcontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/remotestoragefw/gsplugin/src/rsfwgsplugindrivelistcontainer.cpp Wed Sep 01 12:15:08 2010 +0100 @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + ( iEikonEnv->EikAppUi() )->StatusPane(); + iTitlePane = static_cast + ( 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* 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(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 (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::EEventItemSingleClicked)) + { + EditCurrentItemL(); + } + } + + + +// --------------------------------------------------------------------------- +// CRsfwGsPluginDriveListContainer::SetupListL() +// --------------------------------------------------------------------------- +// +void CRsfwGsPluginDriveListContainer::SetupListL() + { + CTextListBoxModel* model = iMainList->Model(); + model->SetOwnershipType(ELbmOwnsItemArray); + + iRemoteDriveListArray = static_cast(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 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 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 (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