locationcentre/lcapp/src/lccontainer.cpp
changeset 0 522cd55cc3d7
child 9 91123d004e8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationcentre/lcapp/src/lccontainer.cpp	Tue Feb 02 00:16:03 2010 +0200
@@ -0,0 +1,379 @@
+/*
+* Copyright (c) 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:  Container class for Location Centre Application UI.
+*
+*/
+
+
+// SYSTEM INCLUDES
+#include <avkon.hrh>
+#include <barsread.h> 
+#include <lclocationappinfo.h>
+#include <aknlists.h>
+#include <akniconarray.h>		// Icon Array
+#include <eikclbd.h>			// Column Listbox
+#include <gulicon.h>			// Gul Icon
+#include <barsread.h>   		// TResourceReader
+#include <lcapp.rsg>
+#include <csxhelp/loccentre.hlp.hrh>
+#include <aknutils.h>
+#include <eikspane.h> 		    // Status pane
+#include <akntitle.h>       	// CAknTitlePane
+#include <stringloader.h>
+
+// USER INCLUDES
+#include "lccontainer.h"
+#include "lcappui.h"
+#include "lclistboxmodel.h"
+#include "lcappuid.hrh"
+#include "lcapp.hrh"
+
+// CONSTANT DEFINITIONS
+const TInt KLcNoOfElements = 1;
+const TInt KMinSelectedItemNumber = 0;
+const TInt KViewListboxGranularity = 3; // The number of default Applications
+ 
+// ----------------- Member funtions for CLcContainer class ------------------
+
+// ---------------------------------------------------------------------------
+// CLcContainer::CLcContainer
+// ---------------------------------------------------------------------------
+//
+CLcContainer::CLcContainer( MLcEventHandler&	aEventHandler,
+							CLcListBoxModel&	aListBoxModel )
+	:iEventHandler( aEventHandler ),
+	iListBoxModel( &aListBoxModel )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CLcContainer::~CLcContainer
+// ---------------------------------------------------------------------------
+//
+CLcContainer::~CLcContainer()
+    {
+    // Delete the List box
+	delete iListBox;
+    }
+    
+// ---------------------------------------------------------------------------
+// CLcContainer::NewL
+// ---------------------------------------------------------------------------
+//
+CLcContainer* CLcContainer::NewL( const TRect&				aRect,
+										 MLcEventHandler&	aEventHandler,
+										 CLcListBoxModel&	aListBoxModel )     
+    {
+    CLcContainer* self = new (ELeave) CLcContainer( aEventHandler, aListBoxModel );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    CleanupStack::Pop();
+    
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// CLcContainer::CLcContainer
+// ---------------------------------------------------------------------------
+//
+void CLcContainer::ConstructL( const TRect& 	aRect )
+    {
+    // This is the cheif control for this application. This has to be made a 
+    // Window owning control
+    CreateWindowL();
+    
+	// Create a New Title for the View
+	MakeTitleL( R_LOC_TITLE_CENTRE );
+	    
+    // Create the List box
+    CreateListboxL();
+      
+    // Get the Help context
+    iContextName = KLOC_HLP_LOC_CENTRE();
+            
+    SetRect(aRect);
+    ActivateL();
+    }
+
+// ---------------------------------------------------------------------------
+// void CLcContainer::GetHelpContext
+// ---------------------------------------------------------------------------
+//
+void CLcContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+	{
+    aContext.iContext = iContextName;
+    aContext.iMajor = TUid::Uid( KLcAppUid );	
+	}
+
+// ---------------------------------------------------------------------------
+// TInt CLcContainer::GetFocussedItem
+// ---------------------------------------------------------------------------
+//	
+TInt CLcContainer::GetFocussedItem()
+	{
+	// No need to check for the List box.
+    return iListBox->CurrentItemIndex();
+	}
+
+// ---------------------------------------------------------------------------
+// void CLcContainer::UpdateL
+// ---------------------------------------------------------------------------
+//
+void CLcContainer::UpdateL( CLcListBoxModel&	aListBoxModel )
+	{
+	TBool itemRemoved = EFalse;
+	
+	if ( aListBoxModel.MdcaCount() < iListBoxModel->MdcaCount() )
+	    {
+	    itemRemoved = ETrue;
+	    }
+	                              
+	// Assign the latest list box model
+	iListBoxModel = &aListBoxModel;
+	
+	// If there is a list box update it.
+	if ( iListBox )
+		{
+		// First we have to update the Icons Array
+		UpdateIconsL();
+		
+		if ( itemRemoved )
+		    {
+		    iListBox->HandleItemRemovalL();
+		    }
+        else
+            {
+            iListBox->HandleItemAdditionL();
+            }		    
+		
+		// Set the last element as the Selected element if the element has been
+		// removed.
+	    TInt currentItem = iListBox->CurrentItemIndex();   
+	    MDesCArray* array = iListBox->Model()->ItemTextArray();
+	    if( KErrNotFound == currentItem || currentItem >= array->MdcaCount() )
+	        {
+	        TInt newSelected = array->MdcaCount() - 1;
+	        if( newSelected >= KMinSelectedItemNumber )
+	            {
+	            iListBox->SetCurrentItemIndex( newSelected );
+	            }
+	        }		
+		}
+		
+	// Update the List box.
+	DrawDeferred();
+	}
+
+// ---------------------------------------------------------------------------
+// void CLcContainer::UpdateIconsL
+// ---------------------------------------------------------------------------
+//
+void CLcContainer::UpdateIconsL()
+	{
+	// Update the Icons only if there are any elements the List box
+	if ( iListBoxModel->MdcaCount())
+		{
+		// Create a new Icons Array
+	    CAknIconArray* icons = new( ELeave ) CAknIconArray( KViewListboxGranularity );
+	    CleanupStack::PushL( icons );
+
+		CLcLocationAppInfoArray& appArray( iListBoxModel->AppArray());
+		TInt count = appArray.Count();
+		// Add All the icons to the Icons array
+		for ( TInt i = 0; i < count; i++ )
+			{			
+			icons->AppendL( appArray[i].IconL() );
+			}
+
+	    // Get old icons and delete those. This is done because SetIconArray will
+	    // not do it.
+	    CAknIconArray* oldIcons = 
+	    	static_cast<CAknIconArray*>( iListBox->ItemDrawer()->ColumnData()->IconArray());
+	    	    
+	    delete oldIcons;
+
+	    //Set New Icons to array
+	    iListBox->ItemDrawer()->ColumnData()->SetIconArray( icons );  
+	    CleanupStack::Pop(icons);		
+		}				
+	}
+		
+// ---------------------------------------------------------------------------
+// void CLcContainer::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CLcContainer::SizeChanged()
+    {
+    if ( iListBox )
+    	{
+    	iListBox->SetRect( Rect());
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// TInt CLcContainer::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CLcContainer::CountComponentControls() const
+    {
+   	return KLcNoOfElements;
+    }
+
+// ---------------------------------------------------------------------------
+// CCoeControl* CLcContainer::CLcContainer
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CLcContainer::ComponentControl(TInt /* aIndex*/ ) const
+    {
+    return iListBox;
+    }
+    
+// ---------------------------------------------------------------------------
+// TKeyResponse CLcContainer::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//    
+TKeyResponse CLcContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+								  				 TEventCode aType )
+    {
+    switch ( aKeyEvent.iCode )
+        {
+        case EKeyLeftArrow:
+        case EKeyRightArrow:
+            {
+            // No action in this application for the Right arrow and left
+            // arrow.
+            return EKeyWasNotConsumed;  
+            }
+        default:
+            {
+            break;  
+            }
+        }
+    // Now it's List box's job to process the key event
+    return iListBox->OfferKeyEventL( aKeyEvent, aType ); 
+    }   
+
+// ---------------------------------------------------------------------------
+// void CLcContainer::HandleResourceChange
+// ---------------------------------------------------------------------------
+//
+void CLcContainer::HandleResourceChange( TInt aType )
+	{
+    // Pass the event to the base class
+    CCoeControl::HandleResourceChange( aType );
+    
+    switch( aType )
+        {
+        // Dynamic Layout switch and Skin Change
+        case KEikDynamicLayoutVariantSwitch:
+        case KAknsMessageSkinChange:
+            {
+            // The Command Handler needs to handle this event. TRAP_IGNORE
+            // the error incase it occurs
+            TRAP_IGNORE( iEventHandler.HandleEventL( aType ));
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }	
+	}
+
+// ---------------------------------------------------------------------------
+// void CLcContainer::HandleListBoxEventL
+// ---------------------------------------------------------------------------
+//	
+void CLcContainer::HandleListBoxEventL( CEikListBox*      /* aListBox */, 
+                          				TListBoxEvent     aEventType )
+	{
+    switch (aEventType)
+        {
+        // List box Item Selection
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            {
+            // A Location based Application or Content/Service has been
+            // selected. This element has to be returned back to the Command
+            // Hanlder inorder to enable it to take appropriate action.
+            iEventHandler.HandleEventL( ELcOpen );
+            break;  
+            }
+        default:
+           break;
+        }	
+	}
+
+// ---------------------------------------------------------------------------
+// void CLcContainer::FocusChanged
+// ---------------------------------------------------------------------------
+//	                     
+void CLcContainer::FocusChanged( TDrawNow aDrawNow )
+	{
+    CCoeControl::FocusChanged( aDrawNow );
+    
+    // The focus event has to be explicitly handed over to all the compound
+    // controls since CCoeControl does not do that implicitly
+    iListBox->SetFocus( IsFocused(), aDrawNow );	
+	}
+
+// ---------------------------------------------------------------------------
+// void CLcContainer::MakeTitleL
+// Sets the Title text
+//
+// @param aResourceText Resource to create title
+// ---------------------------------------------------------------------------
+//
+void CLcContainer::MakeTitleL( TInt aResourceText )
+	{
+	CEikStatusPane* statusPane = 
+	    static_cast<CEikStatusPane*>( iEikonEnv->AppUiFactory()->StatusPane());
+	// Obtain the title from the Status Pane
+	CAknTitlePane* title = static_cast<CAknTitlePane*>( statusPane->
+        ControlL( TUid::Uid( EEikStatusPaneUidTitle )));
+       
+    // Set the Title's buffer    
+    HBufC* buf = StringLoader::LoadL( aResourceText );
+    title->SetText( buf ); // Takes ownership of buf
+	}
+		
+// ---------------------------------------------------------------------------
+// void CLcContainer::CreateListboxL
+// ---------------------------------------------------------------------------
+// 	
+void CLcContainer::CreateListboxL()
+    {
+    // Create the List box
+    iListBox = new ( ELeave ) CAknSingleLargeStyleListBox;
+    iListBox->ConstructL( this, EAknListBoxSelectionList );
+    iListBox->SetContainerWindowL( *this ); 
+    iListBox->SetListBoxObserver( this );
+    iListBox->CreateScrollBarFrameL(ETrue);
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
+                                                         CEikScrollBarFrame::EAuto ); 
+     
+    UpdateIconsL();
+                                                                                                                      
+    // The ownership of the List box model is retained with the Container.
+    // This is needed because the model is used to return the identifier of the
+    // Location based Application or Content/Service when its selected.                                                     
+    iListBox->Model()->SetItemTextArray( iListBoxModel );  
+    iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+                                     
+    iListBox->ActivateL();
+    }
+    
+// End of File