summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorJan Holesovsky <kendy@collabora.com>2017-03-22 12:38:40 +0100
committerJan Holesovsky <kendy@collabora.com>2017-03-22 12:56:01 +0100
commit276582389f34ed96d078009522e572230037dcdf (patch)
tree71e7a11c4566622fb67f2d2ad5baacc82503680a /sd
parenta15a3a1bacf79a42857e9a4e7cae853d6d6ebad2 (diff)
lok sd: Fix crash when searching.
This is a follow-up of ed5450f2a5ed8e72b48b4d976217746cea04a5c9 where the check for the HasView has been removed. Turns out that there are conditions when this really can happen, leading to crashes in the LOK searching. Unfortunately I did not manage to find a reliable reproducer to create a unit test :-( - so I suspect this commit might be more a workaround than a root cause fix. Would be great to find out the exact conditions leading to the situation when the EditEngine does not contain the EditView, and evaluate this fix against that - but that's hard without a reliable reproducer. A unit test for this fix is missing from the same reason. The unit test from ed5450f2a5ed8e72b48b4d976217746cea04a5c9 still passes. Change-Id: I1cca7219817119d27a224b35efb660a84d35b8fa
Diffstat (limited to 'sd')
-rw-r--r--sd/source/ui/view/Outliner.cxx19
1 files changed, 14 insertions, 5 deletions
diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx
index 115addbfdf10..88383e63cc12 100644
--- a/sd/source/ui/view/Outliner.cxx
+++ b/sd/source/ui/view/Outliner.cxx
@@ -715,10 +715,14 @@ bool SdOutliner::SearchAndReplaceOnce(std::vector<sd::SearchSelection>* pSelecti
DetectChange ();
OutlinerView* pOutlinerView = mpImpl->GetOutlinerView();
- if (!pOutlinerView)
- return true; // end of search
-
std::shared_ptr<sd::ViewShell> pViewShell (mpWeakViewShell.lock());
+
+ if (!pOutlinerView || !GetEditEngine().HasView(&pOutlinerView->GetEditView()))
+ {
+ mpImpl->ProvideOutlinerView(*this, pViewShell, mpWindow);
+ pOutlinerView = mpImpl->GetOutlinerView();
+ }
+
if (pViewShell != nullptr)
{
mpView = pViewShell->GetView();
@@ -1769,21 +1773,26 @@ void SdOutliner::Implementation::ProvideOutlinerView (
{
// Create a new outline view to do the search on.
bool bInsert = false;
- if (mpOutlineView!=nullptr && !mbOwnOutlineView)
+ if (mpOutlineView != nullptr && !mbOwnOutlineView)
mpOutlineView = nullptr;
- if (mpOutlineView == nullptr)
+
+ if (mpOutlineView == nullptr || !rOutliner.GetEditEngine().HasView(&mpOutlineView->GetEditView()))
{
+ delete mpOutlineView;
mpOutlineView = new OutlinerView(&rOutliner, pWindow);
mbOwnOutlineView = true;
bInsert = true;
}
else
mpOutlineView->SetWindow(pWindow);
+
EVControlBits nStat = mpOutlineView->GetControlWord();
nStat &= ~EVControlBits::AUTOSCROLL;
mpOutlineView->SetControlWord(nStat);
+
if (bInsert)
rOutliner.InsertView( mpOutlineView );
+
rOutliner.SetUpdateMode(false);
mpOutlineView->SetOutputArea (Rectangle (Point(), Size(1, 1)));
rOutliner.SetPaperSize( Size(1, 1) );