ipsservices/ipssossettings/src/ipssetui.cpp
changeset 0 8466d47a6819
child 1 12c456ceeff2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipsservices/ipssossettings/src/ipssetui.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,548 @@
+/*
+* 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: This file implements class CIpsSetUi.
+*
+*/
+
+
+#include "emailtrace.h"
+#include <eikfrlb.h>                // CEikFormattedCellListBox
+#include <aknappui.h>               // CAknAppUi
+#include <AknsDrawUtils.h>
+#include <akntitle.h>               // CAknTitlePane
+#include <hlplch.h>                 // HlpLauncher
+#include <eikrted.h>                // CEikRichTextEditor
+#include <ipssossettings.rsg>
+#include <data_caging_path_literals.hrh>
+#include <AlwaysOnlineManagerClient.h>
+
+#include "ipssetui.h"
+#include "ipssetuidialog.h"
+#include "ipssetutilsdisconnectlogic.h"
+
+// becuase of RD_IPS_AO_PLUGIN flag, can be removed
+// when flag is removed
+#include "ipsplgsosbaseplugin.hrh"
+
+const TInt KIpsSetOptionsMenuItemCount = 4;
+_LIT( KIpsSetUiResourceFile,"z:IpsSosSettings.rsc" );
+
+// ============================ LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::CIpsSetUi
+// ----------------------------------------------------------------------------
+//
+CIpsSetUi::CIpsSetUi( const TMsvId aMailboxId, TBool aFolderSettingView ) //<cmail>
+    :
+    iFlags( 0x00 ),
+    iListBox( NULL ),
+    iSettings( NULL ),
+    iResourceLoader( *iCoeEnv ),
+    iMailboxId( aMailboxId )
+    , iShowFolderSettings(aFolderSettingView), iIgnoreOneBackKey(ETrue) //<cmail>
+    {
+    FUNC_LOG;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::NewL()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUi* CIpsSetUi::NewL( const TMsvId aMailboxId, TBool aFolderSettingView ) //<cmail>
+    {
+    FUNC_LOG;
+    CIpsSetUi* self = NewLC( aMailboxId, aFolderSettingView ); //<cmail>
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::NewLC()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUi* CIpsSetUi::NewLC( const TMsvId aMailboxId, TBool aFolderSettingView ) //<cmail>
+    {
+    FUNC_LOG;
+    CIpsSetUi* self = new ( ELeave ) CIpsSetUi( aMailboxId, aFolderSettingView ); //<cmail>
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::~CIpsSetUi()
+// ----------------------------------------------------------------------------
+//
+CIpsSetUi::~CIpsSetUi()
+    {
+    FUNC_LOG;
+    iResourceLoader.Close();
+    delete iSession;
+    delete iSettings;
+    iSettings = NULL;
+    iListBox = NULL;
+    iTextEditor = NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::ConstructL()
+    {
+    FUNC_LOG;
+    iResourceMenuBar = R_IPS_SET_MENUBAR;
+
+    // Call the base ConstructL
+    CAknDialog::ConstructL( iResourceMenuBar );
+    LoadResourceL();
+    iSession = CMsvSession::OpenSyncL( *this );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::OkToExitL
+// ----------------------------------------------------------------------------
+//
+TBool CIpsSetUi::OkToExitL( TInt aButtonId )
+    {
+    FUNC_LOG;
+    TBool allowQuit = EFalse;
+
+    // Exit not issued, forward the call to command processor
+    if ( !( iFlags & EIpsSetUiShouldExit ) &&
+         !( iFlags & EIpsSetUiShouldClose ) )
+        {
+        iSettings->ProcessCommandL( aButtonId );
+        }
+    else
+        {
+        // Should quit
+        allowQuit = iSettings->OkToExitL( aButtonId );
+
+        // Clear the flag after usage
+        iFlags &= ~EIpsSetUiQueryClose;
+
+        // If quit is allowed, store the settings, otherwise clear the flag
+        if ( allowQuit && iFlags & EIpsSetUiAllowSave )
+            {
+            iFlags &= ~EIpsSetUiAllowSave;
+            
+            DisconnectIfOnlineL( EFalse );
+            // Failing to store the settings should cause panic, to prevent
+            // the settings to stop into unwanted errors
+            TRAP_IGNORE( iSettings->StoreSettingsToAccountL() );
+
+            // switch ao back on
+// <cmail> RD_IPS_AO_PLUGIN flag removed
+            RAlwaysOnlineClientSession aosession; 
+            TInt err = aosession.Connect();
+            if ( err == KErrNone )
+                {
+                TPckgBuf<TMsvId> mboxBuf( iMailboxId );
+                TRAP( err, aosession.RelayCommandL( 
+                        EServerAPIEmailTurnOn, 
+                       mboxBuf ) );
+                }
+            aosession.Close();
+// </cmail>
+            }
+        else
+            {
+            // Clear the flags
+            iFlags &= ~EIpsSetUiShouldExit;
+            iFlags &= ~EIpsSetUiShouldClose;
+            }
+
+        // Exit, now
+        if ( allowQuit )
+            {
+            allowQuit = CAknDialog::OkToExitL( EAknSoftkeyCancel );
+            }
+        }
+
+    return allowQuit;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::HandleResourceChange
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::HandleResourceChange( TInt aType )
+    {
+    FUNC_LOG;
+    CAknDialog::HandleResourceChange( aType );
+
+    if ( iTextEditor && aType == KEikDynamicLayoutVariantSwitch )
+        {
+        TRect rect = Rect();
+        iTextEditor->SetRect( rect );
+        iTextEditor->HandleResourceChange( aType );
+        iListBox->SetRect( rect );
+        iListBox->HandleResourceChange( aType );
+        }
+    if ( aType == KAknsMessageSkinChange )
+        {
+        SetFontAndSkin();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::SetFontAndSkin
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::SetFontAndSkin()
+    {
+    FUNC_LOG;
+    if ( iTextEditor )
+        {
+        MAknsControlContext* context =
+            AknsDrawUtils::ControlContext( iListBox );
+        TRAP_IGNORE(
+            iTextEditor->SetSkinBackgroundControlContextL( context ) );
+
+        const CFont* font = ControlEnv()->NormalFont();
+        TFontSpec fontSpec = font->FontSpecInTwips();
+
+        TCharFormat charFormat;
+        TCharFormatMask formatMask;
+        charFormat.iFontSpec = fontSpec;
+
+        formatMask.SetAttrib( EAttFontTypeface );
+        formatMask.SetAttrib( EAttFontHeight );
+        formatMask.SetAttrib( EAttFontPosture );
+        formatMask.SetAttrib( EAttFontStrokeWeight );
+
+        TRgb textColor;
+        TInt error = AknsUtils::GetCachedColor(
+    	    AknsUtils::SkinInstance(),
+            textColor,
+            KAknsIIDQsnTextColors,
+            EAknsCIQsnTextColorsCG7 );
+
+        if ( error != KErrNone )
+    	    {
+    	    textColor = AKN_LAF_COLOR_STATIC( 215 );
+    	    }
+
+        charFormat.iFontPresentation.iTextColor = textColor;
+        formatMask.SetAttrib( EAttColor );
+
+        CCharFormatLayer* charFormatLayer = NULL;
+
+        TRAP( error,
+            charFormatLayer = CCharFormatLayer::NewL( charFormat, formatMask )
+        );
+
+        if ( error )
+            {
+            delete charFormatLayer;
+            }
+        else
+            {
+            iTextEditor->SetCharFormatLayer( charFormatLayer );
+            }
+        }
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::PreLayoutDynInitL
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::PreLayoutDynInitL()
+    {
+    FUNC_LOG;
+    // Get the pointer to titlepane
+    CEikStatusPane* sp =
+        static_cast<CAknAppUi*>(
+            iEikonEnv->EikAppUi() )->StatusPane();
+    CAknTitlePane* title = static_cast<CAknTitlePane*>(
+        sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+    CEikButtonGroupContainer& cba = ButtonGroupContainer();
+
+    // check connect state before entering settings
+    DisconnectIfOnlineL();
+    
+// <cmail> RD_IPS_AO_PLUGIN flag removed
+    // prevent ao operations during settings edit
+    RAlwaysOnlineClientSession aosession;
+    TInt err = aosession.Connect();
+    if ( err == KErrNone )
+        {
+        TPckgBuf<TMsvId> mboxBuf( iMailboxId );
+        TRAP_IGNORE( aosession.RelayCommandL( 
+                EServerAPIEmailTurnOff, 
+                mboxBuf ) );
+        }
+    aosession.Close();
+// </cmail>
+    
+    // Prepare the listbox
+    iListBox = static_cast<CEikFormattedCellListBox*>(
+        Control( EIpsSetUiIdListBox ) );
+
+    iSettings = CIpsSetUiDialogCtrl::NewL(
+        *this, *iListBox, *title, cba, *iSession, iFlags );
+    
+    //<cmail>
+    //When settings are launched from folderlist view, we need to go directly to 'what to sync' view
+    if(iShowFolderSettings)
+        {
+        if(iSettings->CountInListBox() > 1)
+            {
+            iListBox->SetCurrentItemIndex(1);
+            iSettings->ProcessCommandL( EAknSoftkeySelect );
+            if(iSettings->CountInListBox() > 2)
+                {
+                iListBox->SetCurrentItemIndex(2);
+                }
+            }
+        }
+    //</cmail>
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::ProcessCommandL
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::ProcessCommandL( TInt aCommandId )
+    {
+    FUNC_LOG;
+    // Forward the commands
+    CAknDialog::ProcessCommandL( aCommandId );
+
+    // Forward command either to wizard or setting dialog
+    iSettings->ProcessCommandL( aCommandId );
+    }
+
+void CIpsSetUi::LaunchMenuL()
+	{
+	if ( iFlags & EIpsSetUiOpenOptionsMenu )
+		{
+		iFlags &= ~EIpsSetUiOpenOptionsMenu;
+		TIpsSetUiSettingsType type = iSettings->CurrentItem()->iItemType;
+		//sub-menu
+		if ( type == EIpsSetUiMenuArray )
+			{
+			iFlags |= EIpsSetUiPositionSubMenu;
+			iFlags &= ~EIpsSetUiSettingsMenuItem;
+			}
+		//settings item
+		else if( type == EIpsSetUiRadioButtonArray || 
+				 type == EIpsSetUiItemText ||
+				 type == EIpsSetUiUndefined || 
+				 type == EIpsSetUiCheckBoxArray )
+			{
+			iFlags |= EIpsSetUiSettingsMenuItem;
+			iFlags &= ~EIpsSetUiPositionSubMenu;
+			}
+		else
+			{
+			iFlags &= ~EIpsSetUiPositionSubMenu;
+			iFlags &= ~EIpsSetUiSettingsMenuItem;
+			}
+		DisplayMenuL();
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::OfferKeyEventL
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CIpsSetUi::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+    FUNC_LOG;
+
+    //<cmail>
+    // When settings are launched from folder list view, we need to show directly 'what to sync' view
+    // this logic is used when coming back from that view
+    if( (aType == EEventKeyUp) && (aKeyEvent.iScanCode == EStdKeyDevice1) 
+            && (iShowFolderSettings) && iIgnoreOneBackKey)
+        {
+        iFlags |= EIpsSetUiShouldClose;
+        }
+    iIgnoreOneBackKey = ETrue;
+    //</cmail>
+        
+    // Offer the key event to existing mailbox setting handler
+    TKeyResponse ret = iSettings->OfferKeyEventL( aKeyEvent, aType );
+
+    // Improve menu handling here!!!
+
+    // Show the menu, if asked
+    LaunchMenuL();
+    
+    // Check if exit has been issued
+    if ( iFlags & EIpsSetUiShouldExit ||
+         iFlags & EIpsSetUiShouldClose )
+        {
+        DoQuitL();
+        
+        // Quit attempted, so consume the key
+        ret = EKeyWasConsumed;
+        }
+
+    if ( ret != EKeyWasConsumed )
+        {
+        ret = CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+        }
+
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::DynInitMenuPaneL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::DynInitMenuPaneL(
+    TInt /* aResourceId */,
+    CEikMenuPane* aMenuPane )
+    {
+    FUNC_LOG;
+    if ( aMenuPane->NumberOfItemsInPane() == KIpsSetOptionsMenuItemCount )
+        {
+        aMenuPane->SetItemDimmed(
+            EAknSoftkeyOpen, iFlags & EIpsSetUiSettingsMenuItem );
+        aMenuPane->SetItemDimmed(
+            EAknSoftkeySelect, iFlags & EIpsSetUiPositionSubMenu );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::DoQuitL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::DoQuitL()
+    {
+    FUNC_LOG;
+    // Start the exit process, the query is shown during TryExitL call
+    if ( iFlags & EIpsSetUiShouldExit )
+        {
+        TryExitL( EAknSoftkeyExit );
+        }
+    else
+        {
+        TryExitL( EAknSoftkeyCancel );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::GetHelpContext()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    FUNC_LOG;
+    iSettings->GetHelpContext( aContext );
+    }
+
+// ----------------------------------------------------------------------------
+// CIpsSetUi::LaunchHelpL()
+// ----------------------------------------------------------------------------
+//
+void CIpsSetUi::LaunchHelpL()
+    {
+    FUNC_LOG;
+    CCoeAppUi* appUi = static_cast<CCoeAppUi*>( ControlEnv()->AppUi() );
+    CArrayFix<TCoeHelpContext>* helpContext = appUi->AppHelpContextL();
+    HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext );
+    }
+
+void CIpsSetUi::HandleSessionEventL(
+        TMsvSessionEvent /*aEvent*/, 
+        TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/)
+    {
+    FUNC_LOG;
+    // handle general server events if needed
+    // EMsvCloseSession
+    // EMsvServerReady
+    // EMsvServerFailedToStart
+    // EMsvCorruptedIndexRebuilt
+    // EMsvServerTerminated
+    }
+
+// ---------------------------------------------------------------------------
+// CIpsSetUi::LoadResourceL()
+// ---------------------------------------------------------------------------
+//
+void CIpsSetUi::LoadResourceL()
+    {
+    FUNC_LOG;
+    TFileName fileName;
+    TParse parse;
+    parse.Set( KIpsSetUiResourceFile, &KDC_RESOURCE_FILES_DIR, NULL );
+    fileName.Copy( parse.FullName() );
+
+    // Attempt to load the resource
+    iResourceLoader.OpenL( fileName );
+    }
+    
+void CIpsSetUi::DisconnectIfOnlineL( TBool aDoShowQuery )
+    {
+    FUNC_LOG;
+    CIpsSetUtilsDisconnectLogic* dLogic = CIpsSetUtilsDisconnectLogic::NewL( 
+            *iSession, iMailboxId );
+    CleanupStack::PushL( dLogic );
+    // check if mailbox is online and disconnect
+    TInt result = KErrNone;
+    // <cmail>
+    TInt error = KErrNone;
+    TRAP( error, result = dLogic->RunDisconnectLogicL( aDoShowQuery ) );
+    __ASSERT_DEBUG( error == KErrNone, 
+            User::Panic( KIpsSetGenPanicLit, error ));
+    // </cmail>
+
+    if ( result == KErrCancel )
+        {
+        User::Leave( KErrCancel );
+        }
+    CleanupStack::PopAndDestroy( dLogic );
+    }
+
+// ---------------------------------------------------------------------------
+// CIpsSetUi::MailboxId()
+// ---------------------------------------------------------------------------
+//
+TMsvId CIpsSetUi::MailboxId()
+    {
+    FUNC_LOG;
+    return iMailboxId;
+    }
+
+//<cmail>
+// ---------------------------------------------------------------------------
+// CIpsSetUi::SetIgnoreOneBackKey()
+// ---------------------------------------------------------------------------
+//
+void CIpsSetUi::SetIgnoreOneBackKey(TBool aIgnoreBackKey)
+    {
+    iIgnoreOneBackKey = aIgnoreBackKey;
+    }
+//</cmail>
+
+    
+
+//  End of File
+
+
+