idlefw/plugins/shortcutplugin/src/caiscutshortcutext.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:54:17 +0200
changeset 0 79c6a41cd166
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2005-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:  Shortcut plug-in shortcut extensions
*
*/


#include <aicontentobserver.h>
#include <gulicon.h>
#include <fbs.h>
#include <e32property.h>

#include "caiscutshortcutext.h"
#include "aiscutcontentmodel.h"
#include "caiscuttarget.h"
#include "caiscutengineext.h"
#include "PopupFSM.h"
#include "cpopupeventhandler.h"
#include "maiscutextdata.h"
#include "activeidle2domainpskeys.h"

#include "debug.h"


// P&S access policies
_LIT_SECURITY_POLICY_C1( KAiScutReadPolicy, ECapabilityReadDeviceData );
_LIT_SECURITY_POLICY_C1( KAiScutWritePolicy, ECapabilityWriteDeviceData );


// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
CAiScutShortcutExt* CAiScutShortcutExt::NewL(
    TInt aId, const TDesC& aTarget, CAiScutEngine& aEngine )
    {
    CAiScutShortcutExt* self = CAiScutShortcutExt::NewLC(
        aId, aTarget, aEngine );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
CAiScutShortcutExt* CAiScutShortcutExt::NewLC(
    TInt aId, const TDesC& aTarget, CAiScutEngine& aEngine )
    {
    CAiScutShortcutExt* self = new( ELeave ) CAiScutShortcutExt(
        aId, aEngine );
    CleanupStack::PushL( self );
    self->ConstructL( aTarget );
    return self;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
CAiScutShortcutExt::~CAiScutShortcutExt()
    {
    delete iPopupEventHandler;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
CAiScutShortcutExt::CAiScutShortcutExt( TInt aId, CAiScutEngine& aEngine )
    : CAiScutShortcut( aId, aEngine )//,
    //iPublishLineArray( EFalse )
    {
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CAiScutShortcutExt::ConstructL( const TDesC& aTarget )
    {
    iPopupEventHandler = CPopupEventHandler::NewL( *this );
    CAiScutShortcut::ConstructL( aTarget );

    RProperty::Define(
        KPSUidAiInformation,
        KActiveIdleThemeSupportsXsp,
        RProperty::EInt,
        KAiScutReadPolicy,
        KAiScutWritePolicy );
    RProperty::Set( KPSUidAiInformation, KActiveIdleThemeSupportsXsp, EPSAiXspNotSupported );
    }


// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
TPtrC CAiScutShortcutExt::ActiveTargetDefinition() const
    {
    if( iActiveTarget )
        {
        return iActiveTarget->Definition();
        }
    return KNullDesC();
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CAiScutShortcutExt::HandleAIEventL( TInt aEvent )
    {
    switch ( aEvent )
        {
        case EAiScutEventLoseFocus:
            {
            iPopupEventHandler->PopupFSM().HandleLostFocus();
            break;
            }
        case EAiScutEventGainFocus:
            {
            iPopupEventHandler->PopupFSM().HandleGotFocus();
            break;
            }
        default:
            {
            break;
            }
        }
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CAiScutShortcutExt::HandleResumed( TAiTransitionReason aResumeReason )
    {
    switch( aResumeReason )
        {
        case EAiIdleBackground:
            {
            iPopupEventHandler->PopupFSM().HandleBackground();
            break;
            }
        case EAiIdleForeground:
            {
            // Handleforeground() calls unnecessary publishes in case nothing
            // has changed. 
            if ( iTextChanged || iIconChanged )
                {
                iPopupEventHandler->PopupFSM().HandleForeground();
                }
            break;
            }
        default:
            {
            break;
            }
        }
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CAiScutShortcutExt::SetAiScutExtData(
    const MAiScutExtData* aAiScutExtData )
    {
    iAiScutExtData = aAiScutExtData;

    const MDesCArray* newPopupLineArray =
        aAiScutExtData ? aAiScutExtData->PopupLineArray() : NULL;
    const CGulIcon* newIcon =
        aAiScutExtData ? aAiScutExtData->Icon() : NULL;
        
    if( iPreviousPopupLineArray != newPopupLineArray &&
        newPopupLineArray )
        {
        iTextChanged = ETrue;
        iPopupEventHandler->PopupFSM().HandleUpdate();        
        }
    else if( iPreviousPopupLineArray && !newPopupLineArray )
        {
        iTextChanged = ETrue;
        iPopupEventHandler->PopupFSM().HandleReset();
        }

    if( iPreviousIcon != newIcon )
        {
        iIconChanged = ETrue;
        CAiScutEngineExt& engine = static_cast< CAiScutEngineExt& > ( iEngine );
        engine.CheckAccessAndPublish( *this );
        }

    iPreviousPopupLineArray = newPopupLineArray;
    iPreviousIcon = newIcon;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CAiScutShortcutExt::PublishL(
    MAiPropertyExtension& aPlugin, MAiContentObserver& aObserver )
    {
    if( iLastPublishedTarget && iActiveTarget &&
        iLastPublishedTarget->Definition() != iActiveTarget->Definition() )
        {
        iAiScutExtData = NULL;
        iPopupEventHandler->PopupFSM().HandleReset();
        }

    if( aObserver.CanPublish(
        aPlugin, KAiScutContent[EAiScutContentPopupTextFirstLine].id, iId) &&
        aObserver.CanPublish(
        aPlugin, KAiScutContent[EAiScutContentPopupTextSecondLine].id, iId) &&
        aObserver.CanPublish(
        aPlugin, KAiScutContent[EAiScutContentPopupTextThirdLine].id, iId) )
        {
        PublishPopupText( aPlugin, aObserver );
        RProperty::Set( KPSUidAiInformation, KActiveIdleThemeSupportsXsp, EPSAiXspIsSupported );
        }

    CAiScutShortcut::PublishL( aPlugin, aObserver );
    iTextChanged = EFalse;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
TInt CAiScutShortcutExt::PublishCaption(
    MAiPropertyExtension& aPlugin, MAiContentObserver& aObserver,
    TInt aCaptionContentId ) const
    {
    if( iPopupEventHandler->PublishCaption() )
        {
        if( !iPopupEventHandler->CaptionVisible() )
            {
            return aObserver.Clean( aPlugin, aCaptionContentId, iId );
            }
        else
            {
            return CAiScutShortcut::PublishCaption(
                aPlugin, aObserver, aCaptionContentId );
            }
        }
    else
        {
        return CAiScutShortcut::PublishCaption(
            aPlugin, aObserver, aCaptionContentId );
        }
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CAiScutShortcutExt::PublishPopupText(
    MAiPropertyExtension& aPlugin, MAiContentObserver& aObserver ) const
    {
    if( iPopupEventHandler->PublishPopup() )
        {
        TAiScutContentIds popupTextContentIds[] =
            {
            EAiScutContentPopupTextFirstLine,
            EAiScutContentPopupTextSecondLine,
            EAiScutContentPopupTextThirdLine
            };
        const TInt idCount =
            sizeof( popupTextContentIds ) / sizeof( TAiScutContentIds );

        TInt err = KErrNone;

        //iLineArray is set or reset via xSP API. iPublishLineArray is controlled
        //by state machine in iPopupEventHandler
        if( iAiScutExtData && iAiScutExtData->PopupLineArray() &&
            iPopupEventHandler->PopupVisible() )
            {
            //Publish caption line in popup text box
            TPtrC captionDes;
            TInt captionResId = iActiveTarget->GetCaption( captionDes, EAiScutLongTitle );

            if ( captionResId == 0 )
                {
                // Publish descriptor
                err = aObserver.Publish( aPlugin,
                    KAiScutContent[ EAiScutContentPopupTextCaptionLine ].id,
                    captionDes, iId );
                if( err != KErrNone )
                    {
                    __PRINT( __DBG_FORMAT( "XAI:   publish Popup caption text err = %d" ), err );
                    }
                }
            else if ( captionResId > 0 )
                {
                // Publish resource
                err = aObserver.Publish( aPlugin,
                    KAiScutContent[ EAiScutContentPopupTextCaptionLine ].id,
                    captionResId, iId );
                if( err != KErrNone )
                    {
                    __PRINT( __DBG_FORMAT( "XAI:   publish Popup caption text (resource) err = %d" ), err );
                    }
                }

            const MDesCArray& lineArray = *iAiScutExtData->PopupLineArray();
            TInt numberOfLines = lineArray.MdcaCount();
            //Iterate each popup text content and either publish or clean it
            //depending on the number or lines in iLineArray
            for( TInt i = 0; i < idCount; i++ )
                {
                if( numberOfLines > i )
                    {
                    err = aObserver.Publish( aPlugin,
                        KAiScutContent[ popupTextContentIds[ i ] ].id,
                        lineArray.MdcaPoint( i ), iId );
                    if( err != KErrNone )
                        {
                        __PRINT( __DBG_FORMAT( "XAI:   publish Popup text err = %d" ), err );
                        }
                    }
                else
                    {
                    err = aObserver.Clean( aPlugin,
                        KAiScutContent[ popupTextContentIds[ i ] ].id, iId );
                    if( err != KErrNone )
                        {
                        __PRINT( __DBG_FORMAT( "XAI:   clean Popup text err = %d" ), err );
                        }
                    }
                }
            }
        else
            {
            //Clean each popup text content
            for( TInt i = 0; i < idCount; i++ )
                {
                err = aObserver.Clean( aPlugin,
                    KAiScutContent[ popupTextContentIds[ i ] ].id, iId );
                if ( err != KErrNone )
                    {
                    __PRINT( __DBG_FORMAT( "XAI:   clean Popup text err = %d" ), err );
                    }
                }
            }
        }
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
TInt CAiScutShortcutExt::PublishIcon( MAiPropertyExtension& aPlugin,
    MAiContentObserver& aObserver, TInt aIconContentId )
    {
    if( aIconContentId == KAiScutContent[EAiScutContentShortcutIcon].id && 
		iAiScutExtData && iAiScutExtData->Icon() )
        {
        const CGulIcon& icon = *iAiScutExtData->Icon();
        CGulIcon* duplicatedIcon = NULL;
        TRAP_IGNORE(
            CFbsBitmap* bitmap = new( ELeave ) CFbsBitmap();
            CleanupStack::PushL( bitmap );
            CFbsBitmap* mask   = new( ELeave ) CFbsBitmap();
            CleanupStack::PushL( mask );

            User::LeaveIfError( bitmap->Duplicate( icon.Bitmap()->Handle() ) );
            User::LeaveIfError( mask->Duplicate( icon.Mask()->Handle() ) );

            duplicatedIcon = CGulIcon::NewL( bitmap, mask );

            CleanupStack::Pop( 2, bitmap );
            );

        if( duplicatedIcon )
            {
            TInt err = aObserver.PublishPtr( aPlugin,
                aIconContentId, duplicatedIcon, iId );
            if( err != KErrNone )
                {
                delete duplicatedIcon;
                }
            return err;
            }
        }
    
    TInt err = CAiScutShortcut::PublishIcon( aPlugin, aObserver, aIconContentId );
    iIconChanged = EFalse;
    return err;
    }

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
//
void CAiScutShortcutExt::IssuePublishShortcut()
    {
//    iPublishLineArray = aVisiblePopup;
    CAiScutEngineExt& engine = static_cast< CAiScutEngineExt& >( iEngine );
    engine.CheckAccessAndPublish( *this );
    }


// End of File.