uiservicetab/vimpstui/src/cvimpstuisearchviewcontrol.cpp
changeset 0 5e5d6b214f4f
child 14 9fdee5e1da30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiservicetab/vimpstui/src/cvimpstuisearchviewcontrol.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,582 @@
+/*
+* Copyright (c) 2008 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:  Implementation for CVIMPSTUiSearchViewControl.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "cvimpstuisearchviewcontrol.h"
+
+#include "mvimpstcmdhandler.h"
+#include "vimpstutils.h"
+#include "tvimpstconsts.h"
+#include "mvimpstengine.h"
+#include "cvimpstuisearchview.h"
+#include "vimpstui.hrh"
+#include "vimpstutilsdialog.h"
+#include    "vimpstdebugprint.h" 
+// imlauncher
+#include <imcvlauncher.h>
+
+
+// system include
+#include 	<aknenv.h>
+#include	<aknlists.h>
+#include    <AknIconArray.h>
+#include 	<AknUtils.h> 
+#include 	<StringLoader.h>
+
+// Pbk2
+#include <MPbk2KeyEventHandler.h>
+#include <vimpstuires.rsg>
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// --------------------------------------------------------------------------
+// CVIMPSTUiSearchViewControl::CVIMPSTUiSearchViewControl
+// --------------------------------------------------------------------------
+//
+CVIMPSTUiSearchViewControl::CVIMPSTUiSearchViewControl( MPbk2KeyEventHandler* aKeyEventHandler,
+														TUint32 aServiceId,
+													   	MVIMPSTEngine& aEngine,
+													   	MVIMPSTCmdHandler& aCommandHandler,
+													   	CVIMPSTUiSearchView& aSearchView )
+	:iKeyEventHandler(aKeyEventHandler),
+	 iServiceId(aServiceId),
+	 iEngine( aEngine ),
+	 iCommandHandler( aCommandHandler ),
+	 iSearchView( aSearchView )
+    {
+    
+    }
+
+
+// --------------------------------------------------------------------------
+// CVIMPSTUiSearchViewControl::ConstructL
+// --------------------------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::ConstructL()
+    {
+    CreateWindowL();
+    iItemArray = new ( ELeave ) CDesCArrayFlat( KArrayGranularity );   
+    // Create listbox
+    iListBox = new ( ELeave ) CAknDoubleStyleListBox;
+    iListBox->ConstructL( this, EAknListBoxSelectionList );
+    
+    //iListBox->SetListBoxObserver( this );
+    
+    iListBox->SetContainerWindowL(*this);
+    iListBox->CreateScrollBarFrameL(ETrue);
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL
+        (CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+        
+    // set marquee on
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+   	iListBox->Model()->SetItemTextArray( iItemArray );
+	iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+	
+	iListBox->SetListBoxObserver( this );
+			
+	ActivateL();
+
+    }
+
+
+// --------------------------------------------------------------------------
+// CVIMPSTUiSearchViewControl::NewL
+// --------------------------------------------------------------------------
+//
+CVIMPSTUiSearchViewControl* CVIMPSTUiSearchViewControl::NewL
+        								  ( MPbk2KeyEventHandler* aKeyEventHandler, 
+        									TUint32 aServiceId,
+        									MVIMPSTEngine& aEngine,
+        									MVIMPSTCmdHandler& aCommandHandler,
+        									CVIMPSTUiSearchView& aSearchView )
+    {
+    CVIMPSTUiSearchViewControl* self = NewLC(aKeyEventHandler,
+    										 aServiceId, aEngine, 
+    										 aCommandHandler, aSearchView );
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+
+// --------------------------------------------------------------------------
+// CVIMPSTUiSearchViewControl::NewLC
+// --------------------------------------------------------------------------
+//
+CVIMPSTUiSearchViewControl* CVIMPSTUiSearchViewControl::NewLC
+									        ( MPbk2KeyEventHandler* aKeyEventHandler,
+									          TUint32 aServiceId,
+									          MVIMPSTEngine& aEngine,
+									          MVIMPSTCmdHandler& aCommandHandler,
+									          CVIMPSTUiSearchView& aSearchView )
+    {
+    CVIMPSTUiSearchViewControl* self =
+        new (ELeave) CVIMPSTUiSearchViewControl(aKeyEventHandler,
+        									 aServiceId, aEngine,
+        									 aCommandHandler, aSearchView);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CVIMPSTUiSearchViewControl::Destructor
+// -----------------------------------------------------------------------------
+//
+CVIMPSTUiSearchViewControl::~CVIMPSTUiSearchViewControl()
+    {
+   
+	delete iItemArray;
+    delete iListBox;
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::SearchResultL()
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::SearchResultL(RArray<TVIMPSTSearchData> aSearchData )
+    {
+   	UpdateListBoxL(aSearchData);
+    }
+
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::SearchFinishedL()
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::SearchFinishedL(TInt /*aError*/)
+    {
+    // if any error show error note
+    if( ! iItemArray->Count() )
+	    {
+	    SetEmptyTextsToListboxL();	
+	    iListBox->DrawNow();
+	    }
+	UpdateCbaL();
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::HandleControlEventL
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType)
+    {
+    // We only observe iFindbox
+    if( EEventStateChanged == aEventType )
+        {
+
+      	((CAknFilteredTextListBoxModel*) iListBox->Model() )
+            ->Filter()->HandleOfferkeyEventL();        
+        
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTUiSearchViewControl::SetEmptyTextsToListboxL()
+// See header for details. 
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::SetEmptyTextsToListboxL()
+    {    
+    HBufC* emptyFinal = VIMPSTUtils::CombineStringFromResourceLC
+    									( R_QTN_CHAT_EMPTY_SEARCH_PRIMARY, 
+    									  R_QTN_CHAT_EMPTY_SEARCH);
+    				
+    iListBox->View()->SetListEmptyTextL( *emptyFinal );
+    CleanupStack::PopAndDestroy(); // emptyFinal    
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTUiSearchViewControl::SetSearchingTextToListboxL()
+// See header for details. 
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::SetSearchingTextToListboxL()
+    {    
+    iListBox->View()->SetListEmptyTextL( KSpace );
+    iListBox->DrawNow();
+    }
+
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::HandleListBoxEventL
+// Handles list box events
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+												 TListBoxEvent aEventType )
+    {
+    switch(aEventType)
+        {
+
+        case EEventItemSingleClicked:
+
+            {
+            TInt curIndex = iListBox->CurrentItemIndex();
+            if( curIndex >=0)
+                {
+            HBufC* contactId = GetFocusedContactLC() ;
+
+            if ( contactId->Length() )
+                {
+            if( iCommandHandler.GetProcessInterface().FindAnyContact( *contactId ) )
+                {
+            //contact is already there in contact list
+            TInt index = iCommandHandler.GetProcessInterface().FindContactIndexL(*contactId);
+            TVIMPSTEnums::TOnlineStatus onlinestatus = iCommandHandler.GetProcessInterface().GetOnlineStatusL(index);
+            if(TVIMPSTEnums::EPending != onlinestatus) //if contact is not remote pending
+                {
+            //open conversation view
+            OpenConversationL( *contactId );   
+                }
+
+                }
+            else 
+                {	
+            //ask the query for adding contact
+            HBufC* queryTxt = StringLoader::LoadLC( R_QTN_CHAT_REACTIVE_ADD_LIST, *contactId );
+            TInt response = VIMPSTUtilsDialog::DisplayQueryDialogL(
+                    R_GENERIC_YES_NO_CONFIRMATION_QUERY,
+                    *queryTxt );
+
+            if ( ( response == EAknSoftkeyOk ) || ( response == EAknSoftkeyYes ) )
+                {
+            iSearchView.HandleCommandL( ESearchAddFriends );
+                }
+            CleanupStack::PopAndDestroy( queryTxt );	 
+                }
+                }
+            CleanupStack::PopAndDestroy( contactId );	 
+                }
+            break;
+            }
+            // Add enter key handling
+        case EEventEnterKeyPressed:
+            {
+            CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+            TInt commandId( iCba->ButtonGroup()->CommandId( CEikButtonGroupContainer::EMiddleSoftkeyPosition));
+
+            iSearchView.HandleCommandL(commandId);
+            break;
+            }
+        }
+    UpdateCbaL();	  
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::OpenConversationL(
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CVIMPSTUiSearchViewControl::OpenConversationL(const TDesC& aContactId )
+	{
+	MVIMPSTProcessArray& arrayProcess = iCommandHandler.GetProcessInterface();
+	TInt indexInTabbedView = arrayProcess.FindContactIndexL( aContactId );
+	TInt result = EAknSoftkeyOk;
+
+	//get the status from engine.
+	TVIMPSTEnums::TOnlineStatus status = arrayProcess.GetOnlineStatusL(indexInTabbedView);
+
+	if( status == TVIMPSTEnums::EOffline )
+	    {
+	    TBool isConvExist = arrayProcess.IsConversationExistL( aContactId );
+	    
+	    if( !isConvExist)
+		    {
+		
+			HBufC* msg = StringLoader::LoadLC( R_QTN_CHAT_CONTACT_MAY_NOT_RECEIVE_MESSAGE,
+										        aContactId );                    
+
+			 result = VIMPSTUtilsDialog::DisplayQueryDialogL(
+			        R_CHAT_CONTACT_MAY_NOT_RECEIVE_MESSAGE_DIALOG,
+			        msg->Des() );
+			CleanupStack::PopAndDestroy( msg );
+		    }
+	    }
+
+	if( ( result == EAknSoftkeyOk ) || ( result == EAknSoftkeyYes ) )
+		{
+		TVwsViewId activeViewId;
+	    CCoeEnv::Static()->AppUi()->GetActiveViewId( activeViewId );
+	    TPtrC itemName = arrayProcess.GetItemNameText(indexInTabbedView) ;
+	    // not own this p
+	    MVPbkContactLink* contactLink = arrayProcess.ContactLink( indexInTabbedView );
+		arrayProcess.ResetPendingMsg( indexInTabbedView );
+		// imlauncher call for luanching the conversationview with seletced contact
+		//IMCVLauncher::LaunchImConversationViewL(activeViewId, iServiceId, aContactId );	
+		// imlauncher call for luanching the conversationview with seletced user id
+		IMCVLauncher::LaunchImConversationViewL(activeViewId, iServiceId, aContactId, itemName, contactLink);
+		}
+	}
+
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::SizeChanged()
+// Called by framework
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::SizeChanged()
+	{
+	if ( iListBox )
+        {
+        iListBox->SetRect(Rect());
+        }  
+    }
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::CountComponentControls()
+// Returns number of controls
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TInt CVIMPSTUiSearchViewControl::CountComponentControls() const
+	{
+	//Only one compound control so returning 1
+	return 1;
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::ComponentControl( TInt aIndex )
+// Returns control for given index
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CCoeControl* CVIMPSTUiSearchViewControl::ComponentControl( TInt aIndex ) const
+	{
+	if( aIndex == 0 )
+		{
+        return iListBox;
+        }
+    else
+        {
+        return NULL;
+    	}
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::OfferKeyEventL()
+// Handles user key inputs
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TKeyResponse CVIMPSTUiSearchViewControl::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+													TEventCode aType )
+	{
+	TKeyResponse result = EKeyWasNotConsumed;
+
+    // Offer key event first to the key event handler
+    if ( iKeyEventHandler && iKeyEventHandler->Pbk2ProcessKeyEventL
+            ( aKeyEvent, aType ) )
+        {
+        result = EKeyWasConsumed;
+        }
+        
+    switch ( aKeyEvent.iCode )
+           {
+         /*  case EKeyEnter:
+				{
+				iSearchView.HandleCommandL(iCurrentCmdToExe);
+				result = EKeyWasConsumed;
+				break;
+				}*/
+			default:
+				break;
+           }
+        
+    // Not consumed by the key handler, offer to the control next
+    if ( result == EKeyWasNotConsumed )
+        {
+        if ( iListBox )
+            {
+            result = iListBox->OfferKeyEventL(aKeyEvent, aType);
+            }
+        }
+    UpdateCbaL();
+    return result;
+    
+	}
+
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::UpdateListBoxL()
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::UpdateListBoxL(RArray<TVIMPSTSearchData> aSerachData)
+    {
+	
+	TInt granularity( iItemArray->Count() );
+	++granularity;
+	
+   	CDesCArray* tempArray = new ( ELeave ) CDesCArrayFlat( granularity );
+	CleanupStack::PushL( tempArray );
+    
+    iListBox->Model()->SetItemTextArray( tempArray );
+	iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+	iListBox->HandleItemAdditionL();
+	for ( TInt i =0; i < aSerachData.Count() ; ++ i)
+	    {
+	    TVIMPSTSearchData data = aSerachData [i];
+	    HBufC* itemText = HBufC::NewLC( 100 );
+	    TPtr itemTextPtr( itemText->Des() );
+
+	    itemTextPtr.Append( KTab );
+
+	    itemTextPtr.Append( VIMPSTUtils::DisplayId( data.iEmailId ));
+	    itemTextPtr.Append( KTab );
+
+	    itemTextPtr.Append(data.iEmailId);
+	    itemTextPtr.Append( KTab );
+
+	    iItemArray->AppendL( itemTextPtr );
+	    CleanupStack::PopAndDestroy( itemText );
+	    }
+    
+	CleanupStack::PopAndDestroy(tempArray );  // tempArray
+	
+	
+	iListBox->Model()->SetItemTextArray( iItemArray );
+	iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+    iListBox->HandleItemAdditionL();
+    
+	if ( iItemArray->MdcaCount() > 0 )
+		{
+		iListBox->SetCurrentItemIndexAndDraw( 0 );
+		}
+		
+    iListBox->UpdateScrollBarsL();
+    
+    UpdateCbaL();
+       
+    }
+    
+    
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::ListBox()
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CEikListBox* CVIMPSTUiSearchViewControl::ListBox() const
+	{
+	return iListBox;
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::GetFocusedItemText
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+HBufC* CVIMPSTUiSearchViewControl::GetFocusedContactLC() const
+	{
+	HBufC* retText=NULL;
+	TInt curIndex = iListBox->CurrentItemIndex();
+    TPtrC ptr= iItemArray->MdcaPoint(curIndex);
+    ptr.Set(ptr.Mid(1));  // set pointer from next char :since first char is KTab
+    
+    TInt pos=ptr.FindC(KTab);
+   
+    if( pos !=KErrNotFound &&  (pos != ptr.Length()-1))
+      {
+      ptr.Set(ptr.Mid( pos+1, ( ptr.Length()-2-pos )));
+      retText = ptr.AllocLC();
+      }
+    return retText;
+	}
+
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::ClearListBoxContents()
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::ClearListBoxContents()
+    {
+	iItemArray->Reset();
+    TRAPD( err, iListBox->HandleItemRemovalL() );
+    if( err != KErrNone )
+        {
+        CActiveScheduler::Current()->Error( err );
+        }
+    iListBox->DrawNow();
+    }
+// ---------------------------------------------------------
+// CVIMPSTUiSearchViewControl::UpdateCbaL()
+// Updates Softkeys according to current focus.
+// ---------------------------------------------------------
+//
+void CVIMPSTUiSearchViewControl::UpdateCbaL( TBool  aUseDefaultCba /*= EFalse*/ )
+    {
+    TInt cbaRes = R_SERVTAB_SOFTKEYS_OPTIONS_BACK__EMPTY;
+    iCurrentCmdToExe = -1;
+    TInt index = KErrNotFound;
+    if ( !iCba ) 
+        {
+        iCba = CEikButtonGroupContainer::Current();
+        }
+    if( iListBox )
+	    {
+	    index = iListBox->CurrentItemIndex();	
+	    }
+    if( aUseDefaultCba )  
+	    {
+	    cbaRes = R_SERVTAB_SOFTKEYS_OPTIONS_BACK__EMPTY;
+	    }
+    else if( KErrNotFound == index )
+		{
+		cbaRes = R_SERVTAB_SOFTKEYS_OPTION_NEW_SEARCH__BACK;
+		iCurrentCmdToExe = ESearchNew;
+		}
+	else //some results are there, hence update it to add to contacts.
+		{
+		if(iSearchView.HideAddToContactsL())
+		    {			
+		    CHAT_DP( D_CHAT_LIT("CVIMPSTUiDoubleListboxArray::HideAddToContactsL after" ) );		
+		    HBufC* contactId = GetFocusedContactLC();
+		    TInt curIndex = iCommandHandler.GetProcessInterface().FindContactIndexL(*contactId); 
+		    TVIMPSTEnums::TOnlineStatus onlinestatus = iCommandHandler.GetProcessInterface().GetOnlineStatusL(curIndex);   
+		    CleanupStack::PopAndDestroy(contactId);
+		    if( TVIMPSTEnums::EPending == onlinestatus )
+		        {
+		        CHAT_DP( D_CHAT_LIT("CVIMPSTUiDoubleListboxArray::EPending in" ) );		
+		        cbaRes = R_SERVTAB_SOFTKEYS_OPTIONS_BACK__EMPTY;
+		        iCurrentCmdToExe = -1;    
+		        }
+		    else
+		        {
+		        CHAT_DP( D_CHAT_LIT("CVIMPSTUiDoubleListboxArray::ESearchOpenConversation" ) );		
+		        cbaRes = R_SERVTAB_SOFTKEYS_OPTION_SEARCH_OPENCONV__BACK;
+		        iCurrentCmdToExe = ESearchOpenConversation;    
+		        }
+
+		    }
+		else
+			{
+			cbaRes = R_SERVTAB_SOFTKEYS_OPTION_ADD_TO_CONTACTS__BACK;	
+			iCurrentCmdToExe = ESearchAddFriends;
+			}   
+        }
+  	if( iCba )
+        {
+        iCba->SetCommandSetL( cbaRes );
+     	iCba->DrawNow();
+        }
+    }
+
+//  End of File