Fix bug #7641: Freeze when removing itemized first paragraph

Text::outerFont looks recursively for paragraphs before the current one
which has a lower depth. If such a paragraph cannot be found, depthHook
and outerHook return the current paragraph. As such, we end up in an
infinite loop. So, if we find a par_depth that was the same as the
previous one, we apparently can't find a suitable paragraph and we should
quit the loop.
This commit is contained in:
unknown 2012-05-14 14:21:49 +02:00
parent 93ebb7a863
commit b17250d7eb
2 changed files with 10 additions and 3 deletions

View File

@ -267,11 +267,13 @@ Font const Text::outerFont(pit_type par_offset) const
{ {
depth_type par_depth = pars_[par_offset].getDepth(); depth_type par_depth = pars_[par_offset].getDepth();
FontInfo tmpfont = inherit_font; FontInfo tmpfont = inherit_font;
depth_type prev_par_depth = 0;
// Resolve against environment font information // Resolve against environment font information
while (par_offset != pit_type(pars_.size()) while (par_offset != pit_type(pars_.size())
&& par_depth != prev_par_depth
&& par_depth && par_depth
&& !tmpfont.resolved()) { && !tmpfont.resolved()) {
prev_par_depth = par_depth;
par_offset = outerHook(par_offset); par_offset = outerHook(par_offset);
if (par_offset != pit_type(pars_.size())) { if (par_offset != pit_type(pars_.size())) {
tmpfont.realize(pars_[par_offset].layout().font); tmpfont.realize(pars_[par_offset].layout().font);

View File

@ -323,9 +323,14 @@ public:
bool insertCompletion(Cursor & cur, docstring const & s, bool /*finished*/); bool insertCompletion(Cursor & cur, docstring const & s, bool /*finished*/);
/// ///
docstring completionPrefix(Cursor const & cur) const; docstring completionPrefix(Cursor const & cur) const;
/// for the environments /// find a paragraph before \p par with the given \p depth, if such
/// a paragraph cannot be found, \p par is returned
pit_type depthHook(pit_type par, depth_type depth) const; pit_type depthHook(pit_type par, depth_type depth) const;
/// /// find a paragraph before \p par with depth less than the
/// depth of \p par. If such paragraph cannot be found because
/// \p par already has depth 0, lastpar + 1 is returned. If
/// such paragraph cannot be found because there isn't a par
/// with less depth before this one, \p par is returned.
pit_type outerHook(pit_type par) const; pit_type outerHook(pit_type par) const;
/// Is it the first par with same depth and layout? /// Is it the first par with same depth and layout?
bool isFirstInSequence(pit_type par) const; bool isFirstInSequence(pit_type par) const;