diff -r 000000000000 -r 5e5d6b214f4f uiservicetab/vimpstui/src/cvimpstuisearchviewcontrol.cpp --- /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 + + +// system include +#include +#include +#include +#include +#include + +// Pbk2 +#include +#include + + + +// ================= 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 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 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