diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/nativeuicontroller/src/aitoolbarrenderer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/nativeuicontroller/src/aitoolbarrenderer.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,378 @@ +/* +* 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: Touch Toolbar +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include +#include +#include "aitoolbarrenderer.h" +#include "aifweventhandler.h" +#include "aicontentobserver.h" +#include "activeidle2domaincrkeys.h" +#include "activeidle2domainpskeys.h" +#include "aiscutplugindomaincrkeys.h" + +#include "ainativeuiplugins.h" + +#include +#include "debug.h" + +using namespace AiNativeUiController; + +// Constants +// Action to send to framework +_LIT( KOpenAppByIndex, "Shortcut/LaunchByIndex(%d)" ); +_LIT( KOpenAppByIndexAlternate, "Shortcut/LaunchByIndexAlternate(%d)"); + +const TInt KOpenAppByIndexParameterLength = 2; + +const TInt KFirstButton = 0; +const TInt KSecondButton = 1; +const TInt KThirdButton = 2; + +const TInt KRadix = 10; + +// ======== LOCAL FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// IndexLength() +// +// ---------------------------------------------------------------------------- +// +static TInt IndexLength( TInt aIndex ) + { + TInt length = 0; + + if ( aIndex < 0 ) + { + ++length; + } + + do + { + aIndex /= KRadix; + ++length; + } + while ( aIndex != 0 ); + + return length; + } + +// ---------------------------------------------------------------------------- +// CreateEventStringL() +// +// ---------------------------------------------------------------------------- +// +static HBufC* CreateEventStringL( const TDesC& aFrom, TInt aEventIndex ) + { + HBufC* buffer = NULL; + + TInt bufferLength = aFrom.Length() - + KOpenAppByIndexParameterLength + + IndexLength( aEventIndex ); + + buffer = HBufC::NewL(bufferLength); + + TPtr bufferPtr = buffer->Des(); + bufferPtr.Format( aFrom, aEventIndex ); + + return buffer; + } + +// ======== MEMBER FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::CAiToolbarRenderer() +// +// ---------------------------------------------------------------------------- +// +CAiToolbarRenderer::CAiToolbarRenderer( MAiFwEventHandler& aAiFwEventHandler, + CAknToolbar& aToolbar ) + : iToolbar( aToolbar ), + iAiFwEventHandler( aAiFwEventHandler ) + { + // no implementation required + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::ConstructL() +// +// ---------------------------------------------------------------------------- +// +void CAiToolbarRenderer::ConstructL( ) + { + iToolbarEnabled = EFalse; + + TInt err = KErrNone; + + CRepository *cr = CRepository::NewLC( TUid::Uid( KCRUidActiveIdleLV ) ); + err = cr->Get( KAITouchToolbarVisible, iToolbarEnabled ); + CleanupStack::PopAndDestroy( cr ); + __PRINT (__DBG_FORMAT("XAI: Toolbar value in cenrep %d err = %d"), iToolbarEnabled , err); + + // Hide the toolbar because it is disabled via cenrep + if ( err != KErrNone || !iToolbarEnabled ) + { + iToolbar.SetToolbarObserver( NULL ); + iToolbar.SetToolbarVisibility( EFalse, EFalse ); + } + else + { + iToolbar.SetToolbarObserver( this ); + iToolbar.SetToolbarVisibility( ETrue, EFalse ); + } + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::NewLC() +// +// ---------------------------------------------------------------------------- +// +CAiToolbarRenderer* CAiToolbarRenderer::NewLC( + MAiFwEventHandler& aAiFwEventHandler, CAknToolbar& aToolbar ) + { + CAiToolbarRenderer* self = + new ( ELeave ) CAiToolbarRenderer( aAiFwEventHandler, aToolbar ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::NewL() +// +// ---------------------------------------------------------------------------- +// +CAiToolbarRenderer* CAiToolbarRenderer::NewL( + MAiFwEventHandler& aAiFwEventHandler, CAknToolbar& aToolbar ) + { + CAiToolbarRenderer* self = + CAiToolbarRenderer::NewLC( aAiFwEventHandler, aToolbar ); + CleanupStack::Pop(); // self + return self; + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::~CAiToolbarRenderer() +// +// ---------------------------------------------------------------------------- +// +CAiToolbarRenderer::~CAiToolbarRenderer() + { + // We don't want anymore events from toolbar + iToolbar.SetToolbarObserver( NULL ); + iButtons.ResetAndDestroy(); + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::DynInitToolbarL() +// +// ---------------------------------------------------------------------------- +// +void CAiToolbarRenderer::DynInitToolbarL( TInt /*aResourceId*/, + CAknToolbar* /*aToolbar*/ ) + { + // do nothing + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::OfferToolbarEventL() +// +// ---------------------------------------------------------------------------- +// +void CAiToolbarRenderer::OfferToolbarEventL( TInt aCommand ) + { + TInt modifiers = iToolbar.EventModifiers(); + + if ( aCommand >= 0 && aCommand < iButtons.Count()) + { + CAiToolbarButton* button = iButtons[aCommand]; + + if ( button ) + { + HBufC *event = NULL; + + if ( modifiers == CAknToolbar::ELongPress ) + { + event = CreateEventStringL( + KOpenAppByIndexAlternate, button->ShortcutId() ); + + CleanupStack::PushL( event ); + } + else + { + event = CreateEventStringL( + KOpenAppByIndex, button->ShortcutId() ); + + CleanupStack::PushL( event ); + } + + iAiFwEventHandler.HandlePluginEvent( *event ); + CleanupStack::PopAndDestroy( event ); + } + } + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::DoPublishL() +// +// ---------------------------------------------------------------------------- +// +void CAiToolbarRenderer::DoPublishL( CHsContentPublisher& aPlugin, + TInt aContent, const TDesC16& aText, TInt aIndex ) + { + const THsPublisherInfo& info( aPlugin.PublisherInfo() ); + + // Only interested on certain publish events + if ( info.Uid() == KShortcutPluginUid && + aContent == EAiScutContentShortcutToolbarCaption && + ( aIndex == EAiScutToolbarFirst || + aIndex == EAiScutToolbarSecond || + aIndex == EAiScutToolbarThird ) + ) + { + CAiToolbarButton* button = ButtonL( aIndex ); + if ( button ) + { + button->SetTooltipL(aText); + iCommitted = EFalse; + } + } + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::DoPublishL() +// +// ---------------------------------------------------------------------------- +// +void CAiToolbarRenderer::DoPublishL( CHsContentPublisher& aPlugin, + TInt aContent, const TDesC8& aBuf, TInt aIndex ) + { + const THsPublisherInfo& info( aPlugin.PublisherInfo() ); + + // Only interested on certain publish events + if ( info.Uid() == KShortcutPluginUid && + aContent == EAiScutContentShortcutToolbarIcon && + ( aIndex == EAiScutToolbarFirst || + aIndex == EAiScutToolbarSecond || + aIndex == EAiScutToolbarThird ) + ) + { + CGulIcon* icon = MAiContentObserver::UnpackPtr( aBuf ); + CAiToolbarButton* button = NULL; + if ( !icon ) + { + User::Leave(KErrArgument); + } + // Replace the old button with a new button + button = ButtonL( aIndex ); + if ( button ) + { + button->SetIcon(icon); + iCommitted = EFalse; + } + // icons ownership is transferred to us + // so we need to delete the icon in error situations + else + { + delete icon; + } + } + else + { + // We have received stuff we cannot publish. + User::Leave(KErrNotFound); + } + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::ButtonL() +// +// ---------------------------------------------------------------------------- +// +CAiToolbarButton* CAiToolbarRenderer::ButtonL( TInt aShortcutId ) + { + TInt index = KErrNotFound; + CAiToolbarButton *button = NULL; + switch ( aShortcutId ) + { + case EAiScutToolbarFirst: + index = KFirstButton; + break; + case EAiScutToolbarSecond: + index = KSecondButton; + break; + case EAiScutToolbarThird: + index = KThirdButton; + break; + default: + break; + } + + if ( index == KErrNotFound ) + { + User::Leave(KErrNotFound); + } + // No button yet => Create new + if ( index >= iButtons.Count() ) + { + button = CAiToolbarButton::NewL(); + button->SetShortcutId( aShortcutId ); + iButtons.Append( button ); + } + + // Use the old button + else if( index >= KFirstButton && index < iButtons.Count() ) + { + button = iButtons[index]; + button->SetShortcutId( aShortcutId ); + } + return button; + } + +// ---------------------------------------------------------------------------- +// CAiToolbarRenderer::TransactionCommittedL() +// +// ---------------------------------------------------------------------------- +// +void CAiToolbarRenderer::TransactionCommittedL() + { + if ( !iCommitted ) + { + for ( TInt i = 0; i < iButtons.Count(); i++ ) + { + CAiToolbarButton *button = iButtons[i]; + if ( button && button->Icon()) + { + // remove the old button + iToolbar.RemoveItem(i); + // and add new one + // transfers ownership of button->ButtonL() to toolbar + iToolbar.AddItemL( button->ButtonL(), EAknCtButton, i, 0, i ); + } + } + iCommitted = ETrue; + } + } + +// End of File.