csxhelp/src/CSXHAppUi.cpp
branchRCL_3
changeset 18 cbffe13eac63
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/csxhelp/src/CSXHAppUi.cpp	Wed Sep 01 12:30:56 2010 +0100
@@ -0,0 +1,565 @@
+/*
+* Copyright (c) 2006 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:  CCSXHAppUi class definition
+*
+*/
+
+
+#include "CSXHAppUi.h"
+#include "CSXHGenericView.h"
+#include "CSXHHtmlTopicView.h"
+#include "CSXHLegacyTopicView.h"
+#include "CsHelp.hrh"
+#include <cshelp.rsg>
+#include "CSXHAppUi.h"
+#include "CSXHDocument.h"
+
+#include "CSXHHelpDataBase.h"
+#include "CSXHViewIDs.h"
+
+#include <avkon.hrh>
+#include <utf.h>
+#include <aknnotewrappers.h> 
+#include <AknGlobalNote.h>
+#include <akninputblock.h>
+#include <hlplch.h>
+
+#include "csxhconstants.h"
+
+#ifdef FF_HELP_TUTORIAL_MERGE
+#include <AiwServiceHandler.h>
+
+#if defined(_DEBUG) && defined(__WINS__)
+#include <f32file.h>
+#include <flogger.h>
+_LIT(KLogDir, "csxh");
+_LIT(KLogFile, "csxh.txt");
+inline void FPrint(const TRefByValue<const TDesC> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START(list,aFmt);
+    RFileLogger::WriteFormat(KLogDir, KLogFile, EFileLoggingModeAppend, aFmt, list);
+    }
+#define FLOG(a) {FPrint(a);}
+#define FLOGF   FPrint
+#else //_DEBUG
+#define FLOG(a)
+#define FLOGF
+#endif //_DEBUG
+#endif // FF_HELP_TUTORIAL_MERGE
+CCSXHAppUi* CCSXHAppUi::iInstance = NULL;
+
+// ConstructL is called by the application framework
+void CCSXHAppUi::ConstructL()
+    {
+#ifndef __SERIES60_30__         
+    BaseConstructL(EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible );
+#else
+    BaseConstructL(EAknEnableSkin);
+#endif  
+  
+#ifdef FF_HELP_TUTORIAL_MERGE
+    LoadTutorialService();
+#endif // FF_HELP_TUTORIAL_MERGE
+    SetKeyEventFlags( CAknAppUiBase::EDisableSendKeyShort | CAknAppUiBase::EDisableSendKeyLong );
+    iTOC1View = CCSXHGenericView::NewL(KCSXHToc1ViewID,R_CSXH_TOC1);
+    AddViewL(iTOC1View); 
+    
+    iTOC2View = NULL;
+    iKywdTOC1View = NULL;
+    iKywdTOC2View = NULL;
+    iHtmlTopicView = NULL;
+    iLegacyTopicView = NULL;
+    iLegacyContextTopicView = NULL;
+    iAppHelpsTOC1View = NULL;
+    iAppHelpsTOC2View = NULL;
+    
+    SetDefaultViewL(*iTOC1View);  
+        
+    iRuntimeWatcher = CCSXHRuntimeAppWatcher::NewL();
+    iRuntimeWatcher->SetObserver( this );
+    iRuntimeWatcher->Start();
+#ifdef _DEBUG
+    RDebug::Print( _L("Help app launched") );
+#endif
+    }
+
+CCSXHAppUi::CCSXHAppUi()                              
+    {
+    iInstance = this;
+    }
+
+CCSXHAppUi::~CCSXHAppUi()
+    {
+#ifdef FF_HELP_TUTORIAL_MERGE
+
+    if(iServiceHandler)
+        {
+        delete iServiceHandler;
+        }
+
+#endif // FF_HELP_TUTORIAL_MERGE
+#ifdef _DEBUG
+    RDebug::Print(_L("Help app ended"));
+#endif
+    if ( iRuntimeWatcher )
+        delete iRuntimeWatcher;
+
+    }
+
+// --------------------------------------------------------------------------
+// Message Handler
+// --------------------------------------------------------------------------
+void CCSXHAppUi::HandleCommandL(TInt aCommand)
+    {
+    switch(aCommand)
+        {
+        case EEikCmdExit:
+        case EAknSoftkeyExit:
+        case EAknSoftkeyClose:
+            Exit();
+            break;
+  
+        case ECSXHOpenTopicText:
+        case ECSXHOpenItemPropagated:
+        case ECSXHOpenItem:        
+            {
+            CAknInputBlock* inputBlock = CAknInputBlock::NewLC();
+            ActivateDisplayTopicViewL();
+            CleanupStack::PopAndDestroy( inputBlock ); 
+            }
+            break;
+        case ECSXHSearchText:
+            {
+            CCSXHDocument* doc = static_cast<CCSXHDocument*>(Document());
+            doc->SetDisplayTopic(doc->GetHelpDataBase()->GetKywdTopics());
+            ActivateDisplayTopicViewL();
+            }
+            break;
+        default:
+            break;
+        }
+    }
+void CCSXHAppUi::InitDisplayTopicViewL(TUid aViewID)
+	{
+	if(aViewID == KCSXHToc1ViewID)
+		return;
+	
+	
+  	if(aViewID == KCSXHContextLegacyTopicViewID && iLegacyContextTopicView == NULL)	
+	 	{
+        iLegacyContextTopicView = CCSXHLegacyTopicView::NewL (KCSXHContextLegacyTopicViewID,
+                                                              R_CSHELP_TOPICFORCONTEXT,
+                                                              ClientRect());
+    	AddViewL(iLegacyContextTopicView);
+	 	}	 	   
+	else if(aViewID == KCSXHToc2ViewID && iTOC2View == NULL)
+		{
+		iTOC2View = CCSXHGenericView::NewL(KCSXHToc2ViewID,R_TOPICLIST);
+    	AddViewL(iTOC2View); 
+		}
+	else if(aViewID == KCSXHToc2AppHelpsViewID && iAppHelpsTOC2View == NULL)
+	    {
+	    iAppHelpsTOC2View = CCSXHGenericView::NewL(KCSXHToc2AppHelpsViewID,R_TOPICLIST);
+	    AddViewL(iAppHelpsTOC2View);
+	    }
+	 else if(aViewID == KCSXHKywdToc1ViewID && iKywdTOC1View == NULL)
+	 	{
+	 	iKywdTOC1View = CCSXHGenericView::NewL(KCSXHKywdToc1ViewID,R_KYWDTOC1LIST);
+    	AddViewL(iKywdTOC1View);
+	 	}
+	 else if(aViewID == KCSXHKywdToc2ViewID && iKywdTOC2View == NULL)	
+	 	{
+	 	iKywdTOC2View = CCSXHGenericView::NewL(KCSXHKywdToc2ViewID,R_KYWDTOC2LIST);
+    	AddViewL(iKywdTOC2View); 
+	 	}
+	 else if(aViewID == KCSXHLegacyTopicViewID && iLegacyTopicView == NULL)	
+	 	{
+        iLegacyTopicView = CCSXHLegacyTopicView::NewL(KCSXHLegacyTopicViewID,
+                                                      R_TOPICTEXTLIST,ClientRect());
+    	AddViewL(iLegacyTopicView);
+	 	}	
+	 	
+	 else if(aViewID == KCSXHContextHtmlTopicViewID )	
+	 	{
+	 	if(!iHtmlTopicView)
+	 		{
+            iHtmlTopicView = CCSXHHtmlTopicView::NewL(KCSXHHtmlTopicViewID,
+                                                      R_CSHELP_HTMLTOPICFORCONTEXT,
+                                                      ClientRect());
+    		AddViewL(iHtmlTopicView);	
+	 		}
+	 	else
+	 		{
+	 		//View is already created update the softkeys to Options and Close
+	 		iHtmlTopicView->SetViewTypeL(CCSXHHtmlTopicView::EContextHtmlView);
+	 		}
+  	 	}	
+	 else if(aViewID == KCSXHHtmlTopicViewID )	
+	 	{
+	 	if(!iHtmlTopicView)
+	 		{
+            iHtmlTopicView = CCSXHHtmlTopicView::NewL(KCSXHHtmlTopicViewID,
+                                                      R_CSHELP_HTMLTOPICVIEW,
+                                                      ClientRect());
+    		AddViewL(iHtmlTopicView);
+	 		}
+	 	else
+	 		{
+	 		//View is already created update the softkeys to Options and Back
+	 		iHtmlTopicView->SetViewTypeL(CCSXHHtmlTopicView::EHtmlView);
+	 		}
+	 	}
+    else if ( aViewID == KCSXHToc1AppHelpsViewID && !iAppHelpsTOC1View )
+        {
+        iAppHelpsTOC1View = CCSXHGenericView::NewL( KCSXHToc1AppHelpsViewID, R_TOPICLIST );
+        AddViewL( iAppHelpsTOC1View ); 
+        }
+	}
+// --------------------------------------------------------------------------
+// Activates the view corresponding to the topic to be displayed
+// It also sets for recreating the container dending on the view to be 
+// activated, 
+// 1) Search Pane in Search Result View will be cleared if user 
+// opens the Search View.
+// 2)Search Pane in Application Topics view will be cleared, if user opens 
+//      a)Help Contents View 
+//      b)Search View 
+//      c)Context Senisitive view
+// --------------------------------------------------------------------------
+void CCSXHAppUi::ActivateDisplayTopicViewL()
+    {
+    CCSXHDocument* doc = static_cast<CCSXHDocument*>(Document());
+    TUid viewId = doc->GetDisplayTopic()->GetViewID();
+    InitDisplayTopicViewL(viewId);
+    
+    if(viewId == KCSXHKywdToc1ViewID )
+        {
+        if(iKywdTOC2View)
+        	iKywdTOC2View->ResetContainer();
+        if(iTOC2View)
+        	iTOC2View->ResetContainer();
+        if (iAppHelpsTOC2View)
+        	iAppHelpsTOC2View->ResetContainer();
+        }
+	else if(viewId == KCSXHToc1ViewID ||
+	        viewId == KCSXHContextHtmlTopicViewID ||
+            viewId == KCSXHContextLegacyTopicViewID ||
+            viewId == KCSXHToc1AppHelpsViewID)
+	    {
+	    if(iTOC2View)
+			iTOC2View->ResetContainer();
+	    if (iAppHelpsTOC2View)
+	    	iAppHelpsTOC2View->ResetContainer();
+	    }
+/*	else if(viewId == KCSXHKywdToc1ViewID)  
+		{
+		doc->InitProgressBarL();
+		}
+*/	
+	if(viewId == KCSXHContextHtmlTopicViewID)    
+		viewId = KCSXHHtmlTopicViewID;
+    ActivateLocalViewL(viewId);
+    }
+void CCSXHAppUi::HandleForegroundEventL(TBool aForeground)
+	{
+	// Call Base class method
+ 	CAknAppUi::HandleForegroundEventL(aForeground);
+
+ 	if(!aForeground && iView && 
+ 	iView->Id() != KCSXHHtmlTopicViewID
+ 	&& iHtmlTopicView)
+ 		{
+ 		//put NUll first in for bug ESXU-7JA9NS
+ 		iHtmlTopicView = NULL;
+     	// We have lost the focus
+     	//Check if the HTML view is the last active view. If it not delete it 
+     	//to free the memory used by the browser control
+     	RemoveView(KCSXHHtmlTopicViewID);
+     	//delete iHtmlTopicView;
+    	}
+	}
+// --------------------------------------------------------------------------
+// It sets a flag in the View for recreating the container 
+// --------------------------------------------------------------------------
+void CCSXHAppUi::ResetTOC2ViewContainer()
+    {
+    if(iTOC2View)
+    	iTOC2View->ResetContainer();	
+    }
+// --------------------------------------------------------------------------
+// Context sensitive help launch handling. Help is not running
+// --------------------------------------------------------------------------
+TBool CCSXHAppUi::ProcessCommandParametersL(TApaCommand aCommand,
+                                              TFileName& /* aDocumentName */,
+                                              const TDesC8& aTail)
+    {
+    if (aCommand == EApaCommandOpen)
+        { // when another app launches the help app
+        HandleContextSensitiveLaunchL(aTail);
+        }
+    return EFalse;
+    }
+
+// --------------------------------------------------------------------------
+// Context sensitive help launch handling. Help is already running
+// --------------------------------------------------------------------------
+MCoeMessageObserver::TMessageResponse CCSXHAppUi::HandleMessageL(
+           TUint32 aClientHandleOfTargetWindowGroup,
+           TUid aMessageUid,
+           const TDesC8& aMessageParameters)
+    {
+    if (aMessageUid == KHlpAppWsMsg)
+        {
+        HandleContextSensitiveLaunchL(aMessageParameters);
+        return EMessageHandled;
+        }
+    return CAknViewAppUi::HandleMessageL(aClientHandleOfTargetWindowGroup,
+                                         aMessageUid,
+                                         aMessageParameters);
+    }
+
+// --------------------------------------------------------------------------
+// Opens the context topic. If no topic is avbl then toc1 view is activated
+// --------------------------------------------------------------------------
+void  CCSXHAppUi::HandleContextSensitiveLaunchL(const TDesC8& aContext )   
+    {
+    CCSXHDocument* doc = static_cast<CCSXHDocument*>(Document());
+        
+    if(doc->SetContextTopicAsDisplayTopicL(aContext))
+        {
+        TRAPD(res,ActivateDisplayTopicViewL());
+        if(res == KErrNone)
+            return;
+        }
+    
+    //No topic avaliable, activate the TOC1 View & Pop a message
+    doc->SetDisplayTopic(doc->GetHelpDataBase()->GetMainTopics());
+    ActivateDisplayTopicViewL();
+        
+//    HBufC* ErrorMessage = iCoeEnv->AllocReadResourceLC(R_TYPE_NO_HELP_TOPICS);      
+//    CAknGlobalNote* note = CAknGlobalNote::NewLC();
+//    note->ShowNoteL(EAknGlobalInformationNote, *ErrorMessage);
+
+//    CleanupStack::PopAndDestroy(note); 
+//    CleanupStack::PopAndDestroy(ErrorMessage); 
+    }
+
+CCSXHAppUi* CCSXHAppUi::GetInstance()
+    {
+    return iInstance;
+    }
+RWsSession& CCSXHAppUi::GetWsSession()
+    {
+    return iInstance->iCoeEnv->WsSession();
+    }
+CCoeEnv* CCSXHAppUi::GetCoeEnv()
+    {
+    return iInstance->iCoeEnv;
+    }
+
+// --------------------------------------------------------------------------
+// Launches an application based on the Application UID and a View ID
+// --------------------------------------------------------------------------
+void CCSXHAppUi::AppLaunchL(TInt32& aAppId,TInt32& aVId)
+    {
+    //Convert from TInt to TUid
+    TUid KtestAppUid( TUid::Uid( aAppId ) ); 
+    TUid KtestViewUid( TUid::Uid( aVId ) ); 
+      
+    //Launch Application
+    TVwsViewId AppLaunch(KtestAppUid,KtestViewUid);
+    ActivateViewL(AppLaunch);
+    }
+
+// --------------------------------------------------------------------------
+// Launches an application based on the Application UID and a View ID
+// --------------------------------------------------------------------------
+void CCSXHAppUi::AppLaunchL(TInt32& aAppId,TInt32& aVId,
+                            TInt32& aMsgId,
+                            const TBuf<KMaxParamLength>& aParams)
+    {
+    //Convert from TInt to TUid
+    TUid AplnUid( TUid::Uid( aAppId ) ); 
+    TUid AplnViewUid( TUid::Uid( aVId ) ); 
+    TUid MsgUid( TUid::Uid( aMsgId ) ); 
+      
+    //Launch Application
+    TVwsViewId AppLaunch(AplnUid,AplnViewUid);
+    
+    HBufC8* params = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aParams);
+    CleanupStack::PushL(params);
+    ActivateViewL(AppLaunch,MsgUid,*params);
+    CleanupStack::PopAndDestroy(params);
+    }
+ 
+void CCSXHAppUi::PropagateResourceChange(TInt aType)
+    {
+    iTOC1View->ResourceChangeHdl(aType);
+    if(iKywdTOC1View)
+    	iKywdTOC1View->ResourceChangeHdl(aType);
+    if(iKywdTOC2View)
+    	iKywdTOC2View->ResourceChangeHdl(aType);
+    if(iTOC2View)
+		iTOC2View->ResourceChangeHdl(aType);    
+    if (iAppHelpsTOC2View)
+    	iAppHelpsTOC2View->ResourceChangeHdl(aType);
+    if (iAppHelpsTOC1View)
+        iAppHelpsTOC1View->ResourceChangeHdl(aType);
+    if(iHtmlTopicView)
+    	iHtmlTopicView->ResourceChangeHdl(aType);
+    if(iLegacyTopicView)
+    	iLegacyTopicView->ResourceChangeHdl(aType);
+    if(iLegacyContextTopicView)
+    	iLegacyContextTopicView->ResourceChangeHdl(aType);
+    }
+ 
+void CCSXHAppUi::RuntimeUpdateIndex()
+    {
+    CAknNoteDialog* dlg = new CAknNoteDialog();
+    if (dlg != NULL)
+        {
+        dlg->SetTimeout( CAknNoteDialog::EShortTimeout );
+        dlg->SetTone( CAknNoteDialog::ENoTone );
+        TRAP_IGNORE(dlg->ExecuteLD(R_CSHELP_INSTALL_UNINSTALL_NOTE));
+        }
+    }
+   
+       
+#ifdef FF_HELP_TUTORIAL_MERGE
+// --------------------------------------------------------------------------
+// CCSXHAppUi::NewParamListLC
+// Create paramlist for provider.
+// --------------------------------------------------------------------------
+CAiwGenericParamList* CCSXHAppUi::NewParamListLC(
+                                            const TCoeHelpContext& aContext)
+    {
+    TAiwVariant variant1;
+    TAiwVariant variant2;
+    variant1.Set(aContext.iMajor);
+    TAiwGenericParam param1(EGenericParamHelpItem, variant1);
+    variant2.Set(aContext.iContext);
+    TAiwGenericParam param2(EGenericParamHelpItem, variant2);
+    CAiwGenericParamList* list = CAiwGenericParamList::NewLC();
+    list->AppendL(param1);
+    list->AppendL(param2);
+    return list;
+    }
+
+// --------------------------------------------------------------------------
+// CCSXHAppUi::LoadTutorialService
+// Load service handler and attach interest for using tutorial service command.
+// --------------------------------------------------------------------------
+void CCSXHAppUi::LoadTutorialServiceL()
+    {
+    iServiceHandler = CAiwServiceHandler::NewL();
+
+    // Create AIW interest
+    RCriteriaArray interest;
+
+    iServiceHandler->AttachL(R_AIWTUTORIALAPP_INTEREST);
+
+    //Tutorial AIW provider exists or not
+    iTutorialExists = EFalse;
+    iServiceHandler->GetInterest(interest);
+    if(interest.Count() > 0)
+        {
+        FLOGF(_L("CCSXHAppUi::LoadTutorialService() - interest.Count()=%d"), interest.Count());
+        CAiwCriteriaItem* testCriteria = interest[0];
+        if(iServiceHandler->NbrOfProviders(interest[0]) > 0)
+            {
+            FLOGF(_L("CCSXHAppUi::LoadTutorialService() - NbrOfProviders()=%d"), iServiceHandler->NbrOfProviders(interest[0]));
+            iTutorialExists = ETrue;
+            }
+        }
+    interest.Close();
+    }
+
+// --------------------------------------------------------------------------
+// CCSXHAppUi::CallTutorialAiwProviderL
+// If tutorial exists,call play presentation command.
+// --------------------------------------------------------------------------
+void CCSXHAppUi::CallTutorialAiwProviderL()
+    {
+    CAiwGenericParamList* inlist = NewParamListLC( iTCoeHelpContext );
+
+    iServiceHandler->ExecuteServiceCmdL( KPlayPresentation,
+                                         *inlist,
+                                         iServiceHandler->OutParamListL() );
+    CleanupStack::PopAndDestroy();   //inlist
+    }
+
+// --------------------------------------------------------------------------
+// CCSXHAppUi::IsApplicationPresentInTutorialL
+// If tutorial exists,identify the presentation needed exist or not.
+// --------------------------------------------------------------------------
+TBool CCSXHAppUi::IsApplicationPresentInTutorialL()
+    {
+    TBool Result = EFalse;
+    //__ASSERT_DEBUG( iTutorialExists, User::Panic(_L("TutAiwHlp"),-1));
+    if(iTutorialExists )
+        {
+        CAiwGenericParamList* inlist = NewParamListLC(iTCoeHelpContext) ;
+
+        CAiwGenericParamList* outlist = CAiwGenericParamList::NewLC();
+
+        TUid maj = iTCoeHelpContext.iMajor;
+        TCoeContextName con = iTCoeHelpContext.iContext;
+
+        FLOGF(_L("CCSXHAppUi::IsApplicationPresentInTutorialL() - 0x%08x %S"),maj,&con);
+
+        //checks if the application specific presentation exists.
+        //Parameter list inlist must contain AppUid which refers to presentation.
+        // The other parameters are not used.
+        //The result is returned in outlist parameter list.
+        //First parameter in the outlist contains ETrue if there is presentation
+        //available and EFalse if there is not.
+        iServiceHandler->ExecuteServiceCmdL( KPresentationExists,
+                                             *inlist, *outlist );
+
+        FLOG(_L("CCSXHAppUi::IsApplicationPresentInTutorialL() - cp-1"));
+
+        //__ASSERT_DEBUG( outlist->Count() > 0, User::Panic(_L("TutAiwHlpO"),-1));
+        __ASSERT_DEBUG(outlist->Count(), User::Panic(_L("outlist"),0));
+
+        FLOG(_L("CCSXHAppUi::IsApplicationPresentInTutorialL() - cp-2"));
+        if( outlist->Count() > 0)
+            {
+            FLOG(_L("CCSXHAppUi::IsApplicationPresentInTutorialL() - cp-2.4"));
+            TAiwGenericParam param = (*outlist)[0];
+            TAiwVariant variant = param.Value();
+            TInt32 val(0);
+
+            if(variant.Get(val) && val)
+                {
+                Result = ETrue;
+                }
+            FLOG(_L("CCSXHAppUi::IsApplicationPresentInTutorialL() - cp-3"));
+            __ASSERT_DEBUG( variant.Get(val) && val, User::Panic(_L("TutAiwHlpV"),-1));
+            }
+        CleanupStack::PopAndDestroy();   //outlist
+        CleanupStack::PopAndDestroy();   //inlist
+        }
+    return Result;
+    }
+
+// --------------------------------------------------------------------------
+// CCSXHAppUi::SetHelpContext
+// If tutorial exists,identify the presentation needed exist or not.
+// --------------------------------------------------------------------------
+void CCSXHAppUi::SetHelpContext(TCoeHelpContext aTCoeHelpContext)
+    {
+    iTCoeHelpContext = aTCoeHelpContext;
+    }
+#endif // FF_HELP_TUTORIAL_MERGE