--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/CCASingleListView.cpp Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,2131 @@
+/*
+* 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: View class for single list
+*
+*/
+
+
+
+//platform includes
+#include <chatNG.rsg>
+#include <eikmenup.h>
+#include <aknglobalnote.h>
+#include <stringloader.h>
+#include <eikmenub.h> // CEikMenuBar
+#include <eiklbx.h>
+#include <hlplch.h>
+#include <FeatMgr.h>
+#include <SysUtil.h>
+
+
+#include "ImpsCSPAllErrors.h"
+#include "ccasyncchecker.h"
+// INCLUDE FILES
+#include "MCAProcessManager.h"
+#include "MCASettingsPC.h"
+#include "MCAMainViewArrayPC.h"
+#include "chatngclient.hrh"
+#include "CCAStatusPaneHandler.h"
+#include "ChatDefinitions.h"
+#include "CCAAppUi.h"
+#include "CAExternalInterface.h"
+#include "IMDialogUtils.h"
+#include "IMNoteMapper.h"
+
+#include "CCAGroupUtils.h"
+#include "ChatDebugPrint.h"
+#include "CAExternalInterface.h"
+#include "ChatDebugPrint.h"
+#include "CCAUISessionManager.h"
+#include "CCAIdleWait.h"
+#include "IMUtils.h"
+#include "CCASearchViewContainer.h"
+#include "IMPrivateCRKeys.h"
+#include "IMVariant.hrh"
+#include "impsbuilddefinitions.h"
+#include "MCAUiLoginCmdCB.h"
+#include "CCASingleListContainer.h"
+#include "CCAUISessionManager.h"
+#include "CCASingleListView.h"
+#include "CCAUINGUtils.h"
+#include "MCALoginPC.h"
+#include "CAUtils.h"
+#include "MCASingleListViewCB.h"
+#include "CCACommandManager.h"
+#include "CCACommandManagerFactory.h"
+
+#include "AknDlgShut.h"
+#include "MCAApplicationNGPC.h"
+#include "MCAInvitationPC.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 "VariantKeys.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Symbian OS default constructor can leave.
+CCASingleListView::~CCASingleListView()
+ {
+ CHAT_DP_TXT( "CCASingleListView destructor starts" );
+ if ( iContextMenuBar )
+ {
+ iEikonEnv->EikAppUi()->RemoveFromStack( iContextMenuBar );
+ delete iContextMenuBar;
+ }
+
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromViewStack( *this, iContainer );
+ delete iContainer;
+ }
+
+ iMainViewArrayPC->UnRegisterCallBack( );
+ iMainViewArrayPC->RemoveObserver();
+
+ CHAT_DP_TXT( "CCASingleListView destructor ends" );
+ }
+
+// ---------------------------------------------------------
+// CCAChatListView::ConstructL()
+// Symbian OS default constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::ConstructL( TInt aAvkonViewResourceId, TUid aViewId )
+ {
+ BaseConstructL( aAvkonViewResourceId, aViewId );
+
+ iAppUi = static_cast<CCAAppUi*>( iEikonEnv->AppUi() );
+ iMainViewArrayPC = iAppUi->GetProcessManager().GetArrayInterface();
+ iCurrentIndex = 0;
+ iContainerIndexId = 0;
+ iMainViewArrayPC->RegisterCallBack( this );
+ iConversationExits = EFalse;
+ iCreateGrpFromContactList = EFalse;
+ iMainViewArrayPC->ResetArray( ETrue );
+ iMainViewArrayPC->AddObserver( this );
+ iFirstManualRefresh = EFalse;
+ }
+
+
+// ---------------------------------------------------------
+// CCASingleListView::DoActivateL(
+// const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/,
+// const TDesC8& /*aCustomMessage*/)
+// From CAknView, Gets called from framework when activating this view
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::DoActivateL(
+ const TVwsViewId& /*aPrevViewId*/, TUid aCustomMessageId,
+ const TDesC8& aCustomMessage )
+ {
+ CHAT_DP_TXT( "CCASingleListView::DoActivateL" );
+ CHAT_DP( D_CHAT_LIT( "Container: %d" ), iContainer );
+
+ // Unregister the view that was registered from Forward option.
+ // didn't find any better place to put this.
+ if ( TEnumsPC::EToBeUnregistered == iAppUi->RetForwardTo() )
+ {
+ iAppUi->UnRegisterPreviousview( );
+ iAppUi->SetResetForwardTo( TEnumsPC::EUnregistered );
+ }
+
+ if ( aCustomMessageId == KUidChatPrivateChatListViewSoftNoteActivationId )
+ {
+ // Shutdown possible dialogs before changing views etc.
+ // If this is not done, wrong dialog get events.
+ CHAT_DP_FUNC_DP( "DoActivateL", "ShutDialogsL..." );
+ AknDialogShutter::ShutDialogsL( *iEikonEnv );
+ CHAT_DP_FUNC_DP( "DoActivateL", "done." );
+
+ // we might be here before chat has been fully constructed.
+ CAAppUi()->FinalizeChatConstructionL();
+
+ // Launched from soft notification -> Beep allready played
+ // Set not to be played again
+ CAAppUi()->SetPlayOnce( ETrue );
+
+ TInt countOfInvites = CAAppUi()->ReceivedInvites();
+ TInt countOfPendingChats;
+ TInt countOfPendingGroupChats;
+
+ TInt countOfMessages = iAppUi->GetProcessManager().GetApplicationNGPC()
+ ->MessagesPendingCount( countOfPendingChats, TEnumsPC::EUnreadReceived );
+
+ countOfMessages = iAppUi->GetProcessManager().GetApplicationNGPC()
+ ->ChatGroupMessagesPendingCount( countOfPendingGroupChats );
+
+ if ( countOfInvites + countOfPendingChats + countOfPendingGroupChats == 1 )
+ {
+ if ( countOfPendingChats )
+ {
+
+ // we have a sender, so this is p2p-message
+ TCADnlConvView dnlConView;
+ dnlConView.iIsForwarded = EFalse;
+ dnlConView.iSAPChanged = EFalse;
+ dnlConView.iWVID = iMainViewArrayPC->PendingMessageInfo();
+ dnlConView.iSwitchTab = EFalse;
+
+ TCADnlConvViewBuf convMsgBuf( dnlConView );
+ // Chat was already there -> beep will not
+ // be played again. Set to false so beep
+ // will be played next time when new
+ // msg is received
+ CAAppUi()->SetPlayOnce( EFalse );
+ CAViewSwitcher()->SwitchViewL( KUidConversationsView,
+ KUidConvViewMsgId, convMsgBuf );
+
+ return; // we're done with this view
+
+ }
+ else if ( countOfInvites )
+ {
+ const TDesC& invitationId = iAppUi->GetProcessManager().GetInvitationsInterface()
+ ->UnresdInvitationInfo();
+
+ MCAInvitationPC& invitePC( *iAppUi->GetProcessManager().GetInvitationsInterface() );
+
+ TCADnlInvView dnlInvView;
+ dnlInvView.iInvitationIndex = invitePC.FindInvitationIndex( invitationId );
+ dnlInvView.iInviteID = invitationId;
+ dnlInvView.iSwitchTab = EFalse;
+
+ TCADnlInvViewBuf invMsgBuf( dnlInvView );
+
+ CAViewSwitcher()->SwitchViewL( KUidInvitationView,
+ KUidInvViewMsgId, invMsgBuf );
+ return; // we're done with this view
+
+ }
+ else
+ {
+ TCADnlChatView viewDnl;
+ viewDnl.iIsForwarded = EFalse;
+ viewDnl.iSwitchTab = EFalse;
+ viewDnl.iGroupId = iMainViewArrayPC->ChatGroupPendingMessageInfo( viewDnl.iGroupName );
+ viewDnl.iInviteQuery = EFalse;
+
+ TCADnlChatViewBuf grpMsgBuf( viewDnl );
+
+ // Chat was already there -> beep will not
+ // be played again. Set to false so beep
+ // will be played next time when new
+ // msg is received
+ CAAppUi()->SetPlayOnce( EFalse );
+
+ CAViewSwitcher()->SwitchViewL( KUidChatView,
+ KUidChatViewMsgId, grpMsgBuf );
+
+ return; // we're done with this view
+
+ }
+ }
+ else if ( ( countOfInvites + countOfPendingChats + countOfPendingGroupChats ) > 1 )
+ {
+ TInt itemIndex = iMainViewArrayPC->FindIndexOfOpenChatsItem(
+ TEnumsPC::EOpenChatsListItem, KNullDesC );
+ itemIndex = itemIndex + KOpenChatsIndex;
+ // just to make sure
+ if ( iMainViewArrayPC->GetType( itemIndex ) != TEnumsPC::EOpenChatsListItem )
+ {
+ User::Leave( KErrGeneral );
+ }
+ if ( !iContainer )
+ {
+ CreateContainerL( aCustomMessage, aCustomMessageId );
+ }
+ iContainer->SetListboxIndexL( itemIndex );
+
+ if ( iMainViewArrayPC->IsCollapsed( itemIndex ) )
+ {
+ // collapse ,expand now
+ iContainer->ExpandCollapseListL();
+ }
+
+ //Find the index of top most pending message,To high light that item.
+ itemIndex = iMainViewArrayPC->GetIndexOfTopPendingMessage();
+
+ // focus the current item by setting itemIndex
+ iContainer->SetListboxIndexL( itemIndex );
+
+ }
+ }
+
+ // Reuse the container if it exists.
+ if ( !iContainer )
+ {
+ CreateContainerL( aCustomMessage, aCustomMessageId );
+ }
+ // show manual update note if not shown yet
+ CCACommandManager* commandManager = CCACommandManagerFactory::InstanceL()->GetCommandManager();
+ MCASessionHandlerCmd* sessHandlerCmd = commandManager->GetSessionHandlerCmd() ;
+ TBool contactsRefreshed( EFalse );
+ if ( sessHandlerCmd )
+ {
+ contactsRefreshed = sessHandlerCmd->ContactsRefreshed();
+ }
+ if ( contactsRefreshed && !iAppUi->GetProcessManager().GetSettingsInterface()
+ ->GetBoolValuePC( TEnumsPC::EAutomaticPresenceUpdate , NULL ) )
+ {
+ // only if all contact are synch
+ // and if manual update.
+ ShowManualUpdateNoteL();
+ }
+ }
+
+
+///----------------------------------------------------------
+///This functiate will Instantiate iContainer, if it is NULL
+///----------------------------------------------------------
+void CCASingleListView::CreateContainerL( const TDesC8& aCustomMessage, TUid aCustomMessageId )
+ {
+ CAAppUi()->CAStatusPane()->SynchroniseAndRemoveTabGroup();
+
+ iContainer = new ( ELeave ) CCASingleListContainer( *this, *this, iAppUi );
+ iContainer->ConstructL( ClientRect(),
+ *CAViewSwitcher(), iContainerIndexId );
+ AppUi()->AddToViewStackL( *this, iContainer );
+
+
+ iContainer->SetMopParent( this );
+
+ if ( IMUtils::CRKeyL( KCRUidIMVariation, KIMVariationKey )
+ & EIMFeatSimplifiedUI )
+ {
+ CCAUISessionManager& uisessionmanager = iAppUi->UISessionManager();
+ if ( !uisessionmanager.IsServerDefined() )
+ {
+ HBufC* emptyTxtBuf = IMUtils::CombineStringFromResourceLC(
+ R_QTN_CHAT_EMPTY_COMMUNITY_VIEW_PRIMARY,
+ R_QTN_CHAT_EMPTY_COMMUNITY_VIEW );
+ iContainer->ListBox()->View()->SetListEmptyTextL( *emptyTxtBuf );
+ CleanupStack::PopAndDestroy( emptyTxtBuf );
+ }
+ else
+ {
+ HBufC* emptyTxtBuf = IMUtils::CombineStringFromResourceLC(
+ R_QTN_CHAT_EMPTY_COMMUNITY_VIEW_NOT_VISIBLE_PRIMARY,
+ R_QTN_CHAT_EMPTY_COMMUNITY_VIEW_NOT_VISIBLE );
+ iContainer->ListBox()->View()->SetListEmptyTextL( *emptyTxtBuf );
+ CleanupStack::PopAndDestroy( emptyTxtBuf );
+
+ }
+ }
+
+
+ // Update navi-pane
+ CAAppUi()->CAStatusPane()->ShowTabGroupL( KUidFriendsListView );
+ CAAppUi()->CAStatusPane()->ClearNaviPaneL();
+ UpdateTitleL();
+ iContainer->ListBox()->UpdateScrollBarsL();
+ // Logged in with a different userid,so focus owndata.
+ TBool isNewLogIn = EFalse;
+ MCALoginPC* loginPC = iAppUi->GetProcessManager().GetLogInInterface();
+
+ TRAP_IGNORE( isNewLogIn = loginPC->FreshLoginL( ) )
+ if ( isNewLogIn )
+ {
+ iCurrentIndex = 0;
+ }
+
+ //focus item as iCurrentIndex
+ else
+ {
+ iCurrentIndex = iMainViewArrayPC->GetArrayItemIdIndexL( iItemDetails );
+ }
+ if ( KErrNotFound == iCurrentIndex )
+ {
+ iCurrentIndex = 0;
+ }
+
+ TCADnlConvInvGroupFocusBuf viewBuf;
+ viewBuf.Copy( aCustomMessage );
+
+ if ( aCustomMessageId == KConvInvGroupFocusId && KNullDesC() == viewBuf().iListID )
+ {
+ TBool collapsed = iMainViewArrayPC->IsCollapsed( KOpenChatsIndex );
+ if ( collapsed )
+ {
+ iMainViewArrayPC->SetCollapsed( !collapsed, KOpenChatsIndex );
+ }
+
+ TEnumsPC::TItem itemType = TEnumsPC::EInvalid;
+ switch ( viewBuf().iType )
+ {
+ case EConversationItem:
+ {
+ itemType = TEnumsPC::EConversationItem;
+ break;
+ }
+ case EInviteItem:
+ {
+ itemType = TEnumsPC::EInviteItem;
+ break;
+ }
+ case EGroupItem:
+ {
+ itemType = TEnumsPC::EGroupItem;
+ break;
+ }
+ default://we should never be here.
+ break;
+ }
+
+ iCurrentIndex = iMainViewArrayPC->FindIndexOfOpenChatsItem(
+ itemType, viewBuf().iInvConvGroupID );
+ iCurrentIndex += KOpenChatsIndex;
+ iContainer->ListBox()->HandleItemAdditionL();
+ }
+
+ iContainer->SetListboxIndexL( iCurrentIndex );
+ iItemDetails.aItem = TEnumsPC::EInvalid;
+ iItemDetails.aItemID.Copy( KNullDesC );
+ iItemDetails.aListID.Copy( KNullDesC );
+
+ ConstructContextMenuBarL();
+ }
+
+
+
+// ---------------------------------------------------------
+// CCASingleListView::DoDeactivate()
+// From AknView, Gets called from framework when deactivating this view
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::DoDeactivate()
+ {
+ CHAT_DP_TXT( "CCASingleListView::DoDeactivate" );
+ if ( iContextMenuBar )
+ {
+ iEikonEnv->EikAppUi()->RemoveFromStack( iContextMenuBar );
+ delete iContextMenuBar;
+ iContextMenuBar = NULL;
+ }
+
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromViewStack( *this, iContainer );
+
+ // Capture events because if they are not captured
+ // and user is quick to write keys
+ // when opening conversation. -> crash.
+ if ( iContainer->OpeningConversation() )
+ {
+ CHAT_DP_TXT( "start capturing events" );
+ TRAPD( err, CAAppUi()->CaptureEventsL() );
+ CHAT_DP_TXT( "started capturing events.." );
+
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+
+ if ( iContainer->OpeningConversation() )
+ {
+ // Stop capturing events.
+ TRAPD( err, CAAppUi()->ReleaseCapturingL() );
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ }
+ if ( iCreateGrpFromContactList )
+ {
+ iCreateGrpFromContactList = EFalse;
+ }
+
+ // delete container safely.
+ // if container has some ongoing task. it will complete the task first
+ // and then delete itself. Owner is not responsible for deleting the
+ // object after this call
+ iContainer->DeleteSelfD();
+ iConversationExits = EFalse;
+ if ( iContainer && iContainer->IsBckGrdTaskComplete() )
+ {
+ iContainer = NULL;
+ }
+
+ }
+ }
+// ---------------------------------------------------------
+// CCASingleListView::AddCreateNewSubmenuL()
+// add "create new" sub menu or just one item
+// ---------------------------------------------------------
+//
+
+void CCASingleListView::AddCreateNewSubmenuL( CEikMenuPane* aMenuPane )
+ {
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ESearch ) )
+ {
+ // search not supported => don't add submenu
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane, R_QTN_CHAT_FRIEND_OM_CRNEW,
+ EChatClientFriendsListViewCmdAddManually );
+ return;
+ }
+
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane, R_QTN_CHAT_FRIEND_OM_CRNEW, 0,
+ R_QTN_CHAT_FRIEND_OM_CRNEW_SUBMENU );
+ }
+// ---------------------------------------------------------
+// CCASingleListView::AddOwnOptionsSubMenuL()
+// add "Own options" sub menu depending on the online status
+// ---------------------------------------------------------
+//
+void CCASingleListView::AddOwnOptionsSubMenuL( CEikMenuPane* aMenuPane )
+ {
+ TEnumsPC::TOnlineStatus onlineStatus = iContainer->GetOnlineStatus();
+ if ( onlineStatus == TEnumsPC::EUnknown )
+ {
+ return;
+ }
+ else
+ {
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane, R_QTN_CHAT_FRIEND_OWN_OPTIONS, 0,
+ R_QTN_CHAT_FRIEND_OWN_OPTIONS_SUBMENU );
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::AddContactEditOptionsSubMenuL()
+// add "Edit options" sub menu when focus is on a contact
+// ---------------------------------------------------------
+//
+void CCASingleListView::AddContactEditOptionsSubMenuL( CEikMenuPane* aMenuPane, TBool aIsContact )
+ {
+
+ IMUtils::AddMenuItemL( aIsContact, *aMenuPane, R_QTN_CHAT_FRIEND_EDIT_OPTIONS,
+ 0, R_QTN_CHAT_FRIEND_EDIT_OPTIONS_SUBMENU );
+
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::AddNewChatSubmenuL()
+// add "Edit options" sub menu when focus is on a contact
+// ---------------------------------------------------------
+//
+void CCASingleListView::AddNewChatSubmenuL( CEikMenuPane* aMenuPane )
+ {
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane, R_QTN_CHAT_OPT_NEW_CHAT,
+ 0, R_CHAT_FRIEND_NEW_CHAT_SUBMENU );
+
+ }
+// ---------------------------------------------------------
+// CCASingleListView::DynCreateMenuPaneL()
+// construct menu pane dynamically
+// ---------------------------------------------------------
+//
+void CCASingleListView::DynCreateMenuPaneL( CEikMenuPane* aMenuPane )
+ {
+ TEnumsPC::TSyncStatus syncStatus = TEnumsPC::ESyncSuccess;
+
+ /* All these many boolean variables should be
+ * replaced with enums and there should be single function on
+ * PC side get give us status.*/
+ TBool search( UISessionManager().IsSupported(
+ CCAUISessionManager::ESearch ) );
+ TBool groups( UISessionManager().IsSupported( CCAUISessionManager::EGroup ) );
+ TBool block ( UISessionManager().IsSupported( CCAUISessionManager::EBlock ) );
+
+ TBool manualUpdate( !iAppUi->GetProcessManager().GetSettingsInterface()
+ ->GetBoolValuePC( TEnumsPC::EAutomaticPresenceUpdate, NULL ) );
+
+ // UI CR : 101-39731: Add variation to contact list handling
+
+ /* Contactlist creation and deletion is
+ * based upon flag "CHAT_VARIATION_CREATE_DELETE_CONTACT_LIST"
+ * Contactlist renaming
+ * based upon flag " CHAT_VARIATION_MODIFY_CONTACT_LIST" */
+
+ TBool listCreateDelete( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_CREATE_DELETE_CONTACT_LIST ) ); // UI CR : 101-39731
+ TBool listEdit( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_MODIFY_CONTACT_LIST ) );
+ TBool findJoinedChats = IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_SEARCH_GROUPMEMBER );
+ TBool contact( EFalse );
+
+ TEnumsPC::TOnlineStatus status = iContainer->OwnStatus();
+
+ TBool synchronised = ETrue;
+ TBool failed = EFalse;
+
+#ifdef IMPS_CONTACT_FETCH_BACKGROUND
+
+ syncStatus = iMainViewArrayPC->IsAllSynchronised();
+
+#endif //IMPS_CONTACT_FETCH_BACKGROUND
+
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+
+ TBool ownStatusOffLine( status == TEnumsPC::EOffline );
+
+ switch ( itemtype )
+ {
+ case TEnumsPC::EOwnStatusItem:
+ {
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane,
+ R_QTN_CHAT_FRIEND_CHANGE_STATUS,
+ EChatClientMainViewCmdChangeStatus );
+ AddOwnOptionsSubMenuL( aMenuPane );
+
+ /* Added to make what are the option available in online should
+ * be present in offline also. Add create new menu with sub menu */
+ AddNewChatSubmenuL( aMenuPane );
+
+ /* User is not offline then only add this menu*/
+ if ( !ownStatusOffLine )
+ {
+ //add fetch failed list only if online state
+ IMUtils::AddMenuItemL( ( syncStatus == TEnumsPC::ESyncFailed ),
+ *aMenuPane, R_QTN_CHAT_CONTACTLIST_FETCH_ALL,
+ EChatClientFriendsListViewCmdFetchFailed );
+ }
+
+ //-----------------------------------------------------------------------
+ // This option is shown when the loging is sucessful
+ // and also when the contactlist fetching is ongoing.
+ AddCreateNewSubmenuL( aMenuPane );
+
+ //------------------------------------------------------------------------
+ // Some options are missing in the option menu when fetching of contact
+ // list failed commented.
+ IMUtils::AddMenuItemL( listCreateDelete, *aMenuPane,
+ R_QTN_CHAT_FRIEND_NEW_GROUP,
+ EChatClientCmdNewList );
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ECLIMod ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientCmdNewList, ETrue );
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+ if ( itemtype == TEnumsPC::EContactListItem )
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdDelete, ETrue );
+ }
+ }
+ //-----------------------------------------------------------------------
+ //REFRESHLIST
+ IMUtils::AddMenuItemL( synchronised && manualUpdate, *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_REFRESH,
+ EChatClientFriendsListViewCmdRefresh );
+ break;
+ }
+ case TEnumsPC::EContactListItem:
+ {
+ TBool collapsed( iContainer->IsCollapsed() );
+ TBool forceExpanded( iMainViewArrayPC->IsForceExpanded() );
+#ifdef IMPS_CONTACT_FETCH_BACKGROUND
+
+ /* All these boolean variables should be replaced with enums.
+ * and there should be single function on PC side give us sync
+ * status or other relavent data*/
+ synchronised = ( iMainViewArrayPC->Synchronised( iContainer->
+ CurrentListboxIndex() ) == TEnumsPC::ESyncSuccess );
+ failed = ( iMainViewArrayPC->Synchronised( iContainer->
+ CurrentListboxIndex() ) == TEnumsPC::ESyncFailed );
+#endif //IMPS_CONTACT_FETCH_BACKGROUND
+ IMUtils::AddMenuItemL( ( collapsed && !forceExpanded ) && synchronised, *aMenuPane,
+ R_QTN_CHAT_FRIEND_EXPAND_GROUP,
+ EChatClientCmdExpandList );
+
+ IMUtils::AddMenuItemL( ( !collapsed || forceExpanded ) && synchronised, *aMenuPane,
+ R_QTN_CHAT_FRIEND_COLLAPSE_GROUP,
+ EChatClientCmdCollapseList );
+
+ IMUtils::AddMenuItemL( synchronised && manualUpdate, *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_REFRESH,
+ EChatClientFriendsListViewCmdRefresh ) ;
+ IMUtils::AddMenuItemL( ( syncStatus == TEnumsPC::ESyncFailed ),
+ *aMenuPane,
+ R_QTN_CHAT_CONTACTLIST_FETCH_ALL,
+ EChatClientFriendsListViewCmdFetchFailed );
+
+ //----------------------------------------------------------------------
+ // Some options are missing in the option menu when fetching of contact
+ // list failed. If the list in focus is synchronised then all the options
+ // should be available.
+ if ( synchronised )
+ {
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane,
+ R_QTN_CHAT_CONTACTS_OPEN_GROUP_CONV,
+ EChatClientCmdOpenGroupConv );
+
+ AddCreateNewSubmenuL( aMenuPane );
+ IMUtils::AddMenuItemL( listCreateDelete, *aMenuPane,
+ R_QTN_CHAT_FRIEND_NEW_GROUP,
+ EChatClientCmdNewList );
+
+ IMUtils::AddMenuItemL( listCreateDelete && ( synchronised || failed ), *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_DEL,
+ EChatClientFriendsListViewCmdDelete );
+
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ECLIMod ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientCmdNewList, ETrue );
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+ if ( itemtype == TEnumsPC::EContactListItem )
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdDelete, ETrue );
+ }
+ }
+ }
+ IMUtils::AddMenuItemL( listEdit && synchronised, *aMenuPane,
+ R_QTN_CHAT_FRIEND_RENAME_GROUP,
+ EChatClientCmdRenameList );
+ break;
+ }
+ case TEnumsPC::EContactItem:
+ {
+ contact = ETrue;
+ //open conversation
+ IMUtils::AddMenuItemL( contact, *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_SENDI,
+ EChatPrivateListCmdOpen );
+
+ //REFRESHLIST
+ IMUtils::AddMenuItemL( synchronised && manualUpdate, *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_REFRESH,
+ EChatClientFriendsListViewCmdRefresh );
+ IMUtils::AddMenuItemL( ( syncStatus == TEnumsPC::ESyncFailed ), *aMenuPane,
+ R_QTN_CHAT_CONTACTLIST_FETCH_ALL,
+ EChatClientFriendsListViewCmdFetchFailed );
+
+ //EDITOPTIONS
+ AddContactEditOptionsSubMenuL( aMenuPane, contact );
+
+ IMUtils::AddMenuItemL( search && groups && findJoinedChats,
+ *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_FIND,
+ EChatClientFriendsListViewCmdFindJoinedChats );
+ //-------------------------------------------------------------------------
+ // Some options are missing in the option menu when fetching of contact list
+ // failed. Create New and New contact lists are available as default(if
+ // the list synchronised)
+ AddCreateNewSubmenuL( aMenuPane );
+
+ IMUtils::AddMenuItemL( listCreateDelete, *aMenuPane,
+ R_QTN_CHAT_FRIEND_NEW_GROUP,
+ EChatClientCmdNewList );
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ECLIMod ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientCmdNewList, ETrue );
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+ if ( itemtype == TEnumsPC::EContactListItem )
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdDelete, ETrue );
+ }
+ }
+ break;
+ }
+ case TEnumsPC::EConversationItem:
+ {
+ TBool contactExistsInAnyList( EFalse );
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+ TPtrC userid = iMainViewArrayPC->GetSelectedContactUserId(
+ iContainer->CurrentListboxIndex() );
+ if ( iMainViewArrayPC->FindAnyContactL( userid ) )
+ {
+ contactExistsInAnyList = ETrue;
+ }
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane,
+ R_CHAT_MENUBAR_CONVERSATION_CHATLIST_MENU_OPEN,
+ EChatPrivateListCmdOpen );
+
+ IMUtils::AddMenuItemL( !contactExistsInAnyList, *aMenuPane,
+ R_CHAT_MENUBAR_CONVERSATION_CHATLIST_MENU_ADDTOFRIENDS,
+ EChatPrivateListCmdAddToFriends );
+
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane,
+ R_CHAT_MENUBAR_CONVERSATION_CHATLIST_MENU_CLOSECONVERS,
+ EChatPrivateListCmdCloseConvers );
+
+ AddNewChatSubmenuL( aMenuPane ); //add create new menu with sub menu
+
+ break;
+ }
+ case TEnumsPC::EOpenChatsListItem:
+ {
+ TBool collapsed( iContainer->IsCollapsed() );
+ TBool forceExpanded( iContainer->IsChatsForceExpanded() );
+
+ IMUtils::AddMenuItemL( collapsed && !forceExpanded, *aMenuPane,
+ R_QTN_CHAT_FRIEND_EXPAND_GROUP,
+ EChatClientCmdExpandList );
+
+ IMUtils::AddMenuItemL( !collapsed || forceExpanded, *aMenuPane,
+ R_QTN_CHAT_FRIEND_COLLAPSE_GROUP,
+ EChatClientCmdCollapseList );
+
+ AddNewChatSubmenuL( aMenuPane ); //add create new menu with sub menu
+
+ break;
+ }
+
+
+ case TEnumsPC::EInviteItem:
+ {
+ TBool contactExistsInAnyList( EFalse );
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+ TPtrC userid =
+ iMainViewArrayPC->GetSelectedContactUserId( iContainer->CurrentListboxIndex() );
+ if ( iMainViewArrayPC->FindAnyContactL( userid ) )
+ {
+ contactExistsInAnyList = ETrue;
+ }
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane,
+ R_CHAT_MENUBAR_CONVERSATION_CHATLIST_MENU_OPEN,
+ EChatPrivateListCmdOpen );
+
+ IMUtils::AddMenuItemL( !contactExistsInAnyList, *aMenuPane,
+ R_CHAT_MENUBAR_CONVERSATION_CHATLIST_MENU_ADDTOFRIENDS,
+ EChatPrivateListCmdAddToFriends );
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane,
+ R_CHAT_MENUBAR_CONVERSATION_CHATLIST_MENU_DELETE,
+ EChatPrivateListCmdDelete );
+
+ AddNewChatSubmenuL( aMenuPane ); // add new chat and sub options
+
+ break;
+ }
+ case TEnumsPC::EGroupItem:
+ {
+ TBool isJoined = iContainer->IsJoinedToGroup();
+ IMUtils::AddMenuItemL( !ownStatusOffLine && isJoined, *aMenuPane,
+ R_QTN_CHAT_CLIST_OM_OPEN,
+ EChatClientSingleListViewCmdGroupOpen );
+
+ IMUtils::AddMenuItemL( !isJoined, *aMenuPane,
+ R_QTN_CHAT_FRIEND_JOIN_GROUP,
+ EChatClientSingleListViewCmdGroupJoin );
+
+
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane,
+ R_QTN_CHAT_CLIST_OM_CGR,
+ 0,
+ R_CHAT_GROUP_OPTIONS_SUBMENU
+ );
+
+
+ IMUtils::AddMenuItemL( !ownStatusOffLine && isJoined, *aMenuPane,
+ R_QTN_CHAT_CLIST_CGR_SM_LEAVE,
+ EChatClientSingleListViewCmdGroupLeave );
+
+ AddNewChatSubmenuL( aMenuPane ); // add new chat and sub options
+ break;
+ }
+ default:
+ {
+ IMUtils::AddMenuItemL( contact, *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_SENDI,
+ EChatClientFriendsListViewCmdIMessage );
+
+#ifndef RD_REMOVE_COLLAPSE_OPTION
+ IMUtils::AddMenuItemL( contact, *aMenuPane,
+ R_QTN_CHAT_FRIEND_COLLAPSE_GROUP,
+ EChatClientCmdCollapseList );
+#endif // RD_REMOVE_COLLAPSE_OPTION
+
+ IMUtils::AddMenuItemL( contact, *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_OPEN1,
+ EChatClientFriendsListViewCmdOpen );
+
+ if ( !( ( status == TEnumsPC::EUnknown ) || ( status == TEnumsPC::EOffline ) ) )
+ {
+ AddCreateNewSubmenuL( aMenuPane );
+ }
+
+ AddContactEditOptionsSubMenuL( aMenuPane, contact );
+
+ TInt index = iContainer->CurrentListboxIndex();
+ IMUtils::AddMenuItemL( search && groups && findJoinedChats && index != KErrNotFound,
+ *aMenuPane,
+ R_QTN_CHAT_FRIEND_OM_FIND,
+ EChatClientFriendsListViewCmdFindJoinedChats );
+
+ IMUtils::AddMenuItemL( listCreateDelete, *aMenuPane,
+ R_QTN_CHAT_FRIEND_NEW_GROUP,
+ EChatClientCmdNewList );
+
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ECLIMod ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientCmdNewList, ETrue );
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+ if ( itemtype == TEnumsPC::EContactListItem )
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdDelete, ETrue );
+ }
+ }
+
+
+ break;
+ }
+ }
+
+ //block options
+ IMUtils::AddMenuItemL( block, *aMenuPane, R_QTN_CHAT_FRIEND_OM_IMSG_SET, 0,
+ R_CHATCLIENT_FRIENDSLIST_SUBMENU );
+
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane, R_QTN_CHAT_FRIEND_SAVED_CONVERSATIONS,
+ EChatClientSingleListViewCmdSavedConversations );
+ TBool loggedIn( UISessionManager().IsLoggedIn() );
+ IMUtils::AddMenuItemL( loggedIn, *aMenuPane, R_QTN_CHAT_MAIN_OM_LOGOUT,
+ EChatClientMainViewCmdLogout );
+
+ IMUtils::AddMenuItemL( !loggedIn, *aMenuPane, R_QTN_CHAT_MAIN_OM_LOGIN,
+ EChatClientMainViewCmdLogin );
+
+ IMUtils::AddMenuItemL( ETrue, *aMenuPane, R_QTN_CHAT_SETTINGS,
+ EChatClientChatListSettings );
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::DynInitMenuPaneL()
+// From MEikMenuObserver, Called by framework before constructing menupane
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ TBool ownStatusOffLine( iContainer->OwnStatus() == TEnumsPC::EOffline );
+
+ // least 2 contact lists
+ TInt minContactLists( 2 );
+ switch ( aResourceId )
+ {
+ case R_CHATCLIENT_GENERAL_MENU:
+ {
+ // dim the help menu item
+ aMenuPane->SetItemDimmed( EChatClientCmdHelp,
+ !FeatureManager::FeatureSupported( KFeatureIdHelp ) );
+ break;
+ }
+ case R_CHATCLIENT_FRIENDSLIST_VIEW_MENU:
+ {
+ DynCreateMenuPaneL( aMenuPane );
+ break;
+ }
+ case R_CHATCLIENT_FRIENDSLIST_SUBMENU://Blocklist
+ {
+ TBool nonContact( ( iContainer->SelectedType()
+ == TEnumsPC::EContactListItem )
+ || ( iContainer->SelectedType()
+ == TEnumsPC::EGroupItem )
+ || ( iContainer->SelectedType()
+ == TEnumsPC::EOwnStatusItem )
+ || ( iContainer->SelectedType()
+ == TEnumsPC::EOpenChatsListItem )
+ );
+
+ // show/hide "show blocked list" option
+ if ( !IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_SHOW_BLOCKED_LIST ) )
+ {
+ aMenuPane->SetItemDimmed(
+ EChatClientFriendsListViewShowBlockedList, ETrue );
+ }
+
+ TBool showUnblock = ( ( iContainer->SelectedType() != TEnumsPC::EContactItem )
+ || !iContainer->IsBlocked() );
+
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewUnblock,
+ showUnblock );
+
+ TInt index = iContainer->CurrentListboxIndex();
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdBlock,
+ iContainer->IsBlocked() || nonContact || ( index == KErrNotFound ) );
+ break;
+ }
+ case R_CHATCLIENT_FRIENDSLIST_CRNEW_SUBMENU:
+ {
+ // check if search is supported
+ // branding: check if there are any available search criteria
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ESearch ) ||
+ ( !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_NAME ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_USERID ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_PHONE ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_EMAIL ) ) )
+ {
+ aMenuPane->SetItemDimmed(
+ EChatClientFriendsListViewCmdAddFromSrv, ETrue );
+ aMenuPane->SetItemDimmed(
+ EChatClientFriendsListViewCmdAddFromPb, ETrue );
+ }
+ if ( !IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_MSISDN_SUPPORT ) )
+ {
+ aMenuPane->SetItemDimmed(
+ EChatClientFriendsListViewCmdAddFromPb, ETrue );
+ }
+
+ // this is not used when full contact list support is on
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdMoveFromSrv,
+ ETrue );
+ break;
+ }
+
+ case R_QTN_CHAT_FRIEND_OM_CRNEW_SUBMENU:
+ {
+ // check if search is supported
+ // branding: check if there are any available search criteria
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ESearch ) ||
+ ( !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_NAME ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_USERID ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_PHONE ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_EMAIL ) ) )
+ {
+ aMenuPane->SetItemDimmed(
+ EChatClientFriendsListViewCmdAddFromSrv, ETrue );
+ aMenuPane->SetItemDimmed(
+ EChatClientFriendsListViewCmdAddFromPb, ETrue );
+ }
+ if ( !IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_MSISDN_SUPPORT ) )
+ {
+ aMenuPane->SetItemDimmed(
+ EChatClientFriendsListViewCmdAddFromPb, ETrue );
+ }
+
+
+ break;
+ }
+
+ case R_CHATCLIENT_FRIENDSLIST_EDIT_SUBMENU:
+ {
+ TBool manualUpdate( !iAppUi->GetProcessManager().GetSettingsInterface()
+ ->GetBoolValuePC( TEnumsPC::EAutomaticPresenceUpdate , NULL ) );
+
+ // if manual update is on, we should not have watch in menu
+ if ( manualUpdate )
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdRemoveWatch,
+ ETrue );
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdAddWatch,
+ ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdRemoveWatch,
+ !iContainer->IsWatched() );
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdAddWatch,
+ iContainer->IsWatched() );
+ }
+
+ // "move" option is not shown if there isn't at
+ // least 2 contact lists
+ TInt listCount = iMainViewArrayPC->ListCountL();
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdMove,
+ listCount < minContactLists );
+ break;
+ }
+ case R_QTN_CHAT_FRIEND_EDIT_OPTIONS_SUBMENU:
+ {
+ TBool manualUpdate( !iAppUi->GetProcessManager().GetSettingsInterface()
+ ->GetBoolValuePC( TEnumsPC::EAutomaticPresenceUpdate , NULL ) );
+
+ // if manual update is on, we should not have watch in menu
+ if ( manualUpdate )
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdRemoveWatch,
+ ETrue );
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdAddWatch,
+ ETrue );
+ }
+ else
+ {
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdRemoveWatch,
+ !iContainer->IsWatched() );
+ aMenuPane->SetItemDimmed( EChatClientFriendsListViewCmdAddWatch,
+ iContainer->IsWatched() );
+ }
+
+ // "move" option is not shown if there isn't at
+ // least 2 contact lists
+ TInt listCount = iMainViewArrayPC->ListCountL();
+
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdMove,
+ listCount < minContactLists );
+ break;
+ }
+ case R_QTN_CHAT_FRIEND_OWN_OPTIONS_SUBMENU:
+ {
+ TEnumsPC::TOnlineStatus onlineStatus = iContainer->GetOnlineStatus();
+ // UI CR ID :101-39726: Status message variation : start
+ TBool ownStatusOnline( onlineStatus == TEnumsPC::EOnline );
+ TBool ownStatusAway( onlineStatus == TEnumsPC::EAway );
+ TBool ownStatusBusy( onlineStatus == TEnumsPC::EBusy );
+
+ /* The option "status Message" is available depending upon different variation flags.
+ * e.g :If "CHAT_VARIATION_ONLINE_OPTION " is supported then
+ * user has the option "status Message" when User status is online, not present for
+ * other status.(busy ,away)
+ * In the same way it works for " away " and "busy " status, depending upon
+ * "RSC_CHAT_VARIATION_AWAY_OPTION" and "RSC_CHAT_VARIATION_BUSY_OPTION" flags */
+
+ TBool statusMsgOnline( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_ONLINE_OPTION ) );
+ TBool statusMsgAway( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_AWAY_OPTION ) );
+ TBool statusMsgBusy( IMUtils::IntResourceValueL(
+ RSC_CHAT_VARIATION_BUSY_OPTION ) );
+
+ TBool option( ( ownStatusOnline && statusMsgOnline )
+ || ( ownStatusAway && statusMsgAway )
+ || ( ownStatusBusy && statusMsgBusy ) );
+
+ if ( ( onlineStatus == TEnumsPC::EOffline )
+ || ( onlineStatus == TEnumsPC::EInvisible )
+ || ( !option ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdChangeMessage,
+ ETrue );
+ }
+ break;
+ // UI CR ID :101-39726: Status message variation : End
+
+ }
+ case R_CHAT_FRIEND_NEW_CHAT_SUBMENU:
+ {
+ // check if search is supported for contact
+ // branding: check if there are any available search criteria
+ if ( !UISessionManager().IsSupported( CCAUISessionManager::ESearch ) ||
+ ( !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_NAME ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_USERID ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_PHONE ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_EMAIL ) ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdSearchContact,
+ ETrue );
+ }
+
+ // for create group option
+ // check if group is supported
+ TBool isGroupSupported = UISessionManager().IsSupported( CCAUISessionManager::EGroup );
+ if ( ! isGroupSupported )
+ {
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdCreateGrp, ETrue );
+ }
+
+ // check if search is supported for group
+ // branding: check if there are any available search criteria
+ if ( !isGroupSupported ||
+ ( !UISessionManager().IsSupported( CCAUISessionManager::ESearch ) ) ||
+ ( !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_GROUPNAME ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_GROUPTOPIC ) &&
+ !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_SEARCH_GROUPMEMBER ) ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdSearchGrp, ETrue );
+ }
+
+ if ( !IMUtils::IntResourceValueL( RSC_CHAT_VARIATION_JOIN_CHAT_ROOM_MANUAL ) )
+ {
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdEnterGrpID, ETrue );
+ }
+ break;
+ }
+ case R_CHAT_GROUP_OPTIONS_SUBMENU:
+ {
+ TBool isJoined = iContainer->IsJoinedToGroup();
+ TBool isFavourite = iContainer->IsFavourite();
+ TBool isOwner = iContainer->IsOwnGroup();
+ TBool isAdminOrOwner = iContainer->IsUserAdmin();
+
+ if ( !isJoined || !isAdminOrOwner )
+ {
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdGroupEdit, ETrue );
+ }
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdGroupFavor, ownStatusOffLine || isFavourite );
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdGroupRmv,
+ ( ! ( ( isFavourite || isOwner ) && !isJoined ) ) );
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdGroupPart, ownStatusOffLine || !isJoined );
+ aMenuPane->SetItemDimmed( EChatClientSingleListViewCmdGroupInfo, ownStatusOffLine || !isJoined );
+ break;
+ }
+ default:
+ {
+ // nothing to do
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::HandleCommandL( TInt aCommand )
+// From CAknView, takes care of command handling.
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::HandleCommandL( TInt aCommand )
+ {
+ // If background login is underway, avoid all single list events.
+ if ( iAppUi->UISessionManager().IsBackgroundTaskRunning() )
+ return;
+
+ // hide the context menu if active
+ if ( iContextMenuBar->IsDisplayed() )
+ {
+ iContextMenuBar->StopDisplayingMenuBar();
+ }
+
+ //Store the contact pointer to local variable
+ //TPtrC contact;
+ TInt focusedIndex = iContainer->CurrentListboxIndex();
+ HBufC* focusedIdBuf = iMainViewArrayPC->GetSelectedContactUserId(focusedIndex).AllocLC();
+ TPtrC focusedId = focusedIdBuf->Des();
+
+ iCurrentIndex = iContainer->CurrentListboxIndex();
+ iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+
+ switch ( aCommand )
+ {
+ case EChatClientSingleListViewCmdMove:
+ case EChatClientSingleListViewCmdDelete:
+ case EChatClientSingleListViewCmdChangeMessage:
+ case EChatClientSingleListViewCmdDetails:
+ case EChatClientSingleListViewCmdEdit:
+ case EChatClientFriendsListViewCmdAddManually:
+ case EChatClientFriendsListViewCmdMoveFromSrv:
+ case EChatClientFriendsListViewCmdMove:
+ case EChatClientFriendsListViewCmdBlock:
+ case EChatClientFriendsListViewCmdBlockEnter:
+ case EChatClientFriendsListViewCmdRefresh:
+ case EChatClientFriendsListViewCmdFetchFailed:
+ case EChatClientFriendsListViewShowBlockedList:
+ case EChatClientFriendsListViewUnblock:
+ case EChatClientFriendsListViewCmdFindJoinedChats:
+ case EChatClientFriendsListViewCmdAddFromSrv:
+ case EChatClientFriendsListViewCmdChangeList:
+ case EChatClientCmdNewList:
+ case EChatClientCmdRenameList:
+ case EChatClientMainViewCmdChangeStatus:
+ case EChatPrivateListCmdAddToFriends:
+ case EChatPrivateListWriteNewConvers:
+ case EChatPrivateListCmdSelectRecipient:
+ case EChatClientFriendsListViewCmdAddFromPb:
+ case EChatClientSingleListViewCmdGroupOpen:
+ case EChatClientSingleListViewCmdGroupJoin:
+ case EChatClientSingleListViewCmdGroupLeave:
+ case EChatClientSingleListViewCmdGroupRmv:
+ case EChatClientSingleListViewCmdGroupPart:
+ case EChatClientSingleListViewCmdGroupInfo:
+ case EChatClientSingleListViewCmdGroupFavor:
+ case EChatClientSingleListViewCmdGroupEdit:
+ case EChatClientSingleListViewCmdCreateGrp:
+ case EChatClientSingleListViewCmdSearchGrp:
+ case EChatClientSingleListViewCmdSearchContact:
+ case EChatClientCmdOpenGroupConv:
+ case EChatClientFriendsListViewCmdEdit:
+ case EChatClientSingleListViewCmdOwnEdit:
+ {
+ if ( !UISessionManager().LoginL( MCAUiLoginCmdCB::EQueryLogin ) )
+ {
+ CleanupStack::PopAndDestroy(focusedIdBuf);
+
+ return;
+ }
+
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+#ifdef IMPS_CONTACT_FETCH_BACKGROUND
+ switch ( aCommand )
+ {
+ case EChatClientSingleListViewCmdMove:
+ case EChatClientSingleListViewCmdDelete:
+ case EChatClientSingleListViewCmdEdit:
+ case EChatClientFriendsListViewCmdAddManually:
+ case EChatClientFriendsListViewCmdMoveFromSrv:
+ case EChatClientFriendsListViewCmdMove:
+ case EChatClientFriendsListViewCmdRefresh:
+ //case EChatClientFriendsListViewCmdAddFromSrv:
+ case EChatClientCmdNewList:
+ case EChatClientCmdRenameList:
+ case EChatClientFriendsListViewCmdDelete:
+ case EChatClientFriendsListViewCmdAddFromPb:
+ case EChatClientFriendsListViewCmdEdit:
+ case EChatPrivateListCmdAddToFriends:
+ //case EChatPrivateListWriteNewConvers:
+ case EChatPrivateListCmdSelectRecipient:
+ //case EChatClientSingleListViewCmdSearchContact:
+ case EChatClientSingleListViewCmdCreateGrp:
+ //joing to a group does not require any
+ //synchronization with the contact list.
+
+ case EChatClientFriendsListViewShowBlockedList:
+
+ //case EChatClientSingleListViewCmdSearchGrp:
+ //case EChatClientSingleListViewCmdGroupOpen:
+ //case EChatClientSingleListViewCmdGroupJoin:
+ //case EChatClientSingleListViewCmdGroupLeave:
+ case EChatClientSingleListViewCmdGroupRmv:
+ case EChatClientSingleListViewCmdGroupPart:
+ case EChatClientSingleListViewCmdGroupInfo:
+ case EChatClientSingleListViewCmdGroupFavor:
+ case EChatClientSingleListViewCmdGroupEdit:
+ case EChatClientCmdOpenGroupConv:
+
+ {
+ if ( !CCASyncChecker::CheckSyncStateL() )
+ {
+ CleanupStack::PopAndDestroy(focusedIdBuf);
+
+ return;
+ }
+ break;
+
+ }
+ default:
+ {
+ break;
+ }
+ }
+#endif //IMPS_CONTACT_FETCH_BACKGROUND
+
+ switch ( aCommand )
+ {
+ case EChatClientCmdExpandList: // flowthrough
+ case EChatClientCmdCollapseList:
+ {
+ iContainer->ExpandCollapseListL();
+ break;
+ }
+ case EChatClientCmdNewList:
+ {
+ TInt index = KErrNotFound;
+ TInt err = CCAUINGUtils::NewContactListL( index );
+ if ( index != KErrNotFound )
+ {
+ iContainer->UpdateViewL( index, TEnumsPC::EContactListItem, ETrue );
+ }
+ break;
+ }
+ case EChatClientCmdRenameList:
+ {
+ iContainer->RenameListL();
+ break;
+ }
+
+ case EChatClientCmdContextMenu:
+ {
+ iContextMenuBar->TryDisplayMenuBarL();
+ break;
+ }
+ case EChatClientFriendsListViewCmdDelete:
+ {
+ iContainer->DeleteFriendL();
+ break;
+ }
+ case EChatClientFriendsListViewCmdOpen:
+ {
+ iContainer->ShowDetailsL();
+ UpdateTitleL();
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdAddWatch:
+ {
+ TPtrC userid( iContainer->SelectedUserId() );
+ CHAT_DP( D_CHAT_LIT(
+ "CCASingleListView -> addwatcher to %S" ), &userid );
+ iMainViewArrayPC->AddWatcherL( userid );
+ iContainer->RefreshView( EFalse );
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdRemoveWatch:
+ {
+ TPtrC userid( iContainer->SelectedUserId() );
+ CHAT_DP( D_CHAT_LIT(
+ "CCASingleListView -> removewatcher from %S" ), &userid );
+ iMainViewArrayPC->RemoveWatcherL( userid );
+ iContainer->RefreshView( EFalse );
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdAddManually:
+ {
+ iContainer->SetCbaLockL( ETrue );
+ TInt indexofcontact( iContainer->EditFriendL( TEnumsPC::ECreateNew ) );
+
+ if ( iContainer )
+ {
+ // if the container still exists, update the view
+ if ( UISessionManager().IsLoggedIn() )
+ {
+ iContainer->UpdateViewL( indexofcontact, TEnumsPC::EContactItem, ETrue );
+ iContainer->SetCbaLockL( EFalse );
+ UpdateTitleL();
+ }
+ }
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdAddFromPb:
+ {
+ if ( UISessionManager().IsSupported( CCAUISessionManager::ESearch ) )
+ {
+ // Check disk space before creating new contact,
+ // needed to do allready here in this case
+ IMUtils::FFSSpaceBelowCriticalLevelL( KContactSizeEstimate );
+
+ iContainer->ContactSelectionFromPhoneBookL();
+ }
+ else
+ {
+ IMDialogUtils::DisplayNoteDialogL(
+ R_CHAT_ERROR_NOT_SUP_FUNCTIONS );
+ }
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdMove:
+ {
+ iContainer->MoveContactL();
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdEdit:
+ {
+ TInt indexofcontact( iContainer->EditFriendL( TEnumsPC::EEditContact ) );
+ if ( iContainer )
+ {
+ // if the container still exists, update the view
+ iContainer->UpdateViewL( indexofcontact, TEnumsPC::EContactItem, ETrue );
+ UpdateTitleL();
+ }
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdIMessage:
+ {
+ iContainer->OpenConversationL();
+ break;
+ }
+
+ case EChatClientFriendsListViewCmdBlock:
+ {
+ iContainer->BlockUserL();
+ break;
+ }
+ case EChatClientFriendsListViewCmdBlockEnter:
+ {
+ iContainer->DisplayBlockTextQueryL();
+ break;
+ }
+ case EChatClientFriendsListViewCmdRefresh:
+ {
+ // this is manually selected
+ iContainer->RefreshPresenceL( ETrue );
+ break;
+ }
+ case EChatClientFriendsListViewCmdFetchFailed:
+ {
+ if ( TEnumsPC::ESyncFailed == iMainViewArrayPC->Synchronised( GetCurrentItemIndex( ) ) )
+ {
+ TInt ret( IMDialogUtils::DisplayYesNoConfirmationDialogL(
+ R_QTN_CHAT_CONTACTLIST_FETCHAGAIN ) );
+ if ( !( ( ret == EAknSoftkeyOk ) || ( ret == EAknSoftkeyYes ) ) )
+ {
+ break;
+ }
+
+ }
+
+ iMainViewArrayPC->FetchContactsL();
+ break;
+ }
+ case EChatClientFriendsListViewShowBlockedList:
+ {
+ iContainer->DisplayBlockedListL();
+ break;
+ }
+ case EChatClientFriendsListViewUnblock:
+ {
+ iContainer->DisplayUnblockListQueryL();
+ break;
+ }
+ case EChatClientFriendsListViewCmdFindJoinedChats:
+ {
+ // check if the groups are supported
+ if ( IsFunctionSupported( CCAUISessionManager::EGroup ) )
+ {
+ iContainer->FindJoinedChatsL();
+ }
+ break;
+ }
+
+ case EChatClientMainViewCmdLogin:
+ {
+ iAppUi->UISessionManager().LoginL( MCAUiLoginCmdCB::ELogin );
+ break;
+ }
+
+ case EChatClientMainViewCmdLogout:
+ {
+ iMainViewArrayPC->AddObserver( this );
+ AppUi()->HandleCommandL( EChatClientMainViewCmdLogout );
+ SetCurrentItemIndexL();
+ break;
+ }
+ case EChatClientChatListSettings:
+ {
+ AppUi()->HandleCommandL( EChatClientChatListSettings );
+ // Force refresh the CBA!
+ iContainer->UpdateCbaL();
+ break;
+ }
+ case EAknSoftkeyOpen:
+ // case EChatPrivateListCmdOpen:
+ {
+ if ( iMainViewArrayPC->GetType( GetCurrentItemIndex() ) == TEnumsPC::EInviteItem )
+ {
+ iContainer->OpenInvitationL();
+ }
+
+ break;
+ }
+ case EChatPrivateListCmdDelete:
+ {
+ iContainer->DeleteInvitationL();
+ break;
+ }
+ case EChatPrivateListCmdAddToFriends:
+ {
+ iContainer->SetCbaLockL( ETrue );
+ TEnumsPC::TItem itemType = iContainer->SelectedType();
+ TInt prevIndex( iContainer->EditFriendL( TEnumsPC::EAddToContact ) );
+
+ if ( iContainer )
+ {
+ // if the container still exists, update the view
+ if ( UISessionManager().IsLoggedIn() )
+ {
+ iContainer->UpdateViewL( prevIndex, itemType, ETrue );
+ iContainer->SetCbaLockL( EFalse );
+ UpdateTitleL();
+ }
+ }
+ break;
+ }
+ // Flow-through
+ case EAknSoftkeyExit:
+ case EChatClientCmdExit:
+ {
+ CHAT_DP( D_CHAT_LIT( " CCASingleListView -> BACK command start" ) );
+
+ if ( iAlreadyTrytoExit )
+ {
+ break;
+ }
+ iAlreadyTrytoExit = ETrue;
+
+ TRAPD( err, AppUi()->HandleCommandL( EAknSoftkeyExit ) );
+
+ iAlreadyTrytoExit = EFalse;
+ User::LeaveIfError( err );
+
+ // getcalled whenever the exit RSk presesd
+ // it delete the findbox so that no more operation will be called
+ // for iFindBox, because it was giving panic in FocusChaged of container
+ if ( iAppUi->IsQueryAccepted() )
+ {
+ iContainer->PrepareDestruction();
+ }
+ CHAT_DP( D_CHAT_LIT( " CCASingleListView -> BACK command end" ) );
+ break;
+ }
+ case EChatClientFriendsListViewCmdAddFromSrv:
+ case EChatClientSingleListViewCmdSearchContact:
+ {
+ // check the init pending show note and then process
+ CompletePendingTaskForSearchL() ;
+
+ break;
+ }
+ // Help key support EChatClientCmdHelp is assigned EAknCmdHelp in
+ // chatngclient.hrh
+ case EChatClientCmdHelp:
+ {
+ HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
+ AppUi()->AppHelpContextL() );
+ break;
+ }
+ case EChatPrivateListCmdOpen:
+ case EChatClientFriendsListViewCmdChat:
+ {
+ //TPtrC item = iContainer->SelectedItem();
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+ if ( itemtype == TEnumsPC::EContactItem
+ || itemtype == TEnumsPC::EConversationItem )
+ {
+ // Don't try to open conversation if selected item is
+ // not a contact
+ iContainer->OpenConversationL();
+ }
+
+ else if ( itemtype == TEnumsPC::EInviteItem )
+ {
+ iContainer->OpenInvitationL();
+ }
+ break;
+ }
+ case EChatPrivateListCmdCloseConvers:
+ {
+ iContainer->CloseConversationL();
+ break;
+ }
+ case EChatPrivateListWriteNewConvers:
+ {
+ iContainer->DisplayRecipientTextQueryL();
+ break;
+ }
+ case EChatPrivateListCmdSelectRecipient:
+ {
+ iContainer->DisplayRecipientListQueryL();
+ break;
+ }
+
+ case EChatClientSingleListViewCmdSearchGrp:
+ {
+ if ( UISessionManager().IsSupported( CCAUISessionManager::ESearch ) )
+ {
+ // Check disk space before creating new contact,
+ // needed to do allready here in this case
+ IMUtils::FFSSpaceBelowCriticalLevelL( KContactSizeEstimate );
+
+ if ( CCASearchViewContainer::DisplaySearchCriteriaDlgL(
+ CCASearchViewContainer::ESearchGroups ) )
+ {
+ CAViewSwitcher()->SwitchViewL( KUidSearchView,
+ KUidSearchViewMsgIdGroup,
+ KNullDesC8 );
+ }
+ }
+ else
+ {
+ IMDialogUtils::DisplayNoteDialogL(
+ R_CHAT_ERROR_NOT_SUP_FUNCTIONS );
+ }
+ break;
+ }
+ case EChatClientSingleListViewCmdEnterGrpID :
+ {
+ HBufC* data = HBufC::NewLC( KMaxChatGroupLenght );
+ TPtr dataPtr( data->Des() );
+ iContainer->DisplayRecipientTextQueryForGrpIDL( dataPtr );
+ CleanupStack::PopAndDestroy( data );
+ break;
+ }
+ case EChatClientSingleListViewCmdEdit:
+ {
+ TInt indexofcontact( iContainer->EditFriendL( TEnumsPC::EEditContact ) );
+ if ( iContainer )
+ {
+ // if the container still exists, update the view
+ if ( UISessionManager().IsLoggedIn() )
+ {
+ iContainer->UpdateViewL( indexofcontact, TEnumsPC::EContactItem, ETrue );
+ }
+ // No matter login or not, title should be updated
+ UpdateTitleL();
+ }
+ break;
+ }
+ case EChatClientSingleListViewCmdDetails:
+ {
+ iContainer->ShowDetailsL();
+ UpdateTitleL();
+ break;
+ }
+ case EChatClientSingleListViewCmdChangeMessage:
+ {
+ AppUi()->HandleCommandL( EChatClientCmdStatusMessage );
+ break;
+ }
+
+ case EChatClientSingleListViewCmdOwnEdit:
+ {
+ TInt indexofcontact( iContainer->EditFriendL( TEnumsPC::EEditContact ) );
+ if ( iContainer )
+ {
+ // if the container still exists, update the view
+ iContainer->UpdateViewL( indexofcontact, TEnumsPC::EOwnStatusItem, ETrue );
+ UpdateTitleL();
+ }
+ }
+ case EChatClientSingleListViewCmdDelete:
+ {
+ iContainer->DeleteFriendL();
+ break;
+ }
+ case EChatClientSingleListViewCmdMove:
+ {
+ if ( iContainer->IsWatched() )
+ {
+ HBufC* userid = iContainer->SelectedUserId().AllocLC();
+ iContainer->MoveContactL();
+ iMainViewArrayPC->AddWatcherL( userid->Des() );
+ CleanupStack::PopAndDestroy( userid );
+ iContainer->RefreshView( EFalse );
+ }
+ else
+ {
+ iContainer->MoveContactL();
+ }
+ break;
+ }
+ case EChatClientSingleListViewCmdSavedConversations: //Recorded Chat list view
+ {
+ CAViewSwitcher()->SwitchViewL( KUidRecordedChatListView );
+ break;
+ }
+ //Group options should be shown only if group feature is supported
+ case EChatClientSingleListViewCmdCreateGrp: //Group Chat view
+ {
+ //iCurrentIndex = iContainer->CurrentListboxIndex();
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+ if ( IsFunctionSupported( CCAUISessionManager::EGroup ) )
+ {
+ HBufC* groupId = iContainer->CreateNewChatL();
+ CleanupStack::PushL( groupId );
+ CleanupStack::PopAndDestroy( groupId );
+ }
+ break;
+ }
+ case EChatClientCmdOpenGroupConv:
+ {
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iContainer->CurrentListboxIndex() );
+ //iCreateGrpFromContactList = ETrue;
+ if ( IsFunctionSupported( CCAUISessionManager::EGroup ) )
+ {
+ HBufC* groupId = iContainer->CreateNewChatL();
+ CleanupStack::PushL( groupId );
+ CleanupStack::PopAndDestroy( groupId );
+ }
+ break;
+ }
+ // Options for when focus is on group chat case EAknSoftkeyOpen:
+ // This case can be merged with the case for invitation item (EChatPrivateListCmdOpen)
+ case EChatClientSingleListViewCmdGroupOpen: // Flowthrough
+ case EChatClientSingleListViewCmdGroupJoin:
+ {
+ //iCurrentIndex = iContainer->CurrentListboxIndex();
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+
+ // When we have already tried to join a group, just get out
+ if ( iAlreadyTrytoJoinGroup )
+ break;
+
+ // Try to join a group
+ iAlreadyTrytoJoinGroup = ETrue;
+
+ HBufC* groupId = focusedId.AllocLC();
+ TRAPD( err, iContainer->JoinGroupL( *groupId ) );
+
+ // Finish join the group
+ iAlreadyTrytoJoinGroup = EFalse;
+
+ CleanupStack::PopAndDestroy( groupId );
+ User::LeaveIfError( err );
+
+ break;
+ }
+ case EChatClientSingleListViewCmdGroupLeave:
+ {
+ TInt currentIndex = iContainer->CurrentListboxIndex();
+ TInt indexOfList = iMainViewArrayPC->IndexOfList( currentIndex - 1 );
+ TInt countOfContactsInList = iMainViewArrayPC->CountOfContactsInList( indexOfList );
+
+ TCAItemDetails itemDetails = iMainViewArrayPC->GetArrayItemIdDetails( currentIndex );
+ iContainer->LeaveGroupL();
+
+ if ( !iAppUi->GroupUtils()->IsOwnGroup( itemDetails.aItemID )
+ && !iAppUi->GroupUtils()->IsFavouriteChatGroup( itemDetails.aItemID ) )
+ {
+ if ( indexOfList + countOfContactsInList == currentIndex )
+ {
+ --currentIndex;
+ }
+ iContainer->SetListboxIndexL( currentIndex );
+ }
+ break;
+ }
+ case EChatClientSingleListViewCmdGroupRmv:
+ {
+ //iCurrentIndex = iContainer->CurrentListboxIndex();
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+ iAlreadyTrytoJoinGroup = ETrue;
+ iContainer->DeleteGroupL( focusedId );
+ iAlreadyTrytoJoinGroup = EFalse;
+ break;
+ }
+ case EChatClientSingleListViewCmdGroupPart:
+ {
+ //iCurrentIndex = iContainer->CurrentListboxIndex();
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+ iContainer->DisplayJoinedMembersL();
+ break;
+ }
+ case EChatClientSingleListViewCmdGroupInfo:
+ {
+ //iCurrentIndex = iContainer->CurrentListboxIndex();
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+ iContainer->DisplayChatInfoL();
+ break;
+ }
+ case EChatClientSingleListViewCmdGroupFavor:
+ {
+ //iCurrentIndex = iContainer->CurrentListboxIndex();
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+ iContainer->SaveAsFavouriteL( );
+ break;
+ }
+ case EChatClientSingleListViewCmdGroupEdit:
+ {
+ //iCurrentIndex = iContainer->CurrentListboxIndex();
+ //iItemDetails = iMainViewArrayPC->GetArrayItemIdDetails( iCurrentIndex );
+ iContainer->EditChatGroupPropertiesL();
+ UpdateTitleL();
+ break;
+ }
+ default:
+ {
+ AppUi()->HandleCommandL( aCommand );
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy( focusedIdBuf );
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::InvokeCommandL
+// ---------------------------------------------------------
+//
+void CCASingleListView::InvokeCommandL( TInt aCommand )
+ {
+ HandleCommandL( aCommand );
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::UpdateTitleL
+// ---------------------------------------------------------
+//
+void CCASingleListView::UpdateTitleL()
+ {
+ CAAppUi()->CAStatusPane()->SetTitleL( iEikonEnv,
+ R_CHATCLIENT_MAIN_VIEW_TITLE );
+ }
+// ---------------------------------------------------------
+// CCASingleListView::ConstructContextMenuBarL
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::ConstructContextMenuBarL()
+ {
+ if ( iContextMenuBar )
+ {
+ iEikonEnv->EikAppUi()->RemoveFromStack( iContextMenuBar );
+ delete iContextMenuBar;
+ iContextMenuBar = NULL;
+ }
+ TEnumsPC::TItem itemtype = iContainer->SelectedType();
+
+ CEikMenuBar* menuBar = new ( ELeave ) CEikMenuBar();
+ CleanupStack::PushL( menuBar );
+ menuBar->ConstructL( this, NULL,
+ R_CHATCLIENT_FRIENDSLIST_MENUBAR_CONTEXT );
+ iEikonEnv->EikAppUi()->AddToStackL( menuBar, ECoeStackPriorityMenu,
+ ECoeStackFlagRefusesFocus );
+ iContextMenuBar = menuBar;
+ CleanupStack::Pop( menuBar );
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::HandleError
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::HandleError( TInt aError )
+ {
+ CHAT_DP( D_CHAT_LIT( "CCASingleListView::HandleError, aError = %d" ),
+ aError );
+ if ( ( aError > Imps_ERROR_BASE ) && ( aError < KErrNone ) )
+ {
+ // propagate system errors to current active scheduler,
+ // it should show a note
+ CActiveScheduler::Current()->Error( aError );
+ }
+
+ // imps errors are ignored at the moment as we don't have any
+ // notes specified for them
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::GetCurrentItemIndex
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CCASingleListView::GetCurrentItemIndex( )
+ {
+ if ( iContainer )
+ {
+ return iContainer->CurrentListboxIndex();
+ }
+
+ return iCurrentIndex;
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::SetCurrentItemIndex
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::SetCurrentItemIndexL( TBool aFreshLogin /* = EFalse */ )
+ {
+ // After the logout the focus should go to owndata
+ // if it was on contactlist/contactitem
+ TInt currentIndex = GetCurrentItemIndex();
+ TEnumsPC::TItem itemType = iMainViewArrayPC->GetType( currentIndex );
+ if ( TEnumsPC::EInvalid == itemType || aFreshLogin )
+ {
+ currentIndex = 0;
+ }
+ if ( iContainer )
+ {
+ iContainer->SetListboxIndexL( currentIndex );
+ }
+ else
+ {
+ iCurrentIndex = 0;
+ }
+
+ }
+
+// ---------------------------------------------------------
+// CCASingleListView::GetCurrentItemIndex
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::NotifySyncCompleted( )
+ {
+ CCACommandManager* commandManager( NULL );
+ TRAPD( err, commandManager = CCACommandManagerFactory::InstanceL()->GetCommandManager() );
+ if ( err == KErrNone && commandManager )
+ {
+ MCASessionHandlerCmd* sessHandlerCmd = commandManager->GetSessionHandlerCmd() ;
+ TBool contactsRefreshed( EFalse );
+ if ( sessHandlerCmd )
+ {
+ contactsRefreshed = sessHandlerCmd->ContactsRefreshed();
+ }
+
+ if ( !contactsRefreshed && !iAppUi->GetProcessManager().GetSettingsInterface()
+ ->GetBoolValuePC( TEnumsPC::EAutomaticPresenceUpdate , NULL ) )
+ {
+ TRAP_IGNORE(
+ iMainViewArrayPC->RefreshFriendsL();
+ // If something failed, we are going to ignore as in case of automatic mode
+ if ( sessHandlerCmd )
+ {
+ sessHandlerCmd->SetContactsRefreshed( ETrue );
+ }
+ // show the manual update note if user in same view
+ if ( iContainer && !iFirstManualRefresh )
+ {
+ ShowManualUpdateNoteL();
+ }
+ );
+ }
+ }
+ iMainViewArrayPC->RemoveObserver( );
+ }
+// ---------------------------------------------------------
+// CCASingleListView::HandleInitChange
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CCASingleListView::HandleListInitChange( TBool aCompleted )
+ {
+ CHAT_DP_TXT( "CCASingleListView::HandleListInitChange started" );
+
+ if ( aCompleted ) //list init is complete
+ {
+
+ // hide wait note
+ if ( iWaitVisible )
+ {
+ CHAT_DP_TXT( "CCASingleListView::HandleListInitChange - iListInitProgress" );
+ CCAAppUi* appUi = static_cast<CCAAppUi*>( CCoeEnv::Static()->AppUi() );
+ //CS warning ignored
+ TRAPD( err, appUi->DismissWaitDialogL( KErrNone ) );
+
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ iWaitVisible = EFalse;
+ }
+ //CS warning ignored
+ TRAP_IGNORE( iMainViewArrayPC->UnRegisterObserverL();
+
+ if ( !iWaitVisible )
+ {
+ if ( !CCASyncChecker::CheckSyncStateL() )
+ {
+ return;
+ }
+ if ( UISessionManager().IsSupported( CCAUISessionManager::ESearch ) )
+ {
+ // Check disk space before creating new contact,
+ // needed to do allready here in this case
+ IMUtils::FFSSpaceBelowCriticalLevelL( KContactSizeEstimate );
+
+ if ( CCASearchViewContainer::DisplaySearchCriteriaDlgL(
+ CCASearchViewContainer::ESearchUsers ) )
+ {
+ CAViewSwitcher()->SwitchViewL( KUidSearchView,
+ KUidSearchViewMsgIdUser,
+ KNullDesC8 );
+ }
+
+ }
+ else
+ {
+ IMDialogUtils::DisplayNoteDialogL(
+ R_CHAT_ERROR_NOT_SUP_FUNCTIONS );
+ }
+ }
+ );
+ }
+ CHAT_DP_TXT( "ASingleListView::HandleListInitChange completed" );
+ //check waiting then stop
+ }
+// ---------------------------------------------------------
+// CCASingleListView::HandleInitChange
+// (other items were commented in a header).
+// ---------------------------------------------------------
+TBool CCASingleListView::CompletePendingTaskForSearchL()
+ {
+ CHAT_DP_TXT( "CCASingleListView::CompletePendingTaskForSearchL started" );
+
+ TBool result = EFalse;
+
+ // show the wait note if we have pending list initialization
+
+ if ( iMainViewArrayPC->IsListInitializationCompletedL() )
+ {
+ iMainViewArrayPC->RegisterObserverL( this );
+ // init the list
+ result = InitializeListL();
+
+ }
+ else
+ {
+ if ( !CCASyncChecker::CheckSyncStateL() )
+ {
+ return EFalse;
+ }
+ if ( UISessionManager().IsSupported( CCAUISessionManager::ESearch ) )
+ {
+ // Check disk space before creating new contact,
+ // needed to do allready here in this case
+ IMUtils::FFSSpaceBelowCriticalLevelL( KContactSizeEstimate );
+
+ if ( CCASearchViewContainer::DisplaySearchCriteriaDlgL(
+ CCASearchViewContainer::ESearchUsers ) )
+ {
+ CAViewSwitcher()->SwitchViewL( KUidSearchView,
+ KUidSearchViewMsgIdUser,
+ KNullDesC8 );
+ }
+
+ }
+ else
+ {
+ IMDialogUtils::DisplayNoteDialogL(
+ R_CHAT_ERROR_NOT_SUP_FUNCTIONS );
+ }
+
+ CHAT_DP_TXT( "CCASingleListView::ListInitL done" );
+
+ }
+
+ CHAT_DP_TXT( "CCASingleListView::CompletePendingTaskForSearchL completed" );
+
+ return result;
+
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCASessionHandler::GroupSyncL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCASingleListView::InitializeListL()
+ {
+
+ CHAT_DP_TXT( "CCASingleListView::InitializeListL started" );
+
+ CCAAppUi* appUi = static_cast<CCAAppUi*>( CCoeEnv::Static()->AppUi() );
+
+ if ( !iWaitVisible )
+ {
+ CHAT_DP_TXT(
+ "CCASingleListView::InitializeListL - ! iWaitVisible " );
+
+ // launch the wait note
+
+ iWaitVisible = ETrue;
+
+ appUi->ShowWaitDialogL( R_QTN_CHAT_SEARCHVIEW_PROCESSING, ETrue );
+
+ CHAT_DP_TXT( "CCASingleListView::InitializeListL done" );
+
+ }
+ // nothing interesting, do nothing, but come back here
+ CHAT_DP_TXT( "CCASingleListView::InitializeListL done" );
+
+ return ETrue;
+ }
+// -----------------------------------------------------------------------------
+// CCASingleListView::ShowManualUpdateNoteL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCASingleListView::ShowManualUpdateNoteL()
+ {
+ if ( !iFirstManualRefresh )
+ {
+ iFirstManualRefresh = ETrue;
+ // manual presence update and user didn't start this, show info note
+ HBufC* text = iEikonEnv->AllocReadResourceLC(
+ R_QTN_CHAT_MANUAL_UPDATE_ACT );
+ IMDialogUtils::DisplayNoteDialogL( *text, R_AVKON_SOFTKEYS_OK_EMPTY__OK,
+ CAknNoteDialog::ENoTimeout );
+ CleanupStack::PopAndDestroy( text );
+
+ }
+ }
+
+// End of File
+