--- /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 <aknlists.h> // CAknSingleStyleListBox
+#include <barsread.h> // TResource Reader
+#include <eikclbd.h> // CColumnListBoxData
+#include <aknsfld.h> //CAknSearchField
+#include <AknQueryDialog.h> //CAknTextQueryDialog
+#include <AknUtils.h> //AknSelectionService , CAknFilteredTextListBoxModel
+#include <StringLoader.h> //StringLoader
+#include <aknnotewrappers.h> //CAknWarningNote
+#include <AknProgressDialog.h> //CAknProgressDialog
+#include <AknDialog.h> //CAknDialog
+#include <akncontext.h> //CAknContextPane
+#include <AknWaitDialog.h> //CAknWaitDialog
+#include <AknProgressDialog.h> //CAknProgressDialog
+#include <eikprogi.h> //CEikProgressInfo
+#include <eikbtgpc.h> //CEikButtonGroupContainer
+#include <eikmenub.h>
+#include <charconv.h> //CCnvCharacterSetConverter
+#include <f32file.h> //RFs
+#include <eikedwin.h> //CEikEdwin
+#include <akntitle.h> //CAknTitlePane
+#include <AknFep.rsg>
+#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<KErrMsgMaxLength> 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<CAknSingleStyleListBox*>( 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<CAknSingleStyleListBox*>( Control( ESelectionListControl ) );
+ // New item text
+ TBuf<KListBoxItemMaxLength> itemText;
+ TBuf<KErrMsgMaxLength> 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<CAknFilteredTextListBoxModel*>( ListBox()->Model() );
+ CDesCArray* itemArray =
+ static_cast<CDesC16ArrayFlat*>( 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<KErrMsgMaxLength> errMsg;
+ TBuf<KListBoxItemMaxLength> removePhrase;
+ TInt oldIndex = ListBox()->View()->CurrentItemIndex();
+ CAknFilteredTextListBoxModel* model =
+ static_cast<CAknFilteredTextListBoxModel*>( ListBox()->Model() );
+ CDesCArrayFlat* item =
+ static_cast<CDesCArrayFlat*>( 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<TInt>* selectionArray = new( ELeave ) CArrayFixFlat<TInt>( 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<CAknSingleStyleListBox*>( 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<KListBoxItemMaxLength> itemText;
+ TBuf<KErrMsgMaxLength> errMsg;
+ TBuf<KListBoxItemMaxLength> 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<CDesC16ArrayFlat*>( 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<CAknFilteredTextListBoxModel*>( 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<CAknFilteredTextListBoxModel*>( 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<CAknSingleStyleListBox*>( 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<CAknFilteredTextListBoxModel*>( 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<TInt>* 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<CAknFilteredTextListBoxModel*>( 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<CTextListBoxModel*>( ListBox()->Model() );
+ CDesCArrayFlat* itemArray =
+ static_cast<CDesCArrayFlat*>( 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<CAknFilteredTextListBoxModel*>( ListBox()->Model() );
+ selectmodel->Filter()->HandleItemArrayChangeL();
+ }
+
+TInt CAknFepUserdbDlg::FindActualIndex( const TInt aItemIndex )
+ {
+ TInt itemIndex;
+ CTextListBoxModel* model =
+ static_cast<CTextListBoxModel*>( ListBox()->Model() );
+ CDesCArrayFlat* itemArray =
+ static_cast<CDesCArrayFlat*>( model->ItemTextArray() );
+ //get the real index of list
+ TBuf<KListBoxItemMaxLength> 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<TInt>* 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<KListBoxItemMaxLength> 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<CAknFilteredTextListBoxModel*>( ListBox()->Model() );
+ CDesCArrayFlat* itemArray =
+ static_cast<CDesCArrayFlat*>( model->ItemTextArray() );
+ TBuf<KErrMsgMaxLength> 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<CAknFilteredTextListBoxModel*>( aListBox->Model() );
+ CDesCArrayFlat* itemArray =
+ static_cast<CDesCArrayFlat*>( 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<CAknFilteredTextListBoxModel*>( ListBox()->Model() );
+ filterModel->Filter()->UpdateCachedDataL();
+
+ TInt selectedItem = ListBox()->SelectionIndexes()->Count();
+
+
+ CAknFilteredTextListBoxModel* model =
+ static_cast<CAknFilteredTextListBoxModel*>( ListBox()->Model() );
+ CDesCArrayFlat* itemArray =
+ static_cast<CDesCArrayFlat*>( 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