wlansecuritysettings/wlaneapsettingsui/EapPluginConfig/src/EAPPlugInConfigurationDlg.cpp
branchRCL_3
changeset 19 c74b3d9f6b9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlansecuritysettings/wlaneapsettingsui/EapPluginConfig/src/EAPPlugInConfigurationDlg.cpp	Wed Sep 01 12:23:57 2010 +0100
@@ -0,0 +1,617 @@
+/*
+* Copyright (c) 2001-2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: Implementation of EAP Plugin Configuration dialog
+*
+*/
+
+/*
+* %version: 20.1.15 %
+*/
+
+// INCLUDE FILES
+#include <akntitle.h>
+#include <eikspane.h>
+#include <aknmfnesettingpage.h>
+#include <AknIconArray.h>
+#include <AknsUtils.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <EapType.h>
+
+#include <eappluginconfigres.rsg>
+#include "EAPPluginConfig.hrh"
+
+#include <avkon.mbg>
+
+#include "EAPPluginList.h"
+#include "EAPPlugInConfigurationDlg.h"
+#include "EAPPluginConfigurationModel.h"
+
+
+#include <featmgr.h>
+#include <hlplch.h>
+#include <eikappui.h>
+#include <csxhelp/cp.hlp.hrh>
+
+
+// CONSTANTS
+// UID of general settings app, in which help texts are included
+const TUid KHelpUidPlugin = { 0x100058EC };
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::CEAPPluginConfigurationDlg
+// ---------------------------------------------------------
+//
+CEAPPluginConfigurationDlg::CEAPPluginConfigurationDlg( TInt& aButtonId,
+                                        CEAPPluginConfigurationModel& aModel,
+                                        const TUint32 aIapId )
+: CAknSelectionListDialog( iDummy, &aModel, NULL ),
+  iButtonId( &aButtonId ),
+  iModel( &aModel ),
+  iIapId( aIapId ),
+  iExiting( EFalse )
+    {
+    // Passing a dummy (iDummy) for selection index.
+    // Base class was made for 'select and dismiss' behaviour only, and does
+    // not work properly in our case (when only "Back" press dismissed the
+    // dialog and more selections are possible).
+    //
+    // iModel (the UI model) should really be owned by this dialog, but
+    // can't do that due to the malformed API of CAknSelectionListDialog.
+    }
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::~CEAPPluginConfigurationDlg
+// ---------------------------------------------------------
+//
+CEAPPluginConfigurationDlg::~CEAPPluginConfigurationDlg()
+    {
+    if ( iTitlePane )
+        {
+        // set old text back, if we have it...
+        if ( iOldTitleText )
+            {
+            TRAP_IGNORE( iTitlePane->SetTextL( *iOldTitleText ) );
+            delete iOldTitleText;
+            }
+        }
+        
+    FeatureManager::UnInitializeLib();
+    }
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::ConstructAndRunLD
+// ---------------------------------------------------------
+//
+TInt CEAPPluginConfigurationDlg::ConstructAndRunLD( 
+                                               const REAPPluginList& aPlugins,
+                                               const TDesC& aTitle )
+    {
+    CleanupStack::PushL( this );
+
+    iPlugins = aPlugins;
+    iConnectionName = aTitle;
+
+    FeatureManager::InitializeLibL();
+    
+    ConstructL( R_WPA_EAP_PLUGIN_MENUBAR );
+    
+    // ExecuteLD will PushL( this ), so we have to Pop it...
+    CleanupStack::Pop( this ); // this
+    
+    return CAknSelectionListDialog::ExecuteLD( R_WPA_EAP_CONFIG_DIALOG );
+    }
+
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::OkToExitL
+// ---------------------------------------------------------
+//
+TBool CEAPPluginConfigurationDlg::OkToExitL( TInt aButtonId )
+    {
+    // Translate the button presses into commands for the appui & current
+    // view to handle
+    TBool retval( EFalse );
+    if ( aButtonId == EAknSoftkeyOptions )
+        {
+        DisplayMenuL();
+        }
+    else if ( aButtonId == EEikCmdExit || 
+              aButtonId == EAknCmdExit ||
+              aButtonId == EAknSoftkeyBack )
+        {
+        *iButtonId = aButtonId;
+        retval = ETrue;
+        }
+    else if( aButtonId == EWPAEAPPluginCmdConfigure )
+        {
+        ProcessCommandL( aButtonId );
+        }
+    else if( aButtonId == EWPAEAPPluginCmdEnable )
+        {
+        ProcessCommandL( aButtonId );
+        }
+        
+
+    return retval;
+    }
+    
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::HandleListBoxEventL
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+                                                   TListBoxEvent aEventType )
+    {
+    switch ( aEventType )
+        {
+        case EEventEnterKeyPressed:
+        case EEventItemSingleClicked:
+            {
+            TInt current = ListBox()->CurrentItemIndex();
+            if ( iPlugins[current].iEnabled )            
+                {
+                ConfigureL(ETrue);
+                }
+            else
+                {
+                ProcessCommandL( EWPAEAPPluginCmdEnable );
+                }                
+            break;
+            }
+
+        case EEventItemActioned:
+        case EEventEditingStarted:
+        case EEventEditingStopped:
+        case EEventPenDownOnItem:
+        case EEventItemDraggingActioned:
+            {
+            break;
+            }
+
+        default:
+            {
+            break;
+            };
+        };
+    }   
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::HandleDialogPageEventL
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::HandleDialogPageEventL( TInt aEventID )
+    {
+     CAknDialog::HandleDialogPageEventL( aEventID );
+         if( iExiting )
+             {        
+             // Exit requested, exit with ok. 
+             TryExitL( EAknCmdExit );
+             }   
+
+     }
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::ConfigureL
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::ConfigureL( TBool aQuick )
+    {
+    CEapType* eapType = CEapType::NewL( 
+            iPlugins[ListBox()->CurrentItemIndex()].iInfo->DataType(), 
+            ELan, 
+            iIapId );
+
+    CleanupStack::PushL( eapType );
+
+    TInt buttonId = eapType->InvokeUiL();
+    CleanupStack::PopAndDestroy( eapType );
+
+    if ( buttonId == EAknCmdExit || buttonId == EEikCmdExit )
+        {
+        if (aQuick == EFalse)
+            {
+            TryExitL( buttonId );
+            }
+        else
+            {
+            iExiting = ETrue;
+            // Don't exit here. Framework command chain will
+            // cause a KERN-EXEC 3 panic. Handle the exit in 
+            // HandleDialogPageEventL(). 
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::ProcessCommandL
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::ProcessCommandL( TInt aCommandId )
+    {
+    if ( MenuShowing() )
+        {
+        HideMenu();
+        }
+
+    switch ( aCommandId )
+        {
+        case EAknCmdOpen:
+        case EWPAEAPPluginCmdConfigure:
+            {
+            ConfigureL(EFalse);
+            break;
+            }
+
+        case EWPAEAPPluginCmdEnable:
+            {
+            TInt cur = ListBox()->CurrentItemIndex();
+            iPlugins[cur].iEnabled = ETrue;
+
+            // enabling moves item to the top of the list
+            iPlugins.MovePos( cur, 0 );
+
+            // Highlight follows movement.
+            ListBox()->SetCurrentItemIndex( 0 );
+
+            // load the new CBA from resource
+            ButtonGroupContainer().SetCommandSetL( 
+                            R_WPA_EAP_CONFIG_SOFTKEYS_OPTIONS_BACK_CONFIGURE );                            
+            ButtonGroupContainer().DrawDeferred();
+            DrawNow();
+            break;
+            }
+
+        case EWPAEAPPluginCmdDisable:
+            {
+            if ( iModel->MdcaEnabledCount() > 1 )
+                {
+                TInt cur = ListBox()->CurrentItemIndex();
+
+                // disabling moves item just after the last enabled one,
+                // so find that position
+                TInt next = cur;
+                
+                while ( next < iModel->MdcaCount() - 1 &&
+                        iPlugins[next].iEnabled )
+                    {
+                    ++next;
+                    }
+
+                if ( next > cur && !iPlugins[next].iEnabled ) 
+                    {
+                    --next;
+                    }
+
+
+                iPlugins[cur].iEnabled = EFalse;
+
+                // move item if needed
+                iPlugins.MovePos( cur, next );
+
+                // Highlight follows movement.
+                ListBox()->SetCurrentItemIndex( next );
+                
+                // load the new CBA from resource
+                ButtonGroupContainer().SetCommandSetL( 
+                               R_WPA_EAP_CONFIG_SOFTKEYS_OPTIONS_BACK_ENABLE );
+                ButtonGroupContainer().DrawDeferred();
+                DrawNow();
+                }
+            else
+                {
+                HBufC* stringLabel;
+                
+                stringLabel = StringLoader::LoadL( R_INFO_CANNOT_DISABLE,
+                                                   iEikonEnv );
+
+                CleanupStack::PushL( stringLabel );
+
+                CAknInformationNote* dialog = new ( ELeave )
+                                                CAknInformationNote( ETrue );
+                dialog->ExecuteLD( *stringLabel );
+
+                CleanupStack::PopAndDestroy( stringLabel );
+                }
+
+            break;
+            }
+
+        case EWPAEAPPluginCmdPriorityUp:
+            {
+            TInt cur = ListBox()->CurrentItemIndex();
+            iPlugins.MovePos( cur, cur - 1 );
+
+            // Highlight follows movement.
+            ListBox()->SetCurrentItemIndexAndDraw( cur - 1 );
+            break;
+            }
+
+        case EWPAEAPPluginCmdPriorityDown:
+            {
+            TInt cur = ListBox()->CurrentItemIndex();
+
+            iPlugins.MovePos( cur, cur + 1 );
+            // Highlight follows movement.
+            ListBox()->SetCurrentItemIndexAndDraw( cur + 1 );
+
+            break;
+            }
+
+        case EAknCmdHelp:
+            {
+            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+                                    iEikonEnv->EikAppUi()->AppHelpContextL() );
+            break;
+            }
+
+        case EAknSoftkeyBack:
+        case EAknCmdExit:
+        case EEikCmdExit:
+            {
+            TryExitL( aCommandId );
+            break;
+            }
+
+        default:
+            {
+            CAknSelectionListDialog::ProcessCommandL( aCommandId );
+            break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::PreLayoutDynInitL
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::PreLayoutDynInitL()
+    {
+    CAknSelectionListDialog::PreLayoutDynInitL();
+
+    // first get StatusPane
+    CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+
+    // then get TitlePane
+    iTitlePane = ( CAknTitlePane* ) statusPane->ControlL( TUid::Uid( 
+                                                    EEikStatusPaneUidTitle ) );
+    // if not already stored, store it for restoring
+    if ( !iOldTitleText )
+        {
+        iOldTitleText = iTitlePane->Text()->AllocL();
+        }
+
+    // set new titlepane text
+    iTitlePane->SetTextL( iConnectionName );
+
+    SetIconsL();
+    }
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::SetIconsL()
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::SetIconsL()
+    {
+    CArrayPtr< CGulIcon >* icons = new( ELeave ) CAknIconArray( 1 );
+    CleanupStack::PushL( icons );
+
+    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+
+    CGulIcon* icon = CGulIcon::NewLC();
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* mask = NULL;    
+    AknsUtils::CreateColorIconL( skinInstance,
+                                 KAknsIIDQgnIndiMarkedAdd, 
+                                 KAknsIIDQsnIconColors, 
+                                 EAknsCIQsnIconColorsCG13, 
+                                 bitmap, 
+                                 mask, 
+                                 AknIconUtils::AvkonIconFileName(),
+                                 EMbmAvkonQgn_indi_marked_add, 
+                                 EMbmAvkonQgn_indi_marked_add_mask,
+                                 KRgbBlack );
+    icon->SetBitmap( bitmap );
+    icon->SetMask( mask );    
+    icons->AppendL( icon );
+                
+    CleanupStack::Pop( icon ); 
+
+    SetIconArrayL( icons );
+
+    CleanupStack::Pop( icons );
+    }
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::DynInitMenuPaneL
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::DynInitMenuPaneL( TInt aResourceId, 
+                                                CEikMenuPane* aMenuPane )
+    {
+    CAknSelectionListDialog::DynInitMenuPaneL( aResourceId, aMenuPane );
+    if ( aMenuPane && aResourceId == R_WPA_EAP_PLUGIN_MENU )
+        {
+        if ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+            {
+            aMenuPane->DeleteMenuItem( EAknCmdHelp );
+            }
+        if ( !iModel->MdcaCount() )
+            {
+            // if no plug-ins then dim the whole menu.
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdConfigure, ETrue );
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdEnable, ETrue );
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdDisable, ETrue );
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdPriorityUp, ETrue );
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdPriorityDown, ETrue );
+            }
+        else
+            {
+            TInt current = ListBox()->CurrentItemIndex();
+            TBool enabled = iPlugins[current].iEnabled;
+            
+            // Hide either "Enable" or "Disable", as appropriate.
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdEnable, enabled );
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdDisable, !enabled );
+            
+            // Don't display "Configure" for disabled items
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdConfigure, !enabled );
+            
+            // Don't display "Raise priority" nor "Lower priority" for 
+            // disabled items
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdPriorityUp, !enabled );
+            aMenuPane->SetItemDimmed( EWPAEAPPluginCmdPriorityDown, !enabled );
+            
+            
+            if ( enabled )
+                {
+                if ( current == 0 )
+                    {
+                    // Can't go higher than top.
+                    aMenuPane->SetItemDimmed( EWPAEAPPluginCmdPriorityUp, 
+                                              ETrue );
+                    }
+                
+                if ( current == iModel->MdcaCount() - 1 || 
+                        ( current < iModel->MdcaCount() - 1 && 
+                        !iPlugins[current + 1].iEnabled ) )
+                    {
+                    // Can't go lower than the last enabled item
+                    aMenuPane->SetItemDimmed( EWPAEAPPluginCmdPriorityDown, 
+                                              ETrue );
+                    }
+                }            
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::OfferKeyEventL
+// ---------------------------------------------------------
+//
+TKeyResponse CEAPPluginConfigurationDlg::OfferKeyEventL( 
+                                                const TKeyEvent& aKeyEvent, 
+                                                TEventCode aType )
+    {
+    TKeyResponse result( EKeyWasNotConsumed );
+    
+    if ( aType == EEventKey )
+        {
+        
+        // Exit handling 
+        if ( aKeyEvent.iCode == EKeyEscape )
+            {
+            TryExitL( EEikCmdExit );
+            return EKeyWasConsumed;
+            }
+        
+        TInt current = ListBox()->CurrentItemIndex();
+        
+        // Handle Enter key here, since it doesn't seem to convert into
+        // the proper command id via the normal route
+        // (maybe some Avkon support for Enter key is still missing in
+        // S60 3.2 2008_wk22)
+        if ( aKeyEvent.iCode == EKeyEnter )
+            {
+            if ( iPlugins[current].iEnabled )
+                {
+                OkToExitL( EWPAEAPPluginCmdConfigure );
+                }
+            else
+                {
+                OkToExitL( EWPAEAPPluginCmdEnable );
+                }
+                
+            result = EKeyWasConsumed;
+            }
+        else
+            {
+            result = CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+            }
+                
+        TInt next = ListBox()->CurrentItemIndex();
+
+        if ( current != next &&
+             ( iPlugins[current].iEnabled && !iPlugins[next].iEnabled ||
+               !iPlugins[current].iEnabled && iPlugins[next].iEnabled ) )
+            {
+            // status is different, the CBA must be changed
+            CEikButtonGroupContainer& cba = ButtonGroupContainer();
+
+            // load the new set from resource
+            if ( iPlugins[next].iEnabled )
+                {
+                cba.SetCommandSetL(  
+                            R_WPA_EAP_CONFIG_SOFTKEYS_OPTIONS_BACK_CONFIGURE );                           
+                }
+            else
+                {
+                cba.SetCommandSetL(  
+                            R_WPA_EAP_CONFIG_SOFTKEYS_OPTIONS_BACK_ENABLE );
+                }
+
+            cba.DrawDeferred();
+            }
+        }
+    else
+        {
+        // pass event up the hierarchy
+        result = CAknDialog::OfferKeyEventL( aKeyEvent, aType );        
+        }
+        
+    
+   
+    return result;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CEAPPluginConfigurationDlg::HandleResourceChange
+// ----------------------------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::HandleResourceChange( TInt aType )
+    {
+    CAknSelectionListDialog::HandleResourceChange( aType );
+
+    if ( aType == KAknsMessageSkinChange )
+        {
+        TRAP_IGNORE( SetIconsL() );
+        SizeChanged();
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CEAPPluginConfigurationDlg::GetHelpContext
+// ---------------------------------------------------------
+//
+void CEAPPluginConfigurationDlg::GetHelpContext( 
+                                            TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = KHelpUidPlugin;
+    aContext.iContext = KSET_HLP_WLAN_EAP_PLUGINS_IAP;
+    }
+
+
+// End of File