csxhelp/src/CSXHGenericContainer.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:56 +0100
branchRCL_3
changeset 18 cbffe13eac63
parent 0 1f04cf54edd8
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201031 Kit: 201035

/*
* 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:  CCSXHGenericContainer class definition
*
*/


#include "CSXHGenericContainer.h"
#include "CSXHGenericView.h"
#include "CSXHDocument.h"
#include "CSXHAppUi.h"
#include "CSXHHelpDataBase.h"
#include "CSXHGenericTOC1.h"
#include "CSXHGenericTOC2.h"

#ifdef FF_HELP_TUTORIAL_MERGE
#include "CSXHHtmlTOC2.h"
#endif

#include "CsHelp.hrh"
#include "csxhconstants.h"

#include "CSXHViewIDs.h"
#include <eikclbd.h>
#include <aknlists.h>
#include <featmgr.h>
#include <AknPriv.hrh>

const TInt KFindNameLength = 40;
const TInt KComponentCount = 2;     

#ifdef FF_HELP_TUTORIAL_MERGE
CCSXHGenericContainer* CCSXHGenericContainer::NewL(const TRect& aRect,CCSXHDocument& aDocument,CCSXHGenericView* aView)
	{
	CCSXHGenericContainer* self = CCSXHGenericContainer::NewLC(aRect,aDocument,aView);
    CleanupStack::Pop(self);
    return self;
	}
#else
CCSXHGenericContainer* CCSXHGenericContainer::NewL(const TRect& aRect,CCSXHDocument& aDocument)
    {
    CCSXHGenericContainer* self = CCSXHGenericContainer::NewLC(aRect,aDocument);
    CleanupStack::Pop(self);
    return self;
    }
#endif
    
#ifdef FF_HELP_TUTORIAL_MERGE
CCSXHGenericContainer* CCSXHGenericContainer::NewLC(const TRect& aRect,CCSXHDocument& aDocument,CCSXHGenericView* aView)
    {
    CCSXHGenericContainer* self = new(ELeave) CCSXHGenericContainer(aDocument,aView);
    CleanupStack::PushL(self);
    self->ConstructL(aRect);
    return self;
    }
#else
CCSXHGenericContainer* CCSXHGenericContainer::NewLC(const TRect& aRect,CCSXHDocument& aDocument)
    {
    CCSXHGenericContainer* self = new(ELeave) CCSXHGenericContainer(aDocument);
    CleanupStack::PushL(self);
    self->ConstructL(aRect);
    return self;
    }
#endif

#ifdef FF_HELP_TUTORIAL_MERGE
CCSXHGenericContainer::CCSXHGenericContainer(CCSXHDocument& aDocument,CCSXHGenericView* aView) : 
iDocument(aDocument),iView(aView)
#else
CCSXHGenericContainer::CCSXHGenericContainer(CCSXHDocument& aDocument) : iDocument(aDocument)
#endif
    {//No implementation required
    }
    
CCSXHGenericContainer::~CCSXHGenericContainer()
    {
    delete iListBox;
    delete iFindPane;
    }
    
void CCSXHGenericContainer::ConstructL(const TRect& aRect)
    {
    CreateWindowL();

    CreateAndPopulateListL();

    iListBox->SetListBoxObserver(this); 
    SetRect(aRect);
    ActivateL();    
    }
// --------------------------------------------------------------------------
// Does the following
// 1) Creates and populates the listbox
// 2) Highlights an item in the listbox
// 3) Check for MSK
// --------------------------------------------------------------------------
void CCSXHGenericContainer::CreateAndPopulateListL()
    {
    // First phase construction
    iListBox = new (ELeave) CAknSingleStyleListBox;
    iListBox->SetContainerWindowL(*this);

    iListBox->ConstructL(this, 0);
    iListBox->CreateScrollBarFrameL(ETrue);
    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
                                                CEikScrollBarFrame::EOff,
                                                CEikScrollBarFrame::EAuto);
    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue); 
              
    CTextListBoxModel* model = iListBox->Model();  // not taking ownership
    model->SetOwnershipType (ELbmOwnsItemArray);
    CDesCArray* testArray = STATIC_CAST(CDesCArray*, model->ItemTextArray());
    
    CCSXHGenericTOC1* displayTopic = STATIC_CAST(CCSXHGenericTOC1*,iDocument.GetDisplayTopic());
    
    displayTopic->FillChildDataL(testArray);
    
    //Find panel Begin
    CAknSearchField::TSearchFieldStyle flags(CAknSearchField::ESearch);
    iFindPane = CAknSearchField::NewL(*this, flags, 
                                       NULL,KFindNameLength);

    STATIC_CAST(CAknFilteredTextListBoxModel*, iListBox->Model())
        ->CreateFilterL(iListBox, iFindPane);
    
    STATIC_CAST(CAknFilteredTextListBoxModel*, iListBox->Model())
            ->Filter()->HandleOfferkeyEventL();  
	//Corrections to TSW Error:  KMAI-6WNACA with New UI CR: EVIA-6XAJ46            
    if (FeatureManager::FeatureSupported(KFeatureIdJapanese) &&
        (User::Language() == ELangJapanese))
        {        
        iFindPane->Editor().SetAknEditorInputMode(EAknEditorHiraganaKanjiInputMode);
        }
    else
    	{
    	iFindPane->Editor().SetAknEditorCurrentInputMode(EAknEditorTextInputMode);
    	}

    HightLightItemL();    
    }
    
void CCSXHGenericContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent)
    {
    switch ( aListBoxEvent )
        {
        case MEikListBoxObserver::EEventEnterKeyPressed:
        case MEikListBoxObserver::EEventItemSingleClicked:
#ifdef FF_HELP_TUTORIAL_MERGE
  	        if(IsShowTutorialItemSelectedL())
	        	{
                CCSXHAppUi::GetInstance()->CallTutorialAiwProviderL();
	        	}
	        else

#endif	        
	        	{
	        	iDocument.SendMessageToAppUiL( ECSXHOpenItemPropagated );
	        	}	        	   

            break;
        default:
            break;// do nothing with the rest of the events
        }       
    }
    
void CCSXHGenericContainer::SizeChanged()
    {
    iListBox->SetRect(Rect());
    AknFind::HandleFixedFindSizeChanged(this, iListBox, iFindPane);
    }
    
void CCSXHGenericContainer::FocusChanged(TDrawNow aDrawNow)
    {
    if (iListBox)
        {
        iListBox->SetFocus(IsFocused(), aDrawNow);
        }
    if ( iFindPane )
        {
        iFindPane->SetFocus( IsFocused(), aDrawNow );
        }
    }
        
TInt CCSXHGenericContainer::CountComponentControls() const
    {
    return KComponentCount;
    }
    
CCoeControl* CCSXHGenericContainer::ComponentControl(TInt aIndex) const
    {
    switch (aIndex)
        {
        case 0:
            return iListBox;
        case 1:
            return iFindPane;
        default:
            return NULL;
        }
    }
        
void CCSXHGenericContainer::Draw(const TRect& aRect) const
    {
    CWindowGc& gc = SystemGc();
    gc.Clear(aRect);
    }
    
TKeyResponse CCSXHGenericContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
    {
    TKeyResponse result(EKeyWasNotConsumed);
    
    TBool needRefresh;
    result = AknFind::HandleFindOfferKeyEventL(aKeyEvent, aType,
                        this, iListBox, iFindPane, EFalse, needRefresh);
    CheckForMSK();              
    if (result == EKeyWasNotConsumed)
        {
        result = iListBox->OfferKeyEventL (aKeyEvent, aType);
        }
    return result; 
    }
    
void CCSXHGenericContainer::HandleResourceChange(TInt aType)
    {
    CCSXHAppUi::GetInstance()->PropagateResourceChange(aType);

    if (KAknSplitInputEnabled == aType || KAknSplitInputDisabled == aType)
        {
    // Bug fixing, SetFocus can't be called with these aType, it will lead to infinite loop in fep.
        return;
        }
    
    if ( IsFocused() )
        {
        SetFocus( IsFocused(), EDrawNow );
        }

    }
    
void CCSXHGenericContainer::HandleResourceChangeImpl(TInt aType)
    {
    if (aType == KEikDynamicLayoutVariantSwitch)
        {
        iListBox->HandleResourceChange(aType);
        TRect mainRect; 
        SizeChanged();
        TRect statusPaneRect;
        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainRect);
        SetRect(mainRect);
        DrawNow();
        }
    else
        {
        CCoeControl::HandleResourceChange(aType);   
        }
    }
// --------------------------------------------------------------------------
// Sets the next topic to be displayed based on the selected item
// --------------------------------------------------------------------------    
void CCSXHGenericContainer::SetDisplayTopicL()
    {
    TInt index = iListBox->CurrentItemIndex();
    if(KErrNotFound == index)
        return;
        
    TBuf<KMaxFileName> selectedTOC2 = iListBox->Model()->ItemText(index);
    selectedTOC2 = selectedTOC2.Mid(1);
    
    CCSXHGenericTOC1* displayTopic = STATIC_CAST(CCSXHGenericTOC1*,iDocument.GetDisplayTopic());
    if( displayTopic->GetChildL(selectedTOC2) )
        {
    	iDocument.SetDisplayAndPrevTopic(displayTopic->GetChildL(selectedTOC2));
        }
    }

TInt CCSXHGenericContainer::GetNumberOfListItems()
    {
    return iListBox->Model()->NumberOfItems();
    }
    
void CCSXHGenericContainer::SetCurrentView(CCSXHGenericView* aView)
    {
    iView = aView;
    }
    
void CCSXHGenericContainer::HightLightItemL()    
    {
    CCSXHHelpContentBase* prevTopic = iDocument.GetPrevTopic();    
    if(!prevTopic)
        return;
        
    TInt visibleItemcount = GetNumberOfListItems();
    for (TInt index = 0; index < visibleItemcount ; ++index )
        {
        TBuf<KMaxFileName> txt = iListBox->Model()->ItemText(index);
        txt = txt.Mid(1);//remove the '/t'
        if(txt.Compare(prevTopic->GetName()) == 0)
            {
            if(iListBox->CurrentItemIndex() != index)
                iListBox->SetCurrentItemIndex(index);
            return;
            }
        }
    }
    
void CCSXHGenericContainer::CheckForMSK()   
    {
#ifndef __SERIES60_30__ 
    if(AknLayoutUtils::MSKEnabled())
        {   
        if(iListBox->Model()->NumberOfItems())
            {
            iView->SetMiddleSoftKey(ETrue);         
            }
        else
            {
            iView->SetMiddleSoftKey(EFalse);                
            }
        }
#endif      
    }
      
#ifdef FF_HELP_TUTORIAL_MERGE
// --------------------------------------------------------------------------
// CCSXHAppUi::IsShowTutorialItemSelectedL
// If the selected item is a tutorial item.
// --------------------------------------------------------------------------
TBool CCSXHGenericContainer::IsShowTutorialItemSelectedL()
    {
    TBool bShowTutorial = EFalse;
    //TODO:
    // if keyword page supported tutorial, the comments should be opened
    if( 0 != GetNumberOfListItems /*&&  KCSXHKywdToc2ViewID != iView->Id() */)
        {
        TInt index = iListBox->CurrentItemIndex();
        if(KErrNotFound == index)
            return bShowTutorial;
        //Get Next View
        TBuf<KMaxFileName> selectedTOC2 = iListBox->Model()->ItemText(index);

        selectedTOC2 = selectedTOC2.Mid(1);
        CCSXHGenericTOC1* displayTopic = STATIC_CAST(CCSXHGenericTOC1*,
                                               iDocument.GetDisplayTopic());
        TUid NextViewId = displayTopic->GetChildL(selectedTOC2)->GetViewID();

        //Check Tutorial is present for Application topic [TOC2]
        if(NextViewId == KCSXHHtmlTopicViewID)
            {
            CCSXHHtmlTOC2* HTMLTOC2Ptr = STATIC_CAST(CCSXHHtmlTOC2*,
                                      displayTopic->GetChildL(selectedTOC2));
            TFileName filename;
            HTMLTOC2Ptr->GetHtmlUrlL( filename );
            if( KErrNotFound != filename.Find( KTutorialFileExtn ))
                {
                bShowTutorial = ETrue;
                TCoeHelpContext helpContext;
                HTMLTOC2Ptr->GetHelpContext(helpContext);
                CCSXHAppUi::GetInstance()->SetHelpContext( helpContext );
                }
            }
        }
    return bShowTutorial;
    }

#endif // FF_HELP_TUTORIAL_MERGE


void CCSXHGenericContainer::MakeVisible(TBool aVisible)
    {
    CCoeControl::MakeVisible(aVisible);
    iListBox->ScrollBarFrame()->ComponentControl(0)->MakeVisible(aVisible);
    }