--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/CCASearchViewContainer.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,1825 @@
+/*
+* Copyright (c) 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: Container class for search view
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CCASearchViewContainer.h"
+#include "ChatDefinitions.h"
+#include "CCAStatusPaneHandler.h"
+#include "MCAViewSwitcher.h"
+#include "CCAAppUi.h"
+#include "ChatDebugPrint.h"
+#include "IMNoteMapper.h"
+#include "CCAUINGUtils.h"
+#include "IMDialogUtils.h"
+#include "CCAGroupUtils.h"
+#include "IMUtils.h"
+#include "MCARecipientObserver.h"
+#include "CCAMultiLineDataQueryDialog.h"
+#include "CCABlockingUI.h"
+#include "CCAInviteEditor.h"
+#include "CCAContactEditor.h"
+#include "CCAChatListView.h"
+#include "CAExternalInterface.h"
+#include "MCAServerContactsArrayPC.h"
+#include "MCASearchInterfacePC.h"
+#include "MCABlockingPC.h"
+#include "MCASessionHandlerCmd.h"
+#include "CCACommandManagerFactory.h"
+#include "CCACommandManager.h"
+#include "MCASearchDataPC.h"
+#include "MCAProcessManager.h"
+#include "chatngclient.hrh"
+#include "CATouchUtils.h"
+
+#include <aknlists.h>
+#include <aknlistquerydialog.h>
+#include <stringloader.h>
+#include <chatNG.rsg>
+#include <csxhelp/imng.hlp.hrh>
+#include <aknenv.h>
+#include <cntdef.h>
+
+// The Settings have been moved to Cenrep (also retained in the Resource file),
+// so the enums for keys and central repository header is added here
+#include "CAUtils.h"
+#include "VariantKeys.h"
+
+// CONSTANTS
+const TInt KChatMaxSearchCritAmount = 4;
+const TInt KGranularity = 2;
+const TInt KTabSpace = 3;
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// -----------------------------------------------------------------------------
+// CCASearchViewContainer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCASearchViewContainer* CCASearchViewContainer::NewL(
+ MCASearchInterfacePC* aSearchInterfacePC,
+ const TRect& aRect,
+ MCAViewSwitcher& aViewSwitcher,
+ MCARecipientObserver& aMenuObserver,
+ TBool aSearchUsers,
+ TBool aGroupSyncDone,
+ const TDesC& aListId )
+ {
+ CCASearchViewContainer* self = new ( ELeave ) CCASearchViewContainer(
+ aSearchInterfacePC,
+ aViewSwitcher,
+ aMenuObserver,
+ aSearchUsers,
+ aGroupSyncDone );
+ CleanupStack::PushL( self );
+ self->ConstructL( aRect, aListId );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCASearchViewContainer::CCASearchViewContainer
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCASearchViewContainer::CCASearchViewContainer(
+ MCASearchInterfacePC* aSearchInterfacePC,
+ MCAViewSwitcher& aViewSwitcher,
+ MCARecipientObserver& aMenuObserver,
+ TBool aSearchUsers,
+ TBool aGroupSyncDone )
+ : iSearchInterfacePC( aSearchInterfacePC ),
+ iViewSwitcher( aViewSwitcher ),
+ iMenuObserver( aMenuObserver ),
+ iDeleteFlag( EFalse ),
+ iTaskComplete( ETrue ),
+ iSearchUsers( aSearchUsers ),
+ iGroupSyncDone( aGroupSyncDone )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCASearchViewContainer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCASearchViewContainer::ConstructL( const TRect& aRect,
+ const TDesC& aListId )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::ConstructL" ) );
+ CreateWindowL();
+
+ iListId = aListId.AllocL();
+
+ iAppUi = static_cast<CCAAppUi*>( CEikonEnv::Static()->AppUi() );
+ iAppUi->AddLayoutChangeObserver( this );
+
+ // To get online/offline events
+
+ iCommandManager
+ = CCACommandManagerFactory::InstanceL()->GetCommandManager();
+ MCASessionHandlerCmd* sessHandlerCmd
+ = iCommandManager->GetSessionHandlerCmd() ;
+ if ( sessHandlerCmd )
+ {
+ sessHandlerCmd->AddServiceStateObserversL( this );
+ }
+
+
+ iItemArray = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+
+ iListBox = new ( ELeave ) CAknDoubleStyleListBox;
+ iListBox->ConstructL( this, EAknListBoxSelectionList );
+
+ iListBox->SetContainerWindowL( *this );
+ iListBox->SetListBoxObserver( this );
+ iListBox->CreateScrollBarFrameL( ETrue );
+ iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+ iListBox->Model()->SetItemTextArray( iItemArray );
+ iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+ iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+
+ // Get search interface
+ iSearchDataPC = iAppUi->GetProcessManager().GetSearchDataInterface();
+
+ iOnlinePresenceList = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );
+
+ iBlockingUI = CCABlockingUI::NewL(
+ iAppUi->GetProcessManager().GetBlockingInterface() );
+
+ SetRect( aRect );
+ ActivateL();
+ // This sets correct results to navi pane
+ UpdateNaviPaneTextL( ETrue );
+
+ // Something to title
+ HBufC* title = StringLoader::LoadLC( R_CHATCLIENT_SEARCH_RESULTS_TITLE,
+ KNullDesC );
+ iViewSwitcher.CAStatusPane()->SetTitleL( *title );
+ CleanupStack::PopAndDestroy( title );
+
+
+ // Idle loop for starting login sequence login
+ iIdle = CIdle::NewL( CActive::EPriorityIdle );
+ iTaskComplete = EFalse;
+ iIdle->Start( TCallBack( BackgroundTasks, this ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CCASearchViewContainer::Destructor
+// -----------------------------------------------------------------------------
+//
+CCASearchViewContainer::~CCASearchViewContainer()
+ {
+ if ( iAppUi && !iAppUi->IsUnderDestruction() )
+ {
+ iAppUi->RemoveLayoutChangeObserver( this );
+ if ( iWaitVisible )
+ {
+ TInt err;
+ TRAP( err, iAppUi->DismissWaitDialogL( KErrNone ) );
+ }
+
+ MCASessionHandlerCmd* sessHandlerCmd
+ = iCommandManager->GetSessionHandlerCmd() ;
+ if ( sessHandlerCmd )
+ {
+ sessHandlerCmd->RemoveServiceStateObservers( this );
+ }
+ }
+
+ iOnlineArray.Close();
+ delete iOnlinePresenceList;
+ delete iItemArray;
+ delete iListBox;
+ delete iBlockingUI;
+
+ if ( iIdle )
+ {
+ iIdle->Deque();
+ }
+ delete iIdle;
+
+ delete iListId;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::DisplaySearchTypeDlgL()
+// Displays search type dialog with radiobuttons
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::DisplaySearchTypeDlgL()
+ {
+ iPreviousSearchType = iSearchType;
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::DisplaySearchTypeDlgL" ) );
+ iSearchType = iSearchUsers ? ESearchUsers : ESearchGroups;
+ return DisplaySearchCriteriaDlgL( iSearchType );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::DisplaySearchCriteriaDlgL()
+// Displays search criteria dialog
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::DisplaySearchCriteriaDlgL(
+ const TSearchType aSearchType )
+ {
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::DisplaySearchCriteriaDlgL( %d )" ),
+ aSearchType );
+
+ TInt searchCriteria( 0 );
+ TInt result( 0 );
+
+ RArray< TEnumsPC::TSearchCriteria > indexArray; // to map return value of query to correct enum
+ CleanupClosePushL( indexArray );
+
+ CAknListQueryDialog* dlg = new ( ELeave )
+ CAknListQueryDialog( &searchCriteria );
+ dlg->PrepareLC( R_CHATCLIENT_SEARCH_CRITERIA );
+
+ CDesCArray* textArray = new ( ELeave ) CDesCArrayFlat( KChatMaxSearchCritAmount );
+ CleanupStack::PushL( textArray );
+
+ switch ( aSearchType )
+ {
+ case ESearchUsers:
+ {
+ // Dynamically create the array of search criteria, according to
+ // the brand variation flags
+ if ( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_SEARCH_NAME ) )
+ {
+ HBufC* txtUserName = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CHAT_SEARCH_CRITER_USER_NAME );
+ textArray->AppendL( *txtUserName );
+ CleanupStack::PopAndDestroy( txtUserName );
+ indexArray.AppendL( TEnumsPC::ESearchUserName );
+ }
+
+ if ( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_SEARCH_USERID ) )
+ {
+ HBufC* txtWVId = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CHAT_SEARCH_CRITER_USER_WV );
+ textArray->AppendL( *txtWVId );
+ CleanupStack::PopAndDestroy( txtWVId );
+ indexArray.AppendL( TEnumsPC::ESearchUserID );
+ }
+
+ if ( IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_PHONE ) )
+ {
+ HBufC* txtTelNumber = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CHAT_SEARCH_CRITER_USER_PUH );
+ textArray->AppendL( *txtTelNumber );
+ CleanupStack::PopAndDestroy( txtTelNumber );
+ indexArray.AppendL( TEnumsPC::ESearchUserMobileNumber );
+ }
+
+ if ( IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_EMAIL ) )
+ {
+ HBufC* txtEmail = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CHAT_SEARCH_CRITER_USER_EMAIL );
+ textArray->AppendL( *txtEmail );
+ CleanupStack::PopAndDestroy( txtEmail );
+ indexArray.AppendL( TEnumsPC::ESearchUserEmailAddress );
+ }
+ break;
+ }
+ case ESearchGroups:
+ {
+ // Dynamically create the array of search criteria, according to
+ // the brand variation flags
+ if ( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_SEARCH_GROUPNAME ) )
+ {
+ HBufC* txtGroupName = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CHAT_SEARCH_CRITER_GRP_NAME );
+ textArray->AppendL( *txtGroupName );
+ CleanupStack::PopAndDestroy( txtGroupName );
+ indexArray.AppendL( TEnumsPC::ESearchGroupName );
+ }
+
+ if ( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_SEARCH_GROUPTOPIC ) )
+ {
+ HBufC* txtUserWVId = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CHAT_SEARCH_CRITER_GRP_TOPIC );
+ textArray->AppendL( *txtUserWVId );
+ CleanupStack::PopAndDestroy( txtUserWVId );
+ indexArray.AppendL( TEnumsPC::ESearchGroupTopic );
+ }
+
+ if ( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_SEARCH_GROUPMEMBER ) )
+ {
+ HBufC* txtGroupMember = CCoeEnv::Static()->AllocReadResourceLC(
+ R_QTN_CHAT_SEARCH_CRITER_GRP_USER );
+ textArray->AppendL( *txtGroupMember );
+ CleanupStack::PopAndDestroy( txtGroupMember );
+ indexArray.AppendL( TEnumsPC::ESearchGroupUserIDJoined );
+ }
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+
+ dlg->SetOwnershipType( ELbmOwnsItemArray );
+ dlg->SetItemTextArray( textArray );
+ CleanupStack::Pop( textArray );
+
+ HBufC* heading = CCoeEnv::Static()->AllocReadResourceLC(
+ R_CHATCLIENT_SEARCH_CRITERIA_USER_HEADING );
+ dlg->SetHeaderTextL( *heading );
+
+ CleanupStack::PopAndDestroy( heading );
+
+ result = dlg->RunLD();
+
+ TBool returnValue( EFalse );
+
+ if ( ( result == EAknSoftkeyOk ) || ( result == EAknSoftkeyYes ) )
+ {
+ // map the returned index to real index
+ TEnumsPC::TSearchCriteria resolvedSearchCrit = indexArray[ searchCriteria ];
+
+ switch ( resolvedSearchCrit )
+ {
+ case TEnumsPC::ESearchGroupName:
+ case TEnumsPC::ESearchGroupTopic:
+ case TEnumsPC::ESearchGroupUserIDJoined:
+ case TEnumsPC::ESearchUserID:
+ case TEnumsPC::ESearchUserMobileNumber:
+ case TEnumsPC::ESearchUserEmailAddress:
+ {
+ returnValue = DisplaySearchStringQueryL( resolvedSearchCrit );
+ break;
+ }
+ case TEnumsPC::ESearchUserName:
+ {
+ CHAT_DP_TXT( "SEARCH criteria is EImpsUserFirstName" );
+ returnValue = DisplayMultiLineDataQueryL( );
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy(); // indexArray.Close()
+
+ return returnValue;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::DisplaySearchStringQueryL()
+// Displays search string query
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::DisplaySearchStringQueryL(
+ TEnumsPC::TSearchCriteria aSearchCriteria )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::DisplaySearchStringQueryL" ) );
+
+ HBufC* searchString = HBufC::NewLC( KMaxSearchStringLength );
+ TPtr searchStringPtr( searchString->Des() );
+
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL( searchStringPtr );
+ if ( aSearchCriteria == TEnumsPC::ESearchUserMobileNumber )
+ {
+ dlg->PrepareLC( R_CHATCLIENT_SEARCH_MOBNMB_QUERY );
+ }
+ else if ( aSearchCriteria == TEnumsPC::ESearchGroupUserIDJoined
+ || aSearchCriteria == TEnumsPC::ESearchUserID )
+ {
+ // AH neutral queries for WVID also have a special label resource
+ CleanupStack::PushL( dlg );
+ TBool textualInputMode = IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_USERID_TEXTUAL_INPUTMODE );
+ CleanupStack::Pop( dlg );
+ dlg->PrepareLC( textualInputMode ?
+ R_CHATCLIENT_SEARCH_WVID_QUERY :
+ R_CHATCLIENT_SEARCH_WVID_QUERY2 );
+ }
+ else if ( aSearchCriteria == TEnumsPC::ESearchUserEmailAddress )
+ {
+ // General queries which always demand latin characters
+ // even in AH build and others.
+ dlg->PrepareLC( R_CHATCLIENT_SEARCH_STRING_QUERY_AH_NEUTRAL );
+ }
+ else
+ {
+ dlg->PrepareLC( R_CHATCLIENT_SEARCH_STRING_QUERY );
+ }
+
+ // enable T9
+ dlg->SetPredictiveTextInputPermitted( ETrue );
+
+ TInt result( dlg->RunLD() );
+ if ( ( result == EAknSoftkeyOk ) || ( result == EAknSoftkeyYes ) )
+ {
+ // Build the search pairs//////////////////////////////////////////////
+
+ RArray<TEnumsPC::TSearchCriteria> searchCriteriaArray;
+ CleanupClosePushL( searchCriteriaArray );
+
+ CDesCArray* searchStringArray = new ( ELeave ) CDesCArrayFlat( 1 );
+ CleanupStack::PushL( searchStringArray );
+
+ if ( searchStringPtr.Length() > 0 )
+ {
+ searchCriteriaArray.Append( aSearchCriteria );
+ searchStringArray->AppendL( searchStringPtr );
+ CCAAppUi* appUi = static_cast <CCAAppUi*> ( CCoeEnv::Static()->AppUi() );
+ MCASearchInterfacePC* searchInterfacePC
+ = appUi->GetProcessManager().GetSearchInterface();
+ searchInterfacePC->SetRequestL( searchCriteriaArray,
+ *searchStringArray );
+ }
+
+ CleanupStack::PopAndDestroy( searchStringArray ); //searchStringArray
+ CleanupStack::PopAndDestroy( ); // searchCriteriaArray.Close()
+ CleanupStack::PopAndDestroy( searchString );
+ return ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( searchString );
+
+ return EFalse;
+ }
+
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::DisplayMultiLineDataQueryL()
+// Displays multiline data query. First line is for firsname
+// and second line is for surname.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::DisplayMultiLineDataQueryL( )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::DisplayMultiLineDataQueryL" ) );
+
+ HBufC* firstName = HBufC::NewLC( KMaxFirstNameLength );
+ HBufC* surname = HBufC::NewLC( KMaxSurnameLength );
+
+ HBufC* searchString = HBufC::NewLC( KMaxFirstNameLength +
+ KMaxSurnameLength + KSpace().Length() );
+
+ TPtr firstNamePtr( firstName->Des() );
+ TPtr surnamePtr( surname->Des() );
+
+ CCAMultiLineDataQueryDialog* dlg =
+ CCAMultiLineDataQueryDialog::NewL( firstNamePtr, surnamePtr );
+
+ dlg->PrepareLC( R_CHATCLIENT_SEARCH_NAME_QUERY );
+ // enable T9
+ dlg->SetPredictiveTextInputPermitted( ETrue );
+ TInt result( dlg->RunLD() );
+
+ TPtr searchStringPtr( searchString->Des() );
+ searchStringPtr.Append( *firstName );
+ searchStringPtr.Append( KEmptyDesC );
+ searchStringPtr.Append( *surname );
+
+ CHAT_DP_TXT( "Before query" );
+
+ if ( ( result == EAknSoftkeyOk ) || ( result == EAknSoftkeyYes ) )
+ {
+ // Build the search pairs//////////////////////////////////////////////
+
+ RArray<TEnumsPC::TSearchCriteria> searchCriteriaArray;
+ CleanupClosePushL( searchCriteriaArray );
+
+ CDesCArray* searchStringArray = new ( ELeave ) CDesCArrayFlat( KGranularity );
+ CleanupStack::PushL( searchStringArray );
+
+
+ // Append firstname
+ if ( firstNamePtr.Length() > 0 )
+ {
+ searchCriteriaArray.Append( TEnumsPC::ESearchUserName );
+ searchStringArray->AppendL( firstNamePtr );
+ }
+
+ if ( surnamePtr.Length() > 0 )
+ {
+ searchCriteriaArray.Append( TEnumsPC::ESearchUserLastName );
+ searchStringArray->AppendL( surnamePtr );
+ }
+
+ if ( firstNamePtr.Length() > 0 || surnamePtr.Length() > 0 )
+ {
+ CCAAppUi* appUi = static_cast <CCAAppUi*> ( CCoeEnv::Static()->AppUi() );
+ MCASearchInterfacePC* searchInterfacePC
+ = appUi->GetProcessManager().GetSearchInterface();
+ searchInterfacePC->SetRequestL( searchCriteriaArray, *searchStringArray );
+ }
+
+
+ CleanupStack::PopAndDestroy( searchStringArray ); //searchStringArray
+ CleanupStack::PopAndDestroy( ); // searchCriteriaArray.Close()
+
+ CleanupStack::PopAndDestroy( 3, firstName ); // searchString, surname, firstName
+ return ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( 3, firstName ); // searchString, surname, firstName
+ return EFalse;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SearchType() const
+// returns searchtype
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCASearchViewContainer::TSearchType CCASearchViewContainer::SearchType() const
+ {
+ return iSearchType;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SearchMoreL()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::SearchMoreL()
+ {
+ CHAT_DP_TXT( "CCASearchViewContainer::SearchMoreL" );
+ //If error happens then we need old indexes
+ TInt oldSearchIndex( iNextSearchIndex );
+ TInt oldCurrentResultPage( iCurrentResultPage );
+ iNextSearchIndex += KMaxSearchResults;
+ TInt searchCount( iSearchDataPC->HowManyResultsAvailable() );
+ //Next searchIndex cannot be bigger than search count
+ if ( iNextSearchIndex > searchCount )
+ {
+ iNextSearchIndex = searchCount - 1;
+ }
+
+
+ ++iCurrentResultPage;
+ //If currentresultpage is bigger than total result page then
+ //currentresultpage is total resultpage
+ if ( iCurrentResultPage > iTotalResultPages )
+ {
+ iCurrentResultPage = iTotalResultPages;
+ }
+ CHAT_DP( D_CHAT_LIT( " iCurrentResultPage = %d iTotalResultPages = %d" ),
+ iCurrentResultPage, iTotalResultPages );
+ CHAT_DP( D_CHAT_LIT( " iNextSearchIndex = %d " ), iNextSearchIndex );
+
+
+ iAppUi->ShowWaitDialogL( R_QTN_CHAT_WNOTE_SEARCHING );
+ TInt err( KErrNone );
+ TRAPD( nextErr, err = iSearchInterfacePC->SearchNextL( iNextSearchIndex,
+ NULL ) );
+
+ //If search fails dialog is dismissed and index are set as previous state
+ if ( nextErr )
+ {
+ iAppUi->DismissWaitDialogL( nextErr );
+ iNextSearchIndex = oldSearchIndex;
+ iCurrentResultPage = oldCurrentResultPage;
+ }
+
+ //If search fails dialog is dismissed and index are set as previous state
+ if ( err )
+ {
+ iAppUi->DismissWaitDialogL( err );
+ iNextSearchIndex = oldSearchIndex;
+ iCurrentResultPage = oldCurrentResultPage;
+ }
+ else
+ {
+ TInt maxDataCount( iSearchDataPC->SearchDataCount() );
+
+ iLowIndex = iNextSearchIndex;
+
+ iHighIndex = iLowIndex + ( KMaxSearchResults - 1 );
+
+ if ( iHighIndex >= maxDataCount )
+ {
+ iHighIndex = maxDataCount - 1;
+ }
+ if ( iSearchType == ESearchUsers )
+ {
+ //If searching users and presence fetch fails dialog is dismissed
+ TRAPD( fetchErr, FetchPresenceL( iLowIndex, iHighIndex ) );
+ if ( fetchErr != KErrNone )
+ {
+ iAppUi->DismissWaitDialogL( fetchErr );
+ }
+ }
+ //Is view update fails dialog is dismissed
+ TRAPD( updateErr, UpdateListBoxL( !iSearchUsers ) );
+ if ( updateErr )
+ {
+ iAppUi->DismissWaitDialogL( updateErr );
+ }
+
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::SearchMoreL HideWaitNoteL" ) );
+ iAppUi->DismissWaitDialogL( KErrNone );
+ }
+
+
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SearchPreviousL()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::SearchPreviousL()
+ {
+ CHAT_DP_TXT( "CCASearchViewContainer::SearchPreviousL" );
+
+ TInt oldSearchIndex( iNextSearchIndex );
+ TInt oldCurrentResultPage( iCurrentResultPage );
+ //Setting up search indexes
+ iNextSearchIndex -= KMaxSearchResults;
+ if ( iNextSearchIndex < 0 )
+ {
+ iNextSearchIndex = 0;
+ }
+
+ //Setting up result page numbers that are shown in navipane
+ --iCurrentResultPage;
+ if ( iCurrentResultPage < 1 )
+ {
+ iCurrentResultPage = 1;
+ }
+ CHAT_DP( D_CHAT_LIT( " iCurrentResultPage = %d iTotalResultPages = %d" ),
+ iCurrentResultPage, iTotalResultPages );
+ CHAT_DP( D_CHAT_LIT( " iNextSearchIndex = %d " ), iNextSearchIndex );
+
+ iAppUi->ShowWaitDialogL( R_QTN_CHAT_WNOTE_SEARCHING );
+
+ TInt err( KErrNone );
+ TRAPD( nextErr, err = iSearchInterfacePC->SearchNextL( iNextSearchIndex,
+ NULL ) );
+ if ( nextErr )
+ {
+ iAppUi->DismissWaitDialogL( nextErr );
+ iNextSearchIndex = oldSearchIndex;
+ iCurrentResultPage = oldCurrentResultPage;
+ }
+
+ if ( err )
+ {
+ iAppUi->DismissWaitDialogL( err );
+ iNextSearchIndex = oldSearchIndex;
+ iCurrentResultPage = oldCurrentResultPage;
+ }
+ else
+ {
+ TInt maxDataCount( iSearchDataPC->SearchDataCount() );
+
+ iLowIndex = iNextSearchIndex;
+
+ iHighIndex = iLowIndex + ( KMaxSearchResults - 1 );
+
+ if ( iHighIndex >= maxDataCount )
+ {
+ iHighIndex = maxDataCount - 1;
+ }
+
+ if ( iSearchType == ESearchUsers )
+ {
+ TRAPD( fetchErr, FetchPresenceL( iLowIndex, iHighIndex ) );
+ if ( fetchErr != KErrNone )
+ {
+ iAppUi->DismissWaitDialogL( fetchErr );
+ }
+ }
+ TRAPD( updateErr, UpdateListBoxL( !iSearchUsers ) );
+ if ( updateErr )
+ {
+ iAppUi->DismissWaitDialogL( updateErr );
+ }
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::SearchPreviousL HideWaitNoteL" ) );
+ iAppUi->DismissWaitDialogL( KErrNone );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SetObserverToNull()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::SetObserverToNull()
+ {
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SaveAsFavouriteL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::SaveAsFavouriteL()
+ {
+ HBufC* groupId = SearchData().AllocLC();
+
+ iSearchInterfacePC->CreateGroupL( *groupId );
+
+ iAppUi->ShowWaitDialogL( R_QTN_CHAT_CLIST_WAIT_SAVING );
+
+ TInt err( KErrNone );
+
+ TBool hasCommonProps( EFalse );
+ TEnumsPC::TImpsCSPAllErrors impsError = TEnumsPC::EImpsErrNone;
+ TPtrC groupName( KNullDesC() );
+ TRAPD( leave, groupName.Set( iSearchInterfacePC->GetGroupNameL(
+ *groupId, hasCommonProps, impsError ) ) );
+ if ( impsError == TEnumsPC::EImpsErrNone )
+ {
+ iAppUi->DismissWaitDialogL( leave );
+ if ( ( err != KErrNone ) || ( !hasCommonProps ) )
+ {
+ // Filter out the insufficient priviledges message,
+ // since it's not an error if server doesn't allow us
+ // to see the name of the group.
+ if ( err != ( TInt ) TEnumsPC::ECSPInsufficientGroupPrivileges )
+ {
+ IMNoteMapper::ShowNoteL( err );
+ }
+ }
+ else
+ {
+ iSearchInterfacePC->SetGroupNameL( *groupId, groupName );
+ }
+ iSearchInterfacePC->SaveChangesL( *groupId );
+
+ }
+ else
+ {
+ iAppUi->DismissWaitDialogL( leave );
+ }
+
+ CHAT_DP_FUNC_DP( "SaveAsFavouriteL", "Group saved" );
+
+
+ CleanupStack::PopAndDestroy( groupId );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::AddToFriendsL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::AddToFriendsL()
+ {
+ // Make sure we have contact list
+ if ( CCAUINGUtils::VerifyContactlistL() == CCAUINGUtils::EChatNoContactList )
+ {
+ return;
+ }
+
+ HBufC* wvuidBuf = SearchData().AllocLC();
+
+ CCAStatusPaneHandler& statusPane = *iViewSwitcher.CAStatusPane();
+ HBufC* titleText = statusPane.Title()->AllocLC();
+
+ TBool contactSaved( EFalse );
+
+ CCAContactEditor* contactEditor = CCAContactEditor::NewL( -1,
+ contactSaved );
+
+ TRAPD( err, contactEditor->EditContactLD( TEnumsPC::EAddToContact, KNullDesC, *wvuidBuf,
+ KNullDesC ) );
+ if ( err )
+ {
+ statusPane.SetTitleL( *titleText );
+ User::Leave( err );
+ }
+
+ statusPane.SetTitleL( *titleText );
+
+ CleanupStack::PopAndDestroy( 2, wvuidBuf ); // titleText, wvuidBuf
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::StartConversationL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::StartConversationL()
+ {
+ // Check status of contact
+ if ( !IsOnline() )
+ {
+ // Check if user wants to start conversation with offline contact
+ if ( IMUtils::IgnoreOfflineStatusL(
+ iSearchDataPC->IdentificationL( SearchData() ) ) < 0 )
+ {
+ return;
+ }
+ }
+
+ //Add the conversation item to open chats array before switching the view
+ MCAMainViewArrayPC* mainViewArrayPC = iAppUi->GetProcessManager().GetArrayInterface();
+ TPtrC wvid( SearchData() );
+ mainViewArrayPC->InsertConversationItemL( wvid, iSearchDataPC->IdentificationL( wvid ) );
+
+ TCADnlConvView dnlConView;
+
+ //collecting only first KMaxWVIDLength character in iWVID.
+ dnlConView.iWVID = ( CAUtils::DisplayId( SearchData() ) ).Left( KMaxWVIDLength );
+ dnlConView.iIsForwarded = EFalse;
+ dnlConView.iSAPChanged = EFalse;
+ dnlConView.iSwitchTab = EFalse;
+ TCADnlConvViewBuf convMsgBuf( dnlConView );
+
+ CHAT_DP( D_CHAT_LIT( "start conversation with %S" ), &dnlConView.iWVID );
+ iViewSwitcher.SwitchViewL( KUidConversationsView, KUidConvViewMsgId,
+ convMsgBuf );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::InviteL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::InviteL()
+ {
+
+ /**
+ * 1) PairsArray is Owned. Ownership is transferred from
+ * 2) There's no need to skip groups in this case. but we do need to make sure
+ the pairs are in correct order after sorting
+ * 3) We can use CCAServerContactsArray, as we deal with descriptor tuple
+ just as with contacts. the class naming is a bit misleading
+ */
+ MCAServerContactsArrayPC* pairsArray
+ = iSearchInterfacePC->GetPairArrayForServerContactsArrayLC();
+
+
+ TInt selectedIndex( 0 );
+
+ // Check status of contact
+ if ( !IsOnline() )
+ {
+ // Check if user wants to invite offline contact
+ if ( IMUtils::IgnoreOfflineStatusL(
+ iSearchDataPC->IdentificationL( SearchData() ) ) < 0 )
+ {
+ // Stop invitation process
+ CleanupStack::PopAndDestroy(); // pairsArray
+
+ return;
+ }
+ }
+
+ TInt retVal = IMDialogUtils::DisplayListQueryDialogL( &selectedIndex,
+ pairsArray,
+ R_SEARCHVIEW_SELECT_INVITE_GROUP_DLG );
+
+ if ( retVal == EAknSoftkeyOk || retVal == EAknSoftkeyDone )
+ {
+ if ( selectedIndex == KErrNotFound )
+ {
+ User::Leave( KErrNotFound );
+ }
+ CCAInviteEditor* editor = CCAInviteEditor::NewL(
+ pairsArray->WVIDArray().MdcaPoint( selectedIndex ) );
+
+ editor->CreateAndSendInvitation( *( iAppUi->GroupUtils() ) , SearchData() );
+ delete editor;
+ }
+
+ CleanupStack::PopAndDestroy(); // pairsArray
+
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::EndSearchL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::EndSearchL()
+ {
+ iTotalResultPages = 0;
+ iCurrentResultPage = 0;
+ iNextSearchIndex = 0;
+ iLowIndex = 0;
+ iPreviousResultsShowing = EFalse;
+ iHighIndex = 0;
+ iOnlinePresenceList->Reset();
+ UpdateNaviPaneTextL( ETrue );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::NewSearchL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::NewSearchL()
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::NewSearchL" ) );
+ if ( DisplaySearchTypeDlgL() )
+ {
+ if ( iSearchInterfacePC->IsSearchPairsSet() )
+ {
+ StartSearchL( );
+ }
+
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::JoinToGroupL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::JoinToGroupL()
+ {
+ HBufC* groupId = SearchData().AllocLC();
+ static_cast <CCAAppUi*> ( iEikonEnv->AppUi() )
+ ->GroupUtils()->JoinGroupL( EFalse, *groupId );
+ CleanupStack::PopAndDestroy( groupId );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::BlockUserL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::BlockUserL()
+ {
+ iBlockingUI->BlockUserL( SearchData() );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::IsBlocked()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::IsBlocked() const
+ {
+ TPtrC searchedData ( SearchData() );
+ MCABlockingPC* blockingPC = iAppUi->GetProcessManager().GetBlockingInterface();
+ return blockingPC->IsContactBlocked( searchedData );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::ListBox()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CEikListBox* CCASearchViewContainer::ListBox() const
+ {
+ return iListBox;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SearchData()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TPtrC CCASearchViewContainer::SearchData() const
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::SearchData" ) );
+ TInt curIndex = iListBox->CurrentItemIndex();
+ TInt dataCount = iSearchDataPC->SearchDataCount();
+ if ( curIndex < 0 || dataCount == 0 )
+ {
+ return KNullDesC();
+ }
+ else
+ {
+ TInt searchDataIndex( curIndex + ( ( iCurrentResultPage - 1 ) *
+ KMaxSearchResults ) );
+ if ( searchDataIndex >= dataCount )
+ {
+ searchDataIndex = dataCount - 1;
+ }
+ if ( searchDataIndex < 0 )
+ {
+ searchDataIndex = 0;
+ }
+ return iSearchDataPC->SearchData( searchDataIndex );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::IsOnline()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::IsOnline() const
+ {
+ TInt curIndex( iListBox->CurrentItemIndex() );
+
+ if ( ( curIndex < 0 ) || ( curIndex >= iOnlineArray.Count() ) )
+ {
+ return EFalse;
+ }
+ return iOnlineArray[ curIndex ];
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::BlockUserWVIdL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::BlockUserWVIdL()
+ {
+ iBlockingUI->DisplayBlockTextQueryL();
+ }
+// ---------------------------------------------------------
+// CCASearchViewContainer::UnBlockL()
+// ---------------------------------------------------------
+void CCASearchViewContainer::UnBlockL()
+ {
+ iBlockingUI->DisplayUnblockListQueryL();
+ }
+// ---------------------------------------------------------
+// CCASearchViewContainer::DisplayBlockedListL()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::DisplayBlockedListL()
+ {
+ iBlockingUI->DisplayBlockedListL( ETrue );
+ UpdateNaviPaneTextL( EFalse );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::MoreResultsAvailableL() const
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::MoreResultsAvailable() const
+ {
+ return ( iCurrentResultPage < iTotalResultPages );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::PrevResultsAvailableL() const
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::PrevResultsAvailable() const
+ {
+ return ( iCurrentResultPage != 1 );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::IsFavouriteChatGroupL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CCASearchViewContainer::IsFavouriteChatGroup() const
+ {
+ TBool isFavourite = iSearchInterfacePC->IsFavouriteChatGroup( SearchData() );
+ return isFavourite;
+ }
+
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::HandleError()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::HandleSearchError( TInt aErrorCode )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::HandleError( %d )" ),
+ aErrorCode );
+ // CodeScanner warning ignored because CS does not regognize TRAP being used
+ // after line break
+ TRAPD( err, ( iAppUi->DismissWaitDialogL( aErrorCode ) ) ); // CSI: 42 # See comment above
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::HandleSearchFinished()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::HandleSearchFinished( )
+ {
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::StartSearchL()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::StartSearchL( )
+ {
+ // Construct string for status pane title from aSearchPairs
+
+ HBufC* searchString = iSearchInterfacePC->GetSearchStringLC();
+
+ iViewSwitcher.CAStatusPane()->SetTitleL(
+ R_CHATCLIENT_SEARCH_RESULTS_TITLE, *searchString );
+
+ CleanupStack::PopAndDestroy( searchString );
+
+ // Check iSearchDataPC->SearchDataCount() > 0
+ // it is more reliable because app engine keeps previous results
+
+
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::StartSearchL" ) );
+ if ( iPreviousResultsShowing || iSearchDataPC->SearchDataCount() > 0 )
+ {
+ ClearListBoxContents();
+
+ iAppUi->ShowWaitDialogL( R_QTN_CHAT_WNOTE_SEARCHING );
+ TRAPD( endErr, EndSearchL() );
+ if ( endErr )
+ {
+ iAppUi->DismissWaitDialogL( endErr );
+ User::Leave( endErr );
+ }
+ }
+ else
+ {
+ iAppUi->ShowWaitDialogL( R_QTN_CHAT_WNOTE_SEARCHING );
+ }
+
+ TInt err( KErrNone );
+ TRAPD( startErr, err = iSearchInterfacePC->StartSearchL(
+ KMaxSearchResults, NULL , NULL ) );
+
+ if ( startErr )
+ {
+ iAppUi->DismissWaitDialogL( startErr );
+ User::Leave( startErr );
+ }
+
+ if ( err )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASearchViewContainer::StartSearchL err=%d " ), err );
+
+ if ( err == TEnumsPC::ECSPNotSupported || err == TEnumsPC::ECSPInvalidParameter )
+ {
+ // map 402 and 405 to "search criteria not supported"
+ iAppUi->DismissWaitDialogL( KErrNone );
+ IMDialogUtils::DisplayInformationNoteL(
+ R_QTN_CHAT_SEARCH_NOT_SUPPORTED );
+ }
+ else
+ {
+ iAppUi->DismissWaitDialogL( err );
+ }
+ }
+ else
+ {
+ iPreviousResultsShowing = ETrue;
+
+ TInt maxDataCount( iSearchDataPC->SearchDataCount() );
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::StartSearchL maxDataCount = %d " ),
+ maxDataCount );
+
+ if ( maxDataCount > 0 )
+ {
+ iCurrentResultPage = 1;
+ iLowIndex = 0;
+
+ iHighIndex = iLowIndex + ( KMaxSearchResults - 1 ); //-1 because of array
+
+ if ( iHighIndex >= maxDataCount )
+ {
+ iHighIndex = maxDataCount - 1;
+ }
+
+ if ( iSearchType == ESearchUsers )
+ {
+ // Presence fetching failed => not a big problem
+ TRAPD( fetchErr, FetchPresenceL( iLowIndex, iHighIndex ) );
+ if ( fetchErr != KErrNone )
+ {
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::StartSearchL FetchPresenceL() err=%d " ),
+ fetchErr );
+ iAppUi->DismissWaitDialogL( fetchErr );
+ User::Leave( fetchErr );
+ }
+ }
+
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::StartSearchL UpdateListBoxL() " ) );
+ TRAPD( updateErr, UpdateListBoxL(
+ iSearchType == ESearchUsers ? EFalse : ETrue ) );
+ if ( updateErr )
+ {
+ iAppUi->DismissWaitDialogL( updateErr );
+ User::Leave( updateErr );
+ }
+
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::StartSearchL HideWaitNoteL" ) );
+ iAppUi->DismissWaitDialogL( KErrNone );
+ }
+ else
+ {
+ // no search results
+ iAppUi->DismissWaitDialogL( KErrNone );
+
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CCASearchViewContainer::SetEmptyTextsToListboxL()
+// See header for details.
+// ---------------------------------------------------------------------------
+//
+void CCASearchViewContainer::SetEmptyTextsToListboxL()
+ {
+ HBufC* emptyFinal = IMUtils::CombineStringFromResourceLC
+ ( R_QTN_CHAT_EMPTY_SEARCH_PRIMARY,
+ R_QTN_CHAT_EMPTY_SEARCH );
+
+ iListBox->View()->SetListEmptyTextL( *emptyFinal );
+ CleanupStack::PopAndDestroy(); // emptyFinal
+ }
+
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::HandleListBoxEventL
+// Handles list box events
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+ TListBoxEvent aEventType )
+ {
+ if ( aEventType == EEventItemDoubleClicked )
+ {
+ iMenuObserver.ShowPopUpMenuL();
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SizeChanged()
+// Called by framework
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::SizeChanged()
+ {
+ iListBox->SetRect( Rect() );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::CountComponentControls()
+// Returns number of controls
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCASearchViewContainer::CountComponentControls() const
+ {
+ //Only one compound control so returning 1
+ return 1;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::ComponentControl( TInt aIndex )
+// Returns control for given index
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCoeControl* CCASearchViewContainer::ComponentControl( TInt aIndex ) const
+ {
+ if ( aIndex == 0 )
+ {
+ return iListBox;
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::OfferKeyEventL()
+// Handles user key inputs
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CCASearchViewContainer::OfferKeyEventL( const TKeyEvent& aEvent,
+ TEventCode aType )
+ {
+ if ( aEvent.iCode == EKeyEnter || aEvent.iCode == EKeyOK )
+ {
+ iMenuObserver.ShowPopUpMenuL();
+ return EKeyWasConsumed;
+ }
+ return iListBox->OfferKeyEventL( aEvent, aType );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::GetHelpContext
+// This function is called when Help application is launched
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+ {
+ aContext.iMajor = KUidChatClient;
+ aContext.iContext = KIMNG_HLP_SEARCHCHAT ;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::FocusChanged
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::FocusChanged( TDrawNow /* aDrawNow */ )
+ {
+ if ( iListBox )
+ {
+ // give focus to list box so that highlight animations
+ // are done properly
+ iListBox->SetFocus( IsFocused() );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::FetchPresenceL()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::FetchPresenceL( const TInt aLowIndex,
+ const TInt aHighIndex )
+ {
+
+ CHAT_DP_TXT( "CCASearchViewContainer::FetchPresenceL" );
+ CHAT_DP( D_CHAT_LIT( " aLowIndex %d aHighIndex %d" ), aLowIndex,
+ aHighIndex );
+
+
+
+ // Calculate optimal granularity, which is from low index to high index.
+ TInt gran = aHighIndex - aLowIndex + 1;
+ // Creating array with granularity 0 crashes, make sure gran is > 0
+ if ( gran == 0 )
+ {
+ gran = 1;
+ }
+ CDesCArrayFlat* userIDs = new ( ELeave ) CDesCArrayFlat( gran );
+ CleanupStack::PushL( userIDs );
+
+ for ( TInt arrayIndex( aLowIndex ); arrayIndex <= aHighIndex;
+ ++arrayIndex )
+ {
+ userIDs->AppendL( iSearchDataPC->SearchData( arrayIndex ) );
+ }
+
+ CHAT_DP_TXT( "Getting online users..." );
+
+ MCAMainViewArrayPC* mainViewArrayPC =
+ iAppUi->GetProcessManager().GetArrayInterface();
+ mainViewArrayPC->GetOnlineUsersL( userIDs, iOnlinePresenceList, NULL );
+
+
+
+ CHAT_DP_TXT( "...got online users" );
+
+ CleanupStack::PopAndDestroy( userIDs );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::UpdateNaviPaneTextL()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::UpdateNaviPaneTextL( TBool aEndSearch )
+ {
+ // Else this is zero
+ if ( !aEndSearch )
+ {
+ iTotalResultPages = ( iSearchDataPC->HowManyResultsAvailable() /
+ KMaxSearchResults );
+ if ( ( iSearchDataPC->HowManyResultsAvailable() %
+ KMaxSearchResults ) != 0 )
+ {
+ ++iTotalResultPages; // 1 / 5 = 0 -> add 1
+ }
+
+ if ( iSearchDataPC->HowManyResultsAvailable() > 0 &&
+ iTotalResultPages == 0 )
+ {
+ iTotalResultPages = 1;
+ }
+ }
+ // Only two items in array, so 2 should be enough
+
+ CArrayFix<TInt>* intArray = new ( ELeave ) CArrayFixFlat<TInt>( KGranularity );
+ CleanupStack::PushL( intArray );
+ intArray->AppendL( iCurrentResultPage );
+ intArray->AppendL( iTotalResultPages );
+ HBufC* naviText = StringLoader::LoadLC( R_CHATCLIENT_SEARCH_NAVI,
+ *intArray );
+ TPtrC naviTextPtr( naviText->Des() );
+ CHAT_DP( D_CHAT_LIT( "*setting navi pane text to %S" ), &naviTextPtr );
+ iViewSwitcher.CAStatusPane()->SetNaviLabelL( naviTextPtr );
+ CleanupStack::PopAndDestroy( 2, intArray ); // naviText, intArray
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::UpdateListBoxL()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::UpdateListBoxL( TBool aGroup )
+ {
+
+ TInt granularity( iItemArray->Count() );
+
+ if ( granularity == 0 )
+ {
+ ++granularity;
+ }
+
+ CDesCArray* tempArray = new ( ELeave ) CDesCArrayFlat( granularity );
+ CleanupStack::PushL( tempArray );
+ TInt loopCount( iItemArray->Count() );
+ for ( TInt i( 0 ); i < loopCount; ++i )
+ {
+ tempArray->AppendL( iItemArray->MdcaPoint( i ) );
+ }
+ ClearListBoxContents();
+ iListBox->Model()->SetItemTextArray( tempArray );
+ iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+ iListBox->HandleItemAdditionL();
+
+ TInt arrayIndex( iLowIndex );
+ HBufC* online = iEikonEnv->AllocReadResourceLC(
+ R_SEARCHVIEW_USER_ONLINE );
+
+ HBufC* offline = iEikonEnv->AllocReadResourceLC(
+ R_SEARCHVIEW_USER_OFFLINE );
+ do
+ {
+ CHAT_DP( D_CHAT_LIT( "Update list box..." ) );
+
+ if ( aGroup )
+ {
+ TPtrC wvid( iSearchDataPC->SearchData( arrayIndex ) );
+ TBool tempGroup( EFalse );
+ TBool foundGroup = iSearchInterfacePC->FindGroup( wvid );
+ if ( !foundGroup )
+ {
+ // we must create a temporary group for groupmanager
+ // Ownership not transferred to caller
+ iSearchInterfacePC->CreateGroupL( wvid ); // CSI: 35 # See comment above
+ tempGroup = ETrue;
+ }
+
+ // now we have the group so we can fetch the properties for it
+ TBool hasCommonProps( EFalse );
+ TEnumsPC::TImpsCSPAllErrors impsError = TEnumsPC::EImpsErrNone;
+ TPtrC groupName = iSearchInterfacePC->GetGroupNameL( wvid, hasCommonProps, impsError );
+ TPtrC firstLine( KEmptyDesC );
+ TPtrC secondLine( KEmptyDesC );
+
+ // if properties are not get, then set only wvid
+ if ( impsError == TEnumsPC::EImpsErrNone && hasCommonProps )
+ {
+ firstLine.Set( groupName );
+ secondLine.Set( CCAAppUi::DisplayId(
+ iSearchDataPC->SearchData( arrayIndex ) ) );
+ }
+ else
+ {
+ firstLine.Set( CCAAppUi::DisplayId(
+ iSearchDataPC->SearchData( arrayIndex ) ) );
+ }
+
+ // Construct list item text
+ HBufC* groupText = HBufC::NewLC( firstLine.Length() +
+ secondLine.Length() +
+ KTabSpace ); // 3 for tabulators
+ TPtr groupTextPtr( groupText->Des() );
+ groupTextPtr.Append( KTabulator );
+ groupTextPtr.Append( firstLine );
+ groupTextPtr.Append( KTabulator );
+ groupTextPtr.Append( secondLine );
+ groupTextPtr.Append( KTabulator );
+
+ // now we can delete our temporary group (do not delete
+ // from server) we can ignore the error as it can only
+ // come from server
+ if ( tempGroup )
+ {
+ iSearchInterfacePC->DeleteGroupL( wvid, EFalse );
+ }
+
+ iItemArray->AppendL( groupTextPtr );
+ CleanupStack::PopAndDestroy( groupText );
+ }
+ else
+ {
+ HBufC* itemText = HBufC::NewLC( KMaxFirstNameLength +
+ KMaxSurnameLength );
+ TPtr itemTextPtr( itemText->Des() );
+
+ itemTextPtr.Append( KTabulator );
+
+ TPtrC searchedData = iSearchDataPC->SearchData( arrayIndex );
+ itemTextPtr.Append( iSearchDataPC->IdentificationL( searchedData ) );
+ itemTextPtr.Append( KTabulator );
+
+ // Now we should get the presence of this guy
+ TInt ignoreIndex( 0 );
+ // We found online presence
+ if ( iOnlinePresenceList->Find( searchedData, ignoreIndex ) == 0 )
+ {
+ itemTextPtr.Append( *online );
+ iOnlineArray.Append( ETrue );
+ }
+ else
+ {
+ itemTextPtr.Append( *offline );
+ iOnlineArray.Append( EFalse );
+ }
+
+ itemTextPtr.Append( KTabulator );
+ iItemArray->AppendL( itemTextPtr );
+ CleanupStack::PopAndDestroy( itemText );
+ }
+
+ ++arrayIndex;
+ } while ( arrayIndex <= iHighIndex );
+
+ CleanupStack::PopAndDestroy( 3, tempArray ); // offline, online, itemText
+ iListBox->Model()->SetItemTextArray( iItemArray );
+ iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::UpdateListBoxL Item array count %d" ),
+ iItemArray->Count() );
+ CHAT_DP( D_CHAT_LIT(
+ "CCASearchViewContainer::UpdateListBoxL Reseting online presence list" ) );
+ iOnlinePresenceList->Reset();
+
+ iListBox->HandleItemAdditionL();
+ UpdateNaviPaneTextL( EFalse );
+ if ( iItemArray->MdcaCount() > 0 )
+ {
+ iListBox->SetCurrentItemIndexAndDraw( 0 );
+ }
+ iListBox->UpdateScrollBarsL();
+
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::SetGroupSyncDone
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::SetGroupSyncDone()
+ {
+ CHAT_DP_TXT( "CCASearchViewContainer::SetGroupSyncDone - Group sync done" );
+ iGroupSyncDone = ETrue;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::ClearListBoxContents()
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::ClearListBoxContents()
+ {
+ iItemArray->Reset();
+ iOnlineArray.Reset();
+ TRAPD( err, iListBox->HandleItemRemovalL() );
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ iListBox->DrawNow();
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::BackgroundTasks
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCASearchViewContainer::BackgroundTasks( TAny *aInstance )
+ {
+ return static_cast<CCASearchViewContainer*>( aInstance )->DoBackgroundTasks();
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppUi::DoBackgroundTasks
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCASearchViewContainer::DoBackgroundTasks()
+ {
+ TBool retVal( EFalse );
+ TRAPD( err, retVal = ContainerStartL() );
+
+ if ( err )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+
+ // if the task is completed...
+ if ( !retVal )
+ {
+ if ( iDeleteFlag )
+ {
+ // delete self and cancel callback
+ delete this;
+ return EFalse;
+ }
+
+ iTaskComplete = ETrue;
+ }
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CCASearchViewContainer::ContainerStartL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCASearchViewContainer::ContainerStartL()
+ {
+ iSearchType = iSearchUsers ? ESearchUsers : ESearchGroups;
+
+
+ // if groups are not supported, just show the search type dialog and that's
+ // it. DON'T show any notes.
+ TBool groupsSupported = iAppUi->UISessionManager().IsSupported(
+ CCAUISessionManager::EGroup );
+
+ if ( ! groupsSupported )
+ {
+ if ( iSearchInterfacePC->IsSearchPairsSet() )
+ {
+ StartSearchL( );
+ }
+ else
+ {
+ NewSearchL();
+ }
+ return EFalse; // that's it, one-shot
+ }
+
+ if ( ! iWaitVisible && ! iGroupSyncDone )
+ {
+ CHAT_DP_TXT(
+ "CCASearchViewContainer::ContainerStartL - ! iWaitVisible && ! iGroupSyncDone" );
+ // launch the wait note
+ iWaitVisible = ETrue;
+
+ iAppUi->ShowWaitDialogL( R_QTN_CHAT_SEARCHVIEW_PROCESSING, ETrue );
+
+ return ETrue;
+ }
+
+ if ( iGroupSyncDone )
+ {
+ CHAT_DP_TXT( "CCASearchViewContainer::ContainerStartL - iGroupSyncDone" );
+
+ // hide wait note
+ if ( iWaitVisible )
+ {
+ CHAT_DP_TXT( "CCASearchViewContainer::ContainerStartL - iWaitVisible" );
+
+ TRAPD( err, iAppUi->DismissWaitDialogL( KErrNone ) );
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+
+ // group has been synched
+ iWaitVisible = EFalse;
+ }
+
+ CHAT_DP_TXT( "CCASearchViewContainer::ContainerStartL - No more wait note, show search type dialog" );
+ // that's it, out of here
+
+ if ( iSearchInterfacePC->IsSearchPairsSet() )
+ {
+ StartSearchL( );
+ }
+ else
+ {
+ NewSearchL();
+ }
+ return EFalse;
+ }
+
+ // nothing interesting, do nothing, but come back here
+ return ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CCASearchViewContainer::ListId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TDesC& CCASearchViewContainer::ListId() const
+ {
+ if ( iListId )
+ {
+ return *iListId;
+ }
+ return KNullDesC;
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::DeleteSelfD
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::DeleteSelfD()
+ {
+ iDeleteFlag = ETrue;
+
+ // if task is already completed -> delete immediately
+ if ( iTaskComplete )
+ {
+ delete this;
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::LayoutChangedL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::LayoutChangedL( TInt aType )
+ {
+ // updates tabgroup
+ iViewSwitcher.CAStatusPane()->ShowTabGroupL( KUidSearchView );
+
+ TRect mainPaneRect;
+ AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+ SetRect( mainPaneRect );
+ UpdateNaviPaneTextL( ETrue );
+ CCoeControl::HandleResourceChange( aType );
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::HandleServiceStateChangeL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::HandleServiceStateChangeL( TServiceState aState )
+ {
+ if ( aState == EOffline )
+ {
+ // Clear search results if we got disconnected.
+ EndSearchL();
+ ClearListBoxContents();
+ iGroupSyncDone = EFalse;
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASearchViewContainer::HandlePointerEventL
+// ---------------------------------------------------------
+//
+void CCASearchViewContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+ {
+ if ( !iItemArray->Count() == 0 )
+ {
+ iListBox->HandlePointerEventL( aPointerEvent );
+ return;
+ }
+
+
+ if ( !CATouchUtils::PenEnabled() )
+ {
+ return;
+ }
+ // Single tap on main pane (not on scroll bar)
+ if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+ {
+ iMenuObserver.ShowPopUpMenuL();
+ }
+ }
+// End of File