}
// 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)
+ 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)
+ 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)));
}
}
#endif
-UpdatableInset * MathCursor::asHyperActiveInset() const
-{
- return par()->asHyperActiveInset();
-}
-
-
bool MathCursor::isInside(MathInset const * p) const
{
for (unsigned i = 0; i < Cursor_.size(); ++i)
bool MathCursor::openable(MathAtom const & t, bool sel) const
{
- if (t->isHyperActive())
- return true;
-
if (!t->isActive())
return false;
lastcode_ = LM_TC_MIN;
if (hasPrevAtom() && openable(prevAtom(), sel)) {
- if (prevAtom()->isHyperActive()) {
- lyxerr << "entering hyperactive inset\n";
- }
pushRight(prevAtom());
return true;
}
lastcode_ = LM_TC_MIN;
if (hasNextAtom() && openable(nextAtom(), sel)) {
- if (nextAtom()->isHyperActive()) {
- lyxerr << "entering hyperactive inset\n";
- int x, y;
- getPos(x, y);
- nextAtom()->edit(formula()->view(), x, y, 0);
- }
pushLeft(nextAtom());
return true;
}
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);
- }
}
#warning This should probably take cellXOffset and cellYOffset into account
#endif
x = xarray().xo() + xarray().pos2x(pos());
+ // move cursor visually into empty cells ("blue rectangles");
+ if (array().empty())
+ x += 2;
y = xarray().yo();
}
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");
pos() = min(pos(), size());
// remove empty scripts if possible
- for (pos_type i = 0; i < size(); ++i) {
- MathScriptInset * p = array().at(i)->asScriptInset();
- if (p) {
- p->removeEmptyScripts();
- if (p->empty())
- array().erase(i);
+ if (1) {
+ for (pos_type i = 0; i < size(); ++i) {
+ MathScriptInset * p = array().at(i)->asScriptInset();
+ if (p) {
+ p->removeEmptyScripts();
+ //if (p->empty())
+ // array().erase(i);
+ }
}
}
up ? yo - 4 : formula()->yhigh()
);
}
-
+
// any improvement so far?
int xnew, ynew;
getPos(xnew, ynew);
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::script(bool up)
{
+ // Hack to get \\^ and \\_ working
+ if (inMacroMode() && macroName() == "\\") {
+ if (up)
+ interpret("\\mathcircumflex");
+ else
+ interpret('_');
+ return true;
+ }
+
macroModeClose();
selCut();
if (hasPrevAtom() && prevAtom()->asScriptInset()) {
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
}