]> git.lyx.org Git - lyx.git/blobdiff - src/tabular.C
Scons: update_po target, part one: language_l10n.pot
[lyx.git] / src / tabular.C
index 9a25921ee9d830e51983133d31ca4cea9b26ccc2..1aaff8e3788de6be51ac1064135af0828375a511 100644 (file)
 
 #include <sstream>
 
-using lyx::docstring;
-using lyx::odocstream;
-using lyx::support::ltrim;
-using lyx::support::prefixIs;
-using lyx::support::rtrim;
-using lyx::support::suffixIs;
+
+namespace lyx {
+
+using support::prefixIs;
+using support::ltrim;
+using support::rtrim;
+using support::suffixIs;
 
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
@@ -83,6 +84,13 @@ string const write_attribute(string const & name, string const & t)
 }
 
 
+template <>
+string const write_attribute(string const & name, docstring const & t)
+{
+       return t.empty() ? string() : " " + name + "=\"" + to_utf8(t) + "\"";
+}
+
+
 template <>
 string const write_attribute(string const & name, bool const & b)
 {
@@ -249,6 +257,15 @@ bool getTokenValue(string const & str, char const * token, string & ret)
 }
 
 
+bool getTokenValue(string const & str, char const * token, docstring & ret)
+{
+       string tmp;
+       bool const success = getTokenValue(str, token, tmp);
+       ret = from_utf8(tmp);
+       return success;
+}
+
+
 bool getTokenValue(string const & str, char const * token, int & num)
 {
        string tmp;
@@ -498,9 +515,8 @@ void LyXTabular::appendRow(BufferParams const & bp, idx_type const cell)
                swap(cell_info[i], old[i - 1]);
 
        if (bp.trackChanges)
-               // FIXME: Change Tracking (MG)
                for (col_type j = 0; j < columns_; ++j)
-                       cell_info[row + 1][j].inset->markNew(true);
+                       cell_info[row + 1][j].inset->setChange(Change(Change::INSERTED));
 
        set_row_column_number_info();
 }
@@ -527,9 +543,8 @@ void LyXTabular::copyRow(BufferParams const & bp, row_type const row)
        cell_info.insert(cell_info.begin() + row, cell_info[row]);
 
        if (bp.trackChanges)
-               // FIXME: Change Tracking (MG)
                for (col_type j = 0; j < columns_; ++j)
-                       cell_info[row + 1][j].inset->markNew(true);
+                       cell_info[row + 1][j].inset->setChange(Change(Change::INSERTED));
 
        set_row_column_number_info();
 }
@@ -560,8 +575,7 @@ void LyXTabular::appendColumn(BufferParams const & bp, idx_type const cell)
        for (row_type i = 0; i < rows_; ++i) {
                cell_info[i][column + 1].inset->clear();
                if (bp.trackChanges)
-                       // FIXME: Change Tracking (MG)
-                       cell_info[i][column + 1].inset->markNew(true);
+                       cell_info[i][column + 1].inset->setChange(Change(Change::INSERTED));
        }
        fixCellNums();
 }
@@ -591,9 +605,8 @@ void LyXTabular::copyColumn(BufferParams const & bp, col_type const column)
                cell_info[i].insert(cell_info[i].begin() + column, cell_info[i][column]);
 
        if (bp.trackChanges)
-               // FIXME: Change Tracking (MG)
                for (row_type i = 0; i < rows_; ++i)
-                       cell_info[i][column + 1].inset->markNew(true);
+                       cell_info[i][column + 1].inset->setChange(Change(Change::INSERTED));
        fixCellNums();
 }
 
@@ -665,55 +678,55 @@ LyXTabular::idx_type LyXTabular::numberOfCellsInRow(idx_type const cell) const
 }
 
 
-bool LyXTabular::topLine(idx_type const cell, bool const onlycolumn) const
+bool LyXTabular::topLine(idx_type const cell, bool const wholerow) const
 {
-       if (!onlycolumn && isMultiColumn(cell) &&
+       if (!wholerow && isMultiColumn(cell) &&
            !(use_booktabs && row_of_cell(cell) == 0))
                return cellinfo_of_cell(cell).top_line;
        return row_info[row_of_cell(cell)].top_line;
 }
 
 
-bool LyXTabular::bottomLine(idx_type const cell, bool onlycolumn) const
+bool LyXTabular::bottomLine(idx_type const cell, bool wholerow) const
 {
-       if (!onlycolumn && isMultiColumn(cell) &&
+       if (!wholerow && isMultiColumn(cell) &&
            !(use_booktabs && isLastRow(cell)))
                return cellinfo_of_cell(cell).bottom_line;
        return row_info[row_of_cell(cell)].bottom_line;
 }
 
 
-bool LyXTabular::leftLine(idx_type cell, bool onlycolumn) const
+bool LyXTabular::leftLine(idx_type cell, bool wholecolumn) const
 {
        if (use_booktabs)
                return false;
-       if (!onlycolumn && isMultiColumn(cell) &&
+       if (!wholecolumn && isMultiColumn(cell) &&
                (isFirstCellInRow(cell) || isMultiColumn(cell-1)))
        {
                if (cellinfo_of_cell(cell).align_special.empty())
                        return cellinfo_of_cell(cell).left_line;
-               return prefixIs(ltrim(cellinfo_of_cell(cell).align_special), "|");
+               return prefixIs(ltrim(cellinfo_of_cell(cell).align_special), '|');
        }
        if (column_info[column_of_cell(cell)].align_special.empty())
                return column_info[column_of_cell(cell)].left_line;
-       return prefixIs(ltrim(column_info[column_of_cell(cell)].align_special), "|");
+       return prefixIs(ltrim(column_info[column_of_cell(cell)].align_special), '|');
 }
 
 
-bool LyXTabular::rightLine(idx_type cell, bool onlycolumn) const
+bool LyXTabular::rightLine(idx_type cell, bool wholecolumn) const
 {
        if (use_booktabs)
                return false;
-       if (!onlycolumn && isMultiColumn(cell) &&
+       if (!wholecolumn && isMultiColumn(cell) &&
                (isLastCellInRow(cell) || isMultiColumn(cell + 1)))
        {
                if (cellinfo_of_cell(cell).align_special.empty())
                        return cellinfo_of_cell(cell).right_line;
-               return suffixIs(rtrim(cellinfo_of_cell(cell).align_special), "|");
+               return suffixIs(rtrim(cellinfo_of_cell(cell).align_special), '|');
        }
        if (column_info[column_of_cell(cell)].align_special.empty())
                return column_info[right_column_of_cell(cell)].right_line;
-       return suffixIs(rtrim(column_info[column_of_cell(cell)].align_special), "|");
+       return suffixIs(rtrim(column_info[column_of_cell(cell)].align_special), '|');
 }
 
 
@@ -955,15 +968,14 @@ void toggleFixedWidth(LCursor & cur, InsetText * inset, bool fixedWidth)
                return;
 
        // merge all paragraphs to one
-       BufferParams const & bp =
-               inset->getText(0)->bv_owner->buffer()->params();
+       BufferParams const & bp = cur.bv().buffer()->params();
        while (inset->paragraphs().size() > 1)
                mergeParagraph(bp, inset->paragraphs(), 0);
 
        // reset layout
        cur.push(*inset);
        // undo information has already been recorded
-       inset->getText(0)->setLayout(0, cur.lastpit() + 1,
+       inset->getText(0)->setLayout(*cur.bv().buffer(), 0, cur.lastpit() + 1,
                        bp.getLyXTextClass().defaultLayoutName());
        cur.pop();
 }
@@ -1010,7 +1022,7 @@ bool LyXTabular::setMColumnPWidth(LCursor & cur, idx_type cell,
 }
 
 
-void LyXTabular::setAlignSpecial(idx_type cell, string const & special,
+void LyXTabular::setAlignSpecial(idx_type cell, docstring const & special,
                                 LyXTabular::Feature what)
 {
        if (what == SET_SPECIAL_MULTI)
@@ -1029,37 +1041,37 @@ void LyXTabular::setAllLines(idx_type cell, bool line)
 }
 
 
-void LyXTabular::setTopLine(idx_type cell, bool line, bool onlycolumn)
+void LyXTabular::setTopLine(idx_type cell, bool line, bool wholerow)
 {
        row_type const row = row_of_cell(cell);
-       if (onlycolumn || !isMultiColumn(cell))
+       if (wholerow || !isMultiColumn(cell))
                row_info[row].top_line = line;
        else
                cellinfo_of_cell(cell).top_line = line;
 }
 
 
-void LyXTabular::setBottomLine(idx_type cell, bool line, bool onlycolumn)
+void LyXTabular::setBottomLine(idx_type cell, bool line, bool wholerow)
 {
-       if (onlycolumn || !isMultiColumn(cell))
+       if (wholerow || !isMultiColumn(cell))
                row_info[row_of_cell(cell)].bottom_line = line;
        else
                cellinfo_of_cell(cell).bottom_line = line;
 }
 
 
-void LyXTabular::setLeftLine(idx_type cell, bool line, bool onlycolumn)
+void LyXTabular::setLeftLine(idx_type cell, bool line, bool wholecolumn)
 {
-       if (onlycolumn || !isMultiColumn(cell))
+       if (wholecolumn || !isMultiColumn(cell))
                column_info[column_of_cell(cell)].left_line = line;
        else
                cellinfo_of_cell(cell).left_line = line;
 }
 
 
-void LyXTabular::setRightLine(idx_type cell, bool line, bool onlycolumn)
+void LyXTabular::setRightLine(idx_type cell, bool line, bool wholecolumn)
 {
-       if (onlycolumn || !isMultiColumn(cell))
+       if (wholecolumn || !isMultiColumn(cell))
                column_info[right_column_of_cell(cell)].right_line = line;
        else
                cellinfo_of_cell(cell).right_line = line;
@@ -1105,7 +1117,7 @@ LyXLength const LyXTabular::getMColumnPWidth(idx_type cell) const
 }
 
 
-string const LyXTabular::getAlignSpecial(idx_type cell, int what) const
+docstring const LyXTabular::getAlignSpecial(idx_type cell, int what) const
 {
        if (what == SET_SPECIAL_MULTI)
                return cellinfo_of_cell(cell).align_special;
@@ -1911,8 +1923,7 @@ int LyXTabular::TeXCellPreamble(odocstream & os, idx_type cell) const
        if (isMultiColumn(cell)) {
                os << "\\multicolumn{" << cells_in_multicolumn(cell) << "}{";
                if (!cellinfo_of_cell(cell).align_special.empty()) {
-                       os << lyx::from_ascii(cellinfo_of_cell(cell).align_special)
-                          << "}{";
+                       os << cellinfo_of_cell(cell).align_special << "}{";
                } else {
                        if (leftLine(cell) &&
                                (isFirstCellInRow(cell) ||
@@ -1934,7 +1945,7 @@ int LyXTabular::TeXCellPreamble(odocstream & os, idx_type cell) const
                                        break;
                                }
                                os << '{'
-                                  << lyx::from_ascii(getPWidth(cell).asLatexString())
+                                  << from_ascii(getPWidth(cell).asLatexString())
                                   << '}';
                        } else {
                                switch (getAlignment(cell)) {
@@ -1970,7 +1981,7 @@ int LyXTabular::TeXCellPreamble(odocstream & os, idx_type cell) const
                        os << 'b';
                        break;
                }
-               os << "]{" << lyx::from_ascii(getPWidth(cell).asLatexString())
+               os << "]{" << from_ascii(getPWidth(cell).asLatexString())
                   << "}{";
        } else if (getUsebox(cell) == BOX_MINIPAGE) {
                os << "\\begin{minipage}[";
@@ -1985,7 +1996,7 @@ int LyXTabular::TeXCellPreamble(odocstream & os, idx_type cell) const
                        os << 'b';
                        break;
                }
-               os << "]{" << lyx::from_ascii(getPWidth(cell).asLatexString())
+               os << "]{" << from_ascii(getPWidth(cell).asLatexString())
                   << "}\n";
                ++ret;
        }
@@ -2125,14 +2136,15 @@ int LyXTabular::TeXRow(odocstream & os, row_type i, Buffer const & buf,
                        os << "\\addlinespace\n";
                else
                        os << "\\noalign{\\vskip\\doublerulesep}\n";
+               ++ret;
        } else if(!row_info[i].top_space.zero()) {
                if (use_booktabs)
                        os << "\\addlinespace["
-                          << lyx::from_ascii(row_info[i].top_space.asLatexString())
+                          << from_ascii(row_info[i].top_space.asLatexString())
                           << "]\n";
                else {
                        os << "\\noalign{\\vskip"
-                          << lyx::from_ascii(row_info[i].top_space.asLatexString())
+                          << from_ascii(row_info[i].top_space.asLatexString())
                           << "}\n";
                }
                ++ret;
@@ -2157,8 +2169,7 @@ int LyXTabular::TeXRow(odocstream & os, row_type i, Buffer const & buf,
 
                ret += TeXCellPostamble(os, cell);
                if (!isLastCellInRow(cell)) { // not last cell in row
-                       os << "&\n";
-                       ++ret;
+                       os << " & ";
                }
                ++cell;
        }
@@ -2172,7 +2183,7 @@ int LyXTabular::TeXRow(odocstream & os, row_type i, Buffer const & buf,
                if (use_booktabs)
                        os << "\\addlinespace";
                os << '['
-                  << lyx::from_ascii(row_info[i].bottom_space.asLatexString())
+                  << from_ascii(row_info[i].bottom_space.asLatexString())
                   << ']';
        }
        os << '\n';
@@ -2183,14 +2194,15 @@ int LyXTabular::TeXRow(odocstream & os, row_type i, Buffer const & buf,
                        os << "\\addlinespace\n";
                else
                        os << "\\noalign{\\vskip\\doublerulesep}\n";
+               ++ret;
        } else if (!row_info[i].interline_space.zero()) {
                if (use_booktabs)
                        os << "\\addlinespace["
-                          << lyx::from_ascii(row_info[i].interline_space.asLatexString())
+                          << from_ascii(row_info[i].interline_space.asLatexString())
                           << "]\n";
                else
                        os << "\\noalign{\\vskip"
-                          << lyx::from_ascii(row_info[i].interline_space.asLatexString())
+                          << from_ascii(row_info[i].interline_space.asLatexString())
                           << "}\n";
                ++ret;
        }
@@ -2217,7 +2229,7 @@ int LyXTabular::latex(Buffer const & buf, odocstream & os,
                os << "\\begin{tabular}{";
        for (col_type i = 0; i < columns_; ++i) {
                if (!column_info[i].align_special.empty()) {
-                       os << lyx::from_ascii(column_info[i].align_special);
+                       os << column_info[i].align_special;
                } else {
                        if (!use_booktabs && column_info[i].left_line)
                                os << '|';
@@ -2251,7 +2263,7 @@ int LyXTabular::latex(Buffer const & buf, odocstream & os,
                                        break;
                        }
                                os << '{'
-                                  << lyx::from_ascii(column_info[i].p_width.asLatexString())
+                                  << from_ascii(column_info[i].p_width.asLatexString())
                                   << '}';
                        } else {
                                switch (column_info[i].alignment) {
@@ -2306,7 +2318,7 @@ int LyXTabular::latex(Buffer const & buf, odocstream & os,
 }
 
 
-int LyXTabular::docbookRow(Buffer const & buf, ostream & os, row_type row,
+int LyXTabular::docbookRow(Buffer const & buf, odocstream & os, row_type row,
                           OutputParams const & runparams) const
 {
        int ret = 0;
@@ -2358,7 +2370,7 @@ int LyXTabular::docbookRow(Buffer const & buf, ostream & os, row_type row,
 }
 
 
-int LyXTabular::docbook(Buffer const & buf, ostream & os,
+int LyXTabular::docbook(Buffer const & buf, odocstream & os,
                        OutputParams const & runparams) const
 {
        int ret = 0;
@@ -2443,8 +2455,8 @@ int LyXTabular::docbook(Buffer const & buf, ostream & os,
 }
 
 
-int LyXTabular::asciiTopHLine(lyx::odocstream & os, row_type row,
-                             vector<unsigned int> const & clen) const
+bool LyXTabular::plaintextTopHLine(odocstream & os, row_type row,
+                                   vector<unsigned int> const & clen) const
 {
        idx_type const fcell = getFirstCellInRow(row);
        idx_type const n = numberOfCellsInRow(fcell) + fcell;
@@ -2457,9 +2469,9 @@ int LyXTabular::asciiTopHLine(lyx::odocstream & os, row_type row,
                }
        }
        if (!tmp)
-               return 0;
+               return false;
 
-       lyx::char_type ch;
+       char_type ch;
        for (idx_type i = fcell; i < n; ++i) {
                if (topLine(i)) {
                        if (leftLine(i))
@@ -2487,12 +2499,12 @@ int LyXTabular::asciiTopHLine(lyx::odocstream & os, row_type row,
                }
        }
        os << endl;
-       return 1;
+       return true;
 }
 
 
-int LyXTabular::asciiBottomHLine(lyx::odocstream & os, row_type row,
-                                vector<unsigned int> const & clen) const
+bool LyXTabular::plaintextBottomHLine(odocstream & os, row_type row,
+                                      vector<unsigned int> const & clen) const
 {
        idx_type const fcell = getFirstCellInRow(row);
        idx_type const n = numberOfCellsInRow(fcell) + fcell;
@@ -2505,9 +2517,9 @@ int LyXTabular::asciiBottomHLine(lyx::odocstream & os, row_type row,
                }
        }
        if (!tmp)
-               return 0;
+               return false;
 
-       lyx::char_type ch;
+       char_type ch;
        for (idx_type i = fcell; i < n; ++i) {
                if (bottomLine(i)) {
                        if (leftLine(i))
@@ -2535,22 +2547,22 @@ int LyXTabular::asciiBottomHLine(lyx::odocstream & os, row_type row,
                }
        }
        os << endl;
-       return 1;
+       return true;
 }
 
 
-int LyXTabular::asciiPrintCell(Buffer const & buf, lyx::odocstream & os,
+void LyXTabular::plaintextPrintCell(Buffer const & buf, odocstream & os,
                               OutputParams const & runparams,
                               idx_type cell, row_type row, col_type column,
                               vector<unsigned int> const & clen,
                               bool onlydata) const
 {
-       lyx::odocstringstream sstr;
-       int const ret = getCellInset(cell)->plaintext(buf, sstr, runparams);
+       odocstringstream sstr;
+       getCellInset(cell)->plaintext(buf, sstr, runparams);
 
        if (onlydata) {
                os << sstr.str();
-               return ret;
+               return;
        }
 
        if (leftLine(cell))
@@ -2587,18 +2599,13 @@ int LyXTabular::asciiPrintCell(Buffer const & buf, lyx::odocstream & os,
                os << " |";
        else
                os << "  ";
-
-       return ret;
 }
 
 
-int LyXTabular::plaintext(Buffer const & buf, lyx::odocstream & os,
-                     OutputParams const & runparams,
-                     int const depth,
-                     bool onlydata, unsigned char delim) const
+void LyXTabular::plaintext(Buffer const & buf, odocstream & os,
+                           OutputParams const & runparams, int const depth,
+                           bool onlydata, unsigned char delim) const
 {
-       int ret = 0;
-
        // first calculate the width of the single columns
        vector<unsigned int> clen(columns_);
 
@@ -2610,7 +2617,7 @@ int LyXTabular::plaintext(Buffer const & buf, lyx::odocstream & os,
                                idx_type cell = getCellNumber(i, j);
                                if (isMultiColumnReal(cell))
                                        continue;
-                               lyx::odocstringstream sstr;
+                               odocstringstream sstr;
                                getCellInset(cell)->plaintext(buf, sstr, runparams);
                                if (clen[j] < sstr.str().length())
                                        clen[j] = sstr.str().length();
@@ -2622,7 +2629,7 @@ int LyXTabular::plaintext(Buffer const & buf, lyx::odocstream & os,
                                idx_type cell = getCellNumber(i, j);
                                if (!isMultiColumnReal(cell) || isPartOfMultiColumn(i, j))
                                        continue;
-                               lyx::odocstringstream sstr;
+                               odocstringstream sstr;
                                getCellInset(cell)->plaintext(buf, sstr, runparams);
                                int len = int(sstr.str().length());
                                idx_type const n = cells_in_multicolumn(cell);
@@ -2635,25 +2642,24 @@ int LyXTabular::plaintext(Buffer const & buf, lyx::odocstream & os,
        }
        idx_type cell = 0;
        for (row_type i = 0; i < rows_; ++i) {
-               if (!onlydata && asciiTopHLine(os, i, clen))
+               if (!onlydata && plaintextTopHLine(os, i, clen))
                        os << docstring(depth * 2, ' ');
                for (col_type j = 0; j < columns_; ++j) {
                        if (isPartOfMultiColumn(i, j))
                                continue;
                        if (onlydata && j > 0)
                                os << delim;
-                       ret += asciiPrintCell(buf, os, runparams,
-                                             cell, i, j, clen, onlydata);
+                       plaintextPrintCell(buf, os, runparams,
+                                          cell, i, j, clen, onlydata);
                        ++cell;
                }
                os << endl;
                if (!onlydata) {
                        os << docstring(depth * 2, ' ');
-                       if (asciiBottomHLine(os, i, clen))
+                       if (plaintextBottomHLine(os, i, clen))
                                os << docstring(depth * 2, ' ');
                }
        }
-       return ret;
 }
 
 
@@ -2733,3 +2739,6 @@ LyXTabular::BoxType LyXTabular::useParbox(idx_type cell) const
 
        return BOX_NONE;
 }
+
+
+} // namespace lyx