/*
* Copyright (c) 2008 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: Definition of the class CPbkxRclSearchResultDlg.
*
*/
#include "emailtrace.h"
#include <pbkxrclengine.rsg>
#include <eikmover.h>
#include <coemain.h>
#include <aknnavi.h>
#include <aknnavide.h>
#include <aknappui.h>
#include <AknIconUtils.h>
#include <cntitem.h>
#include <badesca.h>
#include <StringLoader.h>
#include <CPbkContactEngine.h>
#include <CPbkContactItem.h>
#include <gulicon.h>
#include <avkon.mbg>
#include <pbkxrclengine.mbg>
//<cmail>
#include "cfsccontactactionmenu.h"
#include "mfsccontactactionmenumodel.h"
#include "mfsccontactaction.h"
#include "cfsccontactactionmenuitem.h"
#include "fsccontactactionservicedefines.h"
#include "fsccontactactionmenudefines.h"
//</cmail>
#include <data_caging_path_literals.hrh>
#include <AknsUtils.h>
#include <eikclb.h>
#include <eikclbd.h>
#include <eiklbo.h> // MEikListBoxObserver
#include <csxhelp/cmail.hlp.hrh>
#include "cpbkxrclsearchresultdlg.h"
#include "pbkxremotecontactlookuppanic.h"
#include "engine.hrh"
#include "pbkxrclutils.h"
#include "cpbkxrclvcardsender.h"
#include "cpbkxrclactionservicewrapper.h"
// list box field formats
_LIT( KFieldFormat, "\t%S %S" );
_LIT( KFieldFormatWithIcon, "\t%S %S\t%d" );
_LIT( KFieldFormatDispName, "\t%S" );
_LIT( KFieldFormatDispNameWithIcon, "\t%S\t%d" );
// Constant to measure when user is scrolling.
const TInt KKeyScrolling = 1;
// <cmail> S60 UID update
const TInt KPbkxRemoteContactLookupServiceImplImpUid = 0x2001FE0D;
// </cmail> S60 UID update
// ======== MEMBER FUNCTIONS ========
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::NewL
// ---------------------------------------------------------------------------
//
CPbkxRclSearchResultDlg* CPbkxRclSearchResultDlg::NewL(
TInt& aIndex,
CDesCArray* aArray,
MEikCommandObserver* aCommand,
RPointerArray<CContactCard>& aContactItems,
CPbkContactEngine& aContactEngine,
CPbkxRclActionServiceWrapper& aActionService,
TBool aContactSelectorEnabled )
{
FUNC_LOG;
CPbkxRclSearchResultDlg* dialog = new ( ELeave ) CPbkxRclSearchResultDlg(
aIndex,
aArray,
aCommand,
aContactItems,
aContactEngine,
aActionService,
aContactSelectorEnabled );
CleanupStack::PushL( dialog );
dialog->ConstructL();
CleanupStack::Pop( dialog );
return dialog;
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::CPbkxRclSearchResultDlg
// ---------------------------------------------------------------------------
//
CPbkxRclSearchResultDlg::CPbkxRclSearchResultDlg(
TInt& aIndex,
CDesCArray* aArray,
MEikCommandObserver* aCommand,
RPointerArray<CContactCard>& aContactItems,
CPbkContactEngine& aContactEngine,
CPbkxRclActionServiceWrapper& aActionService,
TBool aContactSelectorEnabled ) :
CPbkxRclBaseDlg( aIndex, aArray, aCommand, ETrue ),
iContactEngine( aContactEngine ),
iContactActionService( aActionService ),
iItems( aArray ), iContactItems( aContactItems ),
iContactSelectorEnabled( aContactSelectorEnabled ),
iSelectedItemIndex( aIndex ),
iIsInfoDlgVisible( EFalse )
{
FUNC_LOG;
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ConstructL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::ConstructL()
{
FUNC_LOG;
CPbkxRclBaseDlg::ConstructL( R_RCL_SEARCH_RESULT_DIALOG_MENU_BAR );
LoadNaviTextL();
// add foreground observer
CCoeEnv::Static()->AddForegroundObserverL( *this );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::~CPbkxRclSearchResultDlg
// ---------------------------------------------------------------------------
//
CPbkxRclSearchResultDlg::~CPbkxRclSearchResultDlg()
{
FUNC_LOG;
CCoeEnv::Static()->RemoveForegroundObserver( *this );
ResetStatusPane();
iNaviText.Close();
delete iAddRecipientIcon;
iContactActionService.CancelQuery();
if ( iActionMenu )
{
delete iActionMenu;
iActionMenu = NULL;
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ExecuteLD
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::ExecuteLD()
{
FUNC_LOG;
PrepareLC( R_RCL_SEARCH_RESULT_DIALOG );
UpdateGraphics();
UpdateColors();
HBufC* noItemText = StringLoader::LoadLC( R_QTN_RCL_NO_RESULTS );
ListBox()->View()->SetListEmptyTextL( *noItemText );
CleanupStack::PopAndDestroy( noItemText );
CreateListBoxIconsL();
InitializeActionMenuL();
SetupStatusPaneL();
CreateListBoxEntriesL();
if ( iContactItems.Count() == 0 )
{
ConstructMenuBarL( R_RCL_OPTIONS_BACK_CONTEXTMENU );
}
CAknSelectionListDialog::RunLD();
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::CurrentItemIndex
// ---------------------------------------------------------------------------
//
TInt CPbkxRclSearchResultDlg::CurrentItemIndex() const
{
FUNC_LOG;
return ListBox()->CurrentItemIndex();
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::SetCurrentItemIndex
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::SetCurrentItemIndexL( TInt aIndex )
{
FUNC_LOG;
if ( aIndex >= 0 && aIndex < iContactItems.Count() )
{
// update list box entrys first
TInt oldIndex = iSelectedItemIndex;
ListBox()->SetCurrentItemIndex( aIndex );
iSelectedItemIndex = aIndex;
UpdateListBoxEntryL( iSelectedItemIndex );
UpdateListBoxEntryL( oldIndex );
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::Close
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::Close()
{
FUNC_LOG;
// this will not leave, because TryExitL doesn't call leaving methods
// when EAknSoftkeyCancel is used
iExit = ETrue;
TRAP_IGNORE( TryExitL( EAknSoftkeyCancel ) ); // <cmail>
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::UpdateDialogL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::UpdateDialogL()
{
FUNC_LOG;
LoadNaviTextL();
CreateListBoxEntriesL();
UpdateStatusPaneL();
if ( iContactItems.Count() == 0 )
{
ConstructMenuBarL( R_RCL_OPTIONS_BACK_CONTEXTMENU );
}
else
{
ConstructMenuBarL( R_RCL_OPTIONS_BACK_OPEN );
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::SendBusinessCardL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::SendBusinessCardL()
{
FUNC_LOG;
CPbkxRclvCardSender* sender = CPbkxRclvCardSender::NewLC( iContactEngine );
TInt curIndex = CurrentItemIndex();
CContactCard* current = iContactItems[curIndex];
CPbkContactItem* contactItem = PbkxRclUtils::CreateContactItemL(
current,
iContactEngine );
CleanupStack::PushL( contactItem );
sender->SendvCardL( *contactItem, *(iContactActionService.ContactConverter()) );
CleanupStack::PopAndDestroy( contactItem );
CleanupStack::PopAndDestroy( sender );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::DynInitMenuPaneL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::DynInitMenuPaneL(
TInt aResourceId,
CEikMenuPane* aMenuPane )
{
FUNC_LOG;
if ( aResourceId == R_RCL_SEARCH_RESULT_DIALOG_MENU_PANE )
{
if ( iContactItems.Count() == 0 )
{
// when there are 0 results, only new search option is available
aMenuPane->SetItemDimmed( ERclCmdViewDetails, ETrue );
aMenuPane->SetItemDimmed( ERclCmdAddAsRecipient, ETrue );
aMenuPane->SetItemDimmed( ERclCmdSaveToContacts, ETrue );
aMenuPane->SetItemDimmed( ERclCmdCall, ETrue );
aMenuPane->SetItemDimmed( ERclCmdSend, ETrue );
}
else
{
if ( !iContactSelectorEnabled )
{
aMenuPane->SetItemDimmed( ERclCmdAddAsRecipient, ETrue );
aMenuPane->SetItemDimmed(
ERclCmdCall,
!CallActionsAvailable() );
// send menu is always visible, since business card can
// always be sent
}
else
{
aMenuPane->SetItemDimmed( ERclCmdCall, ETrue );
aMenuPane->SetItemDimmed( ERclCmdSend, ETrue );
}
aMenuPane->SetItemDimmed(
ERclCmdSaveToContacts,
!iContactActionService.IsActionEnabled( KFscAtManSaveAs ) );
}
}
else if ( aResourceId == R_RCL_CALL_MENU_PANE )
{
aMenuPane->SetItemDimmed(
ERclCmdVoiceCall,
!iContactActionService.IsActionEnabled( KFscAtComCallGSM ) );
aMenuPane->SetItemDimmed(
ERclCmdVideoCall,
!iContactActionService.IsActionEnabled( KFscAtComCallVideo ) );
aMenuPane->SetItemDimmed(
ERclCmdVoip,
!iContactActionService.IsActionEnabled( KFscAtComCallVoip ) );
}
else if ( aResourceId == R_RCL_SEND_MENU_PANE )
{
aMenuPane->SetItemDimmed(
ERclCmdSendMsg,
!iContactActionService.IsActionEnabled( KFscAtComSendMsg ) );
aMenuPane->SetItemDimmed(
ERclCmdSendEmail,
!iContactActionService.IsActionEnabled( KFscAtComSendEmail ) );
aMenuPane->SetItemDimmed(
ERclCmdSendMeetingReq,
ETrue /*!iContactActionService.IsActionEnabled( KFscAtComSendCalReq )*/ );
// "Send meeting request" option should not be available
aMenuPane->SetItemDimmed(
ERclCmdSendAudioMsg,
!iContactActionService.IsActionEnabled( KFscAtComSendAudio ) );
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::GetHelpContext
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::GetHelpContext( TCoeHelpContext& aContext ) const
{
FUNC_LOG;
if ( !iIsInfoDlgVisible )
{
aContext.iMajor = TUid::Uid( KPbkxRemoteContactLookupServiceImplImpUid );
aContext.iContext = KRLOOK_HLP_RESULT_VIEW;
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::HandleGainingForeground
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::HandleGainingForeground()
{
FUNC_LOG;
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::HandleLosingForeground
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::HandleLosingForeground()
{
FUNC_LOG;
if ( ScrollingInProgress() )
{
// scrolling was in progress
TRAP_IGNORE( ScrollingStoppedL() );
iKeyDown = EFalse;
iKeyCounter = 0;
}
}
// ----------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::HandleListBoxEventL()
// ----------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::HandleListBoxEventL(
CEikListBox* /* aListBox */,
TListBoxEvent aEventType )
{
FUNC_LOG;
switch ( aEventType )
{
case EEventEnterKeyPressed:
case EEventItemClicked:
{
if ( iContactItems.Count() > 0 )
{
TInt oldIndex = iSelectedItemIndex;
iSelectedItemIndex = CurrentItemIndex();
if ( oldIndex != iSelectedItemIndex )
{
UpdateListBoxEntryL( oldIndex );
// update listbox entry if we are not yet fast scrolling
if ( !ScrollingInProgress() )
{
SetCurrentContactToActionServiceL();
UpdateListBoxEntryL( iSelectedItemIndex );
}
}
}
break;
}
case EEventItemActioned:
{
break;
}
case EEventItemDoubleClicked:
{
ProcessCommandL( ERclCmdViewDetails );
break;
}
default:
{
break;
}
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::OfferKeyEventL
// ---------------------------------------------------------------------------
//
TKeyResponse CPbkxRclSearchResultDlg::OfferKeyEventL(
const TKeyEvent& aKeyEvent,
TEventCode aType )
{
FUNC_LOG;
// if there are no items, don't handle key presses
TInt count = iContactItems.Count();
if ( iExit || aType != EEventKey )
{
if ( aType == EEventKeyUp )
{
// added count condition
if ( count && ScrollingInProgress() && !iIsScrollLaunched )
{
// scrolling ended
iIsScrollLaunched = ETrue;
ScrollingStoppedL();
}
iKeyCounter = 0;
iKeyDown = EFalse;
}
return EKeyWasConsumed;
}
if ( aKeyEvent.iCode == EKeyUpArrow ||
aKeyEvent.iCode == EKeyDownArrow )
{
iKeyDown = ETrue;
iKeyCounter++;
}
else
{
// make sure that if we were scrolling we stop it now
if ( ScrollingInProgress() )
{
ScrollingStoppedL();
}
iKeyDown = EFalse;
iKeyCounter = 0;
}
switch ( aKeyEvent.iCode )
{
case EKeyPhoneSend:
{
ProcessCommandL( ERclCmdVoiceCall );
break;
}
case EKeyOK:
{
if ( count > 0 )
{
// opens result information view
ProcessCommandL( ERclCmdViewDetails );
}
}
break;
case EKeyUpArrow: // fall through, same functionality with these two
case EKeyDownArrow:
{
if ( count > 0 )
{
TInt oldIndex = iSelectedItemIndex;
CAknSelectionListDialog::OfferKeyEventL( aKeyEvent, aType );
iSelectedItemIndex = CurrentItemIndex();
if ( oldIndex != iSelectedItemIndex )
{
UpdateListBoxEntryL( oldIndex );
// update listbox entry if we are not yet fast scrolling
if ( !ScrollingInProgress() )
{
SetCurrentContactToActionServiceL();
UpdateListBoxEntryL( iSelectedItemIndex );
}
}
}
}
break;
case EKeyRightArrow:
{
if ( !AknLayoutUtils::LayoutMirrored() && ActionMenuAvailable() )
{
// opens action menu
ShowActionMenuL();
}
}
break;
case EKeyLeftArrow:
{
if ( AknLayoutUtils::LayoutMirrored() && ActionMenuAvailable() )
{
ShowActionMenuL();
}
}
break;
case EKeyEscape:
{
// exit application
iExit = ETrue;
ProcessCommandL( EAknCmdExit );
}
break;
default:
break;
}
return EKeyWasConsumed;
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::OkToExitL
// ---------------------------------------------------------------------------
//
TBool CPbkxRclSearchResultDlg::OkToExitL( TInt aButtonId )
{
FUNC_LOG;
if( aButtonId == EAknSoftkeyOpen )
{
ProcessCommandL( ERclCmdViewDetails );
return EFalse;
}
else if ( aButtonId == EAknSoftkeyContextOptions )
{
iMenuBar->TryDisplayMenuBarL();
return EFalse;
}
else
{
return CAknDialog::OkToExitL( aButtonId );
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::SetupStatusPaneL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::SetupStatusPaneL()
{
FUNC_LOG;
CAknAppUi* appUi = static_cast<CAknAppUi*>( CCoeEnv::Static()->AppUi() );
CEikStatusPane* statusPane = appUi->StatusPane();
iNaviPane = reinterpret_cast<CAknNavigationControlContainer*>(
statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
iNaviDecorator = iNaviPane->CreateNavigationLabelL( iNaviText );
iNaviPane->PushL( *iNaviDecorator );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::UpdateStatusPaneL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::UpdateStatusPaneL()
{
FUNC_LOG;
ResetStatusPane();
iNaviDecorator = iNaviPane->CreateNavigationLabelL( iNaviText );
iNaviPane->PushL( *iNaviDecorator );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ResetStatusPane
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::ResetStatusPane()
{
FUNC_LOG;
// navi pane and navi decorator may be null if dialog construction
// failed
if ( iNaviPane != NULL && iNaviDecorator != NULL )
{
iNaviPane->Pop( iNaviDecorator );
delete iNaviDecorator;
iNaviDecorator = NULL;
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::CreateListBoxEntriesL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::CreateListBoxEntriesL()
{
FUNC_LOG;
iItems->Delete( 0, iItems->Count() );
TInt count = iContactItems.Count();
if ( count > 0 )
{
iSelectedItemIndex = 0;
}
SetCurrentContactToActionServiceL();
for ( TInt i = 0; i < count; i++ )
{
CreateListBoxEntryL( i );
}
CEikListBox* listBox = ListBox();
if ( count > 0 )
{
listBox->SetTopItemIndex( 0 );
listBox->SetCurrentItemIndex( 0 );
}
listBox->HandleItemAdditionL();
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::CreateListBoxIconsL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::CreateListBoxIconsL()
{
FUNC_LOG;
CFbsBitmap* bitmap = NULL;
CFbsBitmap* mask = NULL;
TFileName dllFileName;
Dll::FileName( dllFileName );
TParse parse;
parse.Set( KEngineIconFile, &KDC_APP_RESOURCE_DIR, &dllFileName );
// <cmail> icons changed
if ( iContactSelectorEnabled )
{
// add as recipient icon
AknsUtils::CreateIconL(
AknsUtils::SkinInstance(),
KAknsIIDQgnFsRclActionRecipient,
bitmap,
mask,
parse.FullName(),
EMbmPbkxrclengineQgn_prop_cmail_contacts_group,
EMbmPbkxrclengineQgn_prop_cmail_contacts_group_mask );
CleanupStack::PushL( bitmap );
CleanupStack::PushL( mask );
iAddRecipientIcon = CGulIcon::NewL( bitmap, mask );
CleanupStack::Pop( mask );
CleanupStack::Pop( bitmap );
}
// action menu icon
AknsUtils::CreateIconL(
AknsUtils::SkinInstance(),
KAknsIIDQgnFsHscrActionArrowRight,
bitmap,
mask,
parse.FullName(),
EMbmPbkxrclengineQgn_indi_cmail_action_arrow_right,
EMbmPbkxrclengineQgn_indi_cmail_action_arrow_right_mask );
// </cmail>
CleanupStack::PushL( bitmap );
CleanupStack::PushL( mask );
CGulIcon* icon = CGulIcon::NewL( bitmap, mask );
CleanupStack::PushL( icon );
CArrayPtr<CGulIcon>* iconArray =
new ( ELeave ) CArrayPtrFlat<CGulIcon>( KArrayGranularity );
CleanupStack::PushL( iconArray );
iconArray->AppendL( icon );
SetIconArrayL( iconArray );
CleanupStack::Pop( iconArray );
CleanupStack::Pop( icon );
CleanupStack::Pop( mask );
CleanupStack::Pop( bitmap );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::CreateListBoxEntryL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::CreateListBoxEntryL( TInt aIndex )
{
FUNC_LOG;
CContactCard* card = iContactItems[aIndex];
TPtrC dispName = PbkxRclUtils::FieldText( card, KUidContactFieldDefinedText );
TPtrC firstName = PbkxRclUtils::FieldText( card, KUidContactFieldGivenName );
TPtrC lastName = PbkxRclUtils::FieldText( card, KUidContactFieldFamilyName );
RBuf entry;
TPtrC entryFirstName;
if ( dispName.Length() != 0 )
{
entryFirstName.Set(dispName);
entry.CreateL( entryFirstName.Length() + KExtraSpaceInListboxEntry );
}
else
{
entryFirstName.Set(firstName);
entry.CreateL( firstName.Length() + lastName.Length() + KExtraSpaceInListboxEntry );
}
CleanupClosePushL( entry );
if ( dispName.Length() != 0 )
{
if ( aIndex == iSelectedItemIndex && ActionMenuAvailable() )
{
entry.Format(
KFieldFormatDispNameWithIcon,
&entryFirstName,
EActionMenuEnabled );
}
else
{
entry.Format( KFieldFormatDispName, &entryFirstName );
}
}
else
{
if ( aIndex == iSelectedItemIndex && ActionMenuAvailable() )
{
entry.Format(
KFieldFormatWithIcon,
&firstName,
&lastName,
EActionMenuEnabled );
}
else
{
entry.Format( KFieldFormat, &firstName, &lastName );
}
}
iItems->InsertL( aIndex, entry );
CleanupStack::PopAndDestroy( &entry );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::UpdateListBoxEntryL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::UpdateListBoxEntryL( TInt aIndex )
{
FUNC_LOG;
iItems->Delete( aIndex );
CreateListBoxEntryL( aIndex );
ListBox()->DrawItem( aIndex );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::SetCurrentContactToActionServiceL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::SetCurrentContactToActionServiceL()
{
FUNC_LOG;
if ( iActionMenu )
{
if ( iContactItems.Count() > 0 )
{
// set current contact to action service
CPbkContactItem* currentContact = PbkxRclUtils::CreateContactItemL(
iContactItems[iSelectedItemIndex],
iContactEngine );
CleanupStack::PushL( currentContact );
iContactActionService.SetCurrentContactL(
currentContact );
CleanupStack::PopAndDestroy( currentContact );
}
else
{
iContactActionService.SetCurrentContactL( NULL );
}
if ( iActionMenu )
{
// update action menu
iActionMenu->Model().AddPreQueriedCasItemsL();
// save as contact not added for this contact
iSaveAsAdded = EFalse;
}
}
iIsScrollLaunched = EFalse;
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::LoadNaviTextL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::LoadNaviTextL()
{
FUNC_LOG;
iNaviText.Close();
HBufC* naviText = NULL;
if ( iContactItems.Count() == 1 )
{
naviText = StringLoader::LoadLC( R_QTN_RCL_ONE_RESULT_NAVI );
}
else if ( iContactItems.Count() == 0 )
{
naviText = NULL;
}
else
{
naviText = StringLoader::LoadLC(
R_QTN_RCL_RESULT_NAVI,
iContactItems.Count() );
}
if (naviText)
{
iNaviText.CreateL( *naviText );
CleanupStack::PopAndDestroy( naviText );
}
else
{
iNaviText = KNullDesC;
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::CallActionsAvailable
// ---------------------------------------------------------------------------
//
TBool CPbkxRclSearchResultDlg::CallActionsAvailable() const
{
FUNC_LOG;
return iContactActionService.IsActionEnabled( KFscAtComCallGSM ) ||
iContactActionService.IsActionEnabled( KFscAtComCallVideo );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::InitializeActionMenuL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::InitializeActionMenuL()
{
FUNC_LOG;
iActionMenu = CFscContactActionMenu::NewL(
*(iContactActionService.ActionService()) );
MFscContactActionMenuModel& model = iActionMenu->Model();
if ( iContactSelectorEnabled && iContactItems.Count() > 0 )
{
// add static custom item
HBufC* menuText = StringLoader::LoadLC(
R_QTN_RCL_ADD_RECIPIENT_ACTION_MENU_TEXT );
CFscContactActionMenuItem* item = model.NewMenuItemL(
*menuText,
iAddRecipientIcon,
KPbkxRclAddRecipientPriority,
ETrue,
KPbkxRclAddRecipientActionUid );
CleanupStack::PushL( item );
model.AddItemL( item );
CleanupStack::Pop( item );
CleanupStack::PopAndDestroy( menuText );
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ShowActionMenuL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::ShowActionMenuL()
{
FUNC_LOG;
CreateAndAddSaveAsContactActionL();
TFscContactActionMenuPosition pos = GetActionMenuPosition();
TFscActionMenuResult result = iActionMenu->ExecuteL( pos );
// if custom item was selected, it was our add to recipient or
// save as contact
if ( result == EFscCustomItemSelected )
{
const TFscContactActionQueryResult* saveAsContact =
iContactActionService.GetResult( KFscAtManSaveAs );
TInt itemIndex = iActionMenu->FocusedItemIndex();
CFscContactActionMenuItem& item =
iActionMenu->Model().ItemL( itemIndex );
if ( item.ImplementationUid() == KPbkxRclAddRecipientActionUid )
{
ProcessCommandL( ERclCmdAddAsRecipient );
}
else if ( saveAsContact != NULL &&
item.ImplementationUid() == saveAsContact->iAction->Uid() )
{
ProcessCommandL( ERclCmdSaveToContacts );
}
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::GetActionMenuPosition
// ---------------------------------------------------------------------------
//
TFscContactActionMenuPosition CPbkxRclSearchResultDlg::GetActionMenuPosition()
{
FUNC_LOG;
const TInt KNumberOfMenuPositions = 3;
CEikListBox* listBox = ListBox();
TInt itemsInView = listBox->View()->NumberOfItemsThatFitInRect( Rect() );
TInt topIndex = listBox->TopItemIndex();
TInt curIndex = listBox->CurrentItemIndex();
TInt normalizedIndex = curIndex - topIndex;
TInt segmentSize = itemsInView / KNumberOfMenuPositions;
if ( normalizedIndex < segmentSize )
{
return EFscTop;
}
else if ( normalizedIndex < ( 2 * segmentSize) )
{
return EFscCenter;
}
else
{
return EFscBottom;
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ActionMenuAvailable
// ---------------------------------------------------------------------------
//
TBool CPbkxRclSearchResultDlg::ActionMenuAvailable() const
{
FUNC_LOG;
TInt count = iActionMenu->Model().ItemCount() > 0;
if ( !iSaveAsAdded )
{
if ( iContactActionService.IsActionEnabled( KFscAtManSaveAs ) )
{
count++;
}
}
return count > 0;
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::CreateAndAddSaveAsContactActionL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::CreateAndAddSaveAsContactActionL()
{
FUNC_LOG;
if ( !iSaveAsAdded )
{
const TFscContactActionQueryResult* saveAsContact =
iContactActionService.GetResult( KFscAtManSaveAs );
if ( saveAsContact != NULL )
{
MFscContactActionMenuModel& model = iActionMenu->Model();
const MFscContactAction* action = saveAsContact->iAction;
CFscContactActionMenuItem* item = model.NewMenuItemL(
action->ActionMenuText(),
action->Icon(),
saveAsContact->iPriority,
EFalse,
action->Uid() );
CleanupStack::PushL( item );
model.AddItemL( item );
iSaveAsAdded = ETrue;
CleanupStack::Pop( item );
}
}
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ScrollingInProgress
// ---------------------------------------------------------------------------
//
TBool CPbkxRclSearchResultDlg::ScrollingInProgress() const
{
FUNC_LOG;
return iKeyDown && iKeyCounter > KKeyScrolling;
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ScrollingStopped
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::ScrollingStoppedL()
{
FUNC_LOG;
SetCurrentContactToActionServiceL();
UpdateListBoxEntryL( iSelectedItemIndex );
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::ConstructContextMenuL
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::ConstructMenuBarL( TInt aResourceId )
{
FUNC_LOG;
CEikButtonGroupContainer& butContainer = ButtonGroupContainer();
butContainer.SetCommandSetL( aResourceId );
butContainer.DrawNow();
}
// ---------------------------------------------------------------------------
// CPbkxRclSearchResultDlg::InfoDlgVisible
// ---------------------------------------------------------------------------
//
void CPbkxRclSearchResultDlg::InfoDlgVisible( TBool aVisible )
{
FUNC_LOG;
iIsInfoDlgVisible = aVisible;
}