bool dirty_tabular_stack_ = false;
-void region(CursorSlice const & i1, CursorSlice const & i2,
- Inset::row_type & r1, Inset::row_type & r2,
- Inset::col_type & c1, Inset::col_type & c2)
-{
- Inset & p = i1.inset();
- c1 = p.col(i1.idx());
- c2 = p.col(i2.idx());
- if (c1 > c2)
- swap(c1, c2);
- r1 = p.row(i1.idx());
- r2 = p.row(i2.idx());
- if (r1 > r2)
- swap(r1, r2);
-}
-
-
bool checkPastePossible(int index)
{
return size_t(index) < theCuts.size() && !theCuts[index].first.empty();
namespace cap {
+void region(CursorSlice const & i1, CursorSlice const & i2,
+ Inset::row_type & r1, Inset::row_type & r2,
+ Inset::col_type & c1, Inset::col_type & c2)
+{
+ Inset & p = i1.inset();
+ c1 = p.col(i1.idx());
+ c2 = p.col(i2.idx());
+ if (c1 > c2)
+ swap(c1, c2);
+ r1 = p.row(i1.idx());
+ r2 = p.row(i2.idx());
+ if (r1 > r2)
+ swap(r1, r2);
+}
+
+
docstring grabAndEraseSelection(Cursor & cur)
{
if (!cur.selection())
/// Clear or delete the selection if one exists, depending on lyxrc setting.
/// Does not handle undo. Does only work if the whole selection is in mathed.
void selClearOrDel(Cursor & cur);
-
+/// Calculate rectangular region of cell between \c i1 and \c i2.
+void region(CursorSlice const & i1, CursorSlice const & i2,
+ Inset::row_type & r1, Inset::row_type & r2,
+ Inset::col_type & c1, Inset::col_type & c2);
/** Tabular has its own paste stack for multiple cells
* but it needs to know whether there is a more recent
* ordinary paste. Therefore which one is newer.
}
-void InsetMathNest::handleFont
- (Cursor & cur, docstring const & arg, docstring const & font)
+void InsetMathNest::handleFont(Cursor & cur, docstring const & arg, docstring const & font)
{
// this whole function is a hack and won't work for incremental font
// changes...
cur.recordUndoInset();
cur.handleFont(to_utf8(font));
} else {
- cur.recordUndo();
- cur.handleNest(createInsetMath(font));
- cur.insert(arg);
+ CursorSlice i1 = cur.selBegin();
+ CursorSlice i2 = cur.selEnd();
+ if (!i1.inset().asInsetMath())
+ return;
+ if (i1.idx() == i2.idx()) {
+ // the easy case where only one cell is selected
+ cur.recordUndo();
+ cur.handleNest(createInsetMath(font));
+ cur.insert(arg);
+ return;
+ }
+
+ // multiple selected cells in a simple non-grid inset
+ if (i1.asInsetMath()->nrows() == 0 || i1.asInsetMath()->ncols() == 0) {
+ cur.recordUndoInset();
+ for (idx_type i = i1.idx(); i <= i2.idx(); ++i) {
+ // select cell
+ cur.idx() = i;
+ cur.pos() = 0;
+ cur.resetAnchor();
+ cur.pos() = cur.lastpos();
+ cur.setSelection();
+
+ // change font of cell
+ cur.handleNest(createInsetMath(font));
+ cur.insert(arg);
+
+ // cur is in the font inset now. If the loop continues,
+ // we need to get outside again for the next cell
+ if (i + 1 <= i2.idx())
+ cur.pop_back();
+ }
+ return;
+ }
+
+ // the complicated case with multiple selected cells in a grid
+ cur.recordUndoInset();
+ Inset::row_type r1, r2;
+ Inset::col_type c1, c2;
+ cap::region(i1, i2, r1, r2, c1, c2);
+ for (Inset::row_type row = r1; row <= r2; ++row) {
+ for (Inset::col_type col = c1; col <= c2; ++col) {
+ // select cell
+ cur.idx() = i1.asInsetMath()->index(row, col);
+ cur.pos() = 0;
+ cur.resetAnchor();
+ cur.pos() = cur.lastpos();
+ cur.setSelection();
+
+ // change font of cell
+ cur.handleNest(createInsetMath(font));
+ cur.insert(arg);
+
+ // cur is in the font inset now. If the loop continues,
+ // we need to get outside again for the next cell
+ if (col + 1 <= c2 || row + 1 <= r2)
+ cur.pop_back();
+ }
+ }
}
}