]> git.lyx.org Git - features.git/commitdiff
add support for decimal alignment in tables
authorEdwin Leuven <e.leuven@gmail.com>
Sat, 5 Jun 2010 07:44:44 +0000 (07:44 +0000)
committerEdwin Leuven <e.leuven@gmail.com>
Sat, 5 Jun 2010 07:44:44 +0000 (07:44 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@34598 a592a061-630c-0410-9148-cb99ea01b6c8

13 files changed:
lib/images/tabular-feature_align-decimal.png [new file with mode: 0644]
lib/lyx2lyx/lyx_2_0.py
lib/ui/stdtoolbars.inc
src/Buffer.cpp
src/LayoutEnums.h
src/LyXRC.cpp
src/LyXRC.h
src/frontends/qt4/GuiPrefs.cpp
src/frontends/qt4/GuiTabular.cpp
src/frontends/qt4/ui/PrefLanguageUi.ui
src/frontends/qt4/ui/TabularUi.ui
src/insets/InsetTabular.cpp
src/insets/InsetTabular.h

diff --git a/lib/images/tabular-feature_align-decimal.png b/lib/images/tabular-feature_align-decimal.png
new file mode 100644 (file)
index 0000000..f627fdb
Binary files /dev/null and b/lib/images/tabular-feature_align-decimal.png differ
index d657c1abbd303bca2aaabc90378644f1ee7b64d0..bbf1f813eceb47a7d36eccdfa2eac02dbc37a9a8 100644 (file)
@@ -28,6 +28,13 @@ from parser_tools import find_token, find_end_of, find_tokens, get_value, get_va
 ####################################################################
 # Private helper functions
 
+def remove_option(document, m, option):
+    l = document.body[m].find(option)
+    if l != -1:
+        val = document.body[m][l:].split('"')[1]
+        document.body[m] = document.body[m][:l-1] + document.body[m][l+len(option + '="' + val + '"'):]
+    return l
+
 def find_end_of_inset(lines, i):
     " Find end of inset, where lines[i] is included."
     return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
@@ -1588,6 +1595,16 @@ def revert_output_sync(document):
     del document.header[i]
 
 
+def revert_align_decimal(document):
+  l = 0
+  while True:
+    l = document.body[l].find('alignment=decimal')
+    if l == -1:
+        break
+    remove_option(document, l, 'decimal_point')
+    document.body[l].replace('decimal', 'center')
+
+
 ##
 # Conversion hub
 #
@@ -1637,10 +1654,12 @@ convert = [[346, []],
            [387, []],
            [388, []],
            [389, [convert_html_quotes]],
-           [390, []]
+           [390, []],
+           [391, []]
                                        ]
 
-revert =  [[389, [revert_output_sync]],
+revert =  [[390, [revert_align_decimal]],
+           [389, [revert_output_sync]],
            [388, [revert_html_quotes]],
            [387, [revert_pagesizes]],
            [386, [revert_math_scale]],
index cc6fa6982aaebd89993e7fd79293fb467bf4096b..b3f0bf14635c0bd28201144f5dcf1d5d008404df 100644 (file)
@@ -154,6 +154,7 @@ ToolbarSet
                Item "Align left" "command-alternatives inset-modify tabular m-align-left;inset-modify tabular align-left"
                Item "Align center" "command-alternatives inset-modify tabular m-align-center;inset-modify tabular align-center"
                Item "Align right" "command-alternatives inset-modify tabular m-align-right;inset-modify tabular align-right"
+               Item "Align on decimal" "inset-modify tabular align-decimal"
                Separator
                Item "Align top" "command-alternatives inset-modify tabular m-valign-top;inset-modify tabular valign-top"
                Item "Align middle" "command-alternatives inset-modify tabular m-valign-middle;inset-modify tabular valign-middle"
index 98fdc287a6542f09d27f72ded17d4eadb7a6c5de..7cb29353944724c479cabb5b65636f6bf65b8879 100644 (file)
@@ -126,7 +126,7 @@ namespace {
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-int const LYX_FORMAT = 390; // ps: forward view
+int const LYX_FORMAT = 391; // edwin: decimal alignment in tables
 
 typedef map<string, bool> DepClean;
 typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
index d24302c4944b9c98df1f00a9dbdd7888b8740016..5c02d8ed0a6b76d19aa2f33cbe6483dcd98e6a64 100644 (file)
@@ -59,7 +59,9 @@ enum LyXAlignment {
        ///
        LYX_ALIGN_LAYOUT = 16,
        ///
-       LYX_ALIGN_SPECIAL = 32
+       LYX_ALIGN_SPECIAL = 32,
+       ///
+       LYX_ALIGN_DECIMAL = 64
 };
 
 ///
index a717a6b84e5158ecb49d51059123b0b0ab28fc7c..67ba6780d487e7c13b0a91bf933b889f8f4603ec 100644 (file)
@@ -84,6 +84,7 @@ LexerKeyword lyxrcTags[] = {
        { "\\cursor_follows_scrollbar", LyXRC::RC_CURSOR_FOLLOWS_SCROLLBAR },
        { "\\date_insert_format", LyXRC::RC_DATE_INSERT_FORMAT },
        { "\\def_file", LyXRC::RC_DEFFILE },
+       { "\\default_decimal_point", LyXRC::RC_DEFAULT_DECIMAL_POINT },
        { "\\default_language", LyXRC::RC_DEFAULT_LANGUAGE },
        { "\\default_papersize", LyXRC::RC_DEFAULT_PAPERSIZE },
        { "\\default_view_format", LyXRC::RC_DEFAULT_VIEW_FORMAT },
@@ -352,6 +353,7 @@ void LyXRC::setDefaults()
        completion_inline_text = false;
        completion_inline_dots = -1;
        completion_inline_delay = 0.2;
+       default_decimal_point = ".";
 }
 
 
@@ -939,6 +941,9 @@ int LyXRC::read(Lexer & lexrc)
                                backupdir_path = expandPath(backupdir_path);
                        }
                        break;
+               case RC_DEFAULT_DECIMAL_POINT:
+                       lexrc >> default_decimal_point;
+                       break;
                case RC_DATE_INSERT_FORMAT:
                        lexrc >> date_insert_format;
                        break;
@@ -2380,6 +2385,14 @@ void LyXRC::write(ostream & os, bool ignore_system_lyxrc, string const & name) c
                if (tag != RC_LAST)
                        break;
 
+       case RC_DEFAULT_DECIMAL_POINT:
+               if (ignore_system_lyxrc ||
+                   default_decimal_point != system_lyxrc.default_decimal_point) {
+                       os << "\\default_decimal_point " << default_decimal_point << '\n';
+               }
+               if (tag != RC_LAST)
+                       break;
+
        case RC_SPELLCHECKER:
                if (ignore_system_lyxrc ||
                    spellchecker != system_lyxrc.spellchecker) {
index 4ec4d2aeef4af3e5a79bdb86f2245d540822e75a..823dc15f74463162cbc996166138d1e6a958f3d3 100644 (file)
@@ -66,6 +66,7 @@ public:
                RC_COPIER,
                RC_CURSOR_FOLLOWS_SCROLLBAR,
                RC_DATE_INSERT_FORMAT,
+               RC_DEFAULT_DECIMAL_POINT,
                RC_DEFAULT_LANGUAGE,
                RC_DEFAULT_VIEW_FORMAT,
                RC_DEFAULT_PAPERSIZE,
@@ -499,6 +500,8 @@ public:
        std::string forward_search_pdf;
        ///
        int export_overwrite;
+       /// Default decimal point when aligning table columns on decimal
+       std::string default_decimal_point;
 };
 
 
index 1831d8a8ccffdf28b73cbaa96f6866b5c07d660f..d8f1504b4fa5b1feeaf3ebd7eb59c3e23fc69246 100644 (file)
@@ -2070,6 +2070,8 @@ PrefLanguage::PrefLanguage(GuiPreferences * form)
                this, SIGNAL(changed()));
        connect(uiLanguageCO, SIGNAL(activated(int)),
                this, SIGNAL(changed()));
+       connect(defaultDecimalPointLE, SIGNAL(textChanged(QString)),
+               this, SIGNAL(changed()));
 
        uiLanguageCO->clear();
 
@@ -2113,6 +2115,7 @@ void PrefLanguage::apply(LyXRC & rc) const
        rc.language_command_end = fromqstr(endCommandED->text());
        rc.gui_language = fromqstr(
                uiLanguageCO->itemData(uiLanguageCO->currentIndex()).toString());
+       rc.default_decimal_point = fromqstr(defaultDecimalPointLE->text());
 }
 
 
@@ -2132,6 +2135,7 @@ void PrefLanguage::update(LyXRC const & rc)
        languagePackageED->setText(toqstr(rc.language_package));
        startCommandED->setText(toqstr(rc.language_command_begin));
        endCommandED->setText(toqstr(rc.language_command_end));
+       defaultDecimalPointLE->setText(toqstr(rc.default_decimal_point));
 
        int pos = uiLanguageCO->findData(toqstr(rc.gui_language));
        uiLanguageCO->blockSignals(true);
index 77ec768a57d7324db0536c60d4c32858f7fbbd6f..2c7051441d3dada2ca407de622e73aad752ac460 100644 (file)
@@ -27,6 +27,7 @@
 #include "FuncRequest.h"
 #include "FuncStatus.h"
 #include "LyX.h"
+#include "LyXRC.h"
 
 #include "insets/InsetTabular.h"
 
@@ -159,6 +160,10 @@ GuiTabular::GuiTabular(QWidget * parent)
 void GuiTabular::checkEnabled()
 {
        hAlignCB->setEnabled(true);
+       bool dalign = hAlignCB->currentText() == QString("Decimal");
+       decimalPointLE->setEnabled(dalign);
+       decimalL->setEnabled(dalign);
+
        vAlignCB->setEnabled(!multirowCB->isChecked() 
                && !widgetsToLength(widthED, widthUnitCB).empty());
 
@@ -271,38 +276,24 @@ static void setParam(string & param_str, Tabular::Feature f, string const & arg
 
 void GuiTabular::setHAlign(string & param_str) const
 {
-       int const align = hAlignCB->currentIndex();
-
-       enum HALIGN { LEFT, RIGHT, CENTER, BLOCK };
-       HALIGN h = LEFT;
-
-       switch (align) {
-               case 0: h = LEFT; break;
-               case 1: h = CENTER; break;
-               case 2: h = RIGHT; break;
-               case 3: h = BLOCK; break;
-       }
-
        Tabular::Feature num = Tabular::ALIGN_LEFT;
        Tabular::Feature multi_num = Tabular::M_ALIGN_LEFT;
-
-       switch (h) {
-               case LEFT:
-                       num = Tabular::ALIGN_LEFT;
-                       multi_num = Tabular::M_ALIGN_LEFT;
-                       break;
-               case CENTER:
-                       num = Tabular::ALIGN_CENTER;
-                       multi_num = Tabular::M_ALIGN_CENTER;
-                       break;
-               case RIGHT:
-                       num = Tabular::ALIGN_RIGHT;
-                       multi_num = Tabular::M_ALIGN_RIGHT;
-                       break;
-               case BLOCK:
-                       num = Tabular::ALIGN_BLOCK;
-                       //multi_num: no equivalent
-                       break;
+       QString const align = hAlignCB->currentText();
+       if (align == qt_("Left")) {
+               num = Tabular::ALIGN_LEFT;
+               multi_num = Tabular::M_ALIGN_LEFT;
+       } else if (align == qt_("Center")) {
+               num = Tabular::ALIGN_CENTER;
+               multi_num = Tabular::M_ALIGN_CENTER;
+       } else if (align == qt_("Right")) {
+               num = Tabular::ALIGN_RIGHT;
+               multi_num = Tabular::M_ALIGN_RIGHT;
+       } else if (align == qt_("Justified")) {
+               num = Tabular::ALIGN_BLOCK;
+               //multi_num: no equivalent
+       } else if (align == qt_("Decimal")) {
+               num = Tabular::ALIGN_DECIMAL;
+               //multi_num: no equivalent
        }
 
        if (multicolumnCB->isChecked())
@@ -367,6 +358,13 @@ docstring GuiTabular::dialogToParams() const
        // FIXME: We should use Tabular directly.
        string param_str = "tabular";
        setHAlign(param_str);
+
+       // SET_DECIMAL_POINT must come after setHAlign() (ALIGN_DECIMAL)
+       string decimal_point = fromqstr(decimalPointLE->text());
+       if (decimal_point.empty())
+               decimal_point = lyxrc.default_decimal_point;
+       setParam(param_str, Tabular::SET_DECIMAL_POINT, decimal_point);
+
        setVAlign(param_str);
        setTableAlignment(param_str);
        //
@@ -693,29 +691,43 @@ void GuiTabular::paramsToDialog(Inset const * inset)
        hAlignCB->addItem(qt_("Right"));
        if (!multicol && !pwidth.zero())
                hAlignCB->addItem(qt_("Justified"));
+       if (!multicol)
+               hAlignCB->addItem(qt_("Decimal"));
 
-       int align = 0;
+       QString align;
        switch (tabular.getAlignment(cell)) {
-       case LYX_ALIGN_LEFT:
-               align = 0;
-               break;
-       case LYX_ALIGN_CENTER:
-               align = 1;
-               break;
-       case LYX_ALIGN_RIGHT:
-               align = 2;
-               break;
-       case LYX_ALIGN_BLOCK:
-       {
-               if (!multicol && !pwidth.zero())
-                       align = 3;
-               break;
-       }
-       default:
-               align = 0;
-               break;
+               case LYX_ALIGN_LEFT:
+                       align = qt_("Left");
+                       break;
+               case LYX_ALIGN_CENTER:
+                       align = qt_("Center");
+                       break;
+               case LYX_ALIGN_RIGHT:
+                       align = qt_("Right");
+                       break;
+               case LYX_ALIGN_BLOCK:
+               {
+                       if (!multicol && !pwidth.zero())
+                               align = qt_("Justified");
+                       break;
+               }
+               case LYX_ALIGN_DECIMAL:
+               {
+                       if (!multicol)
+                               align = qt_("Decimal");
+                       break;
+               }
+               default:
+                       // we should never end up here
+                       break;
        }
-       hAlignCB->setCurrentIndex(align);
+       hAlignCB->setCurrentIndex(hAlignCB->findText(align));
+
+       //
+       QString decimal_point = toqstr(tabular.column_info[col].decimal_point);
+       if (decimal_point.isEmpty())
+               decimal_point = toqstr(from_utf8(lyxrc.default_decimal_point));
+       decimalPointLE->setText(decimal_point);
 
        int valign = 0;
        switch (tabular.getVAlignment(cell)) {
@@ -772,6 +784,7 @@ void GuiTabular::paramsToDialog(Inset const * inset)
                captionStatusCB->blockSignals(true);
                captionStatusCB->setChecked(false);
                captionStatusCB->blockSignals(false);
+               checkEnabled();
                return;
        } else {
                // longtables cannot have a vertical alignment
index 2305eb09969422fce0b3434df7048e876d7abf4a..a7e9a6600463d0ea5a27a5d86b19b330e4ef85dd 100644 (file)
      </property>
     </widget>
    </item>
-   <item row="1" column="2" rowspan="2">
+   <item row="1" column="2">
     <widget class="QLineEdit" name="languagePackageED">
      <property name="toolTip">
       <string>Enter the command to load the language package (default: babel)</string>
      </property>
     </widget>
    </item>
-   <item row="2" column="3" rowspan="2">
+   <item row="2" column="0" colspan="2">
+    <widget class="QLabel" name="startCommandLA">
+     <property name="text">
+      <string>Command s&amp;tart:</string>
+     </property>
+     <property name="buddy">
+      <cstring>startCommandED</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QLineEdit" name="startCommandED">
+     <property name="toolTip">
+      <string>The LaTeX command that starts a switch to a foreign language</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3">
     <spacer name="horizontalSpacer">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
     </spacer>
    </item>
    <item row="3" column="0" colspan="2">
-    <widget class="QLabel" name="startCommandLA">
+    <widget class="QLabel" name="endCommandLA">
      <property name="text">
-      <string>Command s&amp;tart:</string>
+      <string>Command e&amp;nd:</string>
      </property>
      <property name="buddy">
-      <cstring>startCommandED</cstring>
+      <cstring>endCommandED</cstring>
      </property>
     </widget>
    </item>
    <item row="3" column="2">
-    <widget class="QLineEdit" name="startCommandED">
+    <widget class="QLineEdit" name="endCommandED">
      <property name="toolTip">
-      <string>The LaTeX command that starts a switch to a foreign language</string>
+      <string>The LaTeX command that ends a switch to a foreign language</string>
      </property>
     </widget>
    </item>
    <item row="4" column="0" colspan="2">
-    <widget class="QLabel" name="endCommandLA">
+    <widget class="QLabel" name="decimalPointL">
      <property name="text">
-      <string>Command e&amp;nd:</string>
+      <string>Default Decimal &amp;Point:</string>
      </property>
      <property name="buddy">
-      <cstring>endCommandED</cstring>
+      <cstring>defaultDecimalPointLE</cstring>
      </property>
     </widget>
    </item>
    <item row="4" column="2">
-    <widget class="QLineEdit" name="endCommandED">
-     <property name="toolTip">
-      <string>The LaTeX command that ends a switch to a foreign language</string>
+    <widget class="QLineEdit" name="defaultDecimalPointLE">
+     <property name="maximumSize">
+      <size>
+       <width>20</width>
+       <height>16777215</height>
+      </size>
+     </property>
+     <property name="inputMask">
+      <string>X; </string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignCenter</set>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <tabstops>
+  <tabstop>uiLanguageCO</tabstop>
   <tabstop>languagePackageED</tabstop>
   <tabstop>startCommandED</tabstop>
   <tabstop>endCommandED</tabstop>
+  <tabstop>defaultDecimalPointLE</tabstop>
   <tabstop>useBabelCB</tabstop>
   <tabstop>globalCB</tabstop>
   <tabstop>autoBeginCB</tabstop>
   <tabstop>autoEndCB</tabstop>
   <tabstop>markForeignCB</tabstop>
+  <tabstop>rtlGB</tabstop>
+  <tabstop>logicalCursorRB</tabstop>
+  <tabstop>visualCursorRB</tabstop>
  </tabstops>
  <includes>
   <include location="local">qt_i18n.h</include>
index 4b2516caa08376cfa69a93b3526ae3fcad1179a8..d9b55b2f3b5942aa4dff46f45ef3c5cd298d815c 100644 (file)
@@ -5,17 +5,20 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>374</width>
-    <height>389</height>
+    <width>358</width>
+    <height>376</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string/>
   </property>
   <property name="sizeGripEnabled" stdset="0">
-   <bool>true</bool>
+   <bool>false</bool>
   </property>
-  <layout class="QGridLayout" name="_2">
+  <layout class="QGridLayout" name="gridLayout_9">
+   <property name="margin">
+    <number>0</number>
+   </property>
    <item row="0" column="0">
     <widget class="QTabWidget" name="TabWidget">
      <property name="toolTip">
               <string>Right</string>
              </property>
             </item>
+            <item>
+             <property name="text">
+              <string>Decimal</string>
+             </property>
+            </item>
            </widget>
           </item>
           <item row="0" column="2" colspan="2">
-           <spacer>
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeType">
-             <enum>QSizePolicy::Expanding</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>40</width>
-              <height>20</height>
-             </size>
-            </property>
-           </spacer>
+           <layout class="QHBoxLayout" name="horizontalLayout">
+            <item>
+             <spacer>
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeType">
+               <enum>QSizePolicy::Expanding</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>40</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QLabel" name="decimalL">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="text">
+               <string>Decimal point:</string>
+              </property>
+              <property name="buddy">
+               <cstring>decimalPointLE</cstring>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="decimalPointLE">
+              <property name="enabled">
+               <bool>false</bool>
+              </property>
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="maximumSize">
+               <size>
+                <width>20</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="inputMask">
+               <string>X; </string>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+              <property name="maxLength">
+               <number>1</number>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignCenter</set>
+              </property>
+             </widget>
+            </item>
+           </layout>
           </item>
           <item row="1" column="0">
            <widget class="QLabel" name="fixedWidthColLA">
             </item>
            </widget>
           </item>
-          <item row="2" column="2" colspan="2">
+          <item row="2" column="2">
            <spacer name="spacer">
             <property name="orientation">
              <enum>Qt::Horizontal</enum>
          </property>
         </widget>
        </item>
-       <item row="4" column="1">
-        <spacer name="verticalSpacer_3">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>4</height>
-          </size>
-         </property>
-        </spacer>
-       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="Borders">
  <tabstops>
   <tabstop>TabWidget</tabstop>
   <tabstop>hAlignCB</tabstop>
+  <tabstop>decimalPointLE</tabstop>
   <tabstop>widthED</tabstop>
   <tabstop>widthUnitCB</tabstop>
   <tabstop>vAlignCB</tabstop>
   <tabstop>multicolumnCB</tabstop>
-  <tabstop>rotateTabularCB</tabstop>
   <tabstop>multirowCB</tabstop>
   <tabstop>rotateCellCB</tabstop>
+  <tabstop>TableAlignCB</tabstop>
+  <tabstop>rotateTabularCB</tabstop>
   <tabstop>specialAlignmentED</tabstop>
-  <tabstop>borderSetPB</tabstop>
-  <tabstop>borderUnsetPB</tabstop>
   <tabstop>borderDefaultRB</tabstop>
   <tabstop>booktabsRB</tabstop>
   <tabstop>topspaceCO</tabstop>
-  <tabstop>bottomspaceCO</tabstop>
-  <tabstop>interlinespaceCO</tabstop>
+  <tabstop>bottomspaceUnit</tabstop>
   <tabstop>topspaceED</tabstop>
+  <tabstop>topspaceUnit</tabstop>
+  <tabstop>bottomspaceCO</tabstop>
   <tabstop>bottomspaceED</tabstop>
   <tabstop>interlinespaceED</tabstop>
-  <tabstop>topspaceUnit</tabstop>
-  <tabstop>bottomspaceUnit</tabstop>
-  <tabstop>interlinespaceUnit</tabstop>
+  <tabstop>interlinespaceCO</tabstop>
   <tabstop>longTabularCB</tabstop>
+  <tabstop>interlinespaceUnit</tabstop>
   <tabstop>headerStatusCB</tabstop>
+  <tabstop>firstheaderNoContentsCB</tabstop>
   <tabstop>headerBorderAboveCB</tabstop>
   <tabstop>headerBorderBelowCB</tabstop>
   <tabstop>firstheaderStatusCB</tabstop>
   <tabstop>firstheaderBorderAboveCB</tabstop>
   <tabstop>firstheaderBorderBelowCB</tabstop>
-  <tabstop>firstheaderNoContentsCB</tabstop>
-  <tabstop>footerStatusCB</tabstop>
   <tabstop>footerBorderAboveCB</tabstop>
+  <tabstop>footerStatusCB</tabstop>
+  <tabstop>newpageCB</tabstop>
   <tabstop>footerBorderBelowCB</tabstop>
   <tabstop>lastfooterStatusCB</tabstop>
   <tabstop>lastfooterBorderAboveCB</tabstop>
   <tabstop>lastfooterBorderBelowCB</tabstop>
   <tabstop>lastfooterNoContentsCB</tabstop>
-  <tabstop>newpageCB</tabstop>
+  <tabstop>captionStatusCB</tabstop>
+  <tabstop>leftRB</tabstop>
+  <tabstop>borderSetPB</tabstop>
+  <tabstop>centerRB</tabstop>
+  <tabstop>rightRB</tabstop>
+  <tabstop>borderUnsetPB</tabstop>
  </tabstops>
  <includes>
   <include location="local">qt_i18n.h</include>
index 77c1fa63654c2bf775227e1bd78a6c738de6f1c9..0ae20f124631c7de986cb515b70fc346e794ef55 100644 (file)
@@ -125,6 +125,7 @@ TabularFeature tabularFeature[] =
        { Tabular::ALIGN_RIGHT, "align-right", false },
        { Tabular::ALIGN_CENTER, "align-center", false },
        { Tabular::ALIGN_BLOCK, "align-block", false },
+       { Tabular::ALIGN_DECIMAL, "align-decimal", false },
        { Tabular::VALIGN_TOP, "valign-top", false },
        { Tabular::VALIGN_BOTTOM, "valign-bottom", false },
        { Tabular::VALIGN_MIDDLE, "valign-middle", false },
@@ -174,6 +175,7 @@ TabularFeature tabularFeature[] =
        { Tabular::LONGTABULAR_ALIGN_LEFT, "longtabular-align-left", false },
        { Tabular::LONGTABULAR_ALIGN_CENTER, "longtabular-align-center", false },
        { Tabular::LONGTABULAR_ALIGN_RIGHT, "longtabular-align-right", false },
+       { Tabular::SET_DECIMAL_POINT, "set-decimal-point", true },
        { Tabular::LAST_ACTION, "", false }
 };
 
@@ -251,6 +253,8 @@ string const tostr(LyXAlignment const & num)
                return "layout";
        case LYX_ALIGN_SPECIAL:
                return "special";
+       case LYX_ALIGN_DECIMAL:
+               return "decimal";
        }
        return string();
 }
@@ -311,6 +315,8 @@ bool string2type(string const str, LyXAlignment & num)
                num = LYX_ALIGN_CENTER;
        else if (str == "right")
                num = LYX_ALIGN_RIGHT;
+       else if (str == "decimal")
+               num = LYX_ALIGN_DECIMAL;
        else
                return false;
        return true;
@@ -502,6 +508,30 @@ string const featureAsString(Tabular::Feature action)
 }
 
 
+InsetTableCell splitCell(InsetTableCell & head, docstring const align_d, bool & hassep)
+{
+       InsetTableCell tail = InsetTableCell(head);
+       tail.getText(0)->setMacrocontextPosition(
+               head.getText(0)->macrocontextPosition());
+       tail.setBuffer(head.buffer());
+
+       DocIterator dit = doc_iterator_begin(&head.buffer(), &head);
+       for (; dit; dit.forwardChar())
+               if (dit.inTexted() && dit.depth()==1
+                       && dit.paragraph().find(align_d, false, false, dit.pos()))
+                       break;
+
+       pit_type const psize = head.paragraphs().front().size();
+       hassep = dit;
+       if (hassep)
+               head.paragraphs().front().eraseChars(dit.pos(), psize, false);
+
+       tail.paragraphs().front().eraseChars(0, 
+               dit.pos() < psize ? dit.pos() + 1 : psize, false);
+
+       return tail;
+}
+
 
 /////////////////////////////////////////////////////////////////////
 //
@@ -517,6 +547,8 @@ Tabular::CellData::CellData(Buffer * buf)
          multirow(Tabular::CELL_NORMAL),
          alignment(LYX_ALIGN_CENTER),
          valignment(LYX_VALIGN_TOP),
+         decimal_hoffset(0),
+         decimal_width(0),
          voffset(0),
          top_line(false),
          bottom_line(false),
@@ -537,6 +569,8 @@ Tabular::CellData::CellData(CellData const & cs)
          multirow(cs.multirow),
          alignment(cs.alignment),
          valignment(cs.valignment),
+         decimal_hoffset(cs.decimal_hoffset),
+         decimal_width(cs.decimal_width),
          voffset(cs.voffset),
          top_line(cs.top_line),
          bottom_line(cs.bottom_line),
@@ -564,6 +598,8 @@ void Tabular::CellData::swap(CellData & rhs)
        std::swap(multirow, rhs.multirow);
        std::swap(alignment, rhs.alignment);
        std::swap(valignment, rhs.valignment);
+       std::swap(decimal_hoffset, rhs.decimal_hoffset);
+       std::swap(decimal_width, rhs.decimal_width);
        std::swap(voffset, rhs.voffset);
        std::swap(top_line, rhs.top_line);
        std::swap(bottom_line, rhs.bottom_line);
@@ -814,7 +850,8 @@ void Tabular::updateIndexes()
                        rowofcell[i] = row;
                        columnofcell[i] = column;
                        setFixedWidth(row, column);
-                       updateContentAlignment(row, column);
+                       cell_info[row][column].inset->setContentAlignment(
+                               getAlignment(cellIndex(row, column)));
                        ++i;
                }
 }
@@ -910,6 +947,14 @@ int Tabular::cellHeight(idx_type cell) const
 
 bool Tabular::updateColumnWidths()
 {
+       vector<int> max_dwidth(ncols(), 0);
+       for(col_type c = 0; c < ncols(); ++c)
+               for(row_type r = 0; r < nrows(); ++r) {
+                       idx_type const i = cellIndex(r, c);
+                       if (getAlignment(i) == LYX_ALIGN_DECIMAL)
+                               max_dwidth[c] = max(max_dwidth[c], cell_info[r][c].decimal_width);
+               }
+
        bool update = false;
        // for each col get max of single col cells
        for(col_type c = 0; c < ncols(); ++c) {
@@ -917,7 +962,11 @@ bool Tabular::updateColumnWidths()
                for(row_type r = 0; r < nrows(); ++r) {
                        idx_type const i = cellIndex(r, c);
                        if (columnSpan(i) == 1)
-                               new_width = max(new_width, cellInfo(i).width);
+                               if (getAlignment(i) == LYX_ALIGN_DECIMAL)
+                                       new_width = max(new_width, cellInfo(i).width 
+                                               + max_dwidth[c] - cellInfo(i).decimal_width);
+                               else
+                                       new_width = max(new_width, cellInfo(i).width);
                }
 
                if (column_info[c].width != new_width) {
@@ -966,11 +1015,16 @@ void Tabular::setCellWidth(idx_type cell, int new_width)
 void Tabular::setAlignment(idx_type cell, LyXAlignment align,
                              bool onlycolumn)
 {
-       if (!isMultiColumn(cell) || onlycolumn)
-               column_info[cellColumn(cell)].alignment = align;
-       if (!onlycolumn)
+       col_type const col = cellColumn(cell);
+       if (onlycolumn || !isMultiColumn(cell)) {
+               column_info[col].alignment = align;
+               docstring & dpoint = column_info[col].decimal_point;
+               if (align == LYX_ALIGN_DECIMAL && dpoint.empty())
+                       dpoint = from_utf8(lyxrc.default_decimal_point);
+       } else {
                cellInfo(cell).alignment = align;
-       cellInset(cell).get()->setContentAlignment(align);
+               cellInset(cell).get()->setContentAlignment(align);
+       }
 }
 
 
@@ -1050,13 +1104,6 @@ bool Tabular::setFixedWidth(row_type r, col_type c)
 }
 
 
-void Tabular::updateContentAlignment(row_type r, col_type c)
-{
-       cell_info[r][c].inset->setContentAlignment(
-               getAlignment(cellIndex(r, c)));
-}
-
-
 bool Tabular::setMColumnPWidth(Cursor & cur, idx_type cell,
                Length const & width)
 {
@@ -1170,8 +1217,9 @@ bool Tabular::columnRightLine(col_type c) const
 
 LyXAlignment Tabular::getAlignment(idx_type cell, bool onlycolumn) const
 {
-       if (!onlycolumn && isMultiColumn(cell))
+       if (!onlycolumn && (isMultiColumn(cell) || isMultiRow(cell)))
                return cellInfo(cell).alignment;
+       
        return column_info[cellColumn(cell)].alignment;
 }
 
@@ -1212,6 +1260,21 @@ int Tabular::textHOffset(idx_type cell) const
                x += columnWidth(cell) - cellWidth(cell);
                // + interColumnSpace(cell);
                break;
+       case LYX_ALIGN_DECIMAL: {
+               // we center when no decimal point
+               if (cellInfo(cell).decimal_width == 0) {
+                       x += (columnWidth(cell) - cellWidth(cell)) / 2;
+                       break;
+               }
+               col_type const c = cellColumn(cell);
+               int max_dhoffset = 0;
+               for(row_type r = 0; r < row_info.size() ; ++r) {
+                       idx_type const i = cellIndex(r, c);
+                       if (getAlignment(i) == LYX_ALIGN_DECIMAL)
+                               max_dhoffset = max(max_dhoffset, cellInfo(i).decimal_hoffset);
+               }
+               x += max_dhoffset - cellInfo(cell).decimal_hoffset;
+       }
        default:
                // LYX_ALIGN_LEFT: nothing :-)
                break;
@@ -1303,8 +1366,10 @@ void Tabular::write(ostream & os) const
        os << ">\n";
        for (col_type c = 0; c < ncols(); ++c) {
                os << "<column"
-                  << write_attribute("alignment", column_info[c].alignment)
-                  << write_attribute("valignment", column_info[c].valignment)
+                  << write_attribute("alignment", column_info[c].alignment);
+               if (column_info[c].alignment == LYX_ALIGN_DECIMAL)
+                  os << write_attribute("decimal_point", column_info[c].decimal_point);
+               os << write_attribute("valignment", column_info[c].valignment)
                   << write_attribute("width", column_info[c].p_width.asString())
                   << write_attribute("special", column_info[c].align_special)
                   << ">\n";
@@ -1410,6 +1475,7 @@ void Tabular::read(Lexer & lex)
                        return;
                }
                getTokenValue(line, "alignment", column_info[c].alignment);
+               getTokenValue(line, "decimal_point", column_info[c].decimal_point);
                getTokenValue(line, "valignment", column_info[c].valignment);
                getTokenValue(line, "width", column_info[c].p_width);
                getTokenValue(line, "special", column_info[c].align_special);
@@ -1504,7 +1570,8 @@ Tabular::idx_type Tabular::setMultiColumn(idx_type cell, idx_type number)
        cell = cellIndex(row, col);
        CellData & cs = cellInfo(cell);
        cs.multicolumn = CELL_BEGIN_OF_MULTICOLUMN;
-       cs.alignment = column_info[col].alignment;
+       if (column_info[col].alignment != LYX_ALIGN_DECIMAL)
+               cs.alignment = column_info[col].alignment;
        if (col > 0)
                setRightLine(cell, rightLine(cellIndex(row, col - 1)));
 
@@ -1544,7 +1611,7 @@ Tabular::idx_type Tabular::setMultiRow(idx_type cell, idx_type number)
        // change (assigning this to uwestoehr)
        // until LyX supports this, use the deault alignment of multirow
        // cells: left
-       cs.alignment = LYX_ALIGN_LEFT
+       cs.alignment = LYX_ALIGN_CENTER
 
        // set the bottom row of the last selected cell
        setBottomLine(cell, bottomLine(cell + (number - 1)*ncols()));
@@ -1563,11 +1630,12 @@ Tabular::idx_type Tabular::setMultiRow(idx_type cell, idx_type number)
 Tabular::idx_type Tabular::columnSpan(idx_type cell) const
 {
        row_type const row = cellRow(cell);
-       col_type column = cellColumn(cell) + 1;
-       while (column < ncols() && isPartOfMultiColumn(row, column))
-               ++column;
+       col_type const col = cellColumn(cell);
+       int span = 1;
+       while (col + span < ncols() && isPartOfMultiColumn(row, col + span))
+               ++span;
 
-       return column - cellColumn(cell);
+       return span;
 }
 
 
@@ -1936,20 +2004,29 @@ int Tabular::TeXTopHLine(odocstream & os, row_type row, string const lang) const
                }
        } else if (row == 0) {
                for (col_type c = 0; c < ncols(); ++c) {
-                       if (topline[c]) {
-                               //babel makes the "-" character an active one, so we have to suppress this here
-                               //see http://groups.google.com/group/comp.text.tex/browse_thread/thread/af769424a4a0f289#
-                               if (lang == "slovak" || lang == "czech")
-                                       os << (use_booktabs ? "\\expandafter\\cmidrule\\expandafter{\\expandafter" :
-                                                             "\\expandafter\\cline\\expandafter{\\expandafter")
-                                                                                 << c + 1 << "\\string-";
-                               else
-                                       os << (use_booktabs ? "\\cmidrule{" : "\\cline{") << c + 1 << '-';
-                               // get to last column of line span
-                               while (c < ncols() && topline[c])
-                                       ++c;
-                               os << c << "} ";
-                       }
+                       for ( ; c < ncols() && !topline[c]; ++c) {}
+
+                       col_type offset = 0;
+                       for (col_type j = 0 ; j < c; ++j)
+                               if (column_info[j].alignment == LYX_ALIGN_DECIMAL)
+                                       ++offset;
+
+                       //babel makes the "-" character an active one, so we have to suppress this here
+                       //see http://groups.google.com/group/comp.text.tex/browse_thread/thread/af769424a4a0f289#
+                       if (lang == "slovak" || lang == "czech")
+                               os << "\\expandafter" << (use_booktabs ? "\\cmidrule" : "\\cline") 
+                                  << "\\expandafter{\\expandafter" << c + 1 + offset << "\\string-";
+                       else
+                               os << (use_booktabs ? "\\cmidrule{" : "\\cline{") << c + 1 + offset << '-';
+
+                       col_type cstart = c;
+                       for ( ; c < ncols() && topline[c]; ++c) {}
+
+                       for (col_type j = cstart ; j < c ; ++j)
+                               if (column_info[j].alignment == LYX_ALIGN_DECIMAL)
+                                       ++offset;
+
+                       os << c + offset << "} ";
                }
        }
        os << "\n";
@@ -2000,20 +2077,29 @@ int Tabular::TeXBottomHLine(odocstream & os, row_type row, string const lang) co
                        os << "\\hline ";
        } else {
                for (col_type c = 0; c < ncols(); ++c) {
-                       if (bottomline[c]) {
-                               //babel makes the "-" character an active one, so we have to suppress this here
-                               //see http://groups.google.com/group/comp.text.tex/browse_thread/thread/af769424a4a0f289#
-                               if (lang == "slovak" || lang == "czech")
-                                       os << (use_booktabs ? "\\expandafter\\cmidrule\\expandafter{\\expandafter" :
-                                                             "\\expandafter\\cline\\expandafter{\\expandafter")
-                                                                                 << c + 1 << "\\string-";
-                               else
-                                       os << (use_booktabs ? "\\cmidrule{" : "\\cline{") << c + 1 << '-';
-                               // get to last column of line span
-                               while (c < ncols() && bottomline[c])
-                                       ++c;
-                               os << c << "} ";
-                       }
+                       for ( ; c < ncols() && !bottomline[c]; ++c) {}
+
+                       col_type offset = 0;
+                       for (col_type j = 0 ; j < c; ++j)
+                               if (column_info[j].alignment == LYX_ALIGN_DECIMAL)
+                                       ++offset;
+
+                       //babel makes the "-" character an active one, so we have to suppress this here
+                       //see http://groups.google.com/group/comp.text.tex/browse_thread/thread/af769424a4a0f289#
+                       if (lang == "slovak" || lang == "czech")
+                               os << "\\expandafter" << (use_booktabs ? "\\cmidrule" : "\\cline") 
+                                  << "\\expandafter{\\expandafter" << c + 1 + offset << "\\string-";
+                       else
+                               os << (use_booktabs ? "\\cmidrule{" : "\\cline{") << c + 1 + offset << '-';
+
+                       col_type cstart = c;
+                       for ( ; c < ncols() && bottomline[c]; ++c) {}
+
+                       for (col_type j = cstart ; j < c ; ++j)
+                               if (column_info[j].alignment == LYX_ALIGN_DECIMAL)
+                                       ++offset;
+
+                       os << c + offset << "} ";
                }
        }
        os << "\n";
@@ -2048,8 +2134,19 @@ int Tabular::TeXCellPreamble(odocstream & os, idx_type cell,
                || ((colright || nextcolleft) && !rightLine(cell) && !nextcellleft)
                || (!colright && !nextcolleft && (rightLine(cell) || nextcellleft))
                || (coldouble != celldouble);
+
+       // we center in multicol when no decimal point
+       ismulticol |= ((column_info[c].alignment == LYX_ALIGN_DECIMAL)
+               && (cellInfo(cell).decimal_width == 0) || isMultiRow(cell));
+
+       // up counter by 1 for each decimally aligned col since they use 2 latex cols
+       int latexcolspan = columnSpan(cell);
+       for(col_type col = c; col < c + columnSpan(cell); ++col)
+               if (column_info[col].alignment == LYX_ALIGN_DECIMAL)
+                       ++latexcolspan;
+
        if (ismulticol) {
-               os << "\\multicolumn{" << columnSpan(cell) << "}{";
+               os << "\\multicolumn{" << latexcolspan << "}{";
                if (c ==0 && leftLine(cell))
                        os << '|';
                if (!cellInfo(cell).align_special.empty()) {
@@ -2103,7 +2200,7 @@ int Tabular::TeXCellPreamble(odocstream & os, idx_type cell,
                        // add extra vertical line if we want a double one
                        os << '|';
                os << "}{";
-               } // end if ismulticol
+       } // end if ismulticol
 
        // we only need code for the first multirow cell
        ismultirow = isMultiRow(cell);
@@ -2116,7 +2213,7 @@ int Tabular::TeXCellPreamble(odocstream & os, idx_type cell,
                        // needs to be discussed
                        os << "*";
                os << "}{";
-               } // end if ismultirow
+       } // end if ismultirow
 
        if (getRotateCell(cell)) {
                os << "\\begin{sideways}\n";
@@ -2177,9 +2274,11 @@ int Tabular::TeXCellPostamble(odocstream & os, idx_type cell,
                os << "%\n\\end{sideways}";
                ++ret;
        }
-       if (ismulticol || ismultirow) {
+       if (ismultirow)
                os << '}';
-       }
+       if (ismulticol)
+               os << '}';
+
        return ret;
 }
 
@@ -2328,10 +2427,15 @@ int Tabular::TeXRow(odocstream & os, row_type row,
        bool ismulticol = false;
        bool ismultirow = false;
        for (col_type c = 0; c < ncols(); ++c) {
-               if (isPartOfMultiRow(row, c))
-                       os << " & "; // we need to add a further column
-               if (isPartOfMultiColumn(row, c) || isPartOfMultiRow(row, c))
+               if (isPartOfMultiColumn(row, c))
+                       continue;
+                       
+               if (isPartOfMultiRow(row, c) && 
+                       column_info[c].alignment != LYX_ALIGN_DECIMAL) {
+                       os << " & "; 
                        continue;
+               }
+
                cell = cellIndex(row, c);
                ret += TeXCellPreamble(os, cell, ismulticol, ismultirow);
                shared_ptr<InsetTableCell> inset = cellInset(cell);
@@ -2360,7 +2464,22 @@ int Tabular::TeXRow(odocstream & os, row_type row,
                newrp.inTableCell = (getAlignment(cell) == LYX_ALIGN_BLOCK)
                                    ? OutputParams::PLAIN
                                    : OutputParams::ALIGNED;
-               ret += inset->latex(os, newrp);
+
+               if (getAlignment(cell) == LYX_ALIGN_DECIMAL
+                       && cellInfo(cell).decimal_width != 0 && !isMultiRow(cell)) {
+                       // copy cell and split in 2
+                       InsetTableCell head = InsetTableCell(*cellInset(cell).get());
+                       head.getText(0)->setMacrocontextPosition(
+                               cellInset(cell)->getText(0)->macrocontextPosition());
+                       head.setBuffer(buffer());
+                       bool hassep = false;
+                       InsetTableCell tail = splitCell(head, column_info[c].decimal_point, hassep);
+                       head.latex(os, newrp);
+                       os << '&';
+                       ret += tail.latex(os, newrp);
+               } else if (!isPartOfMultiRow(row, c))
+                       ret += inset->latex(os, newrp);
+
                runparams.encoding = newrp.encoding;
                if (rtl)
                        os << '}';
@@ -2477,6 +2596,7 @@ int Tabular::latex(odocstream & os, OutputParams const & runparams) const
                                case LYX_ALIGN_BLOCK:
                                case LYX_ALIGN_LAYOUT:
                                case LYX_ALIGN_SPECIAL:
+                               case LYX_ALIGN_DECIMAL:
                                        break;
                                }
 
@@ -2502,6 +2622,9 @@ int Tabular::latex(odocstream & os, OutputParams const & runparams) const
                                case LYX_ALIGN_RIGHT:
                                        os << 'r';
                                        break;
+                               case LYX_ALIGN_DECIMAL:
+                                       os << "r@{\\extracolsep{0pt}" << column_info[c].decimal_point << "}l";
+                                       break;
                                default:
                                        os << 'c';
                                        break;
@@ -3235,6 +3358,33 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
                        // FIXME(?): do we need a second metrics call?
                        TextMetrics const & tm = 
                                mi.base.bv->textMetrics(tabular.cellInset(cell)->getText(0));
+
+                       // determine horiz offset because of decimal align (if necessary)
+                       int decimal_hoffset = 0;
+                       int decimal_width = 0;
+                       if ((tabular.column_info[c].alignment == LYX_ALIGN_DECIMAL)
+                               && !tabular.isMultiColumn(cell)
+                               && !tabular.isMultiRow(cell)) {
+                               // make a copy which we will split in 2
+                               InsetTableCell head = InsetTableCell(*tabular.cellInset(cell).get());
+                               head.getText(0)->setMacrocontextPosition(
+                                       tabular.cellInset(cell)->getText(0)->macrocontextPosition());
+                               head.setBuffer(tabular.buffer());
+                               // split in 2 and calculate width of each part
+                               bool hassep = false;
+                               InsetTableCell tail = 
+                                       splitCell(head, tabular.column_info[c].decimal_point, hassep);
+                               Dimension dim1;
+                               head.metrics(m, dim1);
+                               decimal_hoffset = dim1.width();
+                               if (hassep) {
+                                       tail.metrics(m, dim1);
+                                       decimal_width = dim1.width();
+                               }
+                       }
+                       tabular.cell_info[r][c].decimal_hoffset = decimal_hoffset;
+                       tabular.cell_info[r][c].decimal_width = decimal_width;
+
                        // with LYX_VALIGN_BOTTOM the descent is relative to the last par
                        // = descent of text in last par + TEXT_TO_INSET_OFFSET:
                        int const lastpardes = tm.last().second->descent()
@@ -4040,6 +4190,11 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                        status.clear();
                        return true;
 
+               case Tabular::SET_DECIMAL_POINT:
+                       status.setEnabled(
+                               tabular.getAlignment(cur.idx()) == LYX_ALIGN_DECIMAL);
+                       break;
+
                case Tabular::MULTICOLUMN:
                        // If a row is set as longtable caption, it must not be allowed
                        // to unset that this row is a multicolumn.
@@ -4116,6 +4271,12 @@ bool InsetTabular::getStatus(Cursor & cur, FuncRequest const & cmd,
                        status.setOnOff(tabular.getAlignment(cur.idx(), flag) == LYX_ALIGN_BLOCK);
                        break;
 
+               case Tabular::ALIGN_DECIMAL:
+                       status.setEnabled(!tabular.isMultiRow(cur.idx()) 
+                               && !tabular.isMultiColumn(cur.idx()));
+                       status.setOnOff(tabular.getAlignment(cur.idx(), true) == LYX_ALIGN_DECIMAL);
+                       break;
+
                case Tabular::M_VALIGN_TOP:
                        flag = false;
                case Tabular::VALIGN_TOP:
@@ -4810,6 +4971,10 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                setAlign = LYX_ALIGN_BLOCK;
                break;
 
+       case Tabular::ALIGN_DECIMAL:
+               setAlign = LYX_ALIGN_DECIMAL;
+               break;
+
        case Tabular::M_VALIGN_TOP:
        case Tabular::VALIGN_TOP:
                setVAlign = Tabular::LYX_VALIGN_TOP;
@@ -4954,6 +5119,7 @@ void InsetTabular::tabularFeatures(Cursor & cur,
        case Tabular::ALIGN_RIGHT:
        case Tabular::ALIGN_CENTER:
        case Tabular::ALIGN_BLOCK:
+       case Tabular::ALIGN_DECIMAL:
                for (row_type r = sel_row_start; r <= sel_row_end; ++r)
                        for (col_type c = sel_col_start; c <= sel_col_end; ++c)
                                tabular.setAlignment(tabular.cellIndex(r, c), setAlign, flag);
@@ -5245,6 +5411,11 @@ void InsetTabular::tabularFeatures(Cursor & cur,
                break;
        }
 
+       case Tabular::SET_DECIMAL_POINT:
+               for (col_type c = sel_col_start; c <= sel_col_end; ++c)
+                       tabular.column_info[c].decimal_point = from_utf8(value);
+               break;
+
        // dummy stuff just to avoid warnings
        case Tabular::LAST_ACTION:
                break;
index e0c4326c4e40c8834315e8e16dc5e06710e72901..d529793016411e36adab4fb40b74055aa24bcf08 100644 (file)
@@ -96,6 +96,8 @@ public:
                ///
                ALIGN_BLOCK,
                ///
+               ALIGN_DECIMAL,
+               ///
                VALIGN_TOP,
                ///
                VALIGN_BOTTOM,
@@ -190,6 +192,8 @@ public:
                ///
                LONGTABULAR_ALIGN_RIGHT,
                ///
+               SET_DECIMAL_POINT,
+               ///
                LAST_ACTION
        };
        ///
@@ -490,6 +494,10 @@ public:
                LyXAlignment alignment;
                ///
                VAlignment valignment;
+               /// width of the part before the decimal
+               int decimal_hoffset;
+               /// width of the decimal part
+               int decimal_width;
                ///
                int voffset;
                ///
@@ -570,6 +578,8 @@ public:
                Length p_width;
                ///
                docstring align_special;
+               ///
+               docstring decimal_point;
        };
        ///
        typedef std::vector<ColumnData> column_vector;
@@ -614,8 +624,6 @@ public:
        void updateIndexes();
        ///
        bool setFixedWidth(row_type r, col_type c);
-       ///
-       void updateContentAlignment(row_type r, col_type c);
        /// return true of update is needed
        bool updateColumnWidths();
        ///
@@ -944,6 +952,9 @@ private:
 
 std::string const featureAsString(Tabular::Feature feature);
 
+/// Split cell on decimal symbol
+InsetTableCell splitCell(InsetTableCell & head, docstring const decimal_sym, bool & hassep);
+
 } // namespace lyx
 
 #endif // INSET_TABULAR_H