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