revert part of the "grid unification" to prevent random crashs...

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6919 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-05-02 07:52:15 +00:00
parent ef3b4f2936
commit bc29b6a790
4 changed files with 154 additions and 101 deletions

View File

@ -16,7 +16,7 @@ void MathErtInset::metrics(MetricsInfo & mi) const
{
FontSetChanger dummy(mi.base, "lyxert");
MathTextInset::metrics(mi);
cache_.colinfo_[0].align = 'l';
cache_.colinfo_[0].align_ = 'l';
metricsMarkers2();
}

View File

@ -68,6 +68,25 @@ int extractInt(istream & is)
}
//////////////////////////////////////////////////////////////
MathGridInset::CellInfo::CellInfo()
: dummy_(false)
{}
//////////////////////////////////////////////////////////////
MathGridInset::RowInfo::RowInfo()
: lines_(0), skip_(0)
{}
int MathGridInset::RowInfo::skipPixels() const
{
return crskip_.inBP();
@ -75,11 +94,22 @@ int MathGridInset::RowInfo::skipPixels() const
//////////////////////////////////////////////////////////////
MathGridInset::ColInfo::ColInfo()
: align_('c'), leftline_(false), rightline_(false), lines_(0)
{}
//////////////////////////////////////////////////////////////
MathGridInset::MathGridInset(char v, string const & h)
: MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1)
: MathNestInset(guessColumns(h)),
rowinfo_(2),
colinfo_(guessColumns(h) + 1),
cellinfo_(1 * guessColumns(h))
{
setDefaults();
valign(v);
@ -89,7 +119,11 @@ MathGridInset::MathGridInset(char v, string const & h)
MathGridInset::MathGridInset()
: MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1), v_align_('c')
: MathNestInset(1),
rowinfo_(1 + 1),
colinfo_(1 + 1),
cellinfo_(1),
v_align_('c')
{
setDefaults();
}
@ -97,7 +131,10 @@ MathGridInset::MathGridInset()
MathGridInset::MathGridInset(col_type m, row_type n)
: MathNestInset(m * n),
rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_('c')
rowinfo_(n + 1),
colinfo_(m + 1),
cellinfo_(m * n),
v_align_('c')
{
setDefaults();
}
@ -105,7 +142,10 @@ MathGridInset::MathGridInset(col_type m, row_type n)
MathGridInset::MathGridInset(col_type m, row_type n, char v, string const & h)
: MathNestInset(m * n),
rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_(v)
rowinfo_(n + 1),
colinfo_(m + 1),
cellinfo_(m * n),
v_align_(v)
{
setDefaults();
valign(v);
@ -139,8 +179,8 @@ void MathGridInset::setDefaults()
//if (nrows() <= 0)
// lyxerr << "positive number of rows expected\n";
for (col_type col = 0; col < ncols(); ++col) {
colinfo_[col].align = defaultColAlign(col);
colinfo_[col].skip_ = defaultColSpace(col);
colinfo_[col].align_ = defaultColAlign(col);
colinfo_[col].skip_ = defaultColSpace(col);
}
}
@ -149,14 +189,13 @@ void MathGridInset::halign(string const & hh)
{
col_type col = 0;
for (string::const_iterator it = hh.begin(); it != hh.end(); ++it) {
if (col == ncols())
addCol(ncols() - 1);
char const c = *it;
lyxerr << "handle column separator: '" << c << "'\n";
if (col >= ncols())
break;
char c = *it;
if (c == '|') {
colinfo_[col].lines_++;
} else if (c == 'c' || c == 'l' || c == 'r') {
colinfo_[col].align = c;
colinfo_[col].align_ = c;
++col;
colinfo_[col].lines_ = 0;
} else {
@ -164,24 +203,39 @@ void MathGridInset::halign(string const & hh)
}
}
/*
col_type n = hh.size();
if (n >= ncols())
n = ncols() - 1;
if (n > ncols())
n = ncols();
for (col_type col = 0; col < n; ++col)
colinfo_[col].align = hh[col];
colinfo_[col].align_ = hh[col];
*/
}
MathGridInset::col_type MathGridInset::guessColumns(string const & hh) const
{
col_type col = 0;
for (string::const_iterator it = hh.begin(); it != hh.end(); ++it)
if (*it == 'c' || *it == 'l' || *it == 'r')
++col;
// let's have at least one column, even if we did not recognize its
// alignment
if (col == 0)
col = 1;
return col;
}
void MathGridInset::halign(char h, col_type col)
{
colinfo_[col].align = h;
colinfo_[col].align_ = h;
}
char MathGridInset::halign(col_type col) const
{
return colinfo_[col].align;
return colinfo_[col].align_;
}
@ -190,9 +244,9 @@ string MathGridInset::halign() const
string res;
for (col_type col = 0; col < ncols(); ++col) {
res += string(colinfo_[col].lines_, '|');
res += colinfo_[col].align;
res += colinfo_[col].align_;
}
return res;
return res + string(colinfo_[ncols()].lines_, '|');
}
@ -210,13 +264,13 @@ char MathGridInset::valign() const
MathGridInset::col_type MathGridInset::ncols() const
{
return colinfo_.size();
return colinfo_.size() - 1;
}
MathGridInset::row_type MathGridInset::nrows() const
{
return rowinfo_.size();
return rowinfo_.size() - 1;
}
@ -262,10 +316,12 @@ void MathGridInset::metrics(MetricsInfo & mi) const
rowinfo_[row].descent_ = desc;
}
rowinfo_[0].ascent_ += hlinesep() * rowinfo_[0].lines_;
rowinfo_[nrows()].ascent_ = 0;
rowinfo_[nrows()].descent_ = 0;
// compute vertical offsets
rowinfo_[0].offset_ = 0;
for (row_type row = 1; row < nrows(); ++row) {
for (row_type row = 1; row <= nrows(); ++row) {
rowinfo_[row].offset_ =
rowinfo_[row - 1].offset_ +
rowinfo_[row - 1].descent_ +
@ -287,7 +343,7 @@ void MathGridInset::metrics(MetricsInfo & mi) const
default:
h = rowinfo_[nrows() - 1].offset_ / 2;
}
for (row_type row = 0; row < nrows(); ++row)
for (row_type row = 0; row <= nrows(); ++row)
rowinfo_[row].offset_ -= h;
@ -298,10 +354,11 @@ void MathGridInset::metrics(MetricsInfo & mi) const
wid = max(wid, cell(index(row, col)).width());
colinfo_[col].width_ = wid;
}
colinfo_[ncols()].width_ = 0;
// compute horizontal offsets
colinfo_[0].offset_ = border();
for (col_type col = 1; col < ncols(); ++col) {
for (col_type col = 1; col <= ncols(); ++col) {
colinfo_[col].offset_ =
colinfo_[col - 1].offset_ +
colinfo_[col - 1].width_ +
@ -311,19 +368,19 @@ void MathGridInset::metrics(MetricsInfo & mi) const
}
dim_.w = colinfo_[ncols() - 1].offset_
dim_.w = colinfo_[ncols() - 1].offset_
+ colinfo_[ncols() - 1].width_
//+ vlinesep() * colinfo_[ncols()].lines_
+ vlinesep() * colinfo_[ncols()].lines_
+ border();
dim_.a = - rowinfo_[0].offset_
dim_.a = - rowinfo_[0].offset_
+ rowinfo_[0].ascent_
+ hlinesep() * rowinfo_[0].lines_
+ hlinesep() * rowinfo_[0].lines_
+ border();
dim_.d = rowinfo_[nrows() - 1].offset_
+ rowinfo_[nrows() - 1].descent_
//+ hlinesep() * rowinfo_[nrows()].lines_
+ hlinesep() * rowinfo_[nrows()].lines_
+ border();
@ -385,14 +442,14 @@ void MathGridInset::draw(PainterInfo & pi, int x, int y) const
for (idx_type idx = 0; idx < nargs(); ++idx)
cell(idx).draw(pi, x + cellXOffset(idx), y + cellYOffset(idx));
for (row_type row = 0; row < nrows(); ++row)
for (row_type row = 0; row <= nrows(); ++row)
for (int i = 0; i < rowinfo_[row].lines_; ++i) {
int yy = y + rowinfo_[row].offset_ - rowinfo_[row].ascent_
- i * hlinesep() - hlinesep()/2 - rowsep()/2;
pi.pain.line(x + 1, yy, x + width() - 1, yy);
}
for (col_type col = 0; col < ncols(); ++col)
for (col_type col = 0; col <= ncols(); ++col)
for (int i = 0; i < colinfo_[col].lines_; ++i) {
int xx = x + colinfo_[col].offset_
- i * vlinesep() - vlinesep()/2 - colsep()/2;
@ -421,10 +478,12 @@ void MathGridInset::metricsT(TextMetricsInfo const & mi) const
rowinfo_[row].descent_ = desc;
}
//rowinfo_[0].ascent_ += hlinesep() * rowinfo_[0].lines_;
rowinfo_[nrows()].ascent_ = 0;
rowinfo_[nrows()].descent_ = 0;
// compute vertical offsets
rowinfo_[0].offset_ = 0;
for (row_type row = 1; row < nrows(); ++row) {
for (row_type row = 1; row <= nrows(); ++row) {
rowinfo_[row].offset_ =
rowinfo_[row - 1].offset_ +
rowinfo_[row - 1].descent_ +
@ -446,7 +505,7 @@ void MathGridInset::metricsT(TextMetricsInfo const & mi) const
default:
h = rowinfo_[nrows() - 1].offset_ / 2;
}
for (row_type row = 0; row < nrows(); ++row)
for (row_type row = 0; row <= nrows(); ++row)
rowinfo_[row].offset_ -= h;
@ -457,10 +516,11 @@ void MathGridInset::metricsT(TextMetricsInfo const & mi) const
wid = max(wid, cell(index(row, col)).width());
colinfo_[col].width_ = wid;
}
colinfo_[ncols()].width_ = 0;
// compute horizontal offsets
colinfo_[0].offset_ = border();
for (col_type col = 1; col < ncols(); ++col) {
for (col_type col = 1; col <= ncols(); ++col) {
colinfo_[col].offset_ =
colinfo_[col - 1].offset_ +
colinfo_[col - 1].width_ +
@ -599,8 +659,8 @@ void MathGridInset::addCol(col_type newcol)
swap(cellinfo_, new_cellinfo);
ColInfo inf;
inf.skip_ = defaultColSpace(newcol);
inf.align = defaultColAlign(newcol);
inf.skip_ = defaultColSpace(newcol);
inf.align_ = defaultColAlign(newcol);
colinfo_.insert(colinfo_.begin() + newcol, inf);
}
@ -647,7 +707,7 @@ int MathGridInset::cellXOffset(idx_type idx) const
{
col_type c = col(idx);
int x = colinfo_[c].offset_;
char align = colinfo_[c].align;
char align = colinfo_[c].align_;
if (align == 'r' || align == 'R')
x += colinfo_[c].width_ - cell(idx).width();
if (align == 'c' || align == 'C')
@ -901,12 +961,12 @@ void MathGridInset::write(WriteStream & os) const
if (!emptyline && row + 1 < nrows())
os << "\n";
}
//string const s = verboseHLine(rowinfo_[nrows()].lines_);
//if (!s.empty() && s != " ") {
// if (os.fragile())
// os << "\\protect";
// os << "\\\\" << s;
//}
string const s = verboseHLine(rowinfo_[nrows()].lines_);
if (!s.empty() && s != " ") {
if (os.fragile())
os << "\\protect";
os << "\\\\" << s;
}
}

View File

@ -5,7 +5,6 @@
#include "math_nestinset.h"
#include "vspace.h"
#include "LString.h"
#include "math_gridinfo.h"
/** Gridded math inset base class.
@ -21,8 +20,15 @@ class MathGridInset : public MathNestInset {
public:
/// additional per-cell information
struct CellInfo : public ::CellInfo {
/// fixed glue
struct CellInfo {
///
CellInfo();
/// a dummy cell before a multicolumn cell
int dummy_;
/// special multi colums alignment
string align_;
/// these should be a per-cell property, but ok to have it here
/// for single-column grids like paragraphs
mutable int glue_;
///
mutable pos_type begin_;
@ -31,45 +37,45 @@ public:
};
/// additional per-row information
struct RowInfo : public ::RowInfo {
struct RowInfo {
///
RowInfo()
: lines_(0), skip_(0)
{}
RowInfo();
///
int skipPixels() const;
/// how many hlines above this row?
int lines_;
/// parameter to the line break
LyXLength crskip_;
/// extra distance between lines on screen
int skip_;
/// cached descent
mutable int descent_;
/// cached ascent
mutable int ascent_;
/// cached offset
mutable int offset_;
/// how many hlines above this row?
int lines_;
/// parameter to the line break
LyXLength crskip_;
/// extra distance between lines
int skip_;
};
// additional per-row information
struct ColInfo : public ::ColInfo {
struct ColInfo {
///
ColInfo()
: lines_(0), skip_(0)
{}
ColInfo();
/// currently possible: 'l', 'c', 'r'
char align_;
/// cache for drawing
int lines_;
/// additional amount to be skipped on screen
int skip_;
int h_offset;
/// cached width
mutable int width_;
/// cached offset
mutable int offset_;
/// do we need a line to the left?
bool leftline_;
/// do we need a line to the right?
bool rightline_;
/// how many lines to the left of this column?
int lines_;
/// additional amount to be skipped when drawing
int skip_;
};
public:
@ -214,6 +220,8 @@ protected:
virtual string eolString(row_type row, bool fragile = false) const;
/// returns proper 'end of column' code for LaTeX
virtual string eocString(col_type col, col_type lastcol) const;
/// extract number of columns from alignment string
col_type guessColumns(string const & halign) const;
/// splits cells and shifts right part to the next cell
void splitCell(idx_type &, pos_type & pos);

View File

@ -69,16 +69,15 @@ namespace {
{
if (s == "none") return 0;
if (s == "simple") return 1;
if (s == "chemistry") return 2;
if (s == "equation") return 3;
if (s == "eqnarray") return 4;
if (s == "align") return 5;
if (s == "alignat") return 6;
if (s == "xalignat") return 7;
if (s == "xxalignat") return 8;
if (s == "multline") return 9;
if (s == "gather") return 10;
if (s == "flalign") return 11;
if (s == "equation") return 2;
if (s == "eqnarray") return 3;
if (s == "align") return 4;
if (s == "alignat") return 5;
if (s == "xalignat") return 6;
if (s == "xxalignat") return 7;
if (s == "multline") return 8;
if (s == "gather") return 9;
if (s == "flalign") return 10;
lyxerr << "unknown hull type '" << s << "'\n";
return 0;
}
@ -163,8 +162,6 @@ char const * MathHullInset::standardFont() const
{
if (type_ == "none")
return "lyxnochange";
if (type_ == "chemistry")
return "mathrm";
return "mathnormal";
}
@ -293,7 +290,7 @@ bool MathHullInset::ams() const
bool MathHullInset::display() const
{
return type_ != "simple" && type_ != "none" && type_ != "chemistry";
return type_ != "simple" && type_ != "none";
}
@ -309,8 +306,6 @@ bool MathHullInset::numberedType() const
{
if (type_ == "none")
return false;
if (type_ == "chemistry")
return false;
if (type_ == "simple")
return false;
if (type_ == "xxalignat")
@ -353,9 +348,6 @@ void MathHullInset::header_write(WriteStream & os) const
os << ' ';
}
else if (type_ == "chemistry")
os << "$\\mathrm{";
else if (type_ == "equation") {
if (n)
os << "\\begin{equation" << star(n) << "}\n";
@ -390,9 +382,6 @@ void MathHullInset::footer_write(WriteStream & os) const
else if (type_ == "simple")
os << '$';
else if (type_ == "chemistry")
os << "}$";
else if (type_ == "equation")
if (n)
os << "\\end{equation" << star(n) << "}\n";
@ -506,22 +495,22 @@ void MathHullInset::mutate(string const & newtype)
// done
}
else if (newtype == "none" || newtype == "chemistry") {
mutate("simple");
else if (type_ == "none") {
setType("simple");
numbered(0, false);
mutate(newtype);
}
else if (newtype == "simple") {
if (type_ != "none" && type_ != "chemistry") {
mutate("equation");
else if (type_ == "simple") {
if (newtype == "none") {
setType("none");
} else {
setType("equation");
numbered(0, false);
mutate(newtype);
}
}
else if (newtype == "equation" && smaller(type_, newtype)) {
numbered(0, false);
}
else if (type_ == "equation") {
if (smaller(newtype, type_)) {
setType("simple");
@ -625,8 +614,6 @@ void MathHullInset::mutate(string const & newtype)
lyxerr << "mutation from '" << type_
<< "' to '" << newtype << "' not implemented" << endl;
}
setType(newtype);
}
@ -859,7 +846,5 @@ dispatch_result MathHullInset::dispatch
string MathHullInset::fileInsetLabel() const
{
if (type_ == "chemistry")
return "Chemistry";
return "Formula";
}