diff -r 000000000000 -r 094583676ce7 wvuing/wvuiave/AppSrc/CCASearchView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/wvuiave/AppSrc/CCASearchView.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,571 @@ +/* +* Copyright (c) 2002-2005,2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: View class for search view +* +*/ + + +// INCLUDE FILES +#include "CCASearchView.h" +#include "CCASearchViewContainer.h" +#include "CAExternalInterface.h" +#include "chatngclient.hrh" +#include "CCAAppUi.h" +#include "CCAStatusPanehandler.h" +#include "IMDialogUtils.h" + +#include "CCAUISessionManager.h" +#include "ChatDebugPrint.h" +#include "IMUtils.h" +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// local variation +#include "IMPrivateCRKeys.h" +#include "IMVariant.hrh" +#include "MCAProcessManager.h" +#include "MCASearchInterfacePC.h" +#include "TEnumsPC.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 ======================= + + +// --------------------------------------------------------- +// CCASearchView::CCASearchView() +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CCASearchView::CCASearchView() + + { + + iSearchInterfacePC = CAAppUi()->GetProcessManager().GetSearchInterface(); + // want all events for group synchronization + CHAT_DP_TXT( + "CCASearchView::CCASearchView - Registering background observer" ); + + iSearchInterfacePC->RegisterBackgroundObserver( this, + TEnumsPC::EGroupFetch, ~0x0 ); + + // only fire once. set to true when the group fetch finishes + + + TInt status( iSearchInterfacePC->BackgroundTaskStatus( + TEnumsPC::EGroupFetch ) ); + + CHAT_DP( D_CHAT_LIT( "group fetch status %d" ), status ); + + // if background task doesn't exist, mark group sync as done + iGroupSyncDone = ( status == KErrNotFound ); + + CHAT_DP_TXT( "CCASearchView::CCASearchView - Registered background \ + observer, everything good" ); + } + + + +// --------------------------------------------------------- +// CCASearchView::~CCASearchView() +// C++ Destructor +// --------------------------------------------------------- +// +CCASearchView::~CCASearchView() + { + if ( iSearchInterfacePC ) + { + iSearchInterfacePC->UnRegisterBackgroundObserver( this ); + } + + if ( iPopUpMenu ) + { + AppUi()->RemoveFromViewStack( *this, iPopUpMenu ); + } + delete iPopUpMenu; + + if ( iContainer ) + { + AppUi()->RemoveFromViewStack( *this, iContainer ); + iContainer->DeleteSelfD(); + } + + } + + +// --------------------------------------------------------- +// CCASearchView::HandleCommandL( TInt aCommand ) +// This class all commands from menu +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCASearchView::HandleCommandL( TInt aCommand ) + { + CHAT_DP( D_CHAT_LIT( "SearchView: HandleCommand( %d )" ), aCommand ); + if ( iPopUpMenu && iPopUpMenu->IsDisplayed() ) + { + iPopUpMenu->StopDisplayingMenuBar(); + } + + switch ( aCommand ) + { + case EChatClientSearchNew: + case EChatClientSearchMore: + case EChatClientSearchPrev: + case EChatClientSearchStartConversation: + case EChatClientSearchAddFriends: + case EChatClientSearchInvite: + case EChatClientSearchBlock: + case EChatClientSearchBlockEnter: + case EChatClientSearchBlockShow: + case EChatClientSearchJoin: + { + UISessionManager().LoginL( MCAUiLoginCmdCB::EQueryLogin ); + if ( !UISessionManager().IsLoggedIn() ) + { + // if still not logged in just return + return; + } + break; + } + default: + { + break; + } + } + + switch ( aCommand ) + { + //Next two commands have same function + case EAknSoftkeyBack: + case EChatClientCmdBack: + { + iContainer->SetObserverToNull(); + CAAppUi()->SwitchViewL( iPrevViewId.iViewUid ); + break; + } + case EChatClientSearchNew: + { + iContainer->NewSearchL(); + break; + } + case EChatClientSearchMore: + { + TRAPD( searchMoreErr, iContainer->SearchMoreL() ); + if ( searchMoreErr == KErrNoMemory + || searchMoreErr == KErrDiskFull ) + { + User::Leave( searchMoreErr ); + } + if ( searchMoreErr != KErrNone ) + { + CActiveScheduler::Current()->Error( searchMoreErr ); + } + break; + } + case EChatClientSearchPrev: + { + TRAPD( searchPrevErr, iContainer->SearchPreviousL() ); + if ( searchPrevErr == KErrNoMemory + || searchPrevErr == KErrDiskFull ) + { + User::Leave( searchPrevErr ); + } + if ( searchPrevErr != KErrNone ) + { + CActiveScheduler::Current()->Error( searchPrevErr ); + } + break; + } + + case EChatClientSearchStartConversation: + { + iContainer->StartConversationL(); + break; + } + + case EChatClientSearchAddFriends: + { + iContainer->AddToFriendsL(); + break; + } + + case EChatClientSearchInvite: + { + if ( UISessionManager().IsSupported( CCAUISessionManager::EInvite ) ) + { + iContainer->InviteL(); + } + else + { + IMDialogUtils::DisplayNoteDialogL( + R_CHAT_ERROR_NOT_SUP_FUNCTIONS ); + } + break; + } + + case EChatClientSearchBlock: + { + iContainer->BlockUserL(); + break; + } + case EChatClientSearchBlockEnter: + { + iContainer->BlockUserWVIdL(); + break; + } + case EChatClientSearchBlockShow: + { + iContainer->DisplayBlockedListL(); + break; + } + case EChatClientSearchJoin: + { + iContainer->JoinToGroupL(); + break; + } + case EChatClientSearchFavor: + { + iContainer->SaveAsFavouriteL(); + break; + } + case EChatClientSearchEdit: + { + break; + } + // Help key support EChatClientCmdHelp is assigned EAknCmdHelp in + // chatngclient.hrh + case EChatClientCmdHelp: + { + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), + AppUi()->AppHelpContextL() ); + break; + } + case EAknSoftkeyContextOptions: // MSK command show context menu + { + ShowPopUpMenuL(); + break; + } + default: + { + AppUi()->HandleCommandL( aCommand ); + break; + } + } + } + +// --------------------------------------------------------- +// CCASearcView::DynInitMenuPaneL() +// Initialises menu pane when needed +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCASearchView::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + + TInt curIndex( iContainer->ListBox()->CurrentItemIndex() ); + + if ( aResourceId == R_CHATCLIENT_SEARCH_VIEW_MENU || + aResourceId == R_CHATCLIENT_SEARCH_VIEW_CONTEXT_MENU ) + { + + if ( iContainer->SearchType() + == CCASearchViewContainer::ESearchGroups || curIndex < 0 ) + { + aMenuPane->SetItemDimmed( EChatClientSearchAddFriends, ETrue ); + aMenuPane->SetItemDimmed( + EChatClientSearchStartConversation, ETrue ); + aMenuPane->SetItemDimmed( EChatClientSearchInvite, ETrue ); + } + else + if ( !iContainer->IsOnline() + && !( IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_SEND_MSG_IGNORE_OFFLINE_NOTIFY ) + || IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_SEND_MSG_IGNORE_OFFLINE ) ) ) + { + aMenuPane->SetItemDimmed( + EChatClientSearchStartConversation, ETrue ); + aMenuPane->SetItemDimmed( EChatClientSearchInvite, ETrue ); + } + + TInt joinedGroups( iSearchInterfacePC->JoinedGroups() ); + CHAT_DP( D_CHAT_LIT( "Number of joined groups: %d" ), joinedGroups ); + if ( joinedGroups == 0 ) + { + aMenuPane->SetItemDimmed( EChatClientSearchInvite, ETrue ); + } + + if ( iContainer->SearchType() == CCASearchViewContainer::ESearchUsers || + curIndex < 0 ) + { + aMenuPane->SetItemDimmed( EChatClientSearchJoin, ETrue ); + } + + if ( iContainer->SearchType() == CCASearchViewContainer::ESearchUsers || + curIndex < 0 || iContainer->IsFavouriteChatGroup() ) + { + aMenuPane->SetItemDimmed( EChatClientSearchFavor, ETrue ); + } + + + if ( iContainer->SearchType() == CCASearchViewContainer::ESearchUsers + && iSearchInterfacePC->FindAnyContactL( iContainer->SearchData() ) ) + { + aMenuPane->SetItemDimmed( EChatClientSearchAddFriends, ETrue ); + } + + } + + // Block submenu + if ( ( aResourceId == R_CHATCLIENT_SEARCH_BLOCK_SUBMENU ) && + ( iContainer->SearchType() == CCASearchViewContainer::ESearchUsers ) ) + { + if ( iContainer->IsBlocked() ) + { + aMenuPane->SetItemDimmed( EChatClientSearchBlock, ETrue ); + } + // show/hide "show blocked list" option + if ( !IMUtils::IntResourceValueL( + RSC_CHAT_VARIATION_SHOW_BLOCKED_LIST ) ) + { + aMenuPane->SetItemDimmed( + EChatClientSearchBlockShow, ETrue ); + } + } + + // Items only in Context specific menu + if ( aResourceId == R_CHATCLIENT_SEARCH_VIEW_CONTEXT_MENU ) + { + // put them here + } + + // Items only in Options menu + if ( aResourceId == R_CHATCLIENT_SEARCH_VIEW_MENU ) + { + if ( curIndex < 0 || !iContainer->PrevResultsAvailable() ) + { + aMenuPane->SetItemDimmed( EChatClientSearchPrev, ETrue ); + } + + if ( curIndex < 0 || !iContainer->MoreResultsAvailable() ) + { + aMenuPane->SetItemDimmed( EChatClientSearchMore, ETrue ); + } + + // check if user block/unblock is supported according to variation + if ( !UISessionManager().IsSupported( CCAUISessionManager::EBlock ) ) + { + aMenuPane->SetItemDimmed( EChatClientSearchBlockOpt, ETrue ); + } + if ( iContainer->SearchType() + == CCASearchViewContainer::ESearchGroups || curIndex < 0 ) + { + aMenuPane->SetItemDimmed( EChatClientSearchBlockOpt, ETrue ); + } + } + // if we're displaying general menu and help feature is not supported.. + if ( ( aResourceId == R_CHATCLIENT_GENERAL_MENU ) && + ( !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) ) + { + // dimm the help menu item + aMenuPane->SetItemDimmed( EChatClientCmdHelp, ETrue ); + } + } + + +// --------------------------------------------------------- +// CCASearchView::ShowPopUpMenuL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCASearchView::ShowPopUpMenuL() + { + +#ifdef RD_30_DISABLE_TOUCH + // In 3.0 we need to launch context menu by ourself + iPopUpMenu->TryDisplayMenuBarL(); +#else + MenuBar()->TryDisplayContextMenuBarL(); +#endif //RD_30_DISABLE_TOUCH + + } + + +// --------------------------------------------------------- +// CCASearchView::ShowRecipientsListL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +TInt CCASearchView::ShowRecipientsListL( TInt /*aResourceId*/ ) + { + return User::LeaveIfError( -1 ); + } + + +// --------------------------------------------------------- +// CCASearchView::DoActivateL() +// Activates view +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCASearchView::DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, const TDesC8& /* aCustomMessage*/ ) + { + CHAT_DP( D_CHAT_LIT( "CCASearchView::DoActivateL( viewid=%d" ), + aPrevViewId.iViewUid ); + + // Unregister the view that was registered from Forward option. + // didn't find any better place to put this. + if ( TEnumsPC::EToBeUnregistered == CAAppUi()->RetForwardTo() ) + { + CAAppUi()->UnRegisterPreviousview( ); + CAAppUi()->SetResetForwardTo( TEnumsPC::EUnregistered ); + } + // To prevent looping between this view and ... + // - refresh view + // - conversation view + if ( aPrevViewId.iViewUid != KUidRefreshView && + aPrevViewId.iViewUid != KUidConversationsView && + aPrevViewId.iViewUid != KUidChatView && + aPrevViewId.iViewUid != KUidInvitationView ) + { + iPrevViewId = aPrevViewId; + } + + CAAppUi()->CAStatusPane()->ClearNaviPaneL(); + + if ( !iContainer ) + { + TBool users( aCustomMessageId == KUidSearchViewMsgIdUser ); + + CHAT_DP( D_CHAT_LIT( + "CCASearchView::DoActivateL constructing container" ) ); + iContainer = CCASearchViewContainer::NewL( iSearchInterfacePC, ClientRect(), + *CAViewSwitcher(), *this, users, iGroupSyncDone, + KNullDesC ); + + iContainer->SetMopParent( this ); + + AppUi()->AddToViewStackL( *this, iContainer ); + } + + // SimplifiedUI localisation variation for empty list + if ( IMUtils::CRKeyL( KCRUidIMVariation, KIMVariationKey ) & + EIMFeatSimplifiedUI ) + { + iContainer->SetEmptyTextsToListboxL(); + } + + // Context sensitive menu +#ifndef RD_30_DISABLE_TOUCH + // S60 Common + MenuBar()->SetContextMenuTitleResourceId( R_SEARCH_VIEW_POPUP_MENU_BAR ); +#else + // S60 3.0 + if ( !iPopUpMenu ) + { + iPopUpMenu = new( ELeave ) CEikMenuBar; + iPopUpMenu->ConstructL( this, 0, R_SEARCH_VIEW_POPUP_MENU_BAR ); + iEikonEnv->EikAppUi()->AddToStackL( iPopUpMenu, ECoeStackPriorityMenu, + ECoeStackFlagRefusesFocus ); + } + + CHAT_DP( D_CHAT_LIT( "CCASearchView::DoActivateL ends" ) ); +#endif //RD_30_DISABLE_TOUCH + + } + +// --------------------------------------------------------- +// CCASearchView::DoDeactivate() +// Deactivates the view +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCASearchView::DoDeactivate() + { + CHAT_DP( D_CHAT_LIT( "CCASearchView::DoDeactivate" ) ); + if ( iContainer ) + { + AppUi()->RemoveFromViewStack( *this, iContainer ); + } + + iContainer->DeleteSelfD(); + iContainer = NULL; + + + if ( iPopUpMenu ) + { + AppUi()->RemoveFromViewStack( *this, iPopUpMenu ); + } + delete iPopUpMenu; + iPopUpMenu = NULL; + } + + +// --------------------------------------------------------- +// CCASearchView::HandleBackgroundEventPC() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCASearchView::HandleBackgroundEventPC( + TEnumsPC::TCABackgroundTasks aEventSource, + TEnumsPC::TCABackgroundStatus aStatus, + TInt /*aSubTaskNumber*/, + TInt /*aLeaveCode*/ ) + { + CHAT_DP_FUNC_ENTER( "HandleBackgroundEvent" ); + + if ( iGroupSyncDone ) + { + // we're not interested in this event anymore, but apparently + // we can't unregister it inside here + return; + } + + // Currently we are interested only group fetching events + if ( aEventSource == TEnumsPC::EGroupFetch ) + { + CHAT_DP_FUNC_ENTER( "HandleBackgroundEvent - EGroupFetch" ); + if ( aStatus == TEnumsPC::ECompleted + || aStatus == TEnumsPC::EFailedStatus ) + { + CHAT_DP_TXT( "CCASearchView::HandleBackgroundEvent - \ + Got ECompleted/EFailed, nuke wait note" ); + + iGroupSyncDone = ETrue; + + if ( iContainer ) + { + iContainer->SetGroupSyncDone(); + } + } + } + + CHAT_DP_FUNC_DONE( "HandleBackgroundEvent" ); + } + +// End of File