diff -r 6385c4c93049 -r 8e6fa1719340 browserui/browser/FavouritesSrc/BrowserFavouritesFolderSelector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserui/browser/FavouritesSrc/BrowserFavouritesFolderSelector.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,345 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Implementation of CBrowserFavouritesFolderSelector. +* +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "BrowserFavouritesFolderSelector.h" +#include "BrowserFavouritesModel.h" +#include "BrowserFavouritesIconIndexArray.h" +#include "BrowserUtil.h" +#include "ApiProvider.h" +#include "CommsModel.h" +#include "CommonConstants.h" +#include "BrowserFavouritesView.h" + +// CONSTANTS + +/** +* Granularity of the listbox item array. +*/ +LOCAL_C const TInt KGranularity = 4; + +/** +* Buffer size for formatting listbox text. Maximum item name +* plus listbox internals (tabulators for icons etc.) must fit into it. +* The format is "\t", +* so the added length is 4. +*/ +LOCAL_C const TInt KMaxListboxLineLen = KFavouritesMaxName + 4; + +/** +* Format for formatting a listbox line. +*/ +_LIT( KListboxLineFormat, "%d\t%S" ); + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelectorListbox::CBrowserFavouritesFolderSelectorListbox +// --------------------------------------------------------- +// +CBrowserFavouritesFolderSelectorListbox::CBrowserFavouritesFolderSelectorListbox( const TBrowserFavouritesFolderListboxIconHandler* aIconHandler ) : + CAknSingleGraphicPopupMenuStyleListBox() + { + iIconHandler = aIconHandler; + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelectorListbox::HandleResourceChange +// --------------------------------------------------------- +// +void CBrowserFavouritesFolderSelectorListbox::HandleResourceChange( TInt aType ) +{ + if ( aType == KAknsMessageSkinChange ) + { + CArrayPtr* array = + ItemDrawer()->ColumnData()->IconArray(); + + array->ResetAndDestroy(); + delete array; + + CAknIconArray* iconArray = NULL; + TRAPD( err, + iconArray = iIconHandler->CreateIconArrayL() + ) + + if ( !err ) + { + ItemDrawer()->ColumnData()->SetIconArray( iconArray ); + } + delete iconArray; + } + return; +} + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::NewL +// --------------------------------------------------------- +// +CBrowserFavouritesFolderSelector* CBrowserFavouritesFolderSelector::NewL + ( + CBrowserFavouritesModel& aModel, + MApiProvider& aApiProvider, + TInt aExcludeFolder + ) + { + CBrowserFavouritesFolderSelector* selector = + new (ELeave) CBrowserFavouritesFolderSelector + ( aModel, aApiProvider, aExcludeFolder ); + CleanupStack::PushL( selector ); + selector->ConstructL(); + CleanupStack::Pop(); // selector + return selector; + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::CBrowserFavouritesFolderSelector +// --------------------------------------------------------- +// +CBrowserFavouritesFolderSelector::CBrowserFavouritesFolderSelector + ( + CBrowserFavouritesModel& aModel, + MApiProvider& aApiProvider, + TInt aExcludeFolder + ) +: iModel( &aModel ), + iApiProvider( &aApiProvider ), + iExcludeFolder( aExcludeFolder ) + { + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::~CBrowserFavouritesFolderSelector +// --------------------------------------------------------- +// +CBrowserFavouritesFolderSelector::~CBrowserFavouritesFolderSelector() + { + delete iListboxItemArray; + delete iListbox; + delete iIconIndexes; + delete iItems; + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::ConstructL +// --------------------------------------------------------- +// +void CBrowserFavouritesFolderSelector::ConstructL() + { + iListbox = new (ELeave) CBrowserFavouritesFolderSelectorListbox( &iIconHandler ); + iPopupList = CAknPopupList::NewL + ( iListbox, R_BROWSER_FAVOURITES_CBA_MOVETOFOLDER_MOVECANCEL_MOVE ); + HBufC* title = CCoeEnv::Static()->AllocReadResourceLC + ( R_BROWSER_FAVOURITES_TEXT_MOVE_TO_PRMPT ); + iPopupList->SetTitleL( *title ); + CleanupStack::PopAndDestroy(); // title + iListbox->ConstructL + ( iPopupList, EAknListBoxSelectionList | EAknListBoxLoopScrolling ); + iListboxItemArray = new (ELeave) CDesCArrayFlat( KGranularity ); + CTextListBoxModel* listboxModel = iListbox->Model(); + listboxModel->SetItemTextArray( iListboxItemArray ); + listboxModel->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iListbox->CreateScrollBarFrameL( ETrue ); + iListbox->ScrollBarFrame()->SetScrollBarVisibilityL + ( CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + iListbox->ItemDrawer()->ColumnData()->SetIconArray + ( iIconHandler.CreateIconArrayL() ); + iListbox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue ); + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::ExecuteLD +// --------------------------------------------------------- +// +TInt CBrowserFavouritesFolderSelector::ExecuteLD() + { + TInt uid = KFavouritesNullUid; + GetDataL(); + FillListboxL(); + if ( iPopupList->ExecuteLD() ) + { + uid = iItems->IndexToUid( iListbox->View()->CurrentItemIndex() ); + } + iPopupList = NULL; // ExecuteLD has already deleted it. + delete this; + return uid; + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::GetDataL +// --------------------------------------------------------- +// +void CBrowserFavouritesFolderSelector::GetDataL() + { + // Getting data. Make sure that the item and icon index data does not + // go out of sync - only set them to members when both is gotten. + CFavouritesItemList* items = GetItemsLC(); + CBrowserFavouritesIconIndexArray* iconIndexes = + GetIconIndexesLC( *items ); + // Replace data with new. + delete iIconIndexes; // Not NULL-ed, because... + delete iItems; // Not NULL-ed, because... + iItems = items; // ... this cannot leave + iIconIndexes = iconIndexes; // ... this cannot leave + CleanupStack::Pop( 2 ); // iconIndexes, items: now members. + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::FillListboxL +// --------------------------------------------------------- +// +void CBrowserFavouritesFolderSelector::FillListboxL() + { + TBuf buf; + TBuf name; + TInt i; + TInt resId = 0; + + iListboxItemArray->Reset(); + + for ( i = 0; i < iItems->Count(); i++ ) + { + if(!iItems->At(i)->IsHidden()) + { + + resId = CBrowserFavouritesView::GetSeamlessFolderResourceID( + iItems->At(i)->ContextId() ); + + if(resId) // a seamless link folder. Get the localised name. + { + HBufC* seamlessLinkName = CCoeEnv::Static()->AllocReadResourceLC( resId ); + name = seamlessLinkName->Des(); + CleanupStack::PopAndDestroy(); // seamlessLinkName + } + else // not a seamless link folder. + { + name = iItems->At( i )->Name(); + // Replace TAB characters with spaces. + for ( TInt i = 0; i < name.Length(); i++ ) + { + if ( name[i] == '\t' ) + { + name[i] = ' '; + } + } + } + + buf.Format( KListboxLineFormat, iIconIndexes->At( i ).iItemIcon, &name ); + iListboxItemArray->AppendL( buf ); + } + else + { + iItems->Delete(i); + i--; + } + } + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::GetItemsLC +// --------------------------------------------------------- +// +CFavouritesItemList* CBrowserFavouritesFolderSelector::GetItemsLC() + { + CFavouritesItemList* items = new (ELeave) CFavouritesItemList(); + CleanupStack::PushL( items ); + + if ( iModel->BeginL( /*aWrite=*/EFalse, /*aDbErrorNote=*/ETrue ) + == KErrNone ) + { + // Get all folders. + iModel->Database().GetAll + ( *items, KFavouritesNullUid, CFavouritesItem::EFolder ); + iModel->CommitL(); + + // Remove iExcludeFolder. + TInt index = items->UidToIndex( iExcludeFolder ); + if ( index >= 0 ) + { + items->Delete( index ); + } + + // Set custom localized name for root. + index = items->UidToIndex( KFavouritesRootUid ); + if ( index >= 0 ) + { + HBufC* rootName = CCoeEnv::Static()->AllocReadResourceLC + ( R_BROWSER_FAVOURITES_TEXT_FLDR_ROOT_LEVEL ); + items->At( index )->SetNameL( *rootName ); + CleanupStack::PopAndDestroy(); // rootName + } + + CArrayFixFlat* orderArray = new (ELeave) CArrayFixFlat( KGranularityHigh ); + CleanupStack::PushL( orderArray ); + CBrowserBookmarksOrder* currentOrder = CBrowserBookmarksOrder::NewLC();; + if ( iModel->Database().GetData( KFavouritesRootUid ,*currentOrder ) == KErrNone) + { + if ( currentOrder->GetBookMarksOrder().Count() > 0 ) + { + orderArray->AppendL( &( currentOrder->GetBookMarksOrder()[0] ), currentOrder->GetBookMarksOrder().Count()); + orderArray->InsertL( 0 , KFavouritesRootUid ); + iModel->ManualSortL( KFavouritesRootUid, currentOrder, orderArray, items ); + } + } + else + { + iModel->SortL( *items ); + } + CleanupStack::Pop(2);// orderArray, currentOrder + } + + return items; + } + +// --------------------------------------------------------- +// CBrowserFavouritesFolderSelector::GetIconIndexesLC +// --------------------------------------------------------- +// +CBrowserFavouritesIconIndexArray* +CBrowserFavouritesFolderSelector::GetIconIndexesLC +( CFavouritesItemList& aItems ) + { + // Create new empty list. + CBrowserFavouritesIconIndexArray* iconIndexes = + new (ELeave) CBrowserFavouritesIconIndexArray( KGranularity ); + CleanupStack::PushL( iconIndexes ); + // Get list of access points. Not copy, owned by the AP model. + // const CApListItemList* apList = iApiProvider->CommsModel().AccessPoints(); + // Fill the list. + TInt i = 0; + TInt count = aItems.Count(); + for ( i = 0; i < count; i++ ) + { + iconIndexes->AppendL + ( iIconHandler.IconIndexes( *(aItems.At( i ) ) ) ); + } + return iconIndexes; + } + +// End of File