diff -r 000000000000 -r 5e5d6b214f4f uiservicetab/vimpstui/src/cvimpstuisearchview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstui/src/cvimpstuisearchview.cpp Tue Feb 02 10:12:18 2010 +0200 @@ -0,0 +1,724 @@ +/* +* 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 CVIMPSTUiSearchView. +* +*/ + + +// INCLUDE FILES + +#include "cvimpstuisearchview.h" +#include "cvimpstuisearchviewcontrol.h" + +#include "cvimpstuisearchfieldaray.h" +#include "cvimpstuisearchquerydialog.h" + +#include "cvimpstcmdhandler.h" +#include "vimpstcmd.hrh" + +#include "mvimpstengine.h" +#include "vimpstextentionuiuid.h" +#include "tvimpstconsts.h" +#include "cvimpstuiextensionservice.h" +#include "vimpstutilsdialog.h" +#include "vimpstcmd.hrh" +#include "mvimpstcmd.h" +#include "vimpstutilswaitnote.h" +#include "vimpstui.hrh" +#include "tvimpstconsts.h" + +#include "mvimpstengineextentionfeatures.h" +#include "mvimpstenginesearchmgrextention.h" + +#include "cvimpstuistatuspanehandler.h" +// System includes +#include +#include +#include +#include +#include +#include + +// Pbk2 +#include +#include +#include +#include +#include +#include +#include + +// xSP extension manager +#include "MxSPViewMapper.h" +#include "MxSPContactManager.h" + +//resource +#include +#include + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// help launch +#include +#include +#include "meco.hlp.hrh" +using namespace Phonebook2; + +// ================= MEMBER FUNCTIONS ======================= + +// -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::CVIMPSTUiSearchView +// -------------------------------------------------------------------------- +// +CVIMPSTUiSearchView::CVIMPSTUiSearchView( + MxSPViewMapper& aMapper, + MxSPContactManager& aContactManager, + TUint aSearchViewId, + TUint aServiceId, + CPbk2UIExtensionView& aView, + TUid /*aId*/, + CVIMPSTUIExtensionService& aServiceData, + MVIMPSTEngine& aEngine, + MVIMPSTCmdHandler& aCommandHandler ) : + CxSPBaseView( aMapper, aContactManager, aView ), + iSearchViewId( aSearchViewId ), + iServiceId(aServiceId), + iEngine(aEngine), + iExtensionService( aServiceData ), + iCommandHandler( aCommandHandler ) + + { + + } + +// -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::ConstructL +// -------------------------------------------------------------------------- +// +void CVIMPSTUiSearchView::ConstructL() + { + ViewBaseConstructL( KIMCONTACTSEXTNIMPLEMENTATIONUID, iSearchViewId ); + + //Get SearchMgr + MVIMPSTEngineExtentionFeatures* feature = iEngine.ExtentionFeatures(TVIMPSTEnums::ESearch); + if (feature) + { + MVIMPSTEngineSearchMgrExtention& searchMgr = + MVIMPSTEngineSearchMgrExtention::Cast + (*feature); + + searchMgr.RegisterObserver(this); + } + iCallBack = new ( ELeave ) CAsyncCallBack( CActive::EPriorityHigh ); + } + + +// -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::NewL +// -------------------------------------------------------------------------- +// +CVIMPSTUiSearchView* CVIMPSTUiSearchView::NewL( MxSPViewMapper& aMapper, + MxSPContactManager& aContactManager, + TUint aSearchViewId, + TUint aServiceId, + CPbk2UIExtensionView& aView, + TUid aId, + CVIMPSTUIExtensionService& aServiceData, + MVIMPSTEngine& aEngine, + MVIMPSTCmdHandler& aCommandHandler ) + { + CVIMPSTUiSearchView* self = new(ELeave) CVIMPSTUiSearchView( aMapper, + aContactManager, + aSearchViewId, + aServiceId, + aView, + aId, + aServiceData, + aEngine, + aCommandHandler); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::~CVIMPSTUiSearchView() +// C++ Destructor +// --------------------------------------------------------- +// +CVIMPSTUiSearchView::~CVIMPSTUiSearchView() + { + + //Get SearchMgr + MVIMPSTEngineExtentionFeatures* feature = iEngine.ExtentionFeatures(TVIMPSTEnums::ESearch); + if (feature) + { + MVIMPSTEngineSearchMgrExtention& searchMgr = + MVIMPSTEngineSearchMgrExtention::Cast + (*feature); + + searchMgr.UnRegisterObserver(this); + } + + delete iNaviDecorator; + if (iContainer) + { + CCoeEnv::Static()->AppUi()->RemoveFromStack(iContainer); + delete iContainer; + } + delete iCallBack; + } + + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::HandleCommandL( TInt aCommand ) +// This class handles all commands from menu +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::HandleCommandL( TInt aCommand ) + { + + switch ( aCommand ) + { + //Next two commands have same function + case EAknSoftkeyBack: + { + + // this might get called when the view is not active + // back key pressed, activate tabbed view. + // CPbk2ViewState is not utilized here, but here the + // focused contact info could be delivered to next view, if required later + CPbk2ViewState* state = NULL; + + TInt tabViewId; + TInt err = iMapper.GetNewView( KIMCONTACTSEXTNIMPLEMENTATIONUID, + iExtensionService.TabbedViewId(), + tabViewId ); + User::LeaveIfError( err ); + Pbk2AppUi()->Pbk2ViewExplorer()->ActivatePhonebook2ViewL( + TUid::Uid(tabViewId), + state ); + + break; + } + + case ESearchNew: + { + SearchContactsL(); + break; + } + case ESearchPrev: + { + CAknInformationNote* informationNote = new (ELeave) CAknInformationNote; + informationNote->ExecuteLD(KNotSupportedMessage); + break; + } + case ESearchMore: + { + CAknInformationNote* informationNote = new (ELeave) CAknInformationNote; + informationNote->ExecuteLD(KNotSupportedMessage); + break; + } + case ESearchAddFriends: + { + + HBufC* userId = iContainer->GetFocusedContactLC() ; + if ( userId->Length() ) + { + CVIMPSTUtilsWaitNote* note = CVIMPSTUtilsWaitNote::ShowWaitNoteLC( R_QTN_SERVTAB_SAVING_CONTACT,ETrue ); + iCommandHandler.HandleCommandL(EAddContact,this,userId); + CleanupStack::PopAndDestroy( note ); + CleanupStack::PopAndDestroy( userId ); + } + + break; + } + + case ESearchOpenConversation: + { + HBufC* userId = iContainer->GetFocusedContactLC() ; + if ( userId->Length() ) + { + iContainer->OpenConversationL( *userId ); + } + CleanupStack::PopAndDestroy( userId ); + break; + } + case EAknCmdHelp: + { + LaunchHelpL( KSERVTAB_HLP_SEARCH ); + break; + } + case EAknSoftkeyExit: + case ECmdExit: + { + Pbk2AppUi()->HandleCommandL( EAknSoftkeyExit ); + break; + } + + default: + { + Pbk2AppUi()->HandleCommandL( aCommand ); + break; + } + + } + } + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::DynInitMenuPaneL() +// Initialises menu pane when needed +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + if( aResourceId == R_EXTENSION_MANAGER_MENU) + { + //add search view menu items + aMenuPane->AddMenuItemsL( R_SERVTAB_SEARCH_VIEW_MENU ); + //add general menu items - help and exit + aMenuPane->AddMenuItemsL( R_TABBED_VIEW_GENERAL_MENU ); + + aMenuPane->SetItemDimmed(ECmdChangeConnectioninWaitingState,ETrue); + aMenuPane->SetItemDimmed(ECmdChangeConnectioninOnlineState,ETrue); + + aMenuPane->SetItemDimmed(ECmdLogin,ETrue); + aMenuPane->SetItemDimmed(ECmdLogout,ETrue); + aMenuPane->SetItemDimmed(ECmdCancelLogin,ETrue); + aMenuPane->SetItemDimmed(ECmdSettings,ETrue); + + aMenuPane->SetItemDimmed(ESearchPrev, ETrue); + aMenuPane->SetItemDimmed(ESearchMore, ETrue); + aMenuPane->SetItemDimmed(ECmdGetBlockedList, ETrue); + TInt index = KErrNotFound; + if(iContainer) + { + index = iContainer->ListBox()->CurrentItemIndex(); + } + if( index == KErrNotFound ) + { + aMenuPane->SetItemDimmed( ESearchAddFriends, ETrue ); + aMenuPane->SetItemDimmed( ESearchOpenConversation, ETrue ); + } + else if( HideAddToContactsL()) //contact is there in his contact list + { + HBufC* contactId = iContainer->GetFocusedContactLC() ; + TVIMPSTEnums::TOnlineStatus onlinestatus = TVIMPSTEnums::EUnknown; + if ( contactId->Length() ) + { + TInt index = iCommandHandler.GetProcessInterface().FindContactIndexL(*contactId); + onlinestatus = iCommandHandler.GetProcessInterface().GetOnlineStatusL(index); + CleanupStack::PopAndDestroy(contactId); + } + if( TVIMPSTEnums::EPending == onlinestatus )//contacts pr status is pending hide open convrsation + { + aMenuPane->SetItemDimmed( ESearchOpenConversation, ETrue ); + } + aMenuPane->SetItemDimmed( ESearchAddFriends, ETrue ); + + } + + else //contact is not there in his contactlist + { + aMenuPane->SetItemDimmed( ESearchOpenConversation, ETrue ); + } + + } + } + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::DoActivateViewL() +// Activates view +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::DoActivateViewL( const TVwsViewId& aPrevViewId, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/ ) + { + // the title pane is set to " Basic Search" + // which is same as Search Form s title pane text + + HBufC* titleText = StringLoader::LoadLC( R_QTN_SERVTAB_SEARCH_BASIC ); + + //to set the icon ( context pane image) as in tabbed view + MPbk2ViewActivationTransaction* viewActivationTransaction = + Pbk2AppUi()->Pbk2ViewExplorer()->HandleViewActivationLC( + iView.Id(), + aPrevViewId, + titleText, + NULL, + EUpdateAll ); + + + // Notifies startup monitor of view activation + if( Pbk2AppUi()->Pbk2StartupMonitor() ) + { + Pbk2AppUi()->Pbk2StartupMonitor()-> + NotifyViewActivationL( iView.Id() ); + } + + if (!iContainer) + { + iContainer = CVIMPSTUiSearchViewControl::NewL( + &iView, iServiceId, + iEngine, iCommandHandler, *this ); + CCoeEnv::Static()->AppUi()->AddToStackL( iView, iContainer ); + iContainer->SetMopParent( &iView ); + iContainer->SetSearchingTextToListboxL(); + iContainer->SetRect( iView.ClientRect() ); + iContainer->ActivateL(); + } + + // Commit application-wide state changes + viewActivationTransaction->Commit(); + CleanupStack::PopAndDestroy(2); //viewActivationTransaction ,titleText + + // Change the navigation pane from tabs to text label + UpdateNaviPaneTextL(); + + // this is initiated from tabbed view ; hence call search functionality + if (!iSearchInitiated) + { + // search is called using CAsynCallBack + iCallBack->Set(TCallBack( SearchCallbackL , this)); + iCallBack->CallBack(); + } + + + } + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::DoDeactivate() +// Deactivates the view +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::DoDeactivate() + { + // set this flag to Efalse because user cant initiate a search from search view + iSearchInitiated = EFalse; + if (iContainer) + { + CCoeEnv::Static()->AppUi()->RemoveFromStack( iContainer ); + delete iContainer; + iContainer = NULL; + } + } + +// -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::HandleCommandKeyL +// -------------------------------------------------------------------------- +// +TBool CVIMPSTUiSearchView::HandleCommandKeyL(const TKeyEvent& aKeyEvent, TEventCode /*aType*/) + { + TBool result = EFalse; + switch (aKeyEvent.iCode) + { + default: + { + break; + } + } + return result; + } + +// -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::HandleStatusPaneSizeChange +// -------------------------------------------------------------------------- +// +void CVIMPSTUiSearchView::HandleStatusPaneSizeChange() + { + // Resize the container to fill the client rectangle + if (iContainer) + { + iContainer->SetRect( iView.ClientRect() ); + } + } + + + // -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::CommandFinishedL +// -------------------------------------------------------------------------- +// + +void CVIMPSTUiSearchView::CommandFinishedL( + const MVIMPSTCmd& aCommand ) +{ + + //handle the observer for commands issues through HandleCommandL() + + switch (aCommand.CommandId()) + { + + case ESearch: + { + // Search command is complete + //use aCommand.Result() to get the data + //Ownership is not given to the caller + //some error occured. + if(iWaitNote) + { + delete iWaitNote; + iWaitNote = NULL; + } + if(aCommand.Result() != KErrNone) + { + HBufC* prompt = NULL; + prompt = StringLoader::LoadLC(R_IM_ERROR_SERVICE_ERR ); + TInt ret( VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) ); + CleanupStack::PopAndDestroy(prompt); + } + break; + } + case EAddContact: + { + //addcontact command is complete + //use aCommand.Result() to get the data + //Ownership is not given to the caller + //some error occured. + if(aCommand.Result() != KErrNone) + { + HBufC* prompt = StringLoader::LoadLC( R_QTN_SERVTAB_SAVING_CONTACT_FAILED ); + VIMPSTUtilsDialog::DisplayErrorNoteL( *prompt ) ; + CleanupStack::PopAndDestroy(prompt); + } + + break; + } + default: + { + //should never be here. + break; + } + } + } + +// -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::HandleCommandEventL +// -------------------------------------------------------------------------- +// +void CVIMPSTUiSearchView::HandleCommandEventL(TVIMPSTEnums::TVIMPSTRegistrationState /*aState*/, TInt /*aServiceError*/) + { + + } +// --------------------------------------------------------- +// CVIMPSTUiSearchView::ShowAddToContactsL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CVIMPSTUiSearchView::HideAddToContactsL() const + { + TBool hide(ETrue); + TInt curIndex = iContainer->ListBox()->CurrentItemIndex(); + if( curIndex >=0) + { + HBufC* contactId = iContainer->GetFocusedContactLC() ; + if ( contactId->Length() ) + { + hide = iCommandHandler.GetProcessInterface().FindAnyContact( *contactId ); + CleanupStack::PopAndDestroy( contactId ); + } + + } + return hide; + } + +// -------------------------------------------------------------------------- +// CVIMPSTUiSearchView::SearchContactsL +// -------------------------------------------------------------------------- +// +void CVIMPSTUiSearchView:: SearchContactsL() + { + if( iContainer ) + { + iContainer->UpdateCbaL( ETrue ); + } + + CVIMPSTUiSearchFieldArray& fieldArray = iExtensionService.GetSearchFieldArray(); + + if( !fieldArray.Count() ) + { + return; + } + + CVIMPSTUiSearchQueryDialog* querydialog = CVIMPSTUiSearchQueryDialog::NewL( fieldArray ); + + querydialog->ExecuteLD(); + + if (querydialog) + { + iEndKeyPressed = querydialog->IsEndKeyPressed(); + } + + // we have to set the title pane with " Search results " string + CCVIMPSTUiStatusPaneHandler* StatusPaneHandler = CCVIMPSTUiStatusPaneHandler::NewL(); + CleanupStack::PushL( StatusPaneHandler); + HBufC* titleText = StringLoader::LoadLC( R_QTN_SERVTAB_SEARCH_RESULTS ); + StatusPaneHandler->SetTextL(*titleText); + CleanupStack::PopAndDestroy( 2 ); // + + + if( !fieldArray.AreAllUiFieldsEmpty() ) + { + // make this flag as True + // from now search is initiated from search view + iSearchInitiated = ETrue; + + // if any field is entered + // launch the search view + HBufC* firstDataBuf = fieldArray.GetFirstEnteredFieldDataL().AllocLC(); + TPtr searchStrPtr( firstDataBuf->Des() ); + + iExtensionService.SetSearchStringL( searchStrPtr ); + UpdateNaviPaneTextL(); + if ( iContainer->ListBox()->Model()->NumberOfItems() > 0 ) + { + iContainer->ClearListBoxContents(); + } + // set the empty string blank + iContainer->SetSearchingTextToListboxL(); + + HBufC* searchWaitNoteText = StringLoader::LoadLC( R_QTN_SERVTAB_SEARCHING , searchStrPtr, CCoeEnv::Static() ); + iWaitNote = CVIMPSTUtilsWaitNote::ShowWaitNoteL( *searchWaitNoteText, EFalse , ETrue ); + CleanupStack::PopAndDestroy(searchWaitNoteText); + //searchWaitNoteText + RArray keyDataArray; + fieldArray.GetSearchKeyDataL( keyDataArray ); + + iCommandHandler.HandleCommandL(ESearch, this, &keyDataArray ); + CleanupStack::PopAndDestroy(); // firstDataBuf + + } + + // if the serach is initiated from tabbed view and User cancels the search + // return to Tabbed view + if ( !iSearchInitiated && !iEndKeyPressed) + { + // return to tabbed view + CPbk2ViewState* state = NULL; + + TInt tabViewId; + TInt err = iMapper.GetNewView( KIMCONTACTSEXTNIMPLEMENTATIONUID, + iExtensionService.TabbedViewId(), + tabViewId ); + User::LeaveIfError( err ); + Pbk2AppUi()->Pbk2ViewExplorer()->ActivatePhonebook2ViewL( + TUid::Uid(tabViewId), + state ); + } + } + + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::UpdateNaviPaneTextL() +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::UpdateNaviPaneTextL( ) + { + // Change the navigation pane from tabs to text label + CEikStatusPane* sp = CEikonEnv::Static()->AppUiFactory()->StatusPane(); + CAknNavigationControlContainer* np = + static_cast( + sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); + delete iNaviDecorator; + iNaviDecorator = NULL; + //fix for disableing navigation search string text, makeing it null + iNaviDecorator = np->CreateNavigationLabelL( _L(" ") ); + //previous code commented for reference + //iNaviDecorator = np->CreateNavigationLabelL( iExtensionService.SearchString() ); + + np->PushL( *iNaviDecorator ); + sp->DrawNow(); + } + + // --------------------------------------------------------- +// CVIMPSTUiSearchView::HandleSearchResultL() +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::HandleSearchResultL(RArray aSearchData ) + { + if( iContainer ) + { + iContainer->SearchResultL( aSearchData ); + } + } + + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::HandleSearchFinishedL() +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::HandleSearchFinishedL(TInt aError) + { + // if any error show error note + if( iContainer ) + { + iContainer->SearchFinishedL(aError); + } + } + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::HandleSearchKeysEventL() +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::HandleSearchKeysEventL( RArray& /*aEnumKeysArray*/, RPointerArray& /*aLebelKeysArray*/ ) + { + // do nothing here + } +// --------------------------------------------------------- +// CVIMPSTUiSearchView::LaunchHelpL() +// Function launches help application using the HlpLauncher. +// @params: Reference to a descriptor, serves as context. +// --------------------------------------------------------- +// +void CVIMPSTUiSearchView::LaunchHelpL( const TDesC& aContext ) + { + CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( KHelpContextSize ); + CleanupStack::PushL( cntx ); + + TUid KHelpUid = { KHELPUID }; + cntx->AppendL( TCoeHelpContext( KHelpUid, aContext ) ); + CleanupStack::Pop( cntx ); + + //and launch help - takes ownership of context array + HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), cntx ); + } + +// --------------------------------------------------------- +// CVIMPSTUiSearchView::SearchCallbackL() +// --------------------------------------------------------- +// +TInt CVIMPSTUiSearchView::SearchCallbackL(TAny* aInstance) + { + static_cast (aInstance)->SearchContactsL(); + return 0; // ignored by CAsychCallBack + } + +// End of File