--- /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 <aknviewappui.h>
+#include <stringloader.h>
+#include <eikmenup.h>
+#include <eikmenub.h>
+#include <eiklbx.h>
+#include <chatNG.rsg>
+#include <bldvariant.hrh>
+
+#include <hlplch.h>
+#include <FeatMgr.h>
+
+// 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