idlehomescreen/nativeuicontroller/src/aistatuspanetouchui.cpp
branchRCL_3
changeset 83 5456b4e8b3a8
child 88 3321d3e205b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/nativeuicontroller/src/aistatuspanetouchui.cpp	Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,364 @@
+/*
+* 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:  Choice list.
+*
+*/
+
+// System includes
+#include <AknLayout2ScalableDef.h>
+#include <aknstyluspopupmenu.h>
+#include <AknUtils.h>
+#include <aknnavide.h>
+#include <akntitle.h>
+#include <MProfileEngine.h>
+#include <viewcli.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#ifdef RD_TACTILE_FEEDBACK
+#include <touchfeedback.h>
+#endif
+#include <hscontentpublisher.h>
+#include <hspublisherinfo.h>
+#include <aidevicestatuscontentmodel.h>
+#include <AiNativeUi.rsg>
+
+// User includes
+#include "aistrcnv.h"
+#include "aistatuspanetouchui.h"
+#include "aistatuspanel.h"
+#include "ainativeuiplugins.h"
+#include "aifweventhandler.h"
+#include "aiconsts.h"
+
+using namespace AiNativeUiController;
+
+// Constants
+_LIT( KProfileSwitchByIndexEvent, "Profile/SwitchProfileByIndex" );
+const TInt KProfileSwitchByIndexEventLength = 28;
+const TInt KRadix = 10;
+const TText16 KEventParameterTerminator = ')';
+const TInt KExtraItems = 2;
+const TInt KStylusMenuMaxItemsDefault = 0;
+
+_LIT( KOpenAppProfiles, "Shortcut/LaunchByValue(localapp:0x100058F8)" );
+_LIT( KOpenAppCalendar, "Shortcut/LaunchByValue(localapp:0x10005901)" );
+
+// ======== LOCAL FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// IndexLength()
+//
+// ----------------------------------------------------------------------------
+//
+static TInt IndexLength( TInt aIndex )
+    {
+    TInt length = 0;
+
+    if ( aIndex < 0 )
+         {
+         ++length;
+         }
+
+    do
+      {
+        aIndex /= KRadix;
+        ++length;
+        }
+    while ( aIndex != 0 );
+    return length;
+  }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::NewL()
+//
+// ----------------------------------------------------------------------------
+//
+CAiStatusPaneTouchUi* CAiStatusPaneTouchUi::NewL( CAiStatusPanel& aStatusPanel,
+    MAiFwEventHandler& aEventHandler )
+    {
+    CAiStatusPaneTouchUi* self = 
+        CAiStatusPaneTouchUi::NewLC( aStatusPanel, aEventHandler );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::NewLC()
+//
+// ----------------------------------------------------------------------------
+//
+CAiStatusPaneTouchUi* CAiStatusPaneTouchUi::NewLC( CAiStatusPanel& aStatusPanel,
+    MAiFwEventHandler& aEventHandler )
+    {
+    CAiStatusPaneTouchUi* self = 
+        new ( ELeave ) CAiStatusPaneTouchUi( aStatusPanel, aEventHandler );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::CAiStatusPaneTouchUi()
+//
+// ----------------------------------------------------------------------------
+//
+CAiStatusPaneTouchUi::CAiStatusPaneTouchUi( CAiStatusPanel& aStatusPanel,
+    MAiFwEventHandler& aEventHandler )
+    : iStatusPane( aStatusPanel ), iEventHandler( aEventHandler )
+    {
+    // no implementation required
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::~CAiStatusPaneTouchUi()
+//
+// ----------------------------------------------------------------------------
+//
+CAiStatusPaneTouchUi::~CAiStatusPaneTouchUi()
+    {
+    delete iEventBuffer;
+    delete iMenu;
+    iProfileNamePointerArray.ResetAndDestroy();
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::ConstructL()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiStatusPaneTouchUi::ConstructL()
+    {
+    if( AknLayoutUtils::PenEnabled() )
+        {
+        iStatusPane.SetNaviDecoratorObserver( this );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::LoadUIDefinitionL()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiStatusPaneTouchUi::LoadUIDefinitionL()
+    {
+    // If profile popup exists, for example, when screendevicechange occurs,
+    // the popup is closed
+    if( iMenu )
+        {
+        delete iMenu;
+        iMenu = NULL;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::ProcessCommandL()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiStatusPaneTouchUi::ProcessCommandL( TInt aCommandId )
+    {
+    if( aCommandId == EAIGotoCalendarCmdLink )
+      {
+      //Open calendar application
+      iEventHandler.HandlePluginEvent( KOpenAppCalendar );
+      }
+    else if( aCommandId == EAIShowAllProfileCmdLink )
+      {
+      //Open profile application
+      iEventHandler.HandlePluginEvent( KOpenAppProfiles );
+      }
+    else
+      {
+
+    // Calculate event buffer length
+      TInt length = KProfileSwitchByIndexEventLength
+                    + KPluginEventSeparatorLength
+                  + IndexLength( aCommandId - EAIProfileCmdLink )
+                    + KEventParameterSeparatorLength;
+
+        // Allocate event buffer
+        TPtr event = AiUtility::EnsureBufMaxLengthL( iEventBuffer, length );
+
+        // Create event string
+        event.Zero();
+        event.Append( KProfileSwitchByIndexEvent );
+        event.Append( KEventParameterSeparator );
+        event.AppendNum( aCommandId - EAIProfileCmdLink );
+        event.Append( KEventParameterTerminator );
+
+      iEventHandler.HandlePluginEvent( event );
+      }
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::HandleNaviDecoratorEventL()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiStatusPaneTouchUi::HandleNaviDecoratorEventL( TInt aEventID )
+    {
+    if( aEventID == EAknNaviDecoratorEventNaviLabel )
+        {
+#ifdef RD_TACTILE_FEEDBACK
+        MTouchFeedback* feedback = MTouchFeedback::Instance();
+        if ( feedback )
+            {
+            feedback->InstantFeedback( ETouchFeedbackBasic );
+            }
+#endif
+
+        TBool isShowAllProfilesItem = EFalse;
+        TInt count = iProfileNamePointerArray.Count();
+
+        if ( !count )
+            {
+            //profile plugin is not ready!
+            return;
+            }
+
+        TInt aiStylusMenuMaxItems = KStylusMenuMaxItemsDefault;
+        TPoint tapPoint(0,0);
+        TRect clientRect;
+        TRect naviRect;
+
+        // Check screen sizes
+        TInt isMainPane = AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, clientRect );
+        TInt isNaviPane = AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::ENaviPane, naviRect );
+
+        // Calculating how many items fits into menu, using font height
+        TAknLayoutText layoutText;
+        layoutText.LayoutText( naviRect,
+                AknLayoutScalable_Avkon::list_single_touch_menu_pane_t1().LayoutLine());
+
+        TInt txtHeight = layoutText.Font()->HeightInPixels();
+        // More additional space for marginals
+        txtHeight += txtHeight + txtHeight/2;
+
+        if( isNaviPane )
+            {
+            if ( AknLayoutUtils::LayoutMirrored() )
+                {
+                tapPoint.SetXY( naviRect.iBr.iX, naviRect.iBr.iY );
+                }
+            else
+                {
+                tapPoint.SetXY( naviRect.iTl.iX, naviRect.iBr.iY );
+                }
+            }
+
+        if ( iMenu )
+            {
+            delete iMenu;
+            iMenu = NULL;
+            }
+
+        iMenu = CAknStylusPopUpMenu::NewL( this, tapPoint );
+
+        if( isMainPane )
+            {
+            // Count how many menu items would fit into screen
+            aiStylusMenuMaxItems = clientRect.Height() / txtHeight;
+            }
+
+            HBufC* caleText = StringLoader::LoadLC( R_IDLE_NAVI_TAPPED_CALE );
+            iMenu->AddMenuItemL( *caleText, EAIGotoCalendarCmdLink );
+            CleanupStack::PopAndDestroy( caleText );
+            count++;
+
+      // Space for 2 extra items GotoCalendar and ShowAllProfiles
+      if( count > aiStylusMenuMaxItems )
+    	  {
+    	  count = aiStylusMenuMaxItems - KExtraItems;
+            isShowAllProfilesItem = ETrue;
+            }
+        else
+            {
+    	  count -= 1;
+            }
+
+        for( TInt i = 0; i < count; i++ )
+            {
+            iMenu->AddMenuItemL( iProfileNamePointerArray[i]->Des(), i + EAIProfileCmdLink );
+            }
+
+        if( isShowAllProfilesItem )
+            {
+            HBufC* allProfilesText = StringLoader::LoadLC( R_IDLE_NAVI_TAPPED_ALL_PROF );
+            iMenu->AddMenuItemL( *allProfilesText, EAIShowAllProfileCmdLink );
+            CleanupStack::PopAndDestroy( allProfilesText );
+            }
+
+        iMenu->ShowMenu();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::DoPublishL()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiStatusPaneTouchUi::DoPublishL( CHsContentPublisher& aPlugin,
+    TInt aContent, const TDesC16& aText, TInt aIndex )
+    {
+    const THsPublisherInfo& info( aPlugin.PublisherInfo() );
+    
+    if( info.Uid() == KProfilePluginUid )
+      {
+      switch( aContent )
+        {
+        case EAiProfileContentProfileName:
+        {
+        if( aIndex - 1 == 0  )
+          {
+          iProfileNamePointerArray.ResetAndDestroy();
+          }
+
+        TInt count = iProfileNamePointerArray.Count();
+
+        if( count >= aIndex  )
+          {
+          delete iProfileNamePointerArray[ aIndex - 1 ];
+          iProfileNamePointerArray.Remove( aIndex - 1);
+          }
+
+        HBufC* name = aText.AllocL();
+        iProfileNamePointerArray.Insert( name, aIndex - 1 );
+        break;
+        }
+        default:
+          {
+          break;
+          }
+        };
+      }
+
+    else
+      {
+      User::Leave( KErrNotFound );
+      }
+    }
+
+// ----------------------------------------------------------------------------
+// CAiStatusPaneTouchUi::SetEmphasis()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiStatusPaneTouchUi::SetEmphasis( CCoeControl* /*aMenuControl*/, 
+    TBool /*aEmphasis*/ )
+    {
+    }
+
+// End of file