backport rev. 23673 from sts, which partially fixes a major dataloss bug:

URL: http://www.lyx.org/trac/changeset/23673
Log:
* fix for http://bugzilla.lyx.org/show_bug.cgi?id=4566

  "Eqnarray multiple cells size change erases what they contain"

  We now loop over the selected cells and change the font in each of them.

Note that the bug still applies if a font change is done via the math panel.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_5_X@23789 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Spitzmüller 2008-03-17 11:49:12 +00:00
parent 9770029326
commit bee48063a0
4 changed files with 81 additions and 19 deletions

View File

@ -83,22 +83,6 @@ CutStack selectionBuffer(1);
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)
std::swap(c1, c2);
r1 = p.row(i1.idx());
r2 = p.row(i2.idx());
if (r1 > r2)
std::swap(r1, r2);
}
bool checkPastePossible(int index)
{
return size_t(index) < theCuts.size() && !theCuts[index].first.empty();
@ -394,6 +378,22 @@ void copySelectionHelper(Buffer const & buf, ParagraphList & pars,
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)
std::swap(c1, c2);
r1 = p.row(i1.idx());
r2 = p.row(i2.idx());
if (r1 > r2)
std::swap(r1, r2);
}
docstring grabAndEraseSelection(Cursor & cur)
{
if (!cur.selection())

View File

@ -15,6 +15,7 @@
#define CUTANDPASTE_H
#include "support/docstring.h"
#include "insets/InsetTabular.h"
#include <vector>
@ -101,6 +102,10 @@ void pasteParagraphList(Cursor & cur, ParagraphList const & parlist,
void switchBetweenClasses(textclass_type c1, textclass_type c2,
InsetText & in, ErrorList &);
/// 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);
/// Get the current selection as a string. Does not change the selection.
/// Does only work if the whole selection is in mathed.
docstring grabSelection(Cursor const & cur);

View File

@ -417,9 +417,63 @@ void InsetMathNest::handleFont
recordUndoInset(cur, Undo::ATOMIC);
cur.handleFont(to_utf8(font));
} else {
recordUndo(cur, Undo::ATOMIC);
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
recordUndo(cur, Undo::ATOMIC);
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) {
recordUndoInset(cur);
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
recordUndoInset(cur);
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();
}
}
}
}

View File

@ -89,6 +89,9 @@ What's new
* USER INTERFACE:
- Correctly apply font changes when several math matrix cells are selected
(part of bug 4566).
- Allow deleting a label in a formula as well as the numbering with the
delete key (bug 2556).