row_vector::iterator rit = row_info.begin() + row;
row_info.insert(rit, rowstruct());
+ // now set the values of the row before
+ row_info[row] = row_info[row+1];
#if 0
cell_vvector::iterator cit = cell_info.begin() + row;
int const column = column_of_cell(cell);
column_vector::iterator cit = column_info.begin() + column + 1;
column_info.insert(cit, columnstruct());
+ // set the column values of the column before
+ column_info[column+1] = column_info[column];
for (int i = 0; i < rows_; ++i) {
for (int j = 0; j <= column; ++j) {
#endif
+template<>
+inline
+string const tostr(LyXAlignment const & num)
+{
+ switch(num) {
+ case LYX_ALIGN_NONE:
+ return "none";
+ case LYX_ALIGN_BLOCK:
+ return "block";
+ case LYX_ALIGN_LEFT:
+ return "left";
+ case LYX_ALIGN_CENTER:
+ return "center";
+ case LYX_ALIGN_RIGHT:
+ return "right";
+ case LYX_ALIGN_LAYOUT:
+ return "layout";
+ case LYX_ALIGN_SPECIAL:
+ return "special";
+ }
+ return string();
+}
+
+
+template<>
+inline
+string const tostr(LyXTabular::VAlignment const & num)
+{
+ switch(num) {
+ case LyXTabular::LYX_VALIGN_TOP:
+ return "top";
+ case LyXTabular::LYX_VALIGN_CENTER:
+ return "center";
+ case LyXTabular::LYX_VALIGN_BOTTOM:
+ return "bottom";
+ }
+ return string();
+}
+
+
+template<>
+inline
+string const tostr(LyXTabular::BoxType const & num)
+{
+ switch(num) {
+ case LyXTabular::BOX_NONE:
+ return "none";
+ case LyXTabular::BOX_PARBOX:
+ return "parbox";
+ case LyXTabular::BOX_MINIPAGE:
+ return "minipage";
+ }
+ return string();
+}
+
+
void LyXTabular::Write(Buffer const * buf, ostream & os) const
{
// header line
- os << "<LyXTabular"
- << write_attribute("version", 1)
+ os << "<lyxtabular"
+ << write_attribute("version", 2)
<< write_attribute("rows", rows_)
<< write_attribute("columns", columns_)
<< ">\n";
// global longtable options
- os << "<Features"
- << write_attribute("rotate", rotate)
- << write_attribute("islongtable", is_long_tabular)
+ os << "<features"
+ << write_attribute("rotate", tostr(rotate))
+ << write_attribute("islongtable", tostr(is_long_tabular))
<< write_attribute("endhead", endhead)
<< write_attribute("endfirsthead", endfirsthead)
<< write_attribute("endfoot", endfoot)
<< write_attribute("endlastfoot", endlastfoot)
- << ">\n\n";
+ << ">\n";
+ for (int j = 0; j < columns_; ++j) {
+ os << "<column"
+ << write_attribute("alignment", tostr(column_info[j].alignment))
+ << write_attribute("valignment", tostr(column_info[j].valignment))
+ << write_attribute("leftline", tostr(column_info[j].left_line))
+ << write_attribute("rightline", tostr(column_info[j].right_line))
+ << write_attribute("width",
+ VSpace(column_info[j].p_width)
+ .asLyXCommand())
+ << write_attribute("special", column_info[j].align_special)
+ << ">\n";
+ }
for (int i = 0; i < rows_; ++i) {
- os << "<Row"
- << write_attribute("topline", row_info[i].top_line)
- << write_attribute("bottomline", row_info[i].bottom_line)
- << write_attribute("newpage", row_info[i].newpage)
+ os << "<row"
+ << write_attribute("topline", tostr(row_info[i].top_line))
+ << write_attribute("bottomline", tostr(row_info[i].bottom_line))
+ << write_attribute("newpage", tostr(row_info[i].newpage))
<< ">\n";
for (int j = 0; j < columns_; ++j) {
+#if 0
if (!i) {
- os << "<Column"
- << write_attribute("alignment", column_info[j].alignment)
- << write_attribute("valignment", column_info[j].valignment)
- << write_attribute("leftline", column_info[j].left_line)
- << write_attribute("rightline", column_info[j].right_line)
+ os << "<column"
+ << write_attribute("alignment", tostr(column_info[j].alignment))
+ << write_attribute("valignment", tostr(column_info[j].valignment))
+ << write_attribute("leftline", tostr(column_info[j].left_line))
+ << write_attribute("rightline", tostr(column_info[j].right_line))
<< write_attribute("width",
VSpace(column_info[j].p_width)
.asLyXCommand())
<< write_attribute("special", column_info[j].align_special)
<< ">\n";
} else {
- os << "<Column>\n";
+ os << "<column>\n";
}
- os << "<Cell"
+#endif
+ os << "<cell"
<< write_attribute("multicolumn", cell_info[i][j].multicolumn)
- << write_attribute("alignment", cell_info[i][j].alignment)
- << write_attribute("valignment", cell_info[i][j].valignment)
- << write_attribute("topline", cell_info[i][j].top_line)
- << write_attribute("bottomline", cell_info[i][j].bottom_line)
- << write_attribute("leftline", cell_info[i][j].left_line)
- << write_attribute("rightline", cell_info[i][j].right_line)
- << write_attribute("rotate", cell_info[i][j].rotate)
- << write_attribute("usebox", cell_info[i][j].usebox)
+ << write_attribute("alignment", tostr(cell_info[i][j].alignment))
+ << write_attribute("valignment", tostr(cell_info[i][j].valignment))
+ << write_attribute("topline", tostr(cell_info[i][j].top_line))
+ << write_attribute("bottomline", tostr(cell_info[i][j].bottom_line))
+ << write_attribute("leftline", tostr(cell_info[i][j].left_line))
+ << write_attribute("rightline", tostr(cell_info[i][j].right_line))
+ << write_attribute("rotate", tostr(cell_info[i][j].rotate))
+ << write_attribute("usebox", tostr(cell_info[i][j].usebox))
<< write_attribute("width", cell_info[i][j].p_width)
<< write_attribute("special", cell_info[i][j].align_special)
<< ">\n";
os << "\\begin_inset ";
cell_info[i][j].inset.Write(buf, os);
os << "\n\\end_inset \n"
- << "</Cell>\n"
- << "</Column>\n";
+ << "</cell>\n";
+#if 0
+ << "</column>\n";
+#endif
}
- os << "</Row>\n";
+ os << "</row>\n";
}
- os << "</LyXTabular>\n";
+ os << "</lyxtabular>\n";
+}
+
+
+// I would have liked a fromstr template a lot better. (Lgb)
+
+static inline
+bool string2type(string const str, LyXAlignment & num)
+{
+ if (str == "none")
+ num = LYX_ALIGN_NONE;
+ else if (str == "block")
+ num = LYX_ALIGN_BLOCK;
+ else if (str == "left")
+ num = LYX_ALIGN_LEFT;
+ else if (str == "center")
+ num = LYX_ALIGN_CENTER;
+ else if (str == "right")
+ num = LYX_ALIGN_RIGHT;
+ else
+ return false;
+ return true;
+}
+
+
+static inline
+bool string2type(string const str, LyXTabular::VAlignment & num)
+{
+ if (str == "top")
+ num = LyXTabular::LYX_VALIGN_TOP;
+ else if (str == "center")
+ num = LyXTabular::LYX_VALIGN_CENTER;
+ else if (str == "bottom")
+ num = LyXTabular::LYX_VALIGN_BOTTOM;
+ else
+ return false;
+ return true;
+}
+
+
+static inline
+bool string2type(string const str, LyXTabular::BoxType & num)
+{
+ if (str == "none")
+ num = LyXTabular::BOX_NONE;
+ else if (str == "parbox")
+ num = LyXTabular::BOX_PARBOX;
+ else if (str == "minipage")
+ num = LyXTabular::BOX_MINIPAGE;
+ else
+ return false;
+ return true;
+}
+
+
+static inline
+bool string2type(string const str, bool & num)
+{
+ if (str == "true")
+ num = true;
+ else if (str == "false")
+ num = false;
+ else
+ return false;
+ return true;
}
static
bool getTokenValue(string const & str, const char * token, string & ret)
{
+ size_t token_length = strlen(token);
string::size_type pos = str.find(token);
- char ch = str[pos + strlen(token)];
- if ((pos == string::npos) || (ch != '='))
+ if (pos == string::npos || pos+token_length+1 >= str.length()
+ || str[pos+token_length] != '=')
return false;
ret.erase();
- pos += strlen(token) + 1;
- ch = str[pos];
+ pos += token_length + 1;
+ char ch = str[pos];
if ((ch != '"') && (ch != '\'')) { // only read till next space
ret += ch;
ch = ' ';
static
bool getTokenValue(string const & str, const char * token, int & num)
{
- string::size_type pos = str.find(token);
- char ch = str[pos + strlen(token)];
-
- if ((pos == string::npos) || (ch != '='))
+ string tmp;
+ if (!getTokenValue(str, token, tmp))
return false;
- string ret;
- pos += strlen(token) + 1;
- ch = str[pos];
- if ((ch != '"') && (ch != '\'')) { // only read till next space
- if (!isdigit(ch))
- return false;
- ret += ch;
- }
- ++pos;
- while((pos < str.length() - 1) && isdigit(str[pos]))
- ret += str[pos++];
-
- num = strToInt(ret);
+ num = strToInt(tmp);
return true;
}
static
bool getTokenValue(string const & str, const char * token, LyXAlignment & num)
{
- int tmp;
- bool const ret = getTokenValue(str, token, tmp);
- num = static_cast<LyXAlignment>(tmp);
- return ret;
+ string tmp;
+ if (!getTokenValue(str, token, tmp))
+ return false;
+ return string2type(tmp, num);
}
bool getTokenValue(string const & str, const char * token,
LyXTabular::VAlignment & num)
{
- int tmp;
- bool const ret = getTokenValue(str, token, tmp);
- num = static_cast<LyXTabular::VAlignment>(tmp);
- return ret;
+ string tmp;
+ if (!getTokenValue(str, token, tmp))
+ return false;
+ return string2type(tmp, num);
}
bool getTokenValue(string const & str, const char * token,
LyXTabular::BoxType & num)
{
- int tmp;
- bool ret = getTokenValue(str, token, tmp);
- num = static_cast<LyXTabular::BoxType>(tmp);
- return ret;
+ string tmp;
+ if (!getTokenValue(str, token, tmp))
+ return false;
+ return string2type(tmp, num);
}
static
bool getTokenValue(string const & str, const char * token, bool & flag)
{
- string::size_type pos = str.find(token);
- char ch = str[pos + strlen(token)];
-
- if ((pos == string::npos) || (ch != '='))
+ string tmp;
+ if (!getTokenValue(str, token, tmp))
return false;
- string ret;
- pos += strlen(token) + 1;
- ch = str[pos];
- if ((ch != '"') && (ch != '\'')) { // only read till next space
- if (!isdigit(ch))
- return false;
- ret += ch;
- }
- ++pos;
- while((pos < str.length() - 1) && isdigit(str[pos]))
- ret += str[pos++];
-
- flag = strToInt(ret);
- return true;
-}
+ return string2type(tmp, flag);
+}
static inline
void LyXTabular::Read(Buffer const * buf, LyXLex & lex)
{
- string line;
- istream & is = lex.getStream();
+ string line;
+ istream & is = lex.getStream();
- l_getline(is, line);
- if (!prefixIs(line, "<LyXTabular ")) {
- OldFormatRead(lex, line);
- return;
- }
+ l_getline(is, line);
+ if (!prefixIs(line, "<lyxtabular ")
+ && !prefixIs(line, "<LyXTabular ")) {
+ OldFormatRead(lex, line);
+ return;
+ }
- int version;
+ int version;
+ if (!getTokenValue(line, "version", version))
+ return;
+ if (version == 1)
+ ReadOld(buf, is, lex, line);
+ else if (version == 2)
+ ReadNew(buf, is, lex, line);
+}
+
+
+void LyXTabular::ReadNew(Buffer const * buf, istream & is,
+ LyXLex & lex, string const & l)
+{
+ string line(l);
int rows_arg;
- int columns_arg;
- if (!getTokenValue(line, "version", version))
- return;
if (!getTokenValue(line, "rows", rows_arg))
return;
+ int columns_arg;
if (!getTokenValue(line, "columns", columns_arg))
return;
Init(rows_arg, columns_arg);
l_getline(is, line);
- if (!prefixIs(line, "<Features ")) {
- lyxerr << "Wrong tabular format (expected <Feture ...> got" <<
+ if (!prefixIs(line, "<features")) {
+ lyxerr << "Wrong tabular format (expected <features ...> got" <<
line << ")" << endl;
return;
}
+ getTokenValue(line, "rotate", rotate);
getTokenValue(line, "islongtable", is_long_tabular);
getTokenValue(line, "endhead", endhead);
getTokenValue(line, "endfirsthead", endfirsthead);
getTokenValue(line, "endfoot", endfoot);
getTokenValue(line, "endlastfoot", endlastfoot);
+ for (int j = 0; j < columns_; ++j) {
+ l_getline(is,line);
+ if (!prefixIs(line,"<column")) {
+ lyxerr << "Wrong tabular format (expected <column ...> got" <<
+ line << ")" << endl;
+ return;
+ }
+ getTokenValue(line, "alignment", column_info[j].alignment);
+ getTokenValue(line, "valignment", column_info[j].valignment);
+ getTokenValue(line, "leftline", column_info[j].left_line);
+ getTokenValue(line, "rightline", column_info[j].right_line);
+ getTokenValue(line, "width", column_info[j].p_width);
+ getTokenValue(line, "special", column_info[j].align_special);
+ }
+
for (int i = 0; i < rows_; ++i) {
l_getline(is, line);
- if (!prefixIs(line, "<Row ")) {
- lyxerr << "Wrong tabular format (expected <Row ...> got" <<
+ if (!prefixIs(line, "<row")) {
+ lyxerr << "Wrong tabular format (expected <row ...> got" <<
line << ")" << endl;
return;
}
getTokenValue(line, "bottomline", row_info[i].bottom_line);
getTokenValue(line, "newpage", row_info[i].newpage);
for (int j = 0; j < columns_; ++j) {
- l_getline(is,line);
- if (!prefixIs(line,"<Column")) {
- lyxerr << "Wrong tabular format (expected <Column ...> got" <<
- line << ")" << endl;
- return;
- }
- if (!i) {
- getTokenValue(line, "alignment", column_info[j].alignment);
- getTokenValue(line, "valignment", column_info[j].valignment);
- getTokenValue(line, "leftline", column_info[j].left_line);
- getTokenValue(line, "rightline", column_info[j].right_line);
- getTokenValue(line, "width", column_info[j].p_width);
- getTokenValue(line, "special", column_info[j].align_special);
- }
l_getline(is, line);
- if (!prefixIs(line, "<Cell")) {
- lyxerr << "Wrong tabular format (expected <Cell ...> got" <<
+ if (!prefixIs(line, "<cell")) {
+ lyxerr << "Wrong tabular format (expected <cell ...> got" <<
line << ")" << endl;
return;
}
cell_info[i][j].inset.Read(buf, lex);
l_getline(is, line);
}
- if (line != "</Cell>") {
- lyxerr << "Wrong tabular format (expected </Cell> got" <<
- line << ")" << endl;
- return;
- }
- l_getline(is, line);
- if (line != "</Column>") {
- lyxerr << "Wrong tabular format (expected </Column> got" <<
+ if (line != "</cell>") {
+ lyxerr << "Wrong tabular format (expected </cell> got" <<
line << ")" << endl;
return;
}
}
l_getline(is, line);
- if (line != "</Row>") {
- lyxerr << "Wrong tabular format (expected </Row> got" <<
+ if (line != "</row>") {
+ lyxerr << "Wrong tabular format (expected </row> got" <<
line << ")" << endl;
return;
}
}
- while (line != "</LyXTabular>") {
+ while (line != "</lyxtabular>") {
l_getline(is, line);
}
set_row_column_number_info();
void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
{
int version;
- int i, j;
+ int i;
+ int j;
int rows_arg = 0;
int columns_arg = 0;
int is_long_tabular_arg = false;
cont_row_info = vector<int>(rows_arg);
SetLongTabular(is_long_tabular_arg);
SetRotateTabular(rotate_arg);
- endhead = a;
- endfirsthead = b;
- endfoot = c;
- endlastfoot = d;
+ endhead = a + 1;
+ endfirsthead = b + 1;
+ endfoot = c + 1;
+ endlastfoot = d + 1;
for (i = 0; i < rows_; ++i) {
a = b = c = d = e = f = g = 0;
is >> a >> b >> c >> d;
string tmptok;
int pos = 0;
char depth = 0;
- LyXFont font(LyXFont::ALL_SANE);
+ LyXFont font(LyXFont::ALL_INHERIT);
font.setLanguage(owner_->BufferOwner()->GetLanguage());
while (lex.IsOK()) {
int LyXTabular::TeXTopHLine(ostream & os, int row) const
{
+ if ((row < 0) || (row >= rows_))
+ return 0;
+
int const fcell = GetFirstCellInRow(row);
int const n = NumberOfCellsInRow(fcell) + fcell;
int tmp = 0;
int LyXTabular::TeXBottomHLine(ostream & os, int row) const
{
+ if ((row < 0) || (row >= rows_))
+ return 0;
+
int const fcell = GetFirstCellInRow(row);
int const n = NumberOfCellsInRow(fcell) + fcell;
int tmp = 0;
//+ the single row and columns (cells) +
//+---------------------------------------------------------------------
- //int bret;
for (int i = 0; i < rows_; ++i) {
ret += TeXTopHLine(os, i);
int bret = ret;
}
}
if (ret > bret) {
- if (i > 0)
- ret += TeXBottomHLine(os, i-1);
+ ret += TeXBottomHLine(os, i-1);
ret += TeXTopHLine(os, i);
}
for (int j = 0; j < columns_; ++j) {
if (IsPartOfMultiColumn(i,j))
continue;
ret += TeXCellPreamble(os, cell);
- ret += GetCellInset(cell)->Latex(buf, os, fragile, fp);
+ InsetText * inset = GetCellInset(cell);
+
+ bool rtl = inset->par->isRightToLeftPar(buf->params) &&
+ inset->par->Last() > 0 && GetPWidth(cell).empty();
+ if (rtl)
+ os << "\\R{";
+ ret += inset->Latex(buf, os, fragile, fp);
+ if (rtl)
+ os << "}";
+
ret += TeXCellPostamble(os, cell);
if (!IsLastCellInRow(cell)) { // not last cell in row
os << "&\n";
os << "\\endlastfoot\n";
++ret;
}
- if (ret > bret)
- ret += TeXBottomHLine(os, i);
+// if (ret > bret)
+// ret += TeXBottomHLine(os, i);
if (row_info[i].newpage) {
os << "\\newpage\n";
++ret;
else
os << " ";
- return ret * 0; // eh? (Lgb)
+ return ret;
}
}
+InsetText * LyXTabular::GetCellInset(int row, int column) const
+{
+ return GetCellInset(GetCellNumber(row, column));
+}
+
+
void LyXTabular::Validate(LaTeXFeatures & features) const
{
if (IsLongTabular())