diff options
author | Jan Holesovsky <kendy@collabora.com> | 2017-03-22 12:38:40 +0100 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2017-03-22 12:54:51 +0100 |
commit | 9fc3d9b445d8c2bb8e259b42430cfe089642ab03 (patch) | |
tree | ee893caf1887407b8d42e9924b64606e5ab57d08 /sd/source | |
parent | 021c51ad3ea8f408391670a173887b4c689bfa65 (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/source')
-rw-r--r-- | sd/source/ui/view/Outliner.cxx | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/sd/source/ui/view/Outliner.cxx b/sd/source/ui/view/Outliner.cxx index b123a036f507..9b4fe138301c 100644 --- a/sd/source/ui/view/Outliner.cxx +++ b/sd/source/ui/view/Outliner.cxx @@ -714,10 +714,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(); @@ -1760,21 +1764,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) ); |