idlefw/plugins/pslnactiveidleplugin/src/pslnactiveidleplugin.cpp
author Christian Morlok <symbian.org@christianmorlok.de>
Wed, 07 Apr 2010 14:35:19 +0200
branchv5backport
changeset 54 666a2952b5b3
parent 0 79c6a41cd166
permissions -rw-r--r--
renamed dlls+exe to prevent conflicts with existing files in emulator; changelog attached. * renamed dlls/exe: - aifw.dll to aifw_hs.dll - cputils to cputils_hs - aiidleint.dll to aiidleint_hs.dll - aiutils.dll to aiutils_hs.dll - MenuInterface.dll to MenuInterface_hs.dll - XCFW.dll to XCFW_hs.dll - homescreen.exe to homescreen_hs.exe - ailaunch.exe to ailaunch_hs.exe * new UID for Active Idle (aifw_hs.dll, aiidleint_hs.dll and homescreen.exe): #define AI_UID3_AIFW_COMMON 0xEDFF45C4 (was 0x102750F0 = 271012080) * new UID for cputils_hs.dll: 0xE3E7134E (was 0x20016B7F = 536963967) * new UID for AI Utilities Factory (aiutils_hs.dll): 0xEC55106C (was 0x10281865 = 271063141) * new UID for MenuInterface_hs.dll: 0xEEE24485 (was 0x10210EAB = 270601899) * new UID for XCFW_hs.dll: 0xEB12332F (was 0x10210EA0 = 270601888) * new UID for ailaunch_hs.exe: 0xEF5A047A (was 0x200286E3 = 537036515)

/*
* Copyright (c) 2005-2007 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:  View for Active Idle skinning.
*
*/


// This plugin specific.
#include <pslnactiveidlepluginrsc.rsg>
#include <pslnactiveidleplugin.mbg>
#include "pslnactiveidleplugin.h"
#include "pslnactiveidleplugincontainer.h"
#include "pslnactiveidlepluginengine.h"
#include "pslnactiveidlepluginuids.h"

// General services.
#include <stringloader.h>
#include <featmgr.h>
#include <gsfwviewuids.h>

// Psln Framework specific.
#include <pslnfwviewuids.h>
#include <psln.hrh>
#include <pslncommon.rsg>
#include <psln.rsg>


// Path to mbm file.
_LIT(KPslnActiveIdleIconFileName, "pslnactiveidleplugin.mbm");

// Path to compiled resource file.
_LIT(KPslnActiveIdlePluginResourceFileName, "z:pslnactiveidlepluginrsc.rsc");

// Path to common personalization resources. This resource file is meant for
// shared resources between application and plugins.
_LIT(KPslnCommonResourceFileName, "z:pslncommon.rsc");

// Path to Psln application resource file. Plugin uses some localized texts
// from Psln's resources.
_LIT(KPslnApplicationResourceFileName, "z:psln.rsc");

// Location of this plugin view within Psln's tab group.
const TInt KPslnActiveIdlePluginLocation = 2;

const TUid KPslnActiveIdlePluginUid = { KPslnActiveIdlePluginImplementationUID };

// Middle Softkey control ID.
const TInt KPslnMSKControlId = 3;

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::CPslnActiveIdlePlugin()
//
// Constructor
// ----------------------------------------------------------------------------
//
CPslnActiveIdlePlugin::CPslnActiveIdlePlugin(CAknViewAppUi* aAppUi)
    :
    iResourceLoader(*iCoeEnv),
    iResourceLoaderCommon(*iCoeEnv),
    iResourceLoaderPsln(*iCoeEnv),
    iAppUi(aAppUi)
{
}

// ---------------------------------------------------------------------------
// CPslnActiveIdlePlugin::NewL
//
// Symbian OS default constructor
// ---------------------------------------------------------------------------
CPslnActiveIdlePlugin* CPslnActiveIdlePlugin::NewL(TAny* aAppUi)
{
    CAknViewAppUi* appUi = reinterpret_cast<CAknViewAppUi*>(aAppUi);
    CPslnActiveIdlePlugin* self = new(ELeave) CPslnActiveIdlePlugin (appUi);

    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);

    return self;
}

// ---------------------------------------------------------------------------
// CPslnActiveIdlePlugin::ConstructL
//
// Symbian OS two-phased constructor
// ---------------------------------------------------------------------------
void CPslnActiveIdlePlugin::ConstructL()
{
#ifdef _MY_DEBUG
    RDebug::Print(_L("XAI: CPslnActiveIdlePlugin::ConstructL"));
#endif

    // Find the resource file:
    TParse* parse = new (ELeave) TParse;
    CleanupStack::PushL(parse);
    parse->Set(KPslnCommonResourceFileName, &KDC_APP_RESOURCE_DIR, NULL);
    TFileName* fileName = new (ELeave) TFileName(parse->FullName());
    CleanupStack::PushL(fileName);

    // Open resource file:
    iResourceLoaderCommon.OpenL(*fileName);
    CleanupStack::PopAndDestroy(fileName);

    // Find the resource file:
    parse->Set(KPslnApplicationResourceFileName, &KDC_APP_RESOURCE_DIR, NULL);
    fileName = new (ELeave) TFileName(parse->FullName());
    CleanupStack::PushL(fileName);

    // Open resource file:
    iResourceLoaderPsln.OpenL(*fileName);
    CleanupStack::PopAndDestroy(fileName);
    CleanupStack::PopAndDestroy(parse);

    // Open own resources for reading.
    OpenLocalizedResourceFileL(
        KPslnActiveIdlePluginResourceFileName,
        iResourceLoader);

    BaseConstructL(R_PSLN_ACTIVE_IDLE_VIEW);

    iEngine = new (ELeave) CPslnActiveIdlePluginEngine(this);
    iEngine->ConstructL( TRect() );
    iEngine->ManualGetSkinsRestartL(ETrue); // Force start

}

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::~CPslnActiveIdlePlugin
//
// Destructor
// ----------------------------------------------------------------------------
CPslnActiveIdlePlugin::~CPslnActiveIdlePlugin()
{
    iResourceLoaderCommon.Close();
    iResourceLoaderPsln.Close();
    iResourceLoader.Close();
    delete iEngine;
}

// ---------------------------------------------------------------------------
// TUid CPslnActiveIdlePlugin::Id()
//
// Returns view's ID.
// ---------------------------------------------------------------------------
TUid CPslnActiveIdlePlugin::Id() const
{
    return KPslnActiveIdlePluginUid;
}

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::GetCaption
//
// Return application/view caption. 128
// ----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::GetCaptionL(TDes& aCaption) const
{
    // the resource file is already opened.
    HBufC* result = StringLoader::LoadL(R_PSLN_AI_LIST_VIEW_CAPTION);
    if (aCaption.MaxLength() >= result->Length())
    {
        aCaption.Copy(*result);
    }
    delete result;
    }

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::GetTabTextL
//
// Return tab text. 128
// ----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::GetTabTextL(TDes& aCaption) const
{
    // the resource file is already opened.
    HBufC* result = StringLoader::LoadL(R_PSLN_AI_TAB_NAME);
    if (aCaption.MaxLength() >= result->Length())
        {
        aCaption.Copy(*result);
        }
    delete result;
    }

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::CreateIconL
//
// Creates Main view icon.
// ----------------------------------------------------------------------------
//
CGulIcon* CPslnActiveIdlePlugin::CreateIconL()
{
    // Find the resource file:
    TParse* parse = new (ELeave) TParse;
    CleanupStack::PushL(parse);
    parse->Set(KPslnActiveIdleIconFileName, &KDC_APP_BITMAP_DIR, NULL);
    HBufC* fileName = parse->FullName().AllocLC();
    TPtr fileNamePtr = fileName->Des();

    CGulIcon* icon = AknsUtils::CreateGulIconL(
        AknsUtils::SkinInstance(),
        KAknsIIDQgnPropPslnAiSub,
        fileNamePtr,
        EMbmPslnactiveidlepluginQgn_prop_psln_ai_sub,
        EMbmPslnactiveidlepluginQgn_prop_psln_ai_sub_mask);

    CleanupStack::PopAndDestroy(2, parse); // fileName, parse

    return icon;
}

// -----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::GetLocationTypeAndIndex()
//
//
// -----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::GetLocationTypeAndIndex(
    TPslnFWLocationType& aType,
    TInt& aIndex) const
{
    aType = CPslnFWPluginInterface::EPslnFWSpecified;
    aIndex = KPslnActiveIdlePluginLocation;
}

// ---------------------------------------------------------------------------
// CPslnActiveIdlePlugin::HandleCommandL(TInt aCommand)
//
// Handles commands directed to this class.
// ---------------------------------------------------------------------------
void CPslnActiveIdlePlugin::HandleCommandL(TInt aCommand)
{
    switch (aCommand)
    {
    case EPslnCmdAppActivate:
        iEngine->ActivateThemeL();
        break;

    case EAknSoftkeyBack:
        RemoveCommandFromMSK();
        if (iAppUi->View(KPslnMainViewUid))
        {
            // if we are in Psln activate Psln main view...
            iAppUi->ActivateLocalViewL(KPslnMainViewUid);
        }
        else if (iAppUi->View(KGSMainViewUid))
        {
            // ... else if we are in GS activate parent plugin view (standby view)...
            iAppUi->ActivateLocalViewL(KGSStandbyPluginUid);
        }
        else
        {
            iAppUi->HandleCommandL(aCommand);
        }
        break;

    case EAknSoftkeyExit:
        // This is here because we use different softkey setups
        iAppUi->HandleCommandL(EAknCmdExit);
        break;

    case EPslnCmdAppHelp:
    case EAknCmdHelp:// Fall trough
        CPslnFWBaseView::HandleCommandL(aCommand);
        break;

    default:
        iAppUi->HandleCommandL(aCommand);
        break;
    }
}

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::Container
//
// Return handle to container class.
// ----------------------------------------------------------------------------
//
CPslnActiveIdlePluginContainer* CPslnActiveIdlePlugin::Container()
{
    return static_cast<CPslnActiveIdlePluginContainer*>(iContainer);
}

// -----------------------------------------------------------------------------
// Checks is there a need to update the middle softkey label.
// This method should do nothing but MSK issues, since it is still called
// if the framework does not support MSK.
// -----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::CheckMiddleSoftkeyLabelL()
{
    CPslnActiveIdlePluginContainer* container = Container();
    TInt highlightedItem = iContainer->iListBox->CurrentItemIndex();

#ifdef _MY_DEBUG
    RDebug::Print(_L("XAI: CPslnActiveIdlePlugin::CheckMiddleSoftkeyLabelL highl = %d, curr = %d"), highlightedItem, container->GetCurrentlySelectedIndex());
#endif

    // First remove any previous commands.
    RemoveCommandFromMSK();

    if (highlightedItem >= 0 &&
        highlightedItem != container->GetCurrentlySelectedIndex())
    {
        // Activate:
        CPslnFWBaseView::SetMiddleSoftKeyLabelL(
            R_PSLN_MSK_ACTIVATE,
            EPslnCmdAppActivate);
    }
    else
    {
        CPslnFWBaseView::SetMiddleSoftKeyLabelL(
            R_PSLN_MSK_DUMMY,
            EPslnCmdEmptyCommand );
    }
}

// -----------------------------------------------------------------------------
// Return engine instance.
// -----------------------------------------------------------------------------
//
CPslnActiveIdlePluginEngine* CPslnActiveIdlePlugin::Engine()
    {
    return iEngine;
    }

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::DoActivateL
//
// First method called by the Avkon framwork to invoke a view.
// ----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::DoActivateL(
    const TVwsViewId& aPrevViewId,
    TUid aCustomMessageId,
    const TDesC8& aCustomMessage)
{
#ifdef MY_DEBUG
    RDebug::Print(_L("XAI: CPslnActiveIdlePlugin::DoActivateL"));
    RDebug::Print(_L("XAI:   aCustomMessageId = 0x%08x"), aCustomMessageId.iUid);
    RDebug::Print(_L("XAI:   aPrevViewId      = 0x%08x"), aPrevViewId.iAppUid.iUid);
#endif

    // If called from Psln - set tab group location.
    if (iAppUi->View(KPslnMainViewUid))
    {
        CPslnFWBaseView::SetNaviPaneL(KPslnActiveIdlePluginLocation);
    }

    CEikButtonGroupContainer* cba = Cba();

    if (cba)
    {
        if (aCustomMessageId == KUidActiveIdle)
        {
            cba->SetCommandSetL(R_SOFTKEYS_OPTIONS_EXIT_EMPTY);
        }
        else
        {
            cba->SetCommandSetL(R_SOFTKEYS_OPTIONS_BACK_EMPTY);
        }
        cba->DrawDeferred();
    }

    CPslnFWBaseView::DoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage);

    CheckMiddleSoftkeyLabelL();
    
    iEngine->ManualGetSkinsRestartL();
}

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::DoDeactivate
//
// Called by the Avkon view framework when closing.
// ----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::DoDeactivate()
{
#ifdef _MY_DEBUG
    RDebug::Print(_L("XAI: CPslnActiveIdlePlugin::DoDeactivate"));
#endif
    CPslnFWBaseView::DoDeactivate();
    RemoveCommandFromMSK();
}

// ----------------------------------------------------------------------------
// CPslnActiveIdlePlugin::DynInitMenuPaneL
//
//
// ----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::DynInitMenuPaneL(
    TInt aResourceId, CEikMenuPane* aMenuPane)
{
    if (aResourceId == R_PSLN_GEN_VIEW_MENUPANE &&
        aMenuPane)
    {
        // Since this is common resource it contains download,
        // set it off.
        aMenuPane->SetItemDimmed(EPslnCmdAppDownload, ETrue);

        CPslnActiveIdlePluginContainer* container = Container();
        TInt highlightedItem = iContainer->iListBox->CurrentItemIndex();
        // Remove Activate command, if highlighted item is already active.
        if (highlightedItem == container->GetCurrentlySelectedIndex())
        {
            aMenuPane->SetItemDimmed(EPslnCmdAppActivate, ETrue);
        }
    }
    else if (aResourceId == R_PSLN_AI_BASIC_MENUPANE &&
             aMenuPane)
    {
        if (!FeatureManager::FeatureSupported(KFeatureIdHelp))
        {
            // Disable help if not supported
            aMenuPane->SetItemDimmed(EPslnCmdAppHelp, ETrue);
        }
    }
}

// ---------------------------------------------------------------------------
// CPslnActiveIdlePlugin::NewContainerL()
//
// Creates new iContainer.
// ---------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::NewContainerL()
{
    if( !iContainer )
        {
        TBool isGSCalling = (NULL != iAppUi->View(KGSMainViewUid));
        iContainer = new (ELeave) CPslnActiveIdlePluginContainer(isGSCalling, this);
        iContainer->SetMiddleSoftkeyObserver(this);
        }

    RemoveCommandFromMSK();
}

// ---------------------------------------------------------------------------
// CPslnActiveIdlePlugin::HandleListBoxSelectionL()
//
// Handles events raised through a rocker key.
// ---------------------------------------------------------------------------
void CPslnActiveIdlePlugin::HandleListBoxSelectionL()
{
    TInt currentItem = iContainer->iListBox->CurrentItemIndex();
    CPslnFWBaseView::SetCurrentItem(currentItem);

    CPslnActiveIdlePluginContainer* container = Container();

    if (currentItem != container->GetCurrentlySelectedIndex())
    {
        HandleCommandL(EPslnCmdAppActivate);
    }
}

// -----------------------------------------------------------------------------
// Remove MSK command mappings.
// This method should do nothing but MSK issues.
// -----------------------------------------------------------------------------
//
void CPslnActiveIdlePlugin::RemoveCommandFromMSK()
{
    CEikButtonGroupContainer* cba = Cba();

    if (cba && iContainer)
    {
        cba->RemoveCommandFromStack(KPslnMSKControlId, EPslnCmdEmptyCommand);
        cba->RemoveCommandFromStack(KPslnMSKControlId, EPslnCmdAppActivate);
    }
}

// ---------------------------------------------------------------------------
// CPslnActiveIdlePlugin::SetTitlePaneL()
// 
// Gives resource ID to be used as plugin view title.
// ---------------------------------------------------------------------------
//  
void CPslnActiveIdlePlugin::SetTitlePaneL( TInt& aResourceId )
    {
#ifdef RD_CONTROL_PANEL
    aResourceId = R_PSLN_AI_LIST_VIEW_CAPTION;
#endif // RD_CONTROL_PANEL
    }

// End of File.