csxhelp/src/CSXHHtmlTopicView.cpp
branchRCL_3
changeset 18 cbffe13eac63
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/csxhelp/src/CSXHHtmlTopicView.cpp	Wed Sep 01 12:30:56 2010 +0100
@@ -0,0 +1,378 @@
+/*
+* 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:  CCSXHHtmlTopicView class definition
+*
+*/
+
+// INCLUDES
+#include "CSXHHtmlTopicView.h"
+#include "CSXHHtmlTopicContainer.h"
+#include "CSXHHtmlTOC2.h"
+#include "CSXHAppUi.h"
+#include "CSXHDocument.h"
+#include <cshelp.rsg>
+#include "CsHelp.hrh"
+
+#include "CSXHViewIDs.h"
+#include "CSXHKywdTOC1.h"
+#include "CSXHHelpDataBase.h"
+#include "CSXHContextTopic.h"
+#include "CSXHHtmlTOC2.h"
+#include "CSXHHtmlTOC1.h" 
+
+#include <avkon.hrh>
+#include <aknnotewrappers.h> 
+#include <brctldefs.h>
+#include <f32file.h>
+#include <apgcli.h>
+#include <akntitle.h>
+
+#include <AiwMenu.h>
+#include <AiwCommon.h>
+#include <AiwServiceHandler.h>
+#include <AknGlobalNote.h>
+TInt CCSXHHtmlTopicView::iFontSize = TBrCtlDefs::EFontSizeLevelLarger;
+
+CCSXHHtmlTopicView* CCSXHHtmlTopicView::NewL(const TUid& aUid, const TInt& aFlags,const 
+TRect& aRect)
+    {
+    CCSXHHtmlTopicView* temp = new(ELeave) CCSXHHtmlTopicView(aUid,aFlags);
+    CleanupStack::PushL(temp);
+    temp->ConstructL(aRect);
+    CleanupStack::Pop(temp);
+    return temp;
+    }
+
+CCSXHHtmlTopicView::CCSXHHtmlTopicView(const TUid& aUid, const TInt& aFlags):
+                        iUid(aUid),iAppFlags(aFlags)
+    {   
+    }
+CCSXHHtmlTopicView::~CCSXHHtmlTopicView()
+    {
+    if(iBCContainer)
+        {
+        delete iBCContainer;
+        iBCContainer = NULL;
+        }
+    }
+    
+void CCSXHHtmlTopicView::ConstructL(const TRect& /*aRect*/)
+    {
+    BaseConstructL(iAppFlags);
+    }
+
+void CCSXHHtmlTopicView::SetViewTypeL(TInt type)
+	{
+	if(type == iContextTopicView)
+		return;
+	
+	if(type == EContextHtmlView)
+		{
+		iContextTopicView = ETrue;
+		SetSoftKeysL(R_CSHELP_SOFTKEYS_OPTIONS_CLOSE_OPENLINK);
+		}
+	else
+		{
+		iContextTopicView = EFalse;
+		SetSoftKeysL(R_CSHELP_SOFTKEYS_OPTIONS_BACK_OPENLINK);
+		}	
+	}
+	
+TInt CCSXHHtmlTopicView::GetViewType()	
+	{
+	return iContextTopicView ? EContextHtmlView : EHtmlView;
+	}
+    
+TUid CCSXHHtmlTopicView::Id() const 
+    {
+    return iUid;
+    }
+// --------------------------------------------------------------------------
+// Launches an application based on the Application UID and a View ID
+// --------------------------------------------------------------------------    
+void CCSXHHtmlTopicView::HandleCommandL(TInt  aCommand  )
+    {
+    switch(aCommand)
+        {
+        case EAknSoftkeyBack:
+            {
+            if(iBCContainer->HandleBackKeyL())
+                return;
+            CCSXHDocument *doc = static_cast<CCSXHDocument*>(AppUi()->Document());              
+            //if not the current view, return
+            TUid viewId = doc->GetDisplayTopic()->GetViewID();
+            if( viewId != KCSXHHtmlTopicViewID && viewId != KCSXHKywdToc2ViewID )
+                {
+                return;
+                }          
+            CCSXHHtmlTOC2 *displayTopic = STATIC_CAST(CCSXHHtmlTOC2*,doc->GetDisplayTopic());
+            CCSXHKywdTOC1* kywdParent = displayTopic->GetKywdParent();
+            if(kywdParent)
+                {
+                doc->SetDisplayAndPrevTopic(kywdParent);    
+                AppUi()->HandleCommandL(ECSXHOpenItem); 
+                }
+            else
+                {
+                HandleCommandL(ECSXHOpenApplicationTopics); 
+                }   
+            break;  
+            }
+        case ECSXHOpenApplicationTopics:       
+            {
+            CCSXHDocument *doc = static_cast<CCSXHDocument*>(AppUi()->Document());   
+            if(iBCContainer->GetCurrActiveObject())
+            	{
+            	doc->SetDisplayTopic(iBCContainer->GetCurrActiveObject());
+            	CCSXHAppUi::GetInstance()->ResetTOC2ViewContainer();
+            	}            	           
+            CCSXHHtmlTOC2 *displayTopic = STATIC_CAST(CCSXHHtmlTOC2*,doc->GetDisplayTopic());
+            doc->SetDisplayAndPrevTopic(displayTopic->GetParent()); 
+            AppUi()->HandleCommandL(ECSXHOpenItem);
+            }
+            break;
+        case ECSXHTOC1ListView:
+            {
+            CCSXHDocument *doc = static_cast<CCSXHDocument*>(AppUi()->Document());      
+            if(iBCContainer->GetCurrActiveObject())
+            	{
+            	doc->SetDisplayTopic(iBCContainer->GetCurrActiveObject());
+            	CCSXHAppUi::GetInstance()->ResetTOC2ViewContainer();
+            	}            	        
+            	
+            CCSXHHtmlTOC2 *displayTopic = STATIC_CAST(CCSXHHtmlTOC2*,doc->GetDisplayTopic());
+            //These two steps are necessary to set the correct display and prev topics
+            doc->SetDisplayTopic(displayTopic->GetParent());    
+            doc->SetDisplayAndPrevTopic(doc->GetHelpDataBase()->GetMainTopics());   
+            AppUi()->HandleCommandL(ECSXHOpenItem); 
+            }
+            break;
+        case ECsHelpCmdFontLarge:
+            {
+            TInt CurrentFontSize = iBCContainer->GetCurrentValueL(TBrCtlDefs::ESettingsFontSize);
+            iBCContainer->SetSelectedFontSizeL(++CurrentFontSize);
+            iFontSize = CurrentFontSize;
+            }
+            break;
+        case ECsHelpCmdFontSmall:
+            {
+            TInt CurrentFontSize = iBCContainer->GetCurrentValueL(TBrCtlDefs::ESettingsFontSize);
+            iBCContainer->SetSelectedFontSizeL(--CurrentFontSize);
+            iFontSize = CurrentFontSize;
+            }
+            break;
+        case ECSXHOpenHyperLink: 
+            {           
+            iBCContainer->HandleCommandOpenHyperLinkL();
+            }
+            break;
+		case ECSXHSearchText:
+			{		
+        	CCSXHDocument *doc = static_cast<CCSXHDocument*>(AppUi()->Document()); 
+        	if(iBCContainer->GetCurrActiveObject())
+	        	{
+	        	doc->SetDisplayTopic(iBCContainer->GetCurrActiveObject());
+	       		CCSXHAppUi::GetInstance()->ResetTOC2ViewContainer();
+	        	}            
+        	}
+			AppUi()->HandleCommandL( aCommand );
+			break;
+        case EAknSoftkeyExit:
+        case EAknSoftkeyClose: 
+            AppUi()->HandleCommandL( aCommand );
+            break;
+        default:
+            break;      
+        }     
+    }
+// --------------------------------------------------------------------------
+// Handlign for view activation. For a context view, the actual display topic
+// has to be modified
+// --------------------------------------------------------------------------
+void CCSXHHtmlTopicView::DoActivateL(const TVwsViewId& aPrevViewId,TUid,const TDesC8&)  
+    {
+    iPrevious = aPrevViewId;    
+    CCSXHDocument *doc = static_cast<CCSXHDocument*>(AppUi()->Document());  
+     
+    if(!iBCContainer)
+    	{
+    	TRAPD(Result,iBCContainer = CCSXHHtmlTopicContainer::NewL(ClientRect(),*doc,this));
+    	if(KErrNone != Result)
+    		return;
+    	}
+    
+    //Set the correct display topic here for context sensitive launch
+    if(doc->GetDisplayTopic()->GetViewID() == KCSXHContextHtmlTopicViewID)
+        {
+        CCSXHContextTopic *topic = STATIC_CAST(CCSXHContextTopic*,doc->GetDisplayTopic());
+        doc->SetDisplayTopic(topic->GetTopic());
+        iContextTopicView = ETrue;
+        }
+    else
+    	{
+    	iContextTopicView = EFalse;
+    	}    
+	
+	CCSXHHtmlTOC2 *displayTopic = STATIC_CAST(CCSXHHtmlTOC2*,doc->GetDisplayTopic());
+    TRAPD(err,iBCContainer->SetAndLoadInitialTopicL(displayTopic));
+
+   	if( KErrNone != err )    
+   	    {
+   	    delete iBCContainer;
+   	    iBCContainer = NULL;
+   	    return;
+   	    }
+   	if( iContextTopicView )
+   	    {
+   	    SetSoftKeysL(R_CSHELP_SOFTKEYS_OPTIONS_CLOSE_OPENLINK);
+   	    }
+   	else
+   	    {
+   	    SetSoftKeysL(R_CSHELP_SOFTKEYS_OPTIONS_BACK_OPENLINK);
+   	    }
+    iBCContainer->SetMopParent(this); 
+    iBCContainer->SetRect(ClientRect());
+    AppUi()->AddToStackL(*this, iBCContainer);    
+    iBCContainer->MakeVisible(ETrue);     
+    }
+                             
+void CCSXHHtmlTopicView::DoDeactivate()                             
+    {   
+    if(iBCContainer)
+        {
+        iBCContainer->MakeVisible(EFalse);
+        TRAP_IGNORE(iBCContainer->CancelFetchL());
+        // FEP causes crash if it still hold the observer.
+        // fix as FEP suggested.
+        iBCContainer->SetFocus( EFalse );
+        AppUi()->RemoveFromStack(iBCContainer);
+        }
+    }
+// --------------------------------------------------------------------------
+// When a view which was previously activated, goes to background and gets
+// activated again, the DoActivateL will not be called only ViewActivatedL 
+// will be called. Special handling is required for the context view for the
+// scenario, open context help from any application, with out changing the 
+// help view, open context help from another application, the contents of the
+// context view has to be refreshed with the new topic
+// --------------------------------------------------------------------------    
+void CCSXHHtmlTopicView::ViewActivatedL(const TVwsViewId& aPrevViewId,
+                                 TUid aCustomMessageId,
+                                 const TDesC8& aCustomMessage)
+    {
+    
+    if(iBCContainer)
+    	{
+        //This handling is required for the following scenario
+    	//Context sensitive help launch more than once with no 
+	    //other view navigation in the help application
+    	CCSXHDocument *doc = static_cast<CCSXHDocument*>(AppUi()->Document());
+     	if(doc->GetDisplayTopic()->GetViewID() == KCSXHContextHtmlTopicViewID)
+ 	    	{
+        	CCSXHContextTopic *topic = static_cast<CCSXHContextTopic*>(doc->GetDisplayTopic());
+        	doc->SetDisplayTopic(topic->GetTopic());
+        	CCSXHHtmlTOC2 *displayTopic = STATIC_CAST(CCSXHHtmlTOC2*,doc->GetDisplayTopic());
+        	iBCContainer->RefreshL(displayTopic);
+        	SetSoftKeysL(R_CSHELP_SOFTKEYS_OPTIONS_CLOSE_OPENLINK);
+         	}
+        iBCContainer->CheckForMSK();
+    	}
+    CAknView::ViewActivatedL(aPrevViewId,aCustomMessageId,aCustomMessage);
+    }
+    
+void CCSXHHtmlTopicView::SetSoftKeysL(TInt aSoftKeys)
+    {    
+    if( Cba() )
+        {
+        Cba()->SetCommandSetL( aSoftKeys );
+        Cba()->DrawDeferred();   	
+        }
+    }
+// --------------------------------------------------------------------------
+// Dynamically updating Options menu item
+// --------------------------------------------------------------------------    
+void CCSXHHtmlTopicView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
+    {
+
+    if( R_CSXH_MENU_HTMLTOPICVIEW == aResourceId)
+        {    
+        TInt CurrentFontSize = iBCContainer->GetCurrentValueL(TBrCtlDefs::ESettingsFontSize);
+        
+        if(CurrentFontSize == TBrCtlDefs::EFontSizeLevelNormal)
+            {
+            aMenuPane->SetItemDimmed(ECsHelpCmdFontSmall,ETrue);
+            }
+        else if(CurrentFontSize == TBrCtlDefs::EFontSizeLevelAllLarge)
+            {
+            aMenuPane->SetItemDimmed(ECsHelpCmdFontLarge,ETrue);
+            }
+        
+        if(!iBCContainer->IsHyperLinkFocused())
+            {
+            aMenuPane->SetItemDimmed(ECSXHOpenHyperLink,ETrue);
+            }
+        }
+    }
+// --------------------------------------------------------------------------
+// MSK Handling
+// --------------------------------------------------------------------------
+void CCSXHHtmlTopicView::SetMiddleSoftKey(TBool aValue)
+    {
+#ifndef __SERIES60_30__    
+    if(AknLayoutUtils::MSKEnabled())
+        {        
+        Cba()->MakeCommandVisible(ECSXHOpenHyperLink,aValue);
+        Cba()->DrawDeferred();
+        }
+#endif      
+    }
+    
+TInt CCSXHHtmlTopicView::GetCurrentFontSize()
+ 	{
+ 	return iFontSize;
+ 	}
+ 	
+void CCSXHHtmlTopicView::ResourceChangeHdl(TInt aType)
+    {
+    if(iBCContainer)
+        iBCContainer->HandleResourceChangeImpl(aType);
+    } 
+    
+#ifdef FF_HELP_TUTORIAL_MERGE
+ // --------------------------------------------------------------------------
+// CCSXHAppUi::LaunchTutorial
+// Lauch tutorial if exist, else popup a error message.
+// --------------------------------------------------------------------------
+void CCSXHHtmlTopicView::LaunchTutorialL()
+    {
+    CCSXHDocument *doc = static_cast<CCSXHDocument*>(AppUi()->Document());
+    CCSXHHtmlTOC2 *displayTopic = STATIC_CAST(CCSXHHtmlTOC2*,doc->GetDisplayTopic());
+    TCoeHelpContext helpContext;
+    displayTopic->GetHelpContext(helpContext);
+    CCSXHAppUi::GetInstance()->SetHelpContext(helpContext);
+    if( CCSXHAppUi::GetInstance()->IsApplicationPresentInTutorialL() )
+        {
+        CCSXHAppUi::GetInstance()->CallTutorialAiwProviderL();
+        }
+    else
+        {
+        HBufC* ErrorMessage = iCoeEnv->AllocReadResourceLC(R_TYPE_NO_HELP_TOPICS);
+        CAknGlobalNote* note = CAknGlobalNote::NewLC();
+        note->ShowNoteL(EAknGlobalInformationNote, *ErrorMessage);
+
+        CleanupStack::PopAndDestroy(note);
+        CleanupStack::PopAndDestroy(ErrorMessage);
+        }
+    }
+#endif // FF_HELP_TUTORIAL_MERGE