summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-07-22 15:36:08 +0100
committerMichael Meeks <michael.meeks@collabora.com>2015-07-22 21:22:46 +0000
commit3e390f8c579fcec8d3eba71b8d8608eb74e03449 (patch)
tree66c1541bb62b038fb24aa587b307d19fb13cb045
parentbcc4c87e999241bb84fee04e2a4e42723aa5a8cb (diff)
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@libreoffice.org> Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r--starmath/inc/ElementsDockingWindow.hxx4
-rw-r--r--starmath/source/ElementsDockingWindow.cxx69
2 files changed, 42 insertions, 31 deletions
diff --git a/starmath/inc/ElementsDockingWindow.hxx b/starmath/inc/ElementsDockingWindow.hxx
index 6877d81bdd04..7cf8abb353da 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 f00cefb38d45..f5f2c17d7be9 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();
}