--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/filebrowser/src/FBFileListContainer.cpp Wed Sep 01 12:30:35 2010 +0100
@@ -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