]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
Fix bug #6158: Crash when entering math in tabular.
[lyx.git] / src / insets / InsetTabular.cpp
index e600d4499bbdd3bf1459f7454d20ca6a9e5f56a8..7b13e010bcbfcbc9d6a8f7398b7f2c590541dcf7 100644 (file)
@@ -11,6 +11,7 @@
  * \author John Levon
  * \author André Pönitz
  * \author Jürgen Vigna
+ * \author Uwe Stöhr
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -37,7 +38,6 @@
 #include "LyXRC.h"
 #include "MetricsInfo.h"
 #include "OutputParams.h"
-#include "paragraph_funcs.h"
 #include "Paragraph.h"
 #include "ParagraphParameters.h"
 #include "ParIterator.h"
@@ -1029,7 +1029,7 @@ void toggleFixedWidth(Cursor & cur, InsetTableCell * inset, bool fixedWidth)
        // reset layout
        cur.push(*inset);
        // undo information has already been recorded
-       inset->getText(0)->setLayout(cur.bv().buffer(), 0, cur.lastpit() + 1,
+       inset->getText(0)->setLayout(0, cur.lastpit() + 1,
                        bp.documentClass().plainLayoutName());
        cur.pop();
 }
@@ -1326,14 +1326,8 @@ void Tabular::write(ostream & os) const
        os << "<features"
           << write_attribute("rotate", rotate)
           << write_attribute("booktabs", use_booktabs)
-          << write_attribute("islongtable", is_long_tabular);
-       // 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 << write_attribute("firstHeadTopDL", endfirsthead.topDL)
+          << write_attribute("islongtable", is_long_tabular)
+          << write_attribute("firstHeadTopDL", endfirsthead.topDL)
           << write_attribute("firstHeadBottomDL", endfirsthead.bottomDL)
           << write_attribute("firstHeadEmpty", endfirsthead.empty)
           << write_attribute("headTopDL", endhead.topDL)
@@ -1342,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)
@@ -2132,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) {
@@ -2307,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";
@@ -3288,12 +3294,6 @@ void InsetTabular::drawCellLines(Painter & pain, int x, int y,
 }
 
 
-docstring InsetTabular::editMessage() const
-{
-       return _("Opened table");
-}
-
-
 void InsetTabular::edit(Cursor & cur, bool front, EntryDirection)
 {
        //lyxerr << "InsetTabular::edit: " << this << endl;
@@ -3510,11 +3510,11 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                && cur.pos() == cur.lastpos())
                                || (!next_cell && cur.pit() == 0 && cur.pos() == 0));
 
+                       bool const empty_cell = cur.lastpos() == 0 && cur.lastpit() == 0;
+
                        // ...try to dispatch to the cell's inset.
                        cell(cur.idx())->dispatch(cur, cmd);
 
-                       bool const empty_cell = cur.lastpos() == 0 && cur.lastpit() == 0;
-                       
                        // When we already have a selection we want to select the whole cell
                        // before going to the next cell.
                        if (select_whole && !empty_cell){
@@ -3703,8 +3703,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;
 
@@ -5152,17 +5151,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();
 }