idlehomescreen/nativeuicontroller/src/aitoolbarrenderer.cpp
branchRCL_3
changeset 83 5456b4e8b3a8
child 88 3321d3e205b6
--- /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.