1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <memory>
21 #include <utility>
22 
23 #include <comphelper/lok.hxx>
24 #include <comphelper/processfactory.hxx>
25 #include <config_global.h>
26 #include <vcl/svapp.hxx>
27 #include <vcl/weld.hxx>
28 #include <vcl/window.hxx>
29 
30 #include <tools/stream.hxx>
31 
32 #include <editeng/svxfont.hxx>
33 #include "impedit.hxx"
34 #include <editeng/editeng.hxx>
35 #include <editeng/editview.hxx>
36 #include <editeng/editstat.hxx>
37 #include <editeng/eerdll.hxx>
38 #include <editeng/editrids.hrc>
39 #include <editeng/flditem.hxx>
40 #include <editeng/txtrange.hxx>
41 #include <editeng/cmapitem.hxx>
42 
43 #include <editeng/autokernitem.hxx>
44 #include <editeng/contouritem.hxx>
45 #include <editeng/colritem.hxx>
46 #include <editeng/crossedoutitem.hxx>
47 #include <editeng/escapementitem.hxx>
48 #include <editeng/fhgtitem.hxx>
49 #include <editeng/fontitem.hxx>
50 #include <editeng/kernitem.hxx>
51 #include <editeng/lrspitem.hxx>
52 #include <editeng/postitem.hxx>
53 #include <editeng/shdditem.hxx>
54 #include <editeng/udlnitem.hxx>
55 #include <editeng/wghtitem.hxx>
56 #include <editeng/wrlmitem.hxx>
57 #include <editeng/langitem.hxx>
58 #include <editeng/emphasismarkitem.hxx>
59 #include <editeng/charscaleitem.hxx>
60 #include <editeng/charreliefitem.hxx>
61 
62 #include <sot/exchange.hxx>
63 #include <sot/formats.hxx>
64 
65 #include <editeng/numitem.hxx>
66 #include <rtl/strbuf.hxx>
67 #include <sal/log.hxx>
68 #include <vcl/help.hxx>
69 #include <vcl/transfer.hxx>
70 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
71 #include <com/sun/star/frame/Desktop.hpp>
72 
73 #if OSL_DEBUG_LEVEL > 1
74 #include <editeng/frmdiritem.hxx>
75 #endif
76 #include <basegfx/polygon/b2dpolygon.hxx>
77 
78 using namespace ::com::sun::star;
79 using namespace ::com::sun::star::uno;
80 using namespace ::com::sun::star::linguistic2;
81 
82 
83 #if (OSL_DEBUG_LEVEL > 1) || defined ( DBG_UTIL )
84 static bool bDebugPaint = false;
85 #endif
86 
87 
88 static rtl::Reference<SfxItemPool> pGlobalPool;
89 
EditEngine(SfxItemPool * pItemPool)90 EditEngine::EditEngine( SfxItemPool* pItemPool )
91 {
92     pImpEditEngine.reset( new ImpEditEngine( this, pItemPool ) );
93 }
94 
~EditEngine()95 EditEngine::~EditEngine()
96 {
97 }
98 
EnableUndo(bool bEnable)99 void EditEngine::EnableUndo( bool bEnable )
100 {
101     pImpEditEngine->EnableUndo( bEnable );
102 }
103 
IsUndoEnabled() const104 bool EditEngine::IsUndoEnabled() const
105 {
106     return pImpEditEngine->IsUndoEnabled();
107 }
108 
IsInUndo() const109 bool EditEngine::IsInUndo() const
110 {
111     return pImpEditEngine->IsInUndo();
112 }
113 
GetUndoManager()114 SfxUndoManager& EditEngine::GetUndoManager()
115 {
116     return pImpEditEngine->GetUndoManager();
117 }
118 
SetUndoManager(SfxUndoManager * pNew)119 SfxUndoManager* EditEngine::SetUndoManager(SfxUndoManager* pNew)
120 {
121     return pImpEditEngine->SetUndoManager(pNew);
122 }
123 
UndoActionStart(sal_uInt16 nId)124 void EditEngine::UndoActionStart( sal_uInt16 nId )
125 {
126     DBG_ASSERT( !pImpEditEngine->IsInUndo(), "Calling UndoActionStart in Undomode!" );
127     if ( !pImpEditEngine->IsInUndo() )
128         pImpEditEngine->UndoActionStart( nId );
129 }
130 
UndoActionStart(sal_uInt16 nId,const ESelection & rSel)131 void EditEngine::UndoActionStart(sal_uInt16 nId, const ESelection& rSel)
132 {
133     pImpEditEngine->UndoActionStart(nId, rSel);
134 }
135 
UndoActionEnd()136 void EditEngine::UndoActionEnd()
137 {
138     DBG_ASSERT( !pImpEditEngine->IsInUndo(), "Calling UndoActionEnd in Undomode!" );
139     if ( !pImpEditEngine->IsInUndo() )
140         pImpEditEngine->UndoActionEnd();
141 }
142 
HasTriedMergeOnLastAddUndo() const143 bool EditEngine::HasTriedMergeOnLastAddUndo() const
144 {
145     return pImpEditEngine->mbLastTryMerge;
146 }
147 
SetRefDevice(OutputDevice * pRefDev)148 void EditEngine::SetRefDevice( OutputDevice* pRefDev )
149 {
150     pImpEditEngine->SetRefDevice( pRefDev );
151 }
152 
GetRefDevice() const153 OutputDevice* EditEngine::GetRefDevice() const
154 {
155     return pImpEditEngine->GetRefDevice();
156 }
157 
SetRefMapMode(const MapMode & rMapMode)158 void EditEngine::SetRefMapMode( const MapMode& rMapMode )
159 {
160     pImpEditEngine->SetRefMapMode( rMapMode );
161 }
162 
GetRefMapMode() const163 MapMode const & EditEngine::GetRefMapMode() const
164 {
165     return pImpEditEngine->GetRefMapMode();
166 }
167 
SetBackgroundColor(const Color & rColor)168 void EditEngine::SetBackgroundColor( const Color& rColor )
169 {
170     pImpEditEngine->SetBackgroundColor( rColor );
171 }
172 
GetBackgroundColor() const173 Color const & EditEngine::GetBackgroundColor() const
174 {
175     return pImpEditEngine->GetBackgroundColor();
176 }
177 
GetAutoColor() const178 Color EditEngine::GetAutoColor() const
179 {
180     return pImpEditEngine->GetAutoColor();
181 }
182 
EnableAutoColor(bool b)183 void EditEngine::EnableAutoColor( bool b )
184 {
185     pImpEditEngine->EnableAutoColor( b );
186 }
187 
ForceAutoColor(bool b)188 void EditEngine::ForceAutoColor( bool b )
189 {
190     pImpEditEngine->ForceAutoColor( b );
191 }
192 
IsForceAutoColor() const193 bool EditEngine::IsForceAutoColor() const
194 {
195     return pImpEditEngine->IsForceAutoColor();
196 }
197 
GetEmptyItemSet() const198 const SfxItemSet& EditEngine::GetEmptyItemSet() const
199 {
200     return pImpEditEngine->GetEmptyItemSet();
201 }
202 
Draw(OutputDevice & rOutDev,const tools::Rectangle & rOutRect)203 void EditEngine::Draw( OutputDevice& rOutDev, const tools::Rectangle& rOutRect )
204 {
205     Draw( rOutDev, rOutRect, Point( 0, 0 ) );
206 }
207 
Draw(OutputDevice & rOutDev,const Point & rStartPos,Degree10 nOrientation)208 void EditEngine::Draw( OutputDevice& rOutDev, const Point& rStartPos, Degree10 nOrientation )
209 {
210     // Create with 2 points, as with positive points it will end up with
211     // LONGMAX as Size, Bottom and Right in the range > LONGMAX.
212     tools::Rectangle aBigRect( -0x3FFFFFFF, -0x3FFFFFFF, 0x3FFFFFFF, 0x3FFFFFFF );
213     if( rOutDev.GetConnectMetaFile() )
214         rOutDev.Push();
215     Point aStartPos( rStartPos );
216     if ( IsVertical() )
217     {
218         aStartPos.AdjustX(GetPaperSize().Width() );
219         aStartPos = Rotate( aStartPos, nOrientation, rStartPos );
220     }
221     pImpEditEngine->Paint(rOutDev, aBigRect, aStartPos, false, nOrientation);
222     if( rOutDev.GetConnectMetaFile() )
223         rOutDev.Pop();
224 }
225 
Draw(OutputDevice & rOutDev,const tools::Rectangle & rOutRect,const Point & rStartDocPos)226 void EditEngine::Draw( OutputDevice& rOutDev, const tools::Rectangle& rOutRect, const Point& rStartDocPos )
227 {
228     Draw( rOutDev, rOutRect, rStartDocPos, true );
229 }
230 
Draw(OutputDevice & rOutDev,const tools::Rectangle & rOutRect,const Point & rStartDocPos,bool bClip)231 void EditEngine::Draw( OutputDevice& rOutDev, const tools::Rectangle& rOutRect, const Point& rStartDocPos, bool bClip )
232 {
233 #if defined( DBG_UTIL ) || (OSL_DEBUG_LEVEL > 1)
234     if ( bDebugPaint )
235         DumpData(this, false);
236 #endif
237 
238     // Align to the pixel boundary, so that it becomes exactly the same
239     // as Paint ()
240     tools::Rectangle aOutRect( rOutDev.LogicToPixel( rOutRect ) );
241     aOutRect = rOutDev.PixelToLogic( aOutRect );
242 
243     Point aStartPos;
244     if ( !IsVertical() )
245     {
246         aStartPos.setX( aOutRect.Left() - rStartDocPos.X() );
247         aStartPos.setY( aOutRect.Top() - rStartDocPos.Y() );
248     }
249     else
250     {
251         aStartPos.setX( aOutRect.Right() + rStartDocPos.Y() );
252         aStartPos.setY( aOutRect.Top() - rStartDocPos.X() );
253     }
254 
255     bool bClipRegion = rOutDev.IsClipRegion();
256     bool bMetafile = rOutDev.GetConnectMetaFile();
257     vcl::Region aOldRegion = rOutDev.GetClipRegion();
258 
259     // If one existed => intersection!
260     // Use Push/pop for creating the Meta file
261     if ( bMetafile )
262         rOutDev.Push();
263 
264     // Always use the Intersect method, it is a must for Metafile!
265     if ( bClip )
266     {
267         // Clip only if necessary...
268         if ( rStartDocPos.X() || rStartDocPos.Y() ||
269              ( rOutRect.GetHeight() < static_cast<tools::Long>(GetTextHeight()) ) ||
270              ( rOutRect.GetWidth() < static_cast<tools::Long>(CalcTextWidth()) ) )
271         {
272             // Some printer drivers cause problems if characters graze the
273             // ClipRegion, therefore rather add a pixel more ...
274             tools::Rectangle aClipRect( aOutRect );
275             if ( rOutDev.GetOutDevType() == OUTDEV_PRINTER )
276             {
277                 Size aPixSz( 1, 0 );
278                 aPixSz = rOutDev.PixelToLogic( aPixSz );
279                 aClipRect.AdjustRight(aPixSz.Width() );
280                 aClipRect.AdjustBottom(aPixSz.Width() );
281             }
282             rOutDev.IntersectClipRegion( aClipRect );
283         }
284     }
285 
286     pImpEditEngine->Paint( rOutDev, aOutRect, aStartPos );
287 
288     if ( bMetafile )
289         rOutDev.Pop();
290     else if ( bClipRegion )
291         rOutDev.SetClipRegion( aOldRegion );
292     else
293         rOutDev.SetClipRegion();
294 }
295 
InsertView(EditView * pEditView,size_t nIndex)296 void EditEngine::InsertView(EditView* pEditView, size_t nIndex)
297 {
298 
299     if ( nIndex > pImpEditEngine->GetEditViews().size() )
300         nIndex = pImpEditEngine->GetEditViews().size();
301 
302     ImpEditEngine::ViewsType& rViews = pImpEditEngine->GetEditViews();
303     rViews.insert(rViews.begin()+nIndex, pEditView);
304 
305     EditSelection aStartSel = pImpEditEngine->GetEditDoc().GetStartPaM();
306     pEditView->pImpEditView->SetEditSelection( aStartSel );
307     if ( !pImpEditEngine->GetActiveView() )
308         pImpEditEngine->SetActiveView( pEditView );
309 
310     pEditView->pImpEditView->AddDragAndDropListeners();
311 }
312 
RemoveView(EditView * pView)313 EditView* EditEngine::RemoveView( EditView* pView )
314 {
315 
316     pView->HideCursor();
317     EditView* pRemoved = nullptr;
318     ImpEditEngine::ViewsType& rViews = pImpEditEngine->GetEditViews();
319     ImpEditEngine::ViewsType::iterator it = std::find(rViews.begin(), rViews.end(), pView);
320 
321     DBG_ASSERT( it != rViews.end(), "RemoveView with invalid index" );
322     if (it != rViews.end())
323     {
324         pRemoved = *it;
325         rViews.erase(it);
326         if ( pImpEditEngine->GetActiveView() == pView )
327         {
328             pImpEditEngine->SetActiveView( nullptr );
329             pImpEditEngine->GetSelEngine().SetCurView( nullptr );
330         }
331         pView->pImpEditView->RemoveDragAndDropListeners();
332 
333     }
334     return pRemoved;
335 }
336 
RemoveView(size_t nIndex)337 void EditEngine::RemoveView(size_t nIndex)
338 {
339     ImpEditEngine::ViewsType& rViews = pImpEditEngine->GetEditViews();
340     if (nIndex >= rViews.size())
341         return;
342 
343     EditView* pView = rViews[nIndex];
344     if ( pView )
345         RemoveView( pView );
346 }
347 
GetView(size_t nIndex) const348 EditView* EditEngine::GetView(size_t nIndex) const
349 {
350     return pImpEditEngine->GetEditViews()[nIndex];
351 }
352 
GetViewCount() const353 size_t EditEngine::GetViewCount() const
354 {
355     return pImpEditEngine->GetEditViews().size();
356 }
357 
HasView(EditView * pView) const358 bool EditEngine::HasView( EditView* pView ) const
359 {
360     ImpEditEngine::ViewsType& rViews = pImpEditEngine->GetEditViews();
361     return std::find(rViews.begin(), rViews.end(), pView) != rViews.end();
362 }
363 
GetActiveView() const364 EditView* EditEngine::GetActiveView() const
365 {
366     return pImpEditEngine->GetActiveView();
367 }
368 
SetActiveView(EditView * pView)369 void EditEngine::SetActiveView(EditView* pView)
370 {
371     pImpEditEngine->SetActiveView(pView);
372 }
373 
SetDefTab(sal_uInt16 nDefTab)374 void EditEngine::SetDefTab( sal_uInt16 nDefTab )
375 {
376     pImpEditEngine->GetEditDoc().SetDefTab( nDefTab );
377     if ( pImpEditEngine->IsFormatted() )
378     {
379         pImpEditEngine->FormatFullDoc();
380         pImpEditEngine->UpdateViews();
381     }
382 }
383 
SetPaperSize(const Size & rNewSize)384 void EditEngine::SetPaperSize( const Size& rNewSize )
385 {
386 
387     Size aOldSize( pImpEditEngine->GetPaperSize() );
388     pImpEditEngine->SetValidPaperSize( rNewSize );
389     Size aNewSize( pImpEditEngine->GetPaperSize() );
390 
391     bool bAutoPageSize = pImpEditEngine->GetStatus().AutoPageSize();
392     if ( !(bAutoPageSize || ( aNewSize.Width() != aOldSize.Width() )) )
393         return;
394 
395     for (EditView* pView : pImpEditEngine->aEditViews)
396     {
397         if ( bAutoPageSize )
398             pView->pImpEditView->RecalcOutputArea();
399         else if ( pView->pImpEditView->DoAutoSize() )
400         {
401             pView->pImpEditView->ResetOutputArea( tools::Rectangle(
402                 pView->pImpEditView->GetOutputArea().TopLeft(), aNewSize ) );
403         }
404     }
405 
406     if ( bAutoPageSize || pImpEditEngine->IsFormatted() )
407     {
408         // Changing the width has no effect for AutoPageSize, as this is
409         // determined by the text width.
410         // Optimization first after Vobis delivery was enabled ...
411         pImpEditEngine->FormatFullDoc();
412 
413         pImpEditEngine->UpdateViews( pImpEditEngine->GetActiveView() );
414 
415         if ( pImpEditEngine->GetUpdateMode() && pImpEditEngine->GetActiveView() )
416             pImpEditEngine->pActiveView->ShowCursor( false, false );
417     }
418 }
419 
GetPaperSize() const420 const Size& EditEngine::GetPaperSize() const
421 {
422     return pImpEditEngine->GetPaperSize();
423 }
424 
SetVertical(bool bVertical)425 void EditEngine::SetVertical(bool bVertical)
426 {
427     pImpEditEngine->SetVertical(bVertical);
428 }
429 
SetRotation(TextRotation nRotation)430 void EditEngine::SetRotation(TextRotation nRotation)
431 {
432     pImpEditEngine->SetRotation(nRotation);
433 }
434 
GetRotation() const435 TextRotation EditEngine::GetRotation() const
436 {
437     return pImpEditEngine->GetRotation();
438 }
439 
IsVertical() const440 bool EditEngine::IsVertical() const
441 {
442     return pImpEditEngine->IsVertical();
443 }
444 
IsTopToBottom() const445 bool EditEngine::IsTopToBottom() const
446 {
447     return pImpEditEngine->IsTopToBottom();
448 }
449 
GetDirectVertical() const450 bool EditEngine::GetDirectVertical() const
451 {
452     return pImpEditEngine->GetDirectVertical();
453 }
454 
SetTextColumns(sal_Int16 nColumns,sal_Int32 nSpacing)455 void EditEngine::SetTextColumns(sal_Int16 nColumns, sal_Int32 nSpacing)
456 {
457     pImpEditEngine->SetTextColumns(nColumns, nSpacing);
458 }
459 
SetFixedCellHeight(bool bUseFixedCellHeight)460 void EditEngine::SetFixedCellHeight( bool bUseFixedCellHeight )
461 {
462     pImpEditEngine->SetFixedCellHeight( bUseFixedCellHeight );
463 }
464 
SetDefaultHorizontalTextDirection(EEHorizontalTextDirection eHTextDir)465 void EditEngine::SetDefaultHorizontalTextDirection( EEHorizontalTextDirection eHTextDir )
466 {
467     pImpEditEngine->SetDefaultHorizontalTextDirection( eHTextDir );
468 }
469 
GetDefaultHorizontalTextDirection() const470 EEHorizontalTextDirection EditEngine::GetDefaultHorizontalTextDirection() const
471 {
472     return pImpEditEngine->GetDefaultHorizontalTextDirection();
473 }
474 
GetScriptType(const ESelection & rSelection) const475 SvtScriptType EditEngine::GetScriptType( const ESelection& rSelection ) const
476 {
477     EditSelection aSel( pImpEditEngine->CreateSel( rSelection ) );
478     return pImpEditEngine->GetItemScriptType( aSel );
479 }
480 
GetLanguage(const EditPaM & rPaM) const481 LanguageType EditEngine::GetLanguage(const EditPaM& rPaM) const
482 {
483     return pImpEditEngine->GetLanguage(rPaM);
484 }
485 
GetLanguage(sal_Int32 nPara,sal_Int32 nPos) const486 LanguageType EditEngine::GetLanguage( sal_Int32 nPara, sal_Int32 nPos ) const
487 {
488     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
489     DBG_ASSERT( pNode, "GetLanguage - nPara is invalid!" );
490     return pNode ? pImpEditEngine->GetLanguage( EditPaM( pNode, nPos ) ) : LANGUAGE_DONTKNOW;
491 }
492 
493 
TransliterateText(const ESelection & rSelection,TransliterationFlags nTransliterationMode)494 void EditEngine::TransliterateText( const ESelection& rSelection, TransliterationFlags nTransliterationMode )
495 {
496     pImpEditEngine->TransliterateText( pImpEditEngine->CreateSel( rSelection ), nTransliterationMode );
497 }
498 
TransliterateText(const EditSelection & rSelection,TransliterationFlags nTransliterationMode)499 EditSelection EditEngine::TransliterateText(const EditSelection& rSelection, TransliterationFlags nTransliterationMode)
500 {
501     return pImpEditEngine->TransliterateText(rSelection, nTransliterationMode);
502 }
503 
SetAsianCompressionMode(CharCompressType n)504 void EditEngine::SetAsianCompressionMode( CharCompressType n )
505 {
506     pImpEditEngine->SetAsianCompressionMode( n );
507 }
508 
SetKernAsianPunctuation(bool b)509 void EditEngine::SetKernAsianPunctuation( bool b )
510 {
511     pImpEditEngine->SetKernAsianPunctuation( b );
512 }
513 
SetAddExtLeading(bool b)514 void EditEngine::SetAddExtLeading( bool b )
515 {
516     pImpEditEngine->SetAddExtLeading( b );
517 }
518 
SetPolygon(const basegfx::B2DPolyPolygon & rPolyPolygon)519 void EditEngine::SetPolygon( const basegfx::B2DPolyPolygon& rPolyPolygon )
520 {
521     SetPolygon( rPolyPolygon, nullptr );
522 }
523 
SetPolygon(const basegfx::B2DPolyPolygon & rPolyPolygon,const basegfx::B2DPolyPolygon * pLinePolyPolygon)524 void EditEngine::SetPolygon(const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DPolyPolygon* pLinePolyPolygon)
525 {
526     bool bSimple(false);
527 
528     if(pLinePolyPolygon && 1 == rPolyPolygon.count())
529     {
530         if(rPolyPolygon.getB2DPolygon(0).isClosed())
531         {
532             // open polygon
533             bSimple = true;
534         }
535     }
536 
537     TextRanger* pRanger = new TextRanger( rPolyPolygon, pLinePolyPolygon, 30, 2, 2, bSimple, true );
538     pImpEditEngine->SetTextRanger( std::unique_ptr<TextRanger>(pRanger) );
539     pImpEditEngine->SetPaperSize( pRanger->GetBoundRect().GetSize() );
540 }
541 
ClearPolygon()542 void EditEngine::ClearPolygon()
543 {
544     pImpEditEngine->SetTextRanger( nullptr );
545 }
546 
GetMinAutoPaperSize() const547 const Size& EditEngine::GetMinAutoPaperSize() const
548 {
549     return pImpEditEngine->GetMinAutoPaperSize();
550 }
551 
SetMinAutoPaperSize(const Size & rSz)552 void EditEngine::SetMinAutoPaperSize( const Size& rSz )
553 {
554     pImpEditEngine->SetMinAutoPaperSize( rSz );
555 }
556 
GetMaxAutoPaperSize() const557 const Size& EditEngine::GetMaxAutoPaperSize() const
558 {
559     return pImpEditEngine->GetMaxAutoPaperSize();
560 }
561 
SetMaxAutoPaperSize(const Size & rSz)562 void EditEngine::SetMaxAutoPaperSize( const Size& rSz )
563 {
564     pImpEditEngine->SetMaxAutoPaperSize( rSz );
565 }
566 
SetMinColumnWrapHeight(tools::Long nVal)567 void EditEngine::SetMinColumnWrapHeight(tools::Long nVal)
568 {
569     pImpEditEngine->SetMinColumnWrapHeight(nVal);
570 }
571 
GetText(LineEnd eEnd) const572 OUString EditEngine::GetText( LineEnd eEnd ) const
573 {
574     return pImpEditEngine->GetEditDoc().GetText( eEnd );
575 }
576 
GetText(const ESelection & rESelection) const577 OUString EditEngine::GetText( const ESelection& rESelection ) const
578 {
579     EditSelection aSel( pImpEditEngine->CreateSel( rESelection ) );
580     return pImpEditEngine->GetSelected( aSel );
581 }
582 
GetTextLen() const583 sal_uInt32 EditEngine::GetTextLen() const
584 {
585     return pImpEditEngine->GetEditDoc().GetTextLen();
586 }
587 
GetParagraphCount() const588 sal_Int32 EditEngine::GetParagraphCount() const
589 {
590     return pImpEditEngine->aEditDoc.Count();
591 }
592 
GetLineCount(sal_Int32 nParagraph) const593 sal_Int32 EditEngine::GetLineCount( sal_Int32 nParagraph ) const
594 {
595     if ( !pImpEditEngine->IsFormatted() )
596         pImpEditEngine->FormatDoc();
597     return pImpEditEngine->GetLineCount( nParagraph );
598 }
599 
GetLineLen(sal_Int32 nParagraph,sal_Int32 nLine) const600 sal_Int32 EditEngine::GetLineLen( sal_Int32 nParagraph, sal_Int32 nLine ) const
601 {
602     if ( !pImpEditEngine->IsFormatted() )
603         pImpEditEngine->FormatDoc();
604     return pImpEditEngine->GetLineLen( nParagraph, nLine );
605 }
606 
GetLineBoundaries(sal_Int32 & rStart,sal_Int32 & rEnd,sal_Int32 nParagraph,sal_Int32 nLine) const607 void EditEngine::GetLineBoundaries( /*out*/sal_Int32& rStart, /*out*/sal_Int32& rEnd, sal_Int32 nParagraph, sal_Int32 nLine ) const
608 {
609     if ( !pImpEditEngine->IsFormatted() )
610         pImpEditEngine->FormatDoc();
611     return pImpEditEngine->GetLineBoundaries( rStart, rEnd, nParagraph, nLine );
612 }
613 
GetLineNumberAtIndex(sal_Int32 nPara,sal_Int32 nIndex) const614 sal_Int32 EditEngine::GetLineNumberAtIndex( sal_Int32 nPara, sal_Int32 nIndex ) const
615 {
616     if ( !pImpEditEngine->IsFormatted() )
617         pImpEditEngine->FormatDoc();
618     return pImpEditEngine->GetLineNumberAtIndex( nPara, nIndex );
619 }
620 
GetLineHeight(sal_Int32 nParagraph)621 sal_uInt32 EditEngine::GetLineHeight( sal_Int32 nParagraph )
622 {
623     // If someone calls GetLineHeight() with an empty Engine.
624     if ( !pImpEditEngine->IsFormatted() )
625         pImpEditEngine->FormatDoc();
626     return pImpEditEngine->GetLineHeight( nParagraph, 0 );
627 }
628 
GetParaBounds(sal_Int32 nPara)629 tools::Rectangle EditEngine::GetParaBounds( sal_Int32 nPara )
630 {
631     if ( !pImpEditEngine->IsFormatted() )
632         pImpEditEngine->FormatDoc();
633 
634     Point aPnt = GetDocPosTopLeft( nPara );
635 
636     if( IsVertical() )
637     {
638         sal_Int32 nTextHeight = pImpEditEngine->GetTextHeight();
639         sal_Int32 nParaWidth = pImpEditEngine->CalcParaWidth( nPara, true );
640         sal_uLong nParaHeight = pImpEditEngine->GetParaHeight( nPara );
641 
642         return tools::Rectangle( nTextHeight - aPnt.Y() - nParaHeight, 0, nTextHeight - aPnt.Y(), nParaWidth );
643     }
644     else
645     {
646         sal_Int32 nParaWidth = pImpEditEngine->CalcParaWidth( nPara, true );
647         sal_uLong nParaHeight = pImpEditEngine->GetParaHeight( nPara );
648 
649         return tools::Rectangle( 0, aPnt.Y(), nParaWidth, aPnt.Y() + nParaHeight );
650     }
651 }
652 
GetTextHeight(sal_Int32 nParagraph) const653 sal_uInt32 EditEngine::GetTextHeight( sal_Int32 nParagraph ) const
654 {
655     if ( !pImpEditEngine->IsFormatted() )
656         pImpEditEngine->FormatDoc();
657 
658     sal_uInt32 nHeight = pImpEditEngine->GetParaHeight( nParagraph );
659     return nHeight;
660 }
661 
GetWord(sal_Int32 nPara,sal_Int32 nIndex)662 OUString EditEngine::GetWord( sal_Int32 nPara, sal_Int32 nIndex )
663 {
664     ESelection aESel( nPara, nIndex, nPara, nIndex );
665     EditSelection aSel( pImpEditEngine->CreateSel( aESel ) );
666     aSel = pImpEditEngine->SelectWord( aSel );
667     return pImpEditEngine->GetSelected( aSel );
668 }
669 
GetWord(const ESelection & rSelection,sal_uInt16 nWordType) const670 ESelection EditEngine::GetWord( const ESelection& rSelection, sal_uInt16 nWordType  ) const
671 {
672     // ImpEditEngine-Iteration-Methods should be const!
673     EditEngine* pE = const_cast<EditEngine*>(this);
674 
675     EditSelection aSel( pE->pImpEditEngine->CreateSel( rSelection ) );
676     aSel = pE->pImpEditEngine->SelectWord( aSel, nWordType );
677     return pE->pImpEditEngine->CreateESel( aSel );
678 }
679 
CursorMoved(const ContentNode * pPrevNode)680 void EditEngine::CursorMoved(const ContentNode* pPrevNode)
681 {
682     pImpEditEngine->CursorMoved(pPrevNode);
683 }
684 
CheckIdleFormatter()685 void EditEngine::CheckIdleFormatter()
686 {
687     pImpEditEngine->CheckIdleFormatter();
688 }
689 
IsIdleFormatterActive() const690 bool EditEngine::IsIdleFormatterActive() const
691 {
692     return pImpEditEngine->aIdleFormatter.IsActive();
693 }
694 
FindParaPortion(ContentNode const * pNode)695 ParaPortion* EditEngine::FindParaPortion(ContentNode const * pNode)
696 {
697     return &pImpEditEngine->FindParaPortion(pNode);
698 }
699 
FindParaPortion(ContentNode const * pNode) const700 const ParaPortion* EditEngine::FindParaPortion(ContentNode const * pNode) const
701 {
702     return &pImpEditEngine->FindParaPortion(pNode);
703 }
704 
GetPrevVisPortion(const ParaPortion * pCurPortion) const705 const ParaPortion* EditEngine::GetPrevVisPortion(const ParaPortion* pCurPortion) const
706 {
707     return pImpEditEngine->GetPrevVisPortion(pCurPortion);
708 }
709 
GetScriptType(const EditSelection & rSel) const710 SvtScriptType EditEngine::GetScriptType(const EditSelection& rSel) const
711 {
712     return pImpEditEngine->GetItemScriptType(rSel);
713 }
714 
RemoveParaPortion(sal_Int32 nNode)715 void EditEngine::RemoveParaPortion(sal_Int32 nNode)
716 {
717     pImpEditEngine->GetParaPortions().Remove(nNode);
718 }
719 
SetCallParaInsertedOrDeleted(bool b)720 void EditEngine::SetCallParaInsertedOrDeleted(bool b)
721 {
722     pImpEditEngine->SetCallParaInsertedOrDeleted(b);
723 }
724 
IsCallParaInsertedOrDeleted() const725 bool EditEngine::IsCallParaInsertedOrDeleted() const
726 {
727     return pImpEditEngine->IsCallParaInsertedOrDeleted();
728 }
729 
AppendDeletedNodeInfo(DeletedNodeInfo * pInfo)730 void EditEngine::AppendDeletedNodeInfo(DeletedNodeInfo* pInfo)
731 {
732     pImpEditEngine->aDeletedNodes.push_back(std::unique_ptr<DeletedNodeInfo>(pInfo));
733 }
734 
UpdateSelections()735 void EditEngine::UpdateSelections()
736 {
737     pImpEditEngine->UpdateSelections();
738 }
739 
InsertContent(ContentNode * pNode,sal_Int32 nPos)740 void EditEngine::InsertContent(ContentNode* pNode, sal_Int32 nPos)
741 {
742     pImpEditEngine->InsertContent(pNode, nPos);
743 }
744 
SplitContent(sal_Int32 nNode,sal_Int32 nSepPos)745 EditPaM EditEngine::SplitContent(sal_Int32 nNode, sal_Int32 nSepPos)
746 {
747     return pImpEditEngine->SplitContent(nNode, nSepPos);
748 }
749 
ConnectContents(sal_Int32 nLeftNode,bool bBackward)750 EditPaM EditEngine::ConnectContents(sal_Int32 nLeftNode, bool bBackward)
751 {
752     return pImpEditEngine->ConnectContents(nLeftNode, bBackward);
753 }
754 
InsertFeature(const EditSelection & rEditSelection,const SfxPoolItem & rItem)755 void EditEngine::InsertFeature(const EditSelection& rEditSelection, const SfxPoolItem& rItem)
756 {
757     pImpEditEngine->ImpInsertFeature(rEditSelection, rItem);
758 }
759 
MoveParagraphs(const Range & rParagraphs,sal_Int32 nNewPos)760 EditSelection EditEngine::MoveParagraphs(const Range& rParagraphs, sal_Int32 nNewPos)
761 {
762     return pImpEditEngine->MoveParagraphs(rParagraphs, nNewPos, nullptr);
763 }
764 
RemoveCharAttribs(sal_Int32 nPara,sal_uInt16 nWhich,bool bRemoveFeatures)765 void EditEngine::RemoveCharAttribs(sal_Int32 nPara, sal_uInt16 nWhich, bool bRemoveFeatures)
766 {
767     pImpEditEngine->RemoveCharAttribs(nPara, nWhich, bRemoveFeatures);
768 }
769 
RemoveCharAttribs(const EditSelection & rSel,bool bRemoveParaAttribs,sal_uInt16 nWhich)770 void EditEngine::RemoveCharAttribs(const EditSelection& rSel, bool bRemoveParaAttribs, sal_uInt16 nWhich)
771 {
772     const EERemoveParaAttribsMode eMode = bRemoveParaAttribs?
773         EERemoveParaAttribsMode::RemoveAll :
774         EERemoveParaAttribsMode::RemoveCharItems;
775     pImpEditEngine->RemoveCharAttribs(rSel, eMode, nWhich);
776 }
777 
RemoveCharAttribs(const EditSelection & rSel,EERemoveParaAttribsMode eMode,sal_uInt16 nWhich)778 void EditEngine::RemoveCharAttribs(const EditSelection& rSel, EERemoveParaAttribsMode eMode, sal_uInt16 nWhich)
779 {
780     pImpEditEngine->RemoveCharAttribs(rSel, eMode, nWhich);
781 }
782 
GetEditViews()783 EditEngine::ViewsType& EditEngine::GetEditViews()
784 {
785     return pImpEditEngine->GetEditViews();
786 }
787 
GetEditViews() const788 const EditEngine::ViewsType& EditEngine::GetEditViews() const
789 {
790     return pImpEditEngine->GetEditViews();
791 }
792 
SetUndoMode(bool b)793 void EditEngine::SetUndoMode(bool b)
794 {
795     pImpEditEngine->SetUndoMode(b);
796 }
797 
FormatAndUpdate(EditView * pCurView,bool bCalledFromUndo)798 void EditEngine::FormatAndUpdate(EditView* pCurView, bool bCalledFromUndo)
799 {
800     pImpEditEngine->FormatAndUpdate(pCurView, bCalledFromUndo);
801 }
802 
Undo(EditView * pView)803 void EditEngine::Undo(EditView* pView)
804 {
805     pImpEditEngine->Undo(pView);
806 }
807 
Redo(EditView * pView)808 void EditEngine::Redo(EditView* pView)
809 {
810     pImpEditEngine->Redo(pView);
811 }
812 
CreateTransferable(const EditSelection & rSelection)813 uno::Reference<datatransfer::XTransferable> EditEngine::CreateTransferable(const EditSelection& rSelection)
814 {
815     return pImpEditEngine->CreateTransferable(rSelection);
816 }
817 
ParaAttribsToCharAttribs(ContentNode * pNode)818 void EditEngine::ParaAttribsToCharAttribs(ContentNode* pNode)
819 {
820     pImpEditEngine->ParaAttribsToCharAttribs(pNode);
821 }
822 
CreateEditPaM(const EPaM & rEPaM)823 EditPaM EditEngine::CreateEditPaM(const EPaM& rEPaM)
824 {
825     return pImpEditEngine->CreateEditPaM(rEPaM);
826 }
827 
ConnectParagraphs(ContentNode * pLeft,ContentNode * pRight,bool bBackward)828 EditPaM EditEngine::ConnectParagraphs(
829         ContentNode* pLeft, ContentNode* pRight, bool bBackward)
830 {
831     return pImpEditEngine->ImpConnectParagraphs(pLeft, pRight, bBackward);
832 }
833 
InsertField(const EditSelection & rEditSelection,const SvxFieldItem & rFld)834 EditPaM EditEngine::InsertField(const EditSelection& rEditSelection, const SvxFieldItem& rFld)
835 {
836     return pImpEditEngine->InsertField(rEditSelection, rFld);
837 }
838 
InsertText(const EditSelection & aCurEditSelection,const OUString & rStr)839 EditPaM EditEngine::InsertText(const EditSelection& aCurEditSelection, const OUString& rStr)
840 {
841     return pImpEditEngine->InsertText(aCurEditSelection, rStr);
842 }
843 
InsertText(const EditTextObject & rTextObject,const EditSelection & rSel)844 EditSelection EditEngine::InsertText(const EditTextObject& rTextObject, const EditSelection& rSel)
845 {
846     return pImpEditEngine->InsertText(rTextObject, rSel);
847 }
848 
InsertText(uno::Reference<datatransfer::XTransferable> const & rxDataObj,const OUString & rBaseURL,const EditPaM & rPaM,bool bUseSpecial)849 EditSelection EditEngine::InsertText(
850     uno::Reference<datatransfer::XTransferable > const & rxDataObj,
851     const OUString& rBaseURL, const EditPaM& rPaM, bool bUseSpecial)
852 {
853     return pImpEditEngine->PasteText(rxDataObj, rBaseURL, rPaM, bUseSpecial);
854 }
855 
EndOfWord(const EditPaM & rPaM)856 EditPaM EditEngine::EndOfWord(const EditPaM& rPaM)
857 {
858     return pImpEditEngine->EndOfWord(rPaM);
859 }
860 
GetPaM(const Point & aDocPos,bool bSmart)861 EditPaM EditEngine::GetPaM(const Point& aDocPos, bool bSmart)
862 {
863     return pImpEditEngine->GetPaM(aDocPos, bSmart);
864 }
865 
SelectWord(const EditSelection & rCurSelection,sal_Int16 nWordType)866 EditSelection EditEngine::SelectWord(
867         const EditSelection& rCurSelection, sal_Int16 nWordType)
868 {
869     return pImpEditEngine->SelectWord(rCurSelection, nWordType);
870 }
871 
GetXPos(const ParaPortion * pParaPortion,const EditLine * pLine,sal_Int32 nIndex,bool bPreferPortionStart) const872 tools::Long EditEngine::GetXPos(
873         const ParaPortion* pParaPortion, const EditLine* pLine, sal_Int32 nIndex, bool bPreferPortionStart) const
874 {
875     return pImpEditEngine->GetXPos(pParaPortion, pLine, nIndex, bPreferPortionStart);
876 }
877 
GetLineXPosStartEnd(const ParaPortion * pParaPortion,const EditLine * pLine) const878 Range EditEngine::GetLineXPosStartEnd(
879         const ParaPortion* pParaPortion, const EditLine* pLine) const
880 {
881     return pImpEditEngine->GetLineXPosStartEnd(pParaPortion, pLine);
882 }
883 
IsFormatted() const884 bool EditEngine::IsFormatted() const
885 {
886     return pImpEditEngine->IsFormatted();
887 }
888 
CursorLeft(const EditPaM & rPaM,sal_uInt16 nCharacterIteratorMode)889 EditPaM EditEngine::CursorLeft(const EditPaM& rPaM, sal_uInt16 nCharacterIteratorMode)
890 {
891     return pImpEditEngine->CursorLeft(rPaM, nCharacterIteratorMode);
892 }
893 
CursorRight(const EditPaM & rPaM,sal_uInt16 nCharacterIteratorMode)894 EditPaM EditEngine::CursorRight(const EditPaM& rPaM, sal_uInt16 nCharacterIteratorMode)
895 {
896     return pImpEditEngine->CursorRight(rPaM, nCharacterIteratorMode);
897 }
898 
GetInternalEditStatus()899 InternalEditStatus& EditEngine::GetInternalEditStatus()
900 {
901     return pImpEditEngine->GetStatus();
902 }
903 
GetEditDoc()904 EditDoc& EditEngine::GetEditDoc()
905 {
906     return pImpEditEngine->GetEditDoc();
907 }
908 
GetEditDoc() const909 const EditDoc& EditEngine::GetEditDoc() const
910 {
911     return pImpEditEngine->GetEditDoc();
912 }
913 
dumpAsXmlEditDoc(xmlTextWriterPtr pWriter) const914 void EditEngine::dumpAsXmlEditDoc(xmlTextWriterPtr pWriter) const
915 {
916     pImpEditEngine->GetEditDoc().dumpAsXml(pWriter);
917 }
918 
GetParaPortions()919 ParaPortionList& EditEngine::GetParaPortions()
920 {
921     return pImpEditEngine->GetParaPortions();
922 }
923 
GetParaPortions() const924 const ParaPortionList& EditEngine::GetParaPortions() const
925 {
926     return pImpEditEngine->GetParaPortions();
927 }
928 
SeekCursor(ContentNode * pNode,sal_Int32 nPos,SvxFont & rFont)929 void EditEngine::SeekCursor(ContentNode* pNode, sal_Int32 nPos, SvxFont& rFont)
930 {
931     pImpEditEngine->SeekCursor(pNode, nPos, rFont);
932 }
933 
DeleteSelection(const EditSelection & rSel)934 EditPaM EditEngine::DeleteSelection(const EditSelection& rSel)
935 {
936     return pImpEditEngine->ImpDeleteSelection(rSel);
937 }
938 
CreateESelection(const EditSelection & rSel)939 ESelection EditEngine::CreateESelection(const EditSelection& rSel)
940 {
941     return pImpEditEngine->CreateESel(rSel);
942 }
943 
CreateSelection(const ESelection & rSel)944 EditSelection EditEngine::CreateSelection(const ESelection& rSel)
945 {
946     return pImpEditEngine->CreateSel(rSel);
947 }
948 
GetBaseParaAttribs(sal_Int32 nPara) const949 const SfxItemSet& EditEngine::GetBaseParaAttribs(sal_Int32 nPara) const
950 {
951     return pImpEditEngine->GetParaAttribs(nPara);
952 }
953 
SetParaAttribsOnly(sal_Int32 nPara,const SfxItemSet & rSet)954 void EditEngine::SetParaAttribsOnly(sal_Int32 nPara, const SfxItemSet& rSet)
955 {
956     pImpEditEngine->SetParaAttribs(nPara, rSet);
957 }
958 
SetAttribs(const EditSelection & rSel,const SfxItemSet & rSet,SetAttribsMode nSpecial)959 void EditEngine::SetAttribs(const EditSelection& rSel, const SfxItemSet& rSet, SetAttribsMode nSpecial)
960 {
961     pImpEditEngine->SetAttribs(rSel, rSet, nSpecial);
962 }
963 
GetSelected(const EditSelection & rSel) const964 OUString EditEngine::GetSelected(const EditSelection& rSel) const
965 {
966     return pImpEditEngine->GetSelected(rSel);
967 }
968 
DeleteSelected(const EditSelection & rSel)969 EditPaM EditEngine::DeleteSelected(const EditSelection& rSel)
970 {
971     return pImpEditEngine->DeleteSelected(rSel);
972 }
973 
HandleBeginPasteOrDrop(PasteOrDropInfos & rInfos)974 void EditEngine::HandleBeginPasteOrDrop(PasteOrDropInfos& rInfos)
975 {
976     pImpEditEngine->aBeginPasteOrDropHdl.Call(rInfos);
977 }
978 
HandleEndPasteOrDrop(PasteOrDropInfos & rInfos)979 void EditEngine::HandleEndPasteOrDrop(PasteOrDropInfos& rInfos)
980 {
981     pImpEditEngine->aEndPasteOrDropHdl.Call(rInfos);
982 }
983 
HasText() const984 bool EditEngine::HasText() const
985 {
986     return pImpEditEngine->ImplHasText();
987 }
988 
GetSelectionEngine() const989 const EditSelectionEngine& EditEngine::GetSelectionEngine() const
990 {
991     return pImpEditEngine->aSelEngine;
992 }
993 
SetInSelectionMode(bool b)994 void EditEngine::SetInSelectionMode(bool b)
995 {
996     pImpEditEngine->bInSelection = b;
997 }
998 
PostKeyEvent(const KeyEvent & rKeyEvent,EditView * pEditView,vcl::Window const * pFrameWin)999 bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditView, vcl::Window const * pFrameWin )
1000 {
1001     DBG_ASSERT( pEditView, "no View - no cookie !" );
1002 
1003     bool bDone = true;
1004 
1005     bool bModified  = false;
1006     bool bMoved     = false;
1007     bool bAllowIdle = true;
1008     bool bReadOnly  = pEditView->IsReadOnly();
1009 
1010     GetCursorFlags nNewCursorFlags = GetCursorFlags::NONE;
1011     bool bSetCursorFlags = true;
1012 
1013     EditSelection aCurSel( pEditView->pImpEditView->GetEditSelection() );
1014     DBG_ASSERT( !aCurSel.IsInvalid(), "Blinde Selection in EditEngine::PostKeyEvent" );
1015 
1016     OUString aAutoText( pImpEditEngine->GetAutoCompleteText() );
1017     if (!pImpEditEngine->GetAutoCompleteText().isEmpty())
1018         pImpEditEngine->SetAutoCompleteText(OUString(), true);
1019 
1020     sal_uInt16 nCode = rKeyEvent.GetKeyCode().GetCode();
1021     KeyFuncType eFunc = rKeyEvent.GetKeyCode().GetFunction();
1022     if ( eFunc != KeyFuncType::DONTKNOW )
1023     {
1024         switch ( eFunc )
1025         {
1026             case KeyFuncType::UNDO:
1027             {
1028                 if ( !bReadOnly )
1029                     pEditView->Undo();
1030                 return true;
1031             }
1032             case KeyFuncType::REDO:
1033             {
1034                 if ( !bReadOnly )
1035                     pEditView->Redo();
1036                 return true;
1037             }
1038 
1039             default:    // is then possible edited below.
1040                         eFunc = KeyFuncType::DONTKNOW;
1041         }
1042     }
1043 
1044     if ( eFunc == KeyFuncType::DONTKNOW )
1045     {
1046         switch ( nCode )
1047         {
1048 #if defined( DBG_UTIL ) || (OSL_DEBUG_LEVEL > 1)
1049             case KEY_F1:
1050             {
1051                 if ( rKeyEvent.GetKeyCode().IsMod1() && rKeyEvent.GetKeyCode().IsMod2() )
1052                 {
1053                     sal_Int32 nParas = GetParagraphCount();
1054                     Point aPos;
1055                     Point aViewStart( pEditView->GetOutputArea().TopLeft() );
1056                     tools::Long n20 = 40 * pImpEditEngine->nOnePixelInRef;
1057                     for ( sal_Int32 n = 0; n < nParas; n++ )
1058                     {
1059                         tools::Long nH = GetTextHeight( n );
1060                         Point P1( aViewStart.X() + n20 + n20*(n%2), aViewStart.Y() + aPos.Y() );
1061                         Point P2( P1 );
1062                         P2.AdjustX(n20 );
1063                         P2.AdjustY(nH );
1064                         pEditView->GetWindow()->GetOutDev()->SetLineColor();
1065                         pEditView->GetWindow()->GetOutDev()->SetFillColor( (n%2) ? COL_YELLOW : COL_LIGHTGREEN );
1066                         pEditView->GetWindow()->GetOutDev()->DrawRect( tools::Rectangle( P1, P2 ) );
1067                         aPos.AdjustY(nH );
1068                     }
1069                 }
1070                 bDone = false;
1071             }
1072             break;
1073             case KEY_F11:
1074             {
1075                 if ( rKeyEvent.GetKeyCode().IsMod1() && rKeyEvent.GetKeyCode().IsMod2() )
1076                 {
1077                     bDebugPaint = !bDebugPaint;
1078                     OStringBuffer aInfo("DebugPaint: ");
1079                     aInfo.append(bDebugPaint ? "On" : "Off");
1080                     std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pEditView->GetWindow()->GetFrameWeld(),
1081                                                                   VclMessageType::Info, VclButtonsType::Ok,
1082                                                                   OStringToOUString(aInfo.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US)));
1083                     xInfoBox->run();
1084 
1085                 }
1086                 bDone = false;
1087             }
1088             break;
1089             case KEY_F12:
1090             {
1091                 if ( rKeyEvent.GetKeyCode().IsMod1() && rKeyEvent.GetKeyCode().IsMod2() )
1092                     DumpData(this, true);
1093                 bDone = false;
1094             }
1095             break;
1096 #endif
1097             case KEY_UP:
1098             case KEY_DOWN:
1099             case KEY_LEFT:
1100             case KEY_RIGHT:
1101             case KEY_HOME:
1102             case KEY_END:
1103             case KEY_PAGEUP:
1104             case KEY_PAGEDOWN:
1105             case css::awt::Key::MOVE_WORD_FORWARD:
1106             case css::awt::Key::SELECT_WORD_FORWARD:
1107             case css::awt::Key::MOVE_WORD_BACKWARD:
1108             case css::awt::Key::SELECT_WORD_BACKWARD:
1109             case css::awt::Key::MOVE_TO_BEGIN_OF_LINE:
1110             case css::awt::Key::MOVE_TO_END_OF_LINE:
1111             case css::awt::Key::SELECT_TO_BEGIN_OF_LINE:
1112             case css::awt::Key::SELECT_TO_END_OF_LINE:
1113             case css::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
1114             case css::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
1115             case css::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
1116             case css::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
1117             case css::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
1118             case css::awt::Key::MOVE_TO_END_OF_DOCUMENT:
1119             case css::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
1120             case css::awt::Key::SELECT_TO_END_OF_DOCUMENT:
1121             {
1122                 if ( !rKeyEvent.GetKeyCode().IsMod2() || ( nCode == KEY_LEFT ) || ( nCode == KEY_RIGHT ) )
1123                 {
1124                     if ( pImpEditEngine->DoVisualCursorTraveling() && ( ( nCode == KEY_LEFT ) || ( nCode == KEY_RIGHT ) /* || ( nCode == KEY_HOME ) || ( nCode == KEY_END ) */ ) )
1125                         bSetCursorFlags = false;    // Will be manipulated within visual cursor move
1126 
1127                     aCurSel = pImpEditEngine->MoveCursor( rKeyEvent, pEditView );
1128 
1129                     if ( aCurSel.HasRange() ) {
1130                         Reference<css::datatransfer::clipboard::XClipboard> aSelection(GetSystemPrimarySelection());
1131                         pEditView->pImpEditView->CutCopy( aSelection, false );
1132                     }
1133 
1134                     bMoved = true;
1135                     if ( nCode == KEY_HOME )
1136                         nNewCursorFlags |= GetCursorFlags::StartOfLine;
1137                     else if ( nCode == KEY_END )
1138                         nNewCursorFlags |= GetCursorFlags::EndOfLine;
1139 
1140                 }
1141 #if OSL_DEBUG_LEVEL > 1
1142                 GetLanguage( pImpEditEngine->GetEditDoc().GetPos( aCurSel.Max().GetNode() ), aCurSel.Max().GetIndex() );
1143 #endif
1144             }
1145             break;
1146             case KEY_BACKSPACE:
1147             case KEY_DELETE:
1148             case css::awt::Key::DELETE_WORD_BACKWARD:
1149             case css::awt::Key::DELETE_WORD_FORWARD:
1150             case css::awt::Key::DELETE_TO_BEGIN_OF_PARAGRAPH:
1151             case css::awt::Key::DELETE_TO_END_OF_PARAGRAPH:
1152             {
1153                 if ( !bReadOnly && !rKeyEvent.GetKeyCode().IsMod2() )
1154                 {
1155                     // check if we are behind a bullet and using the backspace key
1156                     ContentNode *pNode = aCurSel.Min().GetNode();
1157                     const SvxNumberFormat *pFmt = pImpEditEngine->GetNumberFormat( pNode );
1158                     if (pFmt && nCode == KEY_BACKSPACE &&
1159                         !aCurSel.HasRange() && aCurSel.Min().GetIndex() == 0)
1160                     {
1161                         // if the bullet is still visible, just make it invisible.
1162                         // Otherwise continue as usual.
1163 
1164 
1165                         sal_Int32 nPara = pImpEditEngine->GetEditDoc().GetPos( pNode );
1166                         SfxBoolItem aBulletState( pImpEditEngine->GetParaAttrib( nPara, EE_PARA_BULLETSTATE ) );
1167 
1168                         if ( aBulletState.GetValue() )
1169                         {
1170 
1171                             aBulletState.SetValue( false );
1172                             SfxItemSet aSet( pImpEditEngine->GetParaAttribs( nPara ) );
1173                             aSet.Put( aBulletState );
1174                             pImpEditEngine->SetParaAttribs( nPara, aSet );
1175 
1176                             // have this and the following paragraphs formatted and repainted.
1177                             // (not painting a numbering in the list may cause the following
1178                             // numberings to have different numbers than before and thus the
1179                             // length may have changed as well )
1180                             pImpEditEngine->FormatAndUpdate( pImpEditEngine->GetActiveView() );
1181 
1182                             break;
1183                         }
1184                     }
1185 
1186                     sal_uInt8 nDel = 0;
1187                     DeleteMode nMode = DeleteMode::Simple;
1188                     switch( nCode )
1189                     {
1190                     case css::awt::Key::DELETE_WORD_BACKWARD:
1191                         nMode = DeleteMode::RestOfWord;
1192                         nDel = DEL_LEFT;
1193                         break;
1194                     case css::awt::Key::DELETE_WORD_FORWARD:
1195                         nMode = DeleteMode::RestOfWord;
1196                         nDel = DEL_RIGHT;
1197                         break;
1198                     case css::awt::Key::DELETE_TO_BEGIN_OF_PARAGRAPH:
1199                         nMode = DeleteMode::RestOfContent;
1200                         nDel = DEL_LEFT;
1201                         break;
1202                     case css::awt::Key::DELETE_TO_END_OF_PARAGRAPH:
1203                         nMode = DeleteMode::RestOfContent;
1204                         nDel = DEL_RIGHT;
1205                         break;
1206                     default:
1207                         nDel = ( nCode == KEY_DELETE ) ? DEL_RIGHT : DEL_LEFT;
1208                         nMode = rKeyEvent.GetKeyCode().IsMod1() ? DeleteMode::RestOfWord : DeleteMode::Simple;
1209                         if ( ( nMode == DeleteMode::RestOfWord ) && rKeyEvent.GetKeyCode().IsShift() )
1210                             nMode = DeleteMode::RestOfContent;
1211                         break;
1212                     }
1213 
1214                     pEditView->pImpEditView->DrawSelectionXOR();
1215                     pImpEditEngine->UndoActionStart( EDITUNDO_DELETE );
1216                     aCurSel = pImpEditEngine->DeleteLeftOrRight( aCurSel, nDel, nMode );
1217                     pImpEditEngine->UndoActionEnd();
1218                     bModified = true;
1219                     bAllowIdle = false;
1220                 }
1221             }
1222             break;
1223             case KEY_TAB:
1224             {
1225                 if ( !bReadOnly && !rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() )
1226                 {
1227                     bool bShift = rKeyEvent.GetKeyCode().IsShift();
1228                     if ( !bShift )
1229                     {
1230                         bool bSel = pEditView->HasSelection();
1231                         if ( bSel )
1232                             pImpEditEngine->UndoActionStart( EDITUNDO_INSERT );
1233                         if ( pImpEditEngine->GetStatus().DoAutoCorrect() )
1234                             aCurSel = pImpEditEngine->AutoCorrect( aCurSel, 0, !pEditView->IsInsertMode(), pFrameWin );
1235                         aCurSel = pImpEditEngine->InsertTab( aCurSel );
1236                         if ( bSel )
1237                             pImpEditEngine->UndoActionEnd();
1238                         bModified = true;
1239                     }
1240                 }
1241                 else
1242                     bDone = false;
1243             }
1244             break;
1245             case KEY_RETURN:
1246             {
1247                 if ( !bReadOnly )
1248                 {
1249                     pEditView->pImpEditView->DrawSelectionXOR();
1250                     if ( !rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() )
1251                     {
1252                         pImpEditEngine->UndoActionStart( EDITUNDO_INSERT );
1253                         if ( rKeyEvent.GetKeyCode().IsShift() )
1254                         {
1255                             aCurSel = pImpEditEngine->AutoCorrect( aCurSel, 0, !pEditView->IsInsertMode(), pFrameWin );
1256                             aCurSel = pImpEditEngine->InsertLineBreak( aCurSel );
1257                         }
1258                         else
1259                         {
1260                             if (aAutoText.isEmpty())
1261                             {
1262                                 if ( pImpEditEngine->GetStatus().DoAutoCorrect() )
1263                                     aCurSel = pImpEditEngine->AutoCorrect( aCurSel, 0, !pEditView->IsInsertMode(), pFrameWin );
1264                                 aCurSel = pImpEditEngine->InsertParaBreak( aCurSel );
1265                             }
1266                             else
1267                             {
1268                                 DBG_ASSERT( !aCurSel.HasRange(), "Selection on complete?!" );
1269                                 EditPaM aStart( pImpEditEngine->WordLeft( aCurSel.Max() ) );
1270                                 aCurSel = pImpEditEngine->InsertText(
1271                                                 EditSelection( aStart, aCurSel.Max() ), aAutoText );
1272                                 pImpEditEngine->SetAutoCompleteText( OUString(), true );
1273                             }
1274                         }
1275                         pImpEditEngine->UndoActionEnd();
1276                         bModified = true;
1277                     }
1278                 }
1279             }
1280             break;
1281             case KEY_INSERT:
1282             {
1283                 if ( !rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() )
1284                     pEditView->SetInsertMode( !pEditView->IsInsertMode() );
1285             }
1286             break;
1287             default:
1288             {
1289                 #if (OSL_DEBUG_LEVEL > 1) && defined(DBG_UTIL)
1290                     if ( ( nCode == KEY_W ) && rKeyEvent.GetKeyCode().IsMod1() && rKeyEvent.GetKeyCode().IsMod2() )
1291                     {
1292                         SfxItemSet aAttribs = pEditView->GetAttribs();
1293                         const SvxFrameDirectionItem& rCurrentWritingMode = (const SvxFrameDirectionItem&)aAttribs.Get( EE_PARA_WRITINGDIR );
1294                         SvxFrameDirectionItem aNewItem( SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR );
1295                         if ( rCurrentWritingMode.GetValue() != SvxFrameDirection::Horizontal_RL_TB )
1296                             aNewItem.SetValue( SvxFrameDirection::Horizontal_RL_TB );
1297                         aAttribs.Put( aNewItem );
1298                         pEditView->SetAttribs( aAttribs );
1299                     }
1300                 #endif
1301                 if ( !bReadOnly && IsSimpleCharInput( rKeyEvent ) )
1302                 {
1303                     sal_Unicode nCharCode = rKeyEvent.GetCharCode();
1304                     pEditView->pImpEditView->DrawSelectionXOR();
1305                     // Autocorrection?
1306                     if ( ( pImpEditEngine->GetStatus().DoAutoCorrect() ) &&
1307                         ( SvxAutoCorrect::IsAutoCorrectChar( nCharCode ) ||
1308                           pImpEditEngine->IsNbspRunNext() ) )
1309                     {
1310                         aCurSel = pImpEditEngine->AutoCorrect(
1311                             aCurSel, nCharCode, !pEditView->IsInsertMode(), pFrameWin );
1312                     }
1313                     else
1314                     {
1315                         aCurSel = pImpEditEngine->InsertTextUserInput( aCurSel, nCharCode, !pEditView->IsInsertMode() );
1316                     }
1317                     // AutoComplete ???
1318                     if ( pImpEditEngine->GetStatus().DoAutoComplete() && ( nCharCode != ' ' ) )
1319                     {
1320                         // Only at end of word...
1321                         sal_Int32 nIndex = aCurSel.Max().GetIndex();
1322                         if ( ( nIndex >= aCurSel.Max().GetNode()->Len() ) ||
1323                              ( pImpEditEngine->aWordDelimiters.indexOf( aCurSel.Max().GetNode()->GetChar( nIndex ) ) != -1 ) )
1324                         {
1325                             EditPaM aStart( pImpEditEngine->WordLeft( aCurSel.Max() ) );
1326                             OUString aWord = pImpEditEngine->GetSelected( EditSelection( aStart, aCurSel.Max() ) );
1327                             if ( aWord.getLength() >= 3 )
1328                             {
1329                                 OUString aComplete;
1330 
1331                                 LanguageType eLang = pImpEditEngine->GetLanguage( EditPaM( aStart.GetNode(), aStart.GetIndex()+1));
1332                                 LanguageTag aLanguageTag( eLang);
1333 
1334                                 if (!pImpEditEngine->xLocaleDataWrapper.isInitialized())
1335                                     pImpEditEngine->xLocaleDataWrapper.init( SvtSysLocale().GetLocaleData().getComponentContext(), aLanguageTag);
1336                                 else
1337                                     pImpEditEngine->xLocaleDataWrapper.changeLocale( aLanguageTag);
1338 
1339                                 if (!pImpEditEngine->xTransliterationWrapper.isInitialized())
1340                                     pImpEditEngine->xTransliterationWrapper.init( SvtSysLocale().GetLocaleData().getComponentContext(), eLang);
1341                                 else
1342                                     pImpEditEngine->xTransliterationWrapper.changeLocale( eLang);
1343 
1344                                 const ::utl::TransliterationWrapper* pTransliteration = pImpEditEngine->xTransliterationWrapper.get();
1345                                 Sequence< i18n::CalendarItem2 > xItem = pImpEditEngine->xLocaleDataWrapper->getDefaultCalendarDays();
1346                                 sal_Int32 nCount = xItem.getLength();
1347                                 const i18n::CalendarItem2* pArr = xItem.getArray();
1348                                 for( sal_Int32 n = 0; n <= nCount; ++n )
1349                                 {
1350                                     const OUString& rDay = pArr[n].FullName;
1351                                     if( pTransliteration->isMatch( aWord, rDay) )
1352                                     {
1353                                         aComplete = rDay;
1354                                         break;
1355                                     }
1356                                 }
1357 
1358                                 if ( aComplete.isEmpty() )
1359                                 {
1360                                     xItem = pImpEditEngine->xLocaleDataWrapper->getDefaultCalendarMonths();
1361                                     sal_Int32 nMonthCount = xItem.getLength();
1362                                     const i18n::CalendarItem2* pMonthArr = xItem.getArray();
1363                                     for( sal_Int32 n = 0; n <= nMonthCount; ++n )
1364                                     {
1365                                         const OUString& rMon = pMonthArr[n].FullName;
1366                                         if( pTransliteration->isMatch( aWord, rMon) )
1367                                         {
1368                                             aComplete = rMon;
1369                                             break;
1370                                         }
1371                                     }
1372                                 }
1373 
1374                                 if( !aComplete.isEmpty() && ( ( aWord.getLength() + 1 ) < aComplete.getLength() ) )
1375                                 {
1376                                     pImpEditEngine->SetAutoCompleteText( aComplete, false );
1377                                     Point aPos = pImpEditEngine->PaMtoEditCursor( aCurSel.Max() ).TopLeft();
1378                                     aPos = pEditView->pImpEditView->GetWindowPos( aPos );
1379                                     aPos = pEditView->pImpEditView->GetWindow()->LogicToPixel( aPos );
1380                                     aPos = pEditView->GetWindow()->OutputToScreenPixel( aPos );
1381                                     aPos.AdjustY( -3 );
1382                                     Help::ShowQuickHelp( pEditView->GetWindow(), tools::Rectangle( aPos, Size( 1, 1 ) ), aComplete, QuickHelpFlags::Bottom|QuickHelpFlags::Left );
1383                                 }
1384                             }
1385                         }
1386                     }
1387                     bModified = true;
1388                 }
1389                 else
1390                     bDone = false;
1391             }
1392         }
1393     }
1394 
1395     pEditView->pImpEditView->SetEditSelection( aCurSel );
1396     if (comphelper::LibreOfficeKit::isActive())
1397     {
1398         pEditView->pImpEditView->DrawSelectionXOR();
1399     }
1400     pImpEditEngine->UpdateSelections();
1401 
1402     if ( ( !IsVertical() && ( nCode != KEY_UP ) && ( nCode != KEY_DOWN ) ) ||
1403          ( IsVertical() && ( nCode != KEY_LEFT ) && ( nCode != KEY_RIGHT ) ))
1404     {
1405         pEditView->pImpEditView->nTravelXPos = TRAVEL_X_DONTKNOW;
1406     }
1407 
1408     if ( /* ( nCode != KEY_HOME ) && ( nCode != KEY_END ) && */
1409         ( !IsVertical() && ( nCode != KEY_LEFT ) && ( nCode != KEY_RIGHT ) ) ||
1410          ( IsVertical() && ( nCode != KEY_UP ) && ( nCode != KEY_DOWN ) ))
1411     {
1412         pEditView->pImpEditView->SetCursorBidiLevel( CURSOR_BIDILEVEL_DONTKNOW );
1413     }
1414 
1415     if ( bSetCursorFlags )
1416         pEditView->pImpEditView->nExtraCursorFlags = nNewCursorFlags;
1417 
1418     if ( bModified )
1419     {
1420         DBG_ASSERT( !bReadOnly, "ReadOnly but modified???" );
1421         // Idle-Formatter only when AnyInput.
1422         if ( bAllowIdle && pImpEditEngine->GetStatus().UseIdleFormatter()
1423                 && Application::AnyInput( VclInputFlags::KEYBOARD) )
1424             pImpEditEngine->IdleFormatAndUpdate( pEditView );
1425         else
1426             pImpEditEngine->FormatAndUpdate( pEditView );
1427     }
1428     else if ( bMoved )
1429     {
1430         bool bGotoCursor = pEditView->pImpEditView->DoAutoScroll();
1431         pEditView->pImpEditView->ShowCursor( bGotoCursor, true );
1432         pImpEditEngine->CallStatusHdl();
1433     }
1434 
1435     return bDone;
1436 }
1437 
GetTextHeight() const1438 sal_uInt32 EditEngine::GetTextHeight() const
1439 {
1440 
1441     if ( !pImpEditEngine->IsFormatted() )
1442         pImpEditEngine->FormatDoc();
1443 
1444     sal_uInt32 nHeight = !IsVertical() ? pImpEditEngine->GetTextHeight() : pImpEditEngine->CalcTextWidth( true );
1445     return nHeight;
1446 }
1447 
GetTextHeightNTP() const1448 sal_uInt32 EditEngine::GetTextHeightNTP() const
1449 {
1450 
1451     if ( !pImpEditEngine->IsFormatted() )
1452         pImpEditEngine->FormatDoc();
1453 
1454     if ( IsVertical() )
1455         return pImpEditEngine->CalcTextWidth( true );
1456 
1457     return pImpEditEngine->GetTextHeightNTP();
1458 }
1459 
CalcTextWidth()1460 sal_uInt32 EditEngine::CalcTextWidth()
1461 {
1462 
1463     if ( !pImpEditEngine->IsFormatted() )
1464         pImpEditEngine->FormatDoc();
1465 
1466     sal_uInt32 nWidth = !IsVertical() ? pImpEditEngine->CalcTextWidth( true ) : pImpEditEngine->GetTextHeight();
1467     return nWidth;
1468 }
1469 
SetUpdateMode(bool bUpdate,bool bRestoring)1470 void EditEngine::SetUpdateMode(bool bUpdate, bool bRestoring)
1471 {
1472     pImpEditEngine->SetUpdateMode( bUpdate );
1473     if (pImpEditEngine->pActiveView)
1474     {
1475         // Not an activation if we are restoring the previous update mode.
1476         pImpEditEngine->pActiveView->ShowCursor(false, false, /*bActivate=*/!bRestoring);
1477     }
1478 }
1479 
GetUpdateMode() const1480 bool EditEngine::GetUpdateMode() const
1481 {
1482     return pImpEditEngine->GetUpdateMode();
1483 }
1484 
Clear()1485 void EditEngine::Clear()
1486 {
1487     pImpEditEngine->Clear();
1488 }
1489 
SetText(const OUString & rText)1490 void EditEngine::SetText( const OUString& rText )
1491 {
1492     pImpEditEngine->SetText( rText );
1493     if ( !rText.isEmpty() )
1494         pImpEditEngine->FormatAndUpdate();
1495 }
1496 
Read(SvStream & rInput,const OUString & rBaseURL,EETextFormat eFormat,SvKeyValueIterator * pHTTPHeaderAttrs)1497 ErrCode EditEngine::Read( SvStream& rInput, const OUString& rBaseURL, EETextFormat eFormat, SvKeyValueIterator* pHTTPHeaderAttrs /* = NULL */ )
1498 {
1499     bool bUndoEnabled = pImpEditEngine->IsUndoEnabled();
1500     pImpEditEngine->EnableUndo( false );
1501     pImpEditEngine->SetText( OUString() );
1502     EditPaM aPaM( pImpEditEngine->GetEditDoc().GetStartPaM() );
1503     pImpEditEngine->Read( rInput, rBaseURL, eFormat, EditSelection( aPaM, aPaM ), pHTTPHeaderAttrs );
1504     pImpEditEngine->EnableUndo( bUndoEnabled );
1505     return rInput.GetError();
1506 }
1507 
Write(SvStream & rOutput,EETextFormat eFormat)1508 void EditEngine::Write( SvStream& rOutput, EETextFormat eFormat )
1509 {
1510     EditPaM aStartPaM( pImpEditEngine->GetEditDoc().GetStartPaM() );
1511     EditPaM aEndPaM( pImpEditEngine->GetEditDoc().GetEndPaM() );
1512     pImpEditEngine->Write( rOutput, eFormat, EditSelection( aStartPaM, aEndPaM ) );
1513 }
1514 
CreateTextObject()1515 std::unique_ptr<EditTextObject> EditEngine::CreateTextObject()
1516 {
1517     return pImpEditEngine->CreateTextObject();
1518 }
1519 
CreateTextObject(const ESelection & rESelection)1520 std::unique_ptr<EditTextObject> EditEngine::CreateTextObject( const ESelection& rESelection )
1521 {
1522     EditSelection aSel( pImpEditEngine->CreateSel( rESelection ) );
1523     return pImpEditEngine->CreateTextObject( aSel );
1524 }
1525 
GetEmptyTextObject() const1526 std::unique_ptr<EditTextObject> EditEngine::GetEmptyTextObject() const
1527 {
1528     return pImpEditEngine->GetEmptyTextObject();
1529 }
1530 
1531 
SetText(const EditTextObject & rTextObject)1532 void EditEngine::SetText( const EditTextObject& rTextObject )
1533 {
1534     pImpEditEngine->SetText( rTextObject );
1535     pImpEditEngine->FormatAndUpdate();
1536 }
1537 
ShowParagraph(sal_Int32 nParagraph,bool bShow)1538 void EditEngine::ShowParagraph( sal_Int32 nParagraph, bool bShow )
1539 {
1540     pImpEditEngine->ShowParagraph( nParagraph, bShow );
1541 }
1542 
SetNotifyHdl(const Link<EENotify &,void> & rLink)1543 void EditEngine::SetNotifyHdl( const Link<EENotify&,void>& rLink )
1544 {
1545     pImpEditEngine->SetNotifyHdl( rLink );
1546 }
1547 
GetNotifyHdl() const1548 Link<EENotify&,void> const & EditEngine::GetNotifyHdl() const
1549 {
1550     return pImpEditEngine->GetNotifyHdl();
1551 }
1552 
SetStatusEventHdl(const Link<EditStatus &,void> & rLink)1553 void EditEngine::SetStatusEventHdl( const Link<EditStatus&, void>& rLink )
1554 {
1555     pImpEditEngine->SetStatusEventHdl( rLink );
1556 }
1557 
GetStatusEventHdl() const1558 Link<EditStatus&, void> const & EditEngine::GetStatusEventHdl() const
1559 {
1560     return pImpEditEngine->GetStatusEventHdl();
1561 }
1562 
SetHtmlImportHdl(const Link<HtmlImportInfo &,void> & rLink)1563 void EditEngine::SetHtmlImportHdl( const Link<HtmlImportInfo&,void>& rLink )
1564 {
1565     pImpEditEngine->aHtmlImportHdl = rLink;
1566 }
1567 
GetHtmlImportHdl() const1568 const Link<HtmlImportInfo&,void>& EditEngine::GetHtmlImportHdl() const
1569 {
1570     return pImpEditEngine->aHtmlImportHdl;
1571 }
1572 
SetRtfImportHdl(const Link<RtfImportInfo &,void> & rLink)1573 void EditEngine::SetRtfImportHdl( const Link<RtfImportInfo&,void>& rLink )
1574 {
1575     pImpEditEngine->aRtfImportHdl = rLink;
1576 }
1577 
GetRtfImportHdl() const1578 const Link<RtfImportInfo&,void>& EditEngine::GetRtfImportHdl() const
1579 {
1580     return pImpEditEngine->aRtfImportHdl;
1581 }
1582 
SetBeginMovingParagraphsHdl(const Link<MoveParagraphsInfo &,void> & rLink)1583 void EditEngine::SetBeginMovingParagraphsHdl( const Link<MoveParagraphsInfo&,void>& rLink )
1584 {
1585     pImpEditEngine->aBeginMovingParagraphsHdl = rLink;
1586 }
1587 
SetEndMovingParagraphsHdl(const Link<MoveParagraphsInfo &,void> & rLink)1588 void EditEngine::SetEndMovingParagraphsHdl( const Link<MoveParagraphsInfo&,void>& rLink )
1589 {
1590     pImpEditEngine->aEndMovingParagraphsHdl = rLink;
1591 }
1592 
SetBeginPasteOrDropHdl(const Link<PasteOrDropInfos &,void> & rLink)1593 void EditEngine::SetBeginPasteOrDropHdl( const Link<PasteOrDropInfos&,void>& rLink )
1594 {
1595 
1596     pImpEditEngine->aBeginPasteOrDropHdl = rLink;
1597 }
1598 
SetEndPasteOrDropHdl(const Link<PasteOrDropInfos &,void> & rLink)1599 void EditEngine::SetEndPasteOrDropHdl( const Link<PasteOrDropInfos&,void>& rLink )
1600 {
1601     pImpEditEngine->aEndPasteOrDropHdl = rLink;
1602 }
1603 
CreateTextObject(sal_Int32 nPara,sal_Int32 nParas)1604 std::unique_ptr<EditTextObject> EditEngine::CreateTextObject( sal_Int32 nPara, sal_Int32 nParas )
1605 {
1606     DBG_ASSERT( 0 <= nPara && nPara < pImpEditEngine->GetEditDoc().Count(), "CreateTextObject: Startpara out of Range" );
1607     DBG_ASSERT( nParas <= pImpEditEngine->GetEditDoc().Count() - nPara, "CreateTextObject: Endpara out of Range" );
1608 
1609     ContentNode* pStartNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
1610     ContentNode* pEndNode = pImpEditEngine->GetEditDoc().GetObject( nPara+nParas-1 );
1611     DBG_ASSERT( pStartNode, "Start-Paragraph does not exist: CreateTextObject" );
1612     DBG_ASSERT( pEndNode, "End-Paragraph does not exist: CreateTextObject" );
1613 
1614     if ( pStartNode && pEndNode )
1615     {
1616         EditSelection aTmpSel;
1617         aTmpSel.Min() = EditPaM( pStartNode, 0 );
1618         aTmpSel.Max() = EditPaM( pEndNode, pEndNode->Len() );
1619         return pImpEditEngine->CreateTextObject( aTmpSel );
1620     }
1621     return nullptr;
1622 }
1623 
RemoveParagraph(sal_Int32 nPara)1624 void EditEngine::RemoveParagraph( sal_Int32 nPara )
1625 {
1626     DBG_ASSERT( pImpEditEngine->GetEditDoc().Count() > 1, "The first paragraph should not be deleted!" );
1627     if( pImpEditEngine->GetEditDoc().Count() <= 1 )
1628         return;
1629 
1630     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
1631     const ParaPortion* pPortion = pImpEditEngine->GetParaPortions().SafeGetObject( nPara );
1632     DBG_ASSERT( pPortion && pNode, "Paragraph not found: RemoveParagraph" );
1633     if ( pNode && pPortion )
1634     {
1635         // No Undo encapsulation needed.
1636         pImpEditEngine->ImpRemoveParagraph( nPara );
1637         pImpEditEngine->InvalidateFromParagraph( nPara );
1638         pImpEditEngine->UpdateSelections();
1639         pImpEditEngine->FormatAndUpdate();
1640     }
1641 }
1642 
GetTextLen(sal_Int32 nPara) const1643 sal_Int32 EditEngine::GetTextLen( sal_Int32 nPara ) const
1644 {
1645     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
1646     DBG_ASSERT( pNode, "Paragraph not found: GetTextLen" );
1647     if ( pNode )
1648         return pNode->Len();
1649     return 0;
1650 }
1651 
GetText(sal_Int32 nPara) const1652 OUString EditEngine::GetText( sal_Int32 nPara ) const
1653 {
1654     OUString aStr;
1655     if ( 0 <= nPara && nPara < pImpEditEngine->GetEditDoc().Count() )
1656         aStr = pImpEditEngine->GetEditDoc().GetParaAsString( nPara );
1657     return aStr;
1658 }
1659 
SetModifyHdl(const Link<LinkParamNone *,void> & rLink)1660 void EditEngine::SetModifyHdl( const Link<LinkParamNone*,void>& rLink )
1661 {
1662     pImpEditEngine->SetModifyHdl( rLink );
1663 }
1664 
GetModifyHdl() const1665 Link<LinkParamNone*,void> const & EditEngine::GetModifyHdl() const
1666 {
1667     return pImpEditEngine->GetModifyHdl();
1668 }
1669 
1670 
ClearModifyFlag()1671 void EditEngine::ClearModifyFlag()
1672 {
1673     pImpEditEngine->SetModifyFlag( false );
1674 }
1675 
SetModified()1676 void EditEngine::SetModified()
1677 {
1678     pImpEditEngine->SetModifyFlag( true );
1679 }
1680 
IsModified() const1681 bool EditEngine::IsModified() const
1682 {
1683     return pImpEditEngine->IsModified();
1684 }
1685 
IsInSelectionMode() const1686 bool EditEngine::IsInSelectionMode() const
1687 {
1688     return ( pImpEditEngine->IsInSelectionMode() ||
1689                 pImpEditEngine->GetSelEngine().IsInSelection() );
1690 }
1691 
InsertParagraph(sal_Int32 nPara,const EditTextObject & rTxtObj,bool bAppend)1692 void EditEngine::InsertParagraph( sal_Int32 nPara, const EditTextObject& rTxtObj, bool bAppend )
1693 {
1694     if ( nPara > GetParagraphCount() )
1695     {
1696         SAL_WARN_IF( nPara != EE_PARA_APPEND, "editeng", "Paragraph number too large, but not EE_PARA_APPEND!" );
1697         nPara = GetParagraphCount();
1698     }
1699 
1700     pImpEditEngine->UndoActionStart( EDITUNDO_INSERT );
1701 
1702     // No Undo compounding needed.
1703     EditPaM aPaM( pImpEditEngine->InsertParagraph( nPara ) );
1704     // When InsertParagraph from the outside, no hard attributes
1705     // should be taken over!
1706     pImpEditEngine->RemoveCharAttribs( nPara );
1707     pImpEditEngine->InsertText( rTxtObj, EditSelection( aPaM, aPaM ) );
1708 
1709     if ( bAppend && nPara )
1710         pImpEditEngine->ConnectContents( nPara-1, /*bBackwards=*/false );
1711 
1712     pImpEditEngine->UndoActionEnd();
1713 
1714     pImpEditEngine->FormatAndUpdate();
1715 }
1716 
InsertParagraph(sal_Int32 nPara,const OUString & rTxt)1717 void EditEngine::InsertParagraph(sal_Int32 nPara, const OUString& rTxt)
1718 {
1719     if ( nPara > GetParagraphCount() )
1720     {
1721         SAL_WARN_IF( nPara != EE_PARA_APPEND, "editeng", "Paragraph number too large, but not EE_PARA_APPEND!" );
1722         nPara = GetParagraphCount();
1723     }
1724 
1725     pImpEditEngine->UndoActionStart( EDITUNDO_INSERT );
1726     EditPaM aPaM( pImpEditEngine->InsertParagraph( nPara ) );
1727     // When InsertParagraph from the outside, no hard attributes
1728     // should be taken over!
1729     pImpEditEngine->RemoveCharAttribs( nPara );
1730     pImpEditEngine->UndoActionEnd();
1731     pImpEditEngine->ImpInsertText( EditSelection( aPaM, aPaM ), rTxt );
1732     pImpEditEngine->FormatAndUpdate();
1733 }
1734 
SetText(sal_Int32 nPara,const OUString & rTxt)1735 void EditEngine::SetText(sal_Int32 nPara, const OUString& rTxt)
1736 {
1737     std::unique_ptr<EditSelection> pSel = pImpEditEngine->SelectParagraph( nPara );
1738     if ( pSel )
1739     {
1740         pImpEditEngine->UndoActionStart( EDITUNDO_INSERT );
1741         pImpEditEngine->ImpInsertText( *pSel, rTxt );
1742         pImpEditEngine->UndoActionEnd();
1743         pImpEditEngine->FormatAndUpdate();
1744     }
1745 }
1746 
SetParaAttribs(sal_Int32 nPara,const SfxItemSet & rSet)1747 void EditEngine::SetParaAttribs( sal_Int32 nPara, const SfxItemSet& rSet )
1748 {
1749     pImpEditEngine->SetParaAttribs( nPara, rSet );
1750     pImpEditEngine->FormatAndUpdate();
1751 }
1752 
GetParaAttribs(sal_Int32 nPara) const1753 const SfxItemSet& EditEngine::GetParaAttribs( sal_Int32 nPara ) const
1754 {
1755     return pImpEditEngine->GetParaAttribs( nPara );
1756 }
1757 
HasParaAttrib(sal_Int32 nPara,sal_uInt16 nWhich) const1758 bool EditEngine::HasParaAttrib( sal_Int32 nPara, sal_uInt16 nWhich ) const
1759 {
1760     return pImpEditEngine->HasParaAttrib( nPara, nWhich );
1761 }
1762 
GetParaAttrib(sal_Int32 nPara,sal_uInt16 nWhich)1763 const SfxPoolItem& EditEngine::GetParaAttrib( sal_Int32 nPara, sal_uInt16 nWhich )
1764 {
1765     return pImpEditEngine->GetParaAttrib( nPara, nWhich );
1766 }
1767 
SetCharAttribs(sal_Int32 nPara,const SfxItemSet & rSet)1768 void EditEngine::SetCharAttribs(sal_Int32 nPara, const SfxItemSet& rSet)
1769 {
1770     EditSelection aSel(pImpEditEngine->ConvertSelection(nPara, 0, nPara, GetTextLen(nPara)));
1771     // This is called by sd::View::OnBeginPasteOrDrop(), updating the cursor position on undo is not
1772     // wanted.
1773     pImpEditEngine->SetAttribs(aSel, rSet, /*nSpecial=*/SetAttribsMode::NONE, /*bSetSelection=*/false);
1774     pImpEditEngine->FormatAndUpdate();
1775 }
1776 
GetCharAttribs(sal_Int32 nPara,std::vector<EECharAttrib> & rLst) const1777 void EditEngine::GetCharAttribs( sal_Int32 nPara, std::vector<EECharAttrib>& rLst ) const
1778 {
1779     pImpEditEngine->GetCharAttribs( nPara, rLst );
1780 }
1781 
GetAttribs(const ESelection & rSel,EditEngineAttribs nOnlyHardAttrib)1782 SfxItemSet EditEngine::GetAttribs( const ESelection& rSel, EditEngineAttribs nOnlyHardAttrib )
1783 {
1784     EditSelection aSel( pImpEditEngine->
1785         ConvertSelection( rSel.nStartPara, rSel.nStartPos, rSel.nEndPara, rSel.nEndPos ) );
1786     return pImpEditEngine->GetAttribs( aSel, nOnlyHardAttrib );
1787 }
1788 
GetAttribs(sal_Int32 nPara,sal_Int32 nStart,sal_Int32 nEnd,GetAttribsFlags nFlags) const1789 SfxItemSet EditEngine::GetAttribs( sal_Int32 nPara, sal_Int32 nStart, sal_Int32 nEnd, GetAttribsFlags nFlags ) const
1790 {
1791     return pImpEditEngine->GetAttribs( nPara, nStart, nEnd, nFlags );
1792 }
1793 
RemoveAttribs(const ESelection & rSelection,bool bRemoveParaAttribs,sal_uInt16 nWhich)1794 void EditEngine::RemoveAttribs( const ESelection& rSelection, bool bRemoveParaAttribs, sal_uInt16 nWhich )
1795 {
1796     const EERemoveParaAttribsMode eMode = bRemoveParaAttribs?
1797         EERemoveParaAttribsMode::RemoveAll :
1798         EERemoveParaAttribsMode::RemoveCharItems;
1799 
1800     pImpEditEngine->UndoActionStart( EDITUNDO_RESETATTRIBS );
1801     EditSelection aSel( pImpEditEngine->ConvertSelection( rSelection.nStartPara, rSelection.nStartPos, rSelection.nEndPara, rSelection.nEndPos ) );
1802     pImpEditEngine->RemoveCharAttribs( aSel, eMode, nWhich  );
1803     pImpEditEngine->UndoActionEnd();
1804     pImpEditEngine->FormatAndUpdate();
1805 }
1806 
GetStandardFont(sal_Int32 nPara)1807 vcl::Font EditEngine::GetStandardFont( sal_Int32 nPara )
1808 {
1809     return GetStandardSvxFont( nPara );
1810 }
1811 
GetStandardSvxFont(sal_Int32 nPara)1812 SvxFont EditEngine::GetStandardSvxFont( sal_Int32 nPara )
1813 {
1814     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
1815     return pNode->GetCharAttribs().GetDefFont();
1816 }
1817 
StripPortions()1818 void EditEngine::StripPortions()
1819 {
1820     ScopedVclPtrInstance< VirtualDevice > aTmpDev;
1821     tools::Rectangle aBigRect( Point( 0, 0 ), Size( 0x7FFFFFFF, 0x7FFFFFFF ) );
1822     if ( IsVertical() )
1823     {
1824         if( IsTopToBottom() )
1825         {
1826             aBigRect.SetRight( 0 );
1827             aBigRect.SetLeft( -0x7FFFFFFF );
1828         }
1829         else
1830         {
1831             aBigRect.SetTop( -0x7FFFFFFF );
1832             aBigRect.SetBottom( 0 );
1833         }
1834     }
1835     pImpEditEngine->Paint(*aTmpDev, aBigRect, Point(), true);
1836 }
1837 
GetPortions(sal_Int32 nPara,std::vector<sal_Int32> & rList)1838 void EditEngine::GetPortions( sal_Int32 nPara, std::vector<sal_Int32>& rList )
1839 {
1840     if ( !pImpEditEngine->IsFormatted() )
1841         pImpEditEngine->FormatFullDoc();
1842 
1843     const ParaPortion* pParaPortion = pImpEditEngine->GetParaPortions().SafeGetObject( nPara );
1844     if ( pParaPortion )
1845     {
1846         sal_Int32 nEnd = 0;
1847         sal_Int32 nTextPortions = pParaPortion->GetTextPortions().Count();
1848         for ( sal_Int32 n = 0; n < nTextPortions; n++ )
1849         {
1850             nEnd = nEnd + pParaPortion->GetTextPortions()[n].GetLen();
1851             rList.push_back( nEnd );
1852         }
1853     }
1854 }
1855 
SetFlatMode(bool bFlat)1856 void EditEngine::SetFlatMode( bool bFlat)
1857 {
1858     pImpEditEngine->SetFlatMode( bFlat );
1859 }
1860 
IsFlatMode() const1861 bool EditEngine::IsFlatMode() const
1862 {
1863     return !( pImpEditEngine->aStatus.UseCharAttribs() );
1864 }
1865 
SetControlWord(EEControlBits nWord)1866 void EditEngine::SetControlWord( EEControlBits nWord )
1867 {
1868 
1869     if ( nWord == pImpEditEngine->aStatus.GetControlWord() )
1870         return;
1871 
1872     EEControlBits nPrev = pImpEditEngine->aStatus.GetControlWord();
1873     pImpEditEngine->aStatus.GetControlWord() = nWord;
1874 
1875     EEControlBits nChanges = nPrev ^ nWord;
1876     if ( pImpEditEngine->IsFormatted() )
1877     {
1878         // possibly reformat:
1879         if ( ( nChanges & EEControlBits::USECHARATTRIBS ) ||
1880              ( nChanges & EEControlBits::ONECHARPERLINE ) ||
1881              ( nChanges & EEControlBits::STRETCHING ) ||
1882              ( nChanges & EEControlBits::OUTLINER ) ||
1883              ( nChanges & EEControlBits::NOCOLORS ) ||
1884              ( nChanges & EEControlBits::OUTLINER2 ) )
1885         {
1886             if ( nChanges & EEControlBits::USECHARATTRIBS )
1887             {
1888                 pImpEditEngine->GetEditDoc().CreateDefFont( true );
1889             }
1890 
1891             pImpEditEngine->FormatFullDoc();
1892             pImpEditEngine->UpdateViews( pImpEditEngine->GetActiveView() );
1893         }
1894     }
1895 
1896     bool bSpellingChanged = bool(nChanges & EEControlBits::ONLINESPELLING);
1897 
1898     if ( !bSpellingChanged )
1899         return;
1900 
1901     pImpEditEngine->StopOnlineSpellTimer();
1902     if (nWord & EEControlBits::ONLINESPELLING)
1903     {
1904         // Create WrongList, start timer...
1905         sal_Int32 nNodes = pImpEditEngine->GetEditDoc().Count();
1906         for ( sal_Int32 n = 0; n < nNodes; n++ )
1907         {
1908             ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( n );
1909             pNode->CreateWrongList();
1910         }
1911         if (pImpEditEngine->IsFormatted())
1912             pImpEditEngine->StartOnlineSpellTimer();
1913     }
1914     else
1915     {
1916         tools::Long nY = 0;
1917         sal_Int32 nNodes = pImpEditEngine->GetEditDoc().Count();
1918         for ( sal_Int32 n = 0; n < nNodes; n++ )
1919         {
1920             ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( n );
1921             const ParaPortion& rPortion = pImpEditEngine->GetParaPortions()[n];
1922             bool bWrongs = false;
1923             if (pNode->GetWrongList() != nullptr)
1924                 bWrongs = !pNode->GetWrongList()->empty();
1925             pNode->DestroyWrongList();
1926             if ( bWrongs )
1927             {
1928                 pImpEditEngine->aInvalidRect.SetLeft( 0 );
1929                 pImpEditEngine->aInvalidRect.SetRight( pImpEditEngine->GetPaperSize().Width() );
1930                 pImpEditEngine->aInvalidRect.SetTop( nY+1 );
1931                 pImpEditEngine->aInvalidRect.SetBottom( nY + rPortion.GetHeight()-1 );
1932                 pImpEditEngine->UpdateViews( pImpEditEngine->pActiveView );
1933             }
1934             nY += rPortion.GetHeight();
1935         }
1936     }
1937 }
1938 
GetControlWord() const1939 EEControlBits EditEngine::GetControlWord() const
1940 {
1941     return pImpEditEngine->aStatus.GetControlWord();
1942 }
1943 
GetFirstLineStartX(sal_Int32 nParagraph)1944 tools::Long EditEngine::GetFirstLineStartX( sal_Int32 nParagraph )
1945 {
1946 
1947     tools::Long nX = 0;
1948     const ParaPortion* pPPortion = pImpEditEngine->GetParaPortions().SafeGetObject( nParagraph );
1949     if ( pPPortion )
1950     {
1951         DBG_ASSERT( pImpEditEngine->IsFormatted() || !pImpEditEngine->IsFormatting(), "GetFirstLineStartX: Doc not formatted - unable to format!" );
1952         if ( !pImpEditEngine->IsFormatted() )
1953             pImpEditEngine->FormatDoc();
1954         const EditLine& rFirstLine = pPPortion->GetLines()[0];
1955         nX = rFirstLine.GetStartPosX();
1956     }
1957     return nX;
1958 }
1959 
GetDocPos(const Point & rPaperPos) const1960 Point EditEngine::GetDocPos( const Point& rPaperPos ) const
1961 {
1962     Point aDocPos( rPaperPos );
1963     if ( IsVertical() )
1964     {
1965         if ( IsTopToBottom() )
1966         {
1967             aDocPos.setX( rPaperPos.Y() );
1968             aDocPos.setY( GetPaperSize().Width() - rPaperPos.X() );
1969         }
1970         else
1971         {
1972             aDocPos.setX( rPaperPos.Y() );
1973             aDocPos.setY( rPaperPos.X() );
1974         }
1975     }
1976     return aDocPos;
1977 }
1978 
GetDocPosTopLeft(sal_Int32 nParagraph)1979 Point EditEngine::GetDocPosTopLeft( sal_Int32 nParagraph )
1980 {
1981     const ParaPortion* pPPortion = pImpEditEngine->GetParaPortions().SafeGetObject( nParagraph );
1982     DBG_ASSERT( pPPortion, "Paragraph not found: GetWindowPosTopLeft" );
1983     Point aPoint;
1984     if ( pPPortion )
1985     {
1986 
1987         // If someone calls GetLineHeight() with an empty Engine.
1988         DBG_ASSERT( pImpEditEngine->IsFormatted() || !pImpEditEngine->IsFormatting(), "GetDocPosTopLeft: Doc not formatted - unable to format!" );
1989         if ( !pImpEditEngine->IsFormatted() )
1990             pImpEditEngine->FormatAndUpdate();
1991         if ( pPPortion->GetLines().Count() )
1992         {
1993             // Correct it if large Bullet.
1994             const EditLine& rFirstLine = pPPortion->GetLines()[0];
1995             aPoint.setX( rFirstLine.GetStartPosX() );
1996         }
1997         else
1998         {
1999             const SvxLRSpaceItem& rLRItem = pImpEditEngine->GetLRSpaceItem( pPPortion->GetNode() );
2000 // TL_NF_LR         aPoint.X() = pImpEditEngine->GetXValue( (short)(rLRItem.GetTextLeft() + rLRItem.GetTextFirstLineOffset()) );
2001             sal_Int32 nSpaceBefore = 0;
2002             pImpEditEngine->GetSpaceBeforeAndMinLabelWidth( pPPortion->GetNode(), &nSpaceBefore );
2003             short nX = static_cast<short>(rLRItem.GetTextLeft()
2004                             + rLRItem.GetTextFirstLineOffset()
2005                             + nSpaceBefore);
2006             aPoint.setX( pImpEditEngine->GetXValue( nX
2007                              ) );
2008         }
2009         aPoint.setY( pImpEditEngine->GetParaPortions().GetYOffset( pPPortion ) );
2010     }
2011     return aPoint;
2012 }
2013 
GetNumberFormat(sal_Int32) const2014 const SvxNumberFormat* EditEngine::GetNumberFormat( sal_Int32 ) const
2015 {
2016     // derived objects may override this function to give access to
2017     // bullet information (see Outliner)
2018     return nullptr;
2019 }
2020 
IsRightToLeft(sal_Int32 nPara) const2021 bool EditEngine::IsRightToLeft( sal_Int32 nPara ) const
2022 {
2023     return pImpEditEngine->IsRightToLeft( nPara );
2024 }
2025 
IsTextPos(const Point & rPaperPos,sal_uInt16 nBorder)2026 bool EditEngine::IsTextPos( const Point& rPaperPos, sal_uInt16 nBorder )
2027 {
2028 
2029     if ( !pImpEditEngine->IsFormatted() )
2030         pImpEditEngine->FormatDoc();
2031 
2032     // take unrotated positions for calculation here
2033     Point aDocPos = GetDocPos( rPaperPos );
2034 
2035     if ( ( aDocPos.Y() > 0  ) && ( aDocPos.Y() < static_cast<tools::Long>(pImpEditEngine->GetTextHeight()) ) )
2036         return pImpEditEngine->IsTextPos(aDocPos, nBorder);
2037     return false;
2038 }
2039 
SetEditTextObjectPool(SfxItemPool * pPool)2040 void EditEngine::SetEditTextObjectPool( SfxItemPool* pPool )
2041 {
2042     pImpEditEngine->SetEditTextObjectPool( pPool );
2043 }
2044 
GetEditTextObjectPool() const2045 SfxItemPool* EditEngine::GetEditTextObjectPool() const
2046 {
2047     return pImpEditEngine->GetEditTextObjectPool();
2048 }
2049 
QuickSetAttribs(const SfxItemSet & rSet,const ESelection & rSel)2050 void EditEngine::QuickSetAttribs( const SfxItemSet& rSet, const ESelection& rSel )
2051 {
2052 
2053     EditSelection aSel( pImpEditEngine->
2054         ConvertSelection( rSel.nStartPara, rSel.nStartPos, rSel.nEndPara, rSel.nEndPos ) );
2055 
2056     pImpEditEngine->SetAttribs( aSel, rSet );
2057 }
2058 
QuickMarkInvalid(const ESelection & rSel)2059 void EditEngine::QuickMarkInvalid( const ESelection& rSel )
2060 {
2061     DBG_ASSERT( rSel.nStartPara < pImpEditEngine->GetEditDoc().Count(), "MarkInvalid: Start out of Range!" );
2062     DBG_ASSERT( rSel.nEndPara < pImpEditEngine->GetEditDoc().Count(), "MarkInvalid: End out of Range!" );
2063     for ( sal_Int32 nPara = rSel.nStartPara; nPara <= rSel.nEndPara; nPara++ )
2064     {
2065         ParaPortion* pPortion = pImpEditEngine->GetParaPortions().SafeGetObject( nPara );
2066         if ( pPortion )
2067             pPortion->MarkSelectionInvalid( 0 );
2068     }
2069 }
2070 
QuickInsertText(const OUString & rText,const ESelection & rSel)2071 void EditEngine::QuickInsertText(const OUString& rText, const ESelection& rSel)
2072 {
2073 
2074     EditSelection aSel( pImpEditEngine->
2075         ConvertSelection( rSel.nStartPara, rSel.nStartPos, rSel.nEndPara, rSel.nEndPos ) );
2076 
2077     pImpEditEngine->ImpInsertText( aSel, rText );
2078 }
2079 
QuickDelete(const ESelection & rSel)2080 void EditEngine::QuickDelete( const ESelection& rSel )
2081 {
2082 
2083     EditSelection aSel( pImpEditEngine->
2084         ConvertSelection( rSel.nStartPara, rSel.nStartPos, rSel.nEndPara, rSel.nEndPos ) );
2085 
2086     pImpEditEngine->ImpDeleteSelection( aSel );
2087 }
2088 
QuickMarkToBeRepainted(sal_Int32 nPara)2089 void EditEngine::QuickMarkToBeRepainted( sal_Int32 nPara )
2090 {
2091     ParaPortion* pPortion = pImpEditEngine->GetParaPortions().SafeGetObject( nPara );
2092     if ( pPortion )
2093         pPortion->SetMustRepaint( true );
2094 }
2095 
QuickInsertLineBreak(const ESelection & rSel)2096 void EditEngine::QuickInsertLineBreak( const ESelection& rSel )
2097 {
2098 
2099     EditSelection aSel( pImpEditEngine->
2100         ConvertSelection( rSel.nStartPara, rSel.nStartPos, rSel.nEndPara, rSel.nEndPos ) );
2101 
2102     pImpEditEngine->InsertLineBreak( aSel );
2103 }
2104 
QuickInsertField(const SvxFieldItem & rFld,const ESelection & rSel)2105 void EditEngine::QuickInsertField( const SvxFieldItem& rFld, const ESelection& rSel )
2106 {
2107 
2108     EditSelection aSel( pImpEditEngine->
2109         ConvertSelection( rSel.nStartPara, rSel.nStartPos, rSel.nEndPara, rSel.nEndPos ) );
2110 
2111     pImpEditEngine->ImpInsertFeature( aSel, rFld );
2112 }
2113 
QuickFormatDoc(bool bFull)2114 void EditEngine::QuickFormatDoc( bool bFull )
2115 {
2116     if ( bFull )
2117         pImpEditEngine->FormatFullDoc();
2118     else
2119         pImpEditEngine->FormatDoc();
2120 
2121     // Don't pass active view, maybe selection is not updated yet...
2122     pImpEditEngine->UpdateViews();
2123 }
2124 
SetStyleSheet(const EditSelection & aSel,SfxStyleSheet * pStyle)2125 void EditEngine::SetStyleSheet(const EditSelection& aSel, SfxStyleSheet* pStyle)
2126 {
2127     pImpEditEngine->SetStyleSheet(aSel, pStyle);
2128 }
2129 
SetStyleSheet(sal_Int32 nPara,SfxStyleSheet * pStyle)2130 void EditEngine::SetStyleSheet( sal_Int32 nPara, SfxStyleSheet* pStyle )
2131 {
2132     pImpEditEngine->SetStyleSheet( nPara, pStyle );
2133 }
2134 
GetStyleSheet(sal_Int32 nPara) const2135 const SfxStyleSheet* EditEngine::GetStyleSheet( sal_Int32 nPara ) const
2136 {
2137     return pImpEditEngine->GetStyleSheet( nPara );
2138 }
2139 
GetStyleSheet(sal_Int32 nPara)2140 SfxStyleSheet* EditEngine::GetStyleSheet( sal_Int32 nPara )
2141 {
2142     return pImpEditEngine->GetStyleSheet( nPara );
2143 }
2144 
SetStyleSheetPool(SfxStyleSheetPool * pSPool)2145 void EditEngine::SetStyleSheetPool( SfxStyleSheetPool* pSPool )
2146 {
2147     pImpEditEngine->SetStyleSheetPool( pSPool );
2148 }
2149 
GetStyleSheetPool()2150 SfxStyleSheetPool* EditEngine::GetStyleSheetPool()
2151 {
2152     return pImpEditEngine->GetStyleSheetPool();
2153 }
2154 
SetWordDelimiters(const OUString & rDelimiters)2155 void EditEngine::SetWordDelimiters( const OUString& rDelimiters )
2156 {
2157     pImpEditEngine->aWordDelimiters = rDelimiters;
2158     if (pImpEditEngine->aWordDelimiters.indexOf(CH_FEATURE) == -1)
2159         pImpEditEngine->aWordDelimiters += OUStringChar(CH_FEATURE);
2160 }
2161 
GetWordDelimiters() const2162 const OUString& EditEngine::GetWordDelimiters() const
2163 {
2164     return pImpEditEngine->aWordDelimiters;
2165 }
2166 
EraseVirtualDevice()2167 void EditEngine::EraseVirtualDevice()
2168 {
2169     pImpEditEngine->EraseVirtualDevice();
2170 }
2171 
SetSpeller(Reference<XSpellChecker1> const & xSpeller)2172 void EditEngine::SetSpeller( Reference< XSpellChecker1 > const &xSpeller )
2173 {
2174     pImpEditEngine->SetSpeller( xSpeller );
2175 }
2176 
GetSpeller()2177 Reference< XSpellChecker1 > const & EditEngine::GetSpeller()
2178 {
2179     return pImpEditEngine->GetSpeller();
2180 }
2181 
SetHyphenator(Reference<XHyphenator> const & xHyph)2182 void EditEngine::SetHyphenator( Reference< XHyphenator > const & xHyph )
2183 {
2184     pImpEditEngine->SetHyphenator( xHyph );
2185 }
2186 
GetAllMisspellRanges(std::vector<editeng::MisspellRanges> & rRanges) const2187 void EditEngine::GetAllMisspellRanges( std::vector<editeng::MisspellRanges>& rRanges ) const
2188 {
2189     pImpEditEngine->GetAllMisspellRanges(rRanges);
2190 }
2191 
SetAllMisspellRanges(const std::vector<editeng::MisspellRanges> & rRanges)2192 void EditEngine::SetAllMisspellRanges( const std::vector<editeng::MisspellRanges>& rRanges )
2193 {
2194     pImpEditEngine->SetAllMisspellRanges(rRanges);
2195 }
2196 
SetForbiddenCharsTable(const std::shared_ptr<SvxForbiddenCharactersTable> & xForbiddenChars)2197 void EditEngine::SetForbiddenCharsTable(const std::shared_ptr<SvxForbiddenCharactersTable>& xForbiddenChars)
2198 {
2199     ImpEditEngine::SetForbiddenCharsTable( xForbiddenChars );
2200 }
2201 
SetDefaultLanguage(LanguageType eLang)2202 void EditEngine::SetDefaultLanguage( LanguageType eLang )
2203 {
2204     pImpEditEngine->SetDefaultLanguage( eLang );
2205 }
2206 
GetDefaultLanguage() const2207 LanguageType EditEngine::GetDefaultLanguage() const
2208 {
2209     return pImpEditEngine->GetDefaultLanguage();
2210 }
2211 
SpellNextDocument()2212 bool EditEngine::SpellNextDocument()
2213 {
2214     return false;
2215 }
2216 
HasSpellErrors()2217 EESpellState EditEngine::HasSpellErrors()
2218 {
2219     if ( !pImpEditEngine->GetSpeller().is()  )
2220         return EESpellState::NoSpeller;
2221 
2222     return pImpEditEngine->HasSpellErrors();
2223 }
2224 
ClearSpellErrors()2225 void EditEngine::ClearSpellErrors()
2226 {
2227     pImpEditEngine->ClearSpellErrors();
2228 }
2229 
SpellSentence(EditView const & rView,svx::SpellPortions & rToFill)2230 bool EditEngine::SpellSentence(EditView const & rView, svx::SpellPortions& rToFill )
2231 {
2232     return pImpEditEngine->SpellSentence( rView, rToFill );
2233 }
2234 
PutSpellingToSentenceStart(EditView const & rEditView)2235 void EditEngine::PutSpellingToSentenceStart( EditView const & rEditView )
2236 {
2237     pImpEditEngine->PutSpellingToSentenceStart( rEditView );
2238 }
2239 
ApplyChangedSentence(EditView const & rEditView,const svx::SpellPortions & rNewPortions,bool bRecheck)2240 void EditEngine::ApplyChangedSentence(EditView const & rEditView, const svx::SpellPortions& rNewPortions, bool bRecheck )
2241 {
2242     pImpEditEngine->ApplyChangedSentence( rEditView, rNewPortions, bRecheck  );
2243 }
2244 
HasConvertibleTextPortion(LanguageType nLang)2245 bool EditEngine::HasConvertibleTextPortion( LanguageType nLang )
2246 {
2247     return pImpEditEngine->HasConvertibleTextPortion( nLang );
2248 }
2249 
ConvertNextDocument()2250 bool EditEngine::ConvertNextDocument()
2251 {
2252     return false;
2253 }
2254 
HasText(const SvxSearchItem & rSearchItem)2255 bool EditEngine::HasText( const SvxSearchItem& rSearchItem )
2256 {
2257     return pImpEditEngine->HasText( rSearchItem );
2258 }
2259 
SetGlobalCharStretching(sal_uInt16 nX,sal_uInt16 nY)2260 void EditEngine::SetGlobalCharStretching( sal_uInt16 nX, sal_uInt16 nY )
2261 {
2262     pImpEditEngine->SetCharStretching( nX, nY );
2263 }
2264 
GetGlobalCharStretching(sal_uInt16 & rX,sal_uInt16 & rY) const2265 void EditEngine::GetGlobalCharStretching( sal_uInt16& rX, sal_uInt16& rY ) const
2266 {
2267     pImpEditEngine->GetCharStretching( rX, rY );
2268 }
2269 
ShouldCreateBigTextObject() const2270 bool EditEngine::ShouldCreateBigTextObject() const
2271 {
2272     sal_Int32 nTextPortions = 0;
2273     sal_Int32 nParas = pImpEditEngine->GetEditDoc().Count();
2274     for ( sal_Int32 nPara = 0; nPara < nParas; nPara++  )
2275     {
2276         ParaPortion& rParaPortion = pImpEditEngine->GetParaPortions()[nPara];
2277         nTextPortions = nTextPortions + rParaPortion.GetTextPortions().Count();
2278     }
2279     return nTextPortions >= pImpEditEngine->GetBigTextObjectStart();
2280 }
2281 
GetFieldCount(sal_Int32 nPara) const2282 sal_uInt16 EditEngine::GetFieldCount( sal_Int32 nPara ) const
2283 {
2284     sal_uInt16 nFields = 0;
2285     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
2286     if ( pNode )
2287     {
2288         for (auto const& attrib : pNode->GetCharAttribs().GetAttribs())
2289         {
2290             if (attrib->Which() == EE_FEATURE_FIELD)
2291                 ++nFields;
2292         }
2293     }
2294 
2295     return nFields;
2296 }
2297 
GetFieldInfo(sal_Int32 nPara,sal_uInt16 nField) const2298 EFieldInfo EditEngine::GetFieldInfo( sal_Int32 nPara, sal_uInt16 nField ) const
2299 {
2300     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
2301     if ( pNode )
2302     {
2303         sal_uInt16 nCurrentField = 0;
2304         for (auto const& attrib : pNode->GetCharAttribs().GetAttribs())
2305         {
2306             const EditCharAttrib& rAttr = *attrib;
2307             if (rAttr.Which() == EE_FEATURE_FIELD)
2308             {
2309                 if ( nCurrentField == nField )
2310                 {
2311                     const SvxFieldItem* p = static_cast<const SvxFieldItem*>(rAttr.GetItem());
2312                     EFieldInfo aInfo(*p, nPara, rAttr.GetStart());
2313                     aInfo.aCurrentText = static_cast<const EditCharAttribField&>(rAttr).GetFieldValue();
2314                     return aInfo;
2315                 }
2316 
2317                 ++nCurrentField;
2318             }
2319         }
2320     }
2321     return EFieldInfo();
2322 }
2323 
2324 
UpdateFields()2325 bool EditEngine::UpdateFields()
2326 {
2327     bool bChanges = pImpEditEngine->UpdateFields();
2328     if ( bChanges )
2329         pImpEditEngine->FormatAndUpdate();
2330     return bChanges;
2331 }
2332 
UpdateFieldsOnly()2333 bool EditEngine::UpdateFieldsOnly()
2334 {
2335     return pImpEditEngine->UpdateFields();
2336 }
2337 
RemoveFields(const std::function<bool (const SvxFieldData *)> & isFieldData)2338 void EditEngine::RemoveFields( const std::function<bool ( const SvxFieldData* )>& isFieldData )
2339 {
2340     pImpEditEngine->UpdateFields();
2341 
2342     sal_Int32 nParas = pImpEditEngine->GetEditDoc().Count();
2343     for ( sal_Int32 nPara = 0; nPara < nParas; nPara++  )
2344     {
2345         ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( nPara );
2346         const CharAttribList::AttribsType& rAttrs = pNode->GetCharAttribs().GetAttribs();
2347         for (size_t nAttr = rAttrs.size(); nAttr; )
2348         {
2349             const EditCharAttrib& rAttr = *rAttrs[--nAttr];
2350             if (rAttr.Which() == EE_FEATURE_FIELD)
2351             {
2352                 const SvxFieldData* pFldData = static_cast<const SvxFieldItem*>(rAttr.GetItem())->GetField();
2353                 if ( pFldData && ( isFieldData( pFldData )  ) )
2354                 {
2355                     DBG_ASSERT( dynamic_cast<const SvxFieldItem*>(rAttr.GetItem()), "no field item..." );
2356                     EditSelection aSel( EditPaM(pNode, rAttr.GetStart()), EditPaM(pNode, rAttr.GetEnd()) );
2357                     OUString aFieldText = static_cast<const EditCharAttribField&>(rAttr).GetFieldValue();
2358                     pImpEditEngine->ImpInsertText( aSel, aFieldText );
2359                 }
2360             }
2361         }
2362     }
2363 }
2364 
HasOnlineSpellErrors() const2365 bool EditEngine::HasOnlineSpellErrors() const
2366 {
2367     sal_Int32 nNodes = pImpEditEngine->GetEditDoc().Count();
2368     for ( sal_Int32 n = 0; n < nNodes; n++ )
2369     {
2370         ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( n );
2371         if ( pNode->GetWrongList() && !pNode->GetWrongList()->empty() )
2372             return true;
2373     }
2374     return false;
2375 }
2376 
CompleteOnlineSpelling()2377 void EditEngine::CompleteOnlineSpelling()
2378 {
2379     if ( pImpEditEngine->GetStatus().DoOnlineSpelling() )
2380     {
2381         if( !pImpEditEngine->IsFormatted() )
2382             pImpEditEngine->FormatAndUpdate();
2383 
2384         pImpEditEngine->StopOnlineSpellTimer();
2385         pImpEditEngine->DoOnlineSpelling( nullptr, true, false );
2386     }
2387 }
2388 
FindParagraph(tools::Long nDocPosY)2389 sal_Int32 EditEngine::FindParagraph( tools::Long nDocPosY )
2390 {
2391     return pImpEditEngine->GetParaPortions().FindParagraph( nDocPosY );
2392 }
2393 
FindDocPosition(const Point & rDocPos) const2394 EPosition EditEngine::FindDocPosition( const Point& rDocPos ) const
2395 {
2396     EPosition aPos;
2397     // From the point of the API, this is const...
2398     EditPaM aPaM = const_cast<EditEngine*>(this)->pImpEditEngine->GetPaM( rDocPos, false );
2399     if ( aPaM.GetNode() )
2400     {
2401         aPos.nPara = pImpEditEngine->aEditDoc.GetPos( aPaM.GetNode() );
2402         aPos.nIndex = aPaM.GetIndex();
2403     }
2404     return aPos;
2405 }
2406 
GetCharacterBounds(const EPosition & rPos) const2407 tools::Rectangle EditEngine::GetCharacterBounds( const EPosition& rPos ) const
2408 {
2409     tools::Rectangle aBounds;
2410     ContentNode* pNode = pImpEditEngine->GetEditDoc().GetObject( rPos.nPara );
2411 
2412     // Check against index, not paragraph
2413     if ( pNode && ( rPos.nIndex < pNode->Len() ) )
2414     {
2415         aBounds = pImpEditEngine->PaMtoEditCursor( EditPaM( pNode, rPos.nIndex ), GetCursorFlags::TextOnly );
2416         tools::Rectangle aR2 = pImpEditEngine->PaMtoEditCursor( EditPaM( pNode, rPos.nIndex+1 ), GetCursorFlags::TextOnly|GetCursorFlags::EndOfLine );
2417         if ( aR2.Right() > aBounds.Right() )
2418             aBounds.SetRight( aR2.Right() );
2419     }
2420     return aBounds;
2421 }
2422 
GetParagraphInfos(sal_Int32 nPara)2423 ParagraphInfos EditEngine::GetParagraphInfos( sal_Int32 nPara )
2424 {
2425 
2426     // This only works if not already in the format ...
2427     if ( !pImpEditEngine->IsFormatted() )
2428         pImpEditEngine->FormatDoc();
2429 
2430     ParagraphInfos aInfos;
2431     aInfos.bValid = pImpEditEngine->IsFormatted();
2432     if ( pImpEditEngine->IsFormatted() )
2433     {
2434         const ParaPortion& rParaPortion = pImpEditEngine->GetParaPortions()[nPara];
2435         const EditLine* pLine = rParaPortion.GetLines().Count() ?
2436                 &rParaPortion.GetLines()[0] : nullptr;
2437         DBG_ASSERT( pLine, "GetParagraphInfos - Paragraph out of range" );
2438         if ( pLine )
2439         {
2440             aInfos.nFirstLineHeight = pLine->GetHeight();
2441             aInfos.nFirstLineTextHeight = pLine->GetTxtHeight();
2442             aInfos.nFirstLineMaxAscent = pLine->GetMaxAscent();
2443         }
2444     }
2445     return aInfos;
2446 }
2447 
2448 css::uno::Reference< css::datatransfer::XTransferable >
CreateTransferable(const ESelection & rSelection) const2449                     EditEngine::CreateTransferable( const ESelection& rSelection ) const
2450 {
2451     EditSelection aSel( pImpEditEngine->CreateSel( rSelection ) );
2452     return pImpEditEngine->CreateTransferable( aSel );
2453 }
2454 
2455 
2456 // ======================    Virtual Methods    ========================
2457 
DrawingText(const Point &,const OUString &,sal_Int32,sal_Int32,const tools::Long *,const SvxFont &,sal_Int32,sal_uInt8,const EEngineData::WrongSpellVector *,const SvxFieldData *,bool,bool,const css::lang::Locale *,const Color &,const Color &)2458 void EditEngine::DrawingText( const Point&, const OUString&, sal_Int32, sal_Int32,
2459                               const tools::Long*, const SvxFont&, sal_Int32 /*nPara*/, sal_uInt8 /*nRightToLeft*/,
2460                               const EEngineData::WrongSpellVector*, const SvxFieldData*, bool, bool,
2461                               const css::lang::Locale*, const Color&, const Color&)
2462 
2463 {
2464 }
2465 
DrawingTab(const Point &,tools::Long,const OUString &,const SvxFont &,sal_Int32,sal_uInt8,bool,bool,const Color &,const Color &)2466 void EditEngine::DrawingTab( const Point& /*rStartPos*/, tools::Long /*nWidth*/,
2467                              const OUString& /*rChar*/, const SvxFont& /*rFont*/,
2468                              sal_Int32 /*nPara*/, sal_uInt8 /*nRightToLeft*/, bool /*bEndOfLine*/,
2469                              bool /*bEndOfParagraph*/, const Color& /*rOverlineColor*/,
2470                              const Color& /*rTextLineColor*/)
2471 {
2472 }
2473 
PaintingFirstLine(sal_Int32,const Point &,const Point &,Degree10,OutputDevice &)2474 void EditEngine::PaintingFirstLine(sal_Int32, const Point&, const Point&, Degree10, OutputDevice&)
2475 {
2476 }
2477 
ParagraphInserted(sal_Int32 nPara)2478 void EditEngine::ParagraphInserted( sal_Int32 nPara )
2479 {
2480 
2481     if ( GetNotifyHdl().IsSet() )
2482     {
2483         EENotify aNotify( EE_NOTIFY_PARAGRAPHINSERTED );
2484         aNotify.nParagraph = nPara;
2485         pImpEditEngine->GetNotifyHdl().Call( aNotify );
2486     }
2487 }
2488 
ParagraphDeleted(sal_Int32 nPara)2489 void EditEngine::ParagraphDeleted( sal_Int32 nPara )
2490 {
2491 
2492     if ( GetNotifyHdl().IsSet() )
2493     {
2494         EENotify aNotify( EE_NOTIFY_PARAGRAPHREMOVED );
2495         aNotify.nParagraph = nPara;
2496         pImpEditEngine->GetNotifyHdl().Call( aNotify );
2497     }
2498 }
ParagraphConnected(sal_Int32,sal_Int32)2499 void EditEngine::ParagraphConnected( sal_Int32 /*nLeftParagraph*/, sal_Int32 /*nRightParagraph*/ )
2500 {
2501 }
2502 
ParaAttribsChanged(sal_Int32)2503 void EditEngine::ParaAttribsChanged( sal_Int32 /* nParagraph */ )
2504 {
2505 }
2506 
StyleSheetChanged(SfxStyleSheet *)2507 void EditEngine::StyleSheetChanged( SfxStyleSheet* /* pStyle */ )
2508 {
2509 }
2510 
ParagraphHeightChanged(sal_Int32 nPara)2511 void EditEngine::ParagraphHeightChanged( sal_Int32 nPara )
2512 {
2513     if ( GetNotifyHdl().IsSet() )
2514     {
2515         EENotify aNotify( EE_NOTIFY_TextHeightChanged );
2516         aNotify.nParagraph = nPara;
2517         pImpEditEngine->GetNotifyHdl().Call( aNotify );
2518     }
2519 
2520     for (EditView* pView : pImpEditEngine->aEditViews)
2521         pView->pImpEditView->ScrollStateChange();
2522 }
2523 
GetUndoComment(sal_uInt16 nId) const2524 OUString EditEngine::GetUndoComment( sal_uInt16 nId ) const
2525 {
2526     OUString aComment;
2527     switch ( nId )
2528     {
2529         case EDITUNDO_REMOVECHARS:
2530         case EDITUNDO_CONNECTPARAS:
2531         case EDITUNDO_DELCONTENT:
2532         case EDITUNDO_DELETE:
2533         case EDITUNDO_CUT:
2534             aComment = EditResId(RID_EDITUNDO_DEL);
2535         break;
2536         case EDITUNDO_MOVEPARAGRAPHS:
2537         case EDITUNDO_MOVEPARAS:
2538         case EDITUNDO_DRAGANDDROP:
2539             aComment = EditResId(RID_EDITUNDO_MOVE);
2540         break;
2541         case EDITUNDO_INSERTFEATURE:
2542         case EDITUNDO_SPLITPARA:
2543         case EDITUNDO_INSERTCHARS:
2544         case EDITUNDO_PASTE:
2545         case EDITUNDO_INSERT:
2546         case EDITUNDO_READ:
2547             aComment = EditResId(RID_EDITUNDO_INSERT);
2548         break;
2549         case EDITUNDO_REPLACEALL:
2550             aComment = EditResId(RID_EDITUNDO_REPLACE);
2551         break;
2552         case EDITUNDO_ATTRIBS:
2553         case EDITUNDO_PARAATTRIBS:
2554             aComment = EditResId(RID_EDITUNDO_SETATTRIBS);
2555         break;
2556         case EDITUNDO_RESETATTRIBS:
2557             aComment = EditResId(RID_EDITUNDO_RESETATTRIBS);
2558         break;
2559         case EDITUNDO_STYLESHEET:
2560             aComment = EditResId(RID_EDITUNDO_SETSTYLE);
2561         break;
2562         case EDITUNDO_TRANSLITERATE:
2563             aComment = EditResId(RID_EDITUNDO_TRANSLITERATE);
2564         break;
2565         case EDITUNDO_INDENTBLOCK:
2566         case EDITUNDO_UNINDENTBLOCK:
2567             aComment = EditResId(RID_EDITUNDO_INDENT);
2568         break;
2569     }
2570     return aComment;
2571 }
2572 
GetBulletArea(sal_Int32)2573 tools::Rectangle EditEngine::GetBulletArea( sal_Int32 )
2574 {
2575     return tools::Rectangle( Point(), Point() );
2576 }
2577 
CalcFieldValue(const SvxFieldItem &,sal_Int32,sal_Int32,std::optional<Color> &,std::optional<Color> &)2578 OUString EditEngine::CalcFieldValue( const SvxFieldItem&, sal_Int32, sal_Int32, std::optional<Color>&, std::optional<Color>& )
2579 {
2580     return OUString(' ');
2581 }
2582 
FieldClicked(const SvxFieldItem &)2583 void EditEngine::FieldClicked( const SvxFieldItem& )
2584 {
2585 }
2586 
2587 
2588 // ======================     Static Methods     =======================
2589 
CreatePool()2590 rtl::Reference<SfxItemPool> EditEngine::CreatePool()
2591 {
2592     return new EditEngineItemPool();
2593 }
2594 
2595 
2596 /** If we let the libc runtime clean us up, we trigger a crash */
2597 namespace
2598 {
2599 class TerminateListener : public ::cppu::WeakImplHelper< css::frame::XTerminateListener >
2600 {
queryTermination(const lang::EventObject &)2601     void SAL_CALL queryTermination( const lang::EventObject& ) override
2602     {}
notifyTermination(const lang::EventObject &)2603     void SAL_CALL notifyTermination( const lang::EventObject& ) override
2604     {
2605         pGlobalPool.clear();
2606     }
disposing(const::css::lang::EventObject &)2607     virtual void SAL_CALL disposing( const ::css::lang::EventObject& ) override
2608     {}
2609 };
2610 };
2611 
GetGlobalItemPool()2612 SfxItemPool& EditEngine::GetGlobalItemPool()
2613 {
2614     if ( !pGlobalPool )
2615     {
2616         pGlobalPool = CreatePool();
2617         uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create(comphelper::getProcessComponentContext());
2618         uno::Reference< frame::XTerminateListener > xListener( new TerminateListener );
2619         xDesktop->addTerminateListener( xListener );
2620     }
2621     return *pGlobalPool;
2622 }
2623 
SetFontInfoInItemSet(SfxItemSet & rSet,const vcl::Font & rFont)2624 void EditEngine::SetFontInfoInItemSet( SfxItemSet& rSet, const vcl::Font& rFont )
2625 {
2626     SvxFont aSvxFont( rFont );
2627     SetFontInfoInItemSet( rSet, aSvxFont );
2628 
2629 }
2630 
SetFontInfoInItemSet(SfxItemSet & rSet,const SvxFont & rFont)2631 void EditEngine::SetFontInfoInItemSet( SfxItemSet& rSet, const SvxFont& rFont )
2632 {
2633     rSet.Put( SvxLanguageItem( rFont.GetLanguage(), EE_CHAR_LANGUAGE ) );
2634     rSet.Put( SvxFontItem( rFont.GetFamilyType(), rFont.GetFamilyName(), OUString(), rFont.GetPitch(), rFont.GetCharSet(), EE_CHAR_FONTINFO ) );
2635     rSet.Put( SvxFontHeightItem( rFont.GetFontSize().Height(), 100, EE_CHAR_FONTHEIGHT )  );
2636     rSet.Put( SvxCharScaleWidthItem( 100, EE_CHAR_FONTWIDTH ) );
2637     rSet.Put( SvxShadowedItem( rFont.IsShadow(), EE_CHAR_SHADOW )  );
2638     rSet.Put( SvxEscapementItem( rFont.GetEscapement(), rFont.GetPropr(), EE_CHAR_ESCAPEMENT )  );
2639     rSet.Put( SvxWeightItem( rFont.GetWeight(), EE_CHAR_WEIGHT )  );
2640     rSet.Put( SvxColorItem( rFont.GetColor(), EE_CHAR_COLOR )  );
2641     rSet.Put( SvxColorItem( rFont.GetFillColor(), EE_CHAR_BKGCOLOR )  );
2642     rSet.Put( SvxUnderlineItem( rFont.GetUnderline(), EE_CHAR_UNDERLINE )  );
2643     rSet.Put( SvxOverlineItem( rFont.GetOverline(), EE_CHAR_OVERLINE )  );
2644     rSet.Put( SvxCrossedOutItem( rFont.GetStrikeout(), EE_CHAR_STRIKEOUT )  );
2645     rSet.Put( SvxCaseMapItem( rFont.GetCaseMap(), EE_CHAR_CASEMAP )  );
2646     rSet.Put( SvxPostureItem( rFont.GetItalic(), EE_CHAR_ITALIC )  );
2647     rSet.Put( SvxContourItem( rFont.IsOutline(), EE_CHAR_OUTLINE )  );
2648     rSet.Put( SvxAutoKernItem( rFont.IsKerning(), EE_CHAR_PAIRKERNING ) );
2649     rSet.Put( SvxKerningItem( rFont.GetFixKerning(), EE_CHAR_KERNING ) );
2650     rSet.Put( SvxWordLineModeItem( rFont.IsWordLineMode(), EE_CHAR_WLM ) );
2651     rSet.Put( SvxEmphasisMarkItem( rFont.GetEmphasisMark(), EE_CHAR_EMPHASISMARK ) );
2652     rSet.Put( SvxCharReliefItem( rFont.GetRelief(), EE_CHAR_RELIEF ) );
2653 }
2654 
CreateFontFromItemSet(const SfxItemSet & rItemSet,SvtScriptType nScriptType)2655 vcl::Font EditEngine::CreateFontFromItemSet( const SfxItemSet& rItemSet, SvtScriptType nScriptType )
2656 {
2657     SvxFont aFont;
2658     CreateFont( aFont, rItemSet, true, nScriptType );
2659 #if HAVE_P1155R3
2660     return aFont;
2661 #else
2662     return std::move(aFont);
2663 #endif
2664 }
2665 
CreateSvxFontFromItemSet(const SfxItemSet & rItemSet)2666 SvxFont EditEngine::CreateSvxFontFromItemSet( const SfxItemSet& rItemSet )
2667 {
2668     SvxFont aFont;
2669     CreateFont( aFont, rItemSet );
2670     return aFont;
2671 }
2672 
DoesKeyMoveCursor(const KeyEvent & rKeyEvent)2673 bool EditEngine::DoesKeyMoveCursor( const KeyEvent& rKeyEvent )
2674 {
2675     bool bDoesMove = false;
2676 
2677     switch ( rKeyEvent.GetKeyCode().GetCode() )
2678     {
2679         case KEY_UP:
2680         case KEY_DOWN:
2681         case KEY_LEFT:
2682         case KEY_RIGHT:
2683         case KEY_HOME:
2684         case KEY_END:
2685         case KEY_PAGEUP:
2686         case KEY_PAGEDOWN:
2687         {
2688             if ( !rKeyEvent.GetKeyCode().IsMod2() )
2689                 bDoesMove = true;
2690         }
2691         break;
2692     }
2693     return bDoesMove;
2694 }
2695 
DoesKeyChangeText(const KeyEvent & rKeyEvent)2696 bool EditEngine::DoesKeyChangeText( const KeyEvent& rKeyEvent )
2697 {
2698     bool bDoesChange = false;
2699 
2700     KeyFuncType eFunc = rKeyEvent.GetKeyCode().GetFunction();
2701     if ( eFunc != KeyFuncType::DONTKNOW )
2702     {
2703         switch ( eFunc )
2704         {
2705             case KeyFuncType::UNDO:
2706             case KeyFuncType::REDO:
2707             case KeyFuncType::CUT:
2708             case KeyFuncType::PASTE: bDoesChange = true;
2709             break;
2710             default:    // is then possibly edited below.
2711                         eFunc = KeyFuncType::DONTKNOW;
2712         }
2713     }
2714     if ( eFunc == KeyFuncType::DONTKNOW )
2715     {
2716         switch ( rKeyEvent.GetKeyCode().GetCode() )
2717         {
2718             case KEY_DELETE:
2719             case KEY_BACKSPACE: bDoesChange = true;
2720             break;
2721             case KEY_RETURN:
2722             case KEY_TAB:
2723             {
2724                 if ( !rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() )
2725                     bDoesChange = true;
2726             }
2727             break;
2728             default:
2729             {
2730                 bDoesChange = IsSimpleCharInput( rKeyEvent );
2731             }
2732         }
2733     }
2734     return bDoesChange;
2735 }
2736 
IsSimpleCharInput(const KeyEvent & rKeyEvent)2737 bool EditEngine::IsSimpleCharInput( const KeyEvent& rKeyEvent )
2738 {
2739     return EditEngine::IsPrintable( rKeyEvent.GetCharCode() ) &&
2740         ( KEY_MOD2 != (rKeyEvent.GetKeyCode().GetModifier() & ~KEY_SHIFT ) ) &&
2741         ( KEY_MOD1 != (rKeyEvent.GetKeyCode().GetModifier() & ~KEY_SHIFT ) );
2742 }
2743 
HasValidData(const css::uno::Reference<css::datatransfer::XTransferable> & rTransferable)2744 bool EditEngine::HasValidData( const css::uno::Reference< css::datatransfer::XTransferable >& rTransferable )
2745 {
2746     bool bValidData = false;
2747 
2748     if ( comphelper::LibreOfficeKit::isActive())
2749         return true;
2750 
2751     if ( rTransferable.is() )
2752     {
2753         // Every application that copies rtf or any other text format also copies plain text into the clipboard...
2754         datatransfer::DataFlavor aFlavor;
2755         SotExchange::GetFormatDataFlavor( SotClipboardFormatId::STRING, aFlavor );
2756         bValidData = rTransferable->isDataFlavorSupported( aFlavor );
2757     }
2758 
2759     return bValidData;
2760 }
2761 
2762 /** sets a link that is called at the beginning of a drag operation at an edit view */
SetBeginDropHdl(const Link<EditView *,void> & rLink)2763 void EditEngine::SetBeginDropHdl( const Link<EditView*,void>& rLink )
2764 {
2765     pImpEditEngine->SetBeginDropHdl( rLink );
2766 }
2767 
GetBeginDropHdl() const2768 Link<EditView*,void> const & EditEngine::GetBeginDropHdl() const
2769 {
2770     return pImpEditEngine->GetBeginDropHdl();
2771 }
2772 
2773 /** sets a link that is called at the end of a drag operation at an edit view */
SetEndDropHdl(const Link<EditView *,void> & rLink)2774 void EditEngine::SetEndDropHdl( const Link<EditView*,void>& rLink )
2775 {
2776     pImpEditEngine->SetEndDropHdl( rLink );
2777 }
2778 
GetEndDropHdl() const2779 Link<EditView*,void> const & EditEngine::GetEndDropHdl() const
2780 {
2781     return pImpEditEngine->GetEndDropHdl();
2782 }
2783 
SetFirstWordCapitalization(bool bCapitalize)2784 void EditEngine::SetFirstWordCapitalization( bool bCapitalize )
2785 {
2786     pImpEditEngine->SetFirstWordCapitalization( bCapitalize );
2787 }
2788 
SetReplaceLeadingSingleQuotationMark(bool bReplace)2789 void EditEngine::SetReplaceLeadingSingleQuotationMark( bool bReplace )
2790 {
2791     pImpEditEngine->SetReplaceLeadingSingleQuotationMark( bReplace );
2792 }
2793 
IsHtmlImportHandlerSet() const2794 bool EditEngine::IsHtmlImportHandlerSet() const
2795 {
2796     return pImpEditEngine->aHtmlImportHdl.IsSet();
2797 }
2798 
IsRtfImportHandlerSet() const2799 bool EditEngine::IsRtfImportHandlerSet() const
2800 {
2801     return pImpEditEngine->aRtfImportHdl.IsSet();
2802 }
2803 
IsImportRTFStyleSheetsSet() const2804 bool EditEngine::IsImportRTFStyleSheetsSet() const
2805 {
2806     return pImpEditEngine->GetStatus().DoImportRTFStyleSheets();
2807 }
2808 
CallHtmlImportHandler(HtmlImportInfo & rInfo)2809 void EditEngine::CallHtmlImportHandler(HtmlImportInfo& rInfo)
2810 {
2811     pImpEditEngine->aHtmlImportHdl.Call(rInfo);
2812 }
2813 
CallRtfImportHandler(RtfImportInfo & rInfo)2814 void EditEngine::CallRtfImportHandler(RtfImportInfo& rInfo)
2815 {
2816     pImpEditEngine->aRtfImportHdl.Call(rInfo);
2817 }
2818 
InsertParaBreak(const EditSelection & rEditSelection)2819 EditPaM EditEngine::InsertParaBreak(const EditSelection& rEditSelection)
2820 {
2821     return pImpEditEngine->ImpInsertParaBreak(rEditSelection);
2822 }
2823 
InsertLineBreak(const EditSelection & rEditSelection)2824 EditPaM EditEngine::InsertLineBreak(const EditSelection& rEditSelection)
2825 {
2826     return pImpEditEngine->InsertLineBreak(rEditSelection);
2827 }
2828 
GetOverflowingParaNum() const2829 sal_Int32 EditEngine::GetOverflowingParaNum() const {
2830     return pImpEditEngine->GetOverflowingParaNum();
2831 }
2832 
GetOverflowingLineNum() const2833 sal_Int32 EditEngine::GetOverflowingLineNum() const {
2834     return pImpEditEngine->GetOverflowingLineNum();
2835 }
2836 
ClearOverflowingParaNum()2837 void EditEngine::ClearOverflowingParaNum() {
2838     pImpEditEngine->ClearOverflowingParaNum();
2839 }
2840 
IsPageOverflow()2841 bool EditEngine::IsPageOverflow() {
2842     pImpEditEngine->CheckPageOverflow();
2843     return pImpEditEngine->IsPageOverflow();
2844 }
2845 
DisableAttributeExpanding()2846 void EditEngine::DisableAttributeExpanding() {
2847     pImpEditEngine->GetEditDoc().DisableAttributeExpanding();
2848 }
2849 
SetLOKSpecialPaperSize(const Size & rSize)2850 void EditEngine::SetLOKSpecialPaperSize(const Size& rSize)
2851 {
2852     pImpEditEngine->SetLOKSpecialPaperSize(rSize);
2853 }
2854 
GetLOKSpecialPaperSize() const2855 const Size& EditEngine::GetLOKSpecialPaperSize() const
2856 {
2857     return pImpEditEngine->GetLOKSpecialPaperSize();
2858 }
2859 
EFieldInfo()2860 EFieldInfo::EFieldInfo()
2861 {
2862 }
2863 
2864 
EFieldInfo(const SvxFieldItem & rFieldItem,sal_Int32 nPara,sal_Int32 nPos)2865 EFieldInfo::EFieldInfo( const SvxFieldItem& rFieldItem, sal_Int32 nPara, sal_Int32 nPos ) :
2866     pFieldItem( new SvxFieldItem( rFieldItem ) ),
2867     aPosition( nPara, nPos )
2868 {
2869 }
2870 
~EFieldInfo()2871 EFieldInfo::~EFieldInfo()
2872 {
2873 }
2874 
EFieldInfo(const EFieldInfo & rFldInfo)2875 EFieldInfo::EFieldInfo( const EFieldInfo& rFldInfo )
2876 {
2877     *this = rFldInfo;
2878 }
2879 
operator =(const EFieldInfo & rFldInfo)2880 EFieldInfo& EFieldInfo::operator= ( const EFieldInfo& rFldInfo )
2881 {
2882     if( this == &rFldInfo )
2883         return *this;
2884 
2885     pFieldItem.reset( rFldInfo.pFieldItem ? new SvxFieldItem( *rFldInfo.pFieldItem ) : nullptr );
2886     aCurrentText = rFldInfo.aCurrentText;
2887     aPosition = rFldInfo.aPosition;
2888 
2889     return *this;
2890 }
2891 
2892 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
2893