]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Remove all BufferParam arguments in InsetXXX methods (since insets know about their...
[lyx.git] / src / insets / InsetTabular.cpp
index 93381ca6ce8a85d6590d98c3d4541afcae20551f..05b8f199a2b5ea35824506c77e3db707df27d6e8 100644 (file)
@@ -163,6 +163,9 @@ TabularFeature tabularFeature[] =
        { Tabular::TABULAR_VALIGN_TOP, "tabular-valign-top"},
        { Tabular::TABULAR_VALIGN_MIDDLE, "tabular-valign-middle"},
        { Tabular::TABULAR_VALIGN_BOTTOM, "tabular-valign-bottom"},
+       { Tabular::LONGTABULAR_ALIGN_LEFT, "longtabular-align-left" },
+       { Tabular::LONGTABULAR_ALIGN_CENTER, "longtabular-align-center" },
+       { Tabular::LONGTABULAR_ALIGN_RIGHT, "longtabular-align-right" },        
        { Tabular::LAST_ACTION, "" }
 };
 
@@ -257,6 +260,20 @@ string const tostr(LyXAlignment const & num)
 }
 
 
+string const tostr(Tabular::HAlignment const & num)
+{
+       switch (num) {
+       case Tabular::LYX_LONGTABULAR_ALIGN_LEFT:
+               return "left";
+       case Tabular::LYX_LONGTABULAR_ALIGN_CENTER:
+               return "center";
+       case Tabular::LYX_LONGTABULAR_ALIGN_RIGHT:
+               return "right";
+       }
+       return string();
+}
+
+
 string const tostr(Tabular::VAlignment const & num)
 {
        switch (num) {
@@ -304,6 +321,20 @@ bool string2type(string const str, LyXAlignment & num)
 }
 
 
+bool string2type(string const str, Tabular::HAlignment & num)
+{
+       if (str == "left")
+               num = Tabular::LYX_LONGTABULAR_ALIGN_LEFT;
+       else if (str == "center" )
+               num = Tabular::LYX_LONGTABULAR_ALIGN_CENTER;
+       else if (str == "right")
+               num = Tabular::LYX_LONGTABULAR_ALIGN_RIGHT;
+       else
+               return false;
+       return true;
+}
+
+
 bool string2type(string const str, Tabular::VAlignment & num)
 {
        if (str == "top")
@@ -393,6 +424,14 @@ bool getTokenValue(string const & str, char const * token, LyXAlignment & num)
 }
 
 
+bool getTokenValue(string const & str, char const * token,
+                                  Tabular::HAlignment & num)
+{
+       string tmp;
+       return getTokenValue(str, token, tmp) && string2type(tmp, num);
+}
+
+
 bool getTokenValue(string const & str, char const * token,
                                   Tabular::VAlignment & num)
 {
@@ -598,6 +637,7 @@ void Tabular::init(Buffer & buf, row_type rows_arg,
        updateIndexes();
        is_long_tabular = false;
        tabular_valignment = LYX_VALIGN_MIDDLE;
+       longtabular_alignment = LYX_LONGTABULAR_ALIGN_CENTER;
        rotate = false;
        use_booktabs = false;
        size_t row_count = row_info.size();
@@ -1287,7 +1327,6 @@ void Tabular::write(ostream & os) const
           << write_attribute("rotate", rotate)
           << write_attribute("booktabs", use_booktabs)
           << write_attribute("islongtable", is_long_tabular)
-          << write_attribute("tabularvalignment", tabular_valignment)
           << write_attribute("firstHeadTopDL", endfirsthead.topDL)
           << write_attribute("firstHeadBottomDL", endfirsthead.bottomDL)
           << write_attribute("firstHeadEmpty", endfirsthead.empty)
@@ -1297,8 +1336,14 @@ void Tabular::write(ostream & os) const
           << write_attribute("footBottomDL", endfoot.bottomDL)
           << write_attribute("lastFootTopDL", endlastfoot.topDL)
           << write_attribute("lastFootBottomDL", endlastfoot.bottomDL)
-          << write_attribute("lastFootEmpty", endlastfoot.empty)
-          << ">\n";
+          << write_attribute("lastFootEmpty", endlastfoot.empty);
+       // longtables cannot be aligned vertically
+       if (!is_long_tabular)
+          os << write_attribute("tabularvalignment", tabular_valignment);
+       if (is_long_tabular)
+          os << write_attribute("longtabularalignment",
+                                longtabular_alignment);
+       os << ">\n";
        for (col_type j = 0; j < column_info.size(); ++j) {
                os << "<column"
                   << write_attribute("alignment", column_info[j].alignment)
@@ -1387,6 +1432,7 @@ void Tabular::read(Lexer & lex)
        getTokenValue(line, "booktabs", use_booktabs);
        getTokenValue(line, "islongtable", is_long_tabular);
        getTokenValue(line, "tabularvalignment", tabular_valignment);
+       getTokenValue(line, "longtabularalignment", longtabular_alignment);
        getTokenValue(line, "firstHeadTopDL", endfirsthead.topDL);
        getTokenValue(line, "firstHeadBottomDL", endfirsthead.bottomDL);
        getTokenValue(line, "firstHeadEmpty", endfirsthead.empty);
@@ -2086,7 +2132,7 @@ int Tabular::TeXLongtableHeaderFooter(odocstream & os,
 
        int ret = 0;
        // caption handling
-       // the caption must be output befrore the headers
+       // the caption must be output before the headers
        if (haveLTCaption()) {
                for (row_type i = 0; i < row_info.size(); ++i) {
                        if (row_info[i].caption) {
@@ -2261,7 +2307,13 @@ int Tabular::TeXRow(odocstream & os, row_type i,
                }
                ++cell;
        }
-       os << "\\tabularnewline";
+       if (row_info[i].caption && !endfirsthead.empty && !haveLTFirstHead())
+               // if no first header and no empty first header is used,
+               // the caption needs to be terminated by \endfirsthead
+               // (bug 6057)
+               os << "\\endfirsthead";
+       else
+               os << "\\tabularnewline";
        if (row_info[i].bottom_space_default) {
                if (use_booktabs)
                        os << "\\addlinespace";
@@ -2313,20 +2365,30 @@ int Tabular::latex(odocstream & os, OutputParams const & runparams) const
                os << "\\begin{sideways}\n";
                ++ret;
        }
-       if (is_long_tabular)
+       if (is_long_tabular) {
                os << "\\begin{longtable}";
-       else
+               switch (longtabular_alignment) {
+               case LYX_LONGTABULAR_ALIGN_LEFT:
+                       os << "[l]";
+                       break;
+               case LYX_LONGTABULAR_ALIGN_CENTER:
+                       break;
+               case LYX_LONGTABULAR_ALIGN_RIGHT:
+                       os << "[r]";
+                       break;
+               }
+       } else {
                os << "\\begin{tabular}";
-
-       switch (tabular_valignment) {
+               switch (tabular_valignment) {
                case LYX_VALIGN_TOP:
                        os << "[t]";
                        break;
+               case LYX_VALIGN_MIDDLE:
+                       break;
                case LYX_VALIGN_BOTTOM:
                        os << "[b]";
                        break;
-               case LYX_VALIGN_MIDDLE:
-                       break;
+               }
        }
        
        os << "{";
@@ -3083,7 +3145,7 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
        BufferView * bv = pi.base.bv;
        Cursor & cur = pi.base.bv->cursor();
 
-       // FIXME: As the full backrgound is painted in drawSelection(),
+       // FIXME: As the full background is painted in drawSelection(),
        // we have no choice but to do a full repaint for the Text cells.
        pi.full_repaint = true;
 
@@ -3647,8 +3709,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                if (cur.selIsMultiCell()) {
                        cur.recordUndoInset(DELETE_UNDO);
                        cutSelection(cur);
-               }
-               else
+               } else
                        cell(cur.idx())->dispatch(cur, cmd);
                break;
 
@@ -3915,6 +3976,19 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                                == Tabular::LYX_VALIGN_BOTTOM);
                        break;
 
+               case Tabular::LONGTABULAR_ALIGN_LEFT:
+                       status.setOnOff(tabular.longtabular_alignment 
+                               == Tabular::LYX_LONGTABULAR_ALIGN_LEFT);
+                       break;
+               case Tabular::LONGTABULAR_ALIGN_CENTER:
+                       status.setOnOff(tabular.longtabular_alignment 
+                               == Tabular::LYX_LONGTABULAR_ALIGN_CENTER);
+                       break;
+               case Tabular::LONGTABULAR_ALIGN_RIGHT:
+                       status.setOnOff(tabular.longtabular_alignment 
+                               == Tabular::LYX_LONGTABULAR_ALIGN_RIGHT);
+                       break;
+
                case Tabular::UNSET_ROTATE_TABULAR:
                        status.setOnOff(!tabular.rotate);
                        break;
@@ -4091,6 +4165,24 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
 }
 
 
+Inset::DisplayType InsetTabular::display() const
+{
+               if (tabular.is_long_tabular) {
+                       switch (tabular.longtabular_alignment) {
+                       case Tabular::LYX_LONGTABULAR_ALIGN_LEFT:
+                               return AlignLeft;
+                       case Tabular::LYX_LONGTABULAR_ALIGN_CENTER:
+                               return AlignCenter;
+                       case Tabular::LYX_LONGTABULAR_ALIGN_RIGHT:
+                               return AlignRight;
+                       default:
+                               return AlignCenter;
+                       }
+               } else
+                       return Inline;
+}
+
+
 int InsetTabular::latex(odocstream & os, OutputParams const & runparams) const
 {
        return tabular.latex(os, runparams);
@@ -4703,6 +4795,20 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                tabular.tabular_valignment = Tabular::LYX_VALIGN_BOTTOM;
                break;
 
+       case Tabular::LONGTABULAR_ALIGN_LEFT:
+               tabular.longtabular_alignment = Tabular::LYX_LONGTABULAR_ALIGN_LEFT;
+               break;
+
+       case Tabular::LONGTABULAR_ALIGN_CENTER:
+               tabular.longtabular_alignment = Tabular::LYX_LONGTABULAR_ALIGN_CENTER;
+               break;
+
+       case Tabular::LONGTABULAR_ALIGN_RIGHT:
+               tabular.longtabular_alignment = Tabular::LYX_LONGTABULAR_ALIGN_RIGHT;
+               break;
+
+               
+
        case Tabular::SET_ROTATE_CELL:
                for (row_type i = sel_row_start; i <= sel_row_end; ++i)
                        for (col_type j = sel_col_start; j <= sel_col_end; ++j)
@@ -5051,17 +5157,17 @@ void InsetTabular::setChange(Change const & change)
 }
 
 
-void InsetTabular::acceptChanges(BufferParams const & bparams)
+void InsetTabular::acceptChanges()
 {
        for (idx_type idx = 0; idx < nargs(); ++idx)
-               cell(idx)->acceptChanges(bparams);
+               cell(idx)->acceptChanges();
 }
 
 
-void InsetTabular::rejectChanges(BufferParams const & bparams)
+void InsetTabular::rejectChanges()
 {
        for (idx_type idx = 0; idx < nargs(); ++idx)
-               cell(idx)->rejectChanges(bparams);
+               cell(idx)->rejectChanges();
 }