omadm/omadmappui/src/NSmlDMProfilesContainer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 09:42:30 +0300
branchRCL_3
changeset 23 c4687ff85147
parent 1 4490afcb47b1
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* Copyright (c) 2005-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:  Methods for Server Profiles Container
*
*/


// INCLUDE FILES
#include <aknPopup.h>		// popup dialogs
#include <StringLoader.h>
#include <AknQueryDialog.h>
#include <textresolver.h>
#include <AknIconArray.h>
#include <AknsUtils.h>
#include <featmgr.h>

#include <AknUtils.h>

#include "NSmlDMProfilesContainer.h"
#include "NSmlDMProfilesView.h"
#include "NSmlDMSyncApp.h"
#include "NSmlDMSyncAppEngine.h"
#include "NSmlDMSyncUi.hrh"
#include "NSmlDMdef.h"
#include "NSmlDMSyncDebug.h"
#include <nsmldmsync.rsg>
#include <nsmldmsync.mbg>
#include <data_caging_path_literals.hrh>


#include <csxhelp/dm.hlp.hrh>


// ========================== MEMBER FUNCTIONS =================================

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CNSmlDMProfilesContainer* CNSmlDMProfilesContainer::NewL(       CAknView* aView,
                                                          const TRect&    aRect )
    {
    CNSmlDMProfilesContainer* self = new( ELeave ) CNSmlDMProfilesContainer( aView );
    
    CleanupStack::PushL( self );
    self->SetMopParent( (MObjectProvider*) aView );
    self->ConstructL( aRect );
    CleanupStack::Pop();

    return self;
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::CNSmlDMProfilesContainer
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CNSmlDMProfilesContainer::CNSmlDMProfilesContainer( CAknView* aView )
    : iView( aView )
    {
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::ConstructL( const TRect& aRect )
    {
    CreateWindowL();

	iContextMenuUp = EFalse;
	iAppUi = STATIC_CAST( CNSmlDMSyncAppUi*, iEikonEnv->EikAppUi());
	iDocument = STATIC_CAST( CNSmlDMSyncDocument*, iAppUi->Document() );

	iProfilesListBox = new ( ELeave ) CAknDoubleLargeStyleListBox;
	iProfilesListBox->SetContainerWindowL( *this );
	iProfilesListBox->ConstructL( this, EAknListBoxSelectionList );
	
	iProfilesListBox->SetListBoxObserver( this );
	
	iProfilesListBox->CreateScrollBarFrameL( ETrue );
	iProfilesListBox->ScrollBarFrame()->SetScrollBarVisibilityL( 
	                                            CEikScrollBarFrame::EOff,
	                                            CEikScrollBarFrame::EAuto );

	iDocument->RefreshProfileListL();
    AddIconsL();

	//Comment this for Moduletests
	ReadProfileListL();

	iProfilesListBox->UpdateScrollBarsL();
	iProfilesListBox->ScrollBarFrame()->MoveVertThumbTo( 0 );		

    SetRect( aRect );
    ActivateL();    
    }

// Destructor
CNSmlDMProfilesContainer::~CNSmlDMProfilesContainer()
    {
    FLOG( "[OMADM] CNSmlDMProfilesContainer::~CNSmlDMProfilesContainer" );
    delete iProfilesListBox;
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::SizeChanged
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::SizeChanged()
    {
    iProfilesListBox->SetRect( Rect() );    // Mandatory, otherwise not drawn
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::HandleResourceChange
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::HandleResourceChange( TInt aType )
    {
    CCoeControl::HandleResourceChange( aType );
    
    //Handle change in layout orientation
    if ( aType == KEikDynamicLayoutVariantSwitch || aType == KAknsMessageSkinChange )
        {
        if ( aType == KAknsMessageSkinChange )
        	{
        	// Skin changed; we'll have to reload the icon array
            CArrayPtr<CGulIcon>* iconArray =
                iProfilesListBox->ItemDrawer()->FormattedCellData()->IconArray();
            if ( iconArray )
                {
    	        iconArray->ResetAndDestroy();
	            delete iconArray;
	            iconArray = NULL;
    	        }
    	    TRAP_IGNORE( AddIconsL() );
        	}

        TRect mainPaneRect;
        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
        SetRect( mainPaneRect );
		DrawDeferred();
		}
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::CountComponentControls
// -----------------------------------------------------------------------------
//
TInt CNSmlDMProfilesContainer::CountComponentControls() const
    {
    TInt retval( 0 );
    if ( iProfilesListBox )
        {
        retval = 1;
        }
    return retval; // return nbr of controls inside this container
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::ComponentControl
// -----------------------------------------------------------------------------
//
CCoeControl* CNSmlDMProfilesContainer::ComponentControl( TInt aIndex ) const
    {
    switch ( aIndex )
        {
        case 0:
            {
            return iProfilesListBox;
            }
        default:
            {
            return NULL;
            }
        }
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::Draw
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::Draw( const TRect& /* aRect */ ) const
    {
    }


// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::HandleControlEventL
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::HandleControlEventL( CCoeControl* /* aControl */,
                                                TCoeEvent /* aEventType */ )
    {
    }

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::OfferKeyEventL
// -----------------------------------------------------------------------------
//
TKeyResponse CNSmlDMProfilesContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
                                                             TEventCode aType )
	{
	FLOG( "[OMADM] CNSmlDMProfilesContainer::OfferKeyEventL()" );
	FTRACE( FPrint(
    _L("[OMADM]\t CNSmlDMProfilesContainer::OfferKeyEventL>> Begin code = 0x%x"),aKeyEvent.iCode ) );
	
	if ( iProfilesListBox && aType == EEventKey )
		{
		switch ( aKeyEvent.iCode )
			{
			case EStdKeyHome:
				{
				// delete only in main view
                if ( iDocument->ProfileCount() != 0 ) 
                    {
                    iAvkonAppUi->HandleCommandL( ENSmlMenuCmdEraseProfile );
                    }
			    break;
                }
            case EKeyEnter: //Enter key
			case EKeyOK: // OK button
				{
				if ( ! iAppUi->Synchronise() )
					{
					if (iSettingsView != EFalse) 
						{
						return EKeyWasNotConsumed;
						}
					else
						{
						ShowContextMenuL( R_SMLSYNC_CONTXT_MENUBAR_PROFILES_VIEW );
						}
					}
				return EKeyWasConsumed;
				}
			case EKeyEscape:
				{
				if ( (iSettingsView != EFalse) || (  iAppUi->Synchronise() ) )
					{
					return EKeyWasNotConsumed;
					}
				else
					{
					iAvkonAppUi->ProcessCommandL( EEikCmdExit );
					}
		    	break;
				}
			case EKeyUpArrow:
			case EKeyDownArrow:
			    {
			    TKeyResponse retVal =
			        iProfilesListBox->OfferKeyEventL( aKeyEvent, aType );
                iDocument->SetCurrentIndex( iProfilesListBox->CurrentItemIndex() );
                return retVal;
			    }
			case EKeyLeftArrow:
			case EKeyRightArrow:
			    {
			    break;  // AppUi handles the tab changes
			    }
			default:
			    {
			    return iProfilesListBox->OfferKeyEventL( aKeyEvent, aType );
			    }
			}
		}
	FLOG( "[OMADM] CNSmlDMProfilesContainer::OfferKeyEventL() completed, key was not consumed" );
	return EKeyWasNotConsumed;
	}

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::PostLayoutDynInitL
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::PostLayoutDynInitL()
	{
	FLOG( "[OMADM] CNSmlDMProfilesContainer::PostLayoutDynInitL()" );
	
	iConfirmationNoteUp = EFalse;
	iMenuUp = 0;

	if ( iProfilesListBox->Model()->NumberOfItems() == 0 )
		{
		HBufC* emptyText = 
		                iEikonEnv->AllocReadResourceLC( R_SML_MAIN_NOPROFILES );
		iProfilesListBox->View()->SetListEmptyTextL( emptyText->Des() );
		CleanupStack::PopAndDestroy( emptyText );

		iConfirmationNoteUp = ETrue; // using flag for preventing the popupmenu
									 // from popping up while dialog is up
		HBufC* newProfile = 
		            iEikonEnv->AllocReadResourceLC( R_SML_APPUI_NOTE_TEXT_NEW );

		CAknQueryDialog* startDialog = new (ELeave) CAknQueryDialog();

		if ( startDialog->ExecuteLD( R_STARTQUERY_NOTE, newProfile->Des() ) )
			{	
			iAppUi->ShowEditProfileDialogL( ESmlNewProfile ); 			
			}
		startDialog = NULL;
		CleanupStack::PopAndDestroy( newProfile );
		iConfirmationNoteUp = EFalse;
		}
	else
		{
		iDocument->SetCurrentIndex(0); 
		iProfilesListBox->ScrollBarFrame()->MoveVertThumbTo( 
		                                iProfilesListBox->CurrentItemIndex() );
		}

	FLOG( "[OMADM] CNSmlDMProfilesContainer::PostLayoutDynInitL() completed" );
	}

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::PreLayoutDynInitL
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::PreLayoutDynInitL()
    {
    FLOG( "[OMADM] CNSmlDMProfilesContainer::PreLayoutDynInitL" );
    
	}

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::HandleListBoxEventL
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::HandleListBoxEventL( CEikListBox* aListBox, 
                                                 TListBoxEvent aEventType )
	{
	FLOG( "[OMADM] CNSmlDMProfilesContainer::HandleListBoxEventL()" );	
	iDocument->SetCurrentIndex( aListBox->CurrentItemIndex() ); 
	if ( aEventType == MEikListBoxObserver::EEventItemSingleClicked )
	    {
	    ShowContextMenuL( R_SMLSYNC_CONTXT_MENUBAR_PROFILES_VIEW );
	    }	
	FLOG( "[OMADM] CNSmlDMProfilesContainer::HandleListBoxEventL() completed" );
	}

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::ShowContextMenuL
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::ShowContextMenuL( TInt aResource )
    {
	FLOG( "[OMADM] CNSmlDMProfilesContainer::ShowContextMenuL()" );
	// Switch to Context specific options menu,
	// Show it and switch back to main options menu.
	CEikMenuBar* menuBar = iView->MenuBar();
	menuBar->SetMenuTitleResourceId( aResource );
    menuBar->SetMenuType( CEikMenuBar::EMenuContext );
	// TRAP displaying of menu bar.
	// If it fails, the correct resource is set back before leave.
	TRAPD( err, menuBar->TryDisplayMenuBarL() );
	menuBar->SetMenuTitleResourceId( R_SMLSYNC_MENUBAR_PROFILES_VIEW );
	menuBar->SetMenuType( CEikMenuBar::EMenuOptions );
	User::LeaveIfError( err );
	FLOG( "[OMADM] CNSmlDMProfilesContainer::ShowContextMenuL() completed" );
    }


// -----------------------------------------------------------------------------
//	CNSmlDMProfilesContainer::ReadProfileListL
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::ReadProfileListL()
	{
	FLOG( "[OMADM] CNSmlDMProfilesContainer::ReadProfileListL()" );
	
	TInt index = 0;
	TInt lockindex = 0;
    iDocument->RefreshProfileListL();
	CArrayFixFlat<TNSmlDMProfileItem> *profileList =
	                                             iDocument->ProfileList( index ); 
	CDesCArray* items = (CDesCArray*) iProfilesListBox->Model()->ItemTextArray();

	items->Reset();
	
	TBuf<KNSmlMaxTextLength256> text;
	TBuf<KNSmlMaxTextLength64>  timeString; 
	TBuf<KNSmlMaxTextLength64>  dateString; 
	TBuf<5> indexBuf;

	HBufC* timeFormatted;
	
	TBool settingEnforcement = TUtil::SettingEnforcementState();
	TBool btObex = FeatureManager::FeatureSupported(KFeatureIdSyncMlDmObex);

	for ( TInt i = 0; i < profileList->Count(); i++ )
		{
		text.Zero();
		TInt index( EProfileInternet ); //internet
		
		if ( ( *profileList )[i].iBearer != EProfileInternet )
			{
			// EProfileObexBlueTooth is defined to 1, but that index has
			// the HTTP "off" icon. Looking at AddIconsL, BlueTooth icons
			// should be 2 and 3, if present.
			//index = EProfileObexBlueTooth;
			index = EProfileObexBlueTooth + 1;
			}
		if ( ( *profileList )[i].iActive == 0 )
            {
			index++;
            }

		if (settingEnforcement ||( *profileList )[i].iProfileLocked ) 
			{
			// Locked setting item icon
			lockindex = 2;
			if (btObex)
				{
				// BlueTooth icons are present
				lockindex = 4;
				}
			}

		indexBuf.Num( index );
		text.Append ( KNSmlTab );
		text.Append ( ( *profileList )[i].iProfileName );
		text.Append ( KNSmlTab );
		if (  ( *profileList )[i].iSynced ) // profile has been synchronised
			{
			timeFormatted = TUtil::SyncTimeLC( ( *profileList )[i].iLastSuccessSync );
			}
		else
			{
			timeFormatted = 
			            iEikonEnv->AllocReadResourceLC( R_SML_MAIN_NOTSYNCED );
			}
		timeString.Append( timeFormatted->Des() );
		
		text.Append ( timeString );
		timeString.Zero();
		AknTextUtils::DisplayTextLanguageSpecificNumberConversion( text );
		text.Insert( 0, indexBuf );
		if ( settingEnforcement || ( *profileList )[i].iProfileLocked)
		     {
		      indexBuf.Num( lockindex );
			  text.Append ( KNSmlTab );
			  text.Insert( text.Length(), indexBuf );
			  }
		items->AppendL ( text );		
		CleanupStack::PopAndDestroy( timeFormatted );
		}

	iProfilesListBox->HandleItemAdditionL();

	if ( iProfilesListBox->Model()->NumberOfItems() == 0 )
		{
		//For Main pane primary text
		HBufC* emptyPrimText = 
		             iEikonEnv->AllocReadResourceLC( R_SML_MAIN_NOPROFILES );
        //For Main pane secondary text		                
        HBufC* emptySecText = 
		        iEikonEnv->AllocReadResourceLC( R_SML_MAIN_NOPROFILES_SEC_TXT );
        HBufC* emptyText = HBufC::NewLC( emptyPrimText->Length() + emptySecText->Length()+ 2 );        
        emptyText->Des().Append( emptyPrimText->Des() );
        emptyText->Des().Append( KSmlEOL );
        emptyText->Des().Append( emptySecText->Des() );
        iProfilesListBox->View()->SetListEmptyTextL( emptyText->Des() );
        CleanupStack::PopAndDestroy( emptyText );
		CleanupStack::PopAndDestroy( emptySecText );
		CleanupStack::PopAndDestroy( emptyPrimText );
		}
	
    FTRACE( FPrint(
        _L("[OMADM] CNSmlDMProfilesContainer::ReadProfileListL() completed, profile count = %d"),
        profileList->Count() ) );
	}

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::RefreshL 
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::RefreshL()
	{
	ReadProfileListL();
	//SetCurrentIndex( iProfilesListBox->CurrentItemIndex() );
	SetCurrentIndex( iDocument->CurrentIndex() );
	}
	
// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::SetCurrentIndex 
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::SetCurrentIndex( const TInt aIndex )
	{
    FTRACE( FPrint(
        _L("[OMADM] CNSmlDMProfilesContainer::SetCurrentIndex() aIndex = %d"),
        aIndex ) );
	
	TInt newIndex( aIndex );
	
	if ( iProfilesListBox->Model()->NumberOfItems() > 0 )
	    {
    	if ( newIndex < 0 )
    	    {
    	    newIndex = 0;
    	    }
      if ( newIndex > ( iProfilesListBox->Model()->NumberOfItems() - 1 ) )
    	    {
    	        newIndex = iProfilesListBox->Model()->NumberOfItems() - 1;
    	        iDocument->SetCurrentIndex(newIndex);
    	    }
    	iProfilesListBox->SetCurrentItemIndexAndDraw( newIndex );
	    }

	FLOG( "[OMADM] CNSmlDMProfilesContainer::SetCurrentIndex() completed" );
	}
	
// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::ClosePopupMenu
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::ClosePopupMenuL()
	{
	FLOG( "[OMADM] CNSmlDMProfilesContainer::ClosePopupMenu" );
	
	if (iContextMenuUp)
		{
	    iAppUi->SetFadedL( EFalse );
		
		CEikButtonGroupContainer* controlPane = 
		                                    CEikButtonGroupContainer::Current();
			controlPane->AddCommandSetToStackL(
					R_NSML_FOTA_PROFILES_VIEW_MSK_OPTIONS_EXIT_CONTEXTOPTIONS );
		controlPane->DrawNow();
		iEikonEnv->AppUiFactory()->ClosePopup( iEikonEnv->EikAppUi() );
		iContextMenuUp = EFalse;
		}
	}


// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::GetHelpContext
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::GetHelpContext( TCoeHelpContext& aContext ) const
	{
	FLOG( "[OMADM] CNSmlDMProfilesContainer::GetHelpContext" );
	
	aContext.iMajor = KUidSmlSyncApp;
    aContext.iContext = KDM_HLP_SERVERS_VIEW;
	}



// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::FocusChanged
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::FocusChanged( TDrawNow /*aDrawNow*/ )
	{
	if ( iProfilesListBox )
		{
		iProfilesListBox->SetFocus( IsFocused() );
		}
	}

// -----------------------------------------------------------------------------
// CNSmlDMProfilesContainer::AddIconsL
// -----------------------------------------------------------------------------
//
void CNSmlDMProfilesContainer::AddIconsL()
    {
    FLOG( "[OMADM] CNSmlDMSyncMainDialog::AddIconsL" );
    
    HBufC* appIconFilePath = HBufC::NewLC( 5 + KDC_APP_BITMAP_DIR().Length() 
                                             + KDMAppIconFileName().Length() );
    TPtr ptr = appIconFilePath->Des();
    ptr.Append( KZDrive );
    ptr.Append( KDC_APP_BITMAP_DIR );
    ptr.Append( KDMAppIconFileName );

	CArrayPtr<CGulIcon>* icons = new (ELeave) CArrayPtrFlat<CGulIcon>(10);
	iProfilesListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( icons );

	icons->AppendL( AknsUtils::CreateGulIconL( 
	                             AknsUtils::SkinInstance(),
	                             KAknsIIDQgnPropSmlHttp,
	                             *appIconFilePath,
	                             EMbmNsmldmsyncQgn_prop_sml_http,
	                             EMbmNsmldmsyncQgn_prop_sml_http_mask ) );
	                             
	icons->AppendL( AknsUtils::CreateGulIconL( 
	                          AknsUtils::SkinInstance(),
	                          KAknsIIDQgnPropSmlHttpOff,
	                          *appIconFilePath,
	                          EMbmNsmldmsyncQgn_prop_sml_http_off,
	                          EMbmNsmldmsyncQgn_prop_sml_http_off_mask ) );

	if ( FeatureManager::FeatureSupported( KFeatureIdSyncMlDmObex  ) )
		{
		icons->AppendL( AknsUtils::CreateGulIconL( 
		                            AknsUtils::SkinInstance(),
		                            KAknsIIDQgnPropSmlBt,
		                            *appIconFilePath,
		                            EMbmNsmldmsyncQgn_prop_sml_bt,
		                            EMbmNsmldmsyncQgn_prop_sml_bt_mask ) );
		                            
		icons->AppendL( AknsUtils::CreateGulIconL(
		                        AknsUtils::SkinInstance(),
		                        KAknsIIDQgnPropSmlBtOff,
		                        *appIconFilePath,
		                        EMbmNsmldmsyncQgn_prop_sml_bt_off,
		                        EMbmNsmldmsyncQgn_prop_sml_bt_off_mask ) );
		}
	
	icons->AppendL( AknsUtils::CreateGulIconL( 
	                          AknsUtils::SkinInstance(),
	                          KAknsIIDQgnIndiSettProtectedAdd,
	                          *appIconFilePath,
	                          EMbmNsmldmsyncQgn_indi_sett_protected_add,
	                          EMbmNsmldmsyncQgn_indi_sett_protected_add_mask ) );

    CleanupStack::PopAndDestroy( appIconFilePath );
    
    FLOG( "[OMADM] CNSmlDMSyncMainDialog::AddIconsL Done" );
    }

void CNSmlDMProfilesContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
    {
      if ( AknLayoutUtils::PenEnabled() )
        { 
        if (iProfilesListBox->Model()->NumberOfItems() == 0 )
           {
           if ( aPointerEvent.iType == TPointerEvent::EButton1Up )	
           		 {
           		  if ( iContextMenuUp )
                    {
                    // Absorb EButton1Up event if we already launched the stylus
                    // popup menu
                    iContextMenuUp = EFalse;
                    }
                  else  
                    {
                    ShowContextMenuL( R_SMLSYNC_CONTXT_MENUBAR_PROFILES_VIEW );	
                    }
           	
           		 }
           else
              CCoeControl::HandlePointerEventL(aPointerEvent);		 
           }
        else    
     	CCoeControl::HandlePointerEventL(aPointerEvent);    
        }
    }
// End of File