diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuigsplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuigsplugin.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,561 @@ +/* +* Copyright (c) 2006-2010 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: GSFW implementation for Presence Settings UI GS plugin. +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "psuigsplugin.h" +#include "psuigsplugin.hrh" +#include "psuigsplugincontainer.h" +#include "psuigspluginids.hrh" +#include "psuigspluginmodel.h" +#include "psuigspluginsettingview.h" + +// CONSTANTS +_LIT( KPSUIGSPluginResourceFileName, "z:\\resource\\psuigspluginrsc.rsc" ); + +#ifdef __SCALABLE_ICONS +// bitmap +_LIT( KPSUIGSPluginIconFileName, "\\resource\\apps\\psuigsplugin.mif"); +#else //__SCALABLE_ICONS +// svg file +_LIT( KPSUIGSPluginIconFileName, "\\resource\\apps\\psuigsplugin.mbm"); +#endif //__SCALABLE_ICONS + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CPSUIGSPlugin() +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CPSUIGSPlugin::CPSUIGSPlugin() + : iClosing ( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::~CPSUIGSPlugin() +// Destructor +// --------------------------------------------------------------------------- +// +CPSUIGSPlugin::~CPSUIGSPlugin() + { + delete iPSModel; + FeatureManager::UnInitializeLib(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::ConstructL() + { + // preparing resources for use + TFileName fileName( KPSUIGSPluginResourceFileName ); + BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName ); + iResourceLoader.OpenL( fileName ); + // base construct (base needs the resources to be loaded 1st) + BaseConstructL( R_PSUI_MAIN_VIEW ); + FeatureManager::InitializeLibL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::NewL() +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CPSUIGSPlugin* CPSUIGSPlugin::NewL( TAny* /*aAppUi*/ ) + { + CPSUIGSPlugin* self = new( ELeave ) CPSUIGSPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::Id() +// See header for details. +// --------------------------------------------------------------------------- +// +TUid CPSUIGSPlugin::Id() const + { + return TUid::Uid( PSUIGSPluginImplUid ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::NewContainerL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::NewContainerL() + { + iContainer = new ( ELeave ) CPSUIGSPluginContainer( this ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DoActivateL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + if ( KPreSettingViewId != aPrevViewId.iViewUid ) + { + iPSUIGSPrevViewId = aPrevViewId; + } + + // model & observer constructed only when needed + if ( !iPSModel ) + { + iPSModel = CPSUIGSPluginModel::NewL(); + iAppUi->AddViewDeactivationObserverL( this ); + } + + const TInt id = iPSModel->SettingsId(); + if ( id ) + {// readjust the focus + SetCurrentItem( iPSModel->SettingsIDArray().Find( id )); + } + + iClosing = EFalse; + CGSBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage ); + UpdateMSK(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DoDeactivate() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DoDeactivate() + { + CGSBaseView::DoDeactivate(); + if ( iClosing ) + {// PSUI plugin is going to be closed so it is safe to free some memory + delete iPSModel; + iPSModel = NULL; + delete iSettingView; + iSettingView = NULL; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleViewDeactivation() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleViewDeactivation( + const TVwsViewId& aViewIdToBeDeactivated, + const TVwsViewId& aNewlyActivatedViewId) + { + if ( TUid::Uid( PSUIGSPluginImplUid ) == aViewIdToBeDeactivated.iViewUid && + iPSUIGSPrevViewId.iViewUid == aNewlyActivatedViewId.iViewUid ) + { + iClosing = ETrue; + iAppUi->RemoveViewDeactivationObserver( this ); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleCommandL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EAknSoftkeyBack: + { + RemoveSettingView(); + iAppUi->ActivateLocalViewL( iPSUIGSPrevViewId.iViewUid ); + break; + } + case EPSUICmdEdit: + { + HandleListBoxSelectionL(); + break; + } + case EPSUICmdDelete: + { + DeleteSettingsL(); + break; + } + case EPSUICmdNewSettingsDefault: + { + CreateNewDefaultSettingsL(); + break; + } + case EPSUICmdNewSettingsExisting: + { + CreateCopyOfExistingSettingsL(); + break; + } + case EAknCmdHelp: + { + if( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + HlpLauncher::LaunchHelpApplicationL( + iEikonEnv->WsSession(), iAppUi->AppHelpContextL() ); + } + break; + } + default: + { + iAppUi->HandleCommandL( aCommand ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::SettingCountAndIndex() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPlugin::SettingCountAndIndex( TInt& aIndex ) + { + CEikTextListBox* listbox = Container()->iListBox;// not owned + TInt count = listbox->Model()->NumberOfItems(); + aIndex = count ? listbox->CurrentItemIndex() : KErrNotFound; + + return count; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleListBoxSelectionL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleListBoxSelectionL() + { + TInt index = KErrNotFound; + if ( SettingCountAndIndex( index )) + { + iPSModel->EditSettingsL( index ); + + ConstructSettingViewL(); + iAppUi->ActivateLocalViewL( KPreSettingViewId ); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DeleteSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DeleteSettingsL() + { + TInt index = KErrNotFound; + TInt count = SettingCountAndIndex( index ); + if ( count ) + { + if ( AcceptDeletionL( count, index )) + { + iPSModel->DeleteSettingsL( index, ETrue ); + CEikTextListBox* listbox = Container()->iListBox;// not owned + AknListBoxUtils::HandleItemRemovalAndPositionHighlightL( + listbox, index, ETrue ); + listbox->DrawNow(); + UpdateMSK(); + } + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::AcceptDeletionL() +// See header for details. +// --------------------------------------------------------------------------- +// +TBool CPSUIGSPlugin::AcceptDeletionL( TInt aCount, TInt aIndex ) + { + HBufC* currentName = iPSModel->SettingNameLC( aIndex ); + HBufC* string = NULL; + if ( aCount == 1 ) + { + string = StringLoader::LoadLC( R_QTN_PRESENCE_SETTINGS_DELETE_LAST, *currentName ); + } + else + { + string = StringLoader::LoadLC( R_QTN_QUERY_COMMON_CONF_DELETE, *currentName ); + } + + CAknQueryDialog* query = CAknQueryDialog::NewL( CAknQueryDialog::EConfirmationTone ); + TInt ok = query->ExecuteLD( R_PSUI_CONF_QUERY, *string ); + + CleanupStack::PopAndDestroy( 2, currentName );//currentName, string + + return ( ok ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::GetCaptionL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::GetCaptionL( TDes& aCaption ) const + { + StringLoader::Load( aCaption, R_QTN_SET_FOLDER_PRESENCE ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::PluginProviderCategory() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPlugin::PluginProviderCategory() const + { + return KGSPluginProviderInternal; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CreateIconL() +// See header for details. +// --------------------------------------------------------------------------- +// +CGulIcon* CPSUIGSPlugin::CreateIconL( const TUid aIconType ) + { + CGulIcon* icon = NULL; + if( aIconType == KGSIconTypeLbxItem ) + { + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetConnPresence, + KPSUIGSPluginIconFileName, + EMbmPsuigspluginQgn_prop_set_conn_presence, + EMbmPsuigspluginQgn_prop_set_conn_presence_mask ); + } + else + { + icon = CGSPluginInterface::CreateIconL( aIconType ); + } + + return icon; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DynInitMenuPaneL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane *aMenuPane ) + { + // remove some of the items if no settings available + const TInt count = Container()->iListBox->Model()->NumberOfItems(); + if ( aResourceId == R_PSUI_MAINVIEW_MENUPANE && + 0 == count ) + { + aMenuPane->DeleteMenuItem( EPSUICmdEdit ); + aMenuPane->DeleteMenuItem( EPSUICmdDelete ); + } + if ( aResourceId == R_PSUI_NEWSETTINGS_MENU && + 0 == count ) + { + aMenuPane->DeleteMenuItem( EPSUICmdNewSettingsExisting ); + } + + // help-item handling + if ( aResourceId == R_PSUI_MAINVIEW_MENUPANE && + !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->DeleteMenuItem( EAknCmdHelp ); + } + + TInt index( KErrNotFound ); + SettingCountAndIndex( index ); + + if ( KErrNotFound < index ) + { + // Hide delete option if sip profile used with presence settings + // is registered. + if ( iPSModel->IsSipProfileRegisteredL( index ) ) + { + TInt pos( KErrNotFound ); + if ( aMenuPane->MenuItemExists( EPSUICmdDelete, pos ) ) + { + aMenuPane->SetItemSpecific( EPSUICmdDelete, EFalse ); + aMenuPane->SetItemDimmed( EPSUICmdDelete, ETrue ); + } + } + else + { + TInt pos( KErrNotFound ); + if ( aMenuPane->MenuItemExists( EPSUICmdDelete, pos ) ) + { + aMenuPane->SetItemSpecific( EPSUICmdDelete, ETrue ); + aMenuPane->SetItemDimmed( EPSUICmdDelete, EFalse ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::PSModel() +// See header for details. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginModel* CPSUIGSPlugin::PSModel() + { + __ASSERT_DEBUG( iPSModel,User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound )); + return iPSModel; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::ConstructSettingViewL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::ConstructSettingViewL() + { + if ( !iSettingView ) + {// no view yet, construct it + CAknView* view = CPSUIGSPluginSettingView::NewL( this ); + CleanupStack::PushL( view ); + iAppUi->AddViewL( view ); + CleanupStack::Pop( view ); + iSettingView = view; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::RemoveSettingView() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::RemoveSettingView() + { + // Remove view from iAppUi -> View is deleted by iAppUi automatically. + if ( iSettingView ) + { + iAppUi->RemoveView( KPreSettingViewId ); + iSettingView = NULL; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CreateNewDefaultSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::CreateNewDefaultSettingsL() + { + iPSModel->CreateDefaultSettingsL(); + ConstructSettingViewL(); + iAppUi->ActivateLocalViewL( KPreSettingViewId ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CreateCopyOfExistingSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::CreateCopyOfExistingSettingsL() + { + CAknSinglePopupMenuStyleListBox* list = + new ( ELeave ) CAknSinglePopupMenuStyleListBox; + CleanupStack::PushL( list ); + + CAknPopupList* popupList = + CAknPopupList::NewL( list, R_AVKON_SOFTKEYS_OK_CANCEL ); + CleanupStack::PushL( popupList ); + + HBufC* title = StringLoader::LoadLC( R_QTN_PRESENCE_PROPMT_USE_EXIST ); + popupList->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + + list->ConstructL( popupList, CEikListBox::ELeftDownInViewRect ); + list->CreateScrollBarFrameL( ETrue ); + list->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + + CTextListBoxModel* model = list->Model(); + model->SetItemTextArray( iPSModel->SettingNames() );// setting names not owned + model->SetOwnershipType( ELbmDoesNotOwnItemArray ); + list->HandleItemAdditionL(); + + CleanupStack::Pop( popupList ); + TInt keyPress = popupList->ExecuteLD(); + + if ( keyPress ) + { + iPSModel->DuplicateExistingSettingsL( list->CurrentItemIndex() ); + ConstructSettingViewL(); + iAppUi->ActivateLocalViewL( KPreSettingViewId ); + } + + CleanupStack::PopAndDestroy( list ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::UpdateMSK() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::UpdateMSK() + { + if ( !Cba() ) + { + return; + } + + TBool showEdit = ( 0 < Container()->iListBox->Model()->NumberOfItems()); + CEikCba* cba = static_cast< CEikCba* >( Cba()->ButtonGroup() ); + cba->MakeCommandVisible( EPSUICmdEdit, showEdit ); + cba->DrawNow(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleListBoxEventL() +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleListBoxEventL( + CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent) + { + // if the Select Key has been pressed + if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) || + (aListBoxEvent == MEikListBoxObserver::EEventItemSingleClicked)) + { + HandleListBoxSelectionL(); + } + } + +// End of file