--- /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 <centralrepository.h>
+#include <akntoolbar.h>
+#include <aknbutton.h>
+#include <AknsUtils.h>
+#include <gulicon.h>
+#include <e32property.h>
+#include <aknappui.h>
+
+// User includes
+#include <hscontentpublisher.h>
+#include <hspublisherinfo.h>
+#include "aitoolbarrenderer.h"
+#include "aifweventhandler.h"
+#include "aicontentobserver.h"
+#include "activeidle2domaincrkeys.h"
+#include "activeidle2domainpskeys.h"
+#include "aiscutplugindomaincrkeys.h"
+
+#include "ainativeuiplugins.h"
+
+#include <AiNativeUi.rsg>
+#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<CGulIcon>( 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.