application/src/PodcastAppui.cpp
changeset 2 29cda98b007e
child 11 f6c975c3b702
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/application/src/PodcastAppui.cpp	Thu Feb 25 14:29:19 2010 +0000
@@ -0,0 +1,244 @@
+/*
+* 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 "PodcastAppui.h"
+#include <Podcast.rsg>
+#include "Podcast.hrh"
+#include "PodcastFeedView.h"
+#include "PodcastShowsView.h"
+#include "PodcastQueueView.h"
+#include "PodcastSettingsView.h"
+#include "PodcastSearchView.h"
+#include "ShowEngine.h"
+#include "PodcastModel.h"
+#include "debug.h"
+#include "..\help\podcatcher.hlp.hrh"
+#include "PodcastApp.h"
+
+#include <HLPLCH.H>
+#include <avkon.hrh>
+
+const TUint KDelayLaunch = 1000;
+
+CPodcastAppUi::CPodcastAppUi(CPodcastModel* aPodcastModel):iPodcastModel(aPodcastModel)
+	{
+	
+	}
+
+void CPodcastAppUi::ConstructL()
+    {
+    DP("CPodcastAppUi::ConstructL() BEGIN");
+    BaseConstructL(CAknAppUi::EAknEnableSkin); 
+
+    DP("Constructing FeedView");
+	iFeedView = CPodcastFeedView::NewL(*iPodcastModel);
+	this->AddViewL(iFeedView);
+
+    DP("Constructing ShowsView");
+	iShowsView = CPodcastShowsView::NewL(*iPodcastModel);
+	this->AddViewL(iShowsView);
+
+    DP("Constructing QueueView");
+    iQueueView = CPodcastQueueView::NewL(*iPodcastModel);
+	this->AddViewL(iQueueView);
+
+    DP("Constructing SearchView");
+	iSearchView = CPodcastSearchView::NewL(*iPodcastModel);
+	this->AddViewL(iSearchView);
+	
+    DP("Constructing SettingsView");
+	iSettingsView = CPodcastSettingsView::NewL(*iPodcastModel);
+	this->AddViewL(iSettingsView);
+	
+	iNaviPane =( CAknNavigationControlContainer * ) StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) );
+	NaviShowTabGroupL();
+	
+	// start a timer to let ConstructL finish before we display any dialogs or start downloading
+	// this provides another entry point in HandleTimeout below
+	iStartTimer = CTimeout::NewL(*this);
+	iStartTimer->After(KDelayLaunch);
+    DP("CPodcastAppUi::ConstructL() END");
+    }
+
+CPodcastAppUi::~CPodcastAppUi()
+    {
+    if(iNaviDecorator)
+    	{
+    	iNaviPane->Pop(iNaviDecorator);
+    	delete iNaviDecorator;
+    	}
+	delete iStartTimer;
+    }
+
+// -----------------------------------------------------------------------------
+// CPodcastAppUi::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+//  This function is called by the EIKON framework just before it displays
+//  a menu pane. Its default implementation is empty, and by overriding it,
+//  the application can set the state of menu items dynamically according
+//  to the state of application data.
+// ------------------------------------------------------------------------------
+//
+void CPodcastAppUi::DynInitMenuPaneL(
+    TInt /*aResourceId*/,CEikMenuPane* /*aMenuPane*/)
+    {
+    // no implementation required 
+    }
+
+// -----------------------------------------------------------------------------
+// CPodcastAppUi::HandleCommandL(TInt aCommand)
+// takes care of command handling
+// -----------------------------------------------------------------------------
+//
+void CPodcastAppUi::HandleCommandL( TInt aCommand )
+    {
+    switch ( aCommand )
+        {
+        case EAknSoftkeyExit:
+            {
+            Exit();
+            break;
+            }
+        case EEikCmdExit:
+        	{
+			TApaTask task(CEikonEnv::Static()->WsSession());
+			task.SetWgId(CEikonEnv::Static()->RootWin().Identifier());
+			task.SendToBackground(); 
+			break;
+        	}
+	case EPodcastHelp:
+        	{
+        	CArrayFix<TCoeHelpContext>* buf = CPodcastAppUi::AppHelpContextL();		
+        	HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), buf);
+        	}
+        	break;      	
+        default:
+            break;      
+        }
+    }
+
+CArrayFix<TCoeHelpContext>* CPodcastAppUi::HelpContextL() const
+   { 
+    CArrayFixFlat<TCoeHelpContext>* array = 
+                new(ELeave)CArrayFixFlat<TCoeHelpContext>(1);
+    CleanupStack::PushL(array);
+    // todo: view detection doesn't seem to work
+    if (ViewShown(KUidPodcastSearchViewID)) {
+		array->AppendL(TCoeHelpContext(KUidPodcast,KContextSettings));
+    } else {
+		array->AppendL(TCoeHelpContext(KUidPodcast,KContextApplication));
+    }
+	
+    CleanupStack::Pop(array);
+    return array;
+	}
+
+void CPodcastAppUi::NaviShowTabGroupL()
+	{
+	iNaviDecorator = iNaviPane->CreateTabGroupL();
+	
+	iTabGroup = STATIC_CAST(CAknTabGroup*, iNaviDecorator->DecoratedControl());
+	iTabGroup->SetTabFixedWidthL(EAknTabWidthWithTwoTabs);
+
+	HBufC *label1 = iEikonEnv->AllocReadResourceLC(R_TABGROUP_FEEDS);
+	iTabGroup->AddTabL(KTabIdFeeds,*label1);
+		
+	HBufC *label3 = iEikonEnv->AllocReadResourceLC(R_TABGROUP_QUEUE);
+	iTabGroup->AddTabL(KTabIdQueue,*label3);
+	
+//	HBufC *label4 = iEikonEnv->AllocReadResourceLC(R_TABGROUP_SEARCH);			
+//	iTabGroup->AddTabL(KTabIdSearch,*label4);
+//	
+//	CleanupStack::PopAndDestroy(label4);
+	CleanupStack::PopAndDestroy(label3);
+	CleanupStack::PopAndDestroy(label1);
+	
+	iTabGroup->SetActiveTabByIndex(0);
+	iTabGroup->SetObserver(this);
+
+	iNaviPane->Pop();
+	iNaviPane->PushL(*iNaviDecorator);
+	}
+
+void CPodcastAppUi::TabChangedL (TInt aIndex)
+	{
+	DP("CPodcastListView::TabChangedL ");
+	
+	TUid newview = TUid::Uid(0);
+	TUid messageUid = TUid::Uid(0);
+	
+	if (aIndex == KTabIdFeeds) {
+		newview = KUidPodcastFeedViewID;
+	} else if (aIndex == KTabIdQueue) {
+		newview = KUidPodcastQueueViewID;
+	} else {
+		User::Leave(KErrTooBig);
+	}
+	
+	if(newview.iUid != 0)
+		{			
+		ActivateLocalViewL(newview,  messageUid, KNullDesC8());
+		}
+	}
+
+void CPodcastAppUi::SetActiveTab(TInt aIndex) {
+	iTabGroup->SetActiveTabByIndex(aIndex);
+}
+
+void CPodcastAppUi::HandleTimeout(const CTimeout& /*aId*/, TInt /*aError*/)
+	{
+	iFeedView->CheckResumeDownload();
+	}
+
+void CPodcastAppUi::UpdateQueueTab(TInt aQueueLength)
+	{
+	if (aQueueLength == 0)
+		{
+		HBufC *queue = iEikonEnv->AllocReadResourceLC(R_TABGROUP_QUEUE);
+		iTabGroup->ReplaceTabL(KTabIdQueue, *queue);
+		CleanupStack::PopAndDestroy(queue);
+		}
+	else
+		{
+		HBufC *queueTemplate = iEikonEnv->AllocReadResourceLC(R_TABGROUP_QUEUE_COUNTER);
+		HBufC *queueCounter = HBufC::NewLC(queueTemplate->Length()+2);
+		queueCounter->Des().Format(*queueTemplate, aQueueLength);
+		
+		iTabGroup->ReplaceTabL(KTabIdQueue, *queueCounter);
+		CleanupStack::PopAndDestroy(queueCounter);
+		CleanupStack::PopAndDestroy(queueTemplate);	
+		}
+	}
+
+void CPodcastAppUi::TabLeft()
+	{
+	TInt ati = iTabGroup->ActiveTabIndex();
+	if(ati > 0) {
+		SetActiveTab(ati-1);
+		TabChangedL(ati-1);
+	}
+	}
+
+void CPodcastAppUi::TabRight()
+	{
+	TInt ati = iTabGroup->ActiveTabIndex();
+	
+	if(ati < iTabGroup->TabCount()-1) {
+		SetActiveTab(ati+1);
+		TabChangedL(ati+1);
+	}
+	}