some common structures in extra file

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6857 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-04-25 15:54:29 +00:00
parent 63febc852e
commit 00e9ff93fb
11 changed files with 107 additions and 165 deletions

View File

@ -75,6 +75,7 @@ libmathed_la_SOURCES = \
math_fracinset.h \
math_fracbase.C \
math_fracbase.h \
math_gridinfo.h \
math_gridinset.C \
math_gridinset.h \
math_hullinset.C \

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

@ -0,0 +1,45 @@
#ifndef MATH_GRIDINFO_H
#define MATH_GRIDINFO_H
struct ColInfo
{
ColInfo() : rightline(0), leftline(false) {}
char align; // column alignment
string width; // column width
int rightline; // a line on the right?
bool leftline;
};
struct RowInfo
{
RowInfo() : topline(false), bottomline(false) {}
bool topline; // horizontal line above
int bottomline; // horizontal line below
};
struct CellInfo
{
CellInfo()
: multi(0), leftline(false), rightline(false),
topline(false), bottomline(false)
{}
string content; // cell content
int multi; // multicolumn flag
char align; // cell alignment
bool leftline; // do we have a line on the left?
bool rightline; // do we have a line on the right?
bool topline; // do we have a line above?
bool bottomline; // do we have a line below?
};
inline char const * verbose_align(char c)
{
return c == 'c' ? "center" : c == 'r' ? "right" : c == 'l' ? "left" : "none";
}
#endif

View File

@ -68,25 +68,6 @@ int extractInt(istream & is)
}
//////////////////////////////////////////////////////////////
MathGridInset::CellInfo::CellInfo()
: dummy_(false)
{}
//////////////////////////////////////////////////////////////
MathGridInset::RowInfo::RowInfo()
: lines_(0), skip_(0)
{}
int MathGridInset::RowInfo::skipPixels() const
{
return crskip_.inBP();
@ -94,22 +75,11 @@ int MathGridInset::RowInfo::skipPixels() const
//////////////////////////////////////////////////////////////
MathGridInset::ColInfo::ColInfo()
: align_('c'), leftline_(false), rightline_(false), lines_(0)
{}
//////////////////////////////////////////////////////////////
MathGridInset::MathGridInset(char v, string const & h)
: MathNestInset(guessColumns(h)),
rowinfo_(2),
colinfo_(guessColumns(h) + 1),
cellinfo_(1 * guessColumns(h))
: MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1)
{
setDefaults();
valign(v);
@ -119,11 +89,7 @@ MathGridInset::MathGridInset(char v, string const & h)
MathGridInset::MathGridInset()
: MathNestInset(1),
rowinfo_(1 + 1),
colinfo_(1 + 1),
cellinfo_(1),
v_align_('c')
: MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1), v_align_('c')
{
setDefaults();
}
@ -131,10 +97,7 @@ MathGridInset::MathGridInset()
MathGridInset::MathGridInset(col_type m, row_type n)
: MathNestInset(m * n),
rowinfo_(n + 1),
colinfo_(m + 1),
cellinfo_(m * n),
v_align_('c')
rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_('c')
{
setDefaults();
}
@ -142,10 +105,7 @@ 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 + 1),
colinfo_(m + 1),
cellinfo_(m * n),
v_align_(v)
rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_(v)
{
setDefaults();
valign(v);
@ -179,8 +139,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);
}
}
@ -189,13 +149,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())
break;
if (col == ncols())
addCol(ncols() - 1);
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 {
@ -213,29 +173,16 @@ void MathGridInset::halign(string const & hh)
}
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;
}
@ -244,7 +191,7 @@ 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 + string(colinfo_[ncols()].lines_, '|');
}
@ -659,8 +606,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);
}
@ -707,7 +654,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')

View File

@ -5,6 +5,7 @@
#include "math_nestinset.h"
#include "vspace.h"
#include "LString.h"
#include "math_gridinfo.h"
/** Gridded math inset base class.
@ -20,15 +21,8 @@ class MathGridInset : public MathNestInset {
public:
/// additional per-cell information
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
struct CellInfo : public ::CellInfo {
/// fixed glue
mutable int glue_;
///
mutable pos_type begin_;
@ -37,45 +31,45 @@ public:
};
/// additional per-row information
struct RowInfo {
struct RowInfo : public ::RowInfo {
///
RowInfo();
RowInfo()
: lines_(0), skip_(0)
{}
///
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 {
struct ColInfo : public ::ColInfo {
///
ColInfo();
/// currently possible: 'l', 'c', 'r'
char align_;
ColInfo()
: lines_(0), skip_(0)
{}
/// cache for drawing
int h_offset;
int lines_;
/// additional amount to be skipped on screen
int skip_;
/// 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:
@ -220,8 +214,6 @@ 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

@ -137,6 +137,9 @@ void parse_math(Parser & p, ostream & os, unsigned flags, const mode_type mode)
}
else if (t.cs() == "[") {
// special handling of a few common SW user quirks
p.skip_spaces();
//if (p.next_token().cs() ==
os << "\\[";
parse_math(p, os, FLAG_EQUATION, MATH_MODE);
os << "\\]";

View File

@ -23,44 +23,10 @@ using std::ostringstream;
using std::string;
using std::vector;
#include "mathed/math_gridinfo.h"
namespace {
struct ColInfo
{
ColInfo() : rightline(0), leftline(false) {}
string align; // column alignment
string width; // column width
int rightline; // a line on the right?
bool leftline;
};
struct RowInfo
{
RowInfo() : topline(false), bottomline(false) {}
bool topline; // horizontal line above
int bottomline; // horizontal line below
};
struct CellInfo
{
CellInfo()
: multi(0), leftline(false), rightline(false),
topline(false), bottomline(false)
{}
string content; // cell content
int multi; // multicolumn flag
string align; // cell alignment
bool leftline; // do we have a line on the left?
bool rightline; // do we have a line on the right?
bool topline; // do we have a line above?
bool bottomline; // do we have a line below?
};
int string2int(string const & s, int deflt = 0)
{
istringstream is(s);
@ -73,7 +39,7 @@ int string2int(string const & s, int deflt = 0)
string read_hlines(Parser & p)
{
ostringstream os;
p.skipSpaces();
p.skip_spaces();
while (p.good()) {
if (p.next_token().cs() == "hline") {
p.get_token();
@ -83,7 +49,7 @@ string read_hlines(Parser & p)
os << "\\cline{" << p.verbatim_item() << "}";
} else
break;
p.skipSpaces();
p.skip_spaces();
};
//cerr << "read_hlines(), read: '" << os.str() << "'\n";
//cerr << "read_hlines(), next token: " << p.next_token() << "\n";
@ -111,24 +77,13 @@ char const TAB = '\001';
char const LINE = '\002';
char const HLINE = '\004';
string get_align(char c)
{
switch (c) {
case 'c': return "center";
case 'l': return "left";
case 'r': return "right";
case 'b': return "block";
}
return "center";
}
void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
{
if (p.get_token().cat() != catBegin)
cerr << "wrong syntax for table column alignment. '{' expected\n";
string nextalign = "block";
char nextalign = 'b';
bool leftline = false;
for (Token t=p.get_token(); p.good() && t.cat() != catEnd; t = p.get_token()){
#ifdef FILEDEBUG
@ -140,7 +95,7 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
case 'l':
case 'r': {
ColInfo ci;
ci.align = get_align(t.character());
ci.align = t.character();
if (colinfo.size() && colinfo.back().rightline > 1) {
ci.leftline = true;
--colinfo.back().rightline;
@ -152,7 +107,7 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
colinfo.push_back(ColInfo());
colinfo.back().align = nextalign;
colinfo.back().width = p.verbatim_item();
nextalign = "block";
nextalign = 'b';
break;
case '|':
if (colinfo.empty())
@ -163,9 +118,9 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
case '>': {
string s = p.verbatim_item();
if (s == "\\raggedleft ")
nextalign = "left";
nextalign = 'l';
else if (s == "\\raggedright ")
nextalign = "right";
nextalign = 'r';
else
cerr << "unknown '>' column '" << s << "'\n";
break;
@ -242,7 +197,6 @@ void parse_table(Parser & p, ostream & os, unsigned flags)
}
else if (t.cs() == "tabularnewline" || t.cs() == "\\") {
//else if (t.cs() == "tabularnewline") {
// stuff before the line break
// and look ahead for stuff after the line break
os << HLINE << hlines << HLINE << LINE << read_hlines(p) << HLINE;
@ -414,7 +368,7 @@ void handle_tabular(Parser & p, ostream & os)
cell < cells.size() && col < colinfo.size(); ++col, ++cell) {
//cerr << "cell content: '" << cells[cell] << "'\n";
Parser p(cells[cell]);
p.skipSpaces();
p.skip_spaces();
//cells[cell] << "'\n";
if (p.next_token().cs() == "multicolumn") {
// how many cells?
@ -434,7 +388,7 @@ void handle_tabular(Parser & p, ostream & os)
for (size_t i = 0; i < ncells - 1 && col < colinfo.size(); ++i) {
++col;
cellinfo[row][col].multi = 2;
cellinfo[row][col].align = "center";
cellinfo[row][col].align = 'c';
}
// more than one line on the right?
@ -505,7 +459,7 @@ void handle_tabular(Parser & p, ostream & os)
// cerr << " topline=\"true\"";
//if (cell.bottomline)
// cerr << " bottomline=\"true\"";
os << " alignment=\"" << cell.align << "\""
os << " alignment=\"" << verbose_align(cell.align) << "\""
<< " valignment=\"top\""
<< " usebox=\"none\""
<< ">"

View File

@ -40,7 +40,7 @@ void handle_comment(Parser & p)
s += t.asString();
}
//cerr << "comment: " << s << "\n";
p.skipSpaces();
p.skip_spaces();
}

View File

@ -166,7 +166,7 @@ Token const & Parser::get_token()
}
void Parser::skipSpaces()
void Parser::skip_spaces()
{
while (1) {
if (next_token().cat() == catSpace || next_token().cat() == catNewline)
@ -202,7 +202,7 @@ char Parser::getChar()
string Parser::getArg(char left, char right)
{
skipSpaces();
skip_spaces();
string result;
char c = getChar();
@ -341,7 +341,7 @@ string Parser::verbatim_item()
{
if (!good())
error("stream bad");
skipSpaces();
skip_spaces();
if (next_token().cat() == catBegin) {
Token t = get_token(); // skip brace
string res;

View File

@ -128,7 +128,7 @@ public:
///
Token const & get_token();
/// skips spaces if any
void skipSpaces();
void skip_spaces();
///
void lex(string const & s);
///

View File

@ -332,7 +332,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
}
else if (t.cs() == "item") {
p.skipSpaces();
p.skip_spaces();
string s;
if (p.next_token().character() == '[') {
p.get_token(); // eat '['
@ -350,7 +350,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
}
else if (t.cs() == "par") {
p.skipSpaces();
p.skip_spaces();
if (p.next_token().cs() != "\\begin")
handle_par(os);
//cerr << "next token: '" << p.next_token().cs() << "'\n";