diff options
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/source/editeng/editeng.cxx | 10 | ||||
-rw-r--r-- | editeng/source/editeng/editundo.cxx | 4 | ||||
-rw-r--r-- | editeng/source/editeng/editview.cxx | 42 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.cxx | 90 | ||||
-rw-r--r-- | editeng/source/editeng/impedit.hxx | 11 | ||||
-rw-r--r-- | editeng/source/editeng/impedit2.cxx | 42 | ||||
-rw-r--r-- | editeng/source/editeng/impedit3.cxx | 4 | ||||
-rw-r--r-- | editeng/source/editeng/impedit4.cxx | 28 |
8 files changed, 134 insertions, 97 deletions
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 63fce03390de..024b66a91fda 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -637,7 +637,7 @@ ESelection EditEngine::GetWord( const ESelection& rSelection, sal_uInt16 nWordTy return pE->pImpEditEngine->CreateESel( aSel ); } -void EditEngine::CursorMoved(ContentNode* pPrevNode) +void EditEngine::CursorMoved(const ContentNode* pPrevNode) { pImpEditEngine->CursorMoved(pPrevNode); } @@ -1173,7 +1173,7 @@ bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditView, v break; } - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pImpEditEngine->UndoActionStart( EDITUNDO_DELETE ); aCurSel = pImpEditEngine->DeleteLeftOrRight( aCurSel, nDel, nMode ); pImpEditEngine->UndoActionEnd(); @@ -1213,7 +1213,7 @@ bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditView, v { if ( !bReadOnly ) { - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); if ( !rKeyEvent.GetKeyCode().IsMod1() && !rKeyEvent.GetKeyCode().IsMod2() ) { pImpEditEngine->UndoActionStart( EDITUNDO_INSERT ); @@ -1268,7 +1268,7 @@ bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditView, v if ( !bReadOnly && IsSimpleCharInput( rKeyEvent ) ) { sal_Unicode nCharCode = rKeyEvent.GetCharCode(); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); // Autocorrection? SvxAutoCorrect* pAutoCorrect = SvxAutoCorrCfg::Get().GetAutoCorrect(); if ( ( pImpEditEngine->GetStatus().DoAutoCorrect() ) && @@ -1363,7 +1363,7 @@ bool EditEngine::PostKeyEvent( const KeyEvent& rKeyEvent, EditView* pEditView, v pEditView->pImpEditView->SetEditSelection( aCurSel ); if (comphelper::LibreOfficeKit::isActive()) { - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); } pImpEditEngine->UpdateSelections(); diff --git a/editeng/source/editeng/editundo.cxx b/editeng/source/editeng/editundo.cxx index ca074815d6d4..40ba68926516 100644 --- a/editeng/source/editeng/editundo.cxx +++ b/editeng/source/editeng/editundo.cxx @@ -66,7 +66,7 @@ bool EditUndoManager::Undo() } } - mpEditEngine->GetActiveView()->GetImpEditView()->DrawSelection(); // Remove the old selection + mpEditEngine->GetActiveView()->GetImpEditView()->DrawSelectionXOR(); // Remove the old selection mpEditEngine->SetUndoMode( true ); bool bDone = SfxUndoManager::Undo(); @@ -101,7 +101,7 @@ bool EditUndoManager::Redo() } } - mpEditEngine->GetActiveView()->GetImpEditView()->DrawSelection(); // Remove the old selection + mpEditEngine->GetActiveView()->GetImpEditView()->DrawSelectionXOR(); // Remove the old selection mpEditEngine->SetUndoMode( true ); bool bDone = SfxUndoManager::Redo(); diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx index db7ff1951767..b74f76e35001 100644 --- a/editeng/source/editeng/editview.cxx +++ b/editeng/source/editeng/editview.cxx @@ -256,7 +256,7 @@ void EditView::SetSelection( const ESelection& rESel ) // manipulates the selection: if ( !pImpEditView->GetEditSelection().HasRange() ) { - ContentNode* pNode = pImpEditView->GetEditSelection().Max().GetNode(); + const ContentNode* pNode = pImpEditView->GetEditSelection().Max().GetNode(); pImpEditView->pEditEngine->CursorMoved( pNode ); } EditSelection aNewSelection( pImpEditView->pEditEngine->pImpEditEngine->ConvertSelection( @@ -281,9 +281,9 @@ void EditView::SetSelection( const ESelection& rESel ) aNewSelection.Max() = EditPaM( pNode, pNode->Len() ); } - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->SetEditSelection( aNewSelection ); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); bool bGotoCursor = pImpEditView->DoAutoScroll(); ShowCursor( bGotoCursor ); } @@ -318,7 +318,7 @@ SvtScriptType EditView::GetSelectedScriptType() const void EditView::GetSelectionRectangles(std::vector<tools::Rectangle>& rLogicRects) const { - return pImpEditView->GetSelectionRectangles(rLogicRects); + return pImpEditView->GetSelectionRectangles(pImpEditView->GetEditSelection(), rLogicRects); } void EditView::Paint( const tools::Rectangle& rRect, OutputDevice* pTargetDevice ) @@ -413,7 +413,7 @@ void EditView::InsertText( const OUString& rStr, bool bSelect ) { EditEngine* pEE = pImpEditView->pEditEngine; - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); EditPaM aPaM1; if ( bSelect ) @@ -512,7 +512,7 @@ void EditView::SetAttribs( const SfxItemSet& rSet ) { DBG_ASSERT( !pImpEditView->aEditSelection.IsInvalid(), "Blind Selection in ...." ); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->pEditEngine->SetAttribs( pImpEditView->GetEditSelection(), rSet, SetAttribsMode::WholeWord ); pImpEditView->pEditEngine->FormatAndUpdate( this ); } @@ -520,7 +520,7 @@ void EditView::SetAttribs( const SfxItemSet& rSet ) void EditView::RemoveAttribsKeepLanguages( bool bRemoveParaAttribs ) { - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->pEditEngine->UndoActionStart( EDITUNDO_RESETATTRIBS ); EditSelection aSelection( pImpEditView->GetEditSelection() ); @@ -540,7 +540,7 @@ void EditView::RemoveAttribsKeepLanguages( bool bRemoveParaAttribs ) void EditView::RemoveAttribs( bool bRemoveParaAttribs, sal_uInt16 nWhich ) { - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->pEditEngine->UndoActionStart( EDITUNDO_RESETATTRIBS ); pImpEditView->pEditEngine->RemoveCharAttribs( pImpEditView->GetEditSelection(), bRemoveParaAttribs, nWhich ); pImpEditView->pEditEngine->UndoActionEnd(); @@ -574,7 +574,7 @@ void EditView::Redo() ErrCode EditView::Read( SvStream& rInput, EETextFormat eFormat, SvKeyValueIterator* pHTTPHeaderAttrs ) { EditSelection aOldSel( pImpEditView->GetEditSelection() ); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->pEditEngine->pImpEditEngine->UndoActionStart( EDITUNDO_READ ); EditPaM aEndPaM = pImpEditView->pEditEngine->pImpEditEngine->Read( rInput, "", eFormat, aOldSel, pHTTPHeaderAttrs ); pImpEditView->pEditEngine->pImpEditEngine->UndoActionEnd(); @@ -690,7 +690,7 @@ EditTextObject* EditView::CreateTextObject() void EditView::InsertText( const EditTextObject& rTextObject ) { - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->pEditEngine->UndoActionStart( EDITUNDO_INSERT ); EditSelection aTextSel( pImpEditView->pEditEngine->InsertText( rTextObject, pImpEditView->GetEditSelection() ) ); @@ -773,9 +773,9 @@ void EditView::TransliterateText( TransliterationFlags nTransliterationMode ) EditSelection aNewSel = pImpEditView->pEditEngine->TransliterateText( pImpEditView->GetEditSelection(), nTransliterationMode ); if ( aNewSel != aOldSel ) { - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->SetEditSelection( aNewSel ); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); } } @@ -783,7 +783,7 @@ void EditView::CompleteAutoCorrect( vcl::Window const * pFrameWin ) { if ( !pImpEditView->HasSelection() && pImpEditView->pEditEngine->pImpEditEngine->GetStatus().DoAutoCorrect() ) { - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); EditSelection aSel = pImpEditView->GetEditSelection(); aSel = pImpEditView->pEditEngine->EndOfWord( aSel.Max() ); aSel = pImpEditView->pEditEngine->pImpEditEngine->AutoCorrect( aSel, 0, !IsInsertMode(), pFrameWin ); @@ -1073,9 +1073,9 @@ void EditView::ExecuteSpellPopup( const Point& rPosPixel, Link<SpellCallbackInfo { // Set Cursor before word... EditPaM aCursor = pImpEditView->GetEditSelection().Min(); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->SetEditSelection( EditSelection( aCursor, aCursor ) ); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); // Crashes when no SfxApp pImpEditView->pEditEngine->pImpEditEngine->Spell( this, false ); } @@ -1144,17 +1144,17 @@ void EditView::ExecuteSpellPopup( const Point& rPosPixel, Link<SpellCallbackInfo void EditView::SelectCurrentWord( sal_Int16 nWordType ) { EditSelection aCurSel( pImpEditView->GetEditSelection() ); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); aCurSel = pImpEditView->pEditEngine->SelectWord(aCurSel.Max(), nWordType); pImpEditView->SetEditSelection( aCurSel ); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); ShowCursor( true, false ); } void EditView::InsertField( const SvxFieldItem& rFld ) { EditEngine* pEE = pImpEditView->pEditEngine; - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pEE->UndoActionStart( EDITUNDO_INSERT ); EditPaM aPaM( pEE->InsertField( pImpEditView->GetEditSelection(), rFld ) ); pEE->UndoActionEnd(); @@ -1442,16 +1442,16 @@ void EditView::SetCursorLogicPosition(const Point& rPosition, bool bPoint, bool if (pImpEditView->GetEditSelection().Min() != aSelection.Min()) pImpEditView->pEditEngine->CursorMoved(pImpEditView->GetEditSelection().Min().GetNode()); - pImpEditView->DrawSelection(aSelection); + pImpEditView->DrawSelectionXOR(aSelection); if (pImpEditView->GetEditSelection() != aSelection) pImpEditView->SetEditSelection(aSelection); ShowCursor(/*bGotoCursor=*/false); } -void EditView::DrawSelection(OutlinerViewShell* pOtherShell) +void EditView::DrawSelectionXOR(OutlinerViewShell* pOtherShell) { pImpEditView->RegisterOtherShell(pOtherShell); - pImpEditView->DrawSelection(); + pImpEditView->DrawSelectionXOR(); pImpEditView->RegisterOtherShell(nullptr); } diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx index fc8ee6745a3a..48a6f1397af3 100644 --- a/editeng/source/editeng/impedit.cxx +++ b/editeng/source/editeng/impedit.cxx @@ -91,6 +91,8 @@ ImpEditView::ImpEditView( EditView* pView, EditEngine* pEng, vcl::Window* pWindo aEditSelection.Min() = pEng->GetEditDoc().GetStartPaM(); aEditSelection.Max() = pEng->GetEditDoc().GetEndPaM(); + + SelectionChanged(); } ImpEditView::~ImpEditView() @@ -131,6 +133,8 @@ void ImpEditView::SetEditSelection( const EditSelection& rEditSelection ) // set state before notification aEditSelection = rEditSelection; + SelectionChanged(); + if (comphelper::LibreOfficeKit::isActive()) // Tiled rendering: selections are only painted when we are in selection mode. pEditEngine->SetInSelectionMode(aEditSelection.HasRange()); @@ -184,19 +188,20 @@ void lcl_translateTwips(vcl::Window const & rParent, vcl::Window& rChild) } } -void ImpEditView::DrawSelection( EditSelection aTmpSel, vcl::Region* pRegion, OutputDevice* pTargetDevice ) +// EditView never had a central/secure place to react on SelectionChange since +// Selection was changed in many places, often by not using SetEditSelection() +// but (mis)using GetEditSelection() and manipulating this non-const return +// value. Sorted this out now to have such a place, this is needed for safely +// change/update the Selection visualization for enhanced mechanisms +void ImpEditView::SelectionChanged() { - if (hasEditViewCallbacks() && !pRegion) + if (hasEditViewCallbacks()) { - // when we have an own mechanism for painting EditViews, collect the Selection - // in a basegfx::B2DRange vector and hand over. To do so, call GetSelectionRectangles - // which recursively calls ImpEditView::DrawSelection, but with nullptr != pRegion std::vector<tools::Rectangle> aLogicRects; std::vector<basegfx::B2DRange> aLogicRanges; - OutputDevice* pTarget = pTargetDevice ? pTargetDevice : pOutWin; - const Point aPixel(pTarget ? pTarget->LogicToPixel(Point(1, 1)) : Point(1, 1)); + const Size aLogicPixel(pOutWin ? pOutWin->PixelToLogic(Size(1, 1)) : Size(1, 1)); - GetSelectionRectangles(aLogicRects); + GetSelectionRectangles(GetEditSelection(), aLogicRects); for (const auto& aRect : aLogicRects) { @@ -205,12 +210,27 @@ void ImpEditView::DrawSelection( EditSelection aTmpSel, vcl::Region* pRegion, Ou aLogicRanges.push_back( basegfx::B2DRange( aRect.Left(), aRect.Top(), - aRect.Right() + aPixel.X(), aRect.Bottom() + aPixel.Y())); + aRect.Right() + aLogicPixel.Width(), aRect.Bottom() + aLogicPixel.Height())); } // use callback to tell about change in selection visualisation mpEditViewCallbacks->EditViewSelectionChange(aLogicRanges); + } +} +// renamed from DrawSelection to DrawSelectionXOR to better reflect what this +// method was used for: Paint Selection in XOR, change it and again paint it in XOR. +// This can be safely assumed due to the EditView only being capable of painting the +// selection in XOR until today. +// This also means that all places calling DrawSelectionXOR are thoroughly weighted +// and choosen to make this fragile XOR-paint water-proof and thus contain some +// information in this sense. +// Someone thankfully expanded it to collect the SelectionRectangles when called with +// the Region*, see GetSelectionRectangles below. +void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* pRegion, OutputDevice* pTargetDevice ) +{ + if (hasEditViewCallbacks() && !pRegion) + { // we are done, do *not* visualize self return; } @@ -262,7 +282,7 @@ void ImpEditView::DrawSelection( EditSelection aTmpSel, vcl::Region* pRegion, Ou pPolyPoly = new tools::PolyPolygon; } - DBG_ASSERT( !pEditEngine->IsIdleFormatterActive(), "DrawSelection: Not formatted!" ); + DBG_ASSERT( !pEditEngine->IsIdleFormatterActive(), "DrawSelectionXOR: Not formatted!" ); aTmpSel.Adjust( pEditEngine->GetEditDoc() ); ContentNode* pStartNode = aTmpSel.Min().GetNode(); @@ -351,7 +371,7 @@ void ImpEditView::DrawSelection( EditSelection aTmpSel, vcl::Region* pRegion, Ou if ( nTmpEndIndex > nEndIndex ) nTmpEndIndex = nEndIndex; - DBG_ASSERT( nTmpEndIndex > nTmpStartIndex, "DrawSelection, Start >= End?" ); + DBG_ASSERT( nTmpEndIndex > nTmpStartIndex, "DrawSelectionXOR, Start >= End?" ); long nX1 = pEditEngine->GetXPos(pTmpPortion, &rLine, nTmpStartIndex, true); long nX2 = pEditEngine->GetXPos(pTmpPortion, &rLine, nTmpEndIndex); @@ -477,10 +497,10 @@ void ImpEditView::DrawSelection( EditSelection aTmpSel, vcl::Region* pRegion, Ou } } -void ImpEditView::GetSelectionRectangles(std::vector<tools::Rectangle>& rLogicRects) +void ImpEditView::GetSelectionRectangles(EditSelection aTmpSel, std::vector<tools::Rectangle>& rLogicRects) { vcl::Region aRegion; - DrawSelection(aEditSelection, &aRegion); + DrawSelectionXOR(aTmpSel, &aRegion); aRegion.GetRegionRectangles(rLogicRects); } @@ -627,9 +647,9 @@ void ImpEditView::SetSelectionMode( EESelectionMode eNewMode ) { if ( eSelectionMode != eNewMode ) { - DrawSelection(); + DrawSelectionXOR(); eSelectionMode = eNewMode; - DrawSelection(); // redraw + DrawSelectionXOR(); // redraw } } @@ -1397,9 +1417,9 @@ bool ImpEditView::IsWrongSpelledWord( const EditPaM& rPaM, bool bMarkIfWrong ) bIsWrong = rPaM.GetNode()->GetWrongList()->HasWrong( aSel.Min().GetIndex(), aSel.Max().GetIndex() ); if ( bIsWrong && bMarkIfWrong ) { - DrawSelection(); + DrawSelectionXOR(); SetEditSelection( aSel ); - DrawSelection(); + DrawSelectionXOR(); } } return bIsWrong; @@ -1420,9 +1440,9 @@ OUString ImpEditView::SpellIgnoreWord() { aWord = pEditEngine->pImpEditEngine->GetSelected( GetEditSelection() ); // And deselect - DrawSelection(); + DrawSelectionXOR(); SetEditSelection( EditSelection( aPaM, aPaM ) ); - DrawSelection(); + DrawSelectionXOR(); } if ( !aWord.isEmpty() ) @@ -1446,7 +1466,7 @@ OUString ImpEditView::SpellIgnoreWord() void ImpEditView::DeleteSelected() { - DrawSelection(); + DrawSelectionXOR(); pEditEngine->pImpEditEngine->UndoActionStart( EDITUNDO_DELETE ); @@ -1585,7 +1605,7 @@ void ImpEditView::Paste( css::uno::Reference< css::datatransfer::clipboard::XCli EditSelection aSel( GetEditSelection() ); if ( aSel.HasRange() ) { - DrawSelection(); + DrawSelectionXOR(); aSel = pEditEngine->DeleteSelection(aSel); } @@ -1669,18 +1689,20 @@ bool ImpEditView::IsInSelection( const EditPaM& rPaM ) void ImpEditView::CreateAnchor() { pEditEngine->SetInSelectionMode(true); - GetEditSelection().Min() = GetEditSelection().Max(); + EditSelection aNewSelection(GetEditSelection()); + aNewSelection.Min() = aNewSelection.Max(); + SetEditSelection(aNewSelection); + // const_cast<EditPaM&>(GetEditSelection().Min()) = GetEditSelection().Max(); } void ImpEditView::DeselectAll() { pEditEngine->SetInSelectionMode(false); - DrawSelection(); - GetEditSelection().Min() = GetEditSelection().Max(); - - // Selection is empty, still need to draw it due to new forward selection - // functionality. When without that, nothing will be drawn (since it's empty) - DrawSelection(); + DrawSelectionXOR(); + EditSelection aNewSelection(GetEditSelection()); + aNewSelection.Min() = aNewSelection.Max(); + SetEditSelection(aNewSelection); + // const_cast<EditPaM&>(GetEditSelection().Min()) = GetEditSelection().Max(); } bool ImpEditView::IsSelectionAtPoint( const Point& rPosPixel ) @@ -1741,7 +1763,7 @@ bool ImpEditView::SetCursorAtPoint( const Point& rPointPixel ) } else { - DrawSelection( aTmpNewSel ); + DrawSelectionXOR( aTmpNewSel ); } // set changed text selection @@ -1849,8 +1871,8 @@ void ImpEditView::dragGestureRecognized(const css::datatransfer::dnd::DragGestur pDragAndDropInfo->pField = pField; ContentNode* pNode = pEditEngine->GetEditDoc().GetObject( nPara ); aCopySel = EditSelection( EditPaM( pNode, nPos ), EditPaM( pNode, nPos+1 ) ); - GetEditSelection() = aCopySel; - DrawSelection(); + SetEditSelection(aCopySel); + DrawSelectionXOR(); bool bGotoCursor = DoAutoScroll(); ShowCursor( bGotoCursor, /*bForceCursor=*/false ); } @@ -1963,7 +1985,7 @@ void ImpEditView::dragDropEnd( const css::datatransfer::dnd::DragSourceDropEvent } } - DrawSelection(); + DrawSelectionXOR(); EditSelection aDelSel( pEditEngine->pImpEditEngine->CreateSel( aToBeDelSel ) ); DBG_ASSERT( !aDelSel.DbgIsBuggy( pEditEngine->GetEditDoc() ), "ToBeDel is buggy!" ); pEditEngine->DeleteSelection(aDelSel); @@ -1973,7 +1995,7 @@ void ImpEditView::dragDropEnd( const css::datatransfer::dnd::DragSourceDropEvent SetEditSelection( pEditEngine->pImpEditEngine->CreateSel( aNewSel ) ); } pEditEngine->pImpEditEngine->FormatAndUpdate( pEditEngine->pImpEditEngine->GetActiveView() ); - DrawSelection(); + DrawSelectionXOR(); } else { @@ -2024,7 +2046,7 @@ void ImpEditView::drop( const css::datatransfer::dnd::DropTargetDropEvent& rDTDE { bChanges = true; // remove Selection ... - DrawSelection(); + DrawSelectionXOR(); EditPaM aPaM( pDragAndDropInfo->aDropDest ); PasteOrDropInfos aPasteOrDropInfos; diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 89cf8947d7c8..3c1d2e78a0c6 100644 --- a/editeng/source/editeng/impedit.hxx +++ b/editeng/source/editeng/impedit.hxx @@ -335,13 +335,14 @@ public: long GetVisDocBottom() const { return aVisDocStartPos.Y() + ( !IsVertical() ? aOutArea.GetHeight() : aOutArea.GetWidth() ); } tools::Rectangle GetVisDocArea() const; - EditSelection& GetEditSelection() { return aEditSelection; } + const EditSelection& GetEditSelection() { return aEditSelection; } void SetEditSelection( const EditSelection& rEditSelection ); bool HasSelection() const { return aEditSelection.HasRange(); } - void DrawSelection() { DrawSelection( aEditSelection ); } - void DrawSelection( EditSelection, vcl::Region* pRegion = nullptr, OutputDevice* pTargetDevice = nullptr ); - void GetSelectionRectangles(std::vector<tools::Rectangle>& rLogicRects); + void SelectionChanged(); + void DrawSelectionXOR() { DrawSelectionXOR( aEditSelection ); } + void DrawSelectionXOR( EditSelection, vcl::Region* pRegion = nullptr, OutputDevice* pTargetDevice = nullptr ); + void GetSelectionRectangles(EditSelection aTmpSel, std::vector<tools::Rectangle>& rLogicRects); vcl::Window* GetWindow() const { return pOutWin; } @@ -541,7 +542,7 @@ private: // Methods... - void CursorMoved( ContentNode* pPrevNode ); + void CursorMoved( const ContentNode* pPrevNode ); void ParaAttribsChanged( ContentNode const * pNode ); void TextModified(); void CalcHeight( ParaPortion* pPortion ); diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index 7884d4ff887a..992913c03525 100644 --- a/editeng/source/editeng/impedit2.cxx +++ b/editeng/source/editeng/impedit2.cxx @@ -329,9 +329,9 @@ bool ImpEditEngine::MouseButtonDown( const MouseEvent& rMEvt, EditView* pView ) aSelEngine.CursorPosChanging( true, false ); EditSelection aNewSelection( SelectWord( aCurSel ) ); - pView->pImpEditView->DrawSelection(); + pView->pImpEditView->DrawSelectionXOR(); pView->pImpEditView->SetEditSelection( aNewSelection ); - pView->pImpEditView->DrawSelection(); + pView->pImpEditView->DrawSelectionXOR(); pView->ShowCursor(); } else if ( rMEvt.GetClicks() == 3 ) @@ -342,9 +342,9 @@ bool ImpEditEngine::MouseButtonDown( const MouseEvent& rMEvt, EditView* pView ) EditSelection aNewSelection( aCurSel ); aNewSelection.Min().SetIndex( 0 ); aNewSelection.Max().SetIndex( aCurSel.Min().GetNode()->Len() ); - pView->pImpEditView->DrawSelection(); + pView->pImpEditView->DrawSelectionXOR(); pView->pImpEditView->SetEditSelection( aNewSelection ); - pView->pImpEditView->DrawSelection(); + pView->pImpEditView->DrawSelectionXOR(); pView->ShowCursor(); } } @@ -709,11 +709,13 @@ const SfxItemSet& ImpEditEngine::GetEmptyItemSet() // MISC -void ImpEditEngine::CursorMoved( ContentNode* pPrevNode ) +void ImpEditEngine::CursorMoved( const ContentNode* pPrevNode ) { // Delete empty attributes, but only if paragraph is not empty! - if ( pPrevNode->GetCharAttribs().HasEmptyAttribs() && pPrevNode->Len() ) - pPrevNode->GetCharAttribs().DeleteEmptyAttribs( aEditDoc.GetItemPool() ); + if (pPrevNode->GetCharAttribs().HasEmptyAttribs() && pPrevNode->Len()) + { + const_cast<ContentNode*>(pPrevNode)->GetCharAttribs().DeleteEmptyAttribs(aEditDoc.GetItemPool()); + } } void ImpEditEngine::TextModified() @@ -913,15 +915,27 @@ EditSelection ImpEditEngine::MoveCursor( const KeyEvent& rKeyEvent, EditView* pE aSelEngine.SetCurView( pEditView ); aSelEngine.CursorPosChanging( bKeyModifySelection, aTranslatedKeyEvent.GetKeyCode().IsMod1() ); EditPaM aOldEnd( pEditView->pImpEditView->GetEditSelection().Max() ); - pEditView->pImpEditView->GetEditSelection().Max() = aPaM; + + { + EditSelection aNewSelection(pEditView->pImpEditView->GetEditSelection()); + aNewSelection.Max() = aPaM; + pEditView->pImpEditView->SetEditSelection(aNewSelection); + // const_cast<EditPaM&>(pEditView->pImpEditView->GetEditSelection().Max()) = aPaM; + } + if ( bKeyModifySelection ) { // Then the selection is expanded ... or the whole selection is painted in case of tiled rendering. EditSelection aTmpNewSel( comphelper::LibreOfficeKit::isActive() ? pEditView->pImpEditView->GetEditSelection().Min() : aOldEnd, aPaM ); - pEditView->pImpEditView->DrawSelection( aTmpNewSel ); + pEditView->pImpEditView->DrawSelectionXOR( aTmpNewSel ); } else - pEditView->pImpEditView->GetEditSelection().Min() = aPaM; + { + EditSelection aNewSelection(pEditView->pImpEditView->GetEditSelection()); + aNewSelection.Min() = aPaM; + pEditView->pImpEditView->SetEditSelection(aNewSelection); + // const_cast<EditPaM&>(pEditView->pImpEditView->GetEditSelection().Min()) = aPaM; + } return pEditView->pImpEditView->GetEditSelection(); } @@ -3428,12 +3442,12 @@ void ImpEditEngine::SetActiveView( EditView* pView ) return; if ( pActiveView && pActiveView->HasSelection() ) - pActiveView->pImpEditView->DrawSelection(); + pActiveView->pImpEditView->DrawSelectionXOR(); pActiveView = pView; if ( pActiveView && pActiveView->HasSelection() ) - pActiveView->pImpEditView->DrawSelection(); + pActiveView->pImpEditView->DrawSelectionXOR(); // NN: Quick fix for #78668#: // When editing of a cell in Calc is ended, the edit engine is not deleted, @@ -4292,7 +4306,7 @@ void ImpEditEngine::IndentBlock( EditView* pEditView, bool bRight ) aNewSel.nEndPos = 0; } - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->pImpEditView->SetEditSelection( pEditView->pImpEditView->GetEditSelection().Max() ); UndoActionStart( bRight ? EDITUNDO_INDENTBLOCK : EDITUNDO_UNINDENTBLOCK ); @@ -4328,7 +4342,7 @@ void ImpEditEngine::IndentBlock( EditView* pEditView, bool bRight ) if ( pLastNode->Len() < aNewSel.nEndPos ) aNewSel.nEndPos = pLastNode->Len(); pEditView->pImpEditView->SetEditSelection( CreateSel( aNewSel ) ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->pImpEditView->ShowCursor( false, true ); } } diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index e07312e4aa05..f46e14e0f0dd 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -3848,10 +3848,10 @@ void ImpEditEngine::Paint( ImpEditView* pView, const tools::Rectangle& rRect, Ou else pTarget->SetClipRegion(); - // In case of tiled rendering pass a region to DrawSelection(), so that + // In case of tiled rendering pass a region to DrawSelectionXOR(), so that // selection callbacks are not emitted during every repaint. vcl::Region aRegion; - pView->DrawSelection(pView->GetEditSelection(), comphelper::LibreOfficeKit::isActive() ? &aRegion : nullptr, pTarget); + pView->DrawSelectionXOR(pView->GetEditSelection(), comphelper::LibreOfficeKit::isActive() ? &aRegion : nullptr, pTarget); } void ImpEditEngine::InsertContent( ContentNode* pNode, sal_Int32 nPos ) diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx index f4aba7df76aa..926949c77a65 100644 --- a/editeng/source/editeng/impedit4.cxx +++ b/editeng/source/editeng/impedit4.cxx @@ -1476,12 +1476,12 @@ EESpellState ImpEditEngine::Spell( EditView* pEditView, bool bMultipleDoc ) if ( !bMultipleDoc ) { - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); if ( aCurSel.Max().GetIndex() > aCurSel.Max().GetNode()->Len() ) aCurSel.Max().SetIndex( aCurSel.Max().GetNode()->Len() ); aCurSel.Min() = aCurSel.Max(); pEditView->pImpEditView->SetEditSelection( aCurSel ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->ShowCursor( true, false ); } EESpellState eState = pSpellInfo->eState; @@ -1599,12 +1599,12 @@ void ImpEditEngine::Convert( EditView* pEditView, if ( !bMultipleDoc ) { - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); if ( aCurSel.Max().GetIndex() > aCurSel.Max().GetNode()->Len() ) aCurSel.Max().SetIndex( aCurSel.Max().GetNode()->Len() ); aCurSel.Min() = aCurSel.Max(); pEditView->pImpEditView->SetEditSelection( aCurSel ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->ShowCursor( true, false ); } delete pConvInfo; @@ -1802,9 +1802,9 @@ void ImpEditEngine::ImpConvert( OUString &rConvTxt, LanguageType &rConvTxtLang, pConvInfo->aConvContinue = CreateEPaM( aCurSel.Max() ); } - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->pImpEditView->SetEditSelection( aCurSel ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->ShowCursor( true, false ); rConvTxt = aRes; @@ -1872,9 +1872,9 @@ Reference< XSpellAlternatives > ImpEditEngine::ImpSpell( EditView* pEditView ) pSpellInfo->eState = EESpellState::ErrorFound; } - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->pImpEditView->SetEditSelection( aCurSel ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->ShowCursor( true, false ); return xSpellAlt; } @@ -2464,9 +2464,9 @@ EESpellState ImpEditEngine::StartThesaurus( EditView* pEditView ) if (xDlg->Execute() == RET_OK) { // Replace Word... - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->pImpEditView->SetEditSelection( aCurSel ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->InsertText(xDlg->GetWord()); pEditView->ShowCursor(true, false); } @@ -2506,7 +2506,7 @@ sal_Int32 ImpEditEngine::StartSearchAndReplace( EditView* pEditView, const SvxSe SvxSearchItem aTmpItem( rSearchItem ); aTmpItem.SetBackward( false ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); aCurSel.Adjust( aEditDoc ); EditPaM aStartPaM = aTmpItem.GetSelection() ? aCurSel.Min() : aEditDoc.GetStartPaM(); @@ -2531,7 +2531,7 @@ sal_Int32 ImpEditEngine::StartSearchAndReplace( EditView* pEditView, const SvxSe } else { - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->ShowCursor( true, false ); } } @@ -2554,7 +2554,7 @@ bool ImpEditEngine::Search( const SvxSearchItem& rSearchItem, EditView* pEditVie bFound = ImpSearch( rSearchItem, aSel, aStartPaM, aFoundSel ); } - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); if ( bFound ) { // First, set the minimum, so the whole word is in the visible range. @@ -2565,7 +2565,7 @@ bool ImpEditEngine::Search( const SvxSearchItem& rSearchItem, EditView* pEditVie else pEditView->pImpEditView->SetEditSelection( aSel.Max() ); - pEditView->pImpEditView->DrawSelection(); + pEditView->pImpEditView->DrawSelectionXOR(); pEditView->ShowCursor( true, false ); return bFound; } |