--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/filebrowser/engine/FBFolderSelector.cpp Fri Sep 17 08:29:47 2010 +0300
@@ -0,0 +1,622 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+#include "FBFolderSelector.h"
+#include "FBFileUtils.h"
+#include "FB.hrh"
+#include "FBStd.h"
+
+#if (!defined __SERIES60_30__ && !defined __SERIES60_31__)
+#include <driveinfo.h>
+#endif // !defined __SERIES60_30__ && !defined __SERIES60_31__
+
+// ===================================== MEMBER FUNCTIONS =====================================
+
+CFileBrowserFolderSelector *CFileBrowserFolderSelector::NewL(
+ TDes& aReturnPath,
+ MFolderSelectorUI *aFolderSelectorUI)
+ {
+ CFileBrowserFolderSelector* self = new(ELeave) CFileBrowserFolderSelector(aReturnPath,
+ aFolderSelectorUI);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserFolderSelector::~CFileBrowserFolderSelector()
+ {
+ delete iFileEntryList;
+ delete iDriveEntryList;
+
+ iFs.Close();
+
+ //iEikonEnv->InfoMsgCancel();
+ }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserFolderSelector::CFileBrowserFolderSelector(TDes& aReturnPath, MFolderSelectorUI *aFolderSelectorUI) :
+ iReturnPath(aReturnPath),
+ iFolderSelectorUI(aFolderSelectorUI)
+ {
+ }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFolderSelector::ConstructL()
+ {
+ User::LeaveIfError( iFs.Connect() );
+ iDriveEntryList = new(ELeave) CDriveEntryList(8);
+ iFileEntryList = new(ELeave) CFileEntryList(32);
+ iCurrentPath = KNullDesC;
+
+ //iIsDragging = EFalse;
+ //EnableDragEvents();
+
+ // get only writeable drives
+ GetDriveListL();
+ }
+
+// --------------------------------------------------------------------------------------------
+
+/*
+void CFileBrowserFolderSelector::HandlePointerEventL(const TPointerEvent &aPointerEvent)
+ {
+ // detect direction of dragging by comparing the start and finish points
+
+ if (aPointerEvent.iType == TPointerEvent::EButton1Down)
+ {
+ iDragStartPoint = aPointerEvent.iPosition;
+ iIsDragging = EFalse;
+ }
+ else if (aPointerEvent.iType == TPointerEvent::EDrag)
+ {
+ iIsDragging = ETrue;
+
+ return;
+ }
+ else if (aPointerEvent.iType == TPointerEvent::EButton1Up)
+ {
+ if (iIsDragging)
+ {
+ const TInt KDelta = iDragStartPoint.iX - aPointerEvent.iPosition.iX;
+ const TInt KThreshold = 30;
+
+ if (KDelta < -KThreshold) // dragging to right
+ {
+ // "emulate" right key press
+
+ TKeyEvent keyEvent;
+ keyEvent.iCode = EKeyRightArrow;
+ keyEvent.iModifiers = 0;
+
+ TEventCode type = EEventKey;
+
+ OfferKeyEventL(keyEvent, type);
+
+ return;
+ }
+ else if (KDelta > KThreshold) // dragging to left
+ {
+ // "emulate" left key press
+
+ TKeyEvent keyEvent;
+ keyEvent.iCode = EKeyLeftArrow;
+ keyEvent.iModifiers = 0;
+
+ TEventCode type = EEventKey;
+
+ OfferKeyEventL(keyEvent, type);
+
+ return;
+ }
+ }
+ iIsDragging = EFalse;
+ }
+ else
+ {
+ iIsDragging = EFalse;
+ }
+
+ CAknListQueryDialog::HandlePointerEventL(aPointerEvent);
+ }
+*/
+
+// --------------------------------------------------------------------------------------------
+
+TKeyResponse CFileBrowserFolderSelector::OfferKeyEventL(const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/)
+ {
+// if(aType != EEventKey)
+// return EKeyWasNotConsumed;
+
+// if (aKeyEvent.iCode == EKeyLeftArrow && !IsDriveListViewActive())
+// {
+// MoveUpOneLevelL();
+// return EKeyWasConsumed;
+// }
+// else if (aKeyEvent.iCode == EKeyRightArrow && ((ListBox()->CurrentItemIndex() > 0 && !IsDriveListViewActive()) || IsDriveListViewActive()))
+// {
+// MoveDownToDirectoryL();
+// return EKeyWasConsumed;
+// }
+// else if (aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == EKeyEnter)
+// {
+// if (IsDriveListViewActive())
+// {
+// MoveDownToDirectoryL();
+// return EKeyWasConsumed;
+// }
+// else if (ListBox()->CurrentItemIndex() == 0)
+// {
+// TryExitL(EAknSoftkeyOk);
+// return EKeyWasConsumed;
+// }
+// else if (ListBox()->CurrentItemIndex() > 0)
+// {
+// MoveDownToDirectoryL();
+// return EKeyWasConsumed;
+// }
+// }
+//
+// TKeyResponse result = CAknDialog::OfferKeyEventL(aKeyEvent, aType);
+//
+// // update LSK label
+// if (!IsDriveListViewActive())
+// {
+// if (ListBox()->CurrentItemIndex() == 0)
+// {
+// ButtonGroupContainer().SetCommandL(0, EAknSoftkeyOk, iLSKActionText);
+// ButtonGroupContainer().DrawNow();
+// }
+// else
+// {
+// ButtonGroupContainer().SetCommandL(0, EAknSoftkeyOk, _L("Open dir"));
+// ButtonGroupContainer().DrawNow();
+// }
+// }
+//
+// return result;
+ return TKeyResponse();
+ }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFolderSelector::PreLayoutDynInitL()
+ {
+// CAknListQueryDialog::PreLayoutDynInitL();
+
+// static_cast<CEikFormattedCellListBox*>(ListBox())->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
+ }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFolderSelector::PostLayoutDynInitL()
+ {
+// CAknListQueryDialog::PostLayoutDynInitL();
+
+ //w SetIconArrayL(static_cast<CArrayPtr<CGulIcon>*>(iIconArray));
+
+ RefreshViewL();
+ }
+
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserFolderSelector::OkToExitL(TInt /*aButtonId*/)
+ {
+// if (aButtonId == GetLeftCBAShortKeyPress())
+// {
+// if (IsDriveListViewActive())
+// {
+// MoveDownToDirectoryL();
+// return EFalse;
+// }
+// else if (ListBox()->CurrentItemIndex() == 0)
+// {
+// // close the dialog
+// iReturnPath = iCurrentPath;
+// return ETrue;
+// }
+// else if (ListBox()->CurrentItemIndex() > 0)
+// {
+// MoveDownToDirectoryL();
+// return EFalse;
+// }
+// else
+// return EFalse;
+// }
+// else if (aButtonId == GetRightCBAShortKeyPress())
+// {
+// return ETrue;
+// }
+// else
+// {
+// return EFalse;
+// }
+ return ETrue;
+ }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFolderSelector::MoveUpOneLevelL()
+ {
+ if (iCurrentPath.Length() <= 3)
+ {
+ // move to drive list view is the current path is already short enough
+ iCurrentPath = KNullDesC;
+ }
+ else
+ {
+ // move one directory up
+ TInt marker(iCurrentPath.Length());
+
+ // find second last dir marker
+ for (TInt i=iCurrentPath.Length()-2; i>=0; i--)
+ {
+ if (iCurrentPath[i] == '\\')
+ {
+ marker = i;
+ break;
+ }
+
+ }
+ iCurrentPath = iCurrentPath.LeftTPtr(marker+1);
+ }
+
+ // update view
+ RefreshViewL();
+ }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFolderSelector::MoveDownToDirectoryL(TInt index)
+ {
+ if (index >= 0)
+ {
+ if (IsDriveListViewActive())
+ {
+ // currently in a drive list view, move to root of selected drive
+ if (iDriveEntryList->Count() > index)
+ {
+ TDriveEntry driveEntry = iDriveEntryList->At(index);
+
+ iCurrentPath.Append(driveEntry.iLetter);
+ iCurrentPath.Append(_L(":\\"));
+ }
+ }
+ else
+ {
+ // this needed because we have an extra item in the listbox
+ index--;
+
+ // append the new directory
+ if (iFileEntryList->Count() > index)
+ {
+ TFileEntry fileEntry = iFileEntryList->At(index);
+
+ if (fileEntry.iEntry.IsDir())
+ {
+ iCurrentPath.Append(fileEntry.iEntry.iName);
+ iCurrentPath.Append(_L("\\"));
+ }
+ }
+ }
+
+ // update view
+ RefreshViewL();
+ }
+ }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFolderSelector::RefreshViewL()
+ {
+ if (IsDriveListViewActive())
+ {
+ GetDriveListL();
+ }
+ else
+ {
+ GetFileListL();
+ }
+ iFolderSelectorUI->InformFolderSelectionChanged();
+
+ // TODO
+// if (iCurrentPath == KNullDesC)
+// iEikonEnv->InfoMsgWithDuration(_L("<- up dir down dir ->"), TTimeIntervalMicroSeconds32(KMaxTInt));
+// else
+// iEikonEnv->InfoMsgWithDuration(iCurrentPath, TTimeIntervalMicroSeconds32(KMaxTInt));
+
+// SetItemTextArray(textArray);
+// SetOwnershipType(ELbmOwnsItemArray);
+// ListBox()->HandleItemAdditionL();
+// Layout();
+// ListBox()->SetCurrentItemIndex(0);
+// DrawDeferred();
+ }
+
+// --------------------------------------------------------------------------------------------
+
+//TBool CFileBrowserFolderSelector::RunCopyDlgLD()
+// {
+// iLSKActionText.Copy(_L("Copy"));
+// return ExecuteLD(1/*R_COPY_TO_FOLDER_SELECTION_QUERY*/);
+// }
+
+//// --------------------------------------------------------------------------------------------
+
+//TBool CFileBrowserFolderSelector::RunMoveDlgLD()
+// {
+// iLSKActionText.Copy(_L("Move"));
+// return ExecuteLD(1/*R_MOVE_TO_FOLDER_SELECTION_QUERY*/);
+// }
+
+//// --------------------------------------------------------------------------------------------
+
+//TInt CAknQueryDialog::GetLeftCBAShortKeyPress()
+// {
+// return TInt16(0xffff & TInt16(ButtonGroupContainer().ButtonGroup()->CommandId(0)));
+// }
+
+//// --------------------------------------------------------------------------------------------
+
+//TInt CAknQueryDialog::GetRightCBAShortKeyPress()
+// {
+// return TInt16(0xffff & TInt16(ButtonGroupContainer().ButtonGroup()->CommandId(2)));
+// }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFolderSelector::GetDriveListL()
+ {
+ TDriveList driveList;
+
+ // get drive listing depending of the support for network drives
+ if (true/*TODO iEngine->Settings().iSupportNetworkDrives*/)
+ {
+ #ifndef __SERIES60_30__
+ #ifndef __SERIES60_31__
+ User::LeaveIfError(iFs.DriveList(driveList, KDriveAttAll));
+ #endif
+ #else
+ User::LeaveIfError(iFs.DriveList(driveList));
+ #endif
+ }
+ else
+ {
+ User::LeaveIfError(iFs.DriveList(driveList));
+ }
+
+ iDriveEntryList->Reset();
+
+ //TDriveEntry driveEntry;
+ for (TInt i=0; i<KMaxDrives; i++)
+ {
+ if (driveList[i])
+ {
+ TDriveEntry driveEntry;
+
+ // set default icon
+ driveEntry.iIconId = EFixedIconPhoneMemory;
+
+ // get drive letter and number
+ driveEntry.iLetter = 'A' + i;
+ iFs.CharToDrive(driveEntry.iLetter, driveEntry.iNumber);
+
+ // get volume info and check errors
+ if (iFs.Volume(driveEntry.iVolumeInfo, driveEntry.iNumber) == KErrNone)
+ {
+ // set media type descriptor
+ TInt mediaType = driveEntry.iVolumeInfo.iDrive.iType;
+ TBool extMountable( EFalse );
+
+ if (mediaType == EMediaNotPresent)
+ driveEntry.iMediaTypeDesc = _L("Not present");
+ else if (mediaType ==EMediaUnknown )
+ driveEntry.iMediaTypeDesc = _L("Unknown");
+ else if (mediaType ==EMediaFloppy )
+ driveEntry.iMediaTypeDesc = _L("Floppy");
+ else if (mediaType == EMediaHardDisk)
+ driveEntry.iMediaTypeDesc = _L("Mass storage");
+ else if (mediaType == EMediaCdRom)
+ driveEntry.iMediaTypeDesc = _L("CD-ROM");
+ else if (mediaType == EMediaRam)
+ driveEntry.iMediaTypeDesc = _L("RAM");
+ else if (mediaType == EMediaFlash)
+ driveEntry.iMediaTypeDesc = _L("Flash");
+ else if (mediaType == EMediaRom)
+ driveEntry.iMediaTypeDesc = _L("ROM");
+ else if (mediaType == EMediaRemote)
+ driveEntry.iMediaTypeDesc = _L("Remote");
+ else if (mediaType == EMediaNANDFlash)
+ driveEntry.iMediaTypeDesc = _L("NAND flash");
+
+ // get real size of the ROM drive
+ if (mediaType == EMediaRom)
+ {
+ TMemoryInfoV1Buf ramMemory;
+ UserHal::MemoryInfo(ramMemory);
+ driveEntry.iVolumeInfo.iSize = ramMemory().iTotalRomInBytes;
+ }
+
+ // set attribute descripitions
+ if (driveEntry.iVolumeInfo.iDrive.iBattery == EBatNotSupported)
+ driveEntry.iAttributesDesc.Append(_L("Battery not supported"));
+ else if (driveEntry.iVolumeInfo.iDrive.iBattery == EBatGood)
+ driveEntry.iAttributesDesc.Append(_L("Battery good"));
+ else if (driveEntry.iVolumeInfo.iDrive.iBattery == EBatLow)
+ driveEntry.iAttributesDesc.Append(_L("Battery low"));
+ else
+ driveEntry.iAttributesDesc.Append(_L("Battery state unknown"));
+
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttLocal)
+ driveEntry.iAttributesDesc.Append(_L(" + Local"));
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttRom)
+ driveEntry.iAttributesDesc.Append(_L(" + ROM"));
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttRedirected)
+ driveEntry.iAttributesDesc.Append(_L("+ Redirected"));
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttSubsted)
+ driveEntry.iAttributesDesc.Append(_L(" + Substed"));
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttInternal)
+ driveEntry.iAttributesDesc.Append(_L(" + Internal"));
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttRemovable)
+ {
+ driveEntry.iAttributesDesc.Append(_L(" + Removable"));
+#if (!defined __SERIES60_30__ && !defined __SERIES60_31__)
+ TUint drvStatus( 0 );
+ if ( !DriveInfo::GetDriveStatus( iFs, driveEntry.iNumber, drvStatus ) &&
+ drvStatus & DriveInfo::EDriveExternallyMountable &&
+ drvStatus & DriveInfo::EDriveInternal )
+ {
+ extMountable = ETrue;
+ // iMediaTypeDesc already set as "Mass storage"
+ }
+ else
+ {
+ driveEntry.iMediaTypeDesc = _L("Memory card");
+ }
+#else
+ driveEntry.iMediaTypeDesc = _L("Memory card");
+#endif
+ }
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttRemote)
+ driveEntry.iAttributesDesc.Append(_L(" + Remote"));
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttTransaction)
+ driveEntry.iAttributesDesc.Append(_L(" + Transaction"));
+
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttVariableSize)
+ driveEntry.iAttributesDesc.Append(_L(" + Variable size"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttDualDensity)
+ driveEntry.iAttributesDesc.Append(_L(" + Dual density"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttFormattable)
+ driveEntry.iAttributesDesc.Append(_L(" + Formattable"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttWriteProtected)
+ driveEntry.iAttributesDesc.Append(_L(" + Write protected"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttLockable)
+ driveEntry.iAttributesDesc.Append(_L(" + Lockable"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttLocked)
+ driveEntry.iAttributesDesc.Append(_L(" + Locked"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttHasPassword)
+ driveEntry.iAttributesDesc.Append(_L(" + Has password"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttReadWhileWrite)
+ driveEntry.iAttributesDesc.Append(_L(" + Read while write"));
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttDeleteNotify)
+ driveEntry.iAttributesDesc.Append(_L(" + Supports DeleteNotify"));
+
+
+ // mark a removable media with memory card icon
+ if (driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAttRemovable && !extMountable)
+ {
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt & KMediaAttLocked || driveEntry.iVolumeInfo.iDrive.iDriveAtt & KDriveAbsent)
+ {
+ driveEntry.iIconId = EFixedIconMemoryCardDisabled;
+ }
+ else
+ {
+ driveEntry.iIconId = EFixedIconMemoryCard;
+ }
+ }
+ }
+
+ // if this fails, likely it's a memory card which is not present
+ else
+ {
+ TVolumeInfo volumeInfo;
+ volumeInfo.iSize = 0;
+ volumeInfo.iFree = 0;
+ volumeInfo.iDrive.iDriveAtt = KDriveAttRemovable;
+ volumeInfo.iDrive.iMediaAtt = KMediaAttWriteProtected;
+ driveEntry.iVolumeInfo = volumeInfo;
+
+ driveEntry.iMediaTypeDesc = _L("Not ready");
+ driveEntry.iIconId = EFixedIconMemoryCardDisabled;
+ }
+// TODO What to do with iPrevFolderName and iPrevFolderIndex
+// if ( iPrevFolderName != KNullDesC && iPrevFolderName[0] == driveEntry.iLetter )
+// {
+// iPrevFolderIndex = iDriveEntryList->Count();
+// }
+
+ if (driveEntry.iVolumeInfo.iDrive.iMediaAtt != KMediaAttWriteProtected
+ && driveEntry.iVolumeInfo.iDrive.iMediaAtt != KMediaAttLocked
+ && driveEntry.iVolumeInfo.iDrive.iDriveAtt != KDriveAbsent)
+ {
+ iDriveEntryList->AppendL(driveEntry);
+ }
+ }
+ }
+ }
+
+void CFileBrowserFolderSelector::GetFileListL()
+ {
+ iFileEntryList->Reset();
+
+ CDir* dir = NULL;
+ if (iFs.GetDir(iCurrentPath, KEntryAttDir|KEntryAttMatchMask, ESortByName | EAscending | EDirsFirst, dir) == KErrNone)
+ {
+ CleanupStack::PushL(dir);
+
+ for (TInt i=0; i<dir->Count(); i++)
+ {
+ TFileEntry fileEntry;
+ fileEntry.iPath = iCurrentPath;
+ fileEntry.iEntry = (*dir)[i];
+ fileEntry.iDirEntries = KErrNotFound;
+ fileEntry.iIconId = EFixedIconEmpty;
+
+ // check for directory entries
+ if (fileEntry.iEntry.IsDir())
+ {
+ fileEntry.iIconId = EFixedIconFolder;
+
+ TFileName subPath = fileEntry.iPath;
+ subPath.Append(fileEntry.iEntry.iName);
+ subPath.Append(_L("\\"));
+
+ // check if any sub directories
+ CDir* subDir = NULL;
+ if (iFs.GetDir(subPath, KEntryAttDir|KEntryAttMatchMask, ESortNone | EDirsFirst, subDir) == KErrNone)
+ {
+ fileEntry.iDirEntries = subDir->Count();
+
+ for (TInt j=0; j<subDir->Count(); j++)
+ {
+ TEntry entry = (*subDir)[j];
+
+ if (entry.IsDir())
+ {
+ fileEntry.iIconId = EFixedIconFolderSub;
+ break;
+ }
+ }
+
+ delete subDir;
+ }
+ iFileEntryList->AppendL(fileEntry);
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); //dir
+ }
+ }
+
+// --------------------------------------------------------------------------------------------
+
+// End of File
+