]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathMacro.cpp
mathed: bformat infoize messages
[lyx.git] / src / mathed / MathMacro.cpp
index 76aafb7cd25bc9539cb51320d7b4fadebcf7cdee..f4150f30f84250533ff313105aa5ebfda07605cb 100644 (file)
 #include "frontends/Painter.h"
 
 #include "support/debug.h"
+#include "support/gettext.h"
 #include "support/lassert.h"
+#include "support/lstrings.h"
 #include "support/textutils.h"
 
 #include <ostream>
 #include <vector>
 
+using namespace lyx::support;
 using namespace std;
 
 namespace lyx {
@@ -125,7 +128,8 @@ private:
 MathMacro::MathMacro(Buffer * buf, docstring const & name)
        : InsetMathNest(buf, 0), name_(name), displayMode_(DISPLAY_INIT),
                expanded_(buf), attachedArgsNum_(0), optionals_(0), nextFoldMode_(true),
-               macroBackup_(buf), macro_(0), needsUpdate_(false), appetite_(9)
+               macroBackup_(buf), macro_(0), needsUpdate_(false),
+               isUpdating_(false), appetite_(9)
 {}
 
 
@@ -215,7 +219,7 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
                   && editing_[mi.base.bv]) {
                // Macro will be edited in a old-style list mode here:
 
-               LASSERT(macro_ != 0, /**/);
+               LBUFERR(macro_);
                Dimension fontDim;
                FontInfo labelFont = sane_font;
                math_font_max_dim(labelFont, fontDim.asc, fontDim.des);
@@ -252,7 +256,7 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.wid += 2;
                metricsMarkers2(dim);
        } else {
-               LASSERT(macro_ != 0, /**/);
+               LBUFERR(macro_);
 
                // calculate metrics, hoping that all cells are seen
                macro_->lock();
@@ -311,9 +315,27 @@ void MathMacro::updateMacro(MacroContext const & mc)
 }
 
 
+class MathMacro::UpdateLocker
+{
+public:
+       explicit UpdateLocker(MathMacro & mm) : mac(mm)
+       {
+               mac.isUpdating_ = true;
+       }
+       ~UpdateLocker() { mac.isUpdating_ = false; }
+private:
+       MathMacro & mac;
+};
+
+
 void MathMacro::updateRepresentation(Cursor * cur, MacroContext const & mc,
                UpdateType utype)
 {
+       if (isUpdating_)
+               return;
+
+       UpdateLocker locker(*this);
+
        // known macro?
        if (macro_ == 0)
                return;
@@ -564,7 +586,7 @@ Inset * MathMacro::editXY(Cursor & cur, int x, int y)
 
 void MathMacro::removeArgument(Inset::pos_type pos) {
        if (displayMode_ == DISPLAY_NORMAL) {
-               LASSERT(size_t(pos) < cells_.size(), /**/);
+               LASSERT(size_t(pos) < cells_.size(), return);
                cells_.erase(cells_.begin() + pos);
                if (size_t(pos) < attachedArgsNum_)
                        --attachedArgsNum_;
@@ -579,7 +601,7 @@ void MathMacro::removeArgument(Inset::pos_type pos) {
 
 void MathMacro::insertArgument(Inset::pos_type pos) {
        if (displayMode_ == DISPLAY_NORMAL) {
-               LASSERT(size_t(pos) <= cells_.size(), /**/);
+               LASSERT(size_t(pos) <= cells_.size(), return);
                cells_.insert(cells_.begin() + pos, MathData());
                if (size_t(pos) < attachedArgsNum_)
                        ++attachedArgsNum_;
@@ -593,7 +615,7 @@ void MathMacro::insertArgument(Inset::pos_type pos) {
 
 void MathMacro::detachArguments(vector<MathData> & args, bool strip)
 {
-       LASSERT(displayMode_ == DISPLAY_NORMAL, /**/);  
+       LASSERT(displayMode_ == DISPLAY_NORMAL, return);
        args = cells_;
 
        // strip off empty cells, but not more than arity-attachedArgsNum_
@@ -614,7 +636,7 @@ void MathMacro::detachArguments(vector<MathData> & args, bool strip)
 
 void MathMacro::attachArguments(vector<MathData> const & args, size_t arity, int optionals)
 {
-       LASSERT(displayMode_ == DISPLAY_NORMAL, /**/);
+       LASSERT(displayMode_ == DISPLAY_NORMAL, return);
        cells_ = args;
        attachedArgsNum_ = args.size();
        cells_.resize(arity);
@@ -647,7 +669,9 @@ bool MathMacro::notifyCursorLeaves(Cursor const & old, Cursor & cur)
                        // The macro name was changed
                        Cursor inset_cursor = old;
                        int macroSlice = inset_cursor.find(this);
-                       LASSERT(macroSlice != -1, /**/);
+                       // returning true means the cursor is "now" invalid,
+                       // which it was.
+                       LASSERT(macroSlice != -1, return true);
                        inset_cursor.cutOff(macroSlice);
                        inset_cursor.recordUndoInset();
                        inset_cursor.pop();
@@ -701,10 +725,11 @@ void MathMacro::write(WriteStream & os) const
        }
 
        // normal mode
-       LASSERT(macro_, /**/);
+       // we should be ok to continue even if this fails.
+       LATTEST(macro_);
 
-       // optional arguments make macros fragile
-       if (optionals_ > 0 && os.fragile())
+       // Always protect macros in a fragile environment
+       if (os.fragile())
                os << "\\protect";
        
        os << "\\" << name();
@@ -783,14 +808,13 @@ void MathMacro::octave(OctaveStream & os) const
 
 void MathMacro::infoize(odocstream & os) const
 {
-       os << "Macro: " << name();
+       os << bformat(_("Macro: %1$s"), name());
 }
 
 
 void MathMacro::infoize2(odocstream & os) const
 {
-       os << "Macro: " << name();
-
+       os << bformat(_("Macro: %1$s"), name());
 }