diff -r b3cee849fa46 -r fad26422216a filebrowser/src/FBFileListContainer.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +_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(reinterpret_cast(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(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(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(iListBox->Model())->Filter()->FilteredItemIndex(currentItemIndex); + else + return KErrNotFound; + } + else if (iListBox) + { + return iListBox->CurrentItemIndex(); + } + else + return KErrNotFound; + } + +// -------------------------------------------------------------------------------------------- + +const CArrayFix* CFileBrowserFileListContainer::ListBoxSelectionIndexes() + { + if (iListBox && iSearchField) + { + TRAP_IGNORE( static_cast(iListBox->Model())->Filter()->UpdateSelectionIndexesL() ); // !!! + return static_cast(iListBox->Model())->Filter()->SelectionIndexes(); + } + else if (iListBox) + { + const CListBoxView::CSelectionIndexArray* indices = iListBox->SelectionIndexes(); + return static_cast*>(indices); + } + else + return NULL; + } + +// -------------------------------------------------------------------------------------------- + +TInt CFileBrowserFileListContainer::ListBoxSelectionIndexesCount() + { + if (iListBox && iSearchField) + { + TRAP_IGNORE( static_cast(iListBox->Model())->Filter()->UpdateSelectionIndexesL() ); // !!! + return static_cast(iListBox->Model())->Filter()->SelectionIndexes()->Count(); + } + else if (iListBox) + { + return iListBox->SelectionIndexes()->Count(); + } + else + return KErrNotFound; + } + +// -------------------------------------------------------------------------------------------- + +TInt CFileBrowserFileListContainer::ListBoxNumberOfVisibleItems() + { + if (iListBox && iSearchField) + { + return static_cast(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(static_cast(iListBox)->ItemDrawer()->ColumnData()->IconArray()); + } + else if (iFileViewMode == EFileViewModeExtended) + { + return static_cast(static_cast(iListBox)->ItemDrawer()->ColumnData()->IconArray()); + } + } + + return NULL; + } + +// -------------------------------------------------------------------------------------------- + +void CFileBrowserFileListContainer::SetListBoxIconArrayL(CAknIconArray* aIconArray) + { + if (iListBox) + { + if (iFileViewMode == EFileViewModeSimple) + { + //CArrayPtr* currentIconArray = static_cast(iListBox)->ItemDrawer()->ColumnData()->IconArray(); + //delete currentIconArray; + //currentIconArray = NULL; + static_cast(iListBox)->ItemDrawer()->ColumnData()->SetIconArray(aIconArray); + } + else if (iFileViewMode == EFileViewModeExtended) + { + //CArrayPtr* currentIconArray = static_cast(iListBox)->ItemDrawer()->ColumnData()->IconArray(); + //delete currentIconArray; + //currentIconArray = NULL; + static_cast(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( 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(static_cast(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext()); + listBoxContext->SetRect(listBoxRect); + } + else if (iFileViewMode == EFileViewModeExtended) + { + CAknsListBoxBackgroundControlContext* listBoxContext = static_cast(static_cast(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(static_cast(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext()); + listBoxContext->SetRect(listBoxRect); + } + else if (iFileViewMode == EFileViewModeExtended) + { + CAknsListBoxBackgroundControlContext* listBoxContext = static_cast(static_cast(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(static_cast(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext()); + listBoxContext->SetRect(listBoxRect); + } + else if (iFileViewMode == EFileViewModeExtended) + { + CAknsListBoxBackgroundControlContext* listBoxContext = static_cast(static_cast(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(static_cast(iListBox)->ItemDrawer()->ColumnData()->SkinBackgroundContext()); + listBoxContext->SetRect(listBoxRect); + } + else if (iFileViewMode == EFileViewModeExtended) + { + CAknsListBoxBackgroundControlContext* listBoxContext = static_cast(static_cast(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