locationtriggering/lbtmgmtui/src/lbtmgmtpluginview.cpp
changeset 0 667063e416a2
child 4 42de37ce7ce4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationtriggering/lbtmgmtui/src/lbtmgmtpluginview.cpp	Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,501 @@
+/*
+* Copyright (c) 2006 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:  Location Triggering Management Plugin view
+*
+*/
+
+
+// System Include
+#include <barsread.h>               // For TResourceReader
+#include <bautils.h>   
+#include <StringLoader.h>
+#include <aknViewAppUi.h>
+#include <lbtmgmtpluginview.rsg>
+#include <avkon.rsg>
+#include <aknnotewrappers.h>        // Error Notes
+#include <textresolver.h>           // Text Resolver
+#include <hlplch.h>                 // Help
+#include <featmgr.h>                // FeatureManager
+
+// User Include
+#include "locsettingsui.h"
+#include "locsettingsuiobserver.h"
+#include "lbtmgmtplugin.hrh"
+#include "lbtmgmtpluginview.h"
+#include "lbtmgmtplugincontainer.h"
+#include "lbtmgmtpluginengine.h"
+
+
+// ========================= MEMBER FUNCTIONS ================================
+
+
+// ---------------------------------------------------------------------------
+// CLbtMgmtPluginView::CLbtMgmtPluginView
+// Overloaded Constructor
+//
+// ---------------------------------------------------------------------------
+//  
+CLbtMgmtPluginView::CLbtMgmtPluginView( 
+                            MLocSettingsUiObserver& aSettingsObsrv )
+    :iSettingsObserver( aSettingsObsrv ),
+    iResourceLoader( *CCoeEnv::Static() )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CLbtMgmtPluginView::~CLbtMgmtPluginView
+// Destructor
+//
+// ---------------------------------------------------------------------------
+//
+CLbtMgmtPluginView::~CLbtMgmtPluginView()
+    {    
+    // Close the resource loader
+    iResourceLoader.Close(); 
+    }
+    
+// ---------------------------------------------------------------------------
+// CLbtMgmtPluginView* CLbtMgmtPluginView::NewL
+// Creates new Location Trigger Management view.
+//
+// @param aSettingsObsrv            Pointer to the Command Handler
+// @return CLbtMgmtPluginView*   Reference to the application view
+// ---------------------------------------------------------------------------
+//   
+CLbtMgmtPluginView* CLbtMgmtPluginView::NewL( 
+                            MLocSettingsUiObserver& aSettingsObsrv )
+    {   
+    CLbtMgmtPluginView* self = 
+                        CLbtMgmtPluginView::NewLC( aSettingsObsrv );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CLbtMgmtPluginView* CLbtMgmtPluginView::NewLC
+// Creates new Location Trigger Management view.
+//
+// @param aSettingsObsrv            Pointer to the Command Handler
+// @return CLbtMgmtPluginView*   Reference to the application view
+// ---------------------------------------------------------------------------
+//  
+CLbtMgmtPluginView* CLbtMgmtPluginView::NewLC( 
+                            MLocSettingsUiObserver& aSettingsObsrv )
+    {   
+    CLbtMgmtPluginView* self = 
+                        new(ELeave) CLbtMgmtPluginView( aSettingsObsrv );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+    
+// ---------------------------------------------------------------------------
+// void CLbtMgmtPluginView::ConstructL
+// Second Phase Constructor
+//
+// ---------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::ConstructL()
+    {
+        
+    // Open the Resource File
+    OpenLocalizedResourceFileL( KLbtMgmtViewResFileName, iResourceLoader );
+    
+    // Call AknView's BaseConstrutL
+    BaseConstructL( R_LBTMGMTPLUGIN_VIEW );
+ 
+    }
+
+// ---------------------------------------------------------------------------
+// void CLbtMgmtPluginView::CloseSettings
+// Close the Location Triggering Management Settings
+//
+// ---------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::CloseSettings()
+    {
+    // Stop displaying the menu bar, if its currently being displayed
+    StopDisplayingMenuBar();
+    
+    // Close all the active dialogs
+    if( iEngine )
+    		iEngine->Close();
+    }
+        
+// ---------------------------------------------------------------------------
+// void CLbtMgmtPluginView::DoActivateL
+// 
+// ---------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::DoActivateL( const TVwsViewId&  /* PrevViewId*/,
+                                               TUid         /* aCustomMessageId*/,
+                                         const TDesC8&      /* aCustomMessage */)
+    {
+    // Destroy the existing container if it exists
+    if( iContainer )
+        {
+        AppUi()->RemoveFromViewStack( *this, iContainer );
+        delete iContainer;
+        iContainer=NULL;
+        }                       
+    
+    // Create the Location Triggering engine instance
+    iEngine = CLbtMgmtPluginEngine::NewL( *this );
+    
+    // Create new Container 
+    iContainer = CLbtMgmtPluginContainer::NewL( ClientRect(),
+                                                   *iEngine,
+                                                   *this );
+    iContainer->SetMopParent( this );
+    AppUi()->AddToViewStackL( *this, iContainer );
+    
+    SetCba( R_LBTMGMTPLUGIN_CBA_CHANGE );
+    }
+
+// ---------------------------------------------------------------------------
+// void CLocationSystemUiView::DoDeactivate
+//
+// ---------------------------------------------------------------------------
+//      
+void CLbtMgmtPluginView::DoDeactivate()
+    {
+    // Destroy Container
+    AppUi()->RemoveFromViewStack( *this, iContainer );
+    delete iContainer;
+    iContainer = NULL;
+    
+    // Delete the engine
+		delete iEngine;
+		iEngine = NULL;
+    
+    }
+
+// ---------------------------------------------------------------------------
+// TUid CLbtMgmtPluginView::Id
+// Returns the View Id. Should be chosen to reflect the Implementation UID 
+// of the Plugin
+//
+// @return TUid The View Id
+// ---------------------------------------------------------------------------
+//  
+TUid CLbtMgmtPluginView::Id() const
+    {
+    return TUid::Uid( KLbtMgmtPluginUID3 );
+    }
+
+// ---------------------------------------------------------------------------
+// void CLbtMgmtPluginView::HandleCommandL
+//
+// ---------------------------------------------------------------------------
+//  
+void CLbtMgmtPluginView::HandleCommandL(TInt aCommand)   
+    {
+    switch( aCommand )
+        {
+        case ELbtMgmtChange:
+        case ELbtMgmtMSKChange:
+    		{
+    		SettingsChangeL(aCommand);   		
+          	break;
+          	}
+        case ELbtMgmtInfo:
+        case ELbtMgmtMSKInfo:
+        	{
+			iEngine->ShowInfoDialogL();
+        	break;
+        	}
+        case ELbtMgmtClearAll:
+    		{
+    		iEngine->ClearAllTriggersL();
+    		iContainer->Update();
+    		HandleCmdL(EListBoxItemFocused);
+    		break;
+          	}
+        case EAknCmdHelp:        
+            {
+            HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(),
+                                                 AppUi()->AppHelpContextL());
+            break;  
+          	}           
+        // Handle any plug-in specific internal commands here
+        case EAknSoftkeyBack:
+            {
+            // The UI is intended to be closed. Pass the event 
+            // to the observer
+            iSettingsObserver.SettingClosed( KErrNone );
+            break;
+            }
+        default:
+            {
+            // Un-handled commands are to be passed to the 
+            // App UI
+            AppUi()->HandleCommandL( aCommand );
+            break;  
+            }
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CLbtMgmtPluginView::DynInitMenuPaneL
+// -----------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::DynInitMenuPaneL( TInt          aResourceId, 
+                                              CEikMenuPane* aMenuPane )
+    {
+    if ( aResourceId == R_LBTMGMTPLUGIN_MENU )
+        {
+        User::LeaveIfNull( aMenuPane );
+        //Handle Help Feature
+
+        //Context sensitive menu items
+        if( CLbtMgmtPluginEngine::EActiveTriggers == iContainer->GetFocussedItem() )
+        	{
+        	aMenuPane->SetItemDimmed( ELbtMgmtChange, ETrue );
+        	if( iEngine->ActiveTriggers() )
+        	    {
+        	    aMenuPane->SetItemDimmed( ELbtMgmtClearAll, EFalse );  			            
+        	    aMenuPane->SetItemDimmed( ELbtMgmtInfo, EFalse );
+        	    }
+        	else
+        	    {
+        	    aMenuPane->SetItemDimmed( ELbtMgmtClearAll, ETrue );                          
+        	     aMenuPane->SetItemDimmed( ELbtMgmtInfo, ETrue );
+        	    }
+        	}
+        else
+        	{
+			aMenuPane->SetItemDimmed( ELbtMgmtChange, EFalse );  
+			 aMenuPane->SetItemDimmed( ELbtMgmtClearAll, ETrue ); 
+			aMenuPane->SetItemDimmed( ELbtMgmtInfo, ETrue );
+        	}
+        }
+    }   
+
+// -----------------------------------------------------------------------------
+// CLbtMgmtPluginView::SetCba
+// -----------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::SetCba( TInt aResourceId ) 
+		{
+		if( Cba() )
+		    {
+		   	TRAP_IGNORE(Cba()->SetCommandSetL(aResourceId));
+		    }
+	  Cba()->DrawDeferred(); 
+		}
+
+// ---------------------------------------------------------------------------
+// void CLbtMgmtPluginView::HandleCommandL
+// Inherited from MLbtMgmtPluginCmdHdlr
+// Handles Selection events from the container
+// 
+// @param  aCommand Command ID
+// ---------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::HandleCmdL( TLbtMgmtPluginCmd aCommand )
+    {
+    switch( aCommand )
+        {
+        // Handle any plug-in specific internal commands here
+        case EListBoxItemSelected:
+	          	{
+	          	// Handle List Box Selected Event   
+	            TRAPD( error, SettingsChangeL( ELbtMgmtMSKChange ));
+	            if( error )
+	                {
+	                // Show Error Note
+	    			CTextResolver* iTextResolver = CTextResolver::NewLC(*iCoeEnv);
+	                TPtrC buffer = iTextResolver->ResolveErrorString( error );
+	                CAknErrorNote* errorNote = new ( ELeave )CAknErrorNote( ETrue );
+	                TRAP_IGNORE( errorNote->ExecuteLD( buffer ));
+	    			CleanupStack::PopAndDestroy( iTextResolver );
+	                }    
+				break;    
+	          	}
+        case EListBoxItemFocused:
+        		{
+	        	if( CLbtMgmtPluginEngine::EActiveTriggers == iContainer->GetFocussedItem()   )
+	        	    {
+	        	    if( iEngine->ActiveTriggers() )
+	        			SetCba( R_LBTMGMTPLUGIN_CBA_INFO );
+	        	    else
+	        	        SetCba( R_LBTMGMTPLUGIN_CBA_NOACTIVETRIGGERS );
+	        	    }
+	        	else
+	        			SetCba( R_LBTMGMTPLUGIN_CBA_CHANGE );
+	        	break;
+	        	}
+        case EScreenSizeChanged:
+	          {
+            if( iContainer )
+                {
+                iContainer->SetRect( ClientRect());     
+                }
+	          break;
+	          }
+        default:
+            {
+            break;  
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Inherited from MLbtMgmtEngObserver
+// ---------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::HandleSettingsChangeEventL()
+    {
+    // Observer callback notifies that one/more of the settings values have
+    // changed. Hence, need to refresh the container to show the latest
+    // values
+    if( iContainer )
+        {
+        iContainer->DrawDeferred();
+        }
+    
+    // Handle any changes to the MSK configuration. 
+    HandleCmdL( EListBoxItemFocused );
+    }
+    
+// -----------------------------------------------------------------------------
+// CLbtMgmtPluginView::HandleHelpFeature
+// -----------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::HandleHelpFeature( CEikMenuPane& aMenuPane ) const
+    {
+    if ( FeatureManager::FeatureSupported( KFeatureIdHelp ))
+        {
+        aMenuPane.SetItemDimmed( EAknCmdHelp, EFalse );
+        }
+    else
+        {
+        aMenuPane.SetItemDimmed( EAknCmdHelp, ETrue );
+        }
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Handle Settings Change Event
+// 
+// @param aCmd Settings change command
+// ---------------------------------------------------------------------------
+//
+void CLbtMgmtPluginView::SettingsChangeL( TInt aCmd )
+    {
+    if( !iContainer )
+        {
+        // No container available. Nothing to do in this case. Hence, returning
+        return;
+        }
+    CLbtMgmtPluginEngine::TSettingsList currentElement;
+    currentElement = static_cast<CLbtMgmtPluginEngine::TSettingsList>
+                        ( iContainer->GetFocussedItem() );
+    
+    // Switch based on the currently focussed element
+    switch( currentElement )
+        {
+        case CLbtMgmtPluginEngine::ETriggeringStatus:
+            {
+            // Different handling needed for Touch handling and Item selection
+            // using the OK key.
+            // Incase the User has selected the item using the OK key then 
+            // normal handling required
+            // Incase the User has selected the item using touch selection
+            // then the Trigger Status needs to be toggled
+            if( ELbtMgmtChange == aCmd )
+                {
+                iEngine->ChangeTiggerStatusL();
+                }
+            else
+                {
+                iEngine->ToggleTiggerStatusL();
+                }
+            iContainer->Update();
+            break;
+            }
+        case CLbtMgmtPluginEngine::EActiveTriggers:
+            {
+			// If condition is added for any pointer event from container
+            if( iEngine->ActiveTriggers() )
+            		iEngine->ShowInfoDialogL();
+            break;
+            }
+        default:
+            {
+            // Element not found
+            User::Leave( KErrNotFound );
+            }
+        }
+    }
+                    
+// ---------------------------------------------------------------------------
+// void CLbtMgmtPluginView::OpenLocalizedResourceFileL
+// Opens the nearest localized resourcefile using aResourceLoader. 
+// aResourceLoader should be opened only once before closing it. 
+// Otherwise it will raise a panic. Therefore it is better to have 
+// multiple resource loaders.
+// 
+// @param aResourceFileName Drive and name of resource file in format 
+//                          <path>:<rsc_file_name>
+// @param aResourceLoader Resource loader for the resource. The loader 
+//                        must not be opened allready or it will raise 
+//                        a panic. It is caller's responsibility to 
+//                        close the resource loader after using the 
+//                        resource.
+// ---------------------------------------------------------------------------
+//  
+void CLbtMgmtPluginView::OpenLocalizedResourceFileL( 
+                            const TDesC&               aResourceFileName, 
+                                  RConeResourceLoader& aResourceLoader )
+    {
+    RFs fsSession;
+    User::LeaveIfError( fsSession.Connect());
+    
+    TFileName* tmpName = new(ELeave) TFileName;
+    CleanupStack::PushL( tmpName );
+    
+    // Append the Resource Files Directory
+    tmpName->Append( KDC_RESOURCE_FILES_DIR );
+    
+    // Append the Ressource File Name
+    tmpName->Append( aResourceFileName );
+    
+    // Obtain the drive where the DLL is installed
+    TFileName* dllDrive = new (ELeave) TFileName;
+    CleanupStack::PushL( dllDrive );
+    Dll::FileName( *dllDrive );
+    
+    // Obtain the Complete path for the Resource File
+    TParse parse;
+    User::LeaveIfError( parse.Set( *dllDrive, NULL, NULL ) );
+    User::LeaveIfError( parse.Set( parse.Drive(), tmpName, NULL ) );
+    TFileName* fileName = new(ELeave) TFileName;
+    CleanupStack::PushL( fileName );
+    fileName->Append( parse.FullName() );
+    
+    // Get language of resource file
+    BaflUtils::NearestLanguageFile( fsSession, *fileName );
+    
+    // Open resource file    
+    aResourceLoader.OpenL( *fileName );
+    
+    // Pop all the fields
+    CleanupStack::PopAndDestroy( fileName );
+    CleanupStack::PopAndDestroy( dllDrive );
+    CleanupStack::PopAndDestroy( tmpName );
+    
+    //If leave occurs before this, close is called automatically when the thread exits.
+    fsSession.Close();
+    }