diff -r 000000000000 -r 3ce708148e4d omadm/omadmappui/src/NSmlDMProfilesContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadm/omadmappui/src/NSmlDMProfilesContainer.cpp Thu Dec 17 08:40:12 2009 +0200 @@ -0,0 +1,666 @@ +/* +* 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 // popup dialogs +#include +#include +#include +#include +#include +#include + +#include + +#include "NSmlDMProfilesContainer.h" +#include "NSmlDMProfilesView.h" +#include "NSmlDMSyncApp.h" +#include "NSmlDMSyncAppEngine.h" +#include "NSmlDMSyncUi.hrh" +#include "NSmlDMdef.h" +#include "NSmlDMSyncDebug.h" +#include +#include +#include + + +#include + + +// ========================== 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* 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()" ); + iProfilesListBox->SetCurrentItemIndexAndDraw( aListBox->CurrentItemIndex() ); + 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 *profileList = + iDocument->ProfileList( index ); + CDesCArray* items = (CDesCArray*) iProfilesListBox->Model()->ItemTextArray(); + + items->Reset(); + + TBuf text; + TBuf timeString; + TBuf 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* icons = new (ELeave) CArrayPtrFlat(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