mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-30 15:41:12 +00:00
Last fixes for old-table-format-read, fixes in display of text-insets and
in setting latex-features. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@741 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
e9159aa5c9
commit
102d2eaa29
18
ChangeLog
18
ChangeLog
@ -1,3 +1,21 @@
|
|||||||
|
2000-05-19 Juergen Vigna <jug@sad.it>
|
||||||
|
|
||||||
|
* src/tabular.C (Validate): fixed/added validating of LaTeXFeatures.
|
||||||
|
|
||||||
|
* src/insets/insettext.C (computeTextRows): small fix for display of
|
||||||
|
1 character after a newline.
|
||||||
|
|
||||||
|
* src/tabular.C (OldFormatRead): fixed the OldFormatRead with regard
|
||||||
|
to cont-rows!
|
||||||
|
|
||||||
|
2000-05-18 Juergen Vigna <jug@sad.it>
|
||||||
|
|
||||||
|
* src/insets/insettabular.C (TabularFeatures): fixed update of display
|
||||||
|
when changing width of column.
|
||||||
|
|
||||||
|
* src/tabular.C (set_row_column_number_info): setting of
|
||||||
|
autobreak rows if necessary.
|
||||||
|
|
||||||
2000-05-17 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
|
2000-05-17 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
|
||||||
|
|
||||||
* src/lyxvc.C (toggleReadOnly): use VCS::status() instead of stat()
|
* src/lyxvc.C (toggleReadOnly): use VCS::status() instead of stat()
|
||||||
|
@ -229,6 +229,7 @@ void Buffer::fileName(string const & newfile)
|
|||||||
// else insert behavior
|
// else insert behavior
|
||||||
// Returns false if "\the_end" is not read for formats >= 2.13. (Asger)
|
// Returns false if "\the_end" is not read for formats >= 2.13. (Asger)
|
||||||
#define USE_PARSE_FUNCTION 1
|
#define USE_PARSE_FUNCTION 1
|
||||||
|
#define USE_TABULAR_INSETS 1
|
||||||
bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
|
bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
|
||||||
{
|
{
|
||||||
string tmptok;
|
string tmptok;
|
||||||
|
@ -642,8 +642,7 @@ int InsetTabular::DocBook(ostream &) const
|
|||||||
|
|
||||||
void InsetTabular::Validate(LaTeXFeatures & features) const
|
void InsetTabular::Validate(LaTeXFeatures & features) const
|
||||||
{
|
{
|
||||||
if (tabular->IsLongTabular())
|
tabular->Validate(features);
|
||||||
features.longtable = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -926,9 +925,9 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
|
|||||||
switch (feature) {
|
switch (feature) {
|
||||||
case LyXTabular::SET_PWIDTH:
|
case LyXTabular::SET_PWIDTH:
|
||||||
{
|
{
|
||||||
bool update = tabular->GetPWidth(actcell).empty();
|
bool update = (tabular->GetPWidth(actcell) != val);
|
||||||
tabular->SetPWidth(actcell,val);
|
tabular->SetPWidth(actcell,val);
|
||||||
if (tabular->GetPWidth(actcell).empty() != update)
|
if (update)
|
||||||
UpdateLocal(bv, true);
|
UpdateLocal(bv, true);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1327,9 +1327,9 @@ void InsetText::computeTextRows(Painter & pain) const
|
|||||||
if (par->IsNewline(p)) {
|
if (par->IsNewline(p)) {
|
||||||
rows.back().asc = wordAscent;
|
rows.back().asc = wordAscent;
|
||||||
rows.back().desc = wordDescent;
|
rows.back().desc = wordDescent;
|
||||||
row.pos = ++p;
|
row.pos = p+1;
|
||||||
rows.push_back(row);
|
rows.push_back(row);
|
||||||
nwp = p;
|
nwp = p+1;
|
||||||
width = lastWordWidth = 0;
|
width = lastWordWidth = 0;
|
||||||
oasc = odesc = wordAscent = wordDescent = 0;
|
oasc = odesc = wordAscent = wordDescent = 0;
|
||||||
is_first_word_in_row = true;
|
is_first_word_in_row = true;
|
||||||
|
514
src/tabular.C
514
src/tabular.C
@ -23,6 +23,9 @@
|
|||||||
#include "layout.h"
|
#include "layout.h"
|
||||||
#include "lyx_gui_misc.h"
|
#include "lyx_gui_misc.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
#include "BufferView.h"
|
||||||
|
#include "Painter.h"
|
||||||
|
#include "LaTeXFeatures.h"
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "support/lyxmanip.h"
|
#include "support/lyxmanip.h"
|
||||||
#include "insets/insettabular.h"
|
#include "insets/insettabular.h"
|
||||||
@ -263,33 +266,12 @@ void LyXTabular::AppendRow(int /* cell */)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LyXTabular::DeleteRow(int /*cell*/)
|
void LyXTabular::DeleteRow(int row)
|
||||||
{
|
{
|
||||||
#if 0
|
row_info.erase(&row_info[row]);
|
||||||
int row = row_of_cell(cell);
|
cell_info.erase(&cell_info[row]);
|
||||||
rowstruct * row_info2 = new rowstruct[rows_ - 1];
|
|
||||||
cellstruct ** cell_info2 = new cellstruct * [rows_ - 1];
|
|
||||||
|
|
||||||
delete[] cell_info[row];
|
|
||||||
int i = 0;
|
|
||||||
for (; i < row; ++i) {
|
|
||||||
cell_info2[i] = cell_info[i];
|
|
||||||
row_info2[i] = row_info[i];
|
|
||||||
}
|
|
||||||
for (i = row; i < rows_ - 1; ++i) {
|
|
||||||
cell_info2[i] = cell_info[i + 1];
|
|
||||||
row_info2[i] = row_info[i + 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
delete[] cell_info;
|
|
||||||
cell_info = cell_info2;
|
|
||||||
delete[] row_info;
|
|
||||||
row_info = row_info2;
|
|
||||||
|
|
||||||
--rows_;
|
--rows_;
|
||||||
|
|
||||||
Reinit();
|
Reinit();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -451,6 +433,14 @@ void LyXTabular::set_row_column_number_info()
|
|||||||
++row;
|
++row;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (row = 0; row < rows_; ++row) {
|
||||||
|
for (column = 0; column<columns_; ++column) {
|
||||||
|
if (IsPartOfMultiColumn(row,column))
|
||||||
|
continue;
|
||||||
|
cell_info[row][column].inset->SetAutoBreakRows(
|
||||||
|
!GetPWidth(GetCellNumber(row, column)).empty());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1164,9 +1154,6 @@ void LyXTabular::Read(LyXLex & lex)
|
|||||||
(void)getTokenValue(line, "rotate", cell_info[i][j].rotate);
|
(void)getTokenValue(line, "rotate", cell_info[i][j].rotate);
|
||||||
(void)getTokenValue(line, "linebreaks", cell_info[i][j].linebreaks);
|
(void)getTokenValue(line, "linebreaks", cell_info[i][j].linebreaks);
|
||||||
(void)getTokenValue(line, "width", cell_info[i][j].p_width);
|
(void)getTokenValue(line, "width", cell_info[i][j].p_width);
|
||||||
if (!(cell_info[i][j].p_width.empty() &&
|
|
||||||
column_info[j].p_width.empty()))
|
|
||||||
cell_info[i][j].inset->SetAutoBreakRows(true);
|
|
||||||
(void)getTokenValue(line, "special", cell_info[i][j].align_special);
|
(void)getTokenValue(line, "special", cell_info[i][j].align_special);
|
||||||
l_getline(is, line);
|
l_getline(is, line);
|
||||||
if (prefixIs(line, "\\begin_inset")) {
|
if (prefixIs(line, "\\begin_inset")) {
|
||||||
@ -1223,7 +1210,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
else
|
else
|
||||||
version = 1;
|
version = 1;
|
||||||
|
|
||||||
//int * cont_row_info; // unused
|
vector<int> cont_row_info;
|
||||||
|
|
||||||
if (version < 5) {
|
if (version < 5) {
|
||||||
lyxerr << "Tabular format < 5 is not supported anymore\n"
|
lyxerr << "Tabular format < 5 is not supported anymore\n"
|
||||||
@ -1238,11 +1225,13 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
} else
|
} else
|
||||||
is >> rows_arg >> columns_arg;
|
is >> rows_arg >> columns_arg;
|
||||||
Init(rows_arg, columns_arg);
|
Init(rows_arg, columns_arg);
|
||||||
|
cont_row_info = vector<int>(rows_arg);
|
||||||
SetLongTabular(is_long_tabular_arg);
|
SetLongTabular(is_long_tabular_arg);
|
||||||
SetRotateTabular(rotate_arg);
|
SetRotateTabular(rotate_arg);
|
||||||
string tmp;
|
string tmp;
|
||||||
for (i = 0; i < rows_; ++i) {
|
for (i = 0; i < rows_; ++i) {
|
||||||
getline(is, tmp);
|
getline(is, tmp);
|
||||||
|
cont_row_info[i] = false;
|
||||||
}
|
}
|
||||||
for (i = 0; i < columns_; ++i) {
|
for (i = 0; i < columns_; ++i) {
|
||||||
getline(is, tmp);
|
getline(is, tmp);
|
||||||
@ -1256,6 +1245,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
is >> rows_arg >> columns_arg >> is_long_tabular_arg
|
is >> rows_arg >> columns_arg >> is_long_tabular_arg
|
||||||
>> rotate_arg >> a >> b >> c >> d;
|
>> rotate_arg >> a >> b >> c >> d;
|
||||||
Init(rows_arg, columns_arg);
|
Init(rows_arg, columns_arg);
|
||||||
|
cont_row_info = vector<int>(rows_arg);
|
||||||
SetLongTabular(is_long_tabular_arg);
|
SetLongTabular(is_long_tabular_arg);
|
||||||
SetRotateTabular(rotate_arg);
|
SetRotateTabular(rotate_arg);
|
||||||
endhead = a;
|
endhead = a;
|
||||||
@ -1267,7 +1257,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
is >> a >> b >> c >> d;
|
is >> a >> b >> c >> d;
|
||||||
row_info[i].top_line = a;
|
row_info[i].top_line = a;
|
||||||
row_info[i].bottom_line = b;
|
row_info[i].bottom_line = b;
|
||||||
// row_info[i].is_cont_row = c;
|
cont_row_info[i] = c;
|
||||||
row_info[i].newpage = d;
|
row_info[i].newpage = d;
|
||||||
}
|
}
|
||||||
for (i = 0; i < columns_; ++i) {
|
for (i = 0; i < columns_; ++i) {
|
||||||
@ -1299,7 +1289,6 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
cell_info[i][j].alignment = static_cast<char>(b);
|
cell_info[i][j].alignment = static_cast<char>(b);
|
||||||
cell_info[i][j].top_line = static_cast<char>(c);
|
cell_info[i][j].top_line = static_cast<char>(c);
|
||||||
cell_info[i][j].bottom_line = static_cast<char>(d);
|
cell_info[i][j].bottom_line = static_cast<char>(d);
|
||||||
// cell_info[i][j].has_cont_row = static_cast<bool>(e);
|
|
||||||
cell_info[i][j].rotate = static_cast<bool>(f);
|
cell_info[i][j].rotate = static_cast<bool>(f);
|
||||||
cell_info[i][j].linebreaks = static_cast<bool>(g);
|
cell_info[i][j].linebreaks = static_cast<bool>(g);
|
||||||
cell_info[i][j].align_special = s1;
|
cell_info[i][j].align_special = s1;
|
||||||
@ -1308,6 +1297,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
set_row_column_number_info();
|
set_row_column_number_info();
|
||||||
|
|
||||||
LyXParagraph * par = new LyXParagraph;
|
LyXParagraph * par = new LyXParagraph;
|
||||||
LyXParagraph * return_par = 0;
|
LyXParagraph * return_par = 0;
|
||||||
LyXParagraph::footnote_flag footnoteflag = LyXParagraph::NO_FOOTNOTE;
|
LyXParagraph::footnote_flag footnoteflag = LyXParagraph::NO_FOOTNOTE;
|
||||||
@ -1315,7 +1305,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
string token, tmptok;
|
string token, tmptok;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
char depth = 0;
|
char depth = 0;
|
||||||
LyXFont font(LyXFont::ALL_INHERIT);
|
LyXFont font(LyXFont::ALL_SANE);
|
||||||
|
|
||||||
while (lex.IsOK()) {
|
while (lex.IsOK()) {
|
||||||
lex.nextToken();
|
lex.nextToken();
|
||||||
@ -1348,6 +1338,7 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
// now we have the par we should fill the insets with this!
|
// now we have the par we should fill the insets with this!
|
||||||
int cell = 0;
|
int cell = 0;
|
||||||
InsetText *inset = GetCellInset(cell);
|
InsetText *inset = GetCellInset(cell);
|
||||||
|
int row;
|
||||||
|
|
||||||
for(int i=0; i < par->Last(); ++i) {
|
for(int i=0; i < par->Last(); ++i) {
|
||||||
if (par->IsNewline(i)) {
|
if (par->IsNewline(i)) {
|
||||||
@ -1358,446 +1349,31 @@ void LyXTabular::OldFormatRead(LyXLex & lex, string const & fl)
|
|||||||
endl;
|
endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
row = row_of_cell(cell);
|
||||||
|
if (cont_row_info[row]) {
|
||||||
|
DeleteRow(row);
|
||||||
|
cont_row_info.erase(&cont_row_info[row]);
|
||||||
|
while(!IsFirstCellInRow(--cell));
|
||||||
|
} else {
|
||||||
inset = GetCellInset(cell);
|
inset = GetCellInset(cell);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
inset = GetCellInset(cell);
|
||||||
|
row = row_of_cell(cell);
|
||||||
|
if (!cell_info[row_of_cell(cell)][column_of_cell(cell)].linebreaks)
|
||||||
|
{
|
||||||
|
// insert a space instead
|
||||||
|
par->Erase(i);
|
||||||
|
par->InsertChar(i, ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
par->CopyIntoMinibuffer(i);
|
par->CopyIntoMinibuffer(i);
|
||||||
inset->par->InsertFromMinibuffer(inset->par->Last());
|
inset->par->InsertFromMinibuffer(inset->par->Last());
|
||||||
}
|
}
|
||||||
|
Reinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// cell < 0 will tex the preamble
|
|
||||||
// returns the number of printed newlines
|
|
||||||
int LyXTabular::TexEndOfCell(ostream & os, int cell) const
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int ret = 0;
|
|
||||||
int tmp; // tmp2;
|
|
||||||
int fcell, nvcell;
|
|
||||||
if (IsLastCell(cell)) {
|
|
||||||
// the very end at the very beginning
|
|
||||||
if (GetLinebreaks(cell))
|
|
||||||
os << "\\smallskip{}}";
|
|
||||||
if (IsMultiColumn(cell))
|
|
||||||
os << '}';
|
|
||||||
if (GetRotateCell(cell)) {
|
|
||||||
os << "\n\\end{sideways}";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
os << "\\\\\n";
|
|
||||||
++ret;
|
|
||||||
|
|
||||||
tmp = 0;
|
|
||||||
fcell = cell;
|
|
||||||
while (!IsFirstCellInRow(fcell)) --fcell;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(fcell); ++i) {
|
|
||||||
if (BottomLine(fcell + i))
|
|
||||||
++tmp;
|
|
||||||
}
|
|
||||||
if (tmp == NumberOfCellsInRow(fcell)) {
|
|
||||||
os << "\\hline ";
|
|
||||||
} else {
|
|
||||||
tmp = 0;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(fcell); ++i) {
|
|
||||||
if (BottomLine(fcell + i)) {
|
|
||||||
os << "\\cline{"
|
|
||||||
<< column_of_cell(fcell + i) + 1
|
|
||||||
<< '-'
|
|
||||||
<< right_column_of_cell(fcell + i) + 1
|
|
||||||
<< "} ";
|
|
||||||
tmp = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tmp){
|
|
||||||
os << '\n';
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
if (is_long_tabular)
|
|
||||||
os << "\\end{longtable}";
|
|
||||||
else
|
|
||||||
os << "\\end{tabular}";
|
|
||||||
if (rotate) {
|
|
||||||
os << "\n\\end{sideways}";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
nvcell = cell + 1;
|
|
||||||
if (cell < 0){
|
|
||||||
// preamble
|
|
||||||
if (rotate) {
|
|
||||||
os << "\\begin{sideways}\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
if (is_long_tabular)
|
|
||||||
os << "\\begin{longtable}{";
|
|
||||||
else
|
|
||||||
os << "\\begin{tabular}{";
|
|
||||||
for (i = 0; i < columns_; ++i) {
|
|
||||||
if (column_info[i].left_line)
|
|
||||||
os << '|';
|
|
||||||
if (!column_info[i].align_special.empty()) {
|
|
||||||
os << column_info[i].align_special;
|
|
||||||
} else if (!column_info[i].p_width.empty()) {
|
|
||||||
os << "p{"
|
|
||||||
<< column_info[i].p_width
|
|
||||||
<< '}';
|
|
||||||
} else {
|
|
||||||
switch (column_info[i].alignment) {
|
|
||||||
case LYX_ALIGN_LEFT:
|
|
||||||
os << 'l';
|
|
||||||
break;
|
|
||||||
case LYX_ALIGN_RIGHT:
|
|
||||||
os << 'r';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
os << 'c';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (column_info[i].right_line)
|
|
||||||
os << '|';
|
|
||||||
}
|
|
||||||
os << "}\n";
|
|
||||||
++ret;
|
|
||||||
tmp = 0;
|
|
||||||
if (GetNumberOfCells()) {
|
|
||||||
fcell = 0;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(fcell); ++i) {
|
|
||||||
if (TopLine(fcell + i))
|
|
||||||
++tmp;
|
|
||||||
}
|
|
||||||
if (tmp == NumberOfCellsInRow(fcell)){
|
|
||||||
os << "\\hline ";
|
|
||||||
} else {
|
|
||||||
tmp = 0;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(fcell); ++i) {
|
|
||||||
if (TopLine(fcell + i)) {
|
|
||||||
os << "\\cline{"
|
|
||||||
<< column_of_cell(fcell + i) + 1
|
|
||||||
<< '-'
|
|
||||||
<< right_column_of_cell(fcell + i) + 1
|
|
||||||
<< "} ";
|
|
||||||
tmp = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tmp){
|
|
||||||
os << '\n';
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (GetRotateCell(0)) {
|
|
||||||
os << "\\begin{sideways}\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// usual cells
|
|
||||||
if (GetLinebreaks(cell))
|
|
||||||
os << "\\smallskip{}}";
|
|
||||||
if (IsMultiColumn(cell)){
|
|
||||||
os << '}';
|
|
||||||
}
|
|
||||||
if (GetRotateCell(cell)) {
|
|
||||||
os << "\n\\end{sideways}";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
if (IsLastCellInRow(cell)) {
|
|
||||||
int row = row_of_cell(cell);
|
|
||||||
string hline1, hline2;
|
|
||||||
bool print_hline = true;
|
|
||||||
bool flag1 = IsLongTabular() &&
|
|
||||||
((row == endhead) || (row == endfirsthead) ||
|
|
||||||
(row == endfoot) || (row == endlastfoot));
|
|
||||||
++row;
|
|
||||||
bool flag2 = IsLongTabular() &&
|
|
||||||
((row <= endhead) || (row <= endfirsthead) ||
|
|
||||||
(row <= endfoot) || (row <= endlastfoot));
|
|
||||||
--row;
|
|
||||||
// print the bottom hline only if (otherwise it is doubled):
|
|
||||||
// - is no LongTabular
|
|
||||||
// - there IS a first-header
|
|
||||||
// - the next row is no special header/footer
|
|
||||||
// & this row is no special header/footer
|
|
||||||
// - the next row is a special header/footer
|
|
||||||
// & this row is a special header/footer
|
|
||||||
bool pr_top_hline = (flag1 && flag2) || (!flag1 && !flag2) ||
|
|
||||||
(endfirsthead == endhead);
|
|
||||||
os << "\\\\\n";
|
|
||||||
++ret;
|
|
||||||
tmp = 0;
|
|
||||||
fcell = cell;
|
|
||||||
while (!IsFirstCellInRow(fcell))
|
|
||||||
--fcell;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(cell); ++i) {
|
|
||||||
if (BottomLine(fcell + i))
|
|
||||||
++tmp;
|
|
||||||
}
|
|
||||||
if (tmp == NumberOfCellsInRow(cell)){
|
|
||||||
os << "\\hline ";
|
|
||||||
hline1 = "\\hline ";
|
|
||||||
} else {
|
|
||||||
tmp = 0;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(fcell); ++i) {
|
|
||||||
if (BottomLine(fcell + i)){
|
|
||||||
os << "\\cline{"
|
|
||||||
<< column_of_cell(fcell + i) + 1
|
|
||||||
<< '-'
|
|
||||||
<< right_column_of_cell(fcell + i) + 1
|
|
||||||
<< "} ";
|
|
||||||
hline1 += "\\cline{";
|
|
||||||
hline1 += tostr(column_of_cell(fcell + i) + 1);
|
|
||||||
hline1 += '-';
|
|
||||||
hline1 += tostr(right_column_of_cell(fcell + i) + 1);
|
|
||||||
hline1 += "} ";
|
|
||||||
tmp = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tmp){
|
|
||||||
os << '\n';
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
if (IsLongTabular() && (row == endfoot)) {
|
|
||||||
os << "\\endfoot\n";
|
|
||||||
++ret;
|
|
||||||
print_hline = false; // no double line below footer
|
|
||||||
}
|
|
||||||
if (IsLongTabular() && (row == endlastfoot)) {
|
|
||||||
os << "\\endlastfoot\n";
|
|
||||||
++ret;
|
|
||||||
print_hline = false; // no double line below footer
|
|
||||||
}
|
|
||||||
if (IsLongTabular() && row_info[row].newpage) {
|
|
||||||
os << "\\newpage\n";
|
|
||||||
++ret;
|
|
||||||
print_hline = false; // no line below a \\newpage-command
|
|
||||||
}
|
|
||||||
tmp = 0;
|
|
||||||
if ((nvcell < numberofcells) &&
|
|
||||||
(cell < GetNumberOfCells() - 1) && !IsLastCell(cell)) {
|
|
||||||
fcell = nvcell;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(fcell); ++i) {
|
|
||||||
if (TopLine(fcell + i))
|
|
||||||
++tmp;
|
|
||||||
}
|
|
||||||
if (tmp == NumberOfCellsInRow(fcell)) {
|
|
||||||
if (print_hline)
|
|
||||||
os << "\\hline ";
|
|
||||||
hline2 = "\\hline ";
|
|
||||||
} else {
|
|
||||||
tmp = 0;
|
|
||||||
for (i = 0; i < NumberOfCellsInRow(fcell); ++i) {
|
|
||||||
if (TopLine(fcell + i)) {
|
|
||||||
if (print_hline) {
|
|
||||||
os << "\\cline{"
|
|
||||||
<< column_of_cell(fcell + i) + 1
|
|
||||||
<< '-'
|
|
||||||
<< right_column_of_cell(fcell + i) + 1
|
|
||||||
<< "} ";
|
|
||||||
}
|
|
||||||
hline2 += "\\cline{";
|
|
||||||
hline2 += tostr(column_of_cell(fcell+i)+1);
|
|
||||||
hline2 += '-';
|
|
||||||
hline2 += tostr(right_column_of_cell(fcell+i)+1);
|
|
||||||
hline2 += "} ";
|
|
||||||
tmp = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tmp && print_hline){
|
|
||||||
os << '\n';
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// the order here is important as if one defines two
|
|
||||||
// or more things in one line only the first entry is
|
|
||||||
// displayed the other are set to an empty-row. This
|
|
||||||
// is important if I have a footer and want that the
|
|
||||||
// lastfooter is NOT displayed!!!
|
|
||||||
bool sflag2 = (row == endhead) || (row == endfirsthead) ||
|
|
||||||
(row == endfoot) || (row == endlastfoot);
|
|
||||||
--row;
|
|
||||||
row += 2;
|
|
||||||
bool sflag1 = IsLongTabular() && (row != endhead) &&
|
|
||||||
(row != endfirsthead) &&
|
|
||||||
((row == endfoot) || (row == endlastfoot));
|
|
||||||
--row;
|
|
||||||
if (IsLongTabular() && (row == endhead)) {
|
|
||||||
os << "\\endhead\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
if (IsLongTabular() && (row == endfirsthead)) {
|
|
||||||
os << "\\endfirsthead\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
if (sflag1) { // add the \hline for next foot row
|
|
||||||
if (!hline1.empty()) {
|
|
||||||
os << hline1 + '\n';
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// add the \hline for the first row
|
|
||||||
if (pr_top_hline && sflag2) {
|
|
||||||
if (!hline2.empty()) {
|
|
||||||
os << hline2 + '\n';
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nvcell < numberofcells && GetRotateCell(nvcell)) {
|
|
||||||
os << "\\begin{sideways}\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
os << "&\n";
|
|
||||||
++ret;
|
|
||||||
if (nvcell < numberofcells && GetRotateCell(nvcell)) {
|
|
||||||
os << "\\begin{sideways}\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nvcell < numberofcells && IsMultiColumn(nvcell)) {
|
|
||||||
os << "\\multicolumn{"
|
|
||||||
<< cells_in_multicolumn(nvcell)
|
|
||||||
<< "}{";
|
|
||||||
if (!cellinfo_of_cell(cell+1)->align_special.empty()) {
|
|
||||||
os << cellinfo_of_cell(cell+1)->align_special
|
|
||||||
<< "}{";
|
|
||||||
} else {
|
|
||||||
if (LeftLine(nvcell))
|
|
||||||
os << '|';
|
|
||||||
if (!GetPWidth(nvcell).empty()) {
|
|
||||||
os << "p{"
|
|
||||||
<< GetPWidth(nvcell)
|
|
||||||
<< '}';
|
|
||||||
} else {
|
|
||||||
switch (GetAlignment(nvcell)) {
|
|
||||||
case LYX_ALIGN_LEFT: os << 'l'; break;
|
|
||||||
case LYX_ALIGN_RIGHT: os << 'r'; break;
|
|
||||||
default: os << 'c'; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (RightLine(nvcell))
|
|
||||||
os << '|';
|
|
||||||
//if (column_of_cell(cell+2)!= 0 && LeftLine(cell+2))
|
|
||||||
if (((nvcell + 1) < numberofcells) &&
|
|
||||||
((nvcell+1) < numberofcells) &&
|
|
||||||
(column_of_cell(nvcell+1)!= 0) &&
|
|
||||||
LeftLine(nvcell+1))
|
|
||||||
os << '|';
|
|
||||||
|
|
||||||
os << "}{";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nvcell < numberofcells && GetLinebreaks(nvcell)) {
|
|
||||||
os << "\\parbox[t]{"
|
|
||||||
<< GetPWidth(nvcell)
|
|
||||||
<< "}{\\smallskip{}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// cell <0 will tex the preamble
|
|
||||||
// returns the number of printed newlines
|
|
||||||
int LyXTabular::RoffEndOfCell(ostream & os, int cell)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (cell == GetNumberOfCells() - 1){
|
|
||||||
// the very end at the very beginning
|
|
||||||
// if (CellHasContRow(cell) >= 0) {
|
|
||||||
// os << "\nT}";
|
|
||||||
// ++ret;
|
|
||||||
// }
|
|
||||||
os << "\n";
|
|
||||||
++ret;
|
|
||||||
if (row_info[row_of_cell(cell)].bottom_line) {
|
|
||||||
os << "_\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
os << ".TE\n.pl 1c";
|
|
||||||
} else {
|
|
||||||
if (cell < 0) {
|
|
||||||
int fcell = 0;
|
|
||||||
// preamble
|
|
||||||
os << "\n.pl 500c\n.TS\n";
|
|
||||||
for (int j = 0; j < rows_; ++j) {
|
|
||||||
for (int i = 0; i < columns_; ++i, ++fcell) {
|
|
||||||
if (column_info[i].left_line)
|
|
||||||
os << " | ";
|
|
||||||
if (cell_info[j][i].multicolumn == CELL_PART_OF_MULTICOLUMN)
|
|
||||||
os << "s";
|
|
||||||
else {
|
|
||||||
switch (column_info[i].alignment) {
|
|
||||||
case LYX_ALIGN_LEFT:
|
|
||||||
os << "l";
|
|
||||||
break;
|
|
||||||
case LYX_ALIGN_RIGHT:
|
|
||||||
os << "r";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
os << "c";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!column_info[i].p_width.empty())
|
|
||||||
os << "w(" << column_info[i].p_width << ")";
|
|
||||||
if (column_info[i].right_line)
|
|
||||||
os << " | ";
|
|
||||||
}
|
|
||||||
if ((j + 1) < rows_) {
|
|
||||||
os << "\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
os << ".\n";
|
|
||||||
++ret;
|
|
||||||
if (row_info[0].top_line) {
|
|
||||||
os << "_\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
// if (CellHasContRow(0) >= 0) {
|
|
||||||
// os << "T{\n";
|
|
||||||
// ++ret;
|
|
||||||
// }
|
|
||||||
} else {
|
|
||||||
// usual cells
|
|
||||||
// if (CellHasContRow(cell) >= 0) {
|
|
||||||
// os << "\nT}";
|
|
||||||
// ++ret;
|
|
||||||
// }
|
|
||||||
if (right_column_of_cell(cell) == columns_ -1){
|
|
||||||
os << "\n";
|
|
||||||
++ret;
|
|
||||||
int row = row_of_cell(cell);
|
|
||||||
if (row_info[row++].bottom_line) {
|
|
||||||
os << "_\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
if ((row < rows_) && row_info[row].top_line) {
|
|
||||||
os << "_\n";
|
|
||||||
++ret;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
os << "\t";
|
|
||||||
// if ((cell < GetNumberOfCells() - 1) &&
|
|
||||||
// (CellHasContRow(cell+1) >= 0)) {
|
|
||||||
// os << "T{\n";
|
|
||||||
// ++ret;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
char const * LyXTabular::GetDocBookAlign(int cell, bool isColumn) const
|
char const * LyXTabular::GetDocBookAlign(int cell, bool isColumn) const
|
||||||
{
|
{
|
||||||
int i = isColumn ? cell : column_of_cell(cell);
|
int i = isColumn ? cell : column_of_cell(cell);
|
||||||
@ -1996,8 +1572,6 @@ void LyXTabular::SetMultiColumn(int cell, int number)
|
|||||||
}
|
}
|
||||||
set_row_column_number_info();
|
set_row_column_number_info();
|
||||||
SetWidthOfCell(cell, new_width);
|
SetWidthOfCell(cell, new_width);
|
||||||
if (GetPWidth(cell).empty())
|
|
||||||
GetCellInset(cell)->SetAutoBreakRows(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2037,8 +1611,6 @@ int LyXTabular::UnsetMultiColumn(int cell)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
set_row_column_number_info();
|
set_row_column_number_info();
|
||||||
if (GetPWidth(cell).empty())
|
|
||||||
GetCellInset(cell)->SetAutoBreakRows(false);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2507,3 +2079,13 @@ InsetText * LyXTabular::GetCellInset(int cell) const
|
|||||||
{
|
{
|
||||||
return cell_info[row_of_cell(cell)][column_of_cell(cell)].inset;
|
return cell_info[row_of_cell(cell)][column_of_cell(cell)].inset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LyXTabular::Validate(LaTeXFeatures & features) const
|
||||||
|
{
|
||||||
|
if (IsLongTabular())
|
||||||
|
features.longtable = true;
|
||||||
|
if (NeedRotating())
|
||||||
|
features.rotating = true;
|
||||||
|
for(int cell = 0; cell < numberofcells; ++cell)
|
||||||
|
GetCellInset(cell)->Validate(features);
|
||||||
|
}
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
class InsetTabular;
|
class InsetTabular;
|
||||||
class InsetText;
|
class InsetText;
|
||||||
|
class LaTeXFeatures;
|
||||||
|
|
||||||
/* The features the text class offers for tables */
|
/* The features the text class offers for tables */
|
||||||
|
|
||||||
@ -257,6 +258,8 @@ public:
|
|||||||
int columns() const { return columns_;}
|
int columns() const { return columns_;}
|
||||||
///
|
///
|
||||||
InsetTabular * owner() const { return owner_; }
|
InsetTabular * owner() const { return owner_; }
|
||||||
|
///
|
||||||
|
void Validate(LaTeXFeatures &) const;
|
||||||
|
|
||||||
private: //////////////////////////////////////////////////////////////////
|
private: //////////////////////////////////////////////////////////////////
|
||||||
///
|
///
|
||||||
|
Loading…
Reference in New Issue
Block a user