bluetoothengine/btui/Ecom/src/BTUIMainContainer.cpp
branchRCL_3
changeset 56 9386f31cc85b
parent 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btui/Ecom/src/BTUIMainContainer.cpp	Wed Sep 01 12:20:04 2010 +0100
@@ -0,0 +1,466 @@
+/*
+* Copyright (c) 2006-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:   This is the implementation of main container. It contains 
+*				  all necessary AVKON components and handles user inputs.
+*
+*/
+
+#include <e32base.h>
+#include <centralrepository.h> 
+#include <barsread.h>   // Resource reader
+#include <BtuiViewResources.rsg>     // Compiled resource ids
+#include <btfeaturescfg.h>					// For EnterpriseEnablementL()
+#include "BTUIMainContainer.h"
+#include "debug.h"      // Global declarations
+#include "btui.h"
+#ifdef __SERIES60_HELP
+#include <csxhelp/bt.hlp.hrh>   // Help ids
+#endif
+
+// ---------------------------------------------------------
+// CBTUIMainContainer::ConstructL
+// Symbian OS 2nd phase constructor can leave
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::ConstructL(const TRect& aRect, CBTUIMainView* aMainView )
+    {
+    TRACE_FUNC_ENTRY
+
+    CreateWindowL();
+
+	iMainView = aMainView;
+	
+    // Check if listbox is empty
+    __ASSERT_DEBUG(iBtMainListBox==0, PANIC( EBTMainListNotEmpty ));
+    __ASSERT_DEBUG(iBtAllItemsArray==0, PANIC( EBTAllFormatStingsArrayNotEmpty ));
+    __ASSERT_DEBUG(iBtListItemArray==0, PANIC( EBTFormatStingsArrayNotEmpty ));
+
+    // Create main itemlist
+    iBtMainListBox = new (ELeave) CAknSettingStyleListBox;
+    iBtMainListBox->SetContainerWindowL( *this );
+    iBtMainListBox->ConstructL( this, EAknListBoxMarkableList );
+
+
+    // Update settings from original sources via model    
+    iBtEngSettingsRef = iMainView->GetBtSettingsReference();    
+        
+    __ASSERT_DEBUG(iBtEngSettingsRef!=0, PANIC(EBTPanicIllegalValue));
+        
+    // Read all format strings from resources and create array for them
+    iBtAllItemsArray = iCoeEnv->ReadDesCArrayResourceL( R_BT_LABEL_STRINGS );
+    iBtListItemArray = new (ELeave) TMainListItemArray( 
+      iBtAllItemsArray, aMainView, iBtEngSettingsRef );
+
+    // Set up/down arrows at bottom of the screen (scrollbar)
+    iBtMainListBox->CreateScrollBarFrameL( ETrue );
+    iBtMainListBox->ScrollBarFrame()->SetScrollBarVisibilityL( 
+      CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto );
+
+    // Set text labels for list items again (overwriting resource definitions)
+    iBtMainListBox->Model()->SetItemTextArray( iBtListItemArray );
+    iBtMainListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );   // Does not delete items array
+
+    // Set up the observer (events listener)
+    iBtMainListBox->SetListBoxObserver( this );
+
+    
+    
+    SetRect(aRect);
+    ActivateL();    
+
+    TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+CBTUIMainContainer::~CBTUIMainContainer()
+    {
+	TRACE_FUNC_ENTRY		   
+    delete iBtMainListBox;
+    delete iBtAllItemsArray;
+    delete iBtListItemArray;
+	TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------
+// CBTUIMainContainer::SizeChanged()
+// From CCoeControl
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::SizeChanged()
+    {
+	TRACE_FUNC_ENTRY    
+    iBtMainListBox->SetRect(Rect());    // Mandatory, otherwise not drawn
+    }
+
+// ---------------------------------------------------------
+// From CCoeControl
+// CBTUIMainContainer::CountComponentControls() const
+// ---------------------------------------------------------
+//
+TInt CBTUIMainContainer::CountComponentControls() const
+    {
+	TRACE_FUNC_ENTRY    
+	if(iBtMainListBox )
+    	return  1;
+    else
+    	return  0; // return nbr of controls inside this container
+    }
+
+// ---------------------------------------------------------
+// From CCoeControl
+// CBTUIMainContainer::ComponentControl(TInt aIndex) const
+// ---------------------------------------------------------
+//
+CCoeControl* CBTUIMainContainer::ComponentControl(TInt aIndex) const
+    {
+    TRACE_FUNC_ENTRY
+    if( aIndex ==0 )
+    	{
+    	return iBtMainListBox;
+    	}
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// From CCoeControl
+// CBTUIMainContainer::Draw
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::Draw(const TRect& /* aRect */) const
+    {
+    }
+
+// ---------------------------------------------------------
+// From CoeControl
+// CBTUIMainContainer::HandleControlEventL
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::HandleControlEventL( CCoeControl* /* aControl */, TCoeEvent /* aEventType */)
+    {
+    }
+
+// ---------------------------------------------------------
+// From CoeControl
+// CBTUIMainContainer::OfferKeyEventL
+// Redirect keypresses to the listbox
+// ---------------------------------------------------------
+//
+TKeyResponse CBTUIMainContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
+    {
+	TRACE_FUNC_ENTRY    
+    if(( iBtMainListBox ) && ( aKeyEvent.iCode != EKeyLeftArrow ) 
+      && (aKeyEvent.iCode != EKeyRightArrow ))
+        {
+        TKeyResponse res = iBtMainListBox->OfferKeyEventL( aKeyEvent, aType );
+        
+        // Store current item index for options list usage later
+        //
+        iCurrentItemIndex = iBtMainListBox->CurrentItemIndex();
+        return res;
+        }
+    return EKeyWasNotConsumed;
+    }
+
+// ---------------------------------------------------------
+// From MEikListBoxObserver 
+// CBTUIMainContainer::HandleListBoxEventL
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType)
+    {
+	TRACE_FUNC_ENTRY
+	
+    __ASSERT_DEBUG(iMainView!=0, PANIC(EBTPanicIllegalValue));
+
+	// this is no longer called, unless MSK is disabled.
+	// if msk is not disabled, then  
+	// BTMainView::HandleCommand(EBTUICmdMSK) is called instead
+    if( aEventType == EEventEnterKeyPressed
+    || aEventType == EEventItemSingleClicked ) // Selection key pressed, or item clicked
+        {
+        TInt currentHighLightPosition = aListBox->CurrentItemIndex();
+        switch(currentHighLightPosition)
+            {
+            case EBTMainListItemPowerMode:
+                iMainView->HandleCommandL( EBTUICmdChangePowerStateSelect );
+                break;
+            case EBTMainListItemVisibilityMode:
+                iMainView->HandleCommandL( EBTUICmdChangeVisibilitySelect );
+                break;
+            case EBTMainListItemNameSetting:
+                iMainView->HandleCommandL( EBTUICmdChangeBTNameSelect );
+                break;
+                
+			// For Bluetooth SIM Access Profile feature
+			//
+			case EBTMainListItemSapMode:
+				iMainView->HandleCommandL( EBTUICmdChangeSapStateSelect );
+				break;
+            default:
+                break;
+            }
+        aListBox->DrawItem(currentHighLightPosition);   // Redraw item only to the screen
+        }
+    }
+
+// ----------------------------------------------------
+// From CEikListBox 
+// CBTUIMainContainer::CurrentItemIndex
+// ----------------------------------------------------
+//
+TInt CBTUIMainContainer::CurrentItemIndex()
+    {
+	TRACE_FUNC_ENTRY
+
+    return iBtMainListBox->CurrentItemIndex();
+    }
+
+// ----------------------------------------------------
+// CBTUIMainContainer::SettingChangedL
+// ----------------------------------------------------
+//
+void CBTUIMainContainer::SettingChanged( TBTMainListItemIndexes /* aListItem */ )
+    {
+	TRACE_FUNC_ENTRY
+
+    iBtMainListBox->DrawDeferred();
+    }    
+    
+#ifdef __SERIES60_HELP
+
+// ---------------------------------------------------------
+// From CCoeControl
+// CBTUIMainContainer::GetHelpContext
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::GetHelpContext(TCoeHelpContext& aContext) const
+    {
+ 	TRACE_FUNC_ENTRY
+
+    aContext.iMajor = KBtuiUid3;
+    aContext.iContext = KBT_HLP_MAIN;
+    }
+
+#else
+
+// ---------------------------------------------------------
+// From CCoeControl
+// CBTUIMainContainer::GetHelpContext
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::GetHelpContext(TCoeHelpContext& /*aContext*/) const
+    {
+	TRACE_FUNC_ENTRY    
+    }
+
+#endif
+
+// ---------------------------------------------------------
+// From CCoeControl
+// CBTUIMainContainer::HandleResourceChange
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::HandleResourceChange( TInt aType )
+    {
+	TRACE_FUNC_ENTRY
+	//Pass the event to base class, so whenever resource changing happened, 
+	//this control will be considered to be re-drawed by base class, therefore
+	//no specific DrawNow() function call is needed here.
+    CCoeControl::HandleResourceChange(aType); 
+    
+    //Handle change in layout orientation
+    //aType == KAknsMessageSkinChange is handled by base class.
+    if (aType == KEikDynamicLayoutVariantSwitch)
+        {
+        //"TRect rect = iAvkonAppUi->ClientRect();"
+        // The line above provides to big rectangle in the bottom causing cba's overdrawn by by blank area.
+        // Correct way to do this is below.
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, mainPaneRect);
+        SetRect(mainPaneRect);
+		}      
+    }
+    
+// ---------------------------------------------------------
+// From CCoeControl
+// CBTUIMainContainer::FocusChanged
+// ---------------------------------------------------------
+//
+void CBTUIMainContainer::FocusChanged(TDrawNow /*aDrawNow*/)
+    {
+	TRACE_FUNC_ENTRY        
+	  if( iBtMainListBox)
+        {
+        iBtMainListBox->SetFocus( IsFocused() );
+        }
+    }
+
+    
+// ******************************************* 
+//    Nested class function implemenations:
+// *******************************************
+
+// ----------------------------------------------------
+// CBTUIMainContainer::TMainListItemArray::TMainListItemArray
+// Initialize friend class
+// ----------------------------------------------------
+CBTUIMainContainer::TMainListItemArray::TMainListItemArray( CDesCArray* aBtAllItemsArray, 
+																CBTUIMainView* aMainView, CBTEngSettings* aBtEngSettings)
+																
+        : iArray( *aBtAllItemsArray ),  // Store references
+        iMainView( aMainView ),        
+        iBtEngSettingsRef( aBtEngSettings )
+        
+    {
+	TRACE_FUNC_ENTRY        
+    }
+
+// ----------------------------------------------------
+// CBTUIMainContainer::TMainListItemArray::MdcaCount()
+// ----------------------------------------------------
+//
+TInt CBTUIMainContainer::TMainListItemArray::MdcaCount() const
+    {
+	TRACE_FUNC_ENTRY    
+    return KNumberOfMainViewItems;
+    }
+
+// ----------------------------------------------------
+// CBTUIMainContainer::TMainListItemArray::MdcaPointL
+// Main view listbox item formatter:
+// Returns the current format string depending value
+// of the item concerned.
+// ----------------------------------------------------
+//
+TPtrC CBTUIMainContainer::TMainListItemArray::MdcaPoint( TInt aIndex ) const
+    {
+	TRACE_FUNC_ENTRY    
+    _LIT(KBTUIEmptyFormatString, " \t \t\t "); // Empty format string if illegal indexing
+    TPtrC chosen;
+    	
+    switch ( aIndex )
+        {
+        case EBTMainListItemPowerMode:
+            {
+            TBTPowerStateValue powerState;
+            iBtEngSettingsRef->GetPowerState(powerState);            
+            if( powerState==EBTPowerOn )
+                chosen.Set( iArray.MdcaPoint( EBTUISettModulePowerOn ));
+            else
+                chosen.Set( iArray.MdcaPoint( EBTUISettModulePowerOff ));
+            break;
+            }
+
+        case EBTMainListItemVisibilityMode:
+            {
+        	TBTVisibilityMode mode;
+        	iBtEngSettingsRef->GetVisibilityMode(mode);          	
+            
+            switch(mode)
+                {                
+                case EBTVisibilityModeGeneral:
+                    chosen.Set( iArray.MdcaPoint( EBTUISettVisibilityModeGeneral ));
+                    break;
+                                 
+                case EBTVisibilityModeHidden:
+                    chosen.Set( iArray.MdcaPoint( EBTUISettVisibilityModeHidden ));
+                    break;
+                   
+                case EBTVisibilityModeTemporary:
+                    chosen.Set( iArray.MdcaPoint( EBTUISettVisibilityModeTemp ));
+                    break;                    
+                   
+                default:
+                    break;
+                }
+            break;
+            }
+
+        case EBTMainListItemNameSetting:
+            {
+            TDes &buf = MUTABLE_CAST(TBuf<KBTUIMaxFormattedNameLength>&,iItemText);
+            buf.Zero();
+            buf.Append( iArray.MdcaPoint( EBTUISettBTNameHeader ) );
+            buf.Append( *iMainView->GetBTLocalName() );
+            chosen.Set( iItemText );
+            break;
+            }
+
+		// For Bluetooth SIM Access Profile feature
+		case EBTMainListItemSapMode:
+            {
+			BluetoothFeatures::TEnterpriseEnablementMode mode = BluetoothFeatures::EEnabled;
+			TRAPD(err, mode = BluetoothFeatures::EnterpriseEnablementL());
+			if ( err == KErrNone )
+				{
+				if ( mode == BluetoothFeatures::EDataProfilesDisabled )
+					{
+					chosen.Set( iArray.MdcaPoint( EBTUISettSapDisabled ));
+					break;
+					}
+				}
+			
+			TInt sapStatus;    
+			TRAP_IGNORE(GetSapStatusL(sapStatus););
+			    
+			if(sapStatus==EBTSapEnabled)
+				{
+				 chosen.Set( iArray.MdcaPoint( EBTUISettSapEnabled ));
+				}
+			else
+				{
+				 chosen.Set( iArray.MdcaPoint( EBTUISettSapDisabled ));
+				}          
+				   
+			TInt sapMode = KErrNone;
+			TRAP_IGNORE(sapMode = iMainView->GetSapStatusL());  
+			
+			
+			if(sapMode==EBTSapEnabled)
+				{
+				if ( sapMode ) 
+					{			
+					chosen.Set( iArray.MdcaPoint( EBTUISettSapEnabled ));
+					}
+				else
+					{
+					chosen.Set( iArray.MdcaPoint( EBTUISettSapDisabled ));
+					}
+				}
+			               
+            break;
+            }	
+        default:
+            chosen.Set( KBTUIEmptyFormatString );
+            break;
+        }
+
+    return chosen;
+    }
+
+// ----------------------------------------------------------------------
+// CBTUIMainContainer::TMainListItemArray::GetSapStatusL(TInt& aStatus)
+// ----------------------------------------------------------------------
+//
+void CBTUIMainContainer::TMainListItemArray::GetSapStatusL( TInt& aStatus )
+{    
+    CRepository* repository = CRepository::NewL(KCRUidBTEngPrivateSettings);
+    CleanupStack::PushL(repository);            	
+    repository->Get(KBTSapEnabled, aStatus);
+    CleanupStack::PopAndDestroy(repository);      
+}