[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - starmath/inc starmath/source

Caolán McNamara caolanm at redhat.com
Wed Jul 22 14:23:22 PDT 2015


 starmath/inc/ElementsDockingWindow.hxx    |    4 +
 starmath/source/ElementsDockingWindow.cxx |   69 ++++++++++++++++--------------
 2 files changed, 42 insertions(+), 31 deletions(-)

New commits:
commit 3e390f8c579fcec8d3eba71b8d8608eb74e03449
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Jul 22 15:36:08 2015 +0100

    Resolves: tdf#92148 SmElementsControl invalidates itself from paint endlessly
    
    Change-Id: Id9cd7fbe9e433005cc27b2e8e3417a5e289b94e3
    (cherry picked from commit b1760dc3320bfb44568243359124d2615e69e18d)
    Reviewed-on: https://gerrit.libreoffice.org/17302
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/starmath/inc/ElementsDockingWindow.hxx b/starmath/inc/ElementsDockingWindow.hxx
index 6877d81..7cf8abb 100644
--- a/starmath/inc/ElementsDockingWindow.hxx
+++ b/starmath/inc/ElementsDockingWindow.hxx
@@ -106,6 +106,10 @@ class SmElementsControl : public Control
 
     void build();
 
+    //if pContext is not NULL, then draw, otherwise
+    //just layout
+    void LayoutOrPaintContents(vcl::RenderContext *pContext = NULL);
+
 public:
     SmElementsControl(vcl::Window *pParent);
     virtual ~SmElementsControl();
diff --git a/starmath/source/ElementsDockingWindow.cxx b/starmath/source/ElementsDockingWindow.cxx
index f00cefb..f5f2c17 100644
--- a/starmath/source/ElementsDockingWindow.cxx
+++ b/starmath/source/ElementsDockingWindow.cxx
@@ -254,10 +254,8 @@ void SmElementsControl::setVerticalMode(bool bVerticalMode)
     mbVerticalMode = bVerticalMode;
 }
 
-void SmElementsControl::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
+void SmElementsControl::LayoutOrPaintContents(vcl::RenderContext *pContext)
 {
-    rRenderContext.Push();
-
     bool bOldVisibleState = mxScroll->IsVisible();
 
     sal_Int32 nScrollbarWidth = bOldVisibleState ? GetSettings().GetStyleSettings().GetScrollBarSize() : 0;
@@ -301,7 +299,8 @@ void SmElementsControl::Paint(vcl::RenderContext& rRenderContext, const Rectangl
                 Rectangle aSelectionRectangle(x + 5 - 1, y + 5,
                                               x + 5 + 1, nControlHeight - 5);
 
-                rRenderContext.DrawRect(PixelToLogic(aSelectionRectangle));
+                if (pContext)
+                    pContext->DrawRect(PixelToLogic(aSelectionRectangle));
                 x += 10;
             }
             else
@@ -312,14 +311,15 @@ void SmElementsControl::Paint(vcl::RenderContext& rRenderContext, const Rectangl
                 Rectangle aSelectionRectangle(x + 5, y + 5 - 1,
                                               nControlWidth - 5, y + 5 + 1);
 
-                rRenderContext.DrawRect(PixelToLogic(aSelectionRectangle));
+                if (pContext)
+                    pContext->DrawRect(PixelToLogic(aSelectionRectangle));
                 y += 10;
             }
         }
         else
         {
-            Size aSizePixel = rRenderContext.LogicToPixel(Size(element->getNode()->GetWidth(),
-                                                               element->getNode()->GetHeight()));
+            Size aSizePixel = LogicToPixel(Size(element->getNode()->GetWidth(),
+                                                element->getNode()->GetHeight()));
             if (mbVerticalMode)
             {
                 if (y + boxY > nControlHeight)
@@ -337,20 +337,21 @@ void SmElementsControl::Paint(vcl::RenderContext& rRenderContext, const Rectangl
                 }
             }
 
-            if (mpCurrentElement == element)
+            if (mpCurrentElement == element && pContext)
             {
-                rRenderContext.Push(PushFlags::FILLCOLOR | PushFlags::LINECOLOR);
-                rRenderContext.SetFillColor(Color(230, 230, 230));
-                rRenderContext.SetLineColor(Color(230, 230, 230));
+                pContext->Push(PushFlags::FILLCOLOR | PushFlags::LINECOLOR);
+                pContext->SetFillColor(Color(230, 230, 230));
+                pContext->SetLineColor(Color(230, 230, 230));
 
-                rRenderContext.DrawRect(PixelToLogic(Rectangle(x + 2, y + 2, x + boxX - 2, y + boxY - 2)));
-                rRenderContext.Pop();
+                pContext->DrawRect(PixelToLogic(Rectangle(x + 2, y + 2, x + boxX - 2, y + boxY - 2)));
+                pContext->Pop();
             }
 
             Point location(x + ((boxX - aSizePixel.Width()) / 2),
                            y + ((boxY - aSizePixel.Height()) / 2));
 
-            SmDrawingVisitor(rRenderContext, PixelToLogic(location), element->getNode().get());
+            if (pContext)
+                SmDrawingVisitor(*pContext, PixelToLogic(location), element->getNode().get());
 
             element->mBoxLocation = Point(x,y);
             element->mBoxSize = Size(boxX, boxY);
@@ -362,26 +363,29 @@ void SmElementsControl::Paint(vcl::RenderContext& rRenderContext, const Rectangl
         }
     }
 
-    sal_Int32 nTotalControlHeight = y + boxY + mxScroll->GetThumbPos();
-
-    if (nTotalControlHeight > GetOutputSizePixel().Height())
+    if (!pContext)
     {
-        mxScroll->SetRangeMax(nTotalControlHeight);
-        mxScroll->SetPosSizePixel(Point(nControlWidth, 0), Size(nScrollbarWidth, nControlHeight));
-        mxScroll->SetVisibleSize(nControlHeight);
-        mxScroll->Show();
-    }
-    else
-    {
-        mxScroll->SetThumbPos(0);
-        mxScroll->Hide();
-    }
+        sal_Int32 nTotalControlHeight = y + boxY + mxScroll->GetThumbPos();
 
-    // If scrollbar visibility changed, we have to go through the
-    // calculation once more, see nScrollbarWidth
-    if (bOldVisibleState != mxScroll->IsVisible())
-        Invalidate();
+        if (nTotalControlHeight > GetOutputSizePixel().Height())
+        {
+            mxScroll->SetRangeMax(nTotalControlHeight);
+            mxScroll->SetPosSizePixel(Point(nControlWidth, 0), Size(nScrollbarWidth, nControlHeight));
+            mxScroll->SetVisibleSize(nControlHeight);
+            mxScroll->Show();
+        }
+        else
+        {
+            mxScroll->SetThumbPos(0);
+            mxScroll->Hide();
+        }
+    }
+}
 
+void SmElementsControl::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
+{
+    rRenderContext.Push();
+    LayoutOrPaintContents(&rRenderContext);
     rRenderContext.Pop();
 }
 
@@ -400,6 +404,7 @@ void SmElementsControl::MouseMove( const MouseEvent& rMouseEvent )
                 if (mpCurrentElement != element)
                 {
                     mpCurrentElement = element;
+                    LayoutOrPaintContents();
                     Invalidate();
                     tooltip = element->getHelpText();
                 }
@@ -450,6 +455,7 @@ void SmElementsControl::DoScroll(long nDelta)
     aRect.Right() -= mxScroll->GetSizePixel().Width();
     Scroll( 0, -nDelta, aRect );
     mxScroll->SetPosPixel(aNewPoint);
+    LayoutOrPaintContents();
     Invalidate();
 }
 
@@ -630,6 +636,7 @@ void SmElementsControl::build()
         }
         break;
     }
+    LayoutOrPaintContents();
     Invalidate();
 }
 


More information about the Libreoffice-commits mailing list