46 #include <com/sun/star/i18n/XBreakIterator.hpp>
47 #include <com/sun/star/i18n/CharacterIteratorMode.hpp>
48 #include <com/sun/star/i18n/WordType.hpp>
49 #include <com/sun/star/datatransfer/UnsupportedFlavorException.hpp>
50 #include <com/sun/star/datatransfer/XTransferable.hpp>
51 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
52 #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp>
53 #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
54 #include <com/sun/star/datatransfer/dnd/XDragGestureRecognizer.hpp>
55 #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
56 #include <com/sun/star/util/SearchFlags.hpp>
65 TETextDataObject::TETextDataObject(
const OUString& rText ) :
maText( rText )
70 css::uno::Any TETextDataObject::queryInterface(
const css::uno::Type & rType )
72 css::uno::Any aRet = ::cppu::queryInterface( rType, static_cast< css::datatransfer::XTransferable* >(
this) );
73 return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
77 css::uno::Any TETextDataObject::getTransferData(
const css::datatransfer::DataFlavor& rFlavor )
82 if ( nT == SotClipboardFormatId::STRING )
86 else if ( nT == SotClipboardFormatId::HTML )
88 sal_uInt64 nLen = GetHTMLStream().TellEnd();
89 GetHTMLStream().Seek(0);
91 css::uno::Sequence< sal_Int8 >
aSeq( nLen );
92 memcpy(
aSeq.getArray(), GetHTMLStream().GetData(), nLen );
97 throw css::datatransfer::UnsupportedFlavorException();
102 css::uno::Sequence< css::datatransfer::DataFlavor > TETextDataObject::getTransferDataFlavors( )
104 GetHTMLStream().Seek( STREAM_SEEK_TO_END );
105 bool bHTML = GetHTMLStream().Tell() > 0;
106 css::uno::Sequence< css::datatransfer::DataFlavor > aDataFlavors( bHTML ? 2 : 1 );
113 sal_Bool TETextDataObject::isDataFlavorSupported(
const css::datatransfer::DataFlavor& rFlavor )
116 return ( nT == SotClipboardFormatId::STRING );
127 std::unique_ptr<vcl::Cursor, o3tl::default_delete<vcl::Cursor>>
mpCursor;
129 std::unique_ptr<TextDDInfo, o3tl::default_delete<TextDDInfo>>
mpDDInfo;
134 css::uno::Reference< css::datatransfer::dnd::XDragSourceListener >
mxDnDListener;
153 mpImpl->mpWindow = pWindow;
154 mpImpl->mpTextEngine = pEng;
156 mpImpl->mbPaintSelection =
true;
157 mpImpl->mbAutoScroll =
true;
158 mpImpl->mbInsertMode =
true;
159 mpImpl->mbReadOnly =
false;
160 mpImpl->mbAutoIndent =
false;
161 mpImpl->mbCursorEnabled =
true;
162 mpImpl->mbClickedInSelection =
false;
167 mpImpl->mpSelFuncSet = std::make_unique<TextSelFunctionSet>( this );
168 mpImpl->mpSelEngine = std::make_unique<SelectionEngine>(
mpImpl->mpWindow,
mpImpl->mpSelFuncSet.get() );
170 mpImpl->mpSelEngine->EnableDrag(
true );
183 css::uno::Reference< css::datatransfer::dnd::XDragGestureListener> xDGL(
mpImpl->mxDnDListener, css::uno::UNO_QUERY );
185 css::uno::Reference< css::datatransfer::dnd::XDropTargetListener> xDTL( xDGL, css::uno::UNO_QUERY );
188 pWindow->
GetDropTarget()->setDefaultActions( css::datatransfer::dnd::DNDConstants::ACTION_COPY_OR_MOVE );
194 mpImpl->mpSelEngine.reset();
195 mpImpl->mpSelFuncSet.reset();
197 if (
mpImpl->mpWindow->GetCursor() ==
mpImpl->mpCursor.get() )
198 mpImpl->mpWindow->SetCursor(
nullptr );
206 mpImpl->mpWindow->Invalidate();
212 if ( !
mpImpl->maSelection.HasRange() )
213 mpImpl->mpTextEngine->CursorMoved(
mpImpl->maSelection.GetStart().GetPara() );
216 mpImpl->mpTextEngine->CheckIdleFormatter();
220 mpImpl->mpTextEngine->ValidateSelection( aNewSel );
233 return mpImpl->maSelection;
237 return mpImpl->maSelection;
244 mpImpl->mpTextEngine->UndoActionStart();
246 mpImpl->mpTextEngine->UndoActionEnd();
249 mpImpl->mpTextEngine->FormatAndUpdate(
this );
255 if (!
mpImpl->mbPaintSelection)
257 pSelection =
nullptr;
271 mpImpl->mpTextEngine->maFont = aFont;
275 mpImpl->mpTextEngine->ImpPaint(&rRenderContext, rStartPos, pPaintArea, pSelection);
285 if ( !
mpImpl->mpTextEngine->GetUpdateMode() ||
mpImpl->mpTextEngine->IsInUndo() )
289 if (
mpImpl->maSelection.HasRange())
290 pDrawSelection = &
mpImpl->maSelection;
293 ImpPaint(rRenderContext, aStartPos, &rRect, pDrawSelection);
298 if (rSelection ==
mpImpl->maSelection)
301 bool bCaret =
false, bSelection =
false;
304 bool bGap = rSelection.
HasRange(), bOldGap =
mpImpl->maSelection.HasRange();
310 mpImpl->maSelection = rSelection;
313 mpImpl->mpTextEngine->Broadcast(
TextHint(SfxHintId::TextViewSelectionChanged));
316 mpImpl->mpTextEngine->Broadcast(
TextHint(SfxHintId::TextViewCaretChanged));
338 if ( !pRangeOrSelection->
HasRange() )
341 if(
mpImpl->mpWindow->IsPaintTransparent() )
342 mpImpl->mpWindow->Invalidate();
347 bool bVisCursor =
mpImpl->mpCursor->IsVisible();
358 bool bModified =
false;
360 bool bEndKey =
false;
361 bool bAllowIdle =
true;
366 bool bWasModified =
mpImpl->mpTextEngine->IsModified();
367 mpImpl->mpTextEngine->SetModified(
false );
380 if ( !
mpImpl->mbReadOnly )
391 if ( !
mpImpl->mbReadOnly )
397 if ( !
mpImpl->mbReadOnly )
403 if ( !
mpImpl->mbReadOnly )
424 case css::awt::Key::MOVE_WORD_FORWARD:
425 case css::awt::Key::SELECT_WORD_FORWARD:
426 case css::awt::Key::MOVE_WORD_BACKWARD:
427 case css::awt::Key::SELECT_WORD_BACKWARD:
428 case css::awt::Key::MOVE_TO_BEGIN_OF_LINE:
429 case css::awt::Key::MOVE_TO_END_OF_LINE:
430 case css::awt::Key::SELECT_TO_BEGIN_OF_LINE:
431 case css::awt::Key::SELECT_TO_END_OF_LINE:
432 case css::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
433 case css::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
434 case css::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
435 case css::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
436 case css::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
437 case css::awt::Key::MOVE_TO_END_OF_DOCUMENT:
438 case css::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
439 case css::awt::Key::SELECT_TO_END_OF_DOCUMENT:
459 case css::awt::Key::DELETE_WORD_BACKWARD:
460 case css::awt::Key::DELETE_WORD_FORWARD:
461 case css::awt::Key::DELETE_TO_BEGIN_OF_LINE:
462 case css::awt::Key::DELETE_TO_END_OF_LINE:
473 case css::awt::Key::DELETE_WORD_BACKWARD:
477 case css::awt::Key::DELETE_WORD_FORWARD:
481 case css::awt::Key::DELETE_TO_BEGIN_OF_LINE:
485 case css::awt::Key::DELETE_TO_END_OF_LINE:
492 mpImpl->mpTextEngine->UndoActionStart();
494 mpImpl->mpTextEngine->UndoActionEnd();
522 mpImpl->mpTextEngine->UndoActionStart();
523 aCurSel =
mpImpl->mpTextEngine->ImpInsertParaBreak( aCurSel );
524 if (
mpImpl->mbAutoIndent )
528 while ( ( n < pPrev->GetText().
getLength() ) && (
529 ( pPrev->
GetText()[ n ] ==
' ' ) ||
530 ( pPrev->
GetText()[ n ] ==
'\t' ) ) )
535 aCurSel =
mpImpl->mpTextEngine->ImpInsertText( aCurSel, pPrev->
GetText().copy( 0, n ) );
537 mpImpl->mpTextEngine->UndoActionEnd();
546 if ( !
mpImpl->mbReadOnly )
557 aCurSel =
mpImpl->mpTextEngine->ImpInsertText( nCharCode, aCurSel, !
IsInsertMode(),
true );
567 if ( aCurSel != aOldSel )
577 mpImpl->mpTextEngine->IdleFormatAndUpdate(
this );
579 mpImpl->mpTextEngine->FormatAndUpdate(
this);
587 if (
mpImpl->mpTextEngine->IsModified() )
588 mpImpl->mpTextEngine->Broadcast(
TextHint( SfxHintId::TextModified ) );
589 else if ( bWasModified )
590 mpImpl->mpTextEngine->SetModified(
true );
597 mpImpl->mbClickedInSelection =
false;
599 mpImpl->mpSelEngine->SelMouseButtonUp( rMouseEvent );
605 if (
mpImpl->mpTextEngine->IsModified() )
606 mpImpl->mpTextEngine->Broadcast(
TextHint( SfxHintId::TextModified ) );
617 mpImpl->mpTextEngine->CheckIdleFormatter();
621 mpImpl->mpTextEngine->SetActiveView(
this );
623 mpImpl->mpSelEngine->SelMouseButtonDown( rMouseEvent );
635 if ( rMouseEvent.
IsMod2() )
645 if (
mpImpl->maSelection.GetEnd().GetIndex() <
mpImpl->mpTextEngine->GetTextLen(
mpImpl->maSelection.GetEnd().GetPara() ) )
659 if (
mpImpl->maSelection.GetStart().GetIndex() || (
mpImpl->maSelection.GetEnd().GetIndex() <
mpImpl->mpTextEngine->GetTextLen(
mpImpl->maSelection.GetEnd().GetPara() ) ) )
664 aNewSel.
GetEnd().
GetIndex() =
mpImpl->mpTextEngine->mpDoc->GetNodes()[
mpImpl->maSelection.GetEnd().GetPara() ]->GetText().getLength();
675 mpImpl->mpSelEngine->SelMouseMove( rMouseEvent );
680 mpImpl->mpTextEngine->CheckIdleFormatter();
681 mpImpl->mpTextEngine->SetActiveView(
this );
692 SAL_WARN_IF( !
mpImpl->mpTextEngine->mpIMEInfos,
"vcl",
"CommandEventId::EndExtTextInput => No Start ?" );
693 if(
mpImpl->mpTextEngine->mpIMEInfos )
695 TEParaPortion* pPortion =
mpImpl->mpTextEngine->mpTEParaPortions->GetObject(
mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara() );
698 bool bInsertMode = !
mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite;
700 mpImpl->mpTextEngine->mpIMEInfos.reset();
702 mpImpl->mpTextEngine->TextModified();
703 mpImpl->mpTextEngine->FormatAndUpdate(
this );
707 if (
mpImpl->mpTextEngine->IsModified() )
708 mpImpl->mpTextEngine->Broadcast(
TextHint( SfxHintId::TextModified ) );
713 SAL_WARN_IF( !
mpImpl->mpTextEngine->mpIMEInfos,
"vcl",
"CommandEventId::ExtTextInput => No Start ?" );
714 if(
mpImpl->mpTextEngine->mpIMEInfos )
722 aSelect =
mpImpl->mpTextEngine->ImpDeleteText( aSelect );
723 aSelect =
mpImpl->mpTextEngine->ImpInsertText( aSelect, pData->
GetText() );
725 if (
mpImpl->mpTextEngine->mpIMEInfos->bWasCursorOverwrite )
727 const sal_Int32 nOldIMETextLen =
mpImpl->mpTextEngine->mpIMEInfos->nLen;
728 const sal_Int32 nNewIMETextLen = pData->
GetText().getLength();
730 if ( ( nOldIMETextLen > nNewIMETextLen ) &&
731 ( nNewIMETextLen < mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.getLength() ) )
734 sal_Int32 nRestore = nOldIMETextLen - nNewIMETextLen;
737 mpImpl->mpTextEngine->ImpInsertText( aPaM,
mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.copy( nNewIMETextLen, nRestore ) );
739 else if ( ( nOldIMETextLen < nNewIMETextLen ) &&
740 ( nOldIMETextLen <
mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.getLength() ) )
743 const sal_Int32 nOverwrite = std::min( nNewIMETextLen,
mpImpl->mpTextEngine->mpIMEInfos->aOldTextAfterStartPos.getLength() ) - nOldIMETextLen;
744 SAL_WARN_IF( !nOverwrite || (nOverwrite >= 0xFF00),
"vcl",
"IME Overwrite?!" );
749 mpImpl->mpTextEngine->ImpDeleteText( aSel );
759 mpImpl->mpTextEngine->mpIMEInfos->DestroyAttribs();
762 TEParaPortion* pPPortion =
mpImpl->mpTextEngine->mpTEParaPortions->GetObject(
mpImpl->mpTextEngine->mpIMEInfos->aPos.GetPara() );
764 mpImpl->mpTextEngine->FormatAndUpdate(
this );
779 if (
mpImpl->mpTextEngine->mpIMEInfos &&
mpImpl->mpTextEngine->mpIMEInfos->nLen )
784 sal_Int32 nInputEnd =
mpImpl->mpTextEngine->mpIMEInfos->aPos.GetIndex() +
mpImpl->mpTextEngine->mpIMEInfos->nLen;
786 if ( !
mpImpl->mpTextEngine->IsFormatted() )
787 mpImpl->mpTextEngine->FormatDoc();
792 if ( nInputEnd > rLine.
GetEnd() )
793 nInputEnd = rLine.
GetEnd();
807 mpImpl->mpSelEngine->Command( rCEvt );
814 if ( !
mpImpl->mbAutoScroll )
826 SAL_WARN_IF( !
mpImpl->mpTextEngine->IsFormatted(),
"vcl",
"Scroll: Not formatted!" );
834 aNewStartPos.AdjustY( -ndY );
835 if ( aNewStartPos.Y() < 0 )
836 aNewStartPos.setY( 0 );
839 aNewStartPos.AdjustX( -ndX );
840 if ( aNewStartPos.X() < 0 )
841 aNewStartPos.setX( 0 );
846 if ( nDiffX || nDiffY )
848 bool bVisCursor =
mpImpl->mpCursor->IsVisible();
850 mpImpl->mpWindow->PaintImmediately();
851 mpImpl->maStartDocPos = aNewStartPos;
853 if (
mpImpl->mpTextEngine->IsRightToLeft() )
855 mpImpl->mpWindow->Scroll( nDiffX, nDiffY );
856 mpImpl->mpWindow->PaintImmediately();
857 mpImpl->mpCursor->SetPos(
mpImpl->mpCursor->GetPos() +
Point( nDiffX, nDiffY ) );
858 if ( bVisCursor && !
mpImpl->mbReadOnly )
862 mpImpl->mpTextEngine->Broadcast(
TextHint( SfxHintId::TextViewScrolled ) );
867 mpImpl->mpTextEngine->SetActiveView(
this );
868 mpImpl->mpTextEngine->GetUndoManager().Undo();
873 mpImpl->mpTextEngine->SetActiveView(
this );
874 mpImpl->mpTextEngine->GetUndoManager().Redo();
879 mpImpl->mpTextEngine->UndoActionStart();
882 mpImpl->mpTextEngine->UndoActionEnd();
885 void TextView::Copy( css::uno::Reference< css::datatransfer::clipboard::XClipboard >
const & rxClipboard )
887 if ( !rxClipboard.is() )
896 rxClipboard->setContents( pDataObj,
nullptr );
898 css::uno::Reference< css::datatransfer::clipboard::XFlushableClipboard > xFlushableClipboard( rxClipboard, css::uno::UNO_QUERY );
899 if( xFlushableClipboard.is() )
900 xFlushableClipboard->flushClipboard();
902 catch(
const css::uno::Exception& )
909 css::uno::Reference<css::datatransfer::clipboard::XClipboard> aClipboard(
GetWindow()->GetClipboard());
913 void TextView::Paste( css::uno::Reference< css::datatransfer::clipboard::XClipboard >
const & rxClipboard )
915 if ( !rxClipboard.is() )
918 css::uno::Reference< css::datatransfer::XTransferable > xDataObj;
923 xDataObj = rxClipboard->getContents();
925 catch(
const css::uno::Exception& )
929 if ( !xDataObj.is() )
932 css::datatransfer::DataFlavor aFlavor;
934 if ( !xDataObj->isDataFlavorSupported( aFlavor ) )
939 css::uno::Any
aData = xDataObj->getTransferData( aFlavor );
942 bool bWasTruncated =
false;
943 if(
mpImpl->mpTextEngine->GetMaxTextLen() != 0 )
946 mpImpl->mpTextEngine->Broadcast(
TextHint( SfxHintId::TextModified ) );
951 catch(
const css::datatransfer::UnsupportedFlavorException& )
958 css::uno::Reference<css::datatransfer::clipboard::XClipboard> aClipboard(
GetWindow()->GetClipboard());
969 return mpImpl->mpTextEngine->GetText(
mpImpl->maSelection, aSeparator );
974 if (
mpImpl->mbInsertMode != bInsert )
976 mpImpl->mbInsertMode = bInsert;
983 if (
mpImpl->mbReadOnly != bReadOnly )
985 mpImpl->mbReadOnly = bReadOnly;
986 if ( !
mpImpl->mbReadOnly )
998 mpImpl->mpTextEngine->CheckIdleFormatter();
1004 if (
mpImpl->mpTextEngine->IsRightToLeft() )
1037 case KEY_LEFT: aPaM = bCtrl ?
CursorWordLeft( aPaM ) :
CursorLeft( aPaM, aTranslatedKeyEvent.
GetKeyCode().
IsMod2() ? sal_uInt16(css::i18n::CharacterIteratorMode::SKIPCHARACTER) : sal_uInt16(css::i18n::CharacterIteratorMode::SKIPCELL) );
1041 case css::awt::Key::SELECT_WORD_FORWARD:
1044 case css::awt::Key::MOVE_WORD_FORWARD:
1047 case css::awt::Key::SELECT_WORD_BACKWARD:
1050 case css::awt::Key::MOVE_WORD_BACKWARD:
1053 case css::awt::Key::SELECT_TO_BEGIN_OF_LINE:
1056 case css::awt::Key::MOVE_TO_BEGIN_OF_LINE:
1059 case css::awt::Key::SELECT_TO_END_OF_LINE:
1062 case css::awt::Key::MOVE_TO_END_OF_LINE:
1065 case css::awt::Key::SELECT_TO_BEGIN_OF_PARAGRAPH:
1068 case css::awt::Key::MOVE_TO_BEGIN_OF_PARAGRAPH:
1071 case css::awt::Key::SELECT_TO_END_OF_PARAGRAPH:
1074 case css::awt::Key::MOVE_TO_END_OF_PARAGRAPH:
1077 case css::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT:
1080 case css::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT:
1083 case css::awt::Key::SELECT_TO_END_OF_DOCUMENT:
1086 case css::awt::Key::MOVE_TO_END_OF_DOCUMENT:
1094 if ( aOldEnd != aPaM )
1096 mpImpl->mpTextEngine->CursorMoved( aOldEnd.GetPara() );
1099 aNewSelection.
GetEnd() = aPaM;
1113 return mpImpl->maSelection;
1118 mpImpl->mpTextEngine->UndoActionStart();
1124 mpImpl->mpTextEngine->UndoActionEnd();
1126 mpImpl->mpTextEngine->FormatAndUpdate(
this );
1136 css::uno::Reference < css::i18n::XBreakIterator > xBI =
mpImpl->mpTextEngine->GetBreakIterator();
1138 aPaM.
GetIndex() = xBI->previousCharacters( pNode->
GetText(), aPaM.
GetIndex(),
mpImpl->mpTextEngine->GetLocale(), nCharacterIteratorMode, nCount, nCount );
1156 css::uno::Reference < css::i18n::XBreakIterator > xBI =
mpImpl->mpTextEngine->GetBreakIterator();
1158 aPaM.
GetIndex() = xBI->nextCharacters( pNode->
GetText(), aPaM.
GetIndex(),
mpImpl->mpTextEngine->GetLocale(), nCharacterIteratorMode, nCount, nCount );
1160 else if ( aPaM.
GetPara() < (
mpImpl->mpTextEngine->mpDoc->GetNodes().size()-1) )
1174 css::uno::Reference<css::i18n::XBreakIterator> xBI =
mpImpl->mpTextEngine->GetBreakIterator();
1187 mpImpl->mpTextEngine->GetWord( rPaM, &aPaM );
1191 css::uno::Reference < css::i18n::XBreakIterator > xBI =
mpImpl->mpTextEngine->GetBreakIterator();
1192 aPaM.
GetIndex() = xBI->previousWord( pNode->
GetText(), rPaM.
GetIndex(),
mpImpl->mpTextEngine->GetLocale(), css::i18n::WordType::ANYWORD_IGNOREWHITESPACES ).startPos;
1194 mpImpl->mpTextEngine->GetWord( aPaM, &aPaM );
1215 css::uno::Reference < css::i18n::XBreakIterator > xBI =
mpImpl->mpTextEngine->GetBreakIterator();
1216 aPaM.
GetIndex() = xBI->nextWord( pNode->
GetText(), aPaM.
GetIndex(),
mpImpl->mpTextEngine->GetLocale(), css::i18n::WordType::ANYWORD_IGNOREWHITESPACES ).endPos;
1217 mpImpl->mpTextEngine->GetWord( aPaM,
nullptr, &aPaM );
1219 else if ( aPaM.
GetPara() < (
mpImpl->mpTextEngine->mpDoc->GetNodes().size()-1) )
1230 if (
mpImpl->maSelection.HasRange() )
1231 return mpImpl->mpTextEngine->ImpDeleteText(
mpImpl->maSelection );
1239 aEndPaM =
CursorLeft( aEndPaM, sal_uInt16(css::i18n::CharacterIteratorMode::SKIPCHARACTER) );
1244 css::uno::Reference < css::i18n::XBreakIterator > xBI =
mpImpl->mpTextEngine->GetBreakIterator();
1245 css::i18n::Boundary aBoundary = xBI->getWordBoundary( pNode->
GetText(),
mpImpl->maSelection.GetEnd().GetIndex(),
mpImpl->mpTextEngine->GetLocale(), css::i18n::WordType::ANYWORD_IGNOREWHITESPACES, true );
1246 if ( aBoundary.startPos ==
mpImpl->maSelection.GetEnd().GetIndex() )
1247 aBoundary = xBI->previousWord( pNode->
GetText(),
mpImpl->maSelection.GetEnd().GetIndex(),
mpImpl->mpTextEngine->GetLocale(), css::i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1249 aEndPaM.
GetIndex() = std::max<sal_Int32>(aBoundary.startPos, 0);
1267 aEndPaM =
CursorRight( aEndPaM, sal_uInt16(css::i18n::CharacterIteratorMode::SKIPCELL) );
1272 css::uno::Reference < css::i18n::XBreakIterator > xBI =
mpImpl->mpTextEngine->GetBreakIterator();
1273 css::i18n::Boundary aBoundary = xBI->nextWord( pNode->
GetText(),
mpImpl->maSelection.GetEnd().GetIndex(),
mpImpl->mpTextEngine->GetLocale(), css::i18n::WordType::ANYWORD_IGNOREWHITESPACES );
1274 aEndPaM.
GetIndex() = aBoundary.startPos;
1281 else if ( aEndPaM.
GetPara() < (
mpImpl->mpTextEngine->mpDoc->GetNodes().size() - 1 ) )
1301 nX =
mpImpl->mpTextEngine->GetEditCursor( rPaM,
false ).Left();
1302 mpImpl->mnTravelXPos =
static_cast<sal_uInt16
>(nX)+1;
1305 nX =
mpImpl->mnTravelXPos;
1322 pPPortion =
mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.
GetPara() );
1323 std::vector<TextLine>::size_type nL = pPPortion->
GetLines().size() - 1;
1337 nX =
mpImpl->mpTextEngine->GetEditCursor( rPaM,
false ).Left();
1338 mpImpl->mnTravelXPos =
static_cast<sal_uInt16
>(nX)+1;
1341 nX =
mpImpl->mnTravelXPos;
1345 if ( nLine < ( pPPortion->
GetLines().size() - 1 ) )
1354 else if ( rPaM.
GetPara() < (
mpImpl->mpTextEngine->mpDoc->GetNodes().size() - 1 ) )
1357 pPPortion =
mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.
GetPara() );
1425 const sal_uInt32 nNode =
static_cast<sal_uInt32
>(
mpImpl->mpTextEngine->mpDoc->GetNodes().size() - 1);
1426 TextNode* pNode =
mpImpl->mpTextEngine->mpDoc->GetNodes()[ nNode ].get();
1435 aTopLeft.AdjustY( -(
mpImpl->mpWindow->GetOutputSizePixel().Height() * 9/10) );
1436 aTopLeft.AdjustX(1 );
1437 if ( aTopLeft.Y() < 0 )
1448 aBottomRight.AdjustY(
mpImpl->mpWindow->GetOutputSizePixel().Height() * 9/10 );
1449 aBottomRight.AdjustX(1 );
1451 if ( aBottomRight.Y() > nHeight )
1452 aBottomRight.setY( nHeight-1 );
1454 TextPaM aPaM =
mpImpl->mpTextEngine->GetPaM( aBottomRight );
1460 if (
mpImpl->mpTextEngine->IsFormatting() )
1462 if ( !
mpImpl->mpTextEngine->GetUpdateMode() )
1464 if (
mpImpl->mpTextEngine->IsInUndo() )
1467 mpImpl->mpTextEngine->CheckIdleFormatter();
1468 if ( !
mpImpl->mpTextEngine->IsFormatted() )
1469 mpImpl->mpTextEngine->FormatAndUpdate(
this );
1475 mpImpl->mbCursorAtEndOfLine =
false;
1478 TEParaPortion* pParaPortion =
mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
1479 mpImpl->mbCursorAtEndOfLine =
1485 TextNode* pNode =
mpImpl->mpTextEngine->mpDoc->GetNodes()[ aPaM.GetPara() ].get();
1486 if ( !pNode->
GetText().isEmpty() && ( aPaM.GetIndex() < pNode->
GetText().getLength() ) )
1489 aEditCursor.SetLeft(
mpImpl->mpTextEngine->GetEditCursor( aPaM,
false,
true ).Left() );
1490 aEditCursor.SetRight( aEditCursor.Left() );
1492 TEParaPortion* pParaPortion =
mpImpl->mpTextEngine->mpTEParaPortions->GetObject( aPaM.GetPara() );
1494 sal_Int32 nTextPortionStart = 0;
1499 aEditCursor.AdjustRight(rTextPortion.
GetWidth() );
1503 TextPaM aNext =
CursorRight(
TextPaM( aPaM.GetPara(), aPaM.GetIndex() ), sal_uInt16(css::i18n::CharacterIteratorMode::SKIPCELL) );
1504 aEditCursor.SetRight(
mpImpl->mpTextEngine->GetEditCursor( aNext,
true ).Left() );
1509 Size aOutSz =
mpImpl->mpWindow->GetOutputSizePixel();
1510 if ( aEditCursor.GetHeight() > aOutSz.
Height() )
1511 aEditCursor.SetBottom( aEditCursor.Top() + aOutSz.
Height() - 1 );
1513 aEditCursor.AdjustLeft( -1 );
1528 if ( aEditCursor.Bottom() > nVisEndY )
1530 aNewStartPos.AdjustY( aEditCursor.Bottom() - nVisEndY);
1532 else if ( aEditCursor.Top() < nVisStartY )
1534 aNewStartPos.AdjustY( -( nVisStartY - aEditCursor.Top() ) );
1537 if ( aEditCursor.Right() >= nVisEndX )
1539 aNewStartPos.AdjustX( aEditCursor.Right() - nVisEndX );
1542 aNewStartPos.AdjustX(nMoreX );
1544 else if ( aEditCursor.Left() <= nVisStartX )
1546 aNewStartPos.AdjustX( -( nVisStartX - aEditCursor.Left() ) );
1549 aNewStartPos.AdjustX( -nMoreX );
1561 if ( aNewStartPos.X() < 0 )
1562 aNewStartPos.setX( 0 );
1563 else if ( aNewStartPos.X() > nMaxX )
1564 aNewStartPos.setX( nMaxX );
1570 if ( aNewStartPos.Y() > nYMax )
1571 aNewStartPos.setY( nYMax );
1573 if ( aNewStartPos !=
mpImpl->maStartDocPos )
1574 Scroll( -(aNewStartPos.X() -
mpImpl->maStartDocPos.X()), -(aNewStartPos.Y() -
mpImpl->maStartDocPos.Y()) );
1577 if ( aEditCursor.Right() < aEditCursor.Left() )
1580 aEditCursor.SetLeft( aEditCursor.Right() );
1581 aEditCursor.SetRight( n );
1584 Point aPoint(
GetWindowPos( !
mpImpl->mpTextEngine->IsRightToLeft() ? aEditCursor.TopLeft() : aEditCursor.TopRight() ) );
1585 mpImpl->mpCursor->SetPos( aPoint );
1586 mpImpl->mpCursor->SetSize( aEditCursor.GetSize() );
1587 if ( bForceVisCursor &&
mpImpl->mbCursorEnabled )
1588 mpImpl->mpCursor->Show();
1593 mpImpl->mpTextEngine->CheckIdleFormatter();
1602 aNewSel.GetEnd() = aPaM;
1604 if ( !
mpImpl->mpSelEngine->HasAnchor() )
1606 if (
mpImpl->maSelection.GetStart() != aPaM )
1607 mpImpl->mpTextEngine->CursorMoved(
mpImpl->maSelection.GetStart().GetPara() );
1608 aNewSel.GetStart() = aPaM;
1617 bool bForceCursor = !
mpImpl->mpDDInfo;
1638 const sal_uInt32 nCurNode = rPaM.
GetPara();
1640 if ( ( nCurNode > nStartNode ) && ( nCurNode < nEndNode ) )
1643 if ( nStartNode == nEndNode )
1645 if ( nCurNode == nStartNode )
1659 if (
mpImpl->mpDDInfo &&
mpImpl->mpDDInfo->mbVisCursor )
1661 mpImpl->mpDDInfo->maCursor.Hide();
1662 mpImpl->mpDDInfo->mbVisCursor =
false;
1668 if ( !
mpImpl->mpDDInfo->mbVisCursor )
1674 mpImpl->mpDDInfo->maCursor.SetWindow(
mpImpl->mpWindow );
1677 mpImpl->mpDDInfo->maCursor.Show();
1678 mpImpl->mpDDInfo->mbVisCursor =
true;
1684 if ( bPaint !=
mpImpl->mbPaintSelection )
1686 mpImpl->mbPaintSelection = bPaint;
1693 mpImpl->mpTextEngine->Read( rInput, &
mpImpl->maSelection );
1699 bool bTruncated =
false;
1701 const sal_Int32 nMaxLen =
mpImpl->mpTextEngine->GetMaxTextLen();
1705 const sal_Int32 nCurLen =
mpImpl->mpTextEngine->GetTextLen();
1707 const sal_Int32 nNewLen = rNewText.getLength();
1708 if ( nCurLen + nNewLen > nMaxLen )
1711 const sal_Int32 nSelLen =
mpImpl->mpTextEngine->GetTextLen(
mpImpl->maSelection );
1712 if ( nCurLen + nNewLen - nSelLen > nMaxLen )
1714 const sal_Int32 nTruncatedLen = nMaxLen - (nCurLen - nSelLen);
1715 rNewText = rNewText.copy( 0, nTruncatedLen );
1726 if (
mpImpl->mpTextEngine->GetMaxTextLen() )
1728 sal_Int32
n =
mpImpl->mpTextEngine->GetTextLen() + rNewText.getLength();
1729 if ( n >
mpImpl->mpTextEngine->GetMaxTextLen() )
1732 n -=
mpImpl->mpTextEngine->GetTextLen(
mpImpl->maSelection );
1733 if ( n >
mpImpl->mpTextEngine->GetMaxTextLen() )
1742 if ( !
mpImpl->mbClickedInSelection )
1747 SAL_WARN_IF( !
mpImpl->maSelection.HasRange(),
"vcl",
"TextView::dragGestureRecognized: mpImpl->mbClickedInSelection, but no selection?" );
1750 mpImpl->mpDDInfo->mbStarterOfDD =
true;
1754 mpImpl->mpCursor->Hide();
1756 sal_Int8 nActions = css::datatransfer::dnd::DNDConstants::ACTION_COPY;
1758 nActions |= css::datatransfer::dnd::DNDConstants::ACTION_MOVE;
1759 rDGE.DragSource->startDrag( rDGE, nActions, 0 , 0 , pDataObj,
mpImpl->mxDnDListener );
1765 mpImpl->mpDDInfo.reset();
1779 const sal_uInt32 nPrevParaCount =
mpImpl->mpTextEngine->GetParagraphCount();
1780 const sal_Int32 nPrevStartParaLen =
mpImpl->mpTextEngine->GetTextLen( aPrevSel.
GetStart().
GetPara() );
1782 bool bStarterOfDD =
false;
1783 for ( sal_uInt16 nView =
mpImpl->mpTextEngine->GetViewCount(); nView && !bStarterOfDD; )
1784 bStarterOfDD =
mpImpl->mpTextEngine->GetView( --nView )->mpImpl->mpDDInfo &&
mpImpl->mpTextEngine->GetView( nView )->mpImpl->mpDDInfo->mbStarterOfDD;
1789 mpImpl->mpTextEngine->UndoActionStart();
1792 css::uno::Reference< css::datatransfer::XTransferable > xDataObj = rDTDE.Transferable;
1793 if ( xDataObj.is() )
1795 css::datatransfer::DataFlavor aFlavor;
1797 if ( xDataObj->isDataFlavorSupported( aFlavor ) )
1799 css::uno::Any
aData = xDataObj->getTransferData( aFlavor );
1801 aData >>= aOUString;
1806 if ( !aText.isEmpty() && ( aText[ aText.getLength()-1 ] ==
LINE_SEP ) )
1807 aText = aText.copy(0, aText.getLength()-1);
1813 (( rDTDE.DropAction & css::datatransfer::dnd::DNDConstants::ACTION_MOVE ) || !bStarterOfDD) )
1820 const sal_uInt32 nNewParasBeforeSelection =
1821 mpImpl->mpTextEngine->GetParagraphCount() - nPrevParaCount;
1828 const sal_Int32 nNewChars =
1850 mpImpl->mpTextEngine->ImpDeleteText( aPrevSel );
1853 mpImpl->mpTextEngine->UndoActionEnd();
1855 mpImpl->mpDDInfo.reset();
1857 mpImpl->mpTextEngine->FormatAndUpdate(
this );
1859 mpImpl->mpTextEngine->Broadcast(
TextHint( SfxHintId::TextModified ) );
1861 rDTDE.Context->dropComplete(
false );
1882 Point aMousePos( rDTDE.LocationX, rDTDE.LocationY );
1884 mpImpl->mpDDInfo->maDropPos =
mpImpl->mpTextEngine->GetPaM( aDocPos );
1890 rDTDE.Context->rejectDrag();
1895 if ( !
mpImpl->mpDDInfo->mbVisCursor || ( aPrevDropPos !=
mpImpl->mpDDInfo->maDropPos ) )
1900 rDTDE.Context->acceptDrag( rDTDE.DropAction );
1906 Point aStartPos( -rStartDocPos.X(), -rStartDocPos.Y() );
1907 if (
mpImpl->mpTextEngine->IsRightToLeft() )
1909 Size aSz =
mpImpl->mpWindow->GetOutputSizePixel();
1910 aStartPos.setX( rStartDocPos.X() + aSz.
Width() - 1 );
1921 aPoint.setY( rWindowPos.Y() +
mpImpl->maStartDocPos.Y() );
1923 if ( !
mpImpl->mpTextEngine->IsRightToLeft() )
1925 aPoint.setX( rWindowPos.X() +
mpImpl->maStartDocPos.X() );
1929 Size aSz =
mpImpl->mpWindow->GetOutputSizePixel();
1930 aPoint.setX( ( aSz.
Width() - 1 ) - rWindowPos.X() +
mpImpl->maStartDocPos.X() );
1942 aPoint.setY( rDocPos.Y() -
mpImpl->maStartDocPos.Y() );
1944 if ( !
mpImpl->mpTextEngine->IsRightToLeft() )
1946 aPoint.setX( rDocPos.X() -
mpImpl->maStartDocPos.X() );
1950 Size aSz =
mpImpl->mpWindow->GetOutputSizePixel();
1951 aPoint.setX( ( aSz.
Width() - 1 ) - ( rDocPos.X() -
mpImpl->maStartDocPos.X() ) );
1960 sal_Int32 nLineNo = -1;
1961 if(
mpImpl->mbCursorEnabled )
1967 if(
mpImpl->mbCursorAtEndOfLine )
2020 {
return mpImpl->mpTextEngine; }
2022 {
return mpImpl->mpWindow; }
2024 {
mpImpl->mbCursorEnabled = bEnable; }
2026 {
return mpImpl->mbCursorEnabled; }
2028 {
mpImpl->maStartDocPos = rPos; }
2030 {
return mpImpl->maStartDocPos; }
2032 {
mpImpl->mbAutoIndent = bAutoIndent; }
2034 {
return mpImpl->mbReadOnly; }
2036 {
mpImpl->mbAutoScroll = bAutoScroll; }
2038 {
return mpImpl->mbAutoScroll; }
2040 {
return mpImpl->maSelection.HasRange(); }
2042 {
return mpImpl->mbInsertMode; }
2062 Size aOutSz =
mpImpl->mpWindow->GetOutputSizePixel();
2070 Scroll(0, (nVisStartY + nVisEndY) / 2 - aRect.
TopLeft().getY());
2075 bool bFound =
false;
2077 if ( static_cast<ExtTextEngine*>(
GetTextEngine())->
Search( aSel, rSearchOptions, bForward ) )
2103 sal_uInt16 nFound = 0;
2111 Search( rSearchOptions, bForward );
2115 if(
Search( rSearchOptions, bForward ) )
2128 bool bSearchInSelection = (0 != (rSearchOptions.
searchFlag & css::util::SearchFlags::REG_NOT_BEGINOFLINE) );
2129 if ( bSearchInSelection )
2137 bool bFound = pTextEngine->
Search( aSel, rSearchOptions );
2152 bFound = pTextEngine->
Search( aSel, rSearchOptions );
2157 pTextEngine->FormatAndUpdate(
this );
2181 for ( sal_uInt32 nPara = nStartPara; nPara <= nEndPara; ++nPara )
2193 if ( !aText.isEmpty() && (
2194 ( aText[ 0 ] ==
'\t' ) ||
2195 ( aText[ 0 ] ==
' ' ) ) )
virtual void DestroyAnchor() override
TextSelFunctionSet(TextView *pView)
void SetFillColor(const Color &)
const Wallpaper & GetBackground() const
const vcl::Font & GetFont() const
TOOLS_DLLPUBLIC OString convertLineEnd(const OString &rIn, LineEnd eLineEnd)
void SetAlpha(sal_uInt8 nAlpha)
TextPaM ImpInsertText(const TextSelection &rSel, sal_Unicode c, bool bOverwrite=false)
void InsertText(const OUString &rNew)
void MouseButtonUp(const MouseEvent &rMouseEvent)
void MouseMove(const MouseEvent &rMouseEvent)
virtual void EnableRTL(bool bEnable=true)
TextPaM CursorStartOfLine(const TextPaM &rPaM)
TextPaM ImpDelete(sal_uInt8 nMode, sal_uInt8 nDelMode)
Point ImpGetOutputStartPos(const Point &rStartDocPos) const
bool IsInsertMode() const
TextPaM CursorFirstWord(const TextPaM &rPaM)
sal_uInt16 Replace(const i18nutil::SearchOptions &rSearchOptions, bool bAll, bool bForward)
std::unique_ptr< sal_Int32[]> pData
OUString GetText(LineEnd aSeparator=LINEEND_LF) const
constexpr::Color COL_TRANSPARENT(ColorTransparency, 0xFF, 0xFF, 0xFF, 0xFF)
TextPaM CursorLeft(const TextPaM &rPaM, sal_uInt16 nCharacterIteratorMode)
TextPaM CursorEndOfLine(const TextPaM &rPaM)
const TextPaM & GetEnd() const
sal_uInt16 GetCode() const
static void ShowTruncationWarning(weld::Widget *pParent)
static bool IsSimpleCharInput(const KeyEvent &rKeyEvent)
void Scroll(tools::Long nHorzScroll, tools::Long nVertScroll)
css::uno::Reference< css::datatransfer::dnd::XDragSourceListener > mxDnDListener
constexpr sal_uInt16 KEY_UP
constexpr sal_uInt16 KEY_END
bool IsOnlyCursorChanged() const
constexpr tools::Long Width() const
void SetPaintSelection(bool bPaint)
void SetCursorAtPoint(const Point &rPointPixel)
virtual void dragOver(const css::datatransfer::dnd::DropTargetDragEvent &dtde) override
sal_uInt16 GetClicks() const
virtual void SetCursorAtPoint(const Point &rPointPixel, bool bDontSelectAtCursor=false) override
ESelection aNewSelection(GetSelection())
TextPaM CursorWordRight(const TextPaM &rPaM)
virtual void dragExit(const css::datatransfer::dnd::DropTargetEvent &dte) override
A helper class that calls Application::ReleaseSolarMutex() in its constructor and restores the mutex ...
std::unique_ptr< TextDDInfo, o3tl::default_delete< TextDDInfo > > mpDDInfo
TextPaM CursorEndOfParagraph(const TextPaM &rPaM)
LineEnd GetSystemLineEnd()
constexpr sal_uInt16 KEY_PAGEUP
const CommandExtTextInputData * GetExtTextInputData() const
#define DELMODE_RESTOFCONTENT
std::unique_ptr< vcl::Cursor, o3tl::default_delete< vcl::Cursor > > mpCursor
Point GetWindowPos(const Point &rDocPos) const
vcl::Window * GetWindow() const
bool IsCursorOverwrite() const
bool ImplCheckTextLen(const OUString &rNewText) const
css::uno::Reference< css::datatransfer::dnd::XDragGestureRecognizer > GetDragGestureRecognizer()
const Point & GetStartDocPos() const
constexpr OUStringLiteral aData
void ShowCursor(bool bGotoCursor=true, bool bForceVisCursor=true)
constexpr sal_uInt16 KEY_DOWN
TextEngine * GetTextEngine() const
bool KeyInput(const KeyEvent &rKeyEvent)
void SetReadOnly(bool bReadOnly)
ExtTextEngine * mpTextEngine
const OUString & GetText() const
void SetAutoScroll(bool bAutoScroll)
void SetInputContext(const InputContext &rInputContext)
void SetStartDocPos(const Point &rPos)
TextPaM CursorRight(const TextPaM &rPaM, sal_uInt16 nCharacterIteratorMode)
MouseMiddleButtonAction GetMiddleButtonAction() const
static TextPaM CursorStartOfDoc()
static bool AnyInput(VclInputFlags nType=VCL_INPUT_ANY)
Determine if there are any pending input events.
constexpr sal_uInt16 KEY_HOME
OUString GetSelected() const
virtual void drop(const css::datatransfer::dnd::DropTargetDropEvent &dtde) override
#define DELMODE_RESTOFWORD
bool mbClickedInSelection
css::uno::Reference< css::datatransfer::dnd::XDropTarget > GetDropTarget()
const Color & GetColor() const
virtual void dragDropEnd(const css::datatransfer::dnd::DragSourceDropEvent &dsde) override
virtual void dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent &dtdee) override
sal_Int32 GetLineNumberOfCursorInSelection() const
Returns the number in paragraph of the line in which the cursor is blinking if enabled, -1 otherwise.
virtual void CreateAnchor() override
void ImpShowCursor(bool bGotoCursor, bool bForceVisCursor, bool bEndKey)
void CenterPaM(const TextPaM &rPaM)
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
const AllSettings & GetSettings() const
CommandEventId GetCommand() const
bool Search(TextSelection &rSel, const i18nutil::SearchOptions &rSearchOptions, bool bForward=true) const
void SetInsertMode(bool bInsert)
constexpr sal_uInt16 KEY_PAGEDOWN
TextView(const TextView &)=delete
const TextPaM & GetStart() const
TextPaM PageDown(const TextPaM &rPaM)
std::unique_ptr< ImpTextView > mpImpl
void ImpShowHideSelection(const TextSelection *pRange=nullptr)
void EnableCursor(bool bEnable)
void SetSelection(const TextSelection &rNewSel)
void MarkSelectionInvalid(sal_Int32 nStart)
virtual bool IsSelectionAtPoint(const Point &rPointPixel) override
const Color & GetFillColor() const
TextSelection const & ImpMoveCursor(const KeyEvent &rKeyEvent)
TextSelection maSelection
bool Search(const i18nutil::SearchOptions &rSearchOptions, bool bForward)
KeyFuncType GetFunction() const
void MouseButtonDown(const MouseEvent &rMouseEvent)
bool IsCursorEnabled() const
virtual void BeginDrag() override
void SetCursorRect(const tools::Rectangle *pRect=nullptr, tools::Long nExtTextInputWidth=0)
void ImpPaint(vcl::RenderContext &rRenderContext, const Point &rStartPos, tools::Rectangle const *pPaintArea, TextSelection const *pSelection)
constexpr sal_uInt16 KEY_RETURN
#define TRAVEL_X_DONTKNOW
constexpr sal_uInt16 KEY_RIGHT
const TextSelection & GetSelection() const
void UndoActionStart(sal_uInt16 nId=0)
std::vector< TextLine >::size_type GetLineNumber(sal_Int32 nIndex, bool bInclEnd)
std::size_t FindPortion(sal_Int32 nCharPos, sal_Int32 &rPortionStart, bool bPreferStartingPortion=false)
bool ImplTruncateNewText(OUString &rNewText) const
void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect)
std::unique_ptr< TextSelFunctionSet > mpSelFuncSet
const vcl::KeyCode & GetKeyCode() const
static SotClipboardFormatId GetFormat(const css::datatransfer::DataFlavor &rFlavor)
virtual void dragGestureRecognized(const css::datatransfer::dnd::DragGestureEvent &dge) override
bool ImpIndentBlock(bool bRight)
bool IsCursorVisible() const
bool IsAutoScroll() const
VclPtr< vcl::Window > mpWindow
virtual void DeselectAtPoint(const Point &) override
#define SAL_WARN_IF(condition, area, stream)
virtual ~TextView() override
constexpr tools::Long Height() const
void SetCursor(vcl::Cursor *pCursor)
TextPaM ImpDeleteText(const TextSelection &rSel)
sal_Int32 GetIndex() const
::OutputDevice const * GetOutDev() const
bool IsTransparent() const
sal_Unicode GetCharCode() const
TextPaM PageUp(const TextPaM &rPaM)
sal_Int32 GetCursorPos() const
TextPaM CursorDown(const TextPaM &rPaM)
const MouseSettings & GetMouseSettings() const
bool HasSelection() const
Sequence< sal_Int8 > aSeq
const Point & GetPosPixel() const
double getLength(const B2DPolygon &rCandidate)
TextNode * GetNode() const
constexpr sal_uInt16 KEY_BACKSPACE
bool IsSelectionAtPoint(const Point &rPointPixel)
virtual void DeselectAll() override
static TextPaM CursorStartOfParagraph(const TextPaM &rPaM)
const OUString & GetText() const
bool IsInSelection(const TextPaM &rPaM) const
void FormatAndUpdate(TextView *pCurView=nullptr)
sal_Int32 GetStart() const
Point GetDocPos(const Point &rWindowPos) const
void Read(SvStream &rInput)
constexpr sal_uInt16 KEY_DELETE
constexpr sal_uInt16 KEY_LEFT
void ImpSetSelection(const TextSelection &rSelection)
TextPaM CursorWordLeft(const TextPaM &rPaM)
TextPaM CursorUp(const TextPaM &rPaM)
TETextPortionList & GetTextPortions()
constexpr sal_uInt16 KEY_INSERT
void SetAutoIndentMode(bool bAutoIndent)
std::unique_ptr< SelectionEngine > mpSelEngine
void Command(const CommandEvent &rCEvt)
sal_uInt32 GetPara() const
std::vector< TextLine > & GetLines()
constexpr sal_uInt16 KEY_TAB
KeyEvent LogicalTextDirectionality(TextDirectionality eMode) const
Reference< XClipboard > GetSystemPrimarySelection()
bool m_bDetectedRangeSegmentation false
static bool GetFormatDataFlavor(SotClipboardFormatId nFormat, css::datatransfer::DataFlavor &rFlavor)
const ExtTextInputAttr * GetTextAttr() const