email/imum/Utils/Src/IMSSoftkeyControl.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/IMSSoftkeyControl.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,338 @@
+/*
+* Copyright (c) 2002 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:  IMSSoftkeyControl.cpp
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <StringLoader.h>           // StringLoader
+
+#include "IMSSoftkeyControl.h"
+#include "ImumPanic.h"
+#include "ImumUtilsLogging.h"
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+enum TIMCSoftkeyErrors
+    {
+    EIMCLeftSoftkeyFailure = 0,
+    EIMCMiddleSoftkeyFailure,
+    EIMCRightSoftkeyFailure
+    };
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::CIMSSoftkeyControl()
+// ----------------------------------------------------------------------------
+//
+CIMSSoftkeyControl::CIMSSoftkeyControl(
+     CEikButtonGroupContainer& aSoftkeys )
+     :
+     iSoftkeys( aSoftkeys ),
+     iFlags( 0 )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::CIMSSoftkeyControl, 0, KLogUi );
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::~CIMSSoftkeyControl()
+// ----------------------------------------------------------------------------
+//
+CIMSSoftkeyControl::~CIMSSoftkeyControl()
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::~CIMSSoftkeyControl, 0, KLogUi );
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSoftkeyControl::ConstructL()
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::ConstructL, 0, KLogUi );
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::NewL()
+// ----------------------------------------------------------------------------
+//
+CIMSSoftkeyControl* CIMSSoftkeyControl::NewL(
+     CEikButtonGroupContainer& aSoftkeys )
+    {
+    IMUM_STATIC_CONTEXT( CIMSSoftkeyControl::NewL, 0, utils, KLogUi );
+
+    CIMSSoftkeyControl* self = NewLC( aSoftkeys );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::NewLC()
+// ----------------------------------------------------------------------------
+//
+CIMSSoftkeyControl* CIMSSoftkeyControl::NewLC(
+     CEikButtonGroupContainer& aSoftkeys )
+    {
+    IMUM_STATIC_CONTEXT( CIMSSoftkeyControl::NewLC, 0, utils, KLogUi );
+
+    CIMSSoftkeyControl* self = new ( ELeave ) CIMSSoftkeyControl( aSoftkeys );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::ChangeObserver()
+// ----------------------------------------------------------------------------
+//
+TInt CIMSSoftkeyControl::ChangeObserver(
+    const TBool aOn,
+    const TISCObservedKeys aSoftkey,
+    MEikCommandObserver& aCommandObserver )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::ChangeObserver, 0, KLogUi );
+
+    TInt error = KErrNone;
+
+    if ( aOn )
+        {
+        error = SetObserver( aSoftkey, aCommandObserver );
+        }
+    else
+        {
+        RemoveObserver( aSoftkey );
+        }
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::SetObserver()
+// ----------------------------------------------------------------------------
+//
+TInt CIMSSoftkeyControl::SetObserver(
+    const TISCObservedKeys aSoftkey,
+    MEikCommandObserver& aCommandObserver )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::SetObserver, 0, KLogUi );
+
+    TRAPD( error,
+        iSoftkeys.UpdateCommandObserverL( aSoftkey, aCommandObserver ) );
+    iFlags.SetFlag( aSoftkey );
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::SetObserver()
+// ----------------------------------------------------------------------------
+//
+TInt CIMSSoftkeyControl::SetObserver(
+    const TBool aLeftSoftkey,
+    const TBool aRightSoftkey,
+    const TBool aMiddleSoftkey,
+    MEikCommandObserver& aCommandObserver )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::SetObserver, 0, KLogUi );
+
+    // Set observer for the left softkey
+    TInt error = ChangeObserver(
+        aLeftSoftkey, EISCLeftSoftkey, aCommandObserver );
+    __ASSERT_DEBUG( error == KErrNone,
+        User::Panic( KIMCSoftkeyControllerPanic, EIMCLeftSoftkeyFailure ) );
+
+    // Set observer for the right softkey
+    if ( error == KErrNone )
+        {
+        error = ChangeObserver(
+            aRightSoftkey, EISCRightSoftkey, aCommandObserver );
+
+        __ASSERT_DEBUG( error == KErrNone, User::Panic(
+            KIMCSoftkeyControllerPanic, EIMCRightSoftkeyFailure ) );
+        }
+
+    // Set observer for the middle softkey
+    if ( error == KErrNone )
+        {
+        error = ChangeObserver(
+            aMiddleSoftkey, EISCMiddleSoftkey, aCommandObserver );
+        __ASSERT_DEBUG( error == KErrNone, User::Panic(
+            KIMCSoftkeyControllerPanic, EIMCMiddleSoftkeyFailure ) );
+        }
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::RemoveObserver()
+// ----------------------------------------------------------------------------
+//
+void CIMSSoftkeyControl::RemoveObserver(
+    const TISCObservedKeys aSoftkey )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::RemoveObserver, 0, KLogUi );
+
+    iSoftkeys.RemoveCommandObserver( aSoftkey );
+    iFlags.ClearFlag( aSoftkey );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::operator()()
+// ----------------------------------------------------------------------------
+//
+CEikButtonGroupContainer& CIMSSoftkeyControl::operator()()
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::operator, 0, KLogUi );
+
+    return iSoftkeys;
+    }
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsDialog::DefineCustomSoftkeyL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSoftkeyControl::DefineCustomSoftkeyL(
+    const TInt aLabelResource,
+    const TISCObservedKeys aSoftkeyPos,
+    const TInt aSoftkeyCmd,
+    MEikCommandObserver* aCommandObserver )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::DefineCustomSoftkeyL, 0, KLogUi );
+
+    // Define buttons 'Options' and 'Start'
+    HBufC* options = StringLoader::LoadL( aLabelResource );
+    CleanupStack::PushL( options );
+    DefineCustomSoftkeyL(
+        *options, aSoftkeyPos, aSoftkeyCmd, aCommandObserver );
+    CleanupStack::PopAndDestroy( options );
+    options = NULL;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CMuiuDynamicSettingsDialog::DefineCustomSoftkeyL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSoftkeyControl::DefineCustomSoftkeyL(
+    const TDesC& aSoftkeyLabel,
+    const TISCObservedKeys aSoftkeyPos,
+    const TInt aSoftkeyCmd,
+    MEikCommandObserver* aCommandObserver )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::DefineCustomSoftkeyL, 0, KLogUi );
+
+    // Make sure there is matching command for the position
+    if ( iSoftkeys.PositionById( aSoftkeyCmd ) > KErrNotFound )
+        {
+        // First, remove the observer for the key
+        if ( iFlags.Flag( aSoftkeyPos ) )
+            {
+            RemoveObserver( aSoftkeyPos );
+            }
+
+        // Remove the key information and then add new command
+        iSoftkeys.RemoveCommandFromStack( aSoftkeyPos, aSoftkeyCmd );
+        iSoftkeys.AddCommandToStackL( aSoftkeyPos, aSoftkeyCmd, aSoftkeyLabel );
+
+        if ( aCommandObserver )
+            {
+            // Set as observer and set the flags
+            SetObserver( aSoftkeyPos, *aCommandObserver );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::MSKLabelling()
+// ----------------------------------------------------------------------------
+//
+TBool CIMSSoftkeyControl::MSKLabelling()
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::MSKLabelling, 0, KLogUi );
+
+    return iFlags.Flag( EISCAllowMiddleSoftkeyLabelChange );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::SetMSKLabelling()
+// ----------------------------------------------------------------------------
+//
+void CIMSSoftkeyControl::SetMSKLabelling( const TBool aNewState )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::SetMSKLabelling, 0, KLogUi );
+
+    return iFlags.ChangeFlag( EISCAllowMiddleSoftkeyLabelChange, aNewState );
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::UpdateMiddleSoftkeyLabelL()
+// ----------------------------------------------------------------------------
+//
+void CIMSSoftkeyControl::UpdateMiddleSoftkeyLabelL(
+    const TInt aLabelResource,
+    const TInt aCommandId,
+    MEikCommandObserver* aCommandObserver )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::UpdateMiddleSoftkeyLabelL, 0, KLogUi );
+
+    // If labelling allowed, change the label for the middle soft key
+    if ( MSKLabelling() && iPreviousMskLabelResource != aLabelResource )
+        {
+        iPreviousMskLabelResource = aLabelResource;
+        DefineCustomSoftkeyL(
+            aLabelResource,
+            EISCMiddleSoftkey,
+            aCommandId,
+            aCommandObserver );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIMSSoftkeyControl::SetVisibility()
+// ----------------------------------------------------------------------------
+//
+void CIMSSoftkeyControl::SetVisibility(
+    const TBool aVisible,
+    MEikCommandObserver* aCommandObserver )
+    {
+    IMUM_CONTEXT( CIMSSoftkeyControl::SetVisibility, 0, KLogUi );
+    IMUM_IN();
+    if ( !aVisible )
+        {
+        TBufC<1> dummy;
+        TRAP_IGNORE( DefineCustomSoftkeyL( dummy, EISCLeftSoftkey, 0, aCommandObserver ) );
+        TRAP_IGNORE( DefineCustomSoftkeyL( dummy, EISCRightSoftkey, 0, aCommandObserver ) );
+        TRAP_IGNORE( DefineCustomSoftkeyL( dummy, EISCMiddleSoftkey, 0, aCommandObserver ) );
+        }
+
+    IMUM_OUT();
+    }
+
+// End of File