Catch another potential crash of the same kind as in the previous commit.

Also refactor.
This commit is contained in:
Richard Kimberly Heck 2023-07-28 23:08:39 -04:00
parent aacc5147b6
commit 2e945584bf
2 changed files with 26 additions and 16 deletions

View File

@ -184,6 +184,26 @@ void InsetCommand::validate(LaTeXFeatures & features) const
}
bool InsetCommand::isChangedByCurrentAuthor() const
{
InsetIterator it = begin(buffer().inset());
InsetIterator const itend = end(buffer().inset());
for (; it != itend; ++it) {
if (&*it == this)
break;
}
if (it == itend) {
LYXERR0("Unable to find inset!");
// to be on the safe side.
return true;
}
Paragraph const & ourpara = it.paragraph();
pos_type const ourpos = it.pos();
Change const & change = ourpara.lookupChange(ourpos);
return change.currentAuthor();
}
void InsetCommand::changeCmdName(string const & new_name)
{
string const & old_name = getCmdName();
@ -196,21 +216,7 @@ void InsetCommand::changeCmdName(string const & new_name)
// But we need to make sure that the inset isn't one
// that the current author inserted. Otherwise, we might
// delete ourselves!
InsetIterator it = begin(buffer().inset());
InsetIterator const itend = end(buffer().inset());
for (; it != itend; ++it) {
if (&*it == this)
break;
}
if (it == itend) {
LYXERR0("Unable to find inset!");
p_.setCmdName(new_name);
return;
}
Paragraph const & ourpara = it.paragraph();
pos_type const ourpos = it.pos();
Change const & change = ourpara.lookupChange(ourpos);
if (change.currentAuthor()) {
if (isChangedByCurrentAuthor()) {
p_.setCmdName(new_name);
return;
}
@ -247,7 +253,7 @@ void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd)
cur.noScreenUpdate();
else {
cur.recordUndo();
if (buffer().masterParams().track_changes) {
if (buffer().masterParams().track_changes && !isChangedByCurrentAuthor()) {
// With change tracking, we insert a new inset and
// delete the old one
string const data = InsetCommand::params2string(p);

View File

@ -124,6 +124,10 @@ protected:
void setCmdName(std::string const & n) { p_.setCmdName(n); }
///
void changeCmdName(std::string const & new_name);
/// was this inset changed by the current author?
/// if we're unable to find out, we return true, because of
/// how this is used.
bool isChangedByCurrentAuthor() const;
//@}
private: