/*
* 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 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:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  This class represents the Widget Extension object
*
*/

// INCLUDE FILES
#include <e32std.h>
#include <eikenv.h>
#include <apgcli.h>
#include <apgtask.h>
#include <browserlauncher.h>
#include <widgetmenu.rsg>
#include <avkon.hrh>

#include "WidgetClient.h"
#include "Widget.h"
#include "Renderer.h"
#include "Preferences.h"


// EXTERNAL DATA STRUCTURES

// EXTERNAL FUNCTION PROTOTYPES

// CONSTANTS

// MACROS

// LOCAL CONSTANTS AND MACROS

const TInt KWebBrowserUid = 0x10008D39;

// MODULE DATA STRUCTURES

// LOCAL FUNCTION PROTOTYPES


// ----------------------------------------------------------------------------
// CWidgetClient::NewL
//
//
//
// ----------------------------------------------------------------------------
//
CWidgetClient* CWidgetClient::NewL(MWidgetCallback& aWidgetCallback, 
                                  MWidgetEngineCallbacks& aWidgetEngineCallback, 
                                  WidgetPreferences* preferences)
{
    CWidgetClient* self = new ( ELeave ) CWidgetClient(aWidgetCallback, aWidgetEngineCallback, preferences);
    CleanupStack::PushL( self );
    self->ConstructL(aWidgetEngineCallback);
    CleanupStack::Pop();
    return self;
}

// ----------------------------------------------------------------------------
// CWidgetClient::CWidgetClient
//
//
//
// ----------------------------------------------------------------------------
//
CWidgetClient::CWidgetClient(MWidgetCallback& aWidgetCallback, 
                             MWidgetEngineCallbacks& aWidgetEngineCallback, 
                             WidgetPreferences* preferences) : 
                                                            m_preferences (preferences), 
                                                            m_renderer(0), 
                                                            m_widgetcallback( &aWidgetCallback ), 
                                                            m_widgetenginecallback(&aWidgetEngineCallback),
                                                            m_jswidget(0)
{
}

// ----------------------------------------------------------------------------
// CWidgetClient::~CWidgetClient
//
//
//
// ----------------------------------------------------------------------------
//
CWidgetClient::~CWidgetClient()
{    
    if (m_jswidget) {
        KJS::Collector::unprotect(m_jswidget);        
    }
    
    delete m_renderer;
}


// ----------------------------------------------------------------------------
// CWidgetClient::ConstructL
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::ConstructL(MWidgetEngineCallbacks& aWidgetEngineCallback)
{    
    m_jswidget = new KJS::JSWidget(this);     
    m_renderer = new (ELeave) WidgetRenderer(aWidgetEngineCallback);    
    KJS::Collector::protect(m_jswidget);
}


// ----------------------------------------------------------------------------
// CWidgetClient::OnShowSelected
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::onShowSelected()
{
    if (m_jswidget) {
        m_jswidget->setVisibility(true);        
    }
}


// ----------------------------------------------------------------------------
// CWidgetClient::OnHideSelected
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::onHideSelected()
{
    if (m_jswidget) {
        m_jswidget->setVisibility(false);        
    }    
}

// ----------------------------------------------------------------------------
// CWidgetClient::OnExitCalled
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::onExitCalled()
{
    if (m_jswidget) {
        m_jswidget->handleExit();        
    }    
}

////////////////////////////////////////////////////////////////////////////////
// From MWidgetExtension
// -----------------------------------------------------------------------------
// CWidgetClient::HandleCommandL
//
//
//
// -----------------------------------------------------------------------------
//
TBool CWidgetClient::HandleCommandL( TInt aCommandId )
{
    TInt cmnd(aCommandId - (TInt)TBrCtlDefs::ECommandIdBase);
    
    if ( cmnd == TBrCtlDefs::ECommandAppForeground ) {
        onShowSelected();
        return ETrue;
    }
    if ( cmnd == TBrCtlDefs::ECommandAppBackground ) {
        onHideSelected();
        return ETrue;
    }
    if ((aCommandId == EEikCmdExit) || (aCommandId == EAknCmdExit) || (aCommandId == EAknSoftkeyExit)) {
        onExitCalled();
    }

    return EFalse;
}

// From MWidgetCallbacks
// ----------------------------------------------------------------------------
// CWidgetClient::launchApplicationL
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::launchApplicationL(const TUid& aUid, const TDesC& aParam)
{
    RApaLsSession apaLsSession;
    TApaTaskList taskList(CEikonEnv::Static()->WsSession());
    TApaTask task = taskList.FindApp(aUid);

    if ( task.Exists() ) {
    
        task.BringToForeground();
        if ( aParam.Length() > 0 ) {
            HBufC8* param8 = HBufC8::NewLC( aParam.Length() );
            param8->Des().Append( aParam );
            task.SendMessage( TUid::Uid( 0 ), *param8 );
            CleanupStack::PopAndDestroy( param8 );
        }
    }
    else {
    
        TInt eConnect = KErrNone;
        if ( !apaLsSession.Handle() ) {
            eConnect = apaLsSession.Connect();
        }

        if ( eConnect == KErrNone ) {
            TThreadId threadId;
            apaLsSession.StartDocument( aParam, aUid, threadId );
            apaLsSession.Close();
        }
    }

}

// ----------------------------------------------------------------------------
// CWidgetClient::openApplication
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::openApplication(const TUid& aAppUid, const TDesC& aParam)
{
    TRAP_IGNORE( launchApplicationL( aAppUid, aParam ) );
}

// ----------------------------------------------------------------------------
// CWidgetClient::openUrl
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::openUrl( const TDesC& aUrl )
{    
    HBufC* param = HBufC::NewLC( aUrl.Length() + 2 );
    param->Des().Append( _L("4 ") );
    param->Des().Append( aUrl );
    TRAP_IGNORE( launchApplicationL( TUid::Uid( KWebBrowserUid ), *param ) );
    CleanupStack::PopAndDestroy( param );
}

// ----------------------------------------------------------------------------
// CWidgetClient::getWidgetBundleId
//
//
//
// ----------------------------------------------------------------------------
//
TDesC& CWidgetClient::getWidgetBundleId()
{            
    return m_preferences->getWidgetBundleId();    
}


// ----------------------------------------------------------------------------
// CWidgetClient::setNavigationEnabled
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::setNavigationEnabled( TBool aEnable )
{
    m_widgetenginecallback->setTabbednavigation(!aEnable);
}

// ----------------------------------------------------------------------------
// CWidgetClient::prepareForTransition
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::prepareForTransition( const TDesC& aTransition )
{    
    TRAP_IGNORE( m_renderer->prepareForTransitionL( aTransition ) );
}

// ----------------------------------------------------------------------------
// CWidgetClient::performTransition
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::performTransition()
{    
    TRAP_IGNORE( m_renderer->performTransitionL() );
}

// ----------------------------------------------------------------------------
// CWidgetClient::preferenceForKey
//
//
//
// ----------------------------------------------------------------------------
//
TInt CWidgetClient::preferenceForKey( const TDesC& aKey, TPtrC& aValue )
{    
    TInt ret = KErrNotFound;
    TRAP_IGNORE( ret = m_preferences->preferenceL( aKey, aValue ) );
    return ret;
}

// ----------------------------------------------------------------------------
// CWidgetClient::setPreferenceForKey
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::setPreferenceForKey( const TDesC& aKey, const TDesC& aValue )
{    
    TRAP_IGNORE( m_preferences->setPreferenceL( aKey, aValue ) );
}

// ----------------------------------------------------------------------------
// CWidgetClient::removePreferenceForKey
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::removePreferenceForKey( const TDesC& aKey, const TDesC& aValue )
{    
    TRAP_IGNORE( m_preferences->removePreferenceL( aKey, aValue ) );
}

// ----------------------------------------------------------------------------
// CWidgetClient::setDisplayLandscape
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::setDisplayLandscape()
{    
    m_widgetcallback->SetDisplayMode(TBrCtlDefs::EOrientationLandscape);
}

// ----------------------------------------------------------------------------
// CWidgetClient::setDisplayPortrait
//
//
//
// ----------------------------------------------------------------------------
//
void CWidgetClient::setDisplayPortrait()
{   
    m_widgetcallback->SetDisplayMode(TBrCtlDefs::EOrientationPortrait);
}


//END OF FILE




