filebrowser/src/FBFileDlgs.cpp
branchRCL_3
changeset 22 fad26422216a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filebrowser/src/FBFileDlgs.cpp	Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,1115 @@
+/*
+* 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 FILES
+#include "FBFileDlgs.h"
+#include "FBFileUtils.h"
+#include "FB.hrh"
+#include "FBStd.h"
+#include <filebrowser.rsg>
+
+#include <aknlistquerydialog.h>
+#include <AknIconArray.h>
+#include <aknlists.h>
+#include <eikbtgpc.h> 
+#include <akntitle.h>
+#include <AknPopupFieldText.h>
+#include <aknnotewrappers.h> 
+#include <eikfutil.h>
+#include <eikclbd.h> 
+
+const TInt KAttOn = 1;
+const TInt KAttOff = 2;
+const TInt KAttEnableRecursion = 0;
+const TInt KAttDisableRecursion = 1;
+const TInt64 KAlmostaDayInMicroSeconds = 86399999999;
+ 
+
+// ===================================== MEMBER FUNCTIONS =====================================
+
+CFileBrowserDestinationFolderSelectionDlg* CFileBrowserDestinationFolderSelectionDlg::NewL(
+    TDes& aReturnPath, CDriveEntryList* aDriveEntryList, CAknIconArray* aIconArray)
+    {
+    CFileBrowserDestinationFolderSelectionDlg* self = new(ELeave) CFileBrowserDestinationFolderSelectionDlg(aReturnPath, aIconArray);
+    CleanupStack::PushL(self);
+    self->ConstructL(aDriveEntryList);
+    CleanupStack::Pop(self);
+    return self;    
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserDestinationFolderSelectionDlg::~CFileBrowserDestinationFolderSelectionDlg()
+    {
+    delete iFileEntryList;
+    delete iDriveEntryList;
+    
+    iFs.Close();
+
+    iEikonEnv->InfoMsgCancel();
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserDestinationFolderSelectionDlg::CFileBrowserDestinationFolderSelectionDlg(
+    TDes& aReturnPath, CAknIconArray* aIconArray) : CAknListQueryDialog(&iSelectedIndex),
+    iReturnPath(aReturnPath), iIconArray(aIconArray)
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDestinationFolderSelectionDlg::ConstructL(CDriveEntryList* aDriveEntryList)
+    {
+    User::LeaveIfError( iFs.Connect() );
+    iDriveEntryList = new(ELeave) CDriveEntryList(8);
+    iFileEntryList = new(ELeave) CFileEntryList(32);
+    iCurrentPath = KNullDesC;
+    
+    //iIsDragging = EFalse;
+    //EnableDragEvents();
+    
+    // get only writeable drives
+    for (TInt i=0; i<aDriveEntryList->Count(); i++)
+        {
+        TDriveEntry driveEntry = aDriveEntryList->At(i);
+        
+        if (driveEntry.iVolumeInfo.iDrive.iMediaAtt != KMediaAttWriteProtected && driveEntry.iVolumeInfo.iDrive.iMediaAtt != KMediaAttLocked && driveEntry.iVolumeInfo.iDrive.iDriveAtt != KDriveAbsent)
+            {
+            iDriveEntryList->AppendL(driveEntry);
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+/*
+void CFileBrowserDestinationFolderSelectionDlg::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 CFileBrowserDestinationFolderSelectionDlg::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;    
+    }    
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDestinationFolderSelectionDlg::PreLayoutDynInitL()
+    {
+    CAknListQueryDialog::PreLayoutDynInitL();
+
+    static_cast<CEikFormattedCellListBox*>(ListBox())->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDestinationFolderSelectionDlg::PostLayoutDynInitL()
+    {
+    CAknListQueryDialog::PostLayoutDynInitL();
+    
+    SetIconArrayL(static_cast<CArrayPtr<CGulIcon>*>(iIconArray)); 
+    
+    RefreshViewL();
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserDestinationFolderSelectionDlg::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;
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDestinationFolderSelectionDlg::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 CFileBrowserDestinationFolderSelectionDlg::MoveDownToDirectoryL()
+    {
+    TInt index = ListBox()->CurrentItemIndex();
+    
+    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 CFileBrowserDestinationFolderSelectionDlg::RefreshViewL()
+    {
+    CDesCArray* textArray = new(ELeave) CDesCArrayFlat(16);
+    
+    if (IsDriveListViewActive())
+        {
+        _LIT(KSimpleDriveEntry, "%d\t%c: <%S>\t\t");
+
+        for (TInt i=0; i<iDriveEntryList->Count(); i++)
+            {
+            TFileName textEntry;
+            TDriveEntry driveEntry = iDriveEntryList->At(i);
+            
+            textEntry.Format(KSimpleDriveEntry, driveEntry.iIconId, TUint(driveEntry.iLetter), &driveEntry.iMediaTypeDesc);
+            
+            textArray->AppendL(textEntry);
+            }
+
+        // set default LSK label
+        ButtonGroupContainer().SetCommandL(0, EAknSoftkeyOk, _L("Open drive"));
+        ButtonGroupContainer().DrawNow();
+        }
+    
+    else
+        {
+        // first get the directory list
+        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    
+            }        
+        
+         
+        _LIT(KSimpleFileEntry, "%d\t%S\t\t");
+
+        
+        // append current folder item
+        TParse nameParser;
+        TInt err = nameParser.SetNoWild(iCurrentPath.LeftTPtr(iCurrentPath.Length()-1), NULL, NULL);
+        TFileName currentFolderName = nameParser.Name();
+        if (currentFolderName == KNullDesC)
+            currentFolderName.Copy(_L("[root level]"));
+
+        TFileName currentDirTextEntry;
+        currentDirTextEntry.Format(KSimpleFileEntry, EFixedIconFolderCurrent, &currentFolderName);
+        textArray->AppendL(currentDirTextEntry);
+
+
+        for (TInt i=0; i<iFileEntryList->Count(); i++)
+            {
+            TFileName textEntry;
+            TFileEntry fileEntry = iFileEntryList->At(i);
+            
+            textEntry.Format(KSimpleFileEntry, fileEntry.iIconId, &fileEntry.iEntry.iName);
+            
+            textArray->AppendL(textEntry);
+            }
+
+         // set default LSK label
+        ButtonGroupContainer().SetCommandL(0, EAknSoftkeyOk, iLSKActionText);
+        ButtonGroupContainer().DrawNow();
+        }
+
+    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 CFileBrowserDestinationFolderSelectionDlg::RunCopyDlgLD()
+    {
+    iLSKActionText.Copy(_L("Copy"));
+    return ExecuteLD(R_COPY_TO_FOLDER_SELECTION_QUERY); 
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserDestinationFolderSelectionDlg::RunMoveDlgLD()
+    {
+    iLSKActionText.Copy(_L("Move"));
+    return ExecuteLD(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)));
+    }
+       
+        
+// --------------------------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
+
+
+CFileBrowserAttributeEditorDlg* CFileBrowserAttributeEditorDlg::NewL(TUint& aSetAttMask, TUint& aClearAttMask, TBool& aRecurse)
+    {
+    CFileBrowserAttributeEditorDlg* self = new(ELeave) CFileBrowserAttributeEditorDlg(aSetAttMask, aClearAttMask, aRecurse);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;    
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserAttributeEditorDlg::~CFileBrowserAttributeEditorDlg()
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserAttributeEditorDlg::CFileBrowserAttributeEditorDlg(TUint& aSetAttMask, TUint& aClearAttMask, TBool& aRecurse) :
+    iSetAttMask(aSetAttMask), iClearAttMask(aClearAttMask), iRecurse(aRecurse)
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserAttributeEditorDlg::ConstructL()
+    {
+    CAknForm::ConstructL();
+
+    // set title text
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    CAknTitlePane* tp = static_cast<CAknTitlePane*>( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+    tp->SetTextL( _L("Set attributes") );
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserAttributeEditorDlg::PreLayoutDynInitL()
+    {
+    CAknForm::PreLayoutDynInitL();
+    
+    // set default LSK label
+    ButtonGroupContainer().SetCommandL(0, EAknSoftkeyOk, _L("Save"));
+
+    // load values
+    CAknPopupFieldText* archivePopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetArchive));
+    CAknPopupFieldText* hiddenPopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetHidden));
+    CAknPopupFieldText* readOnlyPopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetReadOnly));
+    CAknPopupFieldText* systemPopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetSystem));
+    CAknPopupFieldText* recursePopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetRecurse));
+    
+    if (iSetAttMask & KEntryAttArchive)
+        archivePopup->SetCurrentValueIndex(KAttOn);
+    else if (iClearAttMask & KEntryAttArchive)
+        archivePopup->SetCurrentValueIndex(KAttOff);
+    
+    if (iSetAttMask & KEntryAttHidden)
+        hiddenPopup->SetCurrentValueIndex(KAttOn);
+    else if (iClearAttMask & KEntryAttHidden)
+        hiddenPopup->SetCurrentValueIndex(KAttOff);
+    
+    if (iSetAttMask & KEntryAttReadOnly)
+        readOnlyPopup->SetCurrentValueIndex(KAttOn);
+    else if (iClearAttMask & KEntryAttReadOnly)
+        readOnlyPopup->SetCurrentValueIndex(KAttOff);
+    
+    if (iSetAttMask & KEntryAttSystem)
+        systemPopup->SetCurrentValueIndex(KAttOn);
+    else if (iClearAttMask & KEntryAttSystem)
+        systemPopup->SetCurrentValueIndex(KAttOff);
+    
+    if (iRecurse)
+        recursePopup->SetCurrentValueIndex(KAttEnableRecursion);
+    else
+        recursePopup->SetCurrentValueIndex(KAttDisableRecursion);
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserAttributeEditorDlg::OkToExitL(TInt aButtonId)
+    {
+    if (aButtonId == EAknSoftkeyOk)
+        {
+        // save changes
+        CAknPopupFieldText* archivePopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetArchive));
+        CAknPopupFieldText* hiddenPopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetHidden));
+        CAknPopupFieldText* readOnlyPopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetReadOnly));
+        CAknPopupFieldText* systemPopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetSystem));
+        CAknPopupFieldText* recursePopup = static_cast<CAknPopupFieldText*>(Control(EFileBrowserAttributeEditorSetRecurse));
+
+        iSetAttMask = 0;
+        iClearAttMask = 0;
+        
+        if (archivePopup->CurrentValueIndex() == KAttOn)
+            iSetAttMask |= KEntryAttArchive;
+        else if (archivePopup->CurrentValueIndex() == KAttOff)
+            iClearAttMask |= KEntryAttArchive;
+        
+        if (hiddenPopup->CurrentValueIndex() == KAttOn)
+            iSetAttMask |= KEntryAttHidden;
+        else if (hiddenPopup->CurrentValueIndex() == KAttOff)
+            iClearAttMask |= KEntryAttHidden;
+        
+        if (readOnlyPopup->CurrentValueIndex() == KAttOn)
+            iSetAttMask |= KEntryAttReadOnly;
+        else if (readOnlyPopup->CurrentValueIndex() == KAttOff)
+            iClearAttMask |= KEntryAttReadOnly;
+                
+        if (systemPopup->CurrentValueIndex() == KAttOn)
+            iSetAttMask |= KEntryAttSystem;
+        else if (systemPopup->CurrentValueIndex() == KAttOff)
+            iClearAttMask |= KEntryAttSystem;
+
+        if (recursePopup->CurrentValueIndex() == KAttEnableRecursion)
+            iRecurse = ETrue;
+        else if (recursePopup->CurrentValueIndex() == KAttDisableRecursion)
+            iRecurse = EFalse;
+        }
+    
+    return ETrue;
+    }       
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserAttributeEditorDlg::RunEditorLD()
+    {
+    return ExecuteLD(R_ATTRIBUTE_EDITOR_FORM_DIALOG);
+    }
+      
+       
+// --------------------------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
+
+
+CFileBrowserSearchQueryDlg* CFileBrowserSearchQueryDlg::NewL(TSearchAttributes& aSearchAttributes)
+    {
+    CFileBrowserSearchQueryDlg* self = new(ELeave) CFileBrowserSearchQueryDlg(aSearchAttributes);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;    
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserSearchQueryDlg::~CFileBrowserSearchQueryDlg()
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserSearchQueryDlg::CFileBrowserSearchQueryDlg(TSearchAttributes& aSearchAttributes) :
+    iSearchAttributes(aSearchAttributes)
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserSearchQueryDlg::ConstructL()
+    {
+    CAknForm::ConstructL();
+
+    // set title text
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    CAknTitlePane* tp = static_cast<CAknTitlePane*>( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+    tp->SetTextL( _L("Search") );
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserSearchQueryDlg::PreLayoutDynInitL()
+    {
+    CAknForm::PreLayoutDynInitL();
+    
+    // set default LSK label
+    ButtonGroupContainer().SetCommandL(0, EAknSoftkeyOk, _L("Search"));
+
+    // load values
+    CEikEdwin* searchDir = static_cast<CEikEdwin*>(Control(EFileBrowserSearchQuerySearchDir));
+    CEikEdwin* wildCards = static_cast<CEikEdwin*>(Control(EFileBrowserSearchQueryWildCards));
+    CEikEdwin* textInFile = static_cast<CEikEdwin*>(Control(EFileBrowserSearchQueryTextInFile));
+    CEikNumberEditor* minSize = static_cast<CEikNumberEditor*>(Control(EFileBrowserSearchQueryMinSize));
+    CEikNumberEditor* maxSize = static_cast<CEikNumberEditor*>(Control(EFileBrowserSearchQueryMaxSize));
+    CEikDateEditor* minDate = static_cast<CEikDateEditor*>(Control(EFileBrowserSearchQueryMinDate));
+    CEikDateEditor* maxDate = static_cast<CEikDateEditor*>(Control(EFileBrowserSearchQueryMaxDate));
+    CAknPopupFieldText* recurse = static_cast<CAknPopupFieldText*>(Control(EFileBrowserSearchQueryRecurse));
+
+    searchDir->SetTextL(&iSearchAttributes.iSearchDir);
+    wildCards->SetTextL(&iSearchAttributes.iWildCards);
+    textInFile->SetTextL(&iSearchAttributes.iTextInFile);
+    minSize->SetNumber(iSearchAttributes.iMinSize);
+    maxSize->SetNumber(iSearchAttributes.iMaxSize);
+    minDate->SetDate(iSearchAttributes.iMinDate);
+    maxDate->SetDate(iSearchAttributes.iMaxDate);
+    recurse->SetCurrentValueIndex(iSearchAttributes.iRecurse);
+    }
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserSearchQueryDlg::OkToExitL(TInt aButtonId)
+    {
+    if (aButtonId == EAknSoftkeyOk)
+        {
+        // save changes
+        CEikEdwin* searchDir = static_cast<CEikEdwin*>(Control(EFileBrowserSearchQuerySearchDir));
+        CEikEdwin* wildCards = static_cast<CEikEdwin*>(Control(EFileBrowserSearchQueryWildCards));
+        CEikEdwin* textInFile = static_cast<CEikEdwin*>(Control(EFileBrowserSearchQueryTextInFile));
+        CEikNumberEditor* minSize = static_cast<CEikNumberEditor*>(Control(EFileBrowserSearchQueryMinSize));
+        CEikNumberEditor* maxSize = static_cast<CEikNumberEditor*>(Control(EFileBrowserSearchQueryMaxSize));
+        CEikDateEditor* minDate = static_cast<CEikDateEditor*>(Control(EFileBrowserSearchQueryMinDate));
+        CEikDateEditor* maxDate = static_cast<CEikDateEditor*>(Control(EFileBrowserSearchQueryMaxDate));
+        CAknPopupFieldText* recurse = static_cast<CAknPopupFieldText*>(Control(EFileBrowserSearchQueryRecurse));
+
+        // get the current value of search dir and make sure it has a trailing backslash
+        TFileName searchDirBuf;
+        searchDir->GetText(searchDirBuf);
+        if (searchDirBuf.Length() && searchDirBuf[searchDirBuf.Length()-1] != '\\')
+            searchDirBuf.Append('\\');
+
+        // check that the path is valid
+        if (searchDirBuf.Length() && !EikFileUtils::PathExists(searchDirBuf))
+            {
+            CAknInformationNote* note = new(ELeave) CAknInformationNote;
+            note->ExecuteLD(_L("Given search directory does not exists"));
+            
+            return EFalse;
+            }
+
+        iSearchAttributes.iSearchDir = searchDirBuf; 
+        wildCards->GetText(iSearchAttributes.iWildCards);
+        textInFile->GetText(iSearchAttributes.iTextInFile);
+        iSearchAttributes.iMinSize = minSize->Number();
+        iSearchAttributes.iMaxSize = maxSize->Number();
+        iSearchAttributes.iMinDate = minDate->Date();
+        iSearchAttributes.iMaxDate = maxDate->Date();
+        // Adjust the MaxDate to the end of the day:
+        iSearchAttributes.iMaxDate += TTimeIntervalMicroSeconds( KAlmostaDayInMicroSeconds );
+        iSearchAttributes.iRecurse = recurse->CurrentValueIndex();
+        }
+    
+    return ETrue;
+    }       
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserSearchQueryDlg::RunQueryLD()
+    {
+    return ExecuteLD(R_SEARCH_QUERY_FORM_DIALOG);
+    }
+  
+       
+// --------------------------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
+
+
+CFileBrowserDataTypesDlg* CFileBrowserDataTypesDlg::NewL()
+    {
+    CFileBrowserDataTypesDlg* self = new(ELeave) CFileBrowserDataTypesDlg();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;    
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserDataTypesDlg::~CFileBrowserDataTypesDlg()
+    {
+    delete iDTArray;
+    
+    iLs.Close();
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserDataTypesDlg::CFileBrowserDataTypesDlg()
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDataTypesDlg::ConstructL()
+    {
+    // construct a menu bar
+    CAknDialog::ConstructL(R_FILEBROWSER_DATA_TYPES_MENUBAR);
+
+    // set title text
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    CAknTitlePane* tp = static_cast<CAknTitlePane*>( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+    tp->SetTextL( _L("Data types") );
+    
+    User::LeaveIfError(iLs.Connect());
+    
+    iDTArray = new(ELeave) CDataTypeArray(32);
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDataTypesDlg::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aEventType)
+    {
+    switch (aEventType)
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemDoubleClicked:
+            // reserved for future extensions;
+            break;
+        default:
+            break;
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDataTypesDlg::ProcessCommandL(TInt aCommandId)
+    {
+    CAknDialog::ProcessCommandL(aCommandId);
+
+    switch (aCommandId)
+        {
+        case EFileBrowserCmdDataTypesChangeMapping:
+            ChangeMappingL();
+            break;
+        case EFileBrowserCmdDataTypesSetDefaultMapping:
+            SetDefaultMappingL();
+            break;
+        case EFileBrowserCmdDataTypesRefresh:
+            GetDataTypesL();
+            break;
+        case EFileBrowserCmdDataTypesExit:
+            TryExitL(EAknCmdExit);
+            break;
+        default:
+            break;
+        }
+    } 
+    
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDataTypesDlg::PreLayoutDynInitL()
+    {
+    CAknDialog::PreLayoutDynInitL();
+
+    iListBox = static_cast<CAknSingleGraphicStyleListBox*>( Control(EFileBrowserDataTypesList) );
+    iListBox->SetContainerWindowL(*this);
+    iListBox->View()->SetListEmptyTextL(_L("No data types"));
+
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
+        
+    iListBox->CreateScrollBarFrameL(ETrue);
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+    iListBox->SetListBoxObserver(this);
+    
+    iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+
+    GetDataTypesL(); 
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDataTypesDlg::GetDataTypesL()
+    {
+    // get an instance of the listbox's item array
+	MDesCArray* tempArray = iListBox->Model()->ItemTextArray();
+	CDesCArray* listBoxArray = (CDesCArray*)tempArray;
+	listBoxArray->Reset();
+	
+	// create an icon array
+	CAknIconArray* iconArray = new(ELeave) CAknIconArray(32);
+    CleanupStack::PushL(iconArray);
+
+    // get data types
+    iDTArray->Reset();
+    User::LeaveIfError(iLs.GetSupportedDataTypesL(*iDTArray));
+    
+    // sort the array
+    TKeyArrayFix key(0, ECmpFolded8);  // iDataType is located in offset 0 and contain 8-bit descriptor
+    iDTArray->Sort(key);
+
+    
+    // loop each data type
+    for (TInt i=0; i<iDTArray->Count(); i++)
+        {
+        TDataType& dt = iDTArray->At(i);
+        
+        // get app uid which handles this data type
+        TUid appUid;
+        TInt err = iLs.AppForDataType(dt, appUid);
+        
+        // generate icon which is the app icon which handles this mime type
+        CFbsBitmap* bitmap = NULL;
+        CFbsBitmap* mask = NULL;
+        CGulIcon* appIcon = NULL;
+        
+        TRAPD(err2, 
+            AknsUtils::CreateAppIconLC(AknsUtils::SkinInstance(), appUid, EAknsAppIconTypeList, bitmap, mask);
+            appIcon = CGulIcon::NewL(bitmap, mask);
+            CleanupStack::Pop(2); //bitmap, mask
+            );
+                         
+        // append to the icon array    
+        appIcon->SetBitmapsOwnedExternally(EFalse);
+        iconArray->AppendL(appIcon);
+        
+        TFileName entry;
+        entry.AppendNum(i);
+        entry.Append(_L("\t"));
+        entry.Append(dt.Des());
+        entry.Append(_L("  <<"));
+        
+
+        // get caption of the handling app
+        TFileName appCaption;
+        
+        if (err || err2 || appUid == KNullUid)
+            entry.Append(_L("none"));
+        else
+            {
+            TApaAppInfo appInfo;
+            
+            if (iLs.GetAppInfo(appInfo, appUid) == KErrNone)
+                entry.Append(appInfo.iCaption);
+            else
+                entry.Append(_L("none"));
+            }
+        
+        entry.Append(_L(">>"));
+
+        listBoxArray->AppendL( entry );
+        }
+
+
+    // clear any previous icon array
+    CAknIconArray* oldIconArray = static_cast<CAknIconArray*>(iListBox->ItemDrawer()->ColumnData()->IconArray());
+    if (oldIconArray)
+        delete oldIconArray;
+
+    
+    CleanupStack::Pop(); //iconArray
+
+    // updates the listbox
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
+    iListBox->HandleItemAdditionL();    
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDataTypesDlg::ChangeMappingL()
+    {
+    TInt currentItemIndex = iListBox->CurrentItemIndex();
+    
+    if (iDTArray->Count() > currentItemIndex && currentItemIndex >= 0)
+        {
+        // create list of TApaAppInfo
+        CArrayFixFlat<TApaAppInfo>* appInfoArray = new(ELeave) CArrayFixFlat<TApaAppInfo>(64);
+        CleanupStack::PushL(appInfoArray);
+
+        // get list of applications
+        TApaAppInfo appInfo;
+        User::LeaveIfError(iLs.GetAllApps());
+
+        while (iLs.GetNextApp(appInfo) == KErrNone)
+            {
+            appInfoArray->AppendL(appInfo);
+            }
+
+        // sort the array
+        TKeyArrayFix key(_FOFF(TApaAppInfo,iCaption), ECmpFolded16);
+        appInfoArray->Sort(key);
+
+        // create a popup with listbox
+        CAknSingleGraphicPopupMenuStyleListBox* listBox = new(ELeave) CAknSingleGraphicPopupMenuStyleListBox();
+        CleanupStack::PushL(listBox);
+        CAknPopupList* popupList = CAknPopupList::NewL(listBox, R_AVKON_SOFTKEYS_SELECT_CANCEL, AknPopupLayouts::EMenuGraphicWindow );
+        CleanupStack::PushL(popupList);
+        listBox->ConstructL( popupList, 0 );
+        listBox->CreateScrollBarFrameL(ETrue);
+        listBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+        listBox->View()->SetListEmptyTextL(_L("No apps"));
+        listBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);        
+        listBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+        popupList->SetTitleL(_L("Select app"));
+        popupList->EnableFind();
+
+
+        // get an instance of the listbox's item array
+    	MDesCArray* tempArray = listBox->Model()->ItemTextArray();
+    	CDesCArray* listBoxArray = (CDesCArray*)tempArray;
+
+    	// create an icon array
+    	CAknIconArray* iconArray = new(ELeave) CAknIconArray(32);
+        CleanupStack::PushL(iconArray);
+        
+        // loop each app info
+        for (TInt i=0; i<appInfoArray->Count(); i++)
+            {
+                   
+            // get icon of this app
+            CFbsBitmap* bitmap = NULL;
+            CFbsBitmap* mask = NULL;
+            CGulIcon* appIcon = NULL;
+            
+            TRAP_IGNORE( 
+                AknsUtils::CreateAppIconLC(AknsUtils::SkinInstance(), appInfoArray->At(i).iUid, EAknsAppIconTypeList, bitmap, mask);
+                appIcon = CGulIcon::NewL(bitmap, mask);
+                CleanupStack::Pop(2); //bitmap, mask
+                );
+                             
+            // append to the icon array    
+            appIcon->SetBitmapsOwnedExternally(EFalse);
+            iconArray->AppendL(appIcon);            
+            
+            TFileName entry;
+            entry.AppendNum(i);
+            entry.Append(_L("\t"));
+            entry.Append(appInfoArray->At(i).iCaption);
+            
+            listBoxArray->AppendL(entry);
+            }
+
+
+        CleanupStack::Pop(); //iconArray
+
+        // updates the listbox
+        listBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
+        listBox->HandleItemAdditionL(); 
+
+    
+        // execute the popup to query the application
+        if (popupList->ExecuteLD())
+            {
+
+            // query priority
+            TInt queryIndex(0);
+            CAknListQueryDialog* listQueryDlg = new(ELeave) CAknListQueryDialog(&queryIndex);
+
+            if (listQueryDlg->ExecuteLD(R_DATA_TYPE_PRIORITY_QUERY))
+                {
+                TInt32 selectedPriority(0);
+                
+                if (queryIndex == EDataTypePriorityMaximum)
+                    selectedPriority = KDataTypeUnTrustedPriorityThreshold;
+                else if (queryIndex == EDataTypePriorityHigh)
+                    selectedPriority = KDataTypePriorityHigh;
+                else if (queryIndex == EDataTypePriorityNormal)
+                    selectedPriority = KDataTypePriorityNormal;
+                else if (queryIndex == EDataTypePriorityLow)
+                    selectedPriority = KDataTypePriorityLow;
+                else
+                    selectedPriority = KDataTypePriorityLastResort;
+                
+                
+                TApaAppInfo& selectedAppInfo = appInfoArray->At(listBox->CurrentItemIndex());
+
+                if (iLs.InsertDataMapping(iDTArray->At(currentItemIndex), selectedPriority, selectedAppInfo.iUid) == KErrNone)
+                    {
+                    GetDataTypesL();
+
+                    CAknConfirmationNote* note = new(ELeave) CAknConfirmationNote;
+                    note->ExecuteLD(_L("Mapping changed"));
+                    }
+                else
+                    {
+                    CAknErrorNote* note = new(ELeave) CAknErrorNote;
+                    note->ExecuteLD(_L("Unable to change mapping"));
+                    }  
+                }
+            }
+
+        CleanupStack::Pop(); // popupList
+        CleanupStack::PopAndDestroy(2); // listBox, appInfoArray
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserDataTypesDlg::SetDefaultMappingL()
+    {
+    TInt currentItemIndex = iListBox->CurrentItemIndex();
+    
+    if (iDTArray->Count() > currentItemIndex && currentItemIndex >= 0)
+        {
+        if (iLs.DeleteDataMapping(iDTArray->At(currentItemIndex)) == KErrNone)
+            {
+            GetDataTypesL();
+            
+            CAknConfirmationNote* note = new(ELeave) CAknConfirmationNote;
+            note->ExecuteLD(_L("Restored default"));
+            }
+        else
+            {
+            CAknInformationNote* note = new(ELeave) CAknInformationNote;
+            note->ExecuteLD(_L("Nothing to restore"));
+            }
+        }
+    }
+        
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserDataTypesDlg::OkToExitL(TInt aButtonId)
+    {
+    return CAknDialog::OkToExitL(aButtonId);
+    }
+           
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserDataTypesDlg::RunQueryLD()
+    {
+    return ExecuteLD(R_DATA_TYPES_DIALOG);
+    }
+       
+// --------------------------------------------------------------------------------------------
+      
+// End of File
+