editeng/source/editeng/impedit.cxx |   20 ++------------------
 include/editeng/editview.hxx       |    2 +-
 include/svx/svdedxv.hxx            |    2 +-
 svx/source/svdraw/svdedxv.cxx      |   36 +++++++++++++++++++++++++++---------
 4 files changed, 31 insertions(+), 29 deletions(-)

New commits:
commit 7f254132bc4b5aabc2ff19374657b2a3cdcd91b1
Author: Armin Le Grand <armin.le.gr...@cib.de>
Date:   Wed Aug 9 19:10:46 2017 +0200

    editviewoverlay: correct reaction on property change
    
    Do not hand over LogicalSelectionRanges directly on
    selection change, better let the visulizer do what
    he needs. On AttributeChange, tge resulting repaint
    needs to refresh all OverlayObjects, not only text,
    but also the selection to make look okay e.g. at
    font size change
    
    Change-Id: Ibb9737c33d6f85a9f68df3edbb989c0443cd4a5c

diff --git a/editeng/source/editeng/impedit.cxx 
b/editeng/source/editeng/impedit.cxx
index 3d71f9a92b0f..aa2a257c5343 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -197,24 +197,8 @@ void ImpEditView::SelectionChanged()
 {
     if (hasEditViewCallbacks())
     {
-        std::vector<tools::Rectangle> aLogicRects;
-        std::vector<basegfx::B2DRange> aLogicRanges;
-        const Size aLogicPixel(pOutWin ? pOutWin->PixelToLogic(Size(1, 1)) : 
Size(1, 1));
-
-        GetSelectionRectangles(GetEditSelection(), aLogicRects);
-
-        for (const auto& aRect : aLogicRects)
-        {
-            // convert from logic Rectangles to logic Ranges, do not forget to 
add
-            // one Unit (in this case logical unit, thus calculate first)
-            aLogicRanges.push_back(
-                basegfx::B2DRange(
-                    aRect.Left(), aRect.Top(),
-                    aRect.Right() + aLogicPixel.Width(), aRect.Bottom() + 
aLogicPixel.Height()));
-        }
-
         // use callback to tell about change in selection visualisation
-        mpEditViewCallbacks->EditViewSelectionChange(aLogicRanges);
+        mpEditViewCallbacks->EditViewSelectionChange();
     }
 }
 
@@ -229,7 +213,7 @@ void ImpEditView::SelectionChanged()
 // the Region*, see GetSelectionRectangles below.
 void ImpEditView::DrawSelectionXOR( EditSelection aTmpSel, vcl::Region* 
pRegion, OutputDevice* pTargetDevice )
 {
-    if (hasEditViewCallbacks() && !pRegion)
+    if (hasEditViewCallbacks() && !pRegion && 
!comphelper::LibreOfficeKit::isActive())
     {
         // we are done, do *not* visualize self
         // CAUTION: do not use when comphelper::LibreOfficeKit::isActive()
diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index 9bb09f8d2d8a..8b98d1f28360 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -93,7 +93,7 @@ public:
     virtual ~EditViewCallbacks();
 
     virtual void EditViewInvalidate() const = 0;
-    virtual void EditViewSelectionChange(const std::vector<basegfx::B2DRange>& 
rLogicRanges) const = 0;
+    virtual void EditViewSelectionChange() const = 0;
 };
 
 class EDITENG_DLLPUBLIC EditView final
diff --git a/include/svx/svdedxv.hxx b/include/svx/svdedxv.hxx
index 8bdae7fb0ee4..6cfb22128e08 100644
--- a/include/svx/svdedxv.hxx
+++ b/include/svx/svdedxv.hxx
@@ -66,7 +66,7 @@ class SVX_DLLPUBLIC SdrObjEditView: public SdrGlueEditView, 
public EditViewCallb
     // Now derived from EditViewCallbacks and overriding these callbacks to
     // allow own EditText visualization
     virtual void EditViewInvalidate() const override;
-    virtual void EditViewSelectionChange(const std::vector<basegfx::B2DRange>& 
rLogicRanges) const override;
+    virtual void EditViewSelectionChange() const override;
 
     // The OverlayObjects used for visualizing active TextEdit (currently
     // using TextEditOverlayObject, but not limitied to it
diff --git a/svx/source/svdraw/svdedxv.cxx b/svx/source/svdraw/svdedxv.cxx
index 3f985b24aa7c..aa369a9e61d4 100644
--- a/svx/source/svdraw/svdedxv.cxx
+++ b/svx/source/svdraw/svdedxv.cxx
@@ -412,7 +412,7 @@ namespace
         // data write access. In this OverlayObject we only have the
         // callback that triggers detecting if something *has* changed
         void checkDataChange(const basegfx::B2DRange& rMinTextEditArea);
-        void checkSelectionChange(const std::vector<basegfx::B2DRange>& 
rLogicRanges);
+        void checkSelectionChange();
     };
 
     drawinglayer::primitive2d::Primitive2DContainer 
TextEditOverlayObject::createOverlayObjectPrimitive2DSequence()
@@ -567,11 +567,28 @@ namespace
         }
     }
 
-    void TextEditOverlayObject::checkSelectionChange(const 
std::vector<basegfx::B2DRange>& rLogicRanges)
+    void TextEditOverlayObject::checkSelectionChange()
     {
-        if (getOverlaySelection())
+        if (getOverlaySelection() && getOverlayManager())
         {
-            mpOverlaySelection->setRanges(rLogicRanges);
+            std::vector<tools::Rectangle> aLogicRects;
+            std::vector<basegfx::B2DRange> aLogicRanges;
+            const Size 
aLogicPixel(getOverlayManager()->getOutputDevice().PixelToLogic(Size(1, 1)));
+
+            // get logic selection
+            getOutlinerView().GetSelectionRectangles(aLogicRects);
+
+            for (const auto& aRect : aLogicRects)
+            {
+                // convert from logic Rectangles to logic Ranges, do not 
forget to add
+                // one Unit (in this case logical units for one pixel, 
pre-calculated)
+                aLogicRanges.push_back(
+                    basegfx::B2DRange(
+                        aRect.Left() - aLogicPixel.Width(), aRect.Top() - 
aLogicPixel.Height(),
+                        aRect.Right() + aLogicPixel.Width(), aRect.Bottom() + 
aLogicPixel.Height()));
+            }
+
+            mpOverlaySelection->setRanges(aLogicRanges);
         }
     }
 } // end of anonymous namespace
@@ -601,7 +618,7 @@ void SdrObjEditView::EditViewInvalidate() const
     }
 }
 
-void SdrObjEditView::EditViewSelectionChange(const 
std::vector<basegfx::B2DRange>& rLogicRanges) const
+void SdrObjEditView::EditViewSelectionChange() const
 {
     if (IsTextEdit())
     {
@@ -611,7 +628,7 @@ void SdrObjEditView::EditViewSelectionChange(const 
std::vector<basegfx::B2DRange
 
             if (pCandidate)
             {
-                pCandidate->checkSelectionChange(rLogicRanges);
+                pCandidate->checkSelectionChange();
             }
         }
     }
@@ -621,10 +638,11 @@ void SdrObjEditView::TextEditDrawing(SdrPaintWindow& 
rPaintWindow) const
 {
     if (!comphelper::LibreOfficeKit::isActive())
     {
-        // adapt TextEditOverlayObject(s). Need also to do this here to
-        // update the current values accordingly. Suppress new stuff when
-        // LibreOficeKit is active
+        // adapt all TextEditOverlayObject(s), so call EditViewInvalidate()
+        // and EditViewSelectionChange() to update accordingly. Suppress new
+        // stuff when LibreOficeKit is active
         EditViewInvalidate();
+        EditViewSelectionChange();
     }
     else
     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to