filebrowser/src/FBFileListContainer.cpp
changeset 0 d6fe6244b863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filebrowser/src/FBFileListContainer.cpp	Tue Feb 02 00:17:27 2010 +0200
@@ -0,0 +1,1133 @@
+/*
+* 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 "FBFileListContainer.h"
+#include "FB.hrh"
+#include "FBDocument.h"
+#include "FBAppUi.h"
+#include "FBModel.h"
+#include "FBFileUtils.h"
+#include "FBStd.h"
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+    #include "FBToolbar.h"
+#endif
+
+#include <w32std.h>
+#include <AknDef.h>
+#include <AknUtils.h> 
+#include <eikspane.h>
+#include <akntitle.h>
+#include <aknnavilabel.h>
+#include <aknlists.h>
+#include <aknsfld.h>
+#include <eikclbd.h>
+#include <eiktxlbm.h>
+#include <AknsListBoxBackgroundControlContext.h>
+#include <AknInfoPopupNoteController.h>
+#include <AknIconArray.h>
+#include <layoutmetadata.cdl.h>
+
+_LIT(KEmptyDirectory, "No entries");
+_LIT(KNoMatches, "No matches");
+
+const TInt KSimpleViewFontHeight = 127;
+const TInt KExtendedViewFontHeight1 = 127;
+const TInt KExtendedViewFontHeight2 = 105;
+
+const TInt KSimpleViewFontHeightQHD = 120;
+const TInt KExtendedViewFontHeight1QHD = 115;
+const TInt KExtendedViewFontHeight2QHD = 90;
+
+// ===================================== MEMBER FUNCTIONS =====================================
+
+void CFileBrowserFileListContainer::ConstructL(const TRect& /*aRect*/)
+    {
+    iModel = static_cast<CFileBrowserDocument*>(reinterpret_cast<CEikAppUi*>(iEikonEnv->AppUi())->Document())->Model();
+    iModel->SetFileListContainer(this);
+    
+    iFileViewMode = -1;
+    iIsDragging = EFalse;
+    
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __SERIES60_32__)
+    iToolbar = CFileBrowserToolbar::NewL();
+    if ( iModel->Settings().iEnableToolbar && 
+         AknLayoutUtils::PenEnabled() )
+        {
+        iToolbar->ShowToolbarL();        
+        }
+    else
+        {
+        iToolbar->HideToolbarL();
+        }
+#endif
+    
+    CreateWindowL();
+    Window().SetShadowDisabled(EFalse);
+    SetBlank();
+
+    SetScreenLayoutL(iModel->Settings().iDisplayMode);
+    
+    CreateEmptyNaviPaneLabelL();
+    
+    iModel->FileUtils()->RefreshViewL();
+
+    EnableDragEvents();
+    
+    ActivateL();
+    
+    iInfoPopup = CAknInfoPopupNoteController::NewL();
+    iInfoPopup->SetTimePopupInView(5000);
+    iInfoPopup->SetTimeDelayBeforeShow(500);
+    iInfoPopup->SetTextL(_L("TIP: Use left arrow key or touch drag to left to move up in the directory structure."));
+    iInfoPopup->ShowInfoPopupNote();
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CFileBrowserFileListContainer::~CFileBrowserFileListContainer()
+    {
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+    delete iToolbar;
+#endif
+    delete iInfoPopup;
+    
+    DeleteNaviPane();
+
+    if (iSearchField)
+        delete iSearchField;
+    
+    if (iListBox)
+        delete iListBox;
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::CreateEmptyNaviPaneLabelL()
+    {
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+
+    iNaviContainer = static_cast<CAknNavigationControlContainer*>(sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
+    iNaviDecorator = iNaviContainer->CreateNavigationLabelL();
+    iNaviContainer->PushL(*iNaviDecorator);
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::DeleteNaviPane()
+    {
+    if (iNaviContainer)
+        {
+        iNaviContainer->Pop(iNaviDecorator);
+        }
+    
+    if (iNaviDecorator)
+        {
+        delete iNaviDecorator;
+        iNaviDecorator = NULL;
+        }
+    }
+    
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::Draw(const TRect& aRect) const
+    {
+    CWindowGc& gc = SystemGc();
+    gc.Clear(aRect);
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::HandleControlEventL(
+    CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
+    {
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TKeyResponse CFileBrowserFileListContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
+    {
+    // open search field with alpha digit numbers
+    if (aType == EEventKeyDown && !iSearchField && aKeyEvent.iScanCode < EStdKeyF1 && TChar(aKeyEvent.iScanCode).IsAlphaDigit())
+        {
+        EnableSearchFieldL();
+        
+        if (iSearchField)
+            {
+            //static_cast<CAknFilteredTextListBoxModel*>(iListBox->Model())->Filter()->DeferredSendKeyEventToFepL(aKeyEvent.iCode);
+            return EKeyWasConsumed;
+            }
+        }
+    
+    // close search field with clear-button if it's empty
+    if (iSearchField && aKeyEvent.iCode == EKeyBackspace)
+        {
+           TFileName searchText;
+           iSearchField->GetSearchText(searchText);
+           
+           if (searchText == KNullDesC)
+               {
+               DisableSearchFieldL();
+               return EKeyWasConsumed; 
+               }
+        }
+
+    // check file/directory handling related cases
+    if (iModel->FileUtils()->HandleOfferKeyEventL(aKeyEvent, aType) == EKeyWasConsumed)
+        return EKeyWasConsumed;
+    
+    TKeyResponse result = EKeyWasNotConsumed;
+
+    if (iSearchField && iListBox)
+        {
+        // find items with all event codes (that's the reason why there is EEventKey instead of aType)
+        TBool needsRefresh(EFalse);
+        result = AknFind::HandleFindOfferKeyEventL(aKeyEvent, EEventKey, this, iListBox, iSearchField, EFalse, needsRefresh);
+        
+        if (needsRefresh)
+            DrawNow();
+        }
+
+    // scroll one page up/down with volume keys
+    if (result == EKeyWasNotConsumed && iListBox && iListBox->Model()->NumberOfItems() > 0 && (aKeyEvent.iCode == EKeyIncVolume || (aKeyEvent.iCode=='#' && !iModel->IsHashKeySelectionInUse())))
+        {
+        CListBoxView::TSelectionMode selectionMode = CListBoxView::ENoSelection;
+        CListBoxView::TCursorMovement moveto = CListBoxView::ECursorPrevScreen;
+        
+        iListBox->View()->MoveCursorL(moveto, selectionMode);
+      
+        iListBox->SetCurrentItemIndex(iListBox->CurrentItemIndex()); 
+        iListBox->DrawDeferred();
+
+        return EKeyWasConsumed;
+        
+        }
+    else if (result == EKeyWasNotConsumed && iListBox && iListBox->Model()->NumberOfItems() > 0 && (aKeyEvent.iCode == EKeyDecVolume || aKeyEvent.iCode=='*'))
+        {
+        CListBoxView::TSelectionMode selectionMode = CListBoxView::ENoSelection;
+        CListBoxView::TCursorMovement moveto = CListBoxView::ECursorNextScreen;
+        
+        if (iListBox->CurrentItemIndex() >= iListBox->Model()->NumberOfItems() - iListBox->View()->NumberOfItemsThatFitInRect(iListBox->View()->ViewRect()))
+            moveto = CListBoxView::ECursorLastItem;
+        
+        iListBox->View()->MoveCursorL(moveto, selectionMode);
+
+        iListBox->SetCurrentItemIndex(iListBox->CurrentItemIndex()); 
+        iListBox->DrawDeferred();
+
+        return EKeyWasConsumed;
+        }
+
+    // offer key event to the listbox if not already consumed
+    else if (result == EKeyWasNotConsumed && iListBox)
+        return iListBox->OfferKeyEventL(aKeyEvent, aType);
+    else
+        return result;
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aEventType)
+    {
+    switch (aEventType)
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemDoubleClicked:
+            {
+            // "emulate" enter key press and send it to file utils for prosessing
+            
+            TKeyEvent keyEvent;
+            keyEvent.iCode = EKeyEnter;
+            keyEvent.iModifiers = 0;
+            
+            TEventCode type = EEventKey;
+    
+            iModel->FileUtils()->HandleOfferKeyEventL(keyEvent, type);          
+            }
+            break;
+        default:
+            break;
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::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 and send it to file utils for prosessing
+                
+                TKeyEvent keyEvent;
+                keyEvent.iCode = EKeyRightArrow;
+                keyEvent.iModifiers = 0;
+                
+                TEventCode type = EEventKey;
+        
+                iModel->FileUtils()->HandleOfferKeyEventL(keyEvent, type);
+                
+                return;
+                }
+            else if (KDelta > KThreshold) // dragging to left
+                {
+                // "emulate" left key press and send it to file utils for prosessing
+                
+                TKeyEvent keyEvent;
+                keyEvent.iCode = EKeyLeftArrow;
+                keyEvent.iModifiers = 0;
+                
+                TEventCode type = EEventKey;
+        
+                iModel->FileUtils()->HandleOfferKeyEventL(keyEvent, type);
+                
+                return;
+                }            
+            }
+        iIsDragging = EFalse;
+        }
+    else
+        {
+        iIsDragging = EFalse;        
+        }
+
+    CCoeControl::HandlePointerEventL(aPointerEvent);
+    }
+            
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::CreateListBoxL(TInt aFileViewMode)
+    {
+    iFileViewMode = aFileViewMode;
+    
+    if (iSearchField)
+        DisableSearchFieldL();
+    
+    if (iListBox)
+        {
+        delete iListBox;
+        iListBox = NULL;    
+        }
+    
+    if (iFileViewMode == EFileViewModeSimple)
+        {
+        iListBox = new(ELeave) CSimpleFileViewListBox;
+        }
+    else     
+        {
+        iListBox = new(ELeave) CExtendedFileViewListBox;
+        }
+        
+                
+    iListBox->SetContainerWindowL(*this);
+    iListBox->ConstructL(this, EAknListBoxMarkableList);
+    
+    iListBox->View()->SetListEmptyTextL(KEmptyDirectory);
+        
+    iListBox->CreateScrollBarFrameL(ETrue);
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+    iListBox->SetListBoxObserver(this);
+
+    // make sure listbox has correct size
+    SizeChanged();
+
+    iListBox->ActivateL();
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TInt CFileBrowserFileListContainer::CurrentListBoxItemIndex()
+    {
+    if (iListBox && iSearchField)
+        {
+        TInt currentItemIndex = iListBox->CurrentItemIndex();
+        
+        if (currentItemIndex >= 0)
+            return static_cast<CAknFilteredTextListBoxModel*>(iListBox->Model())->Filter()->FilteredItemIndex(currentItemIndex);
+        else
+            return KErrNotFound;
+        }
+    else if (iListBox)
+        {
+        return iListBox->CurrentItemIndex();
+        }
+    else
+        return KErrNotFound;    
+    }
+
+// --------------------------------------------------------------------------------------------
+
+const CArrayFix<TInt>* CFileBrowserFileListContainer::ListBoxSelectionIndexes()
+    {
+    if (iListBox && iSearchField)
+        {
+        TRAP_IGNORE( static_cast<CAknFilteredTextListBoxModel*>(iListBox->Model())->Filter()->UpdateSelectionIndexesL() ); // !!!
+        return static_cast<CAknFilteredTextListBoxModel*>(iListBox->Model())->Filter()->SelectionIndexes();
+        }
+    else if (iListBox)
+        {
+        const CListBoxView::CSelectionIndexArray* indices = iListBox->SelectionIndexes();
+        return static_cast<const CArrayFix<TInt>*>(indices);
+        }
+    else
+        return NULL;
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TInt CFileBrowserFileListContainer::ListBoxSelectionIndexesCount()
+    {
+    if (iListBox && iSearchField)
+        {
+        TRAP_IGNORE( static_cast<CAknFilteredTextListBoxModel*>(iListBox->Model())->Filter()->UpdateSelectionIndexesL() ); // !!!
+        return static_cast<CAknFilteredTextListBoxModel*>(iListBox->Model())->Filter()->SelectionIndexes()->Count();
+        }
+    else if (iListBox)
+        {
+        return iListBox->SelectionIndexes()->Count();
+        }
+    else
+        return KErrNotFound;
+    }
+    
+// --------------------------------------------------------------------------------------------
+
+TInt CFileBrowserFileListContainer::ListBoxNumberOfVisibleItems()
+    {
+    if (iListBox && iSearchField)
+        {
+        return static_cast<CAknFilteredTextListBoxModel*>(iListBox->Model())->Filter()->FilteredNumberOfItems();
+        }
+    else if (iListBox)
+        {
+        return iListBox->Model()->NumberOfItems();
+        }
+    else
+        return KErrNotFound;
+    }
+        
+// --------------------------------------------------------------------------------------------
+
+CAknIconArray* CFileBrowserFileListContainer::ListBoxIconArrayL()
+    {
+    if (iListBox)
+        { 
+        if (iFileViewMode == EFileViewModeSimple)
+            {
+            return static_cast<CAknIconArray*>(static_cast<CEikColumnListBox*>(iListBox)->ItemDrawer()->ColumnData()->IconArray());
+            }
+        else if (iFileViewMode == EFileViewModeExtended)
+            {
+            return static_cast<CAknIconArray*>(static_cast<CEikFormattedCellListBox*>(iListBox)->ItemDrawer()->ColumnData()->IconArray());
+            }
+        }
+
+    return NULL;
+    }
+    
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::SetListBoxIconArrayL(CAknIconArray* aIconArray)
+    {
+    if (iListBox)
+        { 
+        if (iFileViewMode == EFileViewModeSimple)
+            {
+            //CArrayPtr<CGulIcon>* currentIconArray = static_cast<CEikColumnListBox*>(iListBox)->ItemDrawer()->ColumnData()->IconArray();
+            //delete currentIconArray;
+            //currentIconArray = NULL;       
+            static_cast<CEikColumnListBox*>(iListBox)->ItemDrawer()->ColumnData()->SetIconArray(aIconArray);
+            }
+        else if (iFileViewMode == EFileViewModeExtended)
+            {
+            //CArrayPtr<CGulIcon>* currentIconArray = static_cast<CEikFormattedCellListBox*>(iListBox)->ItemDrawer()->ColumnData()->IconArray();
+            //delete currentIconArray;
+            //currentIconArray = NULL;       
+            static_cast<CEikFormattedCellListBox*>(iListBox)->ItemDrawer()->ColumnData()->SetIconArray(aIconArray);
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::SetListBoxTextArrayL(CDesCArray* aTextArray)
+    {
+    if (iListBox)
+        {    
+        iListBox->Model()->SetItemTextArray(aTextArray);
+        iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+        iListBox->HandleItemAdditionL();
+        iListBox->UpdateScrollBarsL();
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::EnableSearchFieldL()
+    {
+    if (iListBox && !iSearchField && iListBox->Model()->NumberOfItems() > 0)
+        {
+        iSearchField = CAknSearchField::NewL(*this, CAknSearchField::ESearch, NULL, KMaxFileName);
+        
+        iSearchField->SetObserver(this);
+        iSearchField->SetFocus(ETrue);
+        iSearchField->MakeVisible(ETrue);
+        iSearchField->ResetL();
+        
+        iListBox->View()->SetListEmptyTextL(KNoMatches);
+        
+        // enable filtering
+        ((CAknFilteredTextListBoxModel*)iListBox->Model())->CreateFilterL(iListBox, iSearchField);
+        
+        SizeChanged();   
+
+        // update cba
+        CEikButtonGroupContainer* cbaGroup = CEikButtonGroupContainer::Current();
+        cbaGroup->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_CANCEL);
+        cbaGroup->DrawNow();
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TBool CFileBrowserFileListContainer::IsSearchFieldEnabled()
+    {
+    return iSearchField != NULL;
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::DisableSearchFieldL()
+    {
+    if (iSearchField)
+        {
+        iSearchField->MakeVisible( EFalse );
+        iSearchField->SetFocusing( EFalse );
+        
+        delete iSearchField;
+        iSearchField = NULL;  
+
+        iListBox->View()->SetListEmptyTextL(KEmptyDirectory);
+
+        // disable filtering
+        ((CAknFilteredTextListBoxModel*)iListBox->Model())->RemoveFilter();
+
+        SizeChanged();
+        DrawNow();
+
+        // update cba
+        CEikButtonGroupContainer* cbaGroup = CEikButtonGroupContainer::Current();
+        cbaGroup->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_EXIT);
+        cbaGroup->DrawNow();
+        
+        // Clear selections because using filter causes selections to go out of sync
+        UpdateToolbar();
+        AknSelectionService::HandleMarkableListProcessCommandL( EAknUnmarkAll, iListBox );
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+TInt CFileBrowserFileListContainer::CountComponentControls() const
+    {
+    TInt controls(0);
+
+    if (iListBox)
+        controls++;
+    
+    if (iSearchField)
+        controls++;
+    
+    return controls;
+    }
+
+// --------------------------------------------------------------------------------------------
+
+CCoeControl* CFileBrowserFileListContainer::ComponentControl(TInt aIndex) const
+    {
+    switch (aIndex)
+        {
+        case 0:
+            {
+            return iListBox;
+            }
+        case 1:
+            {
+            return iSearchField;
+            }
+        default:
+            {
+            return NULL;
+            }
+        }
+    }    
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::SetScreenLayoutL(TInt aLayoutMode)
+    {
+    // make sure that the search field has been disabled
+    DisableSearchFieldL();
+
+    // make sure that the title of the application is correct
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    CAknTitlePane* tp = static_cast<CAknTitlePane*>( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+    tp->SetTextL( _L("FileBrowser") );
+    
+    // change the layout mode
+    if (aLayoutMode == EDisplayModeFullScreen)
+        sp->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_SMALL);
+    else
+        sp->SwitchLayoutL(R_AVKON_STATUS_PANE_LAYOUT_USUAL);
+    
+    // update layout
+    HandleResourceChange(KEikDynamicLayoutVariantSwitch);
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::SetNaviPaneTextL(const TDesC& aText)
+    {
+    if (iNaviDecorator)
+        {
+        delete iNaviDecorator;
+        iNaviDecorator = NULL;
+        }
+    
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    iNaviDecorator = iNaviContainer->CreateMessageLabelL(aText);
+    iNaviContainer->PushL(*iNaviDecorator);
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::SizeChanged()
+    {
+    if (iListBox && iSearchField)
+        {
+        TSize findPaneSize;
+        AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EFindPane, findPaneSize);
+
+        TRect mainPaneRect;
+        TRect naviPaneRect;
+
+        if (Layout_Meta_Data::IsLandscapeOrientation() ||
+            iEikonEnv->AppUiFactory()->StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_SMALL)
+            {
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+            if ( iToolbar && iModel->Settings().iEnableToolbar )
+                {
+                iToolbar->ShowToolbarL();
+                // Get location of softkeys 
+                AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation(); 
+                if ( cbaLocation == AknLayoutUtils::EAknCbaLocationBottom ) 
+                    { 
+                    // here there is the BSK mode
+                    mainPaneRect.iBr.iX -= iToolbar->Rect().Width();
+                    findPaneSize.iWidth -= iToolbar->Rect().Width();
+                    }
+                }
+#endif
+            }
+        else
+            {
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::ENaviPane, naviPaneRect);
+            mainPaneRect.iTl.iY = naviPaneRect.Height();
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+            if ( iToolbar && iModel->Settings().iEnableToolbar )
+                {
+                iToolbar->ShowToolbarL();
+                mainPaneRect.iBr.iY -= iToolbar->Rect().Height();
+                }
+#endif
+            }
+        
+        mainPaneRect.iBr.iY -= findPaneSize.iHeight;  
+
+        TRect listBoxRect(mainPaneRect.Size());
+        iListBox->SetRect(listBoxRect);
+
+        if (iFileViewMode == EFileViewModeSimple)
+            {        
+            CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikColumnListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+            listBoxContext->SetRect(listBoxRect);
+            }
+        else if (iFileViewMode == EFileViewModeExtended)
+            {        
+            CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikFormattedCellListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+            listBoxContext->SetRect(listBoxRect);
+            }        
+
+        iSearchField->SetRect(TRect(TPoint(0,mainPaneRect.Height()), findPaneSize));
+        
+        if (iSearchField->IsVisible() && iListBox->IsVisible())
+            iSearchField->SetLinePos(2);
+
+        }
+        
+    else if (iListBox)
+        {
+        TRect mainPaneRect;
+        TRect naviPaneRect;
+
+        if (Layout_Meta_Data::IsLandscapeOrientation() ||
+            iEikonEnv->AppUiFactory()->StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_SMALL)
+            {
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+            if ( iToolbar && iModel->Settings().iEnableToolbar )
+                {
+                iToolbar->ShowToolbarL();
+                // Get location of softkeys 
+                AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation(); 
+                if ( cbaLocation == AknLayoutUtils::EAknCbaLocationBottom ) 
+                    { 
+                    // here there is the BSK mode
+                    mainPaneRect.iBr.iX -= iToolbar->Rect().Width();
+                    }
+                }
+#endif
+            }
+        else
+            {
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::ENaviPane, naviPaneRect);
+            mainPaneRect.iTl.iY = naviPaneRect.Height();
+            
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+            if ( iToolbar && iModel->Settings().iEnableToolbar )
+                {
+                iToolbar->ShowToolbarL();
+                mainPaneRect.iBr.iY -= iToolbar->Rect().Height();
+                }
+#endif
+            }
+        
+        TRect listBoxRect(mainPaneRect.Size());
+        iListBox->SetRect(listBoxRect);
+
+        if (iFileViewMode == EFileViewModeSimple)
+            {        
+            CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikColumnListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+            listBoxContext->SetRect(listBoxRect);
+            }
+        else if (iFileViewMode == EFileViewModeExtended)
+            {        
+            CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikFormattedCellListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+            listBoxContext->SetRect(listBoxRect);
+            }
+        }
+    }
+        
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::HandleResourceChange(TInt aType)
+    {
+    CCoeControl::HandleResourceChange(aType);
+
+    if (aType == KEikDynamicLayoutVariantSwitch)
+        {
+        TRect mainPaneRect;
+        TRect naviPaneRect;
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __SERIES60_32__)
+        TBool needToCutSearchFieldLength( EFalse );
+#endif
+        
+        if (Layout_Meta_Data::IsLandscapeOrientation() ||
+            iEikonEnv->AppUiFactory()->StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_SMALL)
+            {
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __SERIES60_32__)
+            if ( iToolbar && iModel->Settings().iEnableToolbar )
+                {
+                iToolbar->ShowToolbarL();
+                // Get location of softkeys 
+                AknLayoutUtils::TAknCbaLocation cbaLocation = AknLayoutUtils::CbaLocation(); 
+                if ( cbaLocation == AknLayoutUtils::EAknCbaLocationBottom ) 
+                    { 
+                    // here there is the BSK mode
+                    mainPaneRect.iBr.iX -= iToolbar->Rect().Width();
+                    needToCutSearchFieldLength = ETrue;
+                    }
+                }
+#endif
+            }
+        else
+            {
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+            AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::ENaviPane, naviPaneRect);
+            mainPaneRect.iTl.iY = naviPaneRect.Height();
+
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __SERIES60_32__)
+            if ( iToolbar && iModel->Settings().iEnableToolbar )
+                {
+                iToolbar->ShowToolbarL();
+                mainPaneRect.iBr.iY -= iToolbar->Rect().Height();
+                }
+#endif
+            }
+
+        SetRect(mainPaneRect);
+
+        if (iListBox && iSearchField)
+            {
+            TSize findPaneSize;
+            AknLayoutUtils::LayoutMetricsSize(AknLayoutUtils::EFindPane, findPaneSize);
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __SERIES60_32__)
+            if ( needToCutSearchFieldLength )
+                {
+                findPaneSize.iWidth -= iToolbar->Rect().Width();
+                }
+#endif
+            mainPaneRect.iBr.iY -= findPaneSize.iHeight;
+            
+            TRect listBoxRect(mainPaneRect.Size());
+            iListBox->SetRect(listBoxRect);
+            
+            if (iFileViewMode == EFileViewModeSimple)
+                {        
+                CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikColumnListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+                listBoxContext->SetRect(listBoxRect);
+                }
+            else if (iFileViewMode == EFileViewModeExtended)
+                {        
+                CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikFormattedCellListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+                listBoxContext->SetRect(listBoxRect);
+                }    
+            
+            iSearchField->SetRect(TRect(TPoint(0,mainPaneRect.Height()), findPaneSize));
+            
+            if (iSearchField->IsVisible() && iListBox->IsVisible())
+                iSearchField->SetLinePos(2);
+        
+            TRAP_IGNORE(iListBox->UpdateScrollBarsL());
+            }        
+        else if (iListBox)
+            {
+            TRect listBoxRect(mainPaneRect.Size());
+            iListBox->SetRect(listBoxRect);
+            
+            if (iFileViewMode == EFileViewModeSimple)
+                {        
+                CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikColumnListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+                listBoxContext->SetRect(listBoxRect);
+                }
+            else if (iFileViewMode == EFileViewModeExtended)
+                {        
+                CAknsListBoxBackgroundControlContext* listBoxContext = static_cast<CAknsListBoxBackgroundControlContext*>(static_cast<CEikFormattedCellListBox*>(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext());
+                listBoxContext->SetRect(listBoxRect);
+                }    
+            
+            TRAP_IGNORE(iListBox->UpdateScrollBarsL());
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::HandleSettingsChangeL()
+    {
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+    if ( iModel->Settings().iEnableToolbar )
+        {
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            if ( !iToolbar )
+                {
+                iToolbar = CFileBrowserToolbar::NewL();
+                }
+            iToolbar->ShowToolbarL();
+            }
+        }
+    else
+        {
+        HideToolbar();
+        }
+    SizeChanged();
+#endif
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::HideToolbar()
+    {
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+    if ( iToolbar && iToolbar->IsShown() )
+        {
+        iToolbar->HideToolbarL();
+        }
+#endif
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CFileBrowserFileListContainer::UpdateToolbar()
+    {
+#if(!defined __SERIES60_30__ && !defined __SERIES60_31__ && !defined __S60_32__)
+    if ( iToolbar && iToolbar->IsShown() )
+        {
+        iToolbar->ResetState();
+        }
+#endif    
+    }
+
+// --------------------------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
+
+CSimpleFileViewListBox::~CSimpleFileViewListBox()
+    {
+    ReleaseFonts();
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CSimpleFileViewListBox::ReleaseFonts()
+    {
+    if (iFont)
+        {
+        CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
+        dev->ReleaseFont(iFont);
+        iFont = NULL;   
+        }
+    }
+
+// --------------------------------------------------------------------------------------------
+    
+void CSimpleFileViewListBox::SizeChanged()
+    {
+    // call the base class function first
+    CAknSingleGraphicStyleListBox::SizeChanged();
+
+    // customize the list box
+    TRAP_IGNORE(SizeChangedL());
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CSimpleFileViewListBox::SizeChangedL()
+    {
+    // disable separator line
+    ItemDrawer()->ColumnData()->SetSeparatorLinePosition(ENoLine);
+
+    // enable marquee
+    ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
+
+    // get font
+    ReleaseFonts();
+    CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
+    const TSize screenSize = dev->SizeInPixels();
+
+    TFontSpec fontSpec = AknLayoutUtils::FontFromId(EAknLogicalFontPrimarySmallFont)->FontSpecInTwips();
+    fontSpec.iHeight = IsQHD(screenSize) ? KSimpleViewFontHeightQHD : KSimpleViewFontHeight;
+    dev->GetNearestFontInTwips(iFont, fontSpec);
+    
+    // set fonts
+    ItemDrawer()->ColumnData()->SetColumnFontL(0, iFont);
+    ItemDrawer()->ColumnData()->SetColumnFontL(1, iFont);
+    ItemDrawer()->ColumnData()->SetColumnFontL(2, iFont);
+    ItemDrawer()->ColumnData()->SetColumnFontL(3, iFont);
+
+    // set row height
+    TInt rowHeight = iFont->HeightInPixels()+4;    
+    TSize itemCellSize = View()->ItemDrawer()->ItemCellSize();
+    itemCellSize.iHeight = rowHeight; 
+    SetItemHeightL(rowHeight);
+    View()->ItemDrawer()->SetItemCellSize(itemCellSize);
+    
+    // set icon sizes
+    TInt normalIconSize = rowHeight * 0.9;
+    TInt markingIconSize = rowHeight * 0.8;
+    ItemDrawer()->ColumnData()->SetSubCellIconSize(0, TSize(normalIconSize,normalIconSize));
+    ItemDrawer()->ColumnData()->SetSubCellIconSize(2, TSize(markingIconSize,markingIconSize));
+    ItemDrawer()->ColumnData()->SetSubCellIconSize(3, TSize(markingIconSize,markingIconSize));
+
+    // set column widths
+    ItemDrawer()->ColumnData()->SetColumnWidthPixelL(0, normalIconSize);
+    ItemDrawer()->ColumnData()->SetColumnWidthPixelL(1, itemCellSize.iWidth-normalIconSize-markingIconSize);
+    ItemDrawer()->ColumnData()->SetColumnWidthPixelL(2, markingIconSize);
+    ItemDrawer()->ColumnData()->SetColumnWidthPixelL(3, markingIconSize);
+
+    // set baseline for the text
+    ItemDrawer()->ColumnData()->SetColumnBaselinePosL(1, iFont->HeightInPixels()-iFont->BaselineOffsetInPixels()-1);
+
+    // set margins
+    TMargins iconMargins;
+    iconMargins.iBottom = 0;
+    iconMargins.iLeft = 0;
+    iconMargins.iRight = 0;
+    iconMargins.iTop = 0;
+
+    TMargins textMargins;
+    textMargins.iBottom = 0;
+    textMargins.iLeft = markingIconSize * 0.15;
+    textMargins.iRight = markingIconSize * 0.15;
+    textMargins.iTop = 0;
+
+    ItemDrawer()->ColumnData()->SetColumnMarginsL(0, iconMargins);
+    ItemDrawer()->ColumnData()->SetColumnMarginsL(1, textMargins);
+    ItemDrawer()->ColumnData()->SetColumnMarginsL(2, iconMargins);
+    ItemDrawer()->ColumnData()->SetColumnMarginsL(3, iconMargins);
+    }
+
+// --------------------------------------------------------------------------------------------
+// --------------------------------------------------------------------------------------------
+
+CExtendedFileViewListBox::~CExtendedFileViewListBox()
+    {
+    ReleaseFonts();
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CExtendedFileViewListBox::ReleaseFonts()
+    {
+    if (iFont1)
+        {
+        CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
+        dev->ReleaseFont(iFont1);
+        iFont1 = NULL;     
+        }
+
+    if (iFont2)
+        {
+        CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
+        dev->ReleaseFont(iFont2);
+        iFont2 = NULL;      
+        }        
+    }
+    
+// --------------------------------------------------------------------------------------------
+
+void CExtendedFileViewListBox::SizeChanged()
+    {
+    // call the base class function first
+    CAknDoubleGraphicStyleListBox::SizeChanged();
+
+    // customize the list box
+    TRAP_IGNORE(SizeChangedL());
+    }
+
+// --------------------------------------------------------------------------------------------
+
+void CExtendedFileViewListBox::SizeChangedL()
+    {
+    // disable separator line
+    ItemDrawer()->ColumnData()->SetSeparatorLinePosition(ENoLine);
+
+    // enable marquee
+    ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
+    
+    // get fonts
+    ReleaseFonts();
+    CGraphicsDevice* dev = iCoeEnv->ScreenDevice();
+    const TSize screenSize = dev->SizeInPixels();
+    
+    TFontSpec fontSpec1 = AknLayoutUtils::FontFromId(EAknLogicalFontPrimarySmallFont)->FontSpecInTwips();
+    fontSpec1.iHeight = IsQHD(screenSize) ? KExtendedViewFontHeight1QHD : KExtendedViewFontHeight1;
+    dev->GetNearestFontInTwips(iFont1, fontSpec1);
+
+    TFontSpec fontSpec2 = AknLayoutUtils::FontFromId(EAknLogicalFontSecondaryFont)->FontSpecInTwips();
+    fontSpec2.iHeight = IsQHD(screenSize) ? KExtendedViewFontHeight2QHD : KExtendedViewFontHeight2;
+    dev->GetNearestFontInTwips(iFont2, fontSpec2);    
+
+        
+    // set fonts
+    ItemDrawer()->ColumnData()->SetSubCellFontL(0, iFont1);
+    ItemDrawer()->ColumnData()->SetSubCellFontL(1, iFont1);
+    ItemDrawer()->ColumnData()->SetSubCellFontL(2, iFont2);
+    ItemDrawer()->ColumnData()->SetSubCellFontL(3, iFont1);
+    ItemDrawer()->ColumnData()->SetSubCellFontL(4, iFont1);
+
+    // set row height
+    TInt rowHeight1 = iFont1->HeightInPixels()+3;    
+    TInt rowHeight2 = iFont2->HeightInPixels()+3;    
+    TSize itemCellSize = View()->ItemDrawer()->ItemCellSize();
+    itemCellSize.iHeight = rowHeight1+rowHeight2; 
+    SetItemHeightL(rowHeight1+rowHeight2);
+    View()->ItemDrawer()->SetItemCellSize(itemCellSize);
+
+    
+    // set icon sizes
+    TInt normalIconSize = rowHeight1 * 0.9;
+    TInt markingIconSize = rowHeight1 * 0.8;
+    ItemDrawer()->ColumnData()->SetSubCellIconSize(0, TSize(normalIconSize,normalIconSize));
+    ItemDrawer()->ColumnData()->SetSubCellIconSize(3, TSize(markingIconSize,markingIconSize));
+    ItemDrawer()->ColumnData()->SetSubCellIconSize(4, TSize(markingIconSize,markingIconSize));
+
+    // set sub cell sizes
+    ItemDrawer()->ColumnData()->SetSubCellSizeL(0, TSize(normalIconSize,rowHeight1+rowHeight2));
+    ItemDrawer()->ColumnData()->SetSubCellSizeL(1, TSize(itemCellSize.iWidth-normalIconSize-markingIconSize,rowHeight1));
+    ItemDrawer()->ColumnData()->SetSubCellSizeL(2, TSize(itemCellSize.iWidth-normalIconSize-markingIconSize,rowHeight2));
+    ItemDrawer()->ColumnData()->SetSubCellSizeL(3, TSize(markingIconSize,rowHeight1+rowHeight2));
+    ItemDrawer()->ColumnData()->SetSubCellSizeL(4, TSize(markingIconSize,rowHeight1+rowHeight2));
+
+    // set sub cell positions
+    ItemDrawer()->ColumnData()->SetSubCellPositionL(0, TPoint(0,0));
+    ItemDrawer()->ColumnData()->SetSubCellPositionL(1, TPoint(normalIconSize,0));
+    ItemDrawer()->ColumnData()->SetSubCellPositionL(2, TPoint(normalIconSize,rowHeight1));
+    ItemDrawer()->ColumnData()->SetSubCellPositionL(3, TPoint(itemCellSize.iWidth-normalIconSize-markingIconSize,0));
+    ItemDrawer()->ColumnData()->SetSubCellPositionL(4, TPoint(itemCellSize.iWidth-normalIconSize-markingIconSize,0));
+    
+    // set baselines for the texts
+    ItemDrawer()->ColumnData()->SetSubCellBaselinePosL(1, iFont1->HeightInPixels()-iFont1->BaselineOffsetInPixels()-1);
+    ItemDrawer()->ColumnData()->SetSubCellBaselinePosL(2, rowHeight1+iFont2->HeightInPixels()-iFont2->BaselineOffsetInPixels()-1);
+    
+    // set margins
+    TMargins iconMargins;
+    iconMargins.iBottom = rowHeight2;
+    iconMargins.iLeft = 0;
+    iconMargins.iRight = 0;
+    iconMargins.iTop = 0;
+
+    TMargins textMargins;
+    textMargins.iBottom = 0;
+    textMargins.iLeft = markingIconSize * 0.15;
+    textMargins.iRight = markingIconSize * 0.15;
+    textMargins.iTop = 0;
+
+    ItemDrawer()->ColumnData()->SetSubCellMarginsL(0, iconMargins);
+    ItemDrawer()->ColumnData()->SetSubCellMarginsL(1, textMargins);
+    ItemDrawer()->ColumnData()->SetSubCellMarginsL(2, textMargins);
+    ItemDrawer()->ColumnData()->SetSubCellMarginsL(3, iconMargins);
+    ItemDrawer()->ColumnData()->SetSubCellMarginsL(4, iconMargins);
+    }
+    
+// --------------------------------------------------------------------------------------------
+        
+// End of File