diff -r 000000000000 -r eb1f2e154e89 fep/aknfep/src/aknfepuserdbdlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fep/aknfep/src/aknfepuserdbdlg.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,1089 @@ +/* +* Copyright (c) 2007-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: Implement method in dialog for user DB management +* +*/ + + + + + + + + + + + + +#include // CAknSingleStyleListBox +#include // TResource Reader +#include // CColumnListBoxData +#include //CAknSearchField +#include //CAknTextQueryDialog +#include //AknSelectionService , CAknFilteredTextListBoxModel +#include //StringLoader +#include //CAknWarningNote +#include //CAknProgressDialog +#include //CAknDialog +#include //CAknContextPane +#include //CAknWaitDialog +#include //CAknProgressDialog +#include //CEikProgressInfo +#include //CEikButtonGroupContainer +#include +#include //CCnvCharacterSetConverter +#include //RFs +#include //CEikEdwin +#include //CAknTitlePane +#include +#include "AknFep.hrh" +#include "aknfepuserdbdlg.h" +#include "dbmanagement.h" +#include "AknFepManagerUIInterface.h" +#include "AknFepManager.h" +#include "aknfepuserdbquerydlg.h" + +const TInt KListBoxItemMaxLength = 8; +const TInt KErrMsgMaxLength = 60; +const TInt KFindBoxInputMaxLength = 7; +const TInt KCDesCArraySize = 1; +_LIT( KItemStart, "\t" ); +_LIT( KSearchTextEmpty, "" ); + +CAknFepUserdbDlg::CAknFepUserdbDlg( + TInt &aValue, CArrayFix< TInt> *aSelectedItems, MDesCArray *aArray, + CPtiEngine* aPtiEngine, CAknFepManager* aOwner, MEikCommandObserver *aObserver) : + CAknMarkableListDialog( aValue, aSelectedItems, aArray, aObserver ), + iPtiEngine( aPtiEngine ), + iOwner( aOwner ), + iOldIndex( 0 ), + iOldLanguage( 0 ), + iOldCbaRes( 0 ) + { + // No implementation required + } + +CAknFepUserdbDlg::~CAknFepUserdbDlg() + { + delete iDBEngine; + iDBEngine = NULL; + iPtiEngine = NULL; + iOwner = NULL; + iQueryDlg = NULL; + if ( iEikonEnv && iContextMenuBar ) + { + iEikonEnv->EikAppUi()->RemoveFromStack( iContextMenuBar ); + delete iContextMenuBar; + } + } + +CAknFepUserdbDlg* CAknFepUserdbDlg::NewL( + TInt &aOpenedItem, CArrayFix< TInt> *aSelectedItems, MDesCArray *aArray, + TInt aMenuBarResourceId, CPtiEngine* aPtiEngine, CAknFepManager* aOwner, + MEikCommandObserver *aObserver ) + { + CAknFepUserdbDlg* self = new( ELeave ) CAknFepUserdbDlg( aOpenedItem, + aSelectedItems, aArray, aPtiEngine, aOwner, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aMenuBarResourceId ); + CleanupStack::Pop( self ); // self; + return self; + } + +void CAknFepUserdbDlg::ConstructL( TInt aMenuBarResourceId ) + { + CAknSelectionListDialog::ConstructL( aMenuBarResourceId ); + this->PrepareLC( R_AKNFEP_LISTDLG_DIALOG ); + HBufC* message = StringLoader::LoadLC( R_AKNFEP_USER_DB_LIST_NO_ITEM_TEXT ); + ListBox()->View()->SetListEmptyTextL( *message ); + ConstructContextMenuL(); + + //the DB engine init + iDBEngine = CDBManagement::NewL( iOwner ); + CleanupStack::PopAndDestroy( message ); //message + } + +TBool CAknFepUserdbDlg::InitListBoxItemL() + { + iItems = new( ELeave ) CDesCArrayFlat( KCDesCArraySize ); + + TBuf errMsg; + + //get the phrases from the DB + if ( !iDBEngine->GetPhraseFromDBL( *iItems ) ) + { + iDBEngine->GetErrMsg( errMsg ); + //note fot err message + CAknWarningNote* note = new( ELeave ) CAknWarningNote(); + note->SetTone( CAknNoteDialog::EWarningTone ); + note->ExecuteLD( errMsg ); + } + else + { + InsertIconL( iItems ); + } + CAknSingleStyleListBox* listBox= + static_cast( Control( ESelectionListControl ) ); + CTextListBoxModel* model = listBox->Model(); + if ( iItems && iItems->Count() != 0 ) + { + model->SetItemTextArray( iItems ); + model->SetOwnershipType( ELbmOwnsItemArray ); + ListBox()->HandleItemAdditionL(); + return ETrue; + } + else + { + model->SetItemTextArray( iItems ); + model->SetOwnershipType( ELbmOwnsItemArray ); + return EFalse; + } + } + +void CAknFepUserdbDlg::AddItemL() + { + CAknSingleStyleListBox* listbox = + static_cast( Control( ESelectionListControl ) ); + // New item text + TBuf itemText; + TBuf errMsg; + if ( FindBox()->TextLength() != 0 ) + { + FindBox()->GetSearchText( itemText ); + } + FindBox()->SetFocus( EFalse ); + HBufC* prompt = StringLoader::LoadLC( R_AKNFEP_USER_DB_LIST_ADD_ITEM_TEXT ); + CAknFepUserDBQueryDlg* dialog = + CAknFepUserDBQueryDlg::NewL( iDBEngine, itemText, *prompt ); + iQueryDlg = dialog; + CleanupStack::PopAndDestroy( prompt ); + //Execute dialog, + //In the dialog it will check input and show waring not + if ( dialog->ExecuteLD( R_AKNFEP_LISTBOX_DATA_QUERY_DIALOG ) ) + { + TInt currentIndex = 0; + CAknFilteredTextListBoxModel* model = + static_cast( ListBox()->Model() ); + CDesCArray* itemArray = + static_cast( model->ItemTextArray() ); + + //Add '\t' at the beginning of itemText for find + itemText.Insert( 0, KItemStart() ); + // + TInt ret = itemArray->Find( itemText, currentIndex, ECmpCollated); + if ( ret != 0 ) + { + //add the phrase to db + itemText.Trim(); + if ( !iDBEngine->AddPhraseToDB( itemText ) ) + { + iDBEngine->GetErrMsg( errMsg ); + //note fot err message + CAknWarningNote* note = new( ELeave ) CAknWarningNote(); + note->SetTone( CAknNoteDialog::EWarningTone ); + note->ExecuteLD( errMsg ); + // add by chen + return; + } + // Add '\t' in front of text + itemText.Insert( 0, KItemStart() ); + // Insert item to the item array + if ( itemArray->Count() > 0 ) + { + itemArray->InsertL( currentIndex, itemText ); + } + else + { + itemArray->InsertL( 0, itemText ); + } + // Update the listbox + listbox->HandleItemAdditionL(); + itemArray->Sort(ECmpCollated); + + FindBox()->SetSearchTextL( KSearchTextEmpty ); + ResetSearchFieldL(); + model->Filter()->HandleItemArrayChangeL(); + + //Highlight the item you have just edited + itemArray->Find( itemText, currentIndex, ECmpCollated ); + listbox->SetCurrentItemIndexAndDraw( currentIndex ); + + } + else + { + FindBox()->SetSearchTextL( KSearchTextEmpty ); + ResetSearchFieldL(); + listbox->SetCurrentItemIndexAndDraw( currentIndex ); + } + + model->Filter()->UpdateCachedDataL(); + UpdateListBoxL(); + } + } + +void CAknFepUserdbDlg::RemoveItemL() + { + //error message + TBuf errMsg; + TBuf removePhrase; + TInt oldIndex = ListBox()->View()->CurrentItemIndex(); + CAknFilteredTextListBoxModel* model = + static_cast( ListBox()->Model() ); + CDesCArrayFlat* item = + static_cast( model->ItemTextArray() ); + model->Filter()->UpdateSelectionIndexesL(); + TInt markItems = model->Filter()->SelectionIndexes()->Count(); + if ( markItems ) + { + HBufC * message = StringLoader::LoadLC( + R_AKNFEP_DELETE_CONFIRMATION_TEXT, markItems, + iEikonEnv ); //message + CAknQueryDialog* delsomenote = + CAknQueryDialog::NewL( CAknQueryDialog::EConfirmationTone ); + delsomenote->SetPromptL( *message ); + if ( delsomenote->ExecuteLD( R_AKNFEP_DELETE_QUERY_DIALOG ) ) + { + iProgressDialog = new (ELeave) CAknProgressDialog( + ( REINTERPRET_CAST( CEikDialog**, &iProgressDialog ) ), ETrue ); + iProgressDialog->PrepareLC( R_AKNFEP_WAIT_DIALOG ); + iProgressInfo = iProgressDialog->GetProgressInfoL(); + iProgressInfo->SetFinalValue( markItems ); + iProgressDialog->RunLD(); + CArrayFix* selectionArray = new( ELeave ) CArrayFixFlat( markItems ); + CleanupStack::PushL( selectionArray ); //message, selectionArray + //loop for copy selection index + for ( TInt idx = markItems; idx > 0; idx-- ) + { + selectionArray->AppendL( model->Filter()->SelectionIndexes()->At( idx-1 ) ); + } + TKeyArrayFix* key= new (ELeave) TKeyArrayFix(0, ECmpTInt); + CleanupStack::PushL( key ); //message, selectionArray, key + //sort selection array + selectionArray->Sort( *key ); + CleanupStack::PopAndDestroy( key ); //message, selectionArray + // loop throught the selected item indexes, and delete items + for ( TInt idx = markItems; idx > 0; idx-- ) + { + // get the index of the selected item + TInt itemIndex = selectionArray->At( idx-1 ); + //romve the phrase form the db + removePhrase.Copy( item->MdcaPoint( itemIndex ) ); + removePhrase.Trim(); + if( !iDBEngine->RemovePhraseFromDB( removePhrase ) ) + { + iDBEngine->GetErrMsg( errMsg ); + iProgressDialog->ProcessFinishedL(); + iProgressDialog = NULL; + CleanupStack::PopAndDestroy( selectionArray ); //message + CleanupStack::PopAndDestroy( message );// + //note fot err message + CAknWarningNote* errnote = new( ELeave ) CAknWarningNote(); + errnote->SetTone( CAknNoteDialog::EWarningTone ); + errnote->ExecuteLD( errMsg ); + return; + } + iProgressInfo->IncrementAndDraw(1); + //delte the item + item->Delete( itemIndex ); + } + CleanupStack::PopAndDestroy( selectionArray ); //message + iProgressDialog->ProcessFinishedL(); + iProgressDialog = NULL; + + // Update the listbox + ResetSearchFieldL(); + ListBox()->HandleItemRemovalL(); + model->Filter()->HandleItemArrayChangeL(); + model->Filter()->SelectionIndexes()->Reset(); + ListBox()->View()->ClearSelection(); + } + CleanupStack::PopAndDestroy( message );// + } + else + { + HBufC * message = StringLoader::LoadLC( + R_AKNFEP_DELETE_CONFIRMATION_TEXT, 1, + iEikonEnv ); + CAknQueryDialog* delonenote = + CAknQueryDialog::NewL( CAknQueryDialog::EConfirmationTone ); + delonenote->SetPromptL( *message ); + if ( delonenote->ExecuteLD( R_AKNFEP_DELETE_QUERY_DIALOG ) ) + { + //remove from db + removePhrase.Copy( model->ItemText( ListBox()->CurrentItemIndex() ) ); + removePhrase.Delete( 0, 1 ); + if( !iDBEngine->RemovePhraseFromDB( removePhrase ) ) + { + iDBEngine->GetErrMsg( errMsg ); + //note fot err message + CAknWarningNote* errnote = new( ELeave ) CAknWarningNote(); + errnote->ExecuteLD( errMsg ); + CleanupStack::PopAndDestroy( message ); + return; + } + TInt itemIndex = ListBox()->View()->CurrentItemIndex(); + //get the actual index of list + TInt actualIndex = FindActualIndex( itemIndex ); + // Remove highlighted item from the listbox. + item->Delete( actualIndex ); + // Update the listbox + ResetSearchFieldL(); + } + CleanupStack::PopAndDestroy( message ); + } + // If focused item is out of range, bring it forth + if ( ( ( item->Count()-1 ) >= 0 ) && FindBox()->TextLength() == 0 ) + { + if ( ( oldIndex > ( item->Count()-1 ) )) + { + ListBox()->SetCurrentItemIndexAndDraw( item->Count()-1 ); + } + else + { + ListBox()->SetCurrentItemIndexAndDraw( oldIndex ); + } + } + UpdateListBoxL(); + } + +void CAknFepUserdbDlg::EditItemL() + { + CAknSingleStyleListBox* listbox = + static_cast( Control( ESelectionListControl ) ); + + // If we don't have items, do nothing and return + if ( listbox->Model()->NumberOfItems() < 1 ) + { + return; + } + CTextListBoxModel* model = listbox->Model(); + // New item text + TBuf itemText; + TBuf errMsg; + TBuf itemOldText; + itemText.Copy( model->ItemText(listbox->CurrentItemIndex () ) ); + itemText.Trim(); + itemOldText.Copy( model->ItemText( listbox->CurrentItemIndex() ) ); + itemOldText.Trim(); + HBufC* prompt = StringLoader::LoadLC( R_AKNFEP_USER_DB_LIST_EDIT_ITEM_TEXT ); + CAknFepUserDBQueryDlg* dialog = + CAknFepUserDBQueryDlg::NewL( iDBEngine, itemText, *prompt ); + iQueryDlg = dialog; + CleanupStack::PopAndDestroy( prompt ); + // Execute dialog + if ( dialog->ExecuteLD( R_AKNFEP_LISTBOX_DATA_QUERY_DIALOG ) ) + { + TInt currentIndex = 0; + CDesCArray* itemArray = + static_cast( model->ItemTextArray() ); + + // Add '\t' in front of text for find + itemText.Insert( 0, KItemStart() ); + //Find if the text is exist + TInt ret = itemArray->Find( itemText, currentIndex, ECmpCollated ); + if ( ret != 0 ) + { + //edit the phrase from db + itemText.Trim(); + if(!iDBEngine->EditPhraseFromDB( itemOldText, itemText ) ) + { + iDBEngine->GetErrMsg( errMsg ); + + //note fot err message + CAknWarningNote* note = new( ELeave ) CAknWarningNote(); + note->ExecuteLD( errMsg ); + return; + } + currentIndex = ListBox()->CurrentItemIndex(); + //get the actual index of list + TInt actualIndex = FindActualIndex( currentIndex ); + + // Remove highlighted item from the listbox. + itemArray->Delete( actualIndex ); + + // Add '\t' in front of text + itemText.Insert( 0, KItemStart() ); + + // Insert item to the item array + itemArray->InsertL( actualIndex, itemText ); + + // Update the listbox + listbox->HandleItemAdditionL(); + itemArray->Sort(ECmpCollated); + + if ( FindBox()->TextLength() != 0 ) + { + FindBox()->SetSearchTextL( KSearchTextEmpty ); + ResetSearchFieldL(); + } + + ListBox()->View()->ClearSelection(); + CAknFilteredTextListBoxModel* filterModel = + static_cast( ListBox()->Model() ); + filterModel->Filter()->HandleItemArrayChangeL(); + filterModel->Filter()->UpdateCachedDataL(); + + //SetHightlight + itemArray->Find( itemText, currentIndex, ECmpCollated ); + ListBox()->SetCurrentItemIndexAndDraw( currentIndex ); + } + else + { + //get the actual index of list + TInt actualIndex = FindActualIndex( listbox->CurrentItemIndex() ); + if ( currentIndex != actualIndex ) + { + itemOldText.Copy( model->ItemText( listbox->CurrentItemIndex() ) ); + itemOldText.Trim(); + //Here need user db engine + if( !iDBEngine->RemovePhraseFromDB( itemOldText ) ) + { + iDBEngine->GetErrMsg( errMsg ); + + //note fot err message + CAknWarningNote* note = new( ELeave ) CAknWarningNote(); + note->ExecuteLD( errMsg ); + return; + } + + currentIndex = ListBox()->CurrentItemIndex(); + + //get the actual index of list + actualIndex = FindActualIndex( currentIndex ); + + // Remove highlighted item from the listbox. + itemArray->Delete( actualIndex ); + + listbox->HandleItemRemovalL(); + itemArray->Sort(ECmpCollated); + + if ( FindBox()->TextLength() != 0 ) + { + FindBox()->SetSearchTextL( KSearchTextEmpty ); + ResetSearchFieldL(); + } + + ListBox()->View()->ClearSelection(); + CAknFilteredTextListBoxModel* filterModel = + static_cast( ListBox()->Model() ); + filterModel->Filter()->HandleItemArrayChangeL(); + filterModel->Filter()->UpdateCachedDataL(); + + //SetHightlight + itemArray->Find( itemText, currentIndex, ECmpCollated ); + ListBox()->SetCurrentItemIndexAndDraw( currentIndex ); + } + } + UpdateListBoxL(); + } + } + +void CAknFepUserdbDlg::CmdMarkL( TInt aItemIndex, TBool aMark ) + { + CAknSingleStyleListBox* listbox = + static_cast( Control( ESelectionListControl ) ); + CTextListBoxModel* model = listbox->Model(); + TInt itemCount = model->NumberOfItems(); + CListBoxView* listBoxView = listbox->View(); + if ( aMark ) + { + for ( TInt i = 0; i < itemCount; i++ ) + if ( aItemIndex == -1 || aItemIndex == i ) + listBoxView->SelectItemL( i ); + } + else + { + for ( TInt i = 0; i < itemCount; i++ ) + { + if ( aItemIndex == -1 || aItemIndex == i ) + { + listBoxView->DeselectItem( i ); + } + } + } + CAknFilteredTextListBoxModel* filterModel = + static_cast( ListBox()->Model() ); + filterModel->Filter()->UpdateCachedDataL(); + } + +void CAknFepUserdbDlg::ChangeCurrentCbaL ( TInt aCbaResourceId ) + { + if ( iOwner->IsEntryPhrase() || iOldCbaRes == aCbaResourceId ) + { + return; + } + CEikButtonGroupContainer& cba = ButtonGroupContainer(); + cba.SetCommandSetL( aCbaResourceId ); + cba.AddCommandSetToStackL( aCbaResourceId ); + iOldCbaRes = aCbaResourceId; + cba.DrawNow(); + } + +void CAknFepUserdbDlg::ProcessCommandL( TInt aCommandId ) + { + HideMenu(); + + iContextMenuBar->StopDisplayingMenuBar(); + + switch ( aCommandId ) + { + case EAknCmdUserDBAdd: + { + AddItemL(); + } + break; + case EAknCmdUserDBEdit: + { + EditItemL(); + } + break; + case EAknCmdUserDBDelete: + { + RemoveItemL(); + } + break; + case EAknCmdMark: + case EAknMarkAll: + case EAknCmdUnmark: + case EAknUnmarkAll: + { + AknSelectionService::HandleMarkableListProcessCommandL( aCommandId, ListBox() ); + UpdateListBoxL( aCommandId ); + } + break; + default: + { + break; + } + } + } + +TBool CAknFepUserdbDlg::OkToExitL( TInt aButtonId ) + { + switch ( aButtonId ) + { + case EAknSoftkeyOptions: + { + CAknSelectionListDialog::DisplayMenuL(); // display the menu + } + break; + case EAknCmdUserDBAdd: + { + ProcessCommandL(EAknCmdUserDBAdd); + } + break; + case EAknSoftkeyMark: + { + TInt ItemCount = ListBox()->Model()->NumberOfItems(); + TInt selectedItem = ListBox()->SelectionIndexes()->Count(); + if ( selectedItem < 1 && ItemCount > 0 ) + { + //Show options-context-exit cba + ChangeCurrentCbaL ( R_AKNFEP_SOFTKEYS_LIST_OPTIONS_EXIT_CONTEXT ); + } + } + break; + case EAknSoftkeyUnmark: + { + TInt ItemCount = ListBox()->Model()->NumberOfItems(); + TInt selectedItem = ListBox()->SelectionIndexes()->Count(); + if ( selectedItem == 0 && ItemCount > 0 ) + { + //Show options-context-exit cba + ChangeCurrentCbaL ( R_AKNFEP_SOFTKEYS_LIST_OPTIONS_EXIT_CONTEXT ); + } + } + break; + case EAknSoftkeyContextOptions: + { + TInt items = ListBox()->Model()->NumberOfItems(); + if ( items ) + { + ShowContextMenuL(); + } + } + break; + case EAknCmdMark: + case EAknMarkAll: + case EAknCmdUnmark: + case EAknUnmarkAll: + { + ProcessCommandL( aButtonId ); + } + break; + case EAknSoftkeyExit: + { + return ETrue; + } + default: + { + break; + } + } + + return EFalse; + } + +void CAknFepUserdbDlg::FocusChanged(TDrawNow aDrawNow) + { + if ( aDrawNow == EDrawNow ) + { + if ( ( FindBox()->IsVisible() && !iOwner->IsEntryPhrase()) ) + { + FindBox()->SetFocus( ETrue ); + } + } + } + +void CAknFepUserdbDlg::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) + { + if ( aResourceId == R_AKNFEP_USERDB_DLG_MENU ) + { + const CArrayFix* itemArray = ListBox()->SelectionIndexes(); + if ( itemArray->Count() != 0 ) + { + aMenuPane->SetItemDimmed( EAknCmdUserDBAdd, ETrue ); + aMenuPane->SetItemDimmed( EAknCmdUserDBEdit, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EAknCmdUserDBAdd, EFalse ); + aMenuPane->SetItemDimmed( EAknCmdUserDBEdit, EFalse ); + } + } + if ( aResourceId == R_AKNFEP_MARK_UNMARK_MENUPANE ) + { + TInt currentIndex = ListBox()->CurrentItemIndex(); + TInt selectedItem = ListBox()->SelectionIndexes()->Count(); + TInt listItems = ListBox()->Model()->NumberOfItems(); + + // Display mark, mark all + if ( selectedItem == 0 ) + { + aMenuPane->SetItemDimmed( EAknCmdUnmark, ETrue ); + aMenuPane->SetItemDimmed( EAknUnmarkAll, ETrue ); + return; + } + // Display unmark, unmark all + if ( selectedItem == listItems ) + { + aMenuPane->SetItemDimmed( EAknCmdMark, ETrue ); + aMenuPane->SetItemDimmed( EAknMarkAll, ETrue ); + return; + } + TBool isMarked = EFalse; + + for ( TInt i = 0; i < selectedItem; i++ ) + { + TInt selectedId = ListBox()->SelectionIndexes()->At( i ); + if ( selectedId == currentIndex ) + { + isMarked = ETrue; + } + } + + if ( isMarked ) + { + aMenuPane->SetItemDimmed( EAknCmdMark, ETrue ); + } + else + { + aMenuPane->SetItemDimmed( EAknCmdUnmark, ETrue ); + } + } + } + +TKeyResponse CAknFepUserdbDlg::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse ret(EKeyWasNotConsumed); + + CAknFilteredTextListBoxModel* filterModel = + static_cast( ListBox()->Model() ); + + TInt ItemCount = ListBox()->Model()->NumberOfItems(); + + ListBoxItemsChanged( ListBox() ); + + if ( ret != EKeyWasConsumed && aKeyEvent.iCode == EKeyPhoneEnd ) + { + TryExitL( EAknSoftkeyExit ); + return EKeyWasConsumed; + } + + TBool claerKeyPressed = ( aType == EEventKey ) && ( aKeyEvent.iCode == EKeyBackspace ); + if( claerKeyPressed && ItemCount > 0 && FindBox()->TextLength() == 0 ) + { + ProcessCommandL(EAknCmdUserDBDelete); + UpdateListBoxL(); + ret = EKeyWasConsumed; + } + else + { + if ( FindBox()->IsVisible() ) + { + ret = CAknMarkableListDialog::OfferKeyEventL( aKeyEvent, aType ); + } + else + { + ret = ListBox()->OfferKeyEventL( aKeyEvent, aType ); + } + } + + if ( ret != EKeyWasConsumed && aType == EEventKey && + aKeyEvent.iCode == EKeyOK ) + { + iContextMenuBar->TryDisplayMenuBarL(); + ret = EKeyWasConsumed; + } + + return ret; + } + +void CAknFepUserdbDlg::PostLayoutDynInitL() + { + CAknMarkableListDialog::PostLayoutDynInitL(); + FindBox()->Editor().SetMaxLength( KFindBoxInputMaxLength ); + ListBox()->SetObserver( this ); + ListBox()->AddItemChangeObserverL( this ); + + InitListBoxItemL(); + UpdateListBoxL(); + + return; + } + +void CAknFepUserdbDlg::ConstructContextMenuL() + { + CEikMenuBar* newMenuBar = new ( ELeave ) CEikMenuBar(); + CleanupStack::PushL( newMenuBar ); + newMenuBar->ConstructL + ( this, NULL, R_AKNFEP_USERDB_DLG_CONTEXT_MENUBAR ); + iEikonEnv->EikAppUi()->AddToStackL( newMenuBar, ECoeStackPriorityMenu, + ECoeStackFlagRefusesFocus ); + iContextMenuBar = newMenuBar; + CleanupStack::Pop( newMenuBar ); + } + +void CAknFepUserdbDlg::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aEventType) + { + CTextListBoxModel* model = static_cast( ListBox()->Model() ); + CDesCArrayFlat* itemArray = + static_cast( model->ItemTextArray() ); + TInt listItems = itemArray->Count(); + + if ( !listItems ) + { + return; + } + + CAknSelectionListDialog::HandleListBoxEventL( ListBox(), aEventType ); + + switch ( aEventType ) + { + case EEventItemDoubleClicked: + { + TInt selectItems = ListBox()->SelectionIndexes()->Count(); + if ( selectItems ) + { + iOldIndex = ListBox()->CurrentItemIndex(); + MarkOrUnmarkItemL(); + } + else + { + ShowContextMenuL(); + } + } + break; + default: + break; + } + } + + +void CAknFepUserdbDlg::ResetSearchFieldL() + { + CAknFilteredTextListBoxModel* selectmodel = + static_cast( ListBox()->Model() ); + selectmodel->Filter()->HandleItemArrayChangeL(); + } + +TInt CAknFepUserdbDlg::FindActualIndex( const TInt aItemIndex ) + { + TInt itemIndex; + CTextListBoxModel* model = + static_cast( ListBox()->Model() ); + CDesCArrayFlat* itemArray = + static_cast( model->ItemTextArray() ); + //get the real index of list + TBuf itemText; + itemText.Copy( model->ItemText(aItemIndex) ); + itemArray->Find( itemText, itemIndex, ECmpCollated ); + return itemIndex; + } + +void CAknFepUserdbDlg::ShowContextMenuL() + { + iContextMenuBar->SetMenuTitleResourceId( R_AKNFEP_USERDB_DLG_CONTEXT_MENUBAR ); + iContextMenuBar->SetMenuType( CEikMenuBar::EMenuContext ); + iContextMenuBar->StopDisplayingMenuBar(); + iContextMenuBar->TryDisplayMenuBarL(); + iContextMenuBar->SetMenuTitleResourceId( R_AKNFEP_USERDB_DLG_MENUBAR ); + iContextMenuBar->SetMenuType( CEikMenuBar::EMenuOptions ); + } + +void CAknFepUserdbDlg::MarkOrUnmarkItemL() + { + TInt selectIndex = 0; + TKeyArrayFix* key= new (ELeave) TKeyArrayFix( 0, ECmpTInt32 ); + CleanupStack::PushL( key ); + TInt index = ListBox()->CurrentItemIndex(); + const CArrayFix* selectitemArray = ListBox()->SelectionIndexes(); + TInt ret = selectitemArray->Find( index, *key, selectIndex ); + if ( ret == 0) + { + ProcessCommandL( EAknCmdUnmark ); + } + else + { + ProcessCommandL( EAknCmdMark ); + } + CleanupStack::PopAndDestroy( key ); + } + +void CAknFepUserdbDlg::InsertIconL( CDesC16Array* aDataArray ) + { + TBuf itemText; + for ( TInt i = 0; i < aDataArray->Count(); i++ ) + { + itemText = aDataArray->MdcaPoint( i ); + itemText.Insert( 0, KItemStart ); + aDataArray->Delete( i ); + aDataArray->InsertL( i, itemText ); + } + aDataArray->Sort( ECmpCollated ); + } + +void CAknFepUserdbDlg::OnChangeLanguageL( TInt aInputLanguage ) + { + if ( aInputLanguage != ELangPrcChinese && + aInputLanguage != ELangTaiwanChinese && + aInputLanguage != ELangHongKongChinese ) + { + if ( iQueryDlg && iQueryDlg->IsVisible() ) + { + delete iQueryDlg; + iQueryDlg = NULL; + } + this->TryExitL( EAknSoftkeyExit ); + return; + } + if ( iOldLanguage == aInputLanguage ) + { + return; + } + iOldLanguage = aInputLanguage; + + CAknFilteredTextListBoxModel* model = + static_cast( ListBox()->Model() ); + CDesCArrayFlat* itemArray = + static_cast( model->ItemTextArray() ); + TBuf errMsg; + + AknSelectionService::HandleMarkableListProcessCommandL( EAknUnmarkAll, ListBox() ); + itemArray->Reset(); + + //get the phrases from the DB + if ( !iDBEngine->GetPhraseFromDBL( *itemArray ) ) + { + iDBEngine->GetErrMsg( errMsg ); + //note fot err message + CAknWarningNote* note = new( ELeave ) CAknWarningNote(); + note->SetTone( CAknNoteDialog::EWarningTone ); + note->ExecuteLD( errMsg ); + } + else + { + InsertIconL( itemArray ); + ListBox()->HandleItemAdditionL(); + ListBox()->ClearSelection(); + FindBox()->SetFocus( ETrue ); + FindBox()->SetFocusing( ETrue ); + FindBox()->MakeVisible( ETrue ); + } + if ( itemArray->Count() == 0 ) + { + FindBox()->SetSearchTextL( KSearchTextEmpty ); + FindBox()->SetFocus( EFalse ); + FindBox()->SetFocusing( EFalse ); + FindBox()->MakeVisible( EFalse ); + ListBox()->SetRect( Rect() ); + ListBox()->View()->DrawEmptyList( Rect() ); + + //Show add-add-exit cba + ChangeCurrentCbaL( R_AKNFEP_SOFTKEYS_LIST_ADD_EXIT ); + } + else + { + ListBox()->SetCurrentItemIndex( 0 ); + } + } + +void CAknFepUserdbDlg::ListBoxItemsChanged( CEikListBox* aListBox ) + { + CAknFilteredTextListBoxModel* filterModel = + static_cast( aListBox->Model() ); + CDesCArrayFlat* itemArray = + static_cast( filterModel->ItemTextArray() ); + + TInt ItemCount = aListBox->Model()->NumberOfItems(); + TInt selectedItem = filterModel->Filter()->SelectionIndexes()->Count(); + if ( ItemCount > 0 && selectedItem < 1 ) + { + //Show options-context-exit cba + TRAP_IGNORE ( ChangeCurrentCbaL( R_AKNFEP_SOFTKEYS_LIST_OPTIONS_EXIT_CONTEXT ) ); + } + else + { + if ( ItemCount == 0) + { + //Show add-add-exit cba + TRAP_IGNORE ( ChangeCurrentCbaL( R_AKNFEP_SOFTKEYS_LIST_ADD_EXIT ) ); + if ( itemArray->Count() == 0 && FindBox()->TextLength() == 0 ) + { + FindBox()->SetFocus( EFalse ); + FindBox()->MakeVisible( EFalse ); + } + + if ( FindBox()->TextLength() == 0 ) + { + ListBox()->SetRect( Rect() ); + ListBox()->View()->DrawEmptyList( Rect() ); + } + } + } + } + +void CAknFepUserdbDlg::UpdateListBoxL( TInt aCommandId ) + { + // Update the listbox + CAknFilteredTextListBoxModel* filterModel = + static_cast( ListBox()->Model() ); + filterModel->Filter()->UpdateCachedDataL(); + + TInt selectedItem = ListBox()->SelectionIndexes()->Count(); + + + CAknFilteredTextListBoxModel* model = + static_cast( ListBox()->Model() ); + CDesCArrayFlat* itemArray = + static_cast( model->ItemTextArray() ); + TInt listItems = model->NumberOfItems(); + + if ( listItems != 0 && selectedItem != 0) + { + TInt CurrentItemIndex = ListBox()->CurrentItemIndex(); + if( ( aCommandId == EAknCmdMark || aCommandId == EAknMarkAll ) && + ListBox()->View()->ItemIsSelected(CurrentItemIndex)) + { + //Show options-unmark-exit menu + ChangeCurrentCbaL( R_AKNFEP_SOFTKEYS_LIST_OPTIONS_EXIT_MARK ); + } + if( ( aCommandId == EAknCmdUnmark || aCommandId == EAknUnmarkAll ) && + !ListBox()->View()->ItemIsSelected(CurrentItemIndex)) + { + //Show options-mark-exit menu + ChangeCurrentCbaL( R_AKNFEP_SOFTKEYS_LIST_OPTIONS_EXIT_UNMARK ); + } + } + + if ( listItems == 0 ) + { + //Show add-add-exit cba + ChangeCurrentCbaL( R_AKNFEP_SOFTKEYS_LIST_ADD_EXIT ); + if ( itemArray->Count() == 0 && FindBox()->TextLength() == 0 ) + { + FindBox()->SetFocus( EFalse ); + FindBox()->MakeVisible( EFalse ); + } + + if ( FindBox()->TextLength() == 0 ) + { + ListBox()->SetRect( Rect() ); + ListBox()->View()->DrawEmptyList( Rect() ); + } + } + if( selectedItem == 0 && listItems != 0 ) + { + FindBox()->MakeVisible( ETrue ); + FindBox()->SetFocus( ETrue ); + FindBox()->DrawNow(); + TRect findpaneRect(FindBox()->Rect()); + TRect clientRect = Rect(); + TSize size = TSize(clientRect.Width(), + clientRect.Height() - findpaneRect.Height()); + ListBox()->SetRect( TRect(clientRect.iTl, size) ); + ListBox()->View()->Draw(); + //Show options-context-exit cba + ChangeCurrentCbaL( R_AKNFEP_SOFTKEYS_LIST_OPTIONS_EXIT_CONTEXT ); + } + + if ( FindBox()->IsVisible() ) + { + FindBox()->SetFocus( ETrue ); + FindBox()->MakeVisible( ETrue ); + } + } + +CCoeControl* CAknFepUserdbDlg::ComponentControl(TInt aIndex) const + { + if ( aIndex == CAknMarkableListDialog::CountComponentControls() ) + { + return ListBox(); + } + else + { + return CAknMarkableListDialog::ComponentControl(aIndex); + } + } + +TInt CAknFepUserdbDlg::CountComponentControls() const + { + if ( ListBox() ) + { + return CAknMarkableListDialog::CountComponentControls() + 1; + } + else + { + return CAknMarkableListDialog::CountComponentControls(); + } + } + + + +void CAknFepUserdbDlg::SizeChanged() + { + //Change title text + CEikStatusPane* statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane(); + CAknTitlePane* title = NULL; + TRAP_IGNORE( title = static_cast< CAknTitlePane* >( + statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle) ) ) ); + + //Load the new title text + HBufC* titletext = StringLoader::LoadLC( R_AKNFEP_USER_DB_MANAGEMENT_TITLE ); + //Set title to the new text + TRAP_IGNORE( title->SetTextL( *titletext )); + CleanupStack::PopAndDestroy( titletext ); + } +// End of file