idlehomescreen/nativeuicontroller/src/aitoolbarrenderer.cpp
changeset 0 f72a12da539e
child 9 f966699dea19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/nativeuicontroller/src/aitoolbarrenderer.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,304 @@
+/*
+* 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
+*
+*/
+
+
+#include "aitoolbarrenderer.h"
+#include "aifweventhandler.h"
+#include "aicontentobserver.h"
+#include "activeidle2domaincrkeys.h"
+#include "activeidle2domainpskeys.h"
+#include "aiscutplugindomaincrkeys.h"
+#include <aipropertyextension.h>
+#include "ainativeuiplugins.h"
+
+#include <AiNativeUi.rsg>
+#include <akntoolbar.h>
+#include <aknbutton.h>
+#include <AknsUtils.h>
+#include <gulicon.h>
+#include <e32property.h>
+#include <aknappui.h>
+
+#include "centralrepository.h"
+
+
+#include "debug.h"
+
+using namespace AiNativeUiController;
+
+// 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;
+
+static TInt IndexLength( TInt aIndex )
+    {
+    TInt length = 0;
+
+    if ( aIndex < 0 )
+        {
+        ++length;
+        }
+
+    do
+        {
+        aIndex /= KRadix;
+        ++length;
+        }
+    while ( aIndex != 0 );
+
+    return length;
+    }
+
+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( MAiFwEventHandler& aAiFwEventHandler, CAknToolbar& aToolbar )
+    : iToolbar( aToolbar ),
+    iAiFwEventHandler( aAiFwEventHandler )
+
+    {
+    // no implementation required
+    }
+
+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* CAiToolbarRenderer::NewLC( MAiFwEventHandler& aAiFwEventHandler, CAknToolbar& aToolbar )
+    {
+    CAiToolbarRenderer* self = new (ELeave) CAiToolbarRenderer( aAiFwEventHandler, aToolbar );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    return self;
+    }
+
+CAiToolbarRenderer* CAiToolbarRenderer::NewL( MAiFwEventHandler& aAiFwEventHandler, CAknToolbar& aToolbar )
+    {
+    CAiToolbarRenderer* self = CAiToolbarRenderer::NewLC( aAiFwEventHandler, aToolbar );
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+CAiToolbarRenderer::~CAiToolbarRenderer()
+    {
+    // We don't want anymore events from toolbar
+    iToolbar.SetToolbarObserver( NULL );
+    iButtons.ResetAndDestroy();
+    }
+
+void CAiToolbarRenderer::DynInitToolbarL( TInt /*aResourceId*/, CAknToolbar* /*aToolbar*/ )
+    {
+    // do nothing
+    }
+
+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 );
+            }
+        }
+    }
+
+void CAiToolbarRenderer::DoPublishL( MAiPropertyExtension& aPlugin,
+                                     TInt aContent,
+                                     const TDesC16& aText,
+                                     TInt aIndex )
+    {
+    // Only interested on certain publish events
+    if (  aPlugin.PublisherInfoL()->iUid == KShortcutPluginUid &&
+          aContent == EAiScutContentShortcutToolbarCaption &&
+        ( aIndex == EAiScutToolbarFirst ||
+          aIndex == EAiScutToolbarSecond ||
+          aIndex == EAiScutToolbarThird )
+        )
+        {
+        CAiToolbarButton* button = ButtonL( aIndex );
+        if ( button )
+            {
+            button->SetTooltipL(aText);
+            iCommitted = EFalse;
+            }
+        }
+    }
+
+void CAiToolbarRenderer::DoPublishL( MAiPropertyExtension& aPlugin,
+                                     TInt aContent,
+                                     const TDesC8& aBuf,
+                                     TInt aIndex )
+    {
+    // Only interested on certain publish events
+    if (  aPlugin.PublisherInfoL()->iUid == 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);
+        }
+    }
+
+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;
+    }
+
+
+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.