diff options
Diffstat (limited to 'editeng/source/editeng/editview.cxx')
-rw-r--r-- | editeng/source/editeng/editview.cxx | 1595 |
1 files changed, 1595 insertions, 0 deletions
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx new file mode 100644 index 000000000000..766023a0038c --- /dev/null +++ b/editeng/source/editeng/editview.cxx @@ -0,0 +1,1595 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_editeng.hxx" + +#include <vcl/wrkwin.hxx> +#include <vcl/dialog.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/svapp.hxx> + +#include <com/sun/star/i18n/WordType.hpp> +#include <vcl/metric.hxx> + +#include <i18npool/mslangid.hxx> +#include <svl/languageoptions.hxx> +#include <svtools/ctrltool.hxx> +#include <svtools/langtab.hxx> + +#include <svl/srchitem.hxx> + +#define _SVSTDARR_USHORTS +#include <svl/svstdarr.hxx> + +#include <impedit.hxx> +#include <editeng/editeng.hxx> +#include <editeng/editview.hxx> +#include <editeng/flditem.hxx> +#include <editeng/svxacorr.hxx> +#include <editeng/langitem.hxx> +#include <editeng/fhgtitem.hxx> +#include <editeng/eerdll.hxx> +#include <eerdll2.hxx> +#include <editeng.hrc> +#include <helpid.hrc> +#include <i18npool/lang.h> +#include <vcl/menu.hxx> +#include <editeng/acorrcfg.hxx> +#include <editeng/unolingu.hxx> +#include <editeng/fontitem.hxx> + +#include <com/sun/star/frame/XStorable.hpp> +#include <com/sun/star/beans/PropertyValues.hdl> +#include <com/sun/star/lang/Locale.hpp> +#include <linguistic/lngprops.hxx> +#include <vcl/svapp.hxx> +#include <vcl/settings.hxx> +#include <unotools/lingucfg.hxx> + +using ::rtl::OUString; +using namespace com::sun::star; +using namespace com::sun::star::uno; +using namespace com::sun::star::beans; +using namespace com::sun::star::linguistic2; + + +DBG_NAME( EditView ) + + +// From SW => Create common method +LanguageType lcl_CheckLanguage( + const OUString &rText, + Reference< XSpellChecker1 > xSpell, + Reference< linguistic2::XLanguageGuessing > xLangGuess, + sal_Bool bIsParaText ) +{ + LanguageType nLang = LANGUAGE_NONE; + if (bIsParaText) // check longer texts with language-guessing... + { + if (!xLangGuess.is()) + return nLang; + + lang::Locale aLocale( xLangGuess->guessPrimaryLanguage( rText, 0, rText.getLength()) ); + + // get language as from "Tools/Options - Language Settings - Languages: Locale setting" + LanguageType nTmpLang = Application::GetSettings().GetLanguage(); + + // if the result from language guessing does not provide a 'Country' part + // try to get it by looking up the locale setting of the office. + if (aLocale.Country.getLength() == 0) + { + lang::Locale aTmpLocale = SvxCreateLocale( nTmpLang ); + if (aTmpLocale.Language == aLocale.Language) + nLang = nTmpLang; + } + if (nLang == LANGUAGE_NONE) // language not found by looking up the sytem language... + nLang = MsLangId::convertLocaleToLanguageWithFallback( aLocale ); + if (nLang == LANGUAGE_SYSTEM) + nLang = nTmpLang; + if (nLang == LANGUAGE_DONTKNOW) + nLang = LANGUAGE_NONE; + } + else // check single word + { + if (!xSpell.is()) + return nLang; + + // + // build list of languages to check + // + LanguageType aLangList[4]; + const AllSettings& rSettings = Application::GetSettings(); + SvtLinguOptions aLinguOpt; + SvtLinguConfig().GetOptions( aLinguOpt ); + // The default document language from "Tools/Options - Language Settings - Languages: Western" + aLangList[0] = aLinguOpt.nDefaultLanguage; + // The one from "Tools/Options - Language Settings - Languages: User interface" + aLangList[1] = rSettings.GetUILanguage(); + // The one from "Tools/Options - Language Settings - Languages: Locale setting" + aLangList[2] = rSettings.GetLanguage(); + // en-US + aLangList[3] = LANGUAGE_ENGLISH_US; +#ifdef DEBUG + lang::Locale a0( SvxCreateLocale( aLangList[0] ) ); + lang::Locale a1( SvxCreateLocale( aLangList[1] ) ); + lang::Locale a2( SvxCreateLocale( aLangList[2] ) ); + lang::Locale a3( SvxCreateLocale( aLangList[3] ) ); +#endif + + INT32 nCount = sizeof(aLangList) / sizeof(aLangList[0]); + for (INT32 i = 0; i < nCount; i++) + { + INT16 nTmpLang = aLangList[i]; + if (nTmpLang != LANGUAGE_NONE && nTmpLang != LANGUAGE_DONTKNOW) + { + if (xSpell->hasLanguage( nTmpLang ) && + xSpell->isValid( rText, nTmpLang, Sequence< PropertyValue >() )) + { + nLang = nTmpLang; + break; + } + } + } + } + + return nLang; +} + + +// ---------------------------------------------------------------------- +// class EditView +// ---------------------------------------------------------------------- +EditView::EditView( EditEngine* pEng, Window* pWindow ) +{ + DBG_CTOR( EditView, 0 ); + pImpEditView = new ImpEditView( this, pEng, pWindow ); +} + +EditView::~EditView() +{ + DBG_DTOR( EditView, 0 ); + delete pImpEditView; +} + +ImpEditEngine* EditView::GetImpEditEngine() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->pEditEngine->pImpEditEngine; +} + +EditEngine* EditView::GetEditEngine() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->pEditEngine; +} + +void EditView::Invalidate() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + if ( !pImpEditView->DoInvalidateMore() ) + pImpEditView->GetWindow()->Invalidate( pImpEditView->aOutArea ); + else + { + Rectangle aRect( pImpEditView->aOutArea ); + long nMore = pImpEditView->GetWindow()->PixelToLogic( Size( pImpEditView->GetInvalidateMore(), 0 ) ).Width(); + aRect.Left() -= nMore; + aRect.Right() += nMore; + aRect.Top() -= nMore; + aRect.Bottom() += nMore; + pImpEditView->GetWindow()->Invalidate( aRect ); + } +} + +void EditView::SetReadOnly( sal_Bool bReadOnly ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->bReadOnly = bReadOnly; +} + +sal_Bool EditView::IsReadOnly() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->bReadOnly; +} + +void EditView::SetSelection( const ESelection& rESel ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + // Falls jemand gerade ein leeres Attribut hinterlassen hat, + // und dann der Outliner die Selektion manipulitert: + if ( !pImpEditView->GetEditSelection().HasRange() ) + { + ContentNode* pNode = pImpEditView->GetEditSelection().Max().GetNode(); + PIMPEE->CursorMoved( pNode ); + } + EditSelection aNewSelection( PIMPEE->ConvertSelection( rESel.nStartPara, rESel.nStartPos, rESel.nEndPara, rESel.nEndPos ) ); + + // Wenn nach einem KeyInput die Selection manipuliert wird: + PIMPEE->CheckIdleFormatter(); + + // Selektion darf nicht bei einem unsichtbaren Absatz Starten/Enden: + ParaPortion* pPortion = PIMPEE->FindParaPortion( aNewSelection.Min().GetNode() ); + if ( !pPortion->IsVisible() ) + { + pPortion = PIMPEE->GetPrevVisPortion( pPortion ); + ContentNode* pNode = pPortion ? pPortion->GetNode() : PIMPEE->GetEditDoc().GetObject( 0 ); + aNewSelection.Min() = EditPaM( pNode, pNode->Len() ); + } + pPortion = PIMPEE->FindParaPortion( aNewSelection.Max().GetNode() ); + if ( !pPortion->IsVisible() ) + { + pPortion = PIMPEE->GetPrevVisPortion( pPortion ); + ContentNode* pNode = pPortion ? pPortion->GetNode() : PIMPEE->GetEditDoc().GetObject( 0 ); + aNewSelection.Max() = EditPaM( pNode, pNode->Len() ); + } + + pImpEditView->DrawSelection(); // alte Selektion 'weg-zeichnen' + pImpEditView->SetEditSelection( aNewSelection ); + pImpEditView->DrawSelection(); + sal_Bool bGotoCursor = pImpEditView->DoAutoScroll(); + ShowCursor( bGotoCursor ); +} + +ESelection EditView::GetSelection() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + ESelection aSelection; + + aSelection.nStartPara = PIMPEE->GetEditDoc().GetPos( pImpEditView->GetEditSelection().Min().GetNode() ); + aSelection.nEndPara = PIMPEE->GetEditDoc().GetPos( pImpEditView->GetEditSelection().Max().GetNode() ); + + aSelection.nStartPos = pImpEditView->GetEditSelection().Min().GetIndex(); + aSelection.nEndPos = pImpEditView->GetEditSelection().Max().GetIndex(); + + return aSelection; +} + +sal_Bool EditView::HasSelection() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->HasSelection(); +} + +void EditView::DeleteSelected() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + pImpEditView->DeleteSelected(); +} + +USHORT EditView::GetSelectedScriptType() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return PIMPEE->GetScriptType( pImpEditView->GetEditSelection() ); +} + +void EditView::Paint( const Rectangle& rRect ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->Paint( pImpEditView, rRect ); +} + +void EditView::SetEditEngine( EditEngine* pEditEng ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + pImpEditView->pEditEngine = pEditEng; + EditSelection aStartSel; + aStartSel = PIMPEE->GetEditDoc().GetStartPaM(); + pImpEditView->SetEditSelection( aStartSel ); +} + +void EditView::SetWindow( Window* pWin ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->pOutWin = pWin; + PIMPEE->GetSelEngine().Reset(); +} + +Window* EditView::GetWindow() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->pOutWin; +} + +void EditView::SetVisArea( const Rectangle& rRec ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->SetVisDocStartPos( rRec.TopLeft() ); +} + +const Rectangle& EditView::GetVisArea() const +{ + DBG_CHKTHIS( EditView, 0 ); + // Change return value to Rectangle in next incompatible build !!! + static Rectangle aRect; + aRect = pImpEditView->GetVisDocArea(); + return aRect; +} + +void EditView::SetOutputArea( const Rectangle& rRec ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->SetOutputArea( rRec ); + + // Rest nur hier, wenn API-Aufruf: + pImpEditView->CalcAnchorPoint(); + if ( PIMPEE->GetStatus().AutoPageSize() ) + pImpEditView->RecalcOutputArea(); + pImpEditView->ShowCursor( sal_False, sal_False ); +} + +const Rectangle& EditView::GetOutputArea() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->GetOutputArea(); +} + +void EditView::SetPointer( const Pointer& rPointer ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->SetPointer( rPointer ); +} + +const Pointer& EditView::GetPointer() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->GetPointer(); +} + +void EditView::SetCursor( const Cursor& rCursor ) +{ + DBG_CHKTHIS( EditView, 0 ); + delete pImpEditView->pCursor; + pImpEditView->pCursor = new Cursor( rCursor ); +} + +Cursor* EditView::GetCursor() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->pCursor; +} + +void EditView::InsertText( const XubString& rStr, sal_Bool bSelect ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + ImpEditEngine* pImpEE = PIMPEE; + pImpEditView->DrawSelection(); + + EditPaM aPaM1; + if ( bSelect ) + { + EditSelection aTmpSel( pImpEditView->GetEditSelection() ); + aTmpSel.Adjust( pImpEE->GetEditDoc() ); + aPaM1 = aTmpSel.Min(); + } + + pImpEE->UndoActionStart( EDITUNDO_INSERT ); + EditPaM aPaM2( pImpEE->InsertText( pImpEditView->GetEditSelection(), rStr ) ); + pImpEE->UndoActionEnd( EDITUNDO_INSERT ); + + if ( bSelect ) + { + DBG_ASSERT( !aPaM1.DbgIsBuggy( pImpEE->GetEditDoc() ), "Insert: PaM kaputt" ); + pImpEditView->SetEditSelection( EditSelection( aPaM1, aPaM2 ) ); + } + else + pImpEditView->SetEditSelection( EditSelection( aPaM2, aPaM2 ) ); + + pImpEE->FormatAndUpdate( this ); +} + +sal_Bool EditView::PostKeyEvent( const KeyEvent& rKeyEvent ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->PostKeyEvent( rKeyEvent ); +} + +sal_Bool EditView::MouseButtonUp( const MouseEvent& rMouseEvent ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->MouseButtonUp( rMouseEvent ); +} + +sal_Bool EditView::MouseButtonDown( const MouseEvent& rMouseEvent ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->MouseButtonDown( rMouseEvent ); +} + +sal_Bool EditView::MouseMove( const MouseEvent& rMouseEvent ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->MouseMove( rMouseEvent ); +} + +void EditView::Command( const CommandEvent& rCEvt ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + pImpEditView->Command( rCEvt ); +} + +void EditView::ShowCursor( sal_Bool bGotoCursor, sal_Bool bForceVisCursor ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + +// Draw vertraegt die Assertion nicht, spaeter mal aktivieren +// DBG_ASSERT( pImpEditView->pEditEngine->HasView( this ), "ShowCursor - View nicht angemeldet!" ); +// DBG_ASSERT( !GetWindow()->IsInPaint(), "ShowCursor - Why in Paint ?!" ); + + if ( pImpEditView->pEditEngine->HasView( this ) ) + { + // Das ControlWord hat mehr Gewicht: + if ( !pImpEditView->DoAutoScroll() ) + bGotoCursor = sal_False; + pImpEditView->ShowCursor( bGotoCursor, bForceVisCursor ); + } +} + +void EditView::HideCursor() +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->GetCursor()->Hide(); +} + +Pair EditView::Scroll( long ndX, long ndY, BYTE nRangeCheck ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->Scroll( ndX, ndY, nRangeCheck ); +} + +const SfxItemSet& EditView::GetEmptyItemSet() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return PIMPEE->GetEmptyItemSet(); +} + +void EditView::SetAttribs( const SfxItemSet& rSet ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + DBG_ASSERT( !pImpEditView->aEditSelection.IsInvalid(), "Blinde Selection in ...." ); + + // Kein Undo-Kappseln noetig... + pImpEditView->DrawSelection(); + PIMPEE->SetAttribs( pImpEditView->GetEditSelection(), rSet, ATTRSPECIAL_WHOLEWORD ); + PIMPEE->FormatAndUpdate( this ); +} + +void EditView::SetParaAttribs( const SfxItemSet& rSet, sal_uInt16 nPara ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + // Kein Undo-Kappseln noetig... + PIMPEE->SetParaAttribs( nPara, rSet ); + // Beim Aendern von Absatzattributen muss immer formatiert werden... + PIMPEE->FormatAndUpdate( this ); +} + +void EditView::RemoveAttribsKeepLanguages( sal_Bool bRemoveParaAttribs ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + pImpEditView->DrawSelection(); + PIMPEE->UndoActionStart( EDITUNDO_RESETATTRIBS ); + EditSelection aSelection( pImpEditView->GetEditSelection() ); + + for (sal_uInt16 nWID = EE_ITEMS_START; nWID <= EE_ITEMS_END; ++nWID) + { + bool bIsLang = EE_CHAR_LANGUAGE == nWID || + EE_CHAR_LANGUAGE_CJK == nWID || + EE_CHAR_LANGUAGE_CTL == nWID; + if (!bIsLang) + PIMPEE->RemoveCharAttribs( aSelection, bRemoveParaAttribs, nWID ); + } + + PIMPEE->UndoActionEnd( EDITUNDO_RESETATTRIBS ); + PIMPEE->FormatAndUpdate( this ); +} + +void EditView::RemoveAttribs( sal_Bool bRemoveParaAttribs, sal_uInt16 nWhich ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + pImpEditView->DrawSelection(); + PIMPEE->UndoActionStart( EDITUNDO_RESETATTRIBS ); + PIMPEE->RemoveCharAttribs( pImpEditView->GetEditSelection(), bRemoveParaAttribs, nWhich ); + PIMPEE->UndoActionEnd( EDITUNDO_RESETATTRIBS ); + PIMPEE->FormatAndUpdate( this ); +} + +void EditView::RemoveCharAttribs( sal_uInt16 nPara, sal_uInt16 nWhich ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->UndoActionStart( EDITUNDO_RESETATTRIBS ); + PIMPEE->RemoveCharAttribs( nPara, nWhich ); + PIMPEE->UndoActionEnd( EDITUNDO_RESETATTRIBS ); + PIMPEE->FormatAndUpdate( this ); +} + +SfxItemSet EditView::GetAttribs() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + DBG_ASSERT( !pImpEditView->aEditSelection.IsInvalid(), "Blinde Selection in ...." ); + return PIMPEE->GetAttribs( pImpEditView->GetEditSelection() ); +} + +void EditView::Undo() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->Undo( this ); +} + +void EditView::Redo() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->Redo( this ); +} + +ULONG EditView::Read( SvStream& rInput, const String& rBaseURL, EETextFormat eFormat, sal_Bool bSelect, SvKeyValueIterator* pHTTPHeaderAttrs ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + EditSelection aOldSel( pImpEditView->GetEditSelection() ); + pImpEditView->DrawSelection(); + PIMPEE->UndoActionStart( EDITUNDO_READ ); + EditPaM aEndPaM = PIMPEE->Read( rInput, rBaseURL, eFormat, aOldSel, pHTTPHeaderAttrs ); + PIMPEE->UndoActionEnd( EDITUNDO_READ ); + EditSelection aNewSel( aEndPaM, aEndPaM ); + if ( bSelect ) + { + aOldSel.Adjust( PIMPEE->GetEditDoc() ); + aNewSel.Min() = aOldSel.Min(); + } + + pImpEditView->SetEditSelection( aNewSel ); + sal_Bool bGotoCursor = pImpEditView->DoAutoScroll(); + ShowCursor( bGotoCursor ); + + return rInput.GetError(); +} + +#ifndef SVX_LIGHT +ULONG EditView::Write( SvStream& rOutput, EETextFormat eFormat ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->Write( rOutput, eFormat, pImpEditView->GetEditSelection() ); + ShowCursor(); + return rOutput.GetError(); +} +#endif + +void EditView::Cut() +{ + DBG_CHKTHIS( EditView, 0 ); + Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipBoard(GetWindow()->GetClipboard()); + pImpEditView->CutCopy( aClipBoard, sal_True ); +} + +::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > EditView::GetTransferable() +{ + uno::Reference< datatransfer::XTransferable > xData = GetEditEngine()->pImpEditEngine->CreateTransferable( pImpEditView->GetEditSelection() ); + return xData; +} + +void EditView::Copy() +{ + DBG_CHKTHIS( EditView, 0 ); + Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipBoard(GetWindow()->GetClipboard()); + pImpEditView->CutCopy( aClipBoard, sal_False ); +} + +void EditView::Paste() +{ + DBG_CHKTHIS( EditView, 0 ); + Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipBoard(GetWindow()->GetClipboard()); + pImpEditView->Paste( aClipBoard, sal_False ); +} + +void EditView::PasteSpecial() +{ + DBG_CHKTHIS( EditView, 0 ); + Reference<com::sun::star::datatransfer::clipboard::XClipboard> aClipBoard(GetWindow()->GetClipboard()); + pImpEditView->Paste(aClipBoard, sal_True ); +} + +void EditView::EnablePaste( sal_Bool bEnable ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + pImpEditView->EnablePaste( bEnable ); +} + +sal_Bool EditView::IsPasteEnabled() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->IsPasteEnabled(); +} + +Point EditView::GetWindowPosTopLeft( sal_uInt16 nParagraph ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + Point aDocPos( pImpEditView->pEditEngine->GetDocPosTopLeft( nParagraph ) ); + return pImpEditView->GetWindowPos( aDocPos ); +} + +sal_uInt16 EditView::GetParagraph( const Point& rMousePosPixel ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + Point aMousePos( rMousePosPixel ); + aMousePos = GetWindow()->PixelToLogic( aMousePos ); + Point aDocPos( pImpEditView->GetDocPos( aMousePos ) ); + sal_uInt16 nParagraph = PIMPEE->GetParaPortions().FindParagraph( aDocPos.Y() ); + return nParagraph; +} + +void EditView::IndentBlock() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + PIMPEE->IndentBlock( this, sal_True ); +} + +void EditView::UnindentBlock() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + PIMPEE->IndentBlock( this, sal_False ); +} + +EESelectionMode EditView::GetSelectionMode() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->GetSelectionMode(); +} + +void EditView::SetSelectionMode( EESelectionMode eMode ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->SetSelectionMode( eMode ); +} + +XubString EditView::GetSelected() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return PIMPEE->GetSelected( pImpEditView->GetEditSelection() ); +} + +void EditView::MoveParagraphs( Range aParagraphs, sal_uInt16 nNewPos ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->UndoActionStart( EDITUNDO_MOVEPARAS ); + PIMPEE->MoveParagraphs( aParagraphs, nNewPos, this ); + PIMPEE->UndoActionEnd( EDITUNDO_MOVEPARAS ); +} + +void EditView::MoveParagraphs( long nDiff ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + ESelection aSel = GetSelection(); + Range aRange( aSel.nStartPara, aSel.nEndPara ); + aRange.Justify(); + long nDest = ( nDiff > 0 ? aRange.Max() : aRange.Min() ) + nDiff; + if ( nDiff > 0 ) + nDest++; + DBG_ASSERT( ( nDest >= 0 ) && ( nDest <= pImpEditView->pEditEngine->GetParagraphCount() ), "MoveParagraphs - wrong Parameters!" ); + MoveParagraphs( aRange, + sal::static_int_cast< USHORT >( nDest ) ); +} + +void EditView::SetBackgroundColor( const Color& rColor ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + pImpEditView->SetBackgroundColor( rColor ); +} + +Color EditView::GetBackgroundColor() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->GetBackgroundColor(); +} + +void EditView::SetControlWord( sal_uInt32 nWord ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->nControl = nWord; +} + +sal_uInt32 EditView::GetControlWord() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->nControl; +} + +EditTextObject* EditView::CreateTextObject() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return PIMPEE->CreateTextObject( pImpEditView->GetEditSelection() ); +} + +void EditView::InsertText( const EditTextObject& rTextObject ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + pImpEditView->DrawSelection(); + + PIMPEE->UndoActionStart( EDITUNDO_INSERT ); + EditSelection aTextSel( PIMPEE->InsertText( rTextObject, pImpEditView->GetEditSelection() ) ); + PIMPEE->UndoActionEnd( EDITUNDO_INSERT ); + + aTextSel.Min() = aTextSel.Max(); // Selektion nicht behalten. + pImpEditView->SetEditSelection( aTextSel ); + PIMPEE->FormatAndUpdate( this ); +} + +void EditView::InsertText( ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > xDataObj, const String& rBaseURL, BOOL bUseSpecial ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + PIMPEE->UndoActionStart( EDITUNDO_INSERT ); + pImpEditView->DeleteSelected(); + EditSelection aTextSel( PIMPEE->InsertText( xDataObj, rBaseURL, pImpEditView->GetEditSelection().Max(), bUseSpecial ) ); + PIMPEE->UndoActionEnd( EDITUNDO_INSERT ); + + aTextSel.Min() = aTextSel.Max(); // Selektion nicht behalten. + pImpEditView->SetEditSelection( aTextSel ); + PIMPEE->FormatAndUpdate( this ); +} + +sal_Bool EditView::Drop( const DropEvent& ) +{ + return FALSE; +} + +ESelection EditView::GetDropPos() +{ + DBG_ERROR( "GetDropPos - Why?!" ); + return ESelection(); +} + +sal_Bool EditView::QueryDrop( DropEvent& ) +{ + return FALSE; +} + +void EditView::SetEditEngineUpdateMode( sal_Bool bUpdate ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->SetUpdateMode( bUpdate, this ); +} + +void EditView::ForceUpdate() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->SetUpdateMode( sal_True, this, sal_True ); +} + +void EditView::SetStyleSheet( SfxStyleSheet* pStyle ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + EditSelection aSel( pImpEditView->GetEditSelection() ); + PIMPEE->UndoActionStart( EDITUNDO_STYLESHEET ); + PIMPEE->SetStyleSheet( aSel, pStyle ); + PIMPEE->UndoActionEnd( EDITUNDO_STYLESHEET ); +} + +SfxStyleSheet* EditView::GetStyleSheet() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + + EditSelection aSel( pImpEditView->GetEditSelection() ); + aSel.Adjust( PIMPEE->GetEditDoc() ); + sal_uInt16 nStartPara = PIMPEE->GetEditDoc().GetPos( aSel.Min().GetNode() ); + sal_uInt16 nEndPara = PIMPEE->GetEditDoc().GetPos( aSel.Max().GetNode() ); + + SfxStyleSheet* pStyle = NULL; + for ( sal_uInt16 n = nStartPara; n <= nEndPara; n++ ) + { + SfxStyleSheet* pTmpStyle = PIMPEE->GetStyleSheet( n ); + if ( ( n != nStartPara ) && ( pStyle != pTmpStyle ) ) + return NULL; // Nicht eindeutig. + pStyle = pTmpStyle; + } + return pStyle; +} + +sal_Bool EditView::IsInsertMode() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->IsInsertMode(); +} + +void EditView::SetInsertMode( sal_Bool bInsert ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->SetInsertMode( bInsert ); +} + +void EditView::SetAnchorMode( EVAnchorMode eMode ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->SetAnchorMode( eMode ); +} + +EVAnchorMode EditView::GetAnchorMode() const +{ + DBG_CHKTHIS( EditView, 0 ); + return pImpEditView->GetAnchorMode(); +} + +void EditView::TransliterateText( sal_Int32 nTransliterationMode ) +{ + DBG_CHKTHIS( EditView, 0 ); + EditSelection aOldSel( pImpEditView->GetEditSelection() ); + EditSelection aNewSel = PIMPEE->TransliterateText( pImpEditView->GetEditSelection(), nTransliterationMode ); + if ( aNewSel != aOldSel ) + { + pImpEditView->DrawSelection(); // alte Selektion 'weg-zeichnen' + pImpEditView->SetEditSelection( aNewSel ); + pImpEditView->DrawSelection(); + } +} + + +sal_Bool EditView::MatchGroup() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + EditSelection aNewSel( PIMPEE->MatchGroup( pImpEditView->GetEditSelection() ) ); + if ( aNewSel.HasRange() ) + { + pImpEditView->DrawSelection(); + pImpEditView->SetEditSelection( aNewSel ); + pImpEditView->DrawSelection(); + ShowCursor(); + return sal_True; + } + return sal_False; +} + +void EditView::CompleteAutoCorrect() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + if ( !pImpEditView->HasSelection() && PIMPEE->GetStatus().DoAutoCorrect() ) + { + pImpEditView->DrawSelection(); + EditSelection aSel = pImpEditView->GetEditSelection(); + aSel = PIMPEE->EndOfWord( aSel.Max() ); + // MT 06/00: Why pass EditSelection to AutoCorrect, not EditPaM?! + aSel = PIMPEE->AutoCorrect( aSel, 0, !IsInsertMode() ); + pImpEditView->SetEditSelection( aSel ); + if ( PIMPEE->IsModified() ) + PIMPEE->FormatAndUpdate( this ); + } +} + +EESpellState EditView::StartSpeller( sal_Bool bMultipleDoc ) +{ +#ifdef SVX_LIGHT + return EE_SPELL_NOSPELLER; +#else + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + if ( !PIMPEE->GetSpeller().is() ) + return EE_SPELL_NOSPELLER; + + return PIMPEE->Spell( this, bMultipleDoc ); +#endif +} + +EESpellState EditView::StartThesaurus() +{ +#ifdef SVX_LIGHT + return EE_SPELL_NOSPELLER; +#else + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + if ( !PIMPEE->GetSpeller().is() ) + return EE_SPELL_NOSPELLER; + + return PIMPEE->StartThesaurus( this ); +#endif +} + + +void EditView::StartTextConversion( + LanguageType nSrcLang, LanguageType nDestLang, const Font *pDestFont, + INT32 nOptions, BOOL bIsInteractive, BOOL bMultipleDoc ) +{ +#ifdef SVX_LIGHT +#else + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + PIMPEE->Convert( this, nSrcLang, nDestLang, pDestFont, nOptions, bIsInteractive, bMultipleDoc ); +#endif +} + + +sal_uInt16 EditView::StartSearchAndReplace( const SvxSearchItem& rSearchItem ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return PIMPEE->StartSearchAndReplace( this, rSearchItem ); +} + +sal_Bool EditView::IsCursorAtWrongSpelledWord( sal_Bool bMarkIfWrong ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + sal_Bool bIsWrong = sal_False; + if ( !HasSelection() ) + { + EditPaM aPaM = pImpEditView->GetEditSelection().Max(); + bIsWrong = pImpEditView->IsWrongSpelledWord( aPaM, bMarkIfWrong ); + } + return bIsWrong; +} + +sal_Bool EditView::IsWrongSpelledWordAtPos( const Point& rPosPixel, sal_Bool bMarkIfWrong ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + Point aPos ( pImpEditView->GetWindow()->PixelToLogic( rPosPixel ) ); + aPos = pImpEditView->GetDocPos( aPos ); + EditPaM aPaM = pImpEditView->pEditEngine->pImpEditEngine->GetPaM( aPos, sal_False ); + return pImpEditView->IsWrongSpelledWord( aPaM , bMarkIfWrong ); +} + +void EditView::ExecuteSpellPopup( const Point& rPosPixel, Link* pCallBack ) +{ +#ifndef SVX_LIGHT + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + Point aPos ( pImpEditView->GetWindow()->PixelToLogic( rPosPixel ) ); + aPos = pImpEditView->GetDocPos( aPos ); + EditPaM aPaM = pImpEditView->pEditEngine->pImpEditEngine->GetPaM( aPos, sal_False ); + Reference< XSpellChecker1 > xSpeller( PIMPEE->GetSpeller() ); + ESelection aOldSel = GetSelection(); + if ( xSpeller.is() && pImpEditView->IsWrongSpelledWord( aPaM, sal_True ) ) + { + PopupMenu aPopupMenu( EditResId( RID_MENU_SPELL ) ); + PopupMenu *pAutoMenu = aPopupMenu.GetPopupMenu( MN_AUTOCORR ); + PopupMenu *pInsertMenu = aPopupMenu.GetPopupMenu( MN_INSERT ); + + EditPaM aPaM2( aPaM ); + aPaM2.GetIndex()++; + + // Gibt es Replace-Vorschlaege? + String aSelected( GetSelected() ); + // + // restrict the maximal number of suggestions displayed + // in the context menu. + // Note: That could of course be done by clipping the + // resulting sequence but the current third party + // implementations result differs greatly if the number of + // suggestions to be retuned gets changed. Statistically + // it gets much better if told to return e.g. only 7 strings + // than returning e.g. 16 suggestions and using only the + // first 7. Thus we hand down the value to use to that + // implementation here by providing an additional parameter. + Sequence< PropertyValue > aPropVals(1); + PropertyValue &rVal = aPropVals.getArray()[0]; + rVal.Name = OUString::createFromAscii( UPN_MAX_NUMBER_OF_SUGGESTIONS ); + rVal.Value <<= (INT16) 7; + // + // Gibt es Replace-Vorschlaege? + Reference< XSpellAlternatives > xSpellAlt = + xSpeller->spell( aSelected, PIMPEE->GetLanguage( aPaM2 ), aPropVals ); + + Reference< XLanguageGuessing > xLangGuesser( EE_DLL()->GetGlobalData()->GetLanguageGuesser() ); + + // check if text might belong to a different language... + LanguageType nGuessLangWord = LANGUAGE_NONE; + LanguageType nGuessLangPara = LANGUAGE_NONE; + if (xSpellAlt.is() && xLangGuesser.is()) + { + String aParaText; + ContentNode *pNode = aPaM.GetNode(); + if (pNode) + { + aParaText = *pNode; + } + else + { + DBG_ERROR( "content node is NULL" ); + } + + nGuessLangWord = lcl_CheckLanguage( xSpellAlt->getWord(), xSpeller, xLangGuesser, sal_False ); + nGuessLangPara = lcl_CheckLanguage( aParaText, xSpeller, xLangGuesser, sal_True ); + } + if (nGuessLangWord != LANGUAGE_NONE || nGuessLangPara != LANGUAGE_NONE) + { + // make sure LANGUAGE_NONE gets not used as menu entry + if (nGuessLangWord == LANGUAGE_NONE) + nGuessLangWord = nGuessLangPara; + if (nGuessLangPara == LANGUAGE_NONE) + nGuessLangPara = nGuessLangWord; + + aPopupMenu.InsertSeparator(); + String aTmpWord( SvtLanguageTable::GetLanguageString( nGuessLangWord ) ); + String aTmpPara( SvtLanguageTable::GetLanguageString( nGuessLangPara ) ); + String aWordStr( EditResId( RID_STR_WORD ) ); + aWordStr.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%x" ) ), aTmpWord ); + String aParaStr( EditResId( RID_STR_PARAGRAPH ) ); + aParaStr.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%x" ) ), aTmpPara ); + aPopupMenu.InsertItem( MN_WORDLANGUAGE, aWordStr ); + aPopupMenu.SetHelpId( MN_WORDLANGUAGE, HID_EDITENG_SPELLER_WORDLANGUAGE ); + aPopupMenu.InsertItem( MN_PARALANGUAGE, aParaStr ); + aPopupMenu.SetHelpId( MN_PARALANGUAGE, HID_EDITENG_SPELLER_PARALANGUAGE ); + } + + // ## Create mnemonics here + if ( Application::IsAutoMnemonicEnabled() ) + { + aPopupMenu.CreateAutoMnemonics(); + aPopupMenu.SetMenuFlags( aPopupMenu.GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS ); + } + + // Replace suggestions... + Sequence< OUString > aAlt; + if (xSpellAlt.is()) + aAlt = xSpellAlt->getAlternatives(); + const OUString *pAlt = aAlt.getConstArray(); + sal_uInt16 nWords = (USHORT) aAlt.getLength(); + if ( nWords ) + { + for ( sal_uInt16 nW = 0; nW < nWords; nW++ ) + { + String aAlternate( pAlt[nW] ); + aPopupMenu.InsertItem( MN_ALTSTART+nW, aAlternate, 0, nW ); + pAutoMenu->InsertItem( MN_AUTOSTART+nW, aAlternate, 0, nW ); + } + aPopupMenu.InsertSeparator( nWords ); + } + else + aPopupMenu.RemoveItem( MN_AUTOCORR ); // Loeschen? + + Reference< XDictionaryList > xDicList( SvxGetDictionaryList() ); + + Sequence< Reference< XDictionary > > aDics; + if (xDicList.is()) + aDics = xDicList->getDictionaries(); + const Reference< XDictionary > *pDic = aDics.getConstArray(); + sal_uInt16 nLanguage = PIMPEE->GetLanguage( aPaM2 ); + sal_uInt16 nDicCount = (USHORT)aDics.getLength(); + for ( sal_uInt16 i = 0; i < nDicCount; i++ ) + { + Reference< XDictionary > xDic( pDic[i], UNO_QUERY ); + if (xDic.is()) + { + sal_uInt16 nActLanguage = SvxLocaleToLanguage( xDic->getLocale() ); + if( xDic->isActive() && + xDic->getDictionaryType() == DictionaryType_POSITIVE && + (nLanguage == nActLanguage || LANGUAGE_NONE == nActLanguage ) ) + { + pInsertMenu->InsertItem( MN_DICTSTART + i, xDic->getName() ); + } + } + } + + if ( !pInsertMenu->GetItemCount() ) + aPopupMenu.EnableItem( MN_INSERT, sal_False ); + + aPopupMenu.RemoveDisabledEntries( sal_True, sal_True ); + + Rectangle aTempRect = PIMPEE->PaMtoEditCursor( aPaM, GETCRSR_TXTONLY ); + Point aScreenPos = pImpEditView->GetWindowPos( aTempRect.TopLeft() ); + aScreenPos = pImpEditView->GetWindow()->OutputToScreenPixel( aScreenPos ); + aTempRect = pImpEditView->GetWindow()->LogicToPixel( Rectangle(aScreenPos, aTempRect.GetSize() )); + + sal_uInt16 nId = aPopupMenu.Execute( pImpEditView->GetWindow(), aTempRect, POPUPMENU_NOMOUSEUPCLOSE ); + if ( nId == MN_IGNORE ) + { + String aWord = pImpEditView->SpellIgnoreOrAddWord( sal_False ); + if ( pCallBack ) + { + SpellCallbackInfo aInf( SPELLCMD_IGNOREWORD, aWord ); + pCallBack->Call( &aInf ); + } + SetSelection( aOldSel ); + } + else if ( ( nId == MN_WORDLANGUAGE ) || ( nId == MN_PARALANGUAGE ) ) + { + LanguageType nLangToUse = (nId == MN_WORDLANGUAGE) ? nGuessLangWord : nGuessLangPara; + sal_uInt16 nScriptType = SvtLanguageOptions::GetScriptTypeOfLanguage( nLangToUse ); + + SfxItemSet aAttrs = GetEditEngine()->GetEmptyItemSet(); + if (nScriptType == SCRIPTTYPE_LATIN) + aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE ) ); + if (nScriptType == SCRIPTTYPE_COMPLEX) + aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE_CTL ) ); + if (nScriptType == SCRIPTTYPE_ASIAN) + aAttrs.Put( SvxLanguageItem( nLangToUse, EE_CHAR_LANGUAGE_CJK ) ); + if ( nId == MN_PARALANGUAGE ) + { + ESelection aSel = GetSelection(); + aSel.nStartPos = 0; + aSel.nEndPos = 0xFFFF; + SetSelection( aSel ); + } + SetAttribs( aAttrs ); + PIMPEE->StartOnlineSpellTimer(); + + if ( pCallBack ) + { + SpellCallbackInfo aInf( ( nId == MN_WORDLANGUAGE ) ? SPELLCMD_WORDLANGUAGE : SPELLCMD_PARALANGUAGE, nLangToUse ); + pCallBack->Call( &aInf ); + } + SetSelection( aOldSel ); + } + else if ( nId == MN_SPELLING ) + { + if ( !pCallBack ) + { + // Cursor vor das Wort setzen... + EditPaM aCursor = pImpEditView->GetEditSelection().Min(); + pImpEditView->DrawSelection(); // alte Selektion 'weg-zeichnen' + pImpEditView->SetEditSelection( EditSelection( aCursor, aCursor ) ); + pImpEditView->DrawSelection(); + // Stuerzt ab, wenn keine SfxApp + PIMPEE->Spell( this, sal_False ); + } + else + { + SpellCallbackInfo aInf( SPELLCMD_STARTSPELLDLG, String() ); + pCallBack->Call( &aInf ); + } + } + else if ( nId >= MN_DICTSTART ) + { + Reference< XDictionary > xDic( pDic[nId - MN_DICTSTART], UNO_QUERY ); + if (xDic.is()) + xDic->add( aSelected, sal_False, String() ); + // save modified user-dictionary if it is persistent + Reference< frame::XStorable > xSavDic( xDic, UNO_QUERY ); + if (xSavDic.is()) + xSavDic->store(); + + aPaM.GetNode()->GetWrongList()->GetInvalidStart() = 0; + aPaM.GetNode()->GetWrongList()->GetInvalidEnd() = aPaM.GetNode()->Len(); + PIMPEE->StartOnlineSpellTimer(); + + if ( pCallBack ) + { + SpellCallbackInfo aInf( SPELLCMD_ADDTODICTIONARY, aSelected ); + pCallBack->Call( &aInf ); + } + SetSelection( aOldSel ); + } + else if ( nId >= MN_AUTOSTART ) + { + DBG_ASSERT(nId - MN_AUTOSTART < aAlt.getLength(), "index out of range"); + String aWord = pAlt[nId - MN_AUTOSTART]; + SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get()->GetAutoCorrect(); + if ( pAutoCorrect ) + pAutoCorrect->PutText( aSelected, aWord, PIMPEE->GetLanguage( aPaM2 ) ); + InsertText( aWord ); + } + else if ( nId >= MN_ALTSTART ) // Replace + { + DBG_ASSERT(nId - MN_ALTSTART < aAlt.getLength(), "index out of range"); + String aWord = pAlt[nId - MN_ALTSTART]; + InsertText( aWord ); + } + else + { + SetSelection( aOldSel ); + } + } +#endif +} + +void EditView::SpellIgnoreWord() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + pImpEditView->SpellIgnoreOrAddWord( sal_False ); +} + +sal_Bool EditView::SelectCurrentWord() +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + EditSelection aCurSel( pImpEditView->GetEditSelection() ); + pImpEditView->DrawSelection(); + aCurSel = PIMPEE->SelectWord( aCurSel.Max() ); + pImpEditView->SetEditSelection( aCurSel ); + pImpEditView->DrawSelection(); + ShowCursor( sal_True, sal_False ); + return aCurSel.HasRange() ? sal_True : sal_False; +} + +void EditView::InsertField( const SvxFieldItem& rFld ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + ImpEditEngine* pImpEE = PIMPEE; + pImpEditView->DrawSelection(); + pImpEE->UndoActionStart( EDITUNDO_INSERT ); + EditPaM aPaM( pImpEE->InsertField( pImpEditView->GetEditSelection(), rFld ) ); + pImpEE->UndoActionEnd( EDITUNDO_INSERT ); + pImpEditView->SetEditSelection( EditSelection( aPaM, aPaM ) ); + pImpEE->UpdateFields(); + pImpEE->FormatAndUpdate( this ); +} + +const SvxFieldItem* EditView::GetFieldUnderMousePointer() const +{ + DBG_CHKTHIS( EditView, 0 ); + sal_uInt16 nPara, nPos; + return GetFieldUnderMousePointer( nPara, nPos ); +} + +const SvxFieldItem* EditView::GetField( const Point& rPos, sal_uInt16* pPara, sal_uInt16* pPos ) const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + return pImpEditView->GetField( rPos, pPara, pPos ); +} + +const SvxFieldItem* EditView::GetFieldUnderMousePointer( sal_uInt16& nPara, sal_uInt16& nPos ) const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + Point aPos = pImpEditView->GetWindow()->GetPointerPosPixel(); + aPos = pImpEditView->GetWindow()->PixelToLogic( aPos ); + return GetField( aPos, &nPara, &nPos ); +} + +const SvxFieldItem* EditView::GetFieldAtSelection() const +{ + EditSelection aSel( pImpEditView->GetEditSelection() ); + aSel.Adjust( pImpEditView->pEditEngine->pImpEditEngine->GetEditDoc() ); + // Nur wenn Cursor vor Feld, keine Selektion, oder nur Feld selektiert + if ( ( aSel.Min().GetNode() == aSel.Max().GetNode() ) && + ( ( aSel.Max().GetIndex() == aSel.Min().GetIndex() ) || + ( aSel.Max().GetIndex() == aSel.Min().GetIndex()+1 ) ) ) + { + EditPaM aPaM = aSel.Min(); + const CharAttribArray& rAttrs = aPaM.GetNode()->GetCharAttribs().GetAttribs(); + sal_uInt16 nXPos = aPaM.GetIndex(); + for ( sal_uInt16 nAttr = rAttrs.Count(); nAttr; ) + { + EditCharAttrib* pAttr = rAttrs[--nAttr]; + if ( pAttr->GetStart() == nXPos ) + if ( pAttr->Which() == EE_FEATURE_FIELD ) + { + DBG_ASSERT( pAttr->GetItem()->ISA( SvxFieldItem ), "Kein FeldItem..." ); + return (const SvxFieldItem*)pAttr->GetItem(); + } + } + } + return 0; +} + +XubString EditView::GetWordUnderMousePointer() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + Rectangle aRect; + return GetWordUnderMousePointer( aRect ); +} + +XubString EditView::GetWordUnderMousePointer( Rectangle& rWordRect ) const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + Point aPos = pImpEditView->GetWindow()->GetPointerPosPixel(); + aPos = pImpEditView->GetWindow()->PixelToLogic( aPos ); + + XubString aWord; + + if( GetOutputArea().IsInside( aPos ) ) + { + ImpEditEngine* pImpEE = pImpEditView->pEditEngine->pImpEditEngine; + Point aDocPos( pImpEditView->GetDocPos( aPos ) ); + EditPaM aPaM = pImpEE->GetPaM( aDocPos, sal_False ); + EditSelection aWordSel = pImpEE->SelectWord( aPaM ); + + Rectangle aTopLeftRec( pImpEE->PaMtoEditCursor( aWordSel.Min() ) ); + Rectangle aBottomRightRec( pImpEE->PaMtoEditCursor( aWordSel.Max() ) ); + +#if OSL_DEBUG_LEVEL > 1 + DBG_ASSERT( aTopLeftRec.Top() == aBottomRightRec.Top(), "Top() in einer Zeile unterschiedlich?" ); +#endif + + Point aPnt1( pImpEditView->GetWindowPos( aTopLeftRec.TopLeft() ) ); + Point aPnt2( pImpEditView->GetWindowPos( aBottomRightRec.BottomRight()) ); + rWordRect = Rectangle( aPnt1, aPnt2 ); + aWord = pImpEE->GetSelected( aWordSel ); + } + + return aWord; +} + +void EditView::SetInvalidateMore( sal_uInt16 nPixel ) +{ + DBG_CHKTHIS( EditView, 0 ); + pImpEditView->SetInvalidateMore( nPixel ); +} + +sal_uInt16 EditView::GetInvalidateMore() const +{ + DBG_CHKTHIS( EditView, 0 ); + return (sal_uInt16)pImpEditView->GetInvalidateMore(); +} + +static void ChangeFontSizeImpl( EditView* pEditView, bool bGrow, const ESelection& rSel, const FontList* pFontList ) +{ + pEditView->SetSelection( rSel ); + + SfxItemSet aSet( pEditView->GetAttribs() ); + if( EditView::ChangeFontSize( bGrow, aSet, pFontList ) ) + { + SfxItemSet aNewSet( pEditView->GetEmptyItemSet() ); + aNewSet.Put( aSet.Get( EE_CHAR_FONTHEIGHT ), EE_CHAR_FONTHEIGHT ); + aNewSet.Put( aSet.Get( EE_CHAR_FONTHEIGHT_CJK ), EE_CHAR_FONTHEIGHT_CJK ); + aNewSet.Put( aSet.Get( EE_CHAR_FONTHEIGHT_CTL ), EE_CHAR_FONTHEIGHT_CTL ); + pEditView->SetAttribs( aNewSet ); + } +} + +void EditView::ChangeFontSize( bool bGrow, const FontList* pFontList ) +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + EditEngine& rEditEngine = *pImpEditView->pEditEngine; + + ESelection aSel( GetSelection() ); + ESelection aOldSelection( aSel ); + aSel.Adjust(); + + if( !aSel.HasRange() ) + { + aSel = rEditEngine.GetWord( aSel, com::sun::star::i18n::WordType::DICTIONARY_WORD ); + } + + if( aSel.HasRange() ) + { + for( USHORT nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ ) + { + SvUShorts aPortions; + rEditEngine.GetPortions( nPara, aPortions ); + + if( aPortions.Count() == 0 ) + aPortions.Insert( rEditEngine.GetTextLen(nPara), 0 ); + + const USHORT nBeginPos = (nPara == aSel.nStartPara) ? aSel.nStartPos : 0; + const USHORT nEndPos = (nPara == aSel.nEndPara) ? aSel.nEndPos : 0xffff; + + for ( USHORT nPos = 0; nPos < aPortions.Count(); ++nPos ) + { + USHORT nPortionEnd = aPortions.GetObject( nPos ); + USHORT nPortionStart = nPos > 0 ? aPortions.GetObject( nPos - 1 ) : 0; + + if( (nPortionEnd < nBeginPos) || (nPortionStart > nEndPos) ) + continue; + + if( nPortionStart < nBeginPos ) + nPortionStart = nBeginPos; + if( nPortionEnd > nEndPos ) + nPortionEnd = nEndPos; + + if( nPortionStart == nPortionEnd ) + continue; + + ESelection aPortionSel( nPara, nPortionStart, nPara, nPortionEnd ); + ChangeFontSizeImpl( this, bGrow, aPortionSel, pFontList ); + } + } + } + else + { + ChangeFontSizeImpl( this, bGrow, aSel, pFontList ); + } + + SetSelection( aOldSelection ); +} + +bool EditView::ChangeFontSize( bool bGrow, SfxItemSet& rSet, const FontList* pFontList ) +{ + static const sal_uInt16 gFontSizeWichMap[] = { EE_CHAR_FONTHEIGHT, EE_CHAR_FONTHEIGHT_CJK, EE_CHAR_FONTHEIGHT_CTL, 0 }; + + const SvxFontItem* pFontItem = static_cast<const SvxFontItem*>(&rSet.Get( EE_CHAR_FONTINFO )); + if( !pFontItem || !pFontList ) + return false; + + bool bRet = false; + + const sal_uInt16* pWhich = gFontSizeWichMap; + while( *pWhich ) + { + SvxFontHeightItem aFontHeightItem( static_cast<const SvxFontHeightItem&>(rSet.Get( *pWhich )) ); + long nHeight = aFontHeightItem.GetHeight(); + const SfxMapUnit eUnit = rSet.GetPool()->GetMetric( *pWhich ); + nHeight = OutputDevice::LogicToLogic( nHeight * 10, (MapUnit)eUnit, MAP_POINT ); + + FontInfo aFontInfo = pFontList->Get( pFontItem->GetFamilyName(), pFontItem->GetStyleName() ); + const long* pAry = pFontList->GetSizeAry( aFontInfo ); + + if( bGrow ) + { + while( *pAry ) + { + if( *pAry > nHeight ) + { + nHeight = *pAry; + break; + } + pAry++; + } + + if( *pAry == 0 ) + { + nHeight += (nHeight + 5) / 10; + if( nHeight > 9999 ) + nHeight = 9999; + } + + } + else if( *pAry ) + { + bool bFound = false; + if( *pAry < nHeight ) + { + pAry++; + while( *pAry ) + { + if( *pAry >= nHeight ) + { + nHeight = pAry[-1]; + bFound = true; + break; + } + pAry++; + } + } + + if( !bFound ) + { + nHeight -= (nHeight + 5) / 10; + if( nHeight < 2 ) + nHeight = 2; + } + } + + if( (nHeight >= 2) && (nHeight <= 9999 ) ) + { + nHeight = OutputDevice::LogicToLogic( nHeight, MAP_POINT, (MapUnit)eUnit ) / 10; + + if( nHeight != (long)aFontHeightItem.GetHeight() ) + { + aFontHeightItem.SetHeight( nHeight ); + rSet.Put( aFontHeightItem, *pWhich ); + bRet = true; + } + } + pWhich++; + } + return bRet; +} + +String EditView::GetSurroundingText() const +{ + DBG_CHKTHIS( EditView, 0 ); + DBG_CHKOBJ( pImpEditView->pEditEngine, EditEngine, 0 ); + + EditSelection aSel( pImpEditView->GetEditSelection() ); + aSel.Adjust( PIMPEE->GetEditDoc() ); + + if( HasSelection() ) + { + XubString aStr = PIMPEE->GetSelected( aSel ); + + // Stop reconversion if the selected text includes a line break. + if ( aStr.Search( 0x0A ) == STRING_NOTFOUND ) + return aStr; + else + return String(); + } + else + { + aSel.Min().SetIndex( 0 ); + aSel.Max().SetIndex( aSel.Max().GetNode()->Len() ); + return PIMPEE->GetSelected( aSel ); + } +} + +Selection EditView::GetSurroundingTextSelection() const +{ + DBG_CHKTHIS( EditView, 0 ); + + ESelection aSelection( GetSelection() ); + aSelection.Adjust(); + + if( HasSelection() ) + { + EditSelection aSel( pImpEditView->GetEditSelection() ); + aSel.Adjust( PIMPEE->GetEditDoc() ); + XubString aStr = PIMPEE->GetSelected( aSel ); + + // Stop reconversion if the selected text includes a line break. + if ( aStr.Search( 0x0A ) == STRING_NOTFOUND ) + return Selection( 0, aSelection.nEndPos - aSelection.nStartPos ); + else + return Selection( 0, 0 ); + } + else + { + return Selection( aSelection.nStartPos, aSelection.nEndPos ); + } +} |