multicell selection

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2255 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2001-07-16 15:53:25 +00:00
parent efe0b0b8eb
commit a97c6eba47
12 changed files with 651 additions and 359 deletions

View File

@ -33,6 +33,14 @@ MathArray::MathArray(MathArray const & array)
replace(pos, nextInset(pos)->clone());
}
MathArray::MathArray(MathArray const & array, int from, int to)
: bf_(array.bf_.begin() + from, array.bf_.begin() + to)
{
for (int pos = 0; pos < size(); next(pos))
if (isInset(pos))
replace(pos, nextInset(pos)->clone());
}
bool MathArray::next(int & pos) const
{
@ -209,6 +217,12 @@ int MathArray::size() const
}
void MathArray::erase()
{
erase(0, size());
}
void MathArray::erase(int pos)
{
if (pos < static_cast<int>(bf_.size()))

View File

@ -47,6 +47,8 @@ public:
///
MathArray(MathArray const &);
///
MathArray(MathArray const &, int from, int to);
///
MathArray & operator=(MathArray const &);
///
~MathArray();
@ -72,6 +74,8 @@ public:
///
void erase(int pos);
///
void erase();
///
void replace(int pos, MathInset * inset);
///
bool prev(int & pos) const;

View File

@ -134,13 +134,7 @@ void InsetFormula::draw(BufferView * bv, LyXFont const &,
pain.fillRectangle(x, y - a, w, h, LColor::mathbg);
if (mathcursor && mathcursor->formula() == this) {
if (mathcursor->Selection()) {
int xp[10];
int yp[10];
int n;
mathcursor->SelGetArea(xp, yp, n);
pain.fillPolygon(xp, yp, n, LColor::selection);
}
mathcursor->drawSelection(pain);
pain.rectangle(x, y - a, w, h, LColor::mathframe);
}
@ -172,7 +166,11 @@ InsetFormula::localDispatch(BufferView * bv, kb_action action,
case LFUN_BREAKLINE:
bv->lockedInsetStoreUndo(Undo::INSERT);
int x;
int y;
mathcursor->GetPos(x, y);
mathcursor->breakLine();
mathcursor->normalize();
updateLocal(bv);
break;
@ -332,17 +330,18 @@ void InsetFormula::validate(LaTeXFeatures & features) const
int InsetFormula::ascent(BufferView *, LyXFont const &) const
{
return par()->ascent();
return par()->ascent() + 1;
}
int InsetFormula::descent(BufferView *, LyXFont const &) const
{
return par()->descent();
return par()->descent() + 1;
}
int InsetFormula::width(BufferView *, LyXFont const &) const
{
return par()->width();
Metrics();
return par()->width() + 2;
}

View File

@ -306,7 +306,7 @@ void InsetFormulaBase::edit(BufferView * bv, int x, int /*y*/, unsigned int)
if (!bv->lockInset(this))
lyxerr[Debug::MATHED] << "Cannot lock inset!!!" << endl;
par_->Metrics(LM_ST_TEXT);
Metrics();
//bv->updateInset(this, false);
if (x == 0)
mathcursor->first();
@ -408,11 +408,17 @@ vector<string> const InsetFormulaBase::getLabelList() const
void InsetFormulaBase::updateLocal(BufferView * bv)
{
par_->Metrics(LM_ST_TEXT);
Metrics();
bv->updateInset(this, true);
}
void InsetFormulaBase::Metrics() const
{
const_cast<MathInset *>(par_)->Metrics(LM_ST_TEXT);
}
void InsetFormulaBase::insetButtonRelease(BufferView * bv,
int x, int y, int /*button*/)
{

View File

@ -115,6 +115,8 @@ public:
virtual std::vector<string> const getLabelList() const;
///
MathInset * par() const;
///
virtual void Metrics() const;
protected:
///
virtual void updateLocal(BufferView * bv);

View File

@ -143,13 +143,8 @@ void InsetFormulaMacro::draw(BufferView * bv, LyXFont const & f,
pain.fillRectangle(int(x), y , w, h, LColor::mathmacrobg);
pain.rectangle(int(x), y, w, h, LColor::mathframe);
if (mathcursor && mathcursor->formula() == this && mathcursor->Selection()) {
int xp[10];
int yp[10];
int n;
mathcursor->SelGetArea(xp, yp, n);
pain.fillPolygon(xp, yp, n, LColor::selection);
}
if (mathcursor && mathcursor->formula() == this)
mathcursor->drawSelection(pain);
pain.text(int(x + 2), baseline, prefix(), font);
x += width(bv, font);

File diff suppressed because it is too large Load Diff

View File

@ -29,6 +29,38 @@ class MathUpDownInset;
class InsetFormulaBase;
class MathArray;
class MathXArray;
class Painter;
/// Description of a position
struct MathCursorPos {
/// inset
MathInset * par_;
/// cell index
int idx_;
/// cell position
int pos_;
///
bool operator==(const MathCursorPos &) const;
///
bool operator<(const MathCursorPos &) const;
/// returns cell corresponding to this position
MathArray & cell() const;
/// returns cell corresponding to this position
MathArray & cell(int idx) const;
/// returns xcell corresponding to this position
MathXArray & xcell() const;
/// returns xcell corresponding to this position
MathXArray & xcell(int idx) const;
/// moves position on cell to the left
bool idxLeft();
/// moves position on cell to the right
bool idxRight();
/// moves position on cell up
bool idxUp();
/// moves position on cell up
bool idxDown();
};
/// This is the external interface of Math's subkernel
class MathCursor {
@ -40,6 +72,8 @@ public:
///
void insert(MathInset *);
///
void insert(MathArray const &);
///
void Home();
///
void End();
@ -108,7 +142,7 @@ public:
///
void SelClear();
///
void SelGetArea(int * xp, int * yp, int & n);
void drawSelection(Painter & pain) const;
///
void clearLastCode();
///
@ -126,7 +160,7 @@ public:
///
MathTextCodes getLastCode() const;
///
int idx() const { return cursor_.idx_; }
int idx() const { return cursor().idx_; }
///
void idxNext();
///
@ -148,7 +182,17 @@ public:
///
int row() const;
//protected:
///
MathStyles style() const;
/// Make sure cursor position is valid
void normalize() const;
/// Enter a new MathInset from the front or the back
void push(MathInset * par, bool first);
/// Leave current MathInset
bool pop();
//private:
///
bool macro_mode;
@ -166,36 +210,26 @@ public:
///
MathXArray & xarray() const;
///
MathStyles style() const;
/// Make sure cursor position is valid
void normalize() const;
/// Enter a new MathInset from the front or the back
void push(MathInset * par, bool first);
/// Leave current MathInset
bool pop();
private:
/// Description of a position
struct MathIter {
/// inset
MathInset * par_;
/// cell inset
int idx_;
///
int pos_;
};
/// returns the first position of the (normalized) selection
MathCursorPos firstSelectionPos() const;
/// returns the last position of the (normalized) selection
MathCursorPos lastSelectionPos() const;
/// returns the selection
void getSelection(MathCursorPos &, MathCursorPos &) const;
/// returns the normalized anchor of the selection
MathCursorPos normalAnchor() const;
/// returns the normalized anchor of the selection
bool openable(MathInset *, bool selection, bool useupdown) const;
/// path of positions the cursor had to go if it were leving each inset
std::vector<MathIter> path_;
std::vector<MathCursorPos> Cursor_;
/// path of positions the anchor had to go if it were leving each inset
std::vector<MathCursorPos> Anchor_;
/// reference to the last item of the path
MathIter anchor_;
MathCursorPos & cursor();
///
MathIter cursor_;
///
int path_idx_;
MathCursorPos const & cursor() const;
///

View File

@ -245,9 +245,6 @@ void MathGridInset::delRow(int row)
if (nrows() == 1)
return;
lyxerr << "delRow: nr: " << nrows() << " nc: " << ncols()
<< " row: " << row << "\n";
cells_type::iterator it = cells_.begin() + row * ncols();
cells_.erase(it, it + ncols());
@ -389,6 +386,22 @@ void MathGridInset::idxDelete(int & idx, bool & popit, bool & deleteit)
}
void MathGridInset::idxDeleteRange(int from, int to)
{
// leave this unimplemented unless someone wants to have it.
/*
int n = (to - from) / ncols();
int r = from / ncols();
if (n >= 1) {
cells_type::iterator it = cells_.begin() + from;
cells_.erase(it, it + n * ncols());
rowinfo_.erase(rowinfo_.begin() + r, rowinfo_.begin() + r + n);
}
*/
}
MathGridInset::RowInfo const & MathGridInset::rowinfo(int i) const
{
return rowinfo_[i];
@ -399,3 +412,17 @@ MathGridInset::RowInfo & MathGridInset::rowinfo(int i)
{
return rowinfo_[i];
}
std::vector<int> MathGridInset::idxBetween(int from, int to) const
{
int r1 = std::min(row(from), row(to));
int r2 = std::max(row(from), row(to));
int c1 = std::min(col(from), col(to));
int c2 = std::max(col(from), col(to));
std::vector<int> res;
for (int i = r1; i <= r2; ++i)
for (int j = c1; j <= c2; ++j)
res.push_back(index(i, j));
return res;
}

View File

@ -101,6 +101,8 @@ public:
bool idxLast(int &, int &) const;
///
void idxDelete(int &, bool &, bool &);
///
void idxDeleteRange(int, int);
///
void addRow(int);
@ -114,6 +116,8 @@ public:
virtual void appendRow();
///
int index(int row, int col) const;
///
std::vector<int> idxBetween(int from, int to) const;
protected:
/// row info

View File

@ -284,6 +284,9 @@ void MathInset::idxDelete(int &, bool & popit, bool & deleteit)
deleteit = false;
}
void MathInset::idxDeleteRange(int, int)
{}
bool MathInset::idxLastUp(int &, int &) const
{
@ -363,3 +366,11 @@ void MathInset::Validate(LaTeXFeatures & features) const
for (int i = 0; i < nargs(); ++i)
cell(i).Validate(features);
}
std::vector<int> MathInset::idxBetween(int from, int to) const
{
std::vector<int> res;
for (int i = from; i <= to; ++i)
res.push_back(i);
return res;
}

View File

@ -126,6 +126,11 @@ public:
// the return value indicates whether the cursor should leave the inset
// and/or the whole inset should be deleted
virtual void idxDelete(int & idx, bool & popit, bool & deleteit);
// deletes a cell range and moves the cursor
virtual void idxDeleteRange(int from, int to);
// returns list of cell indices that are "between" from and to for
// selction purposes
virtual std::vector<int> idxBetween(int from, int to) const;
///
int nargs() const;