wvuing/wvuiave/AppSrc/CCASearchView.cpp
changeset 0 094583676ce7
--- /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