fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUserDictionaryEditDialog.cpp
changeset 36 a7632c26d895
parent 35 0f326f2e628e
child 42 b3eaa440ab06
--- a/fep/aknfep/UiPlugins/AknFepUiInterface/AvkonImpl/src/AknFepUserDictionaryEditDialog.cpp	Fri Jul 23 16:49:01 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,558 +0,0 @@
-/*
-* Copyright (c) 2009 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:          
-*
-*/
-
-
-
-
-
-
-
-
-
-
-/*
- * ============================================================================
- *  Name     : CAknFepUserDictionaryEditDialog 
- * ============================================================================
- */
-
-#include <COEMAIN.H>
-#include <EIKENV.H>
-#include <eikclbd.h>
-#include <akntitle.h>
-#include "AknFepUserDictionaryEditDialog.h"
-
-//For help:
-#include <hlplch.h>
-//#include <csxhelp\predinput.hlp.hrh>
-
-//Uid of AknFep
-const TUid KUidAknFep = {0x101FD65A};
-
-CAknFepUserDictionaryEditDialog *CAknFepUserDictionaryEditDialog::NewL(
-        TInt aOpenedItem,
-        CArrayFixFlat<TInt> *aSelectedItems,
-        MDesCArray *aArray)
-    {
-    CAknFepUserDictionaryEditDialog* self = CAknFepUserDictionaryEditDialog::NewLC(
-            aOpenedItem, aSelectedItems, aArray );
-    CleanupStack::Pop(self);
-    return self;
-    }
-
-CAknFepUserDictionaryEditDialog *CAknFepUserDictionaryEditDialog::NewLC(
-        TInt aOpenedItem,
-        CArrayFixFlat<TInt> *aSelectedItems,
-        MDesCArray *aArray)
-    {
-    CAknFepUserDictionaryEditDialog* self = new (ELeave) CAknFepUserDictionaryEditDialog(
-            aOpenedItem, aSelectedItems, aArray );
-    CleanupStack::PushL(self);
-    self->ConstructL(R_UDB_EDIT_OPTIONS_MENUBAR);
-    return self;
-    }
-
-CAknFepUserDictionaryEditDialog::CAknFepUserDictionaryEditDialog(
-        TInt aOpenedItem,
-        CArrayFixFlat<TInt> *aSelectedItems,
-        MDesCArray *aArray )
-    :CAknMarkableListDialog(aOpenedItem, aSelectedItems, aArray, R_UDB_EDIT_OPTIONS_MENUBAR, NULL, NULL), 
-     iOpenedItem(aOpenedItem), iSelectedItems(aSelectedItems)
-    {
-    };
-
-CAknFepUserDictionaryEditDialog::~CAknFepUserDictionaryEditDialog()
-    {
-    delete iOwnWordsModel;
-    iOwnWordsModel = NULL;
-    iOwnWordsListBox = NULL;
-    };
-
-void CAknFepUserDictionaryEditDialog::RunDlgLD()
-    {
-    CDesCArrayFlat* arrWords = new (ELeave) CDesCArrayFlat(1);
-    CleanupStack::PushL( arrWords );
-    //ownership of selectedItems is given to CAknFepUserDictionaryEditDialog
-    CArrayFixFlat<TInt>* selectedItems = new (ELeave) CArrayFixFlat<TInt>(1);
-    CleanupStack::PushL( selectedItems );
-    
-    TInt openedItem(0);
-    CAknFepUserDictionaryEditDialog* dlg = CAknFepUserDictionaryEditDialog::NewL(
-                        openedItem, selectedItems, arrWords);
-    
-    //Save old title pane and display title for user dictionary editing
-    CCoeEnv* coeEnv = CCoeEnv::Static();
-    CAknAppUi* appUi = static_cast<CAknAppUi*>(coeEnv->AppUi());
-
-    CAknTitlePane* titlePane = 
-        static_cast<CAknTitlePane*>( appUi->StatusPane()->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) );
-
-    const TDesC* appTitle = titlePane->Text();
-    HBufC* oldTitle = appTitle->AllocL();
-    CleanupStack::PushL(oldTitle);
-    HBufC* title = StringLoader::LoadLC( R_AKNFEP_PRED_USERDICT_EDITING_TITLE );
-    titlePane->SetTextL( *title );
-    CleanupStack::PopAndDestroy(title);
-
-    dlg->ExecuteLD(R_USER_DICTIONARY_EDITING_DIALOG);
-    
-    //workaround to prevent application from crashing in case a 3rd party fep 
-    //was installed while the dialog was active. 
-    if( KUidAknFep != CCoeEnv::Static()->FepUid() )
-        {
-        User::Leave(KErrNone);
-        }
-    titlePane->SetTextL( *oldTitle );
-    CleanupStack::PopAndDestroy( 3, arrWords );
-    }
-
-
-void CAknFepUserDictionaryEditDialog::PreLayoutDynInitL()
-    {
-    CAknMarkableListDialog::PreLayoutDynInitL();
-    iOwnWordsListBox = (CEikColumnListBox*) ControlOrNull( ESelectionListControl );
-    //Initialize the model for retrieving UDB entries
-    iOwnWordsModel = CAknFepPredOwnWordsModel::NewL( iOwnWordsListBox->Model()->ItemTextArray() );
-    iOwnWordsListBox->HandleItemAdditionL();
-    
-    //Set the empty listbox string
-    HBufC* emptyListString_secondary = StringLoader::LoadLC( R_AKNFEP_PRED_USER_DICTIONARY_EMPTY );
-    HBufC* emptyListString = StringLoader::LoadLC( R_AKNFEP_PRED_USER_DICTIONARY_HEADING_EMPTY );
-    _LIT( KNewLine, "\n" );
-    TInt newLength = emptyListString->Length() + KNewLine().Length() + emptyListString_secondary->Length();
-    emptyListString = emptyListString->ReAllocL( newLength );
-    CleanupStack::Pop(); //emptyListString could now be at a different location
-    CleanupStack::PushL( emptyListString );
-    TPtr ptr = emptyListString->Des();
-    ptr.Append( KNewLine );
-    ptr.Append( *emptyListString_secondary );
-
-    iOwnWordsListBox->View()->SetListEmptyTextL( *emptyListString );
-    CleanupStack::PopAndDestroy( 2, emptyListString_secondary );
-    
-    //Set the middle soft key:
-    CEikButtonGroupContainer& cba = ButtonGroupContainer();
-    iMSKPosition = cba.PositionById( EAknSoftkeyContextOptions );
-    UpdateMSKLabelL();
-    
-    //For viewing extra long words:
-    iOwnWordsListBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
-    }
-
-void CAknFepUserDictionaryEditDialog::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane *aMenuPane)
-    {
-    CAknMarkableListDialog::DynInitMenuPaneL( aResourceId, aMenuPane );
-    
-    if ( iOwnWordsListBox->SelectionIndexes()->Count() >= 1
-            && R_UDB_EDIT_OPTIONS_MENUPANE == aResourceId )
-        {
-        //At least one item in the list is marked. 
-        //Hide the "Edit" option.
-        aMenuPane->SetItemDimmed( EAknFepPredDictionaryCmdEdit, ETrue);
-        }
-    
-    if ( iOwnWordsListBox->Model()->NumberOfItems() <= 0 
-            && R_UDB_EDIT_OPTIONS_MENUPANE == aResourceId )
-        {
-        //No items available for editing/deletion:
-        aMenuPane->SetItemDimmed( EAknFepPredDictionaryCmdEdit, ETrue);
-        aMenuPane->SetItemDimmed( EAknFepPredDictionaryCmdDelete, ETrue);
-        }
-    
-    }
-
-void CAknFepUserDictionaryEditDialog::ProcessCommandL( TInt aCommandId )
-    {
-    
-    if ( MenuShowing() )
-        {
-        HideMenu();
-        }
-                
-    switch(aCommandId)
-        {
-        case EAknFepPredDictionaryCmdEdit :
-            {
-            HandleEditCommandL();
-            break; 
-            }              
-            
-        case EAknFepPredDictionaryCmdAdd :
-            {
-            HandleAddNewCommandL();
-            break; 
-            }
-            
-        case EAknFepPredDictionaryCmdDelete : 
-            {
-            HandleDeleteCommandL();
-            break; 
-            }
-                        
-        case EAknCmdMark :
-        case EAknCmdUnmark :
-        case EAknMarkAll :
-        case EAknUnmarkAll :
-            {
-            SelectionListProcessCommandL(aCommandId);
-            break;
-            }
-        
-        case EAknSoftkeyEdit :
-            {
-            if ( iOwnWordsListBox->Model()->NumberOfItems() <= 0 )
-                {
-                //No entries in the list. So only option available is "Add new"
-                HandleAddNewCommandL();
-                }
-            else if ( iOwnWordsListBox->SelectionIndexes()->Count() <= 0 )
-                {
-                //Words available and none are marked. So selection => "Edit"
-                HandleEditCommandL();
-                }
-            else
-                {
-                //Words are available and at least one is marked. 
-                //So selection => "Options" menu is launched
-                DisplayMenuL();
-                }
-            break;
-            }
-            
-        case EAknCmdHelp:
-            {
-            CArrayFix<TCoeHelpContext>* helpContext = new (ELeave) CArrayFixFlat<TCoeHelpContext>( 1 );
-            CleanupStack::PushL( helpContext );
-            //THIS IS TEMPORARY AND NEEDS TO BE UPDATED WHEN HELP CONTENT IS AVAILABLE!!!
-            TUid appuid = { 0x100058EC };
-            _LIT( KAknFepPredUserDictHelp, "PREDINPUT_HLP_USERDICT" );
-            helpContext->AppendL( TCoeHelpContext( appuid, KAknFepPredUserDictHelp() ) );
-            HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), helpContext );
-            CleanupStack::Pop( helpContext );  
-            break;
-            }
-        
-        case EAknCmdExit:
-            {
-            iAvkonAppUi->ProcessCommandL( aCommandId );
-            break;
-            }
-        default: CAknMarkableListDialog::ProcessCommandL( aCommandId );
-        }
-    
-    UpdateMSKLabelL();
-    
-    }
-
-TKeyResponse CAknFepUserDictionaryEditDialog::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
-    {
-    TKeyResponse response( EKeyWasNotConsumed );
-    //Special handling required only for the clear/backspace/delete keys
-    //AND only when find pane is empty AND there is at least one item in focus/selected
-    if ( 
-            ( aKeyEvent.iCode == EKeyBackspace 
-                ||  aKeyEvent.iCode == EKeyDelete )
-        &&  ( 
-                FindBox()->TextLength() == 0 
-                && iOwnWordsListBox->Model()->NumberOfItems() > 0 
-                && (iOwnWordsListBox->SelectionIndexes()->Count() > 0 
-                        || iOwnWordsListBox->CurrentItemIndex() >= 0 ) 
-            )
-        )
-        {
-        //Delete the item(s)
-        HandleDeleteCommandL();
-        response = EKeyWasConsumed;
-        }
-    else
-        {
-        response = CAknMarkableListDialog::OfferKeyEventL( aKeyEvent, aType );
-        }
-    
-    //Update MSK only if key is not escape key (for exiting)
-    if ( EKeyEscape != aKeyEvent.iCode )
-        {
-        UpdateMSKLabelL();
-        }
-    return response;
-    }
-
-TBool CAknFepUserDictionaryEditDialog::OkToExitL(TInt aButtonId)
-    {
-    if ( EAknSoftkeyEdit == aButtonId || EAknSoftkeyContextOptions == aButtonId )
-        {
-        CAknFepUserDictionaryEditDialog::ProcessCommandL( EAknSoftkeyEdit );
-        return EFalse;
-        }
-    else
-        {
-        return CAknMarkableListDialog::OkToExitL( aButtonId );
-        }
-    }
-
-void CAknFepUserDictionaryEditDialog::UpdateMSKLabelL()
-    {
-    if ( iOwnWordsListBox && iOwnWordsListBox->Model() )
-        {
-        CEikButtonGroupContainer& cba = ButtonGroupContainer();
-        if ( iOwnWordsListBox->Model()->NumberOfItems() <= 0 )
-            {
-            //No entries in the list. So MSK is "Add new"
-            HBufC* mskLabel = StringLoader::LoadLC( R_AKNFEP_PRED_MSK_ADD_NEW );
-            cba.SetCommandL(iMSKPosition, EAknSoftkeyEdit, *mskLabel);    
-            CleanupStack::PopAndDestroy( mskLabel );
-            }
-        else if ( iOwnWordsListBox->SelectionIndexes()->Count() > 0 )
-            {
-            //Words are available and at least one is marked. 
-            //So on pressing MSK, "Options" menu is launched
-            HBufC* mskLabel = StringLoader::LoadLC( R_AKNFEP_PRED_MSK_CONTEXT_OPTIONS );
-            cba.SetCommandL(iMSKPosition, EAknSoftkeyContextOptions, *mskLabel);    
-            CleanupStack::PopAndDestroy( mskLabel );
-            }
-        else
-            {
-            //Words available and none are marked. So MSK should be "Edit"
-            HBufC* mskLabel = StringLoader::LoadLC( R_AKNFEP_PRED_MSK_EDIT );
-            cba.SetCommandL(iMSKPosition, EAknSoftkeyEdit, *mskLabel);    
-            CleanupStack::PopAndDestroy( mskLabel );
-            }
-        cba.DrawDeferred();
-        }
-    }
-
-void CAknFepUserDictionaryEditDialog::HandleEditCommandL()
-    {
-    CDesCArrayFlat* wordArray = (CDesCArrayFlat*)iOwnWordsListBox->Model()->ItemTextArray();
-    //First Get the current focussed word's index
-    TInt selectedWordIndex = iOwnWordsListBox->CurrentItemIndex();
-    //Edit option will be available only for the currently 
-    //focussed item. 
-    
-    //Get the indexed word and remove seperator ("\t")
-    TPtrC oldWord = ( (*wordArray)[selectedWordIndex] ).Mid(1);
-    HBufC* newWord = HBufC::NewLC( KMaxUDBLength );
-    //Copy the old word to newWord for the "Edit word" prompt
-    newWord->Des().Copy( oldWord );
-    TPtr newWordPtr(newWord->Des());
-    HBufC* queryTitle = StringLoader::LoadLC( R_AKNFEP_PRED_EDIT_QUERY );
-    if ( QueryWordL( *queryTitle, newWordPtr ) )
-        {
-        //Remove old word
-        if ( KErrNone == iOwnWordsModel->RemoveSelectedWordL( selectedWordIndex ) )
-            {
-            iOwnWordsListBox->HandleItemRemovalL();
-            //Now add the new word:
-            selectedWordIndex = iOwnWordsModel->AddNewWordL( newWordPtr );
-            if ( selectedWordIndex >= 0 )
-                {
-                iOwnWordsListBox->HandleItemAdditionL();
-                if ( (iOwnWordsListBox->CurrentItemIndex() >= 0) && FindBox() && (FindBox()->TextLength() > 0) )
-                    {
-                    HandleAddNewIntoFilteredListL( selectedWordIndex );
-                    }
-                if ( selectedWordIndex >=0 )
-                    {
-                    iOwnWordsListBox->SetCurrentItemIndex( selectedWordIndex );
-                    }
-                iOwnWordsListBox->DrawNow();
-                }
-            }
-        }
-    
-    CleanupStack::PopAndDestroy( 2, newWord );
-    }
-
-void CAknFepUserDictionaryEditDialog::HandleAddNewCommandL()
-    {
-    HBufC* newWord = HBufC::NewLC( KMaxUDBLength );
-    TPtr newWordPtr(newWord->Des());
-    //if there is some text in the find pane, include it in the query
-    if ( FindBox()->TextLength() > 0 )
-        {
-        FindBox()->GetSearchText( newWordPtr );
-        }
-    HBufC* queryTitle = StringLoader::LoadLC( R_AKNFEP_PRED_ADD_QUERY );
-    if ( QueryWordL( *queryTitle, newWordPtr ) )
-        {
-        TInt selectedWordIndex = iOwnWordsModel->AddNewWordL( newWordPtr );
-        if ( selectedWordIndex >= 0 )
-            {
-            iOwnWordsListBox->HandleItemAdditionL();
-            if ( (iOwnWordsListBox->CurrentItemIndex() >= 0) && FindBox() && (FindBox()->TextLength() > 0) )
-                {
-                HandleAddNewIntoFilteredListL( selectedWordIndex );
-                }
-            if ( selectedWordIndex >=0 )
-                {
-                iOwnWordsListBox->SetCurrentItemIndex( selectedWordIndex );
-                }
-            iOwnWordsListBox->DrawNow();
-            }
-        }
-    CleanupStack::PopAndDestroy( 2, newWord );
-    }
-void CAknFepUserDictionaryEditDialog::HandleDeleteCommandL()
-    {
-    if ( iOwnWordsListBox->Model()->NumberOfItems() <= 0 )
-        {
-        //safety check - no words to delete so return from here
-        return;
-        }
-    
-    TInt updatedIndex(-1);
-    TInt numOfMarkedItems = iOwnWordsListBox->SelectionIndexes()->Count();
-    TInt currentIndex = CurrentItemIndex();
-    //If multiple items are marked:
-    if ( numOfMarkedItems > 1 )
-        {
-        //Load the confirmation string for multiple item deletion
-        HBufC* prompt = StringLoader::LoadLC( 
-                            R_AKNFEP_PRED_DELETE_MANY_QUERY, numOfMarkedItems );
-        if ( ConfirmDeleteL( *prompt ) )
-            {
-            const CArrayFix<TInt>* selectedItems = SelectedItemsL();/*(CArrayFix<TInt>*)filteredModel->Filter()->SelectionIndexes();*/
-            updatedIndex = iOwnWordsModel->RemoveSelectedWordsL( selectedItems );
-            }
-        CleanupStack::PopAndDestroy( prompt );
-        }
-    else
-        {
-        //Load the confirmation string for single item deletion
-        HBufC* prompt = StringLoader::LoadLC( R_AKNFEP_PRED_DELETE_1_QUERY );
-        if ( ConfirmDeleteL( *prompt ) )
-            {
-            //Deleting marked item?
-            if ( numOfMarkedItems == 1 )
-                {
-                updatedIndex = iOwnWordsModel->RemoveSelectedWordL( SelectedItemsL()->At(0) );
-                }
-            //or deleting the currently focussed item
-            else //just one entry to delete:
-                {
-                updatedIndex = iOwnWordsModel->RemoveSelectedWordL( currentIndex );
-                }
-            }
-        CleanupStack::PopAndDestroy( prompt );
-        }
-    
-    if ( updatedIndex == KErrNone )
-        {
-        iOwnWordsListBox->HandleItemRemovalL();
-                
-        CAknListBoxFilterItems* filter;
-        TInt filteredNumOfItems(-1);
-        if ( (iOwnWordsListBox->CurrentItemIndex() >= 0) && FindBox() && (FindBox()->TextLength() > 0) )
-            {
-            CAknFilteredTextListBoxModel* model = static_cast<CAknFilteredTextListBoxModel*>(iOwnWordsListBox->Model());
-            filter = model->Filter();
-            filter->HandleItemArrayChangeL();
-            filter->UpdateCachedDataL();
-            filteredNumOfItems = filter->FilteredNumberOfItems();
-            }
-        
-        //retain the current selection position, unless
-        //it refers to non-existant word. In this case, 
-        //keep selection at the end of the list.
-        TInt numOfItems = filteredNumOfItems>=0? filteredNumOfItems : iOwnWordsListBox->Model()->NumberOfItems();
-                
-        if ( currentIndex >= numOfItems && numOfItems > 0 )
-            {       
-            iOwnWordsListBox->SetCurrentItemIndex( numOfItems - 1 );
-            }
-        
-        
-        UpdateMSKLabelL();
-        iOwnWordsListBox->DrawNow();
-        }
-    
-    }
-
-//Query for new word from user. Also used to edit existing word
-TBool CAknFepUserDictionaryEditDialog::QueryWordL( const TDesC& aTitle, TDes& aNewWord )
-    {
-    CAknTextQueryDialog* dialog = CAknTextQueryDialog::NewL( aNewWord  );
-    dialog->PrepareLC( R_AKNFEP_PRED_USER_DICTIONARY_WORD_QUERY );
-    dialog->SetPromptL(aTitle);
-    //last char space has to be reserved for null terminator
-    dialog->SetMaxLength( KMaxUDBLength - 1 );
-    if ( EAknSoftkeyOk ==  dialog->RunLD() )
-        {
-        return ETrue;
-        }
-    else
-        {
-        return EFalse;
-        }
-    }
-
-TBool CAknFepUserDictionaryEditDialog::ConfirmDeleteL( const TDesC& aPrompt )
-    {
-    CAknQueryDialog* dialog = CAknQueryDialog::NewL();
-    dialog->SetPromptL( aPrompt );
-    if ( EAknSoftkeyYes ==  dialog->ExecuteLD( R_AKNFEP_PRED_DELETE_CONFIRMATION_QUERY ) )
-        {
-        return ETrue;
-        }
-    else
-        {
-        return EFalse;
-        }
-    }
-
-TInt CAknFepUserDictionaryEditDialog::CurrentItemIndex()
-    {
-    if ( (iOwnWordsListBox->CurrentItemIndex() >= 0) && FindBox() && (FindBox()->TextLength() > 0) )
-        {
-        CAknFilteredTextListBoxModel* model = static_cast<CAknFilteredTextListBoxModel*>(iOwnWordsListBox->Model());
-        CAknListBoxFilterItems* filter = model->Filter(); 
-        return filter->FilteredItemIndex(iOwnWordsListBox->CurrentItemIndex());
-        }           
-    else
-        {
-        return iOwnWordsListBox->CurrentItemIndex();
-        }
-    }
-
-const CArrayFix<TInt>* CAknFepUserDictionaryEditDialog::SelectedItemsL()
-    {
-    const CArrayFix<TInt>* selectedItems;
-    if ( (iOwnWordsListBox->CurrentItemIndex() >= 0) && FindBox() && (FindBox()->TextLength() > 0) )
-        {
-        CAknFilteredTextListBoxModel* model = static_cast<CAknFilteredTextListBoxModel*>(iOwnWordsListBox->Model());
-        CAknListBoxFilterItems* filter = model->Filter();
-        filter->ResetFilteringL();
-        selectedItems = filter->SelectionIndexes();
-        }
-    else
-        {
-        selectedItems = iOwnWordsListBox->SelectionIndexes();
-        }
-    TKeyArrayFix actNumKey(0,ECmpTInt);
-    const_cast<CArrayFix<TInt>*>(selectedItems)->Sort(actNumKey);
-    return selectedItems;
-    }
-
-void CAknFepUserDictionaryEditDialog::HandleAddNewIntoFilteredListL( TInt &aOriginalItemIndex )
-    {
-    CAknFilteredTextListBoxModel* model = static_cast<CAknFilteredTextListBoxModel*>(iOwnWordsListBox->Model());
-    CAknListBoxFilterItems* filter = model->Filter();
-    filter->HandleItemArrayChangeL();
-    filter->UpdateCachedDataL();
-    TInt filteredNumOfItems = filter->FilteredNumberOfItems();
-    aOriginalItemIndex = filter->VisibleItemIndex( aOriginalItemIndex );
-    }