X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathAutoCorrect.cpp;h=5d5a7d098c4782057603ac8e373f64529052cbae;hb=c609e9cbcf;hp=fc4ad440d20919fd5576c3b6820a57710dd2d079;hpb=e30f3d76d2bee0011ceaeb5f0cc221156458cbad;p=lyx.git diff --git a/src/mathed/MathAutoCorrect.cpp b/src/mathed/MathAutoCorrect.cpp index fc4ad440d2..5d5a7d098c 100644 --- a/src/mathed/MathAutoCorrect.cpp +++ b/src/mathed/MathAutoCorrect.cpp @@ -11,6 +11,8 @@ #include #include "MathAutoCorrect.h" + +#include "Cursor.h" #include "MathData.h" #include "InsetMath.h" #include "MathSupport.h" @@ -38,18 +40,18 @@ public: /// \brief Correction Correction() : from2_(0) {} /// - bool correct(MathAtom & at, char_type c) const; + bool correct(Cursor & cur, char_type c) const; /// bool read(idocstream & is); /// void write(odocstream & os) const; private: /// - MathAtom from1_; + MathData from1_; /// char_type from2_; /// - MathAtom to_; + MathData to_; }; @@ -64,26 +66,44 @@ bool Correction::read(idocstream & is) MathData ar1, ar3; mathed_parse_cell(ar1, s1); mathed_parse_cell(ar3, s3); - if (ar1.size() != 1 || ar3.size() != 1) - return false; - from1_ = ar1.front(); + from1_ = ar1; from2_ = s2[0]; - to_ = ar3.front(); + to_ = ar3; return true; } -bool Correction::correct(MathAtom & at, char_type c) const +bool Correction::correct(Cursor & cur, char_type c) const { //LYXERR(Debug::MATHED, // "trying to correct ar: " << at << " from: '" << from1_ << '\''); if (from2_ != c) return false; - if (asString(at) != asString(from1_)) + pos_type n = from1_.size(); + if (cur.pos() < pos_type(from1_.size())) // not enough to match return false; - LYXERR(Debug::MATHED, "match found! subst in " << at + pos_type start = cur.pos() - from1_.size(); + + for (pos_type i = 0; i < n; i++) + if (asString(cur.cell()[start + i]) != asString(from1_[i])) + return false; + + LYXERR(Debug::MATHED, "match found! subst in " << cur.cell() << " from: '" << from1_ << "' to '" << to_ << '\''); - at = to_; + + /* To allow undoing the completion, we proceed in 4 steps + * - inset the raw character + * - split undo group so that we have two separate undo actions + * - record undo, delete the character we just entered and the from1_ part + * - finally, do the insertion of the correction. + */ + cur.insert(c); + cur.splitUndoGroup(); + cur.recordUndoSelection(); + cur.cell().erase(cur.pos() - n - 1, cur.pos()); + cur.pos() -= n + 1; + + cur.insert(to_); return true; } @@ -121,17 +141,17 @@ public: /// void insert(const Correction & corr) { data_.push_back(corr); } /// - bool correct(MathAtom & at, char_type c) const; + bool correct(Cursor & cur, char_type c) const; private: /// vector data_; }; -bool Corrections::correct(MathAtom & at, char_type c) const +bool Corrections::correct(Cursor & cur, char_type c) const { for (const_iterator it = data_.begin(); it != data_.end(); ++it) - if (it->correct(at, c)) + if (it->correct(cur, c)) return true; return false; } @@ -172,7 +192,7 @@ void initAutoCorrect() } // namespace -bool math_autocorrect(MathAtom & at, char_type c) +bool math_autocorrect(Cursor & cur, char_type c) { static bool initialized = false; @@ -181,8 +201,6 @@ bool math_autocorrect(MathAtom & at, char_type c) initialized = true; } - return theCorrections.correct(at, c); + return theCorrections.correct(cur, c); } - - } // namespace lyx