]> git.lyx.org Git - features.git/commitdiff
GuiTabular: support for multirow offset; fileformat change
authorUwe Stöhr <uwestoehr@web.de>
Sun, 7 Nov 2010 05:32:28 +0000 (05:32 +0000)
committerUwe Stöhr <uwestoehr@web.de>
Sun, 7 Nov 2010 05:32:28 +0000 (05:32 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@36182 a592a061-630c-0410-9148-cb99ea01b6c8

development/FORMAT
lib/lyx2lyx/lyx_2_0.py
src/Buffer.cpp
src/frontends/qt4/GuiTabular.cpp
src/frontends/qt4/ui/TabularUi.ui
src/insets/InsetTabular.cpp
src/insets/InsetTabular.h

index 21efb7611fc1b7d36d46c4654a078a7d93a1eb45..d621168fd08c2ca4492c6a2cea6a78a76300b5b0 100644 (file)
@@ -7,6 +7,11 @@ The good example would be 2010-01-10 entry.
 
 -----------------------
 
+2010-11-07 Uwe Stöhr <uwestoehr@web.de>
+       * Format incremented to 407: support for vertical offset of
+         multirow cells
+         new tag "mroffset" for multirow chells with an offset
+
 2010-11-06 Richard Heck <rgheck@comcast.net> and
          Jean-Marc Lasgouttes <lasgouttes@lyx.org>
        * Format incremented to 406: ??
index 8b5b58b483b972c56e980cdea3520c0f6304a34d..61f070fb9864357b922590b5973960f9d87bd130 100644 (file)
@@ -2085,6 +2085,70 @@ def revert_passthru(document):
             end = newend
         beg = end + 1
 
+
+def revert_multirowOffset(document):
+    " Revert multirow cells with offset in tables to TeX-code"
+    i = 0
+    multirowOffset = False
+    while True:
+      # cell type 3 is multirow begin cell
+      i = find_token(document.body, '<cell multirow="3" mroffset=', i)
+      if i == -1:
+          break
+      # a multirow cell with offset was found
+      multirowOffset = True
+      # remove the multirow tag, set the valignment to top
+      # the the bottom line and offset
+      document.body[i] = document.body[i].replace(' multirow="3" ', ' ')
+      document.body[i] = document.body[i].replace('valignment="middle"', 'valignment="top"')
+      document.body[i] = document.body[i].replace(' bottomline="true" ', ' ')
+      document.body[i] = document.body[i].replace(' mroffset=', '')
+      # store the offset and remove it
+      begin = document.body[i].find('"')
+      end = document.body[i].find('" ', begin)
+      offset = document.body[i][begin + 1:end]
+      document.body[i] = document.body[i].replace(document.body[i][begin:end + 1], '')
+      # write ERT to create the multirow cell
+      # use 2 rows and 2cm as default with because the multirow span
+      # and the column width is only hardly accessible
+      cend = find_token(document.body, "</cell>", i)
+      if cend == -1:
+          document.warning("Malformed LyX document: Could not find end of tabular cell.")
+          i += 1
+          continue
+      blay = find_token(document.body, "\\begin_layout", i, cend)
+      if blay == -1:
+          document.warning("Can't find layout for cell!")
+          i = j
+          continue
+      bend = find_end_of_layout(document.body, blay)
+      if blay == -1:
+          document.warning("Can't find end of layout for cell!")
+          i = cend
+          continue
+      # do the later one first, so as not to mess up the numbering
+      # we are wrapping the whole cell in this ert
+      # so before the end of the layout...
+      document.body[bend:bend] = put_cmd_in_ert("}")
+      # ...and after the beginning
+      document.body[blay+1:blay+1] = put_cmd_in_ert("\\multirow{2}{2cm}[" + offset + "]{")
+      while True:
+          # cell type 4 is multirow part cell
+          k = find_token(document.body, '<cell multirow="4"', cend)
+          if k == -1:
+              break
+          # remove the multirow tag, set the valignment to top
+          # and remove the top line
+          document.body[k] = document.body[k].replace(' multirow="4" ', ' ')
+          document.body[k] = document.body[k].replace('valignment="middle"', 'valignment="top"')
+          document.body[k] = document.body[k].replace(' topline="true" ', ' ')
+          k += 1
+      # this will always be ok
+      i = cend
+    if multirowOffset == True:
+        add_to_preamble(document, ["\\usepackage{multirow}"])
+
+
 ##
 # Conversion hub
 #
@@ -2150,10 +2214,12 @@ convert = [[346, []],
            [403, [convert_flexnames]],
            [404, [convert_prettyref]],
            [405, []],
-           [406, [convert_passthru]]
+           [406, [convert_passthru]],
+           [407, []]
 ]
 
-revert =  [[405, [revert_passthru]],
+revert =  [[406, [revert_multirowOffset]],
+           [405, [revert_passthru]],
            [404, []],
            [403, [revert_refstyle]],
            [402, [revert_flexnames]],
index bf8e496d510d555f8d35f1253b173e37364bf729..1eb7abba0a3e81b97ea74c2103a49b6aa8867195 100644 (file)
@@ -128,7 +128,7 @@ namespace {
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-int const LYX_FORMAT = 406; // rgh: passthru changes
+int const LYX_FORMAT = 407; // uwestoehr: support for multirow offset
 
 typedef map<string, bool> DepClean;
 typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
index f696d9d1fe82fe8e9876c74898159a3959f47789..b69b8e5db9aae0f96f98ebfcafc1b6f31efcab1d 100644 (file)
@@ -49,11 +49,13 @@ GuiTabular::GuiTabular(QWidget * parent)
        setupUi(this);
 
        widthED->setValidator(unsignedLengthValidator(widthED));
+       multirowOffsetED->setValidator(new LengthValidator(multirowOffsetED));
        topspaceED->setValidator(new LengthValidator(topspaceED));
        bottomspaceED->setValidator(new LengthValidator(bottomspaceED));
        interlinespaceED->setValidator(new LengthValidator(interlinespaceED));
 
        widthUnitCB->setCurrentItem(Length::defaultUnit());
+       multirowOffsetUnitCB->setCurrentItem(Length::defaultUnit());
        topspaceUnitCB->setCurrentItem(Length::defaultUnit());
        bottomspaceUnitCB->setCurrentItem(Length::defaultUnit());
        interlinespaceUnitCB->setCurrentItem(Length::defaultUnit());
@@ -92,6 +94,10 @@ GuiTabular::GuiTabular(QWidget * parent)
                this, SLOT(checkEnabled()));
        connect(multirowCB, SIGNAL(clicked()),
                this, SLOT(checkEnabled()));
+       connect(multirowOffsetED, SIGNAL(textEdited(QString)),
+               this, SLOT(checkEnabled()));
+       connect(multirowOffsetUnitCB, SIGNAL(selectionChanged(lyx::Length::UNIT)),
+               this, SLOT(checkEnabled()));
        connect(newpageCB, SIGNAL(clicked()),
                this, SLOT(checkEnabled()));
        connect(headerStatusCB, SIGNAL(clicked()),
@@ -156,6 +162,7 @@ GuiTabular::GuiTabular(QWidget * parent)
 
        // initialize the length validator
        addCheckedWidget(widthED, fixedWidthColLA);
+       addCheckedWidget(multirowOffsetED, multirowOffsetLA);
        addCheckedWidget(topspaceED, topspaceLA);
        addCheckedWidget(bottomspaceED, bottomspaceLA);
        addCheckedWidget(interlinespaceED, interlinespaceLA);
@@ -237,6 +244,8 @@ void GuiTabular::checkEnabled()
 
        multicolumnCB->setEnabled(funcEnabled(Tabular::MULTICOLUMN));
        multirowCB->setEnabled(funcEnabled(Tabular::MULTIROW));
+       multirowOffsetED->setEnabled(multirowCB->isChecked());
+       multirowOffsetUnitCB->setEnabled(multirowCB->isChecked());
 
        changed();
 }
@@ -461,6 +470,13 @@ docstring GuiTabular::dialogToParams() const
                setParam(param_str, Tabular::SET_MULTICOLUMN);
        else
                setParam(param_str, Tabular::UNSET_MULTICOLUMN);
+
+       // apply the multirow offset
+       string mroffset = widgetsToLength(multirowOffsetED, multirowOffsetUnitCB);
+       if (mroffset.empty())
+               mroffset = "0pt";
+       if (multirowCB->isChecked())
+               setParam(param_str, Tabular::SET_MROFFSET, mroffset);
        //
        if (multirowCB->isChecked())
                setParam(param_str, Tabular::SET_MULTIROW);
@@ -574,6 +590,14 @@ static Length getMColumnPWidth(Tabular const & t, size_t cell)
 }
 
 
+static Length getMROffset(Tabular const & t, size_t cell)
+{
+       if (t.isMultiRow(cell))
+               return t.cellInfo(cell).mroffset;
+       return Length();
+}
+
+
 static docstring getAlignSpecial(Tabular const & t, size_t cell, int what)
 {
        if (what == Tabular::SET_SPECIAL_MULTICOLUMN)
@@ -638,6 +662,17 @@ void GuiTabular::paramsToDialog(Inset const * inset)
                lengthToWidgets(widthED, widthUnitCB,
                        colwidth, default_unit);
        }
+       Length mroffset;
+       if (multirow)
+               mroffset = getMROffset(tabular, cell);
+       string offset;
+       if (mroffset.zero())
+               multirowOffsetED->clear();
+       else {
+               offset = mroffset.asString();
+               lengthToWidgets(multirowOffsetED, multirowOffsetUnitCB,
+                       offset, default_unit);
+       }
        specialAlignmentED->setText(toqstr(special));
        ///////////////////////////////////
 
index 7777252979428d868006f9c50fcf7da3c6b46cd4..a0d0ac18c95503abd43869394b0461166db0fe53 100644 (file)
@@ -6,7 +6,7 @@
     <x>0</x>
     <y>0</y>
     <width>439</width>
-    <height>376</height>
+    <height>416</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -34,8 +34,8 @@
       <attribute name="title">
        <string>&amp;Table Settings</string>
       </attribute>
-      <layout class="QGridLayout" name="gridLayout_6">
-       <item row="0" column="0" colspan="2">
+      <layout class="QGridLayout" name="gridLayout_10">
+       <item row="0" column="0" colspan="3">
         <widget class="QGroupBox" name="GroupBox12">
          <property name="title">
           <string>Column settings</string>
          </layout>
         </widget>
        </item>
-       <item row="1" column="0">
+       <item row="1" column="0" colspan="2">
         <widget class="QGroupBox" name="groupBox">
          <property name="title">
           <string>Row setting</string>
          </property>
-         <layout class="QGridLayout" name="gridLayout_3">
+         <layout class="QGridLayout" name="gridLayout_6">
           <item row="0" column="0">
            <widget class="QCheckBox" name="multirowCB">
             <property name="toolTip">
             </property>
            </widget>
           </item>
+          <item row="1" column="0">
+           <layout class="QGridLayout" name="gridLayout_3">
+            <item row="0" column="0">
+             <widget class="QLabel" name="multirowOffsetLA">
+              <property name="toolTip">
+               <string>optional vertical offset</string>
+              </property>
+              <property name="text">
+               <string>&amp;Vertical Offset:</string>
+              </property>
+              <property name="buddy">
+               <cstring>widthED</cstring>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="1">
+             <widget class="QLineEdit" name="multirowOffsetED">
+              <property name="enabled">
+               <bool>true</bool>
+              </property>
+              <property name="toolTip">
+               <string>value of the optional vertical offset</string>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="2">
+             <widget class="LengthCombo" name="multirowOffsetUnitCB"/>
+            </item>
+           </layout>
+          </item>
          </layout>
         </widget>
        </item>
-       <item row="1" column="1">
+       <item row="1" column="2">
         <widget class="QGroupBox" name="groupBox_2">
          <property name="title">
           <string>Cell setting</string>
          </layout>
         </widget>
        </item>
-       <item row="2" column="0" colspan="2">
+       <item row="2" column="0" colspan="3">
         <widget class="QGroupBox" name="tabAlignmentGB">
          <property name="enabled">
           <bool>true</bool>
index 7d642e9052997051534d61b40f9b890a12eb1c67..bf78fd035652158fd0d171d7e111365eb2c2fd7b 100644 (file)
@@ -142,6 +142,7 @@ TabularFeature tabularFeature[] =
        { Tabular::MULTIROW, "multirow", false },
        { Tabular::SET_MULTIROW, "set-multirow", false },
        { Tabular::UNSET_MULTIROW, "unset-multirow", false },
+       { Tabular::SET_MROFFSET, "set-mroffset", true },
        { Tabular::SET_ALL_LINES, "set-all-lines", false },
        { Tabular::UNSET_ALL_LINES, "unset-all-lines", false },
        { Tabular::SET_LONGTABULAR, "set-longtabular", false },
@@ -573,6 +574,7 @@ Tabular::CellData::CellData(CellData const & cs)
          width(cs.width),
          multicolumn(cs.multicolumn),
          multirow(cs.multirow),
+         mroffset(cs.mroffset),
          alignment(cs.alignment),
          valignment(cs.valignment),
          decimal_hoffset(cs.decimal_hoffset),
@@ -602,6 +604,7 @@ void Tabular::CellData::swap(CellData & rhs)
        std::swap(width, rhs.width);
        std::swap(multicolumn, rhs.multicolumn);
        std::swap(multirow, rhs.multirow);
+       std::swap(mroffset, rhs.mroffset);
        std::swap(alignment, rhs.alignment);
        std::swap(valignment, rhs.valignment);
        std::swap(decimal_hoffset, rhs.decimal_hoffset);
@@ -1130,6 +1133,14 @@ bool Tabular::setMColumnPWidth(Cursor & cur, idx_type cell,
 }
 
 
+bool Tabular::setMROffset(Cursor & cur, idx_type cell,
+               Length const & mroffset)
+{
+       cellInfo(cell).mroffset = mroffset;
+       return true;
+}
+
+
 void Tabular::setAlignSpecial(idx_type cell, docstring const & special,
                                 Tabular::Feature what)
 {
@@ -1249,6 +1260,12 @@ Length const Tabular::getPWidth(idx_type cell) const
 }
 
 
+Length const Tabular::getMROffset(idx_type cell) const
+{
+       return cellInfo(cell).mroffset;
+}
+
+
 int Tabular::textHOffset(idx_type cell) const
 {
        // the LaTeX Way :-(
@@ -1404,6 +1421,7 @@ void Tabular::write(ostream & os) const
                        os << "<cell"
                           << write_attribute("multicolumn", cell_info[r][c].multicolumn)
                           << write_attribute("multirow", cell_info[r][c].multirow)
+                          << write_attribute("mroffset", cell_info[r][c].mroffset)
                           << write_attribute("alignment", cell_info[r][c].alignment)
                           << write_attribute("valignment", cell_info[r][c].valignment)
                           << write_attribute("topline", cell_info[r][c].top_line)
@@ -1513,6 +1531,7 @@ void Tabular::read(Lexer & lex)
                        }
                        getTokenValue(line, "multicolumn", cell_info[i][j].multicolumn);
                        getTokenValue(line, "multirow", cell_info[i][j].multirow);
+                       getTokenValue(line, "mroffset", cell_info[i][j].mroffset);
                        getTokenValue(line, "alignment", cell_info[i][j].alignment);
                        getTokenValue(line, "valignment", cell_info[i][j].valignment);
                        getTokenValue(line, "topline", cell_info[i][j].top_line);
@@ -2225,7 +2244,10 @@ int Tabular::TeXCellPreamble(odocstream & os, idx_type cell,
                else
                        // we need to set a default value
                        os << "*";
-               os << "}{";
+               os << "}";
+               if (!getMROffset(cell).zero())
+                       os << "[" << from_ascii(getMROffset(cell).asLatexString()) << "]";
+               os << "{";
        } // end if ismultirow
 
        if (getRotateCell(cell)) {
@@ -5059,6 +5081,10 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                tabular.setMColumnPWidth(cur, cur.idx(), Length(value));
                break;
 
+       case Tabular::SET_MROFFSET:
+               tabular.setMROffset(cur, cur.idx(), Length(value));
+               break;
+
        case Tabular::SET_SPECIAL_COLUMN:
        case Tabular::SET_SPECIAL_MULTICOLUMN:
                if (value == "none")
index 1c97c173aaee7af8e41d9ed6781885ceea671b16..5de42dd73f4aa0e52bc23ad826e5256caecbded3 100644 (file)
@@ -192,6 +192,8 @@ public:
                ///
                UNSET_MULTIROW,
                ///
+               SET_MROFFSET,
+               ///
                SET_ALL_LINES,
                ///
                UNSET_ALL_LINES,
@@ -404,6 +406,8 @@ public:
        ///
        bool setMColumnPWidth(Cursor &, idx_type, Length const &);
        ///
+       bool setMROffset(Cursor &, idx_type, Length const &);
+       ///
        void setAlignSpecial(idx_type cell, docstring const & special,
                             Feature what);
        ///
@@ -415,6 +419,8 @@ public:
        ///
        Length const getPWidth(idx_type cell) const;
        ///
+       Length const getMROffset(idx_type cell) const;
+       ///
        int textHOffset(idx_type cell) const;
        ///
        int textVOffset(idx_type cell) const;
@@ -561,6 +567,8 @@ public:
                ///
                int multirow;
                ///
+               Length mroffset;
+               ///
                LyXAlignment alignment;
                ///
                VAlignment valignment;