diff -r 5f8e5adbbed9 -r 29cda98b007e application/src/PodcastSearchView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/application/src/PodcastSearchView.cpp Thu Feb 25 14:29:19 2010 +0000 @@ -0,0 +1,298 @@ +/* +* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB +* +* 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: +* EmbedDev AB - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "PodcastSearchView.h" +#include "PodcastAppUi.h" +#include "FeedEngine.h" +#include "ShowEngine.h" +#include "SettingsEngine.h" +#include "PodcastApp.h" +#include "PodcastUtils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const TInt KMaxFeedNameLength = 100; +const TInt KDefaultGran = 5; +const TInt KNumberOfFilesMaxLength = 4; +#define KMaxMessageLength 200 +#define KMaxTitleLength 100 +const TInt KMimeBufLength = 100; + +_LIT(KUnknownUpdateDateString, "?/?"); +_LIT(KSearchResultFormat, "%d\t%S\t%S"); + +CPodcastSearchView* CPodcastSearchView::NewL(CPodcastModel& aPodcastModel) + { + CPodcastSearchView* self = CPodcastSearchView::NewLC(aPodcastModel); + CleanupStack::Pop( self ); + return self; + } + +CPodcastSearchView* CPodcastSearchView::NewLC(CPodcastModel& aPodcastModel) + { + CPodcastSearchView* self = new ( ELeave ) CPodcastSearchView(aPodcastModel); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CPodcastSearchView::CPodcastSearchView(CPodcastModel& aPodcastModel):iPodcastModel(aPodcastModel) +{ +} + +void CPodcastSearchView::ConstructL() +{ + BaseConstructL(R_PODCAST_SEARCHVIEW); + CPodcastListView::ConstructL(); + iPodcastModel.FeedEngine().AddObserver(this); + CArrayPtr< CGulIcon >* icons = new(ELeave) CArrayPtrFlat< CGulIcon >(1); + CleanupStack::PushL( icons ); + + // Load the bitmap for empty icon + CFbsBitmap* bitmap = NULL; + CFbsBitmap* mask = NULL;// + + // Load the bitmap for feed icon + + // Load svg.-image and mask with a single call + AknIconUtils::CreateIconL(bitmap, + mask, + iEikonEnv->EikAppUi()->Application()->BitmapStoreName(), + EMbmPodcastFeed, + EMbmPodcastFeed_mask); + /* + bitmap = iEikonEnv->CreateBitmapL( _L("*"),EMbmPodcastFeed_40x40);*/ + CleanupStack::PushL( bitmap ); + // Load the mask for feed icon + /*mask = iEikonEnv->CreateBitmapL( _L("*"),EMbmPodcastFeed_40x40m ); + */ + CleanupStack::PushL( mask ); + // Append the feed icon to icon array + icons->AppendL( CGulIcon::NewL( bitmap, mask ) ); + CleanupStack::Pop(2); // bitmap, mask + + iListContainer->Listbox()->ItemDrawer()->FormattedCellData()->SetIconArrayL( icons ); + CleanupStack::Pop(icons); // icons + + iListContainer->Listbox()->SetListBoxObserver(this); + + SetEmptyTextL(R_PODCAST_EMPTY_SEARCH); +} + +CPodcastSearchView::~CPodcastSearchView() + { + iPodcastModel.FeedEngine().RemoveObserver(this); + + if(iLongTapDetector) + delete iLongTapDetector, iLongTapDetector = NULL; + + if(iStylusPopupMenu) + delete iStylusPopupMenu, iStylusPopupMenu = NULL; + + } + +TUid CPodcastSearchView::Id() const +{ + return KUidPodcastSearchViewID; +} + +void CPodcastSearchView::DoActivateL(const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage) +{ + UpdateToolbar(); + + CAknTitlePane* titlePane = static_cast + ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + HBufC* title = iEikonEnv->AllocReadResourceLC(R_SEARCH_RESULTS); + titlePane->SetTextL( *title, ETrue ); + CleanupStack::PopAndDestroy(title); + + CPodcastListView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage); + iPreviousView = TVwsViewId(KUidPodcast, KUidPodcastFeedViewID); +} + +void CPodcastSearchView::DoDeactivate() +{ + CPodcastListView::DoDeactivate(); + CAknTitlePane* titlePane = static_cast + ( StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + titlePane->SetTextToDefaultL(); +} + + +void CPodcastSearchView::HandleListBoxEventL(CEikListBox* /* aListBox */, TListBoxEvent aEventType) +{ + DP("CPodcastSearchView::HandleListBoxEventL BEGIN"); + switch(aEventType) + { + case EEventEnterKeyPressed: + case EEventItemDoubleClicked: + case EEventItemActioned: + { + HandleCommandL(EPodcastAddSearchResult); + } + break; + default: + break; + } + DP("CPodcastSearchView::HandleListBoxEventL END"); +} + +void CPodcastSearchView::UpdateListboxItemsL() + { + DP("CPodcastSearchView::UpdateListboxItemsL BEGIN"); + if(!iListContainer->IsVisible()) { + DP("CPodcastSearchView::UpdateListboxItemsL END (not visible)"); + return; + } + const RFeedInfoArray* searchItems = NULL; + searchItems = &iPodcastModel.FeedEngine().GetSearchResults(); + TInt len = searchItems->Count(); + TListItemProperties itemProps; + iListContainer->Listbox()->Reset(); + iListContainer->Listbox()->ItemDrawer()->ClearAllPropertiesL(); + iItemIdArray.Reset(); + iItemArray->Reset(); + + if (len > 0) + { + for (int i=0;iUid()); + TInt iconIndex = 0; + + TBuf<512> descr; + descr.Copy(fi->Description().Left(512)); + + iListboxFormatbuffer.Format(KSearchResultFormat(), iconIndex, &fi->Title(), &descr); + iItemArray->AppendL(iListboxFormatbuffer); + iListContainer->Listbox()->ItemDrawer()->SetPropertiesL(i, itemProps); + } + } + else + { + TBuf itemName; + iEikonEnv->ReadResourceL(itemName, R_PODCAST_NO_SEARCH_RESULTS); + iItemArray->Reset(); + iItemIdArray.Reset(); + + TListItemProperties itemProps; + itemProps.SetDimmed(ETrue); + itemProps.SetHiddenSelection(ETrue); + iListContainer->Listbox()->ItemDrawer()->SetPropertiesL(0, itemProps); + } + iListContainer->Listbox()->HandleItemAdditionL(); + DP("CPodcastSearchView::UpdateListboxItemsL END"); + } + +/** + * Command handling function intended for overriding by sub classes. + * Default implementation is empty. + * @param aCommand ID of the command to respond to. + */ +void CPodcastSearchView::HandleCommandL(TInt aCommand) + { + //CloseToolbarExtension(); + switch(aCommand) + { + case EPodcastAddSearchResult: + { + TInt index = iListContainer->Listbox()->CurrentItemIndex(); + + if(index < iItemArray->MdcaCount() && index >= 0) + { + CFeedInfo *newInfo = iPodcastModel.FeedEngine().GetSearchResults()[index]; + + // ask if user wants to add the feed + TBuf templ; + TBuf message; + + iEikonEnv->ReadResourceL(templ, R_ADD_FEED_QUERY); + message.Format(templ, &newInfo->Title()); + if(ShowQueryMessage(message)) { + TBool added = iPodcastModel.FeedEngine().AddFeedL(*newInfo); + + if (added) + { + // ask if user wants to update it now + TBuf message; + iEikonEnv->ReadResourceL(message, R_ADD_FEED_SUCCESS); + if(ShowQueryMessage(message)) + { + CFeedInfo *info = iPodcastModel.FeedEngine().GetFeedInfoByUid(newInfo->Uid()); + + iPodcastModel.ActiveShowList().Reset(); + iPodcastModel.SetActiveFeedInfo(info); + AppUi()->ActivateLocalViewL(KUidPodcastShowsViewID, TUid::Uid(0), KNullDesC8()); + iPodcastModel.FeedEngine().UpdateFeedL(info->Uid()); + } + } + else + { + TBuf message; + iEikonEnv->ReadResourceL(message, R_ADD_FEED_EXISTS); + ShowErrorMessage(message); + } + } + } + } + break; + default: + CPodcastListView::HandleCommandL(aCommand); + break; + } + UpdateToolbar(); + } + +void CPodcastSearchView::OpmlParsingComplete(TUint /*aNumFeedsImported*/) + { + DP("CPodcastSearchView::OpmlParsingComplete BEGIN"); + UpdateListboxItemsL(); + UpdateToolbar(); + DP("CPodcastSearchView::OpmlParsingComplete END"); + } + +void CPodcastSearchView::UpdateToolbar() +{ + TBool disableAdd = iItemArray->MdcaCount() == 0 || iSearchRunning; + + CAknToolbar* toolbar = Toolbar(); + + if (toolbar) + { + toolbar->SetItemDimmed(EPodcastAddSearchResult, disableAdd, ETrue ); + toolbar->HideItem(EPodcastSearch, iSearchRunning, ETrue ); + toolbar->HideItem(EPodcastCancelUpdateAllFeeds, !iSearchRunning, ETrue); + } +}