summaryrefslogtreecommitdiff
path: root/cui/source/dialogs/SpellDialog.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/dialogs/SpellDialog.cxx')
-rw-r--r--cui/source/dialogs/SpellDialog.cxx2091
1 files changed, 0 insertions, 2091 deletions
diff --git a/cui/source/dialogs/SpellDialog.cxx b/cui/source/dialogs/SpellDialog.cxx
deleted file mode 100644
index 85fb0c5cb..000000000
--- a/cui/source/dialogs/SpellDialog.cxx
+++ /dev/null
@@ -1,2091 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// include ---------------------------------------------------------------
-
-#include <tools/ref.hxx>
-#include <tools/shl.hxx>
-#include <vcl/wrkwin.hxx>
-#include <vcl/menu.hxx>
-#include <vcl/msgbox.hxx>
-#include <vcl/scrbar.hxx>
-#include <SpellAttrib.hxx>
-#include <sfx2/dispatch.hxx>
-#include <sfx2/bindings.hxx>
-#include <svl/undo.hxx>
-#include <unotools/lingucfg.hxx>
-#include <svtools/textdata.hxx>
-#include <svtools/filter.hxx>
-#include <editeng/unolingu.hxx>
-#include <editeng/splwrap.hxx>
-#include <linguistic/lngprops.hxx>
-#include <linguistic/misc.hxx>
-#include <comphelper/processfactory.hxx>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/lang/XServiceInfo.hpp>
-#include <com/sun/star/lang/XServiceDisplayName.hpp>
-#include <com/sun/star/linguistic2/SpellFailure.hpp>
-#include <com/sun/star/frame/XStorable.hpp>
-#include <sfx2/app.hxx>
-#include <vcl/help.hxx>
-#include <vcl/graph.hxx>
-#include <osl/file.hxx>
-#include <cuires.hrc>
-#include <helpid.hrc>
-#include "SpellDialog.hrc"
-#include <editeng/optitems.hxx>
-#include <editeng/svxenum.hxx>
-#include <svx/SpellDialogChildWindow.hxx>
-#include "SpellDialog.hxx"
-#include <svx/dlgutil.hxx>
-#include "optlingu.hxx"
-#include <dialmgr.hxx>
-#include <svx/svxerr.hxx>
-#include "treeopt.hxx"
-#include <svtools/langtab.hxx>
-
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::linguistic2;
-
-using ::rtl::OUString;
-
-#define C2U(cChar) ::rtl::OUString::createFromAscii(cChar)
-// struct SpellDialog_Impl ---------------------------------------------
-
-struct SpellDialog_Impl
-{
- Sequence< Reference< XDictionary > > aDics;
-};
-// -----------------------------------------------------------------------
-
-#define SPELLUNDO_START 200
-
-#define SPELLUNDO_CHANGE_LANGUAGE (SPELLUNDO_START + 1)
-#define SPELLUNDO_CHANGE_TEXTENGINE (SPELLUNDO_START + 2)
-#define SPELLUNDO_CHANGE_NEXTERROR (SPELLUNDO_START + 3)
-#define SPELLUNDO_CHANGE_ADD_TO_DICTIONARY (SPELLUNDO_START + 4)
-#define SPELLUNDO_CHANGE_GROUP (SPELLUNDO_START + 5) //undo list
-#define SPELLUNDO_MOVE_ERROREND (SPELLUNDO_START + 6)
-#define SPELLUNDO_UNDO_EDIT_MODE (SPELLUNDO_START + 7)
-#define SPELLUNDO_ADD_IGNORE_RULE (SPELLUNDO_START + 8)
-
-namespace svx{
-class SpellUndoAction_Impl : public SfxUndoAction
-{
- sal_uInt16 m_nId;
- const Link& m_rActionLink;
- //undo of button enabling
- bool m_bEnableChangePB;
- bool m_bEnableChangeAllPB;
- //undo of MarkNextError - used in change and change all, ignore and ignore all
- long m_nNewErrorStart;
- long m_nNewErrorEnd;
- long m_nOldErrorStart;
- long m_nOldErrorEnd;
- bool m_bIsErrorLanguageSelected;
- ::rtl::OUString m_sRuleId;
- //undo of AddToDictionary
- Reference<XDictionary> m_xDictionary;
- ::rtl::OUString m_sAddedWord;
- //move end of error - ::ChangeMarkedWord()
- long m_nOffset;
-
-public:
- SpellUndoAction_Impl(sal_uInt16 nId, const Link& rActionLink) :
- m_nId(nId),
- m_rActionLink( rActionLink),
- m_bEnableChangePB(false),
- m_bEnableChangeAllPB(false),
- m_nNewErrorStart(-1),
- m_nNewErrorEnd(-1),
- m_nOldErrorStart(-1),
- m_nOldErrorEnd(-1),
- m_bIsErrorLanguageSelected(false),
- m_nOffset(0)
- {}
-
- ~SpellUndoAction_Impl();
-
- virtual void Undo();
- virtual sal_uInt16 GetId() const;
-
- void SetEnableChangePB(){m_bEnableChangePB = true;}
- bool IsEnableChangePB(){return m_bEnableChangePB;}
-
- void SetEnableChangeAllPB(){m_bEnableChangeAllPB = true;}
- bool IsEnableChangeAllPB(){return m_bEnableChangeAllPB;}
-
- void SetErrorMove(long nNewStart, long nNewEnd, long nOldStart, long nOldEnd)
- {
- m_nNewErrorStart = nNewStart;
- m_nNewErrorEnd = nNewEnd;
- m_nOldErrorStart = nOldStart;
- m_nOldErrorEnd = nOldEnd;
- }
- long GetNewErrorStart() { return m_nNewErrorStart;}
- long GetNewErrorEnd() { return m_nNewErrorEnd;}
- long GetOldErrorStart() { return m_nOldErrorStart;}
- long GetOldErrorEnd() { return m_nOldErrorEnd;}
-
- void SetErrorLanguageSelected(bool bSet){ m_bIsErrorLanguageSelected = bSet;}
- bool IsErrorLanguageSelected() const {return m_bIsErrorLanguageSelected;}
-
- void SetDictionary(Reference<XDictionary> xDict) { m_xDictionary = xDict; }
- Reference<XDictionary> GetDictionary() const {return m_xDictionary;}
- void SetAddedWord(const ::rtl::OUString& rWord) {m_sAddedWord = rWord;}
- const ::rtl::OUString& GetAddedWord() const { return m_sAddedWord;}
-
- void SetOffset(long nSet) {m_nOffset = nSet;}
- long GetOffset() const {return m_nOffset;}
-
- void SetErrorType( const ::rtl::OUString& rId ) { m_sRuleId = rId; }
- const ::rtl::OUString& GetErrorType() const { return m_sRuleId; }
-
-};
-}//namespace svx
-using namespace ::svx;
-
-//-----------------------------------------------------------------------
-SpellUndoAction_Impl::~SpellUndoAction_Impl()
-{
-}
-
-//-----------------------------------------------------------------------
-void SpellUndoAction_Impl::Undo()
-{
- m_rActionLink.Call(this);
-}
-
-//-----------------------------------------------------------------------
-sal_uInt16 SpellUndoAction_Impl::GetId()const
-{
- return m_nId;
-}
-
-// class SvxSpellCheckDialog ---------------------------------------------
-
-SpellDialog::SpellDialog(
- SpellDialogChildWindow* pChildWindow,
- Window * pParent,
- SfxBindings* _pBindings)
- : SfxModelessDialog (_pBindings,
- pChildWindow,
- pParent,
- CUI_RES(RID_SVXDLG_SPELLCHECK)),
-
- aVendorImageFI ( this , CUI_RES( IMG_VENDOR ) ),
- aLanguageFT ( this, CUI_RES( FT_LANGUAGE ) ),
- aLanguageLB ( this, CUI_RES( LB_LANGUAGE ) ),
- aNotInDictFT ( this, CUI_RES( FT_NOTINDICT ) ),
- aSentenceED ( this, CUI_RES( ED_NEWWORD ) ),
- aSuggestionFT ( this, CUI_RES( FT_SUGGESTION ) ),
- aSuggestionLB ( this, CUI_RES( LB_SUGGESTION ) ),
-
- aIgnorePB ( this, CUI_RES( PB_IGNORE ) ),
- aIgnoreAllPB ( this, CUI_RES( PB_IGNOREALL ) ),
- aIgnoreRulePB ( this, CUI_RES( PB_IGNORERULE ) ),
- aAddToDictMB ( this, CUI_RES( MB_ADDTODICT ) ),
-
- aChangePB ( this, CUI_RES( PB_CHANGE ) ),
- aChangeAllPB ( this, CUI_RES( PB_CHANGEALL ) ),
- aExplainPB ( this, CUI_RES( PB_EXPLAIN) ),
- aAutoCorrPB ( this, CUI_RES( PB_AUTOCORR ) ),
-
- aCheckGrammarCB ( this, CUI_RES( CB_CHECK_GRAMMAR ) ),
-
- aHelpPB ( this, CUI_RES( PB_HELP ) ),
- aOptionsPB ( this, CUI_RES( PB_OPTIONS ) ),
- aUndoPB ( this, CUI_RES( PB_UNDO ) ),
- aClosePB ( this, CUI_RES( PB_CLOSE ) ),
- aBackgroundGB ( this, CUI_RES( GB_BACKGROUND ) ),
-
- aVendorImage ( CUI_RES( IMG_DEFAULT_VENDOR ) ),
-
- aResumeST ( CUI_RES(ST_RESUME )),
- aIgnoreOnceST ( aIgnorePB.GetText()),
- aNoSuggestionsST( CUI_RES(ST_NOSUGGESTIONS)),
- m_sTitleSpelling ( CUI_RES( ST_SPELLING ) ),
- m_sTitleSpellingGrammar ( CUI_RES( ST_SPELLING_AND_GRAMMAR ) ),
- m_sTitleSpellingGrammarVendor ( CUI_RES( ST_SPELLING_AND_GRAMMAR_VENDORNAME ) ),
- aDialogUndoLink( LINK (this, SpellDialog, DialogUndoHdl)),
- bModified( false ),
- bFocusLocked( true ),
- rParent ( *pChildWindow ),
- nOldLang ( LANGUAGE_NONE )
-{
- FreeResource();
- xSpell = LinguMgr::GetSpellChecker();
- pImpl = new SpellDialog_Impl;
-
- //HelpIds
- aClosePB. SetHelpId(HID_SPLDLG_BUTTON_CLOSE );
- aIgnorePB. SetHelpId(HID_SPLDLG_BUTTON_IGNORE );
- aIgnoreAllPB. SetHelpId(HID_SPLDLG_BUTTON_IGNOREALL);
- aIgnoreRulePB. SetHelpId(HID_SPLDLG_BUTTON_IGNORERULE);
- aChangePB. SetHelpId(HID_SPLDLG_BUTTON_CHANGE );
- aChangeAllPB. SetHelpId(HID_SPLDLG_BUTTON_CHANGEALL);
- aExplainPB. SetHelpId(HID_SPLDLG_BUTTON_EXPLAIN );
- Init_Impl();
-
- // disable controls if service is missing
- if (!xSpell.is())
- Enable( sal_False );
-
- Application::PostUserEvent( STATIC_LINK(
- this, SpellDialog, InitHdl ) );
-}
-
-// -----------------------------------------------------------------------
-
-SpellDialog::~SpellDialog()
-{
- // save possibly modified user-dictionaries
- Reference< XDictionaryList > xDicList( SvxGetDictionaryList() );
- if (xDicList.is())
- {
- linguistic::SaveDictionaries( xDicList );
- }
-
- delete aAddToDictMB.GetPopupMenu();
- delete pImpl;
-}
-
-// -----------------------------------------------------------------------
-
-void SpellDialog::Init_Impl()
-{
- // Handler initialisieren
- aClosePB.SetClickHdl(LINK( this, SpellDialog, CancelHdl ) );
- aChangePB.SetClickHdl(LINK( this, SpellDialog, ChangeHdl ) );
- aChangeAllPB.SetClickHdl(LINK( this, SpellDialog, ChangeAllHdl ) );
- aIgnorePB.SetClickHdl(LINK( this, SpellDialog, IgnoreHdl ) );
- aIgnoreAllPB.SetClickHdl(LINK( this, SpellDialog, IgnoreAllHdl ) );
- aIgnoreRulePB.SetClickHdl(LINK( this, SpellDialog, IgnoreAllHdl ) );
- aUndoPB.SetClickHdl(LINK( this, SpellDialog, UndoHdl ) );
-
- aAutoCorrPB.SetClickHdl( LINK( this, SpellDialog, ExtClickHdl ) );
- aCheckGrammarCB.SetClickHdl( LINK( this, SpellDialog, CheckGrammarHdl ));
- aOptionsPB .SetClickHdl( LINK( this, SpellDialog, ExtClickHdl ) );
-
- aSuggestionLB.SetDoubleClickHdl( LINK( this, SpellDialog, ChangeHdl ) );
-
- aSentenceED.SetModifyHdl(LINK ( this, SpellDialog, ModifyHdl) );
- aAddToDictMB.SetSelectHdl(LINK ( this, SpellDialog, AddToDictionaryHdl ) );
- aLanguageLB.SetSelectHdl(LINK( this, SpellDialog, LanguageSelectHdl ) );
-
- // initialize language ListBox
- aLanguageLB.SetLanguageList( LANG_LIST_SPELL_USED, sal_False, sal_False, sal_True );
-
- // get current language
- UpdateBoxes_Impl();
-
- // fill dictionary PopupMenu
- InitUserDicts();
-
- aSentenceED.ClearModifyFlag();
- SvxGetChangeAllList()->clear();
-}
-
-// -----------------------------------------------------------------------
-
-void SpellDialog::UpdateBoxes_Impl()
-{
- sal_Int32 i;
- aSuggestionLB.Clear();
-
- const SpellErrorDescription* pSpellErrorDescription = aSentenceED.GetAlternatives();
-
- LanguageType nAltLanguage = LANGUAGE_NONE;
- Sequence< ::rtl::OUString > aNewWords;
- bool bIsGrammarError = false;
- if( pSpellErrorDescription )
- {
- nAltLanguage = SvxLocaleToLanguage( pSpellErrorDescription->aLocale );
- aNewWords = pSpellErrorDescription->aSuggestions;
- bIsGrammarError = pSpellErrorDescription->bIsGrammarError;
- aExplainPB.SetExplanation(pSpellErrorDescription->sExplanation );
- }
- if( pSpellErrorDescription && pSpellErrorDescription->sDialogTitle.getLength() )
- {
- // use this function to apply the correct image to be used...
- SetTitle_Impl( nAltLanguage );
- // then change the title to the one to be actually used
- SetText( pSpellErrorDescription->sDialogTitle );
- }
- else
- SetTitle_Impl( nAltLanguage );
- SetSelectedLang_Impl( nAltLanguage );
-
- // Alternativen eintragen
- const ::rtl::OUString *pNewWords = aNewWords.getConstArray();
- const sal_Int32 nSize = aNewWords.getLength();
- for ( i = 0; i < nSize; ++i )
- {
- String aTmp( pNewWords[i] );
- if ( LISTBOX_ENTRY_NOTFOUND == aSuggestionLB.GetEntryPos( aTmp ) )
- {
- aSuggestionLB.InsertEntry( aTmp );
- aSuggestionLB.SetEntryFlags(aSuggestionLB.GetEntryCount() - 1, LISTBOX_ENTRY_FLAG_MULTILINE);
- }
- }
- if(!nSize)
- aSuggestionLB.InsertEntry( aNoSuggestionsST );
- aAutoCorrPB.Enable( nSize > 0 );
-
- aSuggestionFT.Enable(nSize > 0);
- aSuggestionLB.Enable(nSize > 0);
- if( nSize )
- {
- aSuggestionLB.SelectEntryPos(0);
- }
- aChangePB.Enable( nSize > 0);
- aChangeAllPB.Enable(nSize > 0);
- bool bShowChangeAll = !bIsGrammarError;
- aChangeAllPB.Show( bShowChangeAll );
- aExplainPB.Show( !bShowChangeAll );
- aLanguageLB.Enable( bShowChangeAll );
- aIgnoreAllPB.Show( bShowChangeAll );
- aAddToDictMB.Show( bShowChangeAll );
- aIgnoreRulePB.Show( !bShowChangeAll );
- aIgnoreRulePB.Enable(pSpellErrorDescription && pSpellErrorDescription->sRuleId.getLength());
- aExplainPB.Enable( aExplainPB.HasExplanation() );
- aAutoCorrPB.Show( bShowChangeAll && rParent.HasAutoCorrection() );
-
-}
-// -----------------------------------------------------------------------
-
-void SpellDialog::SpellContinue_Impl(bool bUseSavedSentence, bool bIgnoreCurrentError )
-{
- //initially or after the last error of a sentence MarkNextError will fail
- //then GetNextSentence() has to be called followed again by MarkNextError()
- //MarkNextError is not initally called if the UndoEdit mode is active
- bool bNextSentence = false;
- if((!aSentenceED.IsUndoEditMode() && aSentenceED.MarkNextError( bIgnoreCurrentError )) ||
- true == ( bNextSentence = GetNextSentence_Impl(bUseSavedSentence, aSentenceED.IsUndoEditMode()) && aSentenceED.MarkNextError( false )))
- {
- const SpellErrorDescription* pSpellErrorDescription = aSentenceED.GetAlternatives();
- if( pSpellErrorDescription )
- {
- UpdateBoxes_Impl();
- Control* aControls[] =
- {
- &aNotInDictFT,
- &aSentenceED,
- &aLanguageFT,
- 0
- };
- sal_Int32 nIdx = 0;
- do
- {
- aControls[nIdx]->Enable(sal_True);
- }
- while(aControls[++nIdx]);
-
- }
- if( bNextSentence )
- {
- //remove undo if a new sentence is active
- aSentenceED.ResetUndo();
- aUndoPB.Enable(sal_False);
- }
- }
-}
-/* Initialize, asynchronous to prevent virtial calls
- from a constructor
- */
-IMPL_STATIC_LINK( SpellDialog, InitHdl, SpellDialog *, EMPTYARG )
-{
- pThis->SetUpdateMode( sal_False );
- //show or hide AutoCorrect depending on the modules abilities
- pThis->aAutoCorrPB.Show(pThis->rParent.HasAutoCorrection());
- pThis->SpellContinue_Impl();
- pThis->aSentenceED.ResetUndo();
- pThis->aUndoPB.Enable(sal_False);
-
- pThis->LockFocusChanges(true);
- if( pThis->aChangePB.IsEnabled() )
- pThis->aChangePB.GrabFocus();
- else if( pThis->aIgnorePB.IsEnabled() )
- pThis->aIgnorePB.GrabFocus();
- else if( pThis->aClosePB.IsEnabled() )
- pThis->aClosePB.GrabFocus();
- pThis->LockFocusChanges(false);
- //show grammar CheckBox depending on the modules abilities
- bool bHasGrammarChecking = pThis->rParent.HasGrammarChecking();
- pThis->aCheckGrammarCB.Show( bHasGrammarChecking );
- if( !bHasGrammarChecking )
- {
- //resize the dialog to hide the hidden area of the CheckBox
- Size aBackSize = pThis->aBackgroundGB.GetSizePixel();
- sal_Int32 nDiff = pThis->aBackgroundGB.GetPosPixel().Y() + aBackSize.Height()
- - pThis->aCheckGrammarCB.GetPosPixel().Y();
- aBackSize.Height() -= nDiff;
- pThis->aBackgroundGB.SetSizePixel(aBackSize);
- Button* aButtons[] = { &pThis->aHelpPB, &pThis->aOptionsPB, &pThis->aUndoPB, &pThis->aClosePB, 0 };
- sal_Int32 nButton = 0;
- while( aButtons[nButton])
- {
- Point aPos = aButtons[nButton]->GetPosPixel();
- aPos.Y() -= nDiff;
- aButtons[nButton]->SetPosPixel(aPos);
- ++nButton;
- }
- Size aDlgSize = pThis->GetSizePixel();
- aDlgSize.Height() -= nDiff;
- pThis->SetSizePixel( aDlgSize );
- }
- else
- {
- if( SvtLinguConfig().HasVendorImages( "SpellAndGrammarDialogImage" ) )
- {
- pThis->aVendorImageFI.Show();
- Size aVendorSize = pThis->aVendorImageFI.GetSizePixel();
- Size aImageSize = pThis->aVendorImageFI.GetImage().GetSizePixel();
- if( aImageSize.Height() )
- {
- aVendorSize.Height() = aImageSize.Height();
- if(aVendorSize.Width() < aImageSize.Width())
- aVendorSize.Width() = aImageSize.Width();
- pThis->aVendorImageFI.SetSizePixel( aVendorSize );
- }
- sal_Int32 nDiff = aVendorSize.Height();
- pThis->aVendorImageFI.SetSizePixel(aVendorSize);
- Control* aControls[] = {
- &pThis->aLanguageFT,
- &pThis->aLanguageLB,
- &pThis->aNotInDictFT,
- &pThis->aSentenceED,
- &pThis->aSuggestionFT,
- &pThis->aSuggestionLB,
- &pThis->aIgnorePB,
- &pThis->aIgnoreAllPB,
- &pThis->aIgnoreRulePB,
- &pThis->aAddToDictMB,
- &pThis->aChangePB,
- &pThis->aChangeAllPB,
- &pThis->aExplainPB,
- &pThis->aAutoCorrPB,
- &pThis->aCheckGrammarCB,
- &pThis->aHelpPB,
- &pThis->aOptionsPB,
- &pThis->aUndoPB,
- &pThis->aClosePB,
- &pThis->aBackgroundGB,
- 0
- };
- sal_Int32 nControl = 0;
- while( aControls[nControl])
- {
- Point aPos = aControls[nControl]->GetPosPixel();
- aPos.Y() += nDiff;
- aControls[nControl]->SetPosPixel(aPos);
- ++nControl;
- }
- Size aDlgSize = pThis->GetSizePixel();
- aDlgSize.Height() += nDiff;
- pThis->SetSizePixel( aDlgSize );
- pThis->Invalidate();
- }
- }
- pThis->aCheckGrammarCB.Check( pThis->rParent.IsGrammarChecking() );
- pThis->SetUpdateMode( sal_True );
- pThis->Show();
- return 0;
-};
-
-// -----------------------------------------------------------------------
-
-IMPL_LINK( SpellDialog, ExtClickHdl, Button *, pBtn )
-{
- if (&aOptionsPB == pBtn)
- StartSpellOptDlg_Impl();
- else if(&aAutoCorrPB == pBtn)
- {
- //get the currently selected wrong word
- String sCurrentErrorText = aSentenceED.GetErrorText();
- //get the wrong word from the XSpellAlternative
- const SpellErrorDescription* pSpellErrorDescription = aSentenceED.GetAlternatives();
- if( pSpellErrorDescription )
- {
- String sWrong(pSpellErrorDescription->sErrorText);
- //if the word has not been edited in the MultiLineEdit then
- //the current suggestion should be used
- //if it's not the 'no suggestions' entry
- if(sWrong == sCurrentErrorText &&
- aSuggestionLB.IsEnabled() && aSuggestionLB.GetSelectEntryCount() > 0 &&
- aNoSuggestionsST != aSuggestionLB.GetSelectEntry())
- {
- sCurrentErrorText = aSuggestionLB.GetSelectEntry();
- }
- if(sWrong != sCurrentErrorText)
- {
- SvxPrepareAutoCorrect( sWrong, sCurrentErrorText );
- LanguageType eLang = GetSelectedLang_Impl();
- rParent.AddAutoCorrection( sWrong, sCurrentErrorText, eLang );
- }
- }
- }
- return 0;
-}
-// -----------------------------------------------------------------------
-IMPL_LINK( SpellDialog, CheckGrammarHdl, CheckBox*, pBox )
-{
- rParent.SetGrammarChecking( pBox->IsChecked() );
- Impl_Restore();
- return 0;
-}
-
-void SpellDialog::StartSpellOptDlg_Impl()
-{
- sal_uInt16 aSpellInfos[] =
- {
- SID_ATTR_SPELL,SID_ATTR_SPELL,
- SID_SPELL_MODIFIED, SID_SPELL_MODIFIED,
- SID_AUTOSPELL_CHECK, SID_AUTOSPELL_CHECK,
- 0
- };
- SfxItemSet aSet( SFX_APP()->GetPool(), aSpellInfos);
- aSet.Put(SfxSpellCheckItem( xSpell, SID_ATTR_SPELL ));
- SfxSingleTabDialog* pDlg =
- new SfxSingleTabDialog( this, aSet, RID_SFXPAGE_LINGU );
- SfxTabPage* pPage = SvxLinguTabPage::Create( pDlg, aSet );
- ( (SvxLinguTabPage*)pPage )->HideGroups( GROUP_MODULES );
- pDlg->SetTabPage( pPage );
- if(RET_OK == pDlg->Execute())
- {
-
- // Benutzerb"ucher anzeigen
- InitUserDicts();
- const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
- if(pOutSet)
- OfaTreeOptionsDialog::ApplyLanguageOptions(*pOutSet);
- }
- delete pDlg;
-
-}
-
-// -----------------------------------------------------------------------
-
-IMPL_LINK( SpellDialog, ChangeHdl, Button *, EMPTYARG )
-{
- if(aSentenceED.IsUndoEditMode())
- {
- SpellContinue_Impl();
- }
- else
- {
- aSentenceED.UndoActionStart( SPELLUNDO_CHANGE_GROUP );
- String aString = aSentenceED.GetErrorText();
- //dots are sometimes part of the spelled word but they are not necessarily part of the replacement
- bool bDot = aString.Len() && aString.GetChar(aString.Len() - 1 ) == '.';
- if(aSuggestionLB.IsEnabled() &&
- aSuggestionLB.GetSelectEntryCount()>0 &&
- aNoSuggestionsST != aSuggestionLB.GetSelectEntry())
- aString = aSuggestionLB.GetSelectEntry();
- if(bDot && (!aString.Len() || aString.GetChar(aString.Len() - 1 ) != '.'))
- aString += '.';
-
- aSentenceED.ChangeMarkedWord(aString, GetSelectedLang_Impl());
- SpellContinue_Impl();
- bModified = false;
- aSentenceED.UndoActionEnd();
- }
- if(!aChangePB.IsEnabled())
- aIgnorePB.GrabFocus();
- return 1;
-}
-
-// -----------------------------------------------------------------------
-
-IMPL_LINK( SpellDialog, ChangeAllHdl, Button *, EMPTYARG )
-{
- aSentenceED.UndoActionStart( SPELLUNDO_CHANGE_GROUP );
- // change the current word first
- String aString = aSentenceED.GetErrorText();
- if(aSuggestionLB.IsEnabled() &&
- aSuggestionLB.GetSelectEntryCount()>0 &&
- aNoSuggestionsST != aSuggestionLB.GetSelectEntry())
- aString = aSuggestionLB.GetSelectEntry();
-
- LanguageType eLang = GetSelectedLang_Impl();
-
- // add new word to ChangeAll list
- String aOldWord( aSentenceED.GetErrorText() );
- SvxPrepareAutoCorrect( aOldWord, aString );
- Reference<XDictionary> aXDictionary( SvxGetChangeAllList(), UNO_QUERY );
- sal_uInt8 nAdded = linguistic::AddEntryToDic( aXDictionary,
- aOldWord , sal_True,
- aString, eLang );
-
- if(nAdded == DIC_ERR_NONE)
- {
- SpellUndoAction_Impl* pAction = new SpellUndoAction_Impl(
- SPELLUNDO_CHANGE_ADD_TO_DICTIONARY, aDialogUndoLink);
- pAction->SetDictionary(aXDictionary);
- pAction->SetAddedWord(aOldWord);
- aSentenceED.AddUndoAction(pAction);
- }
-
- aSentenceED.ChangeMarkedWord(aString, eLang);
- SpellContinue_Impl();
- bModified = false;
- aSentenceED.UndoActionEnd();
- return 1;
-}
-// -----------------------------------------------------------------------
-
-IMPL_LINK( SpellDialog, IgnoreAllHdl, Button *, pButton )
-{
- aSentenceED.UndoActionStart( SPELLUNDO_CHANGE_GROUP );
- // add word to IgnoreAll list
- Reference< XDictionary > aXDictionary( SvxGetIgnoreAllList(), UNO_QUERY );
- //in case the error has been changed manually it has to be restored
- aSentenceED.RestoreCurrentError();
- if( pButton == &aIgnoreRulePB )
- {
- const SpellErrorDescription* pSpellErrorDescription = aSentenceED.GetAlternatives();
- try
- {
- if( pSpellErrorDescription && pSpellErrorDescription->xGrammarChecker.is() )
- {
- pSpellErrorDescription->xGrammarChecker->ignoreRule( pSpellErrorDescription->sRuleId,
- pSpellErrorDescription->aLocale );
- }
- }
- catch( const uno::Exception& )
- {
- }
- }
- else
- {
- String sErrorText(aSentenceED.GetErrorText());
- sal_uInt8 nAdded = linguistic::AddEntryToDic( aXDictionary,
- sErrorText, sal_False,
- ::rtl::OUString(), LANGUAGE_NONE );
- if(nAdded == DIC_ERR_NONE)
- {
- SpellUndoAction_Impl* pAction = new SpellUndoAction_Impl(
- SPELLUNDO_CHANGE_ADD_TO_DICTIONARY, aDialogUndoLink);
- pAction->SetDictionary(aXDictionary);
- pAction->SetAddedWord(sErrorText);
- aSentenceED.AddUndoAction(pAction);
- }
- }
-
- SpellContinue_Impl();
- bModified = false;
- aSentenceED.UndoActionEnd();
- return 1;
-}
-
-//-----------------------------------------------------------------------
-IMPL_LINK( SpellDialog, UndoHdl, Button*, EMPTYARG )
-{
- aSentenceED.Undo();
- if(!aSentenceED.GetUndoActionCount())
- aUndoPB.Enable(sal_False);
- return 0;
-}
-
-//-----------------------------------------------------------------------
-IMPL_LINK( SpellDialog, DialogUndoHdl, SpellUndoAction_Impl*, pAction )
-{
- switch(pAction->GetId())
- {
- case SPELLUNDO_CHANGE_TEXTENGINE:
- {
- if(pAction->IsEnableChangePB())
- aChangePB.Enable(sal_False);
- if(pAction->IsEnableChangeAllPB())
- aChangeAllPB.Enable(sal_False);
- }
- break;
- case SPELLUNDO_CHANGE_NEXTERROR:
- {
- aSentenceED.MoveErrorMarkTo((sal_uInt16)pAction->GetOldErrorStart(), (sal_uInt16)pAction->GetOldErrorEnd(), false);
- if(pAction->IsErrorLanguageSelected())
- {
- UpdateBoxes_Impl();
- }
- }
- break;
- case SPELLUNDO_CHANGE_ADD_TO_DICTIONARY:
- {
- if(pAction->GetDictionary().is())
- pAction->GetDictionary()->remove(pAction->GetAddedWord());
- }
- break;
- case SPELLUNDO_MOVE_ERROREND :
- {
- if(pAction->GetOffset() != 0)
- aSentenceED.MoveErrorEnd(pAction->GetOffset());
- }
- break;
- case SPELLUNDO_UNDO_EDIT_MODE :
- {
- //refill the dialog with the currently spelled sentence - throw away all changes
- SpellContinue_Impl(true);
- }
- break;
- case SPELLUNDO_ADD_IGNORE_RULE:
- //undo of ignored rules is not supported
- break;
- }
-
- return 0;
-}
-// -----------------------------------------------------------------------
-void SpellDialog::Impl_Restore()
-{
- //clear the "ChangeAllList"
- SvxGetChangeAllList()->clear();
- //get a new sentence
- aSentenceED.SetText(rtl::OUString());
- aSentenceED.ResetModified();
- SpellContinue_Impl();
- aIgnorePB.SetText(aIgnoreOnceST);
-}
-
-IMPL_LINK( SpellDialog, IgnoreHdl, Button *, EMPTYARG )
-{
- if(aIgnorePB.GetText() == aResumeST)
- {
- Impl_Restore();
- }
- else
- {
- //in case the error has been changed manually it has to be restored,
- // since the users choice now was to ignore the error
- aSentenceED.RestoreCurrentError();
-
- // the word is being ignored
- SpellContinue_Impl( false, true );
- }
- return 1;
-}
-
-// -----------------------------------------------------------------------
-
-sal_Bool SpellDialog::Close()
-{
- GetBindings().GetDispatcher()->
- Execute(rParent.GetType(),
- SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
- return sal_True;
-}
-// -----------------------------------------------------------------------
-
-void SpellDialog::SetSelectedLang_Impl( LanguageType nLang )
-{
- aLanguageLB.SelectLanguage( nLang );
-}
-
-// -----------------------------------------------------------------------
-
-LanguageType SpellDialog::GetSelectedLang_Impl() const
-{
- sal_Int16 nLang = aLanguageLB.GetSelectLanguage();
- return nLang;
-}
-
-//-------------------------------------------------
-IMPL_LINK(SpellDialog, LanguageSelectHdl, SvxLanguageBox*, pBox)
-{
- //if currently an error is selected then search for alternatives for
- //this word and fill the alternatives ListBox accordingly
- String sError = aSentenceED.GetErrorText();
- aSuggestionLB.Clear();
- if(sError.Len())
- {
- LanguageType eLanguage = pBox->GetSelectLanguage();
- Reference <XSpellAlternatives> xAlt = xSpell->spell( sError, eLanguage,
- Sequence< PropertyValue >() );
- if( xAlt.is() )
- aSentenceED.SetAlternatives( xAlt );
- else
- {
- aSentenceED.ChangeMarkedWord( sError, eLanguage );
- SpellContinue_Impl();
- }
-
- aSentenceED.AddUndoAction(new SpellUndoAction_Impl(SPELLUNDO_CHANGE_LANGUAGE, aDialogUndoLink));
- }
- SpellDialog::UpdateBoxes_Impl();
- return 0;
-}
-// -----------------------------------------------------------------------
-
-void SpellDialog::SetLanguage( sal_uInt16 nLang )
-
-/* [Beschreibung]
-
- wenn die Sprache im Thesaurus umgestellt wurde,
- muss auch hier die Sprache umgestellt werden.
-*/
-
-{
- SetTitle_Impl( nLang );
-
- // den richtigen Eintrag finden, da sortiert
- aLanguageLB.SelectLanguage( nLang );
-}
-
-static Image lcl_GetImageFromPngUrl( const ::rtl::OUString &rFileUrl )
-{
- Image aRes;
- ::rtl::OUString aTmp;
- osl::FileBase::getSystemPathFromFileURL( rFileUrl, aTmp );
- Graphic aGraphic;
- const String aFilterName( RTL_CONSTASCII_USTRINGPARAM( IMP_PNG ) );
- if( GRFILTER_OK == GraphicFilter::LoadGraphic( aTmp, aFilterName, aGraphic ) )
- {
- aRes = Image( aGraphic.GetBitmapEx() );
- }
- return aRes;
-}
-void SpellDialog::SetTitle_Impl(LanguageType nLang)
-{
- String sTitle( m_sTitleSpelling );
- if( rParent.HasGrammarChecking() )
- {
- String sVendor;
- const SpellErrorDescription* pSpellErrorDescription = aSentenceED.GetAlternatives();
- if( pSpellErrorDescription && pSpellErrorDescription->sServiceName.getLength() )
- {
- ::rtl::OUString sSuggestionImageUrl =
- SvtLinguConfig().GetSpellAndGrammarDialogImage( pSpellErrorDescription->sServiceName );
- aVendorImageFI.SetImage( lcl_GetImageFromPngUrl( sSuggestionImageUrl ) );
- uno::Reference< lang::XServiceDisplayName > xDisplayName( pSpellErrorDescription->xGrammarChecker, uno::UNO_QUERY );
- if( xDisplayName.is() )
- sVendor = xDisplayName->getServiceDisplayName( pSpellErrorDescription->aLocale );
- }
- else
- {
- aVendorImageFI.SetImage( aVendorImage );
- }
-
- if( sVendor.Len() )
- {
- sTitle = m_sTitleSpellingGrammarVendor;
- sTitle.SearchAndReplaceAscii( "$VendorName", sVendor );
- }
- else
- {
- sTitle = m_sTitleSpellingGrammar;
- }
- }
- sTitle.SearchAndReplaceAscii( "$LANGUAGE ($LOCATION)", SvtLanguageTable::GetLanguageString(nLang) );
- SetText( sTitle );
-}
-
-void SpellDialog::InitUserDicts()
-{
- const LanguageType nLang = aLanguageLB.GetSelectLanguage();
-
- const Reference< XDictionary > *pDic = 0;
-
- // get list of dictionaries
- Reference< XDictionaryList > xDicList( SvxGetDictionaryList() );
- if (xDicList.is())
- {
- // add active, positive dictionary to dic-list (if not already done).
- // This is to ensure that there is at least on dictionary to which
- // words could be added.
- Reference< XDictionary > xDic( SvxGetOrCreatePosDic( xDicList ) );
- if (xDic.is())
- xDic->setActive( sal_True );
-
- pImpl->aDics = xDicList->getDictionaries();
- }
-
- SvtLinguConfig aCfg;
-
- // list suitable dictionaries
- bool bEnable = false;
- const sal_Int32 nSize = pImpl->aDics.getLength();
- pDic = pImpl->aDics.getConstArray();
- delete aAddToDictMB.GetPopupMenu();
- PopupMenu* pMenu = new PopupMenu;
- pMenu->SetMenuFlags(MENU_FLAG_NOAUTOMNEMONICS);
- sal_uInt16 nItemId = 1; // menu items should be enumerated from 1 and not 0
- for (sal_Int32 i = 0; i < nSize; ++i)
- {
- uno::Reference< linguistic2::XDictionary > xDicTmp( pDic[i], uno::UNO_QUERY );
- if (!xDicTmp.is() || SvxGetIgnoreAllList() == xDicTmp)
- continue;
-
- uno::Reference< frame::XStorable > xStor( xDicTmp, uno::UNO_QUERY );
- LanguageType nActLanguage = SvxLocaleToLanguage( xDicTmp->getLocale() );
- if( xDicTmp->isActive()
- && xDicTmp->getDictionaryType() != linguistic2::DictionaryType_NEGATIVE
- && (nLang == nActLanguage || LANGUAGE_NONE == nActLanguage )
- && (!xStor.is() || !xStor->isReadonly()) )
- {
- pMenu->InsertItem( nItemId, xDicTmp->getName() );
- bEnable = sal_True;
-
- uno::Reference< lang::XServiceInfo > xSvcInfo( xDicTmp, uno::UNO_QUERY );
- if (xSvcInfo.is())
- {
- OUString aDictionaryImageUrl( aCfg.GetSpellAndGrammarContextDictionaryImage(
- xSvcInfo->getImplementationName()) );
- if (aDictionaryImageUrl.getLength() > 0)
- {
- Image aImage( lcl_GetImageFromPngUrl( aDictionaryImageUrl ) );
- pMenu->SetItemImage( nItemId, aImage );
- }
- }
-
- ++nItemId;
- }
- }
- aAddToDictMB.SetPopupMenu(pMenu);
- aAddToDictMB.Enable( bEnable );
-}
-
-//-----------------------------------------------------------------------
-IMPL_LINK(SpellDialog, AddToDictionaryHdl, MenuButton*, pButton )
-{
- aSentenceED.UndoActionStart( SPELLUNDO_CHANGE_GROUP );
-
- //GetErrorText() returns the current error even if the text is already
- //manually changed
- const String aNewWord= aSentenceED.GetErrorText();
-
- sal_uInt16 nItemId = pButton->GetCurItemId();
- PopupMenu *pMenu = pButton->GetPopupMenu();
- String aDicName ( pMenu->GetItemText( nItemId ) );
-
- uno::Reference< linguistic2::XDictionary > xDic;
- uno::Reference< linguistic2::XDictionaryList > xDicList( SvxGetDictionaryList() );
- if (xDicList.is())
- xDic = xDicList->getDictionaryByName( aDicName );
-
- sal_Int16 nAddRes = DIC_ERR_UNKNOWN;
- if (xDic.is())
- {
- nAddRes = linguistic::AddEntryToDic( xDic, aNewWord, sal_False, OUString(), LANGUAGE_NONE );
- // save modified user-dictionary if it is persistent
- uno::Reference< frame::XStorable > xSavDic( xDic, uno::UNO_QUERY );
- if (xSavDic.is())
- xSavDic->store();
-
- if (nAddRes == DIC_ERR_NONE)
- {
- SpellUndoAction_Impl* pAction = new SpellUndoAction_Impl(
- SPELLUNDO_CHANGE_ADD_TO_DICTIONARY, aDialogUndoLink);
- pAction->SetDictionary( xDic );
- pAction->SetAddedWord( aNewWord );
- aSentenceED.AddUndoAction( pAction );
- }
- // failed because there is already an entry?
- if (DIC_ERR_NONE != nAddRes && xDic->getEntry( aNewWord ).is())
- nAddRes = DIC_ERR_NONE;
- }
- if (DIC_ERR_NONE != nAddRes)
- {
- SvxDicError( this, nAddRes );
- return 0; // Nicht weitermachen
- }
-
- // go on
- SpellContinue_Impl();
- aSentenceED.UndoActionEnd();
- return 0;
-}
-
-//-----------------------------------------------------------------------
-IMPL_LINK(SpellDialog, ModifyHdl, SentenceEditWindow_Impl*, pEd)
-{
- if (&aSentenceED == pEd)
- {
- bModified = true;
- aSuggestionLB.SetNoSelection();
- aSuggestionLB.Disable();
- String sNewText( aSentenceED.GetText() );
- aAutoCorrPB.Enable( sNewText != aSentenceED.GetText() );
- SpellUndoAction_Impl* pSpellAction = new SpellUndoAction_Impl(SPELLUNDO_CHANGE_TEXTENGINE, aDialogUndoLink);
- if(!aChangeAllPB.IsEnabled())
- {
- aChangeAllPB.Enable();
- pSpellAction->SetEnableChangeAllPB();
- }
- if(!aChangePB.IsEnabled())
- {
- aChangePB.Enable();
- pSpellAction->SetEnableChangePB();
- }
- aSentenceED.AddUndoAction(pSpellAction);
- }
- return 0;
-};
-
-//-----------------------------------------------------------------------
-IMPL_LINK(SpellDialog, CancelHdl, Button *, EMPTYARG )
-{
- //apply changes and ignored text parts first - if there are any
- rParent.ApplyChangedSentence(aSentenceED.CreateSpellPortions(true), false);
- Close();
- return 0;
-}
-
-//-----------------------------------------------------------------------
-void SpellDialog::Paint( const Rectangle& rRect )
-{
- ModelessDialog::Paint(rRect );
- Rectangle aRect(aBackgroundGB.GetPosPixel(), aBackgroundGB.GetSizePixel());
- DecorationView aDecoView( this );
- aDecoView.DrawButton( aRect, BUTTON_DRAW_NOFILL);
-}
-
-//-----------------------------------------------------------------------
-long SpellDialog::Notify( NotifyEvent& rNEvt )
-{
- /* #i38338#
- * FIXME: LoseFocus and GetFocus are signals from vcl that
- * a window actually got/lost the focus, it never should be
- * forwarded from another window, that is simply wrong.
- * FIXME: overloading the virtual methods GetFocus and LoseFocus
- * in SpellDialogChildWindow by making them pure is at least questionable.
- * The only sensible thing would be to call the new Method differently,
- * e.g. DialogGot/LostFocus or so.
- */
- if( IsVisible() && !bFocusLocked )
- {
- if( rNEvt.GetType() == EVENT_GETFOCUS )
- {
- //notify the child window of the focus change
- rParent.GetFocus();
- }
- else if( rNEvt.GetType() == EVENT_LOSEFOCUS )
- {
- //notify the child window of the focus change
- rParent.LoseFocus();
- }
- }
- return SfxModelessDialog::Notify(rNEvt);
-}
-
-//-------------------------------------------------
-void SpellDialog::InvalidateDialog()
-{
- if( bFocusLocked )
- return;
- aIgnorePB.SetText(aResumeST);
- Window* aDisableArr[] =
- {
- &aNotInDictFT,
- &aSentenceED,
- &aSuggestionFT,
- &aSuggestionLB,
- &aLanguageFT,
- &aLanguageLB,
- &aIgnoreAllPB,
- &aIgnoreRulePB,
- &aAddToDictMB,
- &aChangePB,
- &aChangeAllPB,
- &aAutoCorrPB,
- &aUndoPB,
- 0
- };
- sal_Int16 i = 0;
- while(aDisableArr[i])
- {
- aDisableArr[i]->Enable(sal_False);
- i++;
- }
- SfxModelessDialog::Deactivate();
-}
-
-//-----------------------------------------------------------------------
-bool SpellDialog::GetNextSentence_Impl(bool bUseSavedSentence, bool bRecheck)
-{
- bool bRet = false;
- if(!bUseSavedSentence)
- {
- //apply changes and ignored text parts
- rParent.ApplyChangedSentence(aSentenceED.CreateSpellPortions(true), bRecheck);
- }
- aSentenceED.ResetIgnoreErrorsAt();
- aSentenceED.ResetModified();
- SpellPortions aSentence = bUseSavedSentence ? m_aSavedSentence : rParent.GetNextWrongSentence( bRecheck );
- if(!bUseSavedSentence)
- m_aSavedSentence = aSentence;
- bool bHasReplaced = false;
- while(aSentence.size())
- {
- //apply all changes that are already part of the "ChangeAllList"
- //returns true if the list still contains errors after the changes have been applied
-
- if(!ApplyChangeAllList_Impl(aSentence, bHasReplaced))
- {
- rParent.ApplyChangedSentence(aSentence, bRecheck);
- aSentence = rParent.GetNextWrongSentence( bRecheck );
- }
- else
- break;
- }
-
- if(aSentence.size())
- {
- SpellPortions::iterator aStart = aSentence.begin();
- rtl::OUString sText;
- while(aStart != aSentence.end())
- {
- // hidden text has to be ignored
- if(!aStart->bIsHidden)
- sText += aStart->sText;
- ++aStart;
- }
- aSentenceED.SetText(sText);
- aStart = aSentence.begin();
- sal_Int32 nStartPosition = 0;
- sal_Int32 nEndPosition = 0;
-
- while(aStart != aSentence.end())
- {
- // hidden text has to be ignored
- if(!aStart->bIsHidden)
- {
- nEndPosition += aStart->sText.getLength();
- if(aStart->xAlternatives.is())
- {
- uno::Reference< container::XNamed > xNamed( aStart->xAlternatives, uno::UNO_QUERY );
- ::rtl::OUString sServiceName;
- if( xNamed.is() )
- sServiceName = xNamed->getName();
- SpellErrorDescription aDesc( false, aStart->xAlternatives->getWord(),
- aStart->xAlternatives->getLocale(), aStart->xAlternatives->getAlternatives(), 0, sServiceName);
- aSentenceED.SetAttrib( SpellErrorAttrib(aDesc), 0, (sal_uInt16) nStartPosition, (sal_uInt16) nEndPosition );
- }
- else if(aStart->bIsGrammarError )
- {
- uno::Reference< lang::XServiceInfo > xInfo( aStart->xGrammarChecker, uno::UNO_QUERY );
- SpellErrorDescription aDesc( true,
- aStart->sText,
- SvxCreateLocale( aStart->eLanguage ),
- aStart->aGrammarError.aSuggestions,
- aStart->xGrammarChecker,
- xInfo->getImplementationName(),
- &aStart->sDialogTitle,
- &aStart->aGrammarError.aFullComment,
- &aStart->aGrammarError.aRuleIdentifier );
- aSentenceED.SetAttrib( SpellErrorAttrib(aDesc), 0, (sal_uInt16) nStartPosition, (sal_uInt16) nEndPosition );
- }
- if(aStart->bIsField)
- aSentenceED.SetAttrib( SpellBackgroundAttrib(COL_LIGHTGRAY), 0, (sal_uInt16) nStartPosition, (sal_uInt16) nEndPosition );
- aSentenceED.SetAttrib( SpellLanguageAttrib(aStart->eLanguage), 0, (sal_uInt16) nStartPosition, (sal_uInt16) nEndPosition );
- nStartPosition = nEndPosition;
- }
- ++aStart;
- }
- //the edit field needs to be modified to apply the change from the ApplyChangeAllList
- if(!bHasReplaced)
- aSentenceED.ClearModifyFlag();
- aSentenceED.ResetUndo();
- aUndoPB.Enable(sal_False);
- bRet = nStartPosition > 0;
- }
- return bRet;
-}
-/*-------------------------------------------------------------------------
- replace errrors that have a replacement in the ChangeAllList
- returns false if the result doesn't contain errors after the replacement
- -----------------------------------------------------------------------*/
-bool SpellDialog::ApplyChangeAllList_Impl(SpellPortions& rSentence, bool &bHasReplaced)
-{
- bHasReplaced = false;
- bool bRet = true;
- SpellPortions::iterator aStart = rSentence.begin();
- Reference<XDictionary> xChangeAll( SvxGetChangeAllList(), UNO_QUERY );
- if(!xChangeAll->getCount())
- return bRet;
- bRet = false;
- while(aStart != rSentence.end())
- {
- if(aStart->xAlternatives.is())
- {
- Reference<XDictionaryEntry> xEntry = xChangeAll->getEntry( aStart->sText );
- if(xEntry.is())
- {
- aStart->sText = xEntry->getReplacementText();
- aStart->xAlternatives = 0;
- bHasReplaced = true;
- }
- else
- bRet = true;
- }
- else if( aStart->bIsGrammarError )
- bRet = true;
- ++aStart;
- }
- return bRet;
-}
-
-//-----------------------------------------------------------------------
-SentenceEditWindow_Impl::SentenceEditWindow_Impl( SpellDialog* pParent, const ResId& rResId ) :
- MultiLineEdit( pParent, rResId ),
- m_nErrorStart(0),
- m_nErrorEnd(0),
- m_bIsUndoEditMode(false)
-{
- DisableSelectionOnFocus();
-}
-
-//-----------------------------------------------------------------------
-SentenceEditWindow_Impl::~SentenceEditWindow_Impl()
-{
-}
-/*-------------------------------------------------------------------------
- The selection before inputting a key may have a range or not
- and it may be inside or outside of field or error attributes.
- A range may include the attribute partially, completely or together
- with surrounding text. It may also contain more than one attribute
- or no attribute at all.
- Depending on this starting conditions some actions are necessary:
- Attempts to delete a field are only allowed if the selection is the same
- as the field's selection. Otherwise the field has to be selected and the key
- input action has to be skipped.
- Input of text at the start of the field requires the field attribute to be
- corrected - it is not allowed to grow.
-
- In case of errors the appending of text should grow the error attribute because
- that is what the user usually wants to do.
-
- Backspace at the start of the attribute requires to find out if a field ends
- directly in front of the cursor position. In case of a field this attribute has to be
- selected otherwise the key input method is allowed.
-
- All changes outside of the error attributes switch the dialog mode to a "Undo edit" state that
- removes all visible attributes and switches off further attribute checks.
- Undo in this restarts the dialog with a current sentence newly presented.
- All changes to the sentence are undone including the ones before the "Undo edit state" has been reached
-
- We end up with 9 types of selection
- 1 (LEFT_NO) - no range, start of attribute - can also be 3 at the same time
- 2 (INSIDE_NO) - no range, inside of attribute
- 3 (RIGHT_NO) - no range, end of attribute - can also be 1 at the same time
- 4 (FULL) - range, same as attribute
- 5 (INSIDE_YES) - range, inside of the attribute
- 6 (BRACE)- range, from outside of the attribute to the inside or
- including the complete attribute and something outside,
- maybe more than one attribute
- 7 (OUTSIDE_NO) - no range, not at an attribute
- 8 (OUTSIDE_YES) - range, completely outside of all attributes
-
- What has to be done depending on the attribute type involved
- possible actions: UE - Undo edit mode
- CO - Continue, no additional action is required
- FS - Field has to be completely selected
- EX - The attribute has to be expanded to include the added text
-
- 1 - backspace delete any other
- UE on field FS on error CO on field FS on error CO
-
- 2 - on field FS on error C
- 3 - backspace delete any other
- on field FS on error CO UE on field UE on error EX
-
- if 1 and 3 happen to apply both then backspace and other handling is 1 delete is 3
-
- 4 - on field UE and on error CO
- 5 - on field FS and on error CO
- 6 - on field FS and on error UE
- 7 - UE
- 8 - UE
- -----------------------------------------------------------------------*/
-#define INVALID 0
-#define LEFT_NO 1
-#define INSIDE_NO 2
-#define RIGHT_NO 3
-#define FULL 4
-#define INSIDE_YES 5
-#define BRACE 6
-#define OUTSIDE_NO 7
-#define OUTSIDE_YES 8
-
-#define ACTION_UNDOEDIT 0
-#define ACTION_CONTINUE 1
-#define ACTION_SELECTFIELD 2
-#define ACTION_EXPAND 3
-
-long SentenceEditWindow_Impl::PreNotify( NotifyEvent& rNEvt )
-{
- bool bChange = false;
- const TextCharAttrib* pErrorAttrib = 0;
- if(rNEvt.GetType() == EVENT_KEYINPUT)
- {
- const KeyEvent& rKeyEvt = *rNEvt.GetKeyEvent();
- bChange = TextEngine::DoesKeyChangeText( rKeyEvt );
- if(bChange && !IsUndoEditMode() &&
- rKeyEvt.GetKeyCode().GetCode() != KEY_TAB)
- {
- TextEngine* pTextEngine = GetTextEngine();
- TextView* pTextView = pTextEngine->GetActiveView();
- const TextSelection& rCurrentSelection = pTextView->GetSelection();
- //determine if the selection contains a field
- bool bHasField = false;
- bool bHasError = false;
- bool bHasFieldLeft = false;
- bool bHasErrorLeft = false;
-
- bool bHasRange = rCurrentSelection.HasRange();
- sal_uInt8 nSelectionType = 0; // invalid type!
-
- TextPaM aCursor(rCurrentSelection.GetStart());
- const TextCharAttrib* pBackAttr = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_BACKGROUND );
- const TextCharAttrib* pErrorAttr = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_ERROR );
- const TextCharAttrib* pBackAttrLeft = 0;
- const TextCharAttrib* pErrorAttrLeft = 0;
-
- bHasField = pBackAttr != 0 && (bHasRange || pBackAttr->GetEnd() > aCursor.GetIndex());
- bHasError = pErrorAttr != 0 && (bHasRange || pErrorAttr->GetEnd() > aCursor.GetIndex());
- if(bHasRange)
- {
- if(pBackAttr &&
- pBackAttr->GetStart() == rCurrentSelection.GetStart().GetIndex() &&
- pBackAttr->GetEnd() == rCurrentSelection.GetEnd().GetIndex())
- {
- nSelectionType = FULL;
- }
- else if(pErrorAttr &&
- pErrorAttr->GetStart() <= rCurrentSelection.GetStart().GetIndex() &&
- pErrorAttr->GetEnd() >= rCurrentSelection.GetEnd().GetIndex())
- {
- nSelectionType = INSIDE_YES;
- }
- else
- {
- nSelectionType = bHasField||bHasError ? BRACE : OUTSIDE_NO;
- while(aCursor.GetIndex() < rCurrentSelection.GetEnd().GetIndex())
- {
- ++aCursor.GetIndex();
- const TextCharAttrib* pIntBackAttr = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_BACKGROUND );
- const TextCharAttrib* pIntErrorAttr = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_ERROR );
- //if any attr has been found then BRACE
- if(pIntBackAttr || pIntErrorAttr)
- nSelectionType = BRACE;
- //the field has to be selected
- if(pIntBackAttr && !pBackAttr)
- pBackAttr = pIntBackAttr;
- bHasField |= pIntBackAttr != 0;
- }
- }
- }
- else
- {
- //no range selection: then 1 2 3 and 8 are possible
- const TextCharAttrib* pCurAttr = pBackAttr ? pBackAttr : pErrorAttr;
- if(pCurAttr)
- {
- nSelectionType = pCurAttr->GetStart() == rCurrentSelection.GetStart().GetIndex() ?
- LEFT_NO : pCurAttr->GetEnd() == rCurrentSelection.GetEnd().GetIndex() ? RIGHT_NO : INSIDE_NO;
- }
- else
- nSelectionType = OUTSIDE_NO;
-
- bHasFieldLeft = pBackAttr && pBackAttr->GetEnd() == aCursor.GetIndex();
- if(bHasFieldLeft)
- {
- pBackAttrLeft = pBackAttr;
- pBackAttr = 0;
- }
- bHasErrorLeft = pErrorAttr && pErrorAttr->GetEnd() == aCursor.GetIndex();
- if(bHasErrorLeft)
- {
- pErrorAttrLeft = pErrorAttr;
- pErrorAttr = 0;
- }
-
- //check previous position if this exists
- //that is a redundant in the case the the attribute found above already is on the left cursor side
- //but it's o.k. for two errors/fields side by side
- if(aCursor.GetIndex())
- {
- --aCursor.GetIndex();
- pBackAttrLeft = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_BACKGROUND );
- pErrorAttrLeft = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_ERROR );
- bHasFieldLeft = pBackAttrLeft !=0;
- bHasErrorLeft = pErrorAttrLeft != 0;
- ++aCursor.GetIndex();
- }
- }
- //Here we have to determine if the error found is the one currently active
- bool bIsErrorActive = (pErrorAttr && pErrorAttr->GetStart() == m_nErrorStart) ||
- (pErrorAttrLeft && pErrorAttrLeft->GetStart() == m_nErrorStart);
-
- DBG_ASSERT(nSelectionType != INVALID, "selection type not set!");
-
- const KeyCode& rKeyCode = rKeyEvt.GetKeyCode();
- bool bDelete = rKeyCode.GetCode() == KEY_DELETE;
- bool bBackspace = rKeyCode.GetCode() == KEY_BACKSPACE;
-
- sal_Int8 nAction = ACTION_CONTINUE;
- switch(nSelectionType)
- {
-// 1 - backspace delete any other
-// UE on field FS on error CO on field FS on error CO
- case LEFT_NO :
- if(bBackspace)
- {
- nAction = bHasFieldLeft ? ACTION_SELECTFIELD : ACTION_UNDOEDIT;
- //to force the use of pBackAttrLeft
- pBackAttr = 0;
- }
- else if(bDelete)
- nAction = bHasField ? ACTION_SELECTFIELD : ACTION_CONTINUE;
- else
- nAction = bHasError && !aCursor.GetIndex() ? ACTION_CONTINUE :
- bHasError ? ACTION_EXPAND : bHasErrorLeft ? ACTION_CONTINUE : ACTION_UNDOEDIT;
- break;
-// 2 - on field FS on error C
- case INSIDE_NO :
- nAction = bHasField ? ACTION_SELECTFIELD :
- bIsErrorActive ? ACTION_CONTINUE : ACTION_UNDOEDIT;
- break;
-// 3 - backspace delete any other
-// on field FS on error CO UE on field UE on error EX
- case RIGHT_NO :
- if(bBackspace)
- nAction = bHasFieldLeft ? ACTION_SELECTFIELD : ACTION_CONTINUE;
- else if(bDelete)
- nAction = bHasFieldLeft && bHasError ? ACTION_CONTINUE : ACTION_UNDOEDIT;
- else
- nAction = bHasFieldLeft && bHasError ? ACTION_EXPAND :
- bHasError ? ACTION_CONTINUE : bHasErrorLeft ? ACTION_EXPAND :ACTION_UNDOEDIT;
- break;
-// 4 - on field UE and on error CO
- case FULL :
- nAction = bHasField ? ACTION_UNDOEDIT : ACTION_CONTINUE;
- break;
-// 5 - on field FS and on error CO
- case INSIDE_YES :
- nAction = bHasField ? ACTION_SELECTFIELD : ACTION_CONTINUE;
- break;
-// 6 - on field FS and on error UE
- case BRACE :
- nAction = bHasField ? ACTION_SELECTFIELD : ACTION_UNDOEDIT;;
- break;
-// 7 - UE
-// 8 - UE
- case OUTSIDE_NO :
- case OUTSIDE_YES:
- nAction = ACTION_UNDOEDIT;
- break;
- }
- //save the current paragraph
- sal_uInt16 nCurrentLen = GetText().Len();
- if(nAction != ACTION_SELECTFIELD)
- pTextView->GetWindow()->KeyInput(rKeyEvt);
- else
- {
- const TextCharAttrib* pCharAttr = pBackAttr ? pBackAttr : pBackAttrLeft;
- if(pCharAttr)
- {
- TextPaM aStart(0, pCharAttr->GetStart());
- TextPaM aEnd(0, pCharAttr->GetEnd());
- TextSelection aNewSel(aStart, aEnd);
- pTextView->SetSelection( aNewSel);
- }
- }
- if(nAction == ACTION_EXPAND)
- {
- DBG_ASSERT(pErrorAttrLeft || pErrorAttr, "where is the error");
- //text has been added on the right and only the 'error attribute has to be corrected
- if(pErrorAttrLeft)
- {
- TextAttrib* pNewError = NULL;
- sal_uInt16 nStart = pErrorAttrLeft->GetStart();
- sal_uInt16 nEnd = pErrorAttrLeft->GetEnd();
- pTextEngine->RemoveAttrib( 0, *pErrorAttrLeft );
- SetAttrib( *pNewError, 0, nStart, ++nEnd );
- //only active errors move the mark
- if(bIsErrorActive)
- {
- bool bGrammar = static_cast<const SpellErrorAttrib&>(*pNewError).GetErrorDescription().bIsGrammarError;
- MoveErrorMarkTo(nStart, nEnd, bGrammar);
- }
- delete pNewError;
- }
- //text has been added on the left then the error attribute has to be expanded and the
- //field attribute on the right - if any - has to be contracted
- else if(pErrorAttr)
- {
- //determine the change
- sal_uInt16 nAddedChars = GetText().Len() - nCurrentLen;
-
- TextAttrib* pNewError = NULL;
- sal_uInt16 nStart = pErrorAttr->GetStart();
- sal_uInt16 nEnd = pErrorAttr->GetEnd();
- pTextEngine->RemoveAttrib( 0, *pErrorAttr );
- nStart = nStart - (sal_uInt16)nAddedChars;
- SetAttrib( *pNewError, 0, nStart - nAddedChars, nEnd );
- //only if the error is active the mark is moved here
- if(bIsErrorActive)
- {
- bool bGrammar = static_cast<const SpellErrorAttrib&>(*pNewError).GetErrorDescription().bIsGrammarError;
- MoveErrorMarkTo(nStart, nEnd, bGrammar);
- }
- delete pNewError;
-
- if(pBackAttrLeft)
- {
- TextAttrib* pNewBack = NULL;
- sal_uInt16 _nStart = pBackAttrLeft->GetStart();
- sal_uInt16 _nEnd = pBackAttrLeft->GetEnd();
- pTextEngine->RemoveAttrib( 0, *pBackAttrLeft );
- SetAttrib( *pNewBack, 0, _nStart, _nEnd - nAddedChars);
- delete pNewBack;
- }
- }
- }
- else if(nAction == ACTION_UNDOEDIT)
- {
- SetUndoEditMode(true);
- }
- //make sure the error positions are correct after text changes
- //the old attribute may have been deleted
- //all changes inside of the current error leave the error attribute at the current
- //start position
- if(!IsUndoEditMode() && bIsErrorActive)
- {
- const TextCharAttrib* pFontColor = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_FONTCOLOR );
- pErrorAttrib = pTextEngine->FindCharAttrib( TextPaM(0, m_nErrorStart), TEXTATTR_SPELL_ERROR );
- if(pFontColor && pErrorAttrib )
- {
- m_nErrorStart = pFontColor->GetStart();
- m_nErrorEnd = pFontColor->GetEnd();
- if(pErrorAttrib->GetStart() != m_nErrorStart || pErrorAttrib->GetEnd() != m_nErrorEnd)
- {
- TextAttrib* pNewError = NULL;
- pTextEngine->RemoveAttrib( 0, *pErrorAttr );
- SetAttrib( *pNewError, 0, m_nErrorStart, m_nErrorEnd );
- delete pNewError;
- }
- }
- }
- //this is not a modification anymore
- if(nAction != ACTION_SELECTFIELD && !m_bIsUndoEditMode)
- CallModifyLink();
- }
- else
- bChange = false;
- }
- long nRet = bChange ? 1 : MultiLineEdit::PreNotify(rNEvt);
- return nRet;
-}
-
-//-----------------------------------------------------------------------
-bool SentenceEditWindow_Impl::MarkNextError( bool bIgnoreCurrentError )
-{
- if (bIgnoreCurrentError)
- m_aIgnoreErrorsAt.insert( m_nErrorStart );
- ExtTextEngine* pTextEngine = GetTextEngine();
- sal_uInt16 nTextLen = pTextEngine->GetTextLen(0);
- if(m_nErrorEnd >= nTextLen - 1)
- return false;
- //if it's not already modified the modified flag has to be reset at the and of the marking
- bool bModified = IsModified();
- bool bRet = false;
- const sal_uInt16 nOldErrorStart = m_nErrorStart;
- const sal_uInt16 nOldErrorEnd = m_nErrorEnd;
-
- //create a cursor behind the end of the last error
- //- or at 0 at the start of the sentence
- TextPaM aCursor(0, m_nErrorEnd ? m_nErrorEnd + 1 : 0);
- //search for SpellErrorAttrib
-
- const TextCharAttrib* pNextError = 0;
- //iterate over the text and search for the next error that maybe has
- //to be replace by a ChangeAllList replacement
- bool bGrammarError = false;
- while(aCursor.GetIndex() < nTextLen)
- {
- while(aCursor.GetIndex() < nTextLen &&
- 0 == (pNextError = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_ERROR)))
- {
- ++aCursor.GetIndex();
- }
- // maybe the error found here is already in the ChangeAllList and has to be replaced
-
- Reference<XDictionary> xChangeAll( SvxGetChangeAllList(), UNO_QUERY );
- Reference<XDictionaryEntry> xEntry;
-
- const SpellErrorDescription* pSpellErrorDescription = 0;
- if(pNextError)
- {
- pSpellErrorDescription = &static_cast<const SpellErrorAttrib&>(pNextError->GetAttr()).GetErrorDescription();
- bGrammarError = pSpellErrorDescription->bIsGrammarError;
- }
- if(xChangeAll->getCount() && pSpellErrorDescription &&
- (xEntry = xChangeAll->getEntry( pSpellErrorDescription->sErrorText )).is())
- {
- m_nErrorStart = pNextError->GetStart();
- m_nErrorEnd = pNextError->GetEnd();
- ChangeMarkedWord(xEntry->getReplacementText(),
- SvxLocaleToLanguage( pSpellErrorDescription->aLocale ));
- aCursor.GetIndex() = aCursor.GetIndex() + (sal_uInt16)(xEntry->getReplacementText().getLength());
- }
- else
- break;
- }
-
- //if an attrib has been found search for the end of the error string
- if(aCursor.GetIndex() < nTextLen)
- {
- m_nErrorStart = aCursor.GetIndex();
- m_nErrorEnd = pNextError->GetEnd();
- MoveErrorMarkTo(m_nErrorStart, m_nErrorEnd, bGrammarError);
- bRet = true;
- //add an undo action
- SpellUndoAction_Impl* pAction = new SpellUndoAction_Impl(
- SPELLUNDO_CHANGE_NEXTERROR, GetSpellDialog()->aDialogUndoLink);
- pAction->SetErrorMove(m_nErrorStart, m_nErrorEnd, nOldErrorStart, nOldErrorEnd);
- const SpellErrorAttrib* pOldAttrib = static_cast<const SpellErrorAttrib*>(
- pTextEngine->FindAttrib( TextPaM(0, nOldErrorStart), TEXTATTR_SPELL_ERROR ));
- pAction->SetErrorLanguageSelected(pOldAttrib && pOldAttrib->GetErrorDescription().aSuggestions.getLength() &&
- SvxLocaleToLanguage( pOldAttrib->GetErrorDescription().aLocale) ==
- GetSpellDialog()->aLanguageLB.GetSelectLanguage());
- AddUndoAction(pAction);
- }
- else
- m_nErrorStart = m_nErrorEnd = nTextLen;
- if( !bModified )
- ClearModifyFlag();
- SpellDialog* pSpellDialog = GetSpellDialog();
- pSpellDialog->aIgnorePB.Enable(bRet);
- pSpellDialog->aIgnoreAllPB.Enable(bRet);
- pSpellDialog->aAutoCorrPB.Enable(bRet);
- pSpellDialog->aAddToDictMB.Enable(bRet);
- return bRet;
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::MoveErrorMarkTo(sal_uInt16 nStart, sal_uInt16 nEnd, bool bGrammarError)
-{
- TextEngine* pTextEngine = GetTextEngine();
- pTextEngine->RemoveAttribs( 0, (sal_uInt16)TEXTATTR_FONTCOLOR, sal_True );
- pTextEngine->RemoveAttribs( 0, (sal_uInt16)TEXTATTR_FONTWEIGHT, sal_True );
- pTextEngine->SetAttrib( TextAttribFontWeight(WEIGHT_BOLD), 0, nStart, nEnd );
- pTextEngine->SetAttrib( TextAttribFontColor(bGrammarError ? COL_LIGHTBLUE : COL_LIGHTRED), 0, nStart, nEnd );
- m_nErrorStart = nStart;
- m_nErrorEnd = nEnd;
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::ChangeMarkedWord(const String& rNewWord, LanguageType eLanguage)
-{
- //calculate length changes
- long nDiffLen = rNewWord.Len() - m_nErrorEnd + m_nErrorStart;
- TextSelection aSel(TextPaM(0, m_nErrorStart), TextPaM(0, m_nErrorEnd));
- //Remove spell errror attribute
- ExtTextEngine* pTextEngine = GetTextEngine();
- pTextEngine->UndoActionStart();
- const TextCharAttrib* pErrorAttrib = pTextEngine->FindCharAttrib( TextPaM(0, m_nErrorStart), TEXTATTR_SPELL_ERROR );
- DBG_ASSERT(pErrorAttrib, "no error attribute found");
- const SpellErrorDescription* pSpellErrorDescription = 0;
- if(pErrorAttrib)
- {
- pTextEngine->RemoveAttrib(0, *pErrorAttrib);
- pSpellErrorDescription = &static_cast<const SpellErrorAttrib&>(pErrorAttrib->GetAttr()).GetErrorDescription();
- }
- const TextCharAttrib* pBackAttrib = pTextEngine->FindCharAttrib( TextPaM(0, m_nErrorStart), TEXTATTR_SPELL_BACKGROUND );
- pTextEngine->ReplaceText( aSel, rNewWord );
-
- if(!m_nErrorStart)
- {
- //attributes following an error at the start of the text are not moved but expanded from the
- //text engine - this is done to keep full-paragraph-attributes
- //in the current case that handling is not desired
- const TextCharAttrib* pLangAttrib =
- pTextEngine->FindCharAttrib(
- TextPaM(0, m_nErrorEnd), TEXTATTR_SPELL_LANGUAGE );
- sal_uInt16 nTextLen = pTextEngine->GetTextLen( 0 );
- if(pLangAttrib && !pLangAttrib->GetStart() && pLangAttrib->GetEnd() ==
- nTextLen)
- {
- SpellLanguageAttrib aNewLangAttrib( static_cast<const SpellLanguageAttrib&>(pLangAttrib->GetAttr()).GetLanguage());
- pTextEngine->RemoveAttrib(0, *pLangAttrib);
- pTextEngine->SetAttrib( aNewLangAttrib, 0, (sal_uInt16)(m_nErrorEnd + nDiffLen) , nTextLen );
- }
- }
- // undo expanded attributes!
- if( pBackAttrib && pBackAttrib->GetStart() < m_nErrorStart && pBackAttrib->GetEnd() == m_nErrorEnd + nDiffLen)
- {
- TextAttrib* pNewBackground = NULL;
- sal_uInt16 nStart = pBackAttrib->GetStart();
- pTextEngine->RemoveAttrib(0, *pBackAttrib);
- pTextEngine->SetAttrib(*pNewBackground, 0, nStart, m_nErrorStart);
- delete pNewBackground;
- }
- pTextEngine->SetModified(sal_True);
-
- //adjust end position
- long nEndTemp = m_nErrorEnd;
- nEndTemp += nDiffLen;
- m_nErrorEnd = (sal_uInt16)nEndTemp;
-
- SpellUndoAction_Impl* pAction = new SpellUndoAction_Impl(
- SPELLUNDO_MOVE_ERROREND, GetSpellDialog()->aDialogUndoLink);
- pAction->SetOffset(nDiffLen);
- AddUndoAction(pAction);
- if(pSpellErrorDescription)
- SetAttrib( SpellErrorAttrib(*pSpellErrorDescription), 0, m_nErrorStart, m_nErrorEnd );
- SetAttrib( SpellLanguageAttrib(eLanguage), 0, m_nErrorStart, m_nErrorEnd );
- pTextEngine->UndoActionEnd();
-}
-
-//-------------------------------------------------
-String SentenceEditWindow_Impl::GetErrorText() const
-{
- return GetTextEngine()->GetText(TextSelection(TextPaM(0, m_nErrorStart), TextPaM(0, m_nErrorEnd) ));
-}
-
-//-----------------------------------------------------------------------
-const SpellErrorDescription* SentenceEditWindow_Impl::GetAlternatives()
-{
- TextPaM aCursor(0, m_nErrorStart);
- const SpellErrorAttrib* pAttrib = static_cast<const SpellErrorAttrib*>(
- GetTextEngine()->FindAttrib( aCursor, TEXTATTR_SPELL_ERROR));
- return pAttrib ? &pAttrib->GetErrorDescription() : 0;
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::RestoreCurrentError()
-{
- TextPaM aCursor(0, m_nErrorStart);
- const SpellErrorAttrib* pAttrib = static_cast<const SpellErrorAttrib*>(
- GetTextEngine()->FindAttrib( aCursor, TEXTATTR_SPELL_ERROR));
- if( pAttrib )
- {
- const SpellErrorDescription& rDesc = pAttrib->GetErrorDescription();
- if( !rDesc.sErrorText.equals( GetErrorText() ) )
- ChangeMarkedWord(rDesc.sErrorText, SvxLocaleToLanguage( rDesc.aLocale ));
- }
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::SetAlternatives( Reference< XSpellAlternatives> xAlt )
-{
- TextPaM aCursor(0, m_nErrorStart);
- DBG_ASSERT(static_cast<const SpellErrorAttrib*>(
- GetTextEngine()->FindAttrib( aCursor, TEXTATTR_SPELL_ERROR)), "no error set?");
-
- ::rtl::OUString aWord;
- lang::Locale aLocale;
- uno::Sequence< ::rtl::OUString > aAlts;
- ::rtl::OUString sServiceName;
- if (xAlt.is())
- {
- aWord = xAlt->getWord();
- aLocale = xAlt->getLocale();
- aAlts = xAlt->getAlternatives();
- uno::Reference< container::XNamed > xNamed( xAlt, uno::UNO_QUERY );
- if (xNamed.is())
- sServiceName = xNamed->getName();
- }
- SpellErrorDescription aDesc( false, aWord, aLocale, aAlts, 0, sServiceName);
- GetTextEngine()->SetAttrib( SpellErrorAttrib(aDesc), 0, m_nErrorStart, m_nErrorEnd );
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::SetAttrib( const TextAttrib& rAttr, sal_uLong nPara, sal_uInt16 nStart, sal_uInt16 nEnd )
-{
- GetTextEngine()->SetAttrib(rAttr, nPara, nStart, nEnd);
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::SetText( const String& rStr )
-{
- m_nErrorStart = m_nErrorEnd = 0;
- GetTextEngine()->SetText(rStr);
-}
-
-//-----------------------------------------------------------------------
-struct LanguagePosition_Impl
-{
- sal_uInt16 nPosition;
- LanguageType eLanguage;
-
- LanguagePosition_Impl(sal_uInt16 nPos, LanguageType eLang) :
- nPosition(nPos),
- eLanguage(eLang)
- {}
-};
-typedef std::vector<LanguagePosition_Impl> LanguagePositions_Impl;
-
-void lcl_InsertBreakPosition_Impl(
- LanguagePositions_Impl& rBreakPositions, sal_uInt16 nInsert, LanguageType eLanguage)
-{
- LanguagePositions_Impl::iterator aStart = rBreakPositions.begin();
- while(aStart != rBreakPositions.end())
- {
- if(aStart->nPosition == nInsert)
- {
- //the language of following starts has to overwrite
- //the one of previous ends
- aStart->eLanguage = eLanguage;
- return;
- }
- else if(aStart->nPosition > nInsert)
- {
-
- rBreakPositions.insert(aStart, LanguagePosition_Impl(nInsert, eLanguage));
- return;
- }
- else
- ++aStart;
- }
- rBreakPositions.push_back(LanguagePosition_Impl(nInsert, eLanguage));
-}
-/*-------------------------------------------------------------------------
- Returns the text in spell portions. Each portion contains text with an
- equal language and attribute. The spell alternatives are empty.
- -----------------------------------------------------------------------*/
-svx::SpellPortions SentenceEditWindow_Impl::CreateSpellPortions( bool bSetIgnoreFlag ) const
-{
- svx::SpellPortions aRet;
- ExtTextEngine* pTextEngine = GetTextEngine();
- const sal_uInt16 nTextLen = pTextEngine->GetTextLen(0);
- if(nTextLen)
- {
- TextPaM aCursor(0, 0);
- LanguagePositions_Impl aBreakPositions;
- const TextCharAttrib* pLastLang = 0;
- const TextCharAttrib* pLastError = 0;
- LanguageType eLang = LANGUAGE_DONTKNOW;
- const TextCharAttrib* pError = 0;
- while(aCursor.GetIndex() < nTextLen)
- {
- const TextCharAttrib* pLang = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_LANGUAGE);
- if(pLang && pLang != pLastLang)
- {
- eLang = static_cast<const SpellLanguageAttrib&>(pLang->GetAttr()).GetLanguage();
- lcl_InsertBreakPosition_Impl(aBreakPositions, pLang->GetStart(), eLang);
- lcl_InsertBreakPosition_Impl(aBreakPositions, pLang->GetEnd(), eLang);
- pLastLang = pLang;
- }
- pError = pTextEngine->FindCharAttrib( aCursor, TEXTATTR_SPELL_ERROR);
- if(pError && pLastError != pError)
- {
- lcl_InsertBreakPosition_Impl(aBreakPositions, pError->GetStart(), eLang);
- lcl_InsertBreakPosition_Impl(aBreakPositions, pError->GetEnd(), eLang);
- pLastError = pError;
-
- }
- aCursor.GetIndex()++;
- }
-
- if(nTextLen && aBreakPositions.empty())
- {
- //if all content has been overwritten the attributes may have been removed, too
- svx::SpellPortion aPortion1;
- aPortion1.eLanguage = GetSpellDialog()->GetSelectedLang_Impl();
- aPortion1.sText = pTextEngine->GetText(
- TextSelection(TextPaM(0, 0), TextPaM(0, nTextLen)));
-
- aRet.push_back(aPortion1);
-
- }
- else if(!aBreakPositions.empty())
- {
- LanguagePositions_Impl::iterator aStart = aBreakPositions.begin();
- //start should always be Null
- eLang = aStart->eLanguage;
- sal_uInt16 nStart = aStart->nPosition;
- DBG_ASSERT(!nStart, "invalid start position - language attribute missing?");
- ++aStart;
-
- while(aStart != aBreakPositions.end())
- {
- svx::SpellPortion aPortion1;
- aPortion1.eLanguage = eLang;
- aPortion1.sText = pTextEngine->GetText(
- TextSelection(TextPaM(0, nStart), TextPaM(0, aStart->nPosition)));
- bool bIsIgnoreError = m_aIgnoreErrorsAt.find( nStart ) != m_aIgnoreErrorsAt.end();
- if( bSetIgnoreFlag && bIsIgnoreError )
- {
- aPortion1.bIgnoreThisError = true;
- }
- aRet.push_back(aPortion1);
- nStart = aStart->nPosition;
- eLang = aStart->eLanguage;
- ++aStart;
- }
- }
-
- // quick partly fix of #i71318. Correct fix needs to patch the TextEngine itself...
- // this one will only prevent text from disappearing. It may to not have the
- // correct language and will probably not spell checked...
- sal_uLong nPara = pTextEngine->GetParagraphCount();
- if (nPara > 1)
- {
- String aLeftOverText;
- for (sal_uLong i = 1; i < nPara; ++i)
- {
- aLeftOverText.AppendAscii( "\x0a" ); // the manual line break...
- aLeftOverText += pTextEngine->GetText(i);
- }
- if (pError)
- { // we need to add a new portion containing the left-over text
- svx::SpellPortion aPortion2;
- aPortion2.eLanguage = eLang;
- aPortion2.sText = aLeftOverText;
- aRet.push_back( aPortion2 );
- }
- else
- { // we just need to append the left-over text to the last portion (which had no errors)
- aRet[ aRet.size() - 1 ].sText += aLeftOverText;
- }
- }
- }
- return aRet;
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::Undo()
-{
- ::svl::IUndoManager& rUndoMgr = GetTextEngine()->GetUndoManager();
- DBG_ASSERT(GetUndoActionCount(), "no undo actions available" );
- if(!GetUndoActionCount())
- return;
- bool bSaveUndoEdit = IsUndoEditMode();
- sal_uInt16 nId;
- //if the undo edit mode is active then undo all changes until the UNDO_EDIT_MODE action has been found
- do
- {
- nId = rUndoMgr.GetUndoActionId();
- rUndoMgr.Undo();
- }while(bSaveUndoEdit && SPELLUNDO_UNDO_EDIT_MODE != nId && GetUndoActionCount());
-
- if(bSaveUndoEdit || SPELLUNDO_CHANGE_GROUP == nId)
- GetSpellDialog()->UpdateBoxes_Impl();
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::ResetUndo()
-{
- GetTextEngine()->ResetUndo();
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::AddUndoAction( SfxUndoAction *pAction, sal_Bool bTryMerg )
-{
- ::svl::IUndoManager& rUndoMgr = GetTextEngine()->GetUndoManager();
- rUndoMgr.AddUndoAction(pAction, bTryMerg);
- GetSpellDialog()->aUndoPB.Enable();
-}
-
-//-----------------------------------------------------------------------
-sal_uInt16 SentenceEditWindow_Impl::GetUndoActionCount()
-{
- return GetTextEngine()->GetUndoManager().GetUndoActionCount();
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::UndoActionStart( sal_uInt16 nId )
-{
- GetTextEngine()->UndoActionStart(nId);
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::UndoActionEnd()
-{
- GetTextEngine()->UndoActionEnd();
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::MoveErrorEnd(long nOffset)
-{
- if(nOffset > 0)
- m_nErrorEnd = m_nErrorEnd - (sal_uInt16)nOffset;
- else
- m_nErrorEnd = m_nErrorEnd -(sal_uInt16)- nOffset;
-}
-
-//-----------------------------------------------------------------------
-void SentenceEditWindow_Impl::SetUndoEditMode(bool bSet)
-{
- DBG_ASSERT(!bSet || m_bIsUndoEditMode != bSet, "SetUndoEditMode with equal values?");
- m_bIsUndoEditMode = bSet;
- //disable all buttons except the Change
- SpellDialog* pSpellDialog = GetSpellDialog();
- Control* aControls[] =
- {
- &pSpellDialog->aChangeAllPB,
- &pSpellDialog->aExplainPB,
- &pSpellDialog->aIgnoreAllPB,
- &pSpellDialog->aIgnoreRulePB,
- &pSpellDialog->aIgnorePB,
- &pSpellDialog->aSuggestionLB,
- &pSpellDialog->aSuggestionFT,
- &pSpellDialog->aLanguageFT,
- &pSpellDialog->aLanguageLB,
- &pSpellDialog->aAddToDictMB,
- &pSpellDialog->aAutoCorrPB,
- 0
- };
- sal_Int32 nIdx = 0;
- do
- {
- aControls[nIdx]->Enable(sal_False);
- }
- while(aControls[++nIdx]);
-
- //remove error marks
- TextEngine* pTextEngine = GetTextEngine();
- pTextEngine->RemoveAttribs( 0, (sal_uInt16)TEXTATTR_FONTCOLOR, sal_True );
- pTextEngine->RemoveAttribs( 0, (sal_uInt16)TEXTATTR_FONTWEIGHT, sal_True );
-
- //put the appropriate action on the Undo-stack
- SpellUndoAction_Impl* pAction = new SpellUndoAction_Impl(
- SPELLUNDO_UNDO_EDIT_MODE, GetSpellDialog()->aDialogUndoLink);
- AddUndoAction(pAction);
- pSpellDialog->aChangePB.Enable();
-}
-
-//-----------------------------------------------------------------------
-ExplainButton::~ExplainButton()
-{
-}
-
-//-----------------------------------------------------------------------
-void ExplainButton::RequestHelp( const HelpEvent& )
-{
- Help::ShowBalloon( this, GetPosPixel(), m_sExplanation );
-}
-
-void ExplainButton::Click()
-{
- RequestHelp( HelpEvent() );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */