cursor.insert(data_.cell(0));
} else {
// mulitple cells
- idx_type idx;
+ idx_type idx; // index of upper left cell
MathGridInset * p = cursor.enclosingGrid(idx);
col_type const numcols = min(data_.ncols(), p->ncols() - p->col(idx));
row_type const numrows = min(data_.nrows(), p->nrows() - p->row(idx));
- for (row_type row = 0; row < numrows; ++row)
+ for (row_type row = 0; row < numrows; ++row) {
for (col_type col = 0; col < numcols; ++col) {
idx_type i = p->index(row + p->row(idx), col + p->col(idx));
p->cell(i).push_back(data_.cell(data_.index(row, col)));
}
+ // append the left over horizontal cells to the last column
+ idx_type i = p->index(row + p->row(idx), p->ncols() - 1);
+ for (col_type col = numcols; col < data_.ncols(); ++col)
+ p->cell(i).push_back(data_.cell(data_.index(row, col)));
+ }
+ // append the left over vertical cells to the last _cell_
+ idx_type i = p->nargs() - 1;
+ for (row_type row = numrows; row < data_.nrows(); ++row)
+ for (col_type col = 0; col < data_.ncols(); ++col)
+ p->cell(i).push_back(data_.cell(data_.index(row, col)));
}
}
return;
}
- // delete empty cells if necessary
- if (array().empty()) {
- bool popit;
- bool removeit;
- par()->idxDelete(idx(), popit, removeit);
- if (popit && popLeft() && removeit)
- plainErase();
- return;
- }
+ // delete empty cells if possible
+ if (array().empty())
+ if (par()->idxDelete(idx()))
+ return;
- if (pos() == size())
+ // old behaviour when in last position of cell
+ if (pos() == size()) {
+ par()->idxGlue(idx());
return;
+ }
MathScriptInset * p = nextAtom()->asScriptInset();
if (p) {
void MathCursor::macroModeClose()
{
+ MathInset::difference_type const t = macroNamePos();
+ if (t == -1)
+ return;
string s = macroName();
- if (s.size()) {
- size_type old = pos();
- pos() -= s.size();
- array().erase(pos(), old);
+ array().erase(t, pos());
+ pos() = t;
+ if (s != "\\")
interpret(s);
- }
}
if (p) {
idx = Cursor_[i].idx_;
return p;
+ lyxerr << "found grid and idx: " << idx << "\n";
}
}
return 0;
}
+void MathCursor::popToEnclosingGrid()
+{
+ while (Cursor_.size() && !Cursor_.back().par_->asGridInset())
+ Cursor_.pop_back();
+}
+
+
void MathCursor::pullArg(bool goright)
{
dump("pullarg");
lyxerr << "this should not really happen - 2: "
<< pos() << " " << size() << " in idx: " << idx()
<< " in atom: '";
- WriteStream wi(lyxerr, false);
+ WriteStream wi(lyxerr, false, true);
par()->write(wi);
lyxerr << "\n";
dump("error 4");
if (s.empty())
return true;
- if (s.size() == 1)
- return interpret(s[0]);
-
//lyxerr << "char: '" << s[0] << "' int: " << int(s[0]) << endl;
//owner_->getIntl()->getTrans().TranslateAndInsert(s[0], lt);
//lyxerr << "trans: '" << s[0] << "' int: " << int(s[0]) << endl;
return true;
}
- if (s == "\\over" || s == "\\choose" || s == "\\atop") {
+ string name = s.substr(1);
+
+ if (name == "over" || name == "choose" || name == "atop") {
MathArray ar = array();
- MathAtom t(createMathInset(s.substr(1)));
+ MathAtom t(createMathInset(name));
t->asNestInset()->cell(0).swap(array());
pos() = 0;
niceInsert(t);
return true;
}
- latexkeys const * l = in_word_set(s.substr(1));
+ latexkeys const * l = in_word_set(name);
if (l && (l->token == LM_TK_FONT || l->token == LM_TK_OLDFONT)) {
lastcode_ = static_cast<MathTextCodes>(l->id);
return true;
// prevent entering of recursive macros
if (formula()->lyxCode() == Inset::MATHMACRO_CODE
- && formula()->getInsetName() == s.substr(1))
+ && formula()->getInsetName() == name)
{
lyxerr << "can't enter recursive macro\n";
return true;
}
- niceInsert(createMathInset(s.substr(1)));
+ niceInsert(createMathInset(name));
return true;
}
bool MathCursor::interpret(char c)
{
+ //lyxerr << "interpret 2: '" << c << "'\n";
if (inMacroArgMode()) {
--pos();
plainErase();
// handle macroMode
if (inMacroMode()) {
string name = macroName();
+ //lyxerr << "interpret name: '" << name << "'\n";
- if (name == "\\" && c == '\\') {
- backspace();
- interpret("\\backslash");
+ // extend macro name if possible
+ if (isalpha(c)) {
+ insert(c, LM_TC_TEX);
return true;
}
- if (isalpha(c)) {
- insert(c, LM_TC_TEX);
+ // leave macro mode if explicitly requested
+ if (c == ' ') {
+ macroModeClose();
return true;
}
+ // handle 'special char' macros
if (name == "\\") {
- insert(c, LM_TC_TEX);
- macroModeClose();
+ // remove the '\\'
+ backspace();
+ if (c == '\\')
+ interpret("\\backslash");
+ else
+ interpret(string("\\") + c);
return true;
}
+ // leave macro mode and try again
macroModeClose();
-
- if (c == '\\')
- insert(c, LM_TC_TEX);
- else if (c != ' ')
- insert(c, lastcode_);
-
+ interpret(c);
return true;
}
ostringstream os;
if (pos() > 0)
prevAtom()->infoize(os);
- return os.str();
+ return os.str().c_str(); // .c_str() needed for lyxstring
}