]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/formulabase.C
fix deletion of subscript if superscript is present and vice versa
[lyx.git] / src / mathed / formulabase.C
index 44a40e4335be57a0882b2252b9ec14d6ebfd8ec6..18e1c97ba2a17f4b24e8e18d7bab9366309457b4 100644 (file)
 #include "gettext.h"
 #include "LaTeXFeatures.h"
 #include "debug.h"
-#include "support/LOstream.h"
+#include "support/lstrings.h"
 #include "LyXView.h"
 #include "Painter.h"
 #include "font.h"
 #include "math_arrayinset.h"
 #include "math_spaceinset.h"
+#include "math_macrotable.h"
 #include "support/lyxlib.h"
 #include "mathed/support.h"
 #include "undo_funcs.h"
@@ -49,7 +50,6 @@ using std::vector;
 
 extern char const * latex_special_chars;
 
-int greek_kb_flag = 0;
 extern char const * latex_mathenv[];
 MathCursor        * mathcursor = 0;
 
@@ -71,15 +71,15 @@ string nicelabel(string const & label)
 
 void handleFont(BufferView * bv, MathTextCodes t) 
 {
-       if (mathcursor->Selection())
+       if (mathcursor->selection())
                bv->lockedInsetStoreUndo(Undo::EDIT);
        mathcursor->handleFont(t);
 }
 
-void handleAccent(BufferView * bv, string const & name, int code)
+void handleAccent(BufferView * bv, string const & name)
 {
        bv->lockedInsetStoreUndo(Undo::EDIT);
-       mathcursor->handleAccent(name, code);
+       mathcursor->handleAccent(name);
 }
 
 void handleDelim(BufferView * bv, int l, int r)
@@ -103,42 +103,25 @@ bool openNewInset(BufferView * bv, UpdatableInset * new_inset)
 }
 
 
-} // namespaces
-
-
-
-namespace {
-
-
-// returns the nearest enclosing matrix
+// returns the nearest enclosing grid
 MathArrayInset * matrixpar(int & idx)
 {
        idx = 0;
-       return
-               static_cast<MathArrayInset *> 
-                       (mathcursor ? mathcursor->enclosing(LM_OT_MATRIX, idx) : 0); 
+       return (mathcursor ? mathcursor->enclosingArray(idx) : 0); 
 }
 
 
 } // namespace anon
 
 
-InsetFormulaBase::InsetFormulaBase(MathInset * par)
-       : par_(par)
-{}
-
 
-InsetFormulaBase::InsetFormulaBase(InsetFormulaBase const & f)
-       : UpdatableInset(f), par_(static_cast<MathInset *>(f.par_->clone()))
-{}
-
-
-InsetFormulaBase::~InsetFormulaBase()
+InsetFormulaBase::InsetFormulaBase()
 {
 #ifdef WITH_WARNINGS
-#warning leak this for a while...
+#warning This is needed as long the math parser is not re-entrant
 #endif
-       //delete par_;
+       MathMacroTable::builtinMacros();
+       //lyxerr << "sizeof MathInset: " << sizeof(MathInset) << "\n";
 }
 
 
@@ -147,6 +130,7 @@ void InsetFormulaBase::read(Buffer const *, LyXLex & lex)
        read(lex);
 }
 
+
 void InsetFormulaBase::write(Buffer const *, ostream & os) const
 {
        write(os);
@@ -193,7 +177,7 @@ void InsetFormulaBase::edit(BufferView * bv, int x, int /*y*/, unsigned int)
        if (!bv->lockInset(this))
                lyxerr[Debug::MATHED] << "Cannot lock inset!!!" << endl;
 
-       Metrics();
+       metrics();
        //bv->updateInset(this, false);
        if (x == 0)
                mathcursor->first();
@@ -207,7 +191,6 @@ void InsetFormulaBase::edit(BufferView * bv, int x, int /*y*/, unsigned int)
 
 void InsetFormulaBase::edit(BufferView * bv, bool front)
 {
-#warning Please have a look if this is right (Jug)
        edit(bv, front ? 0 : 1, 0, 0);
 }
 
@@ -215,8 +198,8 @@ void InsetFormulaBase::edit(BufferView * bv, bool front)
 void InsetFormulaBase::insetUnlock(BufferView * bv)
 {
        if (mathcursor) {
-               if (mathcursor->InMacroMode()) {
-                       mathcursor->MacroModeClose();
+               if (mathcursor->inMacroMode()) {
+                       mathcursor->macroModeClose();
                        updateLocal(bv, true);
                }
                delete mathcursor;
@@ -228,9 +211,9 @@ void InsetFormulaBase::insetUnlock(BufferView * bv)
 
 void InsetFormulaBase::getCursorPos(BufferView *, int & x, int & y) const
 {
-       mathcursor->GetPos(x, y);
-       x -= par_->xo();
-       y -= par_->yo();
+       mathcursor->getPos(x, y);
+       x -= par()->xo();
+       y -= par()->yo();
 }
 
 
@@ -244,9 +227,9 @@ void InsetFormulaBase::toggleInsetCursor(BufferView * bv)
        else {
                int x;
                int y;
-               mathcursor->GetPos(x, y);
-               //x -= par_->xo();
-               y -= par_->yo();
+               mathcursor->getPos(x, y);
+               //x -= par()->xo();
+               y -= par()->yo();
                int asc;
                int desc;
                math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, desc);
@@ -263,9 +246,9 @@ void InsetFormulaBase::showInsetCursor(BufferView * bv, bool)
                if (mathcursor) {
                        int x;
                        int y;
-                       mathcursor->GetPos(x, y);
-                       x -= par_->xo();
-                       y -= par_->yo();
+                       mathcursor->getPos(x, y);
+                       x -= par()->xo();
+                       y -= par()->yo();
                        int asc;
                        int desc;
                        math_font_max_dim(LM_TC_TEXTRM, LM_ST_TEXT, asc, desc);
@@ -298,25 +281,19 @@ vector<string> const InsetFormulaBase::getLabelList() const
 
 void InsetFormulaBase::updateLocal(BufferView * bv, bool dirty)
 {
-       Metrics();
+       metrics();
        bv->updateInset(this, dirty);
 }
 
 
-void InsetFormulaBase::Metrics() const
-{
-       const_cast<MathInset *>(par_)->Metrics(LM_ST_TEXT);
-}
-
-
 void InsetFormulaBase::insetButtonRelease(BufferView * bv,
                                          int x, int y, int /*button*/)
 {
        if (mathcursor) {
                hideInsetCursor(bv);
-               x += par_->xo();
-               y += par_->yo();
-               mathcursor->SetPos(x, y);
+               x += par()->xo();
+               y += par()->yo();
+               mathcursor->setPos(x, y);
                showInsetCursor(bv);
                if (sel_flag) {
                        sel_flag = false;
@@ -334,8 +311,8 @@ void InsetFormulaBase::insetButtonPress(BufferView * bv,
        sel_flag = false;
        sel_x = x;
        sel_y = y;
-       if (mathcursor && mathcursor->Selection()) {
-               mathcursor->SelClear();
+       if (mathcursor && mathcursor->selection()) {
+               mathcursor->selClear();
                bv->updateInset(this, false);
        }
 }
@@ -347,17 +324,17 @@ void InsetFormulaBase::insetMotionNotify(BufferView * bv,
        if (sel_x && sel_y && abs(x-sel_x) > 4 && !sel_flag) {
                sel_flag = true;
                hideInsetCursor(bv);
-               mathcursor->SetPos(sel_x + par_->xo(), sel_y + par_->yo());
-               mathcursor->SelStart();
+               mathcursor->setPos(sel_x + par()->xo(), sel_y + par()->yo());
+               mathcursor->selStart();
                showInsetCursor(bv);
-               mathcursor->GetPos(sel_x, sel_y);
+               mathcursor->getPos(sel_x, sel_y);
        } else if (sel_flag) {
                hideInsetCursor(bv);
-               x += par_->xo();
-               y += par_->yo();
-               mathcursor->SetPos(x, y);
+               x += par()->xo();
+               y += par()->yo();
+               mathcursor->setPos(x, y);
                showInsetCursor(bv);
-               mathcursor->GetPos(x, y);
+               mathcursor->getPos(x, y);
                if (sel_x != x || sel_y != y)
                        bv->updateInset(this, false);
                sel_x = x;
@@ -368,8 +345,7 @@ void InsetFormulaBase::insetMotionNotify(BufferView * bv,
 
 void InsetFormulaBase::insetKeyPress(XKeyEvent *)
 {
-       lyxerr[Debug::MATHED]
-               << "Used InsetFormulaBase::InsetKeyPress." << endl;
+       lyxerr[Debug::MATHED] << "Used InsetFormulaBase::InsetKeyPress." << endl;
 }
 
 
@@ -381,13 +357,15 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
        //lyxerr << "InsetFormulaBase::LocalDispatch: act: " << action
        //      << " arg: '" << arg << "' cursor: " << mathcursor << "\n";
 
+       static int greek_kb_flag = 0;
+
        if (!mathcursor) 
                return UNDISPATCHED;
 
        MathTextCodes varcode = LM_TC_MIN;
-       bool was_macro = mathcursor->InMacroMode();
+       bool was_macro = mathcursor->inMacroMode();
        bool sel = false;
-       bool was_selection = mathcursor->Selection();
+       bool was_selection = mathcursor->selection();
        RESULT result = DISPATCHED;
 
        hideInsetCursor(bv);
@@ -405,7 +383,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                sel = true; // fall through...
 
        case LFUN_RIGHT:
-               result = DISPATCH_RESULT(mathcursor->Right(sel));
+               result = DISPATCH_RESULT(mathcursor->right(sel));
                updateLocal(bv, false);
                break;
 
@@ -414,7 +392,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                sel = true; // fall through
 
        case LFUN_LEFT:
-               result = DISPATCH_RESULT(mathcursor->Left(sel));
+               result = DISPATCH_RESULT(mathcursor->left(sel));
                updateLocal(bv, false);
                break;
 
@@ -423,7 +401,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                sel = true;
 
        case LFUN_UP:
-               result = DISPATCH_RESULT(mathcursor->Up(sel));
+               result = DISPATCH_RESULT(mathcursor->up(sel));
                updateLocal(bv, false);
                break;
 
@@ -432,23 +410,23 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                sel = true;
 
        case LFUN_DOWN:
-               result = DISPATCH_RESULT(mathcursor->Down(sel));
+               result = DISPATCH_RESULT(mathcursor->down(sel));
                updateLocal(bv, false);
                break;
 
        case LFUN_HOME:
-               mathcursor->Home();
+               mathcursor->home();
                updateLocal(bv, false);
                break;
 
        case LFUN_END:
-               mathcursor->End();
+               mathcursor->end();
                updateLocal(bv, false);
                break;
 
        case LFUN_DELETE_LINE_FORWARD:
                bv->lockedInsetStoreUndo(Undo::DELETE);
-               mathcursor->DelLine();
+               mathcursor->delLine();
                updateLocal(bv, true);
                break;
 
@@ -469,25 +447,14 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                break;
 
        case LFUN_BACKSPACE:
-               // if (!mathcursor->InMacroMode() && mathcursor->pos() == 0)
-               if (mathcursor->pos() == 0) {
-                       bv->lockedInsetStoreUndo(Undo::DELETE);
-                       mathcursor->pullArg(false);
-                       bv->updateInset(this, true);
-                       break;
-               }
-               if (mathcursor->InMacroMode())
-                       mathcursor->Left();
-               else
-                       mathcursor->plainLeft();
-               // fall through...
+               bv->lockedInsetStoreUndo(Undo::DELETE);
+               mathcursor->backspace();
+               bv->updateInset(this, true);
+               break;
 
        case LFUN_DELETE:
                bv->lockedInsetStoreUndo(Undo::DELETE);
-               if (mathcursor->pos() == mathcursor->array().size()) 
-                       mathcursor->pullArg(true);
-               else
-                       mathcursor->Delete();
+               mathcursor->erase();
                bv->updateInset(this, true);
                break;
 
@@ -504,30 +471,29 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                int y1;
                istringstream is(arg.c_str());
                is >> x >> y;
-               par_->GetXY(x1, y1);
-               mathcursor->SetPos(x1 + x, y1 + y);
+               par()->getXY(x1, y1);
+               mathcursor->setPos(x1 + x, y1 + y);
                updateLocal(bv, false);
        }
        break;
 
-               // cursor selection ---------------------------- 
 
        case LFUN_PASTE:
                if (was_macro)
-                       mathcursor->MacroModeClose();
+                       mathcursor->macroModeClose();
                bv->lockedInsetStoreUndo(Undo::INSERT);
-               mathcursor->SelPaste();
+               mathcursor->selPaste();
                updateLocal(bv, true);
                break;
 
        case LFUN_CUT:
                bv->lockedInsetStoreUndo(Undo::DELETE);
-               mathcursor->SelCut();
+               mathcursor->selCut();
                updateLocal(bv, true);
                break;
 
        case LFUN_COPY:
-               mathcursor->SelCopy();
+               mathcursor->selCopy();
                break;
 
        case LFUN_HOMESEL:
@@ -538,16 +504,16 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
 
                // --- accented characters ------------------------------
 
-       case LFUN_UMLAUT:     handleAccent(bv, "ddot", LM_ddot); break;
-       case LFUN_CIRCUMFLEX: handleAccent(bv, "hat", LM_hat); break;
-       case LFUN_GRAVE:      handleAccent(bv, "grave", LM_grave); break;
-       case LFUN_ACUTE:      handleAccent(bv, "acute", LM_acute); break;
-       case LFUN_TILDE:      handleAccent(bv, "tilde", LM_tilde); break;
-       case LFUN_MACRON:     handleAccent(bv, "bar", LM_bar); break;
-       case LFUN_DOT:        handleAccent(bv, "dot", LM_dot); break;
-       case LFUN_CARON:      handleAccent(bv, "check", LM_check); break;
-       case LFUN_BREVE:      handleAccent(bv, "breve", LM_breve); break;
-       case LFUN_VECTOR:     handleAccent(bv, "vec", LM_vec); break;
+       case LFUN_UMLAUT:     handleAccent(bv, "ddot"); break;
+       case LFUN_CIRCUMFLEX: handleAccent(bv, "hat"); break;
+       case LFUN_GRAVE:      handleAccent(bv, "grave"); break;
+       case LFUN_ACUTE:      handleAccent(bv, "acute"); break;
+       case LFUN_TILDE:      handleAccent(bv, "tilde"); break;
+       case LFUN_MACRON:     handleAccent(bv, "bar"); break;
+       case LFUN_DOT:        handleAccent(bv, "dot"); break;
+       case LFUN_CARON:      handleAccent(bv, "check"); break;
+       case LFUN_BREVE:      handleAccent(bv, "breve"); break;
+       case LFUN_VECTOR:     handleAccent(bv, "vec"); break;
 
                // Greek mode
        case LFUN_GREEK:
@@ -580,15 +546,6 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                //bv->owner()->message(_("math text mode toggled"));
                break;
 
-#ifndef NO_LATEX
-       case LFUN_TEX:
-               if (!mathcursor->Selection()) {
-                       mathcursor->handleFont(LM_TC_TEX);
-                       //bv->owner()->message(_("TeX mode toggled"));
-               }
-               break;
-#endif
-
        case LFUN_MATH_LIMITS:
                bv->lockedInsetStoreUndo(Undo::INSERT);
                if (mathcursor->toggleLimits())
@@ -599,7 +556,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                if (!arg.empty()) {
                        bv->lockedInsetStoreUndo(Undo::INSERT);
                        latexkeys const * l = in_word_set(arg);
-                       mathcursor->SetSize(MathStyles(l ? l->id : static_cast<unsigned int>(-1)));
+                       mathcursor->setSize(MathStyles(l ? l->id : static_cast<unsigned int>(-1)));
                        updateLocal(bv, true);
                }
                break;
@@ -607,7 +564,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
        case LFUN_INSERT_MATRIX:
                if (!arg.empty()) {
                        bv->lockedInsetStoreUndo(Undo::INSERT);
-                       mathcursor->Interpret("matrix " + arg);
+                       mathcursor->interpret("matrix " + arg);
                        updateLocal(bv, true);
                }
                break;
@@ -615,11 +572,23 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
        case LFUN_INSERT_MATH:
                if (!arg.empty()) {
                        bv->lockedInsetStoreUndo(Undo::INSERT);
-                       mathcursor->Interpret(arg);
+                       mathcursor->interpret(arg);
                        updateLocal(bv, true);
                }
                break;
 
+       case LFUN_MATH_SPACE:
+       {
+               bv->lockedInsetStoreUndo(Undo::EDIT);
+               MathSpaceInset * p = mathcursor->prevSpaceInset();
+               if (p) 
+                       p->incSpace();
+               else
+                       mathcursor->insert(new MathSpaceInset(1));
+               updateLocal(bv, true);
+               break;
+       }
+
        case LFUN_MATH_DELIM:
        {
                bv->lockedInsetStoreUndo(Undo::INSERT);
@@ -667,6 +636,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
        }
 
        case LFUN_PROTECTEDSPACE:
+               //lyxerr << " called LFUN_PROTECTEDSPACE\n";
                bv->lockedInsetStoreUndo(Undo::INSERT);
                mathcursor->insert(new MathSpaceInset(1));
                updateLocal(bv, true);
@@ -775,7 +745,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
 
                        if (isalpha(c)) {
                                if (mathcursor->getLastCode() == LM_TC_TEX) {
-                                       mathcursor->MacroModeOpen();
+                                       mathcursor->macroModeOpen();
                                        mathcursor->clearLastCode();
                                        varcode = LM_TC_MIN;
                                } else if (!varcode) {          
@@ -793,7 +763,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                                        char greek[26] =
                                        {'A', 'B', 'X',  0 , 'E',  0 ,  0 , 'H', 'I',  0 ,
                                         'K',  0 , 'M', 'N', 'O',  0 ,  0 , 'P',  0 , 'T',
-                                        'Y',  0,   0,   0,   0 , 'Z' };
+                                        0,  0,   0,   0,   0 , 'Z' };
                                        
                                        if ('A' <= c && c <= 'Z' && greek[c - 'A']) {
                                                char_code = LM_TC_RM;
@@ -804,7 +774,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                                
                                mathcursor->insert(c, char_code);
                                
-                               if (greek_kb_flag && char_code == LM_TC_RM )
+                               if (greek_kb_flag && char_code == LM_TC_RM)
                                        mathcursor->setLastCode(LM_TC_VAR);
                                
                                varcode = LM_TC_MIN;
@@ -816,7 +786,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                                mathcursor->insert(c, LM_TC_TEX);
                                if (c == '{') {
                                        mathcursor->insert('}', LM_TC_TEX);
-                                       mathcursor->Left();
+                                       mathcursor->left();
                                }
                                mathcursor->clearLastCode();
                                //             varcode = LM_TC_MIN;
@@ -825,7 +795,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                                mathcursor->clearLastCode();
                                //             varcode = LM_TC_MIN;
                        } else if ('0' <= c && c <= '9' && (varcode == LM_TC_TEX||was_macro)) {
-                               mathcursor->MacroModeOpen();
+                               mathcursor->macroModeOpen();
                                mathcursor->clearLastCode();
                                mathcursor->insert(c, LM_TC_MIN);
                        } else if (('0' <= c && c <= '9') || strchr(";:!|[]().,?", c)) {
@@ -847,7 +817,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                                char s[2];
                                s[0] = c;
                                s[1] = 0;
-                               mathcursor->Interpret(s);
+                               mathcursor->interpret(s);
                        } else if (c == ' ') {
                                if (!varcode) { 
                                        MathTextCodes f = (mathcursor->getLastCode()) ?
@@ -859,7 +829,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                                if (varcode == LM_TC_TEXTRM)
                                        mathcursor->insert(c, LM_TC_TEXTRM);
                                else if (was_macro)
-                                       mathcursor->MacroModeClose();
+                                       mathcursor->macroModeClose();
                                else if (mathcursor->pop())
                                        mathcursor->plainRight();
                                else {
@@ -871,7 +841,7 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
                                mathcursor->insert(c, LM_TC_VAR);
                        } else if (c == '\\') {
                                if (was_macro)
-                                       mathcursor->MacroModeClose();
+                                       mathcursor->macroModeClose();
                                bv->owner()->message(_("TeX mode"));
                                mathcursor->setLastCode(LM_TC_TEX);
                        }
@@ -886,11 +856,11 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
 
        mathcursor->normalize();
 
-       if (was_macro != mathcursor->InMacroMode()
+       if (was_macro != mathcursor->inMacroMode()
                                && action >= 0 && action != LFUN_BACKSPACE) 
                updateLocal(bv, true);
        
-       if (mathcursor->Selection() || was_selection)
+       if (mathcursor->selection() || was_selection)
                toggleInsetSelection(bv);
 
        if (result == DISPATCHED || result == DISPATCHED_NOUPDATE ||
@@ -903,68 +873,12 @@ InsetFormulaBase::localDispatch(BufferView * bv, kb_action action,
 }
 
 
-
-/* FIXME: math-greek-toggle seems to work OK, but math-greek doesn't turn
- * on greek mode */
-bool math_insert_greek(BufferView * bv, char c)
-{
-       if (!bv->available())
-               return false;
-
-       if (!isalpha(c))
-               return false;
-
-       string tmp;
-       tmp = c;
-       if (!bv->theLockingInset() || bv->theLockingInset()->isTextInset()) {
-               int greek_kb_flag_save = greek_kb_flag;
-               InsetFormula * new_inset = new InsetFormula();
-               bv->beforeChange(bv->text);
-               if (!bv->insertInset(new_inset)) {
-                       delete new_inset;
-                       return false;
-               }
-               //Update(1);//BUG
-               new_inset->edit(bv, 0, 0, 0);
-               new_inset->localDispatch(bv, LFUN_SELFINSERT, tmp);
-               if (greek_kb_flag_save < 2) {
-                       bv->unlockInset(new_inset); // bv->theLockingInset());
-                       bv->text->cursorRight(bv, true);
-               }
-       } else
-               if (bv->theLockingInset()->lyxCode() == Inset::MATH_CODE ||
-                               bv->theLockingInset()->lyxCode() == Inset::MATHMACRO_CODE)
-                       static_cast<InsetFormula*>(bv->theLockingInset())->localDispatch(bv, LFUN_SELFINSERT, tmp);
-               else
-                       lyxerr << "Math error: attempt to write on a wrong "
-                               "class of inset." << endl;
-       return true;
-}
-
-
-
 Inset::Code InsetFormulaBase::lyxCode() const
 {
        return Inset::MATH_CODE;
 }
 
 
-LyXFont const InsetFormulaBase::convertFont(LyXFont const & f) const
-{
-       // We have already discussed what was here
-       LyXFont font(f);
-#ifndef NO_LATEX
-       font.setLatex(LyXFont::OFF);
-#endif
-       return font;
-}
-
-MathInset * InsetFormulaBase::par() const
-{
-       return par_;
-}
-
-
 void mathDispatchCreation(BufferView * bv, string const & arg, bool display)
 {
        if (bv->available()) {