]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathMacro.cpp
simplify GuiToc / TocWidget interaction. Much can still be simplified...
[lyx.git] / src / mathed / MathMacro.cpp
index 21e08e329f0e185786f8b86d7e011e8ed543df20..25902867ec9d7bbc78e426dc2d40d7062f8c736c 100644 (file)
 
 #include "Buffer.h"
 #include "BufferView.h"
+#include "CoordCache.h"
 #include "Cursor.h"
 #include "support/debug.h"
 #include "LaTeXFeatures.h"
+#include "LyXRC.h"
 #include "FuncStatus.h"
 #include "FuncRequest.h"
 #include "Undo.h"
@@ -51,9 +53,13 @@ public:
        ///
        void metrics(MetricsInfo & mi, Dimension & dim) const {
                mathMacro_.macro()->unlock();
-               mathMacro_.cell(idx_).metrics(mi, dim);
-               if (!mathMacro_.editMetrics(mi.base.bv) && !def_.empty())
+               if (!mathMacro_.editMetrics(mi.base.bv) 
+                   && mathMacro_.cell(idx_).empty())
                        def_.metrics(mi, dim);
+               else {
+                       CoordCache & coords = mi.base.bv->coordCache();
+                       dim = coords.arrays().dim(&mathMacro_.cell(idx_));
+               }
                mathMacro_.macro()->lock();
        }
        ///
@@ -70,21 +76,19 @@ public:
                        pi.pain.leaveMonochromeMode();
                        mathMacro_.cell(idx_).draw(pi, x, y);
                        pi.pain.enterMonochromeMode(Color_mathbg, Color_mathmacroblend);
-               } else {
-                       if (def_.empty())
-                               mathMacro_.cell(idx_).draw(pi, x, y);
-                       else {
-                               mathMacro_.cell(idx_).setXY(*pi.base.bv, x, y);
-                               def_.draw(pi, x, y);
-                       }
-               }
+               } else if (mathMacro_.cell(idx_).empty()) {
+                       mathMacro_.cell(idx_).setXY(*pi.base.bv, x, y);
+                       def_.draw(pi, x, y);
+               } else
+                       mathMacro_.cell(idx_).draw(pi, x, y);
        }
        ///
        size_t idx() const { return idx_; }
        ///
        int kerning(BufferView const * bv) const
        { 
-               if (mathMacro_.editMetrics(bv) || def_.empty())
+               if (mathMacro_.editMetrics(bv)
+                   || !mathMacro_.cell(idx_).empty())
                        return mathMacro_.cell(idx_).kerning(bv); 
                else
                        return def_.kerning(bv);
@@ -139,14 +143,6 @@ void MathMacro::cursorPos(BufferView const & bv,
 }
 
 
-int MathMacro::cursorIdx(Cursor const & cur) const {
-       for (size_t i = 0; i != cur.depth(); ++i)
-                       if (&cur[i].inset() == this)
-                               return cur[i].idx();
-       return -1;
-}
-
-
 bool MathMacro::editMode(BufferView const * bv) const {
        // find this in cursor trace
        Cursor const & cur = bv->cursor();
@@ -190,16 +186,61 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
                dim.asc = max(bsdim.ascent(), dim.ascent());
                dim.des = max(bsdim.descent(), dim.descent());
                metricsMarkers(dim);
+       } else if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_LIST 
+                  && editing_[mi.base.bv]) {
+               // Macro will be edited in a old-style list mode here:
+
+               BOOST_ASSERT(macro_ != 0);
+               Dimension fontDim;
+               FontInfo labelFont = sane_font;
+               math_font_max_dim(labelFont, fontDim.asc, fontDim.des);
+               
+               // get dimension of components of list view
+               Dimension nameDim;
+               nameDim.wid = mathed_string_width(mi.base.font, from_ascii("Macro \\") + name() + ": ");
+               nameDim.asc = fontDim.asc;
+               nameDim.des = fontDim.des;
+
+               Dimension argDim;
+               argDim.wid = mathed_string_width(labelFont, from_ascii("#9: "));
+               argDim.asc = fontDim.asc;
+               argDim.des = fontDim.des;
+               
+               Dimension defDim;
+               definition_.metrics(mi, defDim);
+               
+               // add them up
+               dim.wid = nameDim.wid + defDim.wid;
+               dim.asc = max(nameDim.asc, defDim.asc);
+               dim.des = max(nameDim.des, defDim.des);
+               
+               for (idx_type i = 0; i < nargs(); ++i) {
+                       Dimension cdim;
+                       cell(i).metrics(mi, cdim);
+                       dim.des += max(argDim.height(), cdim.height()) + 1;
+                       dim.wid = max(dim.wid, argDim.wid + cdim.wid);
+               }
+               
+               // make space for box and markers, 2 pixels
+               dim.asc += 1;
+               dim.des += 1;
+               dim.wid += 2;
+               metricsMarkers2(dim);
        } else {
                BOOST_ASSERT(macro_ != 0);
 
+               // metrics are computed here for the cells,
+               // in the proxy we will then use the dim from the cache
+               InsetMathNest::metrics(mi);
+               
                // calculate metrics finally
                macro_->lock();
                expanded_.cell(0).metrics(mi, dim);
                macro_->unlock();
 
                // calculate dimension with label while editing
-               if (editing_[mi.base.bv]) {
+               if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX 
+                   && editing_[mi.base.bv]) {
                        FontInfo font = mi.base.font;
                        augmentFont(font, from_ascii("lyxtex"));
                        Dimension namedim;
@@ -213,6 +254,7 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
                        dim.asc += 1 + namedim.height() + 1;
                        dim.des += 2;
                }
+        
        }
 }
 
@@ -241,13 +283,6 @@ void MathMacro::updateMacro(MacroContext const & mc)
 
 void MathMacro::updateRepresentation(Cursor const * bvCur)
 {
-       // index of child where the cursor is (or -1 if none is edited)
-       int curIdx = -1;
-       if (bvCur) {
-               curIdx = cursorIdx(*bvCur);
-               previousCurIdx_[&bvCur->bv()] = curIdx;
-       }
-
        // known macro?
        if (macro_ == 0)
                return;
@@ -270,19 +305,20 @@ void MathMacro::updateRepresentation(Cursor const * bvCur)
                vector<MathData> values(nargs());
                for (size_t i = 0; i < nargs(); ++i) {
                        ArgumentProxy * proxy;
-                       if (!cell(i).empty() 
-                           || i >= defaults.size() 
-                           || defaults[i].empty() 
-                           || curIdx == (int)i)
-                               proxy = new ArgumentProxy(*this, i);
-                       else
+                       if (i < defaults.size()) 
                                proxy = new ArgumentProxy(*this, i, defaults[i]);
+                       else
+                               proxy = new ArgumentProxy(*this, i);
                        values[i].insert(0, MathAtom(proxy));
                }
                
                // expanding macro with the values
                macro_->expand(values, expanded_.cell(0));
-       }               
+
+               // get definition for list edit mode
+               docstring const & display = macro_->display();
+               asArray(display.empty() ? macro_->definition() : display, definition_);
+       }
 }
 
 
@@ -307,12 +343,68 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
                x += mathed_string_width(pi2.base.font, from_ascii("\\")) + 1;
                cell(0).draw(pi2, x, y);
                drawMarkers(pi2, expx, expy);
+       } else if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_LIST
+                  && editing_[pi.base.bv]) {
+               // Macro will be edited in a old-style list mode here:
+               
+               CoordCache & coords = pi.base.bv->coordCache();
+               FontInfo const & labelFont = sane_font;
+               
+               // markers and box needs two pixels
+               x += 2;
+               
+               // get maximal font height
+               Dimension fontDim;
+               math_font_max_dim(pi.base.font, fontDim.asc, fontDim.des);
+               
+               // draw label
+               docstring label = from_ascii("Macro \\") + name() + from_ascii(": ");
+               pi.pain.text(x, y, label, labelFont);
+               x += mathed_string_width(labelFont, label);
+
+               // draw definition
+               definition_.draw(pi, x, y);
+               Dimension defDim
+               = coords.arrays().dim(&definition_);
+               y += max(fontDim.des, defDim.des);
+                               
+               // draw parameters
+               docstring str = from_ascii("#9");
+               int strw1 = mathed_string_width(labelFont, from_ascii("#9"));
+               int strw2 = mathed_string_width(labelFont, from_ascii(": "));
+               
+               for (idx_type i = 0; i < nargs(); ++i) {
+                       // position of label
+                       Dimension cdim
+                       = coords.arrays().dim(&cell(i));
+                       x = expx + 2;
+                       y += max(fontDim.asc, cdim.asc) + 1;
+                       
+                       // draw label
+                       str[1] = '1' + i;
+                       pi.pain.text(x, y, str, labelFont);
+                       x += strw1;
+                       pi.pain.text(x, y, from_ascii(":"), labelFont);
+                       x += strw2;
+                       
+                       // draw paramter
+                       cell(i).draw(pi, x, y);
+                       
+                       // next line
+                       y += max(fontDim.des, cdim.des);
+               }
+               
+               pi.pain.rectangle(expx + 1, expy - dim.asc + 1, dim.wid - 3, 
+                                 dim.height() - 2, Color_mathmacroframe);
+               drawMarkers2(pi, expx, expy);
        } else {
+               bool drawBox = lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX;
+               
                // warm up cells
                for (size_t i = 0; i < nargs(); ++i)
                        cell(i).setXY(*pi.base.bv, x, y);
 
-               if (editing_[pi.base.bv]) {
+               if (drawBox && editing_[pi.base.bv]) {
                        // draw header and rectangle around
                        FontInfo font = pi.base.font;
                        augmentFont(font, from_ascii("lyxtex"));
@@ -320,30 +412,29 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
                        font.setColor(Color_mathmacrolabel);
                        Dimension namedim;
                        mathed_string_dim(font, name(), namedim);
-#if 0
-                       pi.pain.fillRectangle(x, y - dim.asc, 2 + namedim.width() + 2, dim.height(), Color_mathmacrobg);
-                       pi.pain.text(x + 2, y, name(), font);
-                       expx += 2 + namew + 2;
-#endif
+
                        pi.pain.fillRectangle(x, y - dim.asc, dim.wid, 1 + namedim.height() + 1, Color_mathmacrobg);
                        pi.pain.text(x + 1, y - dim.asc + namedim.asc + 2, name(), font);
                        expx += (dim.wid - expanded_.cell(0).dimension(*pi.base.bv).width()) / 2;
+               }
 
+               if (editing_[pi.base.bv]) {
                        pi.pain.enterMonochromeMode(Color_mathbg, Color_mathmacroblend);
                        expanded_.cell(0).draw(pi, expx, expy);
                        pi.pain.leaveMonochromeMode();
+
+                       if (drawBox)
+                               pi.pain.rectangle(x, y - dim.asc, dim.wid, 
+                                                 dim.height(), Color_mathmacroframe);
                } else
                        expanded_.cell(0).draw(pi, expx, expy);
 
-               // draw frame while editing
-               if (editing_[pi.base.bv])
-                       pi.pain.rectangle(x, y - dim.asc, dim.wid, dim.height(), Color_mathmacroframe);
+               if (!drawBox)
+                       drawMarkers(pi, x, y);
        }
 
-       // another argument selected or edit mode changed?
-       idx_type curIdx = cursorIdx(pi.base.bv->cursor());
-       if (previousCurIdx_[pi.base.bv] != curIdx 
-           || editing_[pi.base.bv] != editMode(pi.base.bv))
+       // edit mode changed?
+       if (editing_[pi.base.bv] != editMode(pi.base.bv))
                pi.base.bv->cursor().updateFlags(Update::Force);
 }
 
@@ -418,10 +509,10 @@ void MathMacro::validate(LaTeXFeatures & features) const
 }
 
 
-void MathMacro::edit(Cursor & cur, bool left)
+void MathMacro::edit(Cursor & cur, bool front, EntryDirection entry_from)
 {
        cur.updateFlags(Update::Force);
-       InsetMathNest::edit(cur, left);
+       InsetMathNest::edit(cur, front, entry_from);
 }