commit ad6aa8ba4b9525c07e30242dd66e79ec172a2b78
Author: Juergen Spitzmueller <sp...@lyx.org>
Date:   Sun Jan 28 12:13:27 2024 +0100

    Restrict caption insertion in tables to where it makes sense (#13037)
    
    This requires to move insetAllowed() to the cell level, as only cells
    in the caption row of a longtable actually can take a caption.
---
 src/insets/InsetTabular.cpp |   47 ++++++++++++++++++++++++------------------
 src/insets/InsetTabular.h   |   10 ++++++--
 2 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp
index 112e806..c98308c 100644
--- a/src/insets/InsetTabular.cpp
+++ b/src/insets/InsetTabular.cpp
@@ -1064,9 +1064,10 @@ void Tabular::updateIndexes()
        rowofcell.resize(numberofcells);
        columnofcell.resize(numberofcells);
        idx_type i = 0;
-       // reset column and row of cells and update their width, alignment and 
ct status
+       // reset column and row of cells and update their width, alignment, 
caption, and ct status
        for (row_type row = 0; row < nrows(); ++row) {
                for (col_type column = 0; column < ncols(); ++column) {
+                       
cell_info[row][column].inset->toggleCaptionRow(is_long_tabular && 
ltCaption(row));
                        if (isPartOfMultiColumn(row, column)) {
                                
cell_info[row][column].inset->toggleMultiCol(true);
                                continue;
@@ -2021,6 +2022,7 @@ void Tabular::read(Lexer & lex)
                                       << line << ')' << endl;
                                return;
                        }
+                       cell_info[i][j].inset->toggleCaptionRow(is_long_tabular 
&& row_info[i].caption);
                        getTokenValue(line, "multicolumn", 
cell_info[i][j].multicolumn);
                        getTokenValue(line, "multirow", 
cell_info[i][j].multirow);
                        getTokenValue(line, "mroffset", 
cell_info[i][j].mroffset);
@@ -4358,7 +4360,8 @@ bool Tabular::hasNewlines(idx_type cell) const
 
 InsetTableCell::InsetTableCell(Buffer * buf)
        : InsetText(buf, InsetText::PlainLayout), isFixedWidth(false), 
isVarwidth(false),
-         isMultiColumn(false), isMultiRow(false), 
contentAlign(LYX_ALIGN_CENTER)
+         isMultiColumn(false), isMultiRow(false), isCaptionRow(false),
+         contentAlign(LYX_ALIGN_CENTER)
 {}
 
 bool InsetTableCell::allowParagraphCustomization(idx_type) const
@@ -4463,6 +4466,24 @@ void InsetTableCell::metrics(MetricsInfo & mi, Dimension 
& dim) const
 }
 
 
+bool InsetTableCell::insetAllowed(InsetCode code) const
+{
+       switch (code) {
+       case FLOAT_CODE:
+       case MARGIN_CODE:
+       case MATHMACRO_CODE:
+       case WRAP_CODE:
+               return false;
+
+       case CAPTION_CODE:
+               return isCaptionRow;
+
+       default:
+               return true;
+       }
+}
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // InsetTabular
@@ -4497,24 +4518,6 @@ void InsetTabular::setBuffer(Buffer & buf)
 }
 
 
-bool InsetTabular::insetAllowed(InsetCode code) const
-{
-       switch (code) {
-       case FLOAT_CODE:
-       case MARGIN_CODE:
-       case MATHMACRO_CODE:
-       case WRAP_CODE:
-               return false;
-
-       case CAPTION_CODE:
-               return tabular.is_long_tabular;
-
-       default:
-               return true;
-       }
-}
-
-
 bool InsetTabular::allowMultiPar() const
 {
        for (col_type c = 0; c < tabular.ncols(); ++c) {
@@ -7276,6 +7279,8 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                cur.pit() = 0;
                cur.pos() = 0;
                cur.selection(false);
+               // update the captionRow status of all cells
+               tabular.updateIndexes();
                // If a row is set as caption, then also insert
                // a caption. Otherwise the LaTeX output is broken.
                // Select cell if it is non-empty
@@ -7295,6 +7300,8 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                FuncRequest fr(LFUN_INSET_DISSOLVE, "caption");
                if (lyx::getStatus(fr).enabled())
                        lyx::dispatch(fr);
+               // update the captionRow status of all cells
+               tabular.updateIndexes();
                break;
        }
 
diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h
index 4dba557..7b8375f 100644
--- a/src/insets/InsetTabular.h
+++ b/src/insets/InsetTabular.h
@@ -77,6 +77,8 @@ public:
        ///
        void toggleMultiRow(bool m) { isMultiRow = m; }
        ///
+       void toggleCaptionRow(bool m) { isCaptionRow = m; }
+       ///
        void setContentAlignment(LyXAlignment al) { contentAlign = al; }
        /// writes the contents of the cell as a string, optionally
        /// descending into insets
@@ -133,7 +135,9 @@ private:
        bool isMultiColumn;
        ///
        bool isMultiRow;
-       // FIXME: Here the thoughts from the comment above also apply.
+       // FIXME: For the next two items the thoughts from the comment above 
also apply.
+       ///
+       bool isCaptionRow;
        ///
        LyXAlignment contentAlign;
        /// should paragraph indentation be omitted in any case?
@@ -148,6 +152,8 @@ private:
        bool forceLocalFontSwitch() const override;
        /// Is the width forced to some value?
        bool hasFixedWidth() const override { return isFixedWidth; }
+       ///
+       bool insetAllowed(InsetCode code) const override;
 };
 
 
@@ -1031,8 +1037,6 @@ public:
        ///
        bool hasSettings() const override { return true; }
        ///
-       bool insetAllowed(InsetCode code) const override;
-       ///
        bool allowSpellCheck() const override { return true; }
        ///
        bool canTrackChanges() const override { return true; }
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to