]> git.lyx.org Git - features.git/commitdiff
Added support for vertical aligment (using array-package) and also better
authorJürgen Vigna <jug@sad.it>
Mon, 17 Jul 2000 14:31:07 +0000 (14:31 +0000)
committerJürgen Vigna <jug@sad.it>
Mon, 17 Jul 2000 14:31:07 +0000 (14:31 +0000)
support for setting header/footer in longtables. The Inset-Tabular-Layout
is now fully functionall!

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@889 a592a061-630c-0410-9148-cb99ea01b6c8

13 files changed:
ChangeLog
lib/chkconfig.ltx
lib/doc/LaTeXConfig.lyx.in
po/POTFILES.in
src/LaTeXFeatures.C
src/LaTeXFeatures.h
src/frontends/xforms/FormTabular.C
src/frontends/xforms/form_tabular.C
src/frontends/xforms/form_tabular.h
src/frontends/xforms/forms/form_tabular.fd
src/insets/insettabular.C
src/tabular.C
src/tabular.h

index 1a93f9814ae511502278d574d3bee85008427f12..9c8e182729ed448dcb4ea5f9ffb838ee4346ced3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2000-07-17  Juergen Vigna  <jug@sad.it>
+
+       * src/tabular.C (Validate): check if array-package is needed.
+       (SetVAlignment): added support for vertical alignment.
+       (SetLTFoot): better support for longtable header/footers
+       (Latex): modified to support added features.
+
+       * src/LaTeXFeatures.[Ch]: added array-package.
+
 2000-07-17  R. Lahaye  <lahaye@postech.ac.kr>
 
        * src/lyx_gui.C (LyXGUI): make sure that the height is large
index 9f328741212f05222358d1a13d5a77a712ec5d3e..720f4be03ee07a3652c1e76a9af9301cded8ea96 100644 (file)
 %%% Packages
 \TestPackage{a4}
 \TestPackage{a4wide}
+\TestPackage{array}
 \TestPackage{babel}
 \TestPackage{color} % this one should be there if graphics.sty is there.
 \TestPackage{fancyhdr}
index 18db6d61aa71db738e17023f44c101919af20066..c38c76ef299fffb218a7fb93b7a27f734a797341 100644 (file)
@@ -1056,6 +1056,21 @@ a4
 Other packages
 \layout Subsection
 
+array
+\layout Description
+
+Found: @chk_array@
+\layout Description
+
+CTAN: 
+\family typewriter 
+macros/latex/required/tools/array.dtx
+\layout Description
+
+Notes: The package array is needed by LyX to be able to output vertical
+ alignment other then ''top'' for tabulars.
+\layout Subsection
+
 algorithm
 \layout Description
 
index fabdfa0ebe0cade35f6a63dc20eec591c5b94e11..0961c34f8edf6d75b3fbb71c3d915dc128dd6e5a 100644 (file)
@@ -33,6 +33,11 @@ src/frontends/xforms/FormPreferences.C
 src/frontends/xforms/form_preferences.C
 src/frontends/xforms/FormPrint.C
 src/frontends/xforms/form_print.C
+src/frontends/xforms/forms/form_citation.C
+src/frontends/xforms/forms/form_copyright.C
+src/frontends/xforms/forms/form_preferences.C
+src/frontends/xforms/forms/form_print.C
+src/frontends/xforms/forms/form_tabular.C
 src/frontends/xforms/FormTabular.C
 src/frontends/xforms/form_tabular.C
 src/gettext.h
index d64f96b3ee45f1fde11b8f8b08fa1cb3fe38e875..c7172bfa5577ea7c6d09f4bd6c8f9bfd8e5bc766 100644 (file)
@@ -29,6 +29,7 @@ LaTeXFeatures::LaTeXFeatures(BufferParams const & p, int n)
        : layout(n, false), params(p)
 {
        // packages
+       array = false;
        color = false;
        graphics = false;
        setspace = false;
@@ -73,7 +74,9 @@ LaTeXFeatures::LaTeXFeatures(BufferParams const & p, int n)
 }
 
 void LaTeXFeatures::require(string const & name) {
-       if (name == "color") {
+       if (name == "array") {
+               array = true;
+       } else if (name == "color") {
                color = true;
        } else if (name == "graphics") {
 #ifdef USE_GRAPHICX
@@ -126,6 +129,10 @@ string LaTeXFeatures::getPackages()
        LyXTextClass const & tclass =
                textclasslist.TextClass(params.textclass);
 
+       // array-package
+       if (array)
+               packages += "\\usepackage{array}\n";
+
        // color.sty
        if (color) {
                if (params.graphicsDriver == "default")
index 25b1db14b8e9d6ef40a6dd0d99f19275644a30b3..48c4bc198eba806b0ce737fabcd0189b6b8d5e08 100644 (file)
@@ -55,6 +55,8 @@ struct LaTeXFeatures {
        //@Man: Packages
        //@{
        ///
+       bool array;
+       ///
        bool color;     // color.sty
 #ifdef USE_GRAPHICX
        ///
index bbe35664ee180d9dcf5e5f57672083171e48d38e..5575f8608667136c33d8dee5b2783f9c071a205e 100644 (file)
@@ -220,7 +220,7 @@ void FormTabular::InputCB(FL_OBJECT * ob, long l)
 }
 
 
-bool FormTabular::local_update(bool flag)
+bool FormTabular::local_update(bool)
 {
     if (!inset_ || !inset_->tabular)
         return false;
@@ -249,48 +249,158 @@ bool FormTabular::local_update(bool flag)
     sprintf(buf,"%d",row);
     fl_set_input(dialog_->input_tabular_row, buf);
     fl_deactivate_object(dialog_->input_tabular_row);
-    if (tabular->IsMultiColumn(cell))
+    if (tabular->IsMultiColumn(cell)) {
         fl_set_button(cell_options_->radio_multicolumn, 1);
-    else
+        fl_set_button(cell_options_->radio_border_top,
+                     tabular->TopLine(cell)?1:0);
+        fl_activate_object(cell_options_->radio_border_top);
+        fl_set_object_lcol(cell_options_->radio_border_top, FL_BLACK);
+        fl_set_button(cell_options_->radio_border_bottom,
+                     tabular->BottomLine(cell)?1:0);
+        fl_activate_object(cell_options_->radio_border_bottom);
+        fl_set_object_lcol(cell_options_->radio_border_bottom, FL_BLACK);
+        fl_set_button(cell_options_->radio_border_left,
+                     tabular->LeftLine(cell)?1:0);
+        fl_activate_object(cell_options_->radio_border_left);
+        fl_set_object_lcol(cell_options_->radio_border_left, FL_BLACK);
+       fl_set_button(cell_options_->radio_border_right,
+                     tabular->RightLine(cell)?1:0);
+        fl_activate_object(cell_options_->radio_border_right);
+        fl_set_object_lcol(cell_options_->radio_border_right, FL_BLACK);
+       pwidth = tabular->GetMColumnPWidth(cell);
+       align = tabular->GetAlignment(cell);
+       if (!pwidth.empty() || (align == LYX_ALIGN_LEFT))
+           fl_set_button(cell_options_->radio_align_left, 1);
+       else if (align == LYX_ALIGN_RIGHT)
+           fl_set_button(cell_options_->radio_align_right, 1);
+       else
+           fl_set_button(cell_options_->radio_align_center, 1);
+        fl_activate_object(cell_options_->radio_align_left);
+        fl_set_object_lcol(cell_options_->radio_align_left, FL_BLACK);
+        fl_activate_object(cell_options_->radio_align_right);
+        fl_set_object_lcol(cell_options_->radio_align_right, FL_BLACK);
+        fl_activate_object(cell_options_->radio_align_center);
+        fl_set_object_lcol(cell_options_->radio_align_center, FL_BLACK);
+       align = tabular->GetVAlignment(cell);
+       fl_set_button(cell_options_->radio_valign_top, 0);
+       fl_set_button(cell_options_->radio_valign_bottom, 0);
+       fl_set_button(cell_options_->radio_valign_center, 0);
+       if (pwidth.empty() || (align == LyXTabular::LYX_VALIGN_CENTER))
+           fl_set_button(cell_options_->radio_valign_center, 1);
+       else if (align == LyXTabular::LYX_VALIGN_BOTTOM)
+           fl_set_button(cell_options_->radio_valign_bottom, 1);
+       else
+           fl_set_button(cell_options_->radio_valign_top, 1);
+        fl_activate_object(cell_options_->radio_valign_top);
+        fl_set_object_lcol(cell_options_->radio_valign_top, FL_BLACK);
+        fl_activate_object(cell_options_->radio_valign_bottom);
+        fl_set_object_lcol(cell_options_->radio_valign_bottom, FL_BLACK);
+        fl_activate_object(cell_options_->radio_valign_center);
+        fl_set_object_lcol(cell_options_->radio_valign_center, FL_BLACK);
+       special = tabular->GetAlignSpecial(cell,LyXTabular::SET_SPECIAL_MULTI);
+       fl_set_input(cell_options_->input_special_multialign, special.c_str());
+       fl_set_input(cell_options_->input_mcolumn_width,pwidth.c_str());
+       if (!lv_->buffer()->isReadonly()) {
+           fl_activate_object(cell_options_->input_special_multialign);
+           fl_set_object_lcol(cell_options_->input_special_multialign,
+                              FL_BLACK);
+           fl_activate_object(cell_options_->input_mcolumn_width);
+           fl_set_object_lcol(cell_options_->input_mcolumn_width, FL_BLACK);
+       }
+       if (!pwidth.empty()) {
+           fl_deactivate_object(cell_options_->radio_align_left);
+           fl_deactivate_object(cell_options_->radio_align_right);
+           fl_deactivate_object(cell_options_->radio_align_center);
+           fl_set_object_lcol(cell_options_->radio_align_left, FL_INACTIVE);
+           fl_set_object_lcol(cell_options_->radio_align_right, FL_INACTIVE);
+           fl_set_object_lcol(cell_options_->radio_align_center, FL_INACTIVE);
+           fl_activate_object(cell_options_->radio_valign_top);
+           fl_activate_object(cell_options_->radio_valign_bottom);
+           fl_activate_object(cell_options_->radio_valign_center);
+           fl_set_object_lcol(cell_options_->radio_valign_top, FL_BLACK);
+           fl_set_object_lcol(cell_options_->radio_valign_bottom, FL_BLACK);
+           fl_set_object_lcol(cell_options_->radio_valign_center, FL_BLACK);
+       } else {
+           fl_activate_object(cell_options_->radio_align_left);
+           fl_activate_object(cell_options_->radio_align_right);
+           fl_activate_object(cell_options_->radio_align_center);
+           fl_set_object_lcol(cell_options_->radio_align_left, FL_BLACK);
+           fl_set_object_lcol(cell_options_->radio_align_right, FL_BLACK);
+           fl_set_object_lcol(cell_options_->radio_align_center, FL_BLACK);
+           fl_deactivate_object(cell_options_->radio_valign_top);
+           fl_deactivate_object(cell_options_->radio_valign_bottom);
+           fl_deactivate_object(cell_options_->radio_valign_center);
+           fl_set_object_lcol(cell_options_->radio_valign_top, FL_INACTIVE);
+           fl_set_object_lcol(cell_options_->radio_valign_bottom,FL_INACTIVE);
+           fl_set_object_lcol(cell_options_->radio_valign_center,FL_INACTIVE);
+       }
+    } else {
         fl_set_button(cell_options_->radio_multicolumn, 0);
+       fl_set_button(cell_options_->radio_border_top, 0);
+        fl_deactivate_object(cell_options_->radio_border_top);
+        fl_set_object_lcol(cell_options_->radio_border_top, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_border_bottom, 0);
+        fl_deactivate_object(cell_options_->radio_border_bottom);
+        fl_set_object_lcol(cell_options_->radio_border_bottom, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_border_left, 0);
+        fl_deactivate_object(cell_options_->radio_border_left);
+        fl_set_object_lcol(cell_options_->radio_border_left, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_border_right, 0);
+        fl_deactivate_object(cell_options_->radio_border_right);
+        fl_set_object_lcol(cell_options_->radio_border_right, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_align_left, 0);
+        fl_deactivate_object(cell_options_->radio_align_left);
+        fl_set_object_lcol(cell_options_->radio_align_left, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_align_right, 0);
+        fl_deactivate_object(cell_options_->radio_align_right);
+        fl_set_object_lcol(cell_options_->radio_align_right, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_align_center, 0);
+        fl_deactivate_object(cell_options_->radio_align_center);
+        fl_set_object_lcol(cell_options_->radio_align_center, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_valign_top, 0);
+        fl_deactivate_object(cell_options_->radio_valign_top);
+        fl_set_object_lcol(cell_options_->radio_valign_top, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_valign_bottom, 0);
+        fl_deactivate_object(cell_options_->radio_valign_bottom);
+        fl_set_object_lcol(cell_options_->radio_valign_bottom, FL_INACTIVE);
+       fl_set_button(cell_options_->radio_valign_center, 0);
+        fl_deactivate_object(cell_options_->radio_valign_center);
+        fl_set_object_lcol(cell_options_->radio_valign_center, FL_INACTIVE);
+       fl_set_input(cell_options_->input_special_multialign, "");
+        fl_deactivate_object(cell_options_->input_special_multialign);
+        fl_set_object_lcol(cell_options_->input_special_multialign, FL_INACTIVE);
+       fl_set_input(cell_options_->input_mcolumn_width,"");
+        fl_deactivate_object(cell_options_->input_mcolumn_width);
+        fl_set_object_lcol(cell_options_->input_mcolumn_width, FL_INACTIVE);
+    }
     if (tabular->GetRotateCell(cell))
         fl_set_button(cell_options_->radio_rotate_cell, 1);
     else
         fl_set_button(cell_options_->radio_rotate_cell, 0);
-    if (tabular->TopLine(cell))
+    if (tabular->TopLine(cell, true))
         fl_set_button(column_options_->radio_border_top, 1);
     else
         fl_set_button(column_options_->radio_border_top, 0);
-    if (tabular->BottomLine(cell))
+    if (tabular->BottomLine(cell, true))
         fl_set_button(column_options_->radio_border_bottom, 1);
     else
         fl_set_button(column_options_->radio_border_bottom, 0);
-    if (tabular->LeftLine(cell))
+    if (tabular->LeftLine(cell, true))
         fl_set_button(column_options_->radio_border_left, 1);
     else
         fl_set_button(column_options_->radio_border_left, 0);
-    if (tabular->RightLine(cell))
+    if (tabular->RightLine(cell, true))
         fl_set_button(column_options_->radio_border_right, 1);
     else
         fl_set_button(column_options_->radio_border_right, 0);
-    align = tabular->GetAlignment(cell);
-    fl_set_button(column_options_->radio_align_left, 0);
-    fl_set_button(column_options_->radio_align_right, 0);
-    fl_set_button(column_options_->radio_align_center, 0);
     special = tabular->GetAlignSpecial(cell,LyXTabular::SET_SPECIAL_COLUMN);
-    if (flag)
-        fl_set_input(column_options_->input_special_alignment,
-                    special.c_str());
+    fl_set_input(column_options_->input_special_alignment, special.c_str());
     if (lv_->buffer()->isReadonly()) 
         fl_deactivate_object(column_options_->input_special_alignment);
-    special = tabular->GetAlignSpecial(cell,LyXTabular::SET_SPECIAL_MULTI);
-    if (flag)
-        fl_set_input(cell_options_->input_special_multialign, special.c_str());
-    if (lv_->buffer()->isReadonly()) 
-        fl_deactivate_object(cell_options_->input_special_multialign);
-    pwidth = tabular->GetPWidth(cell);
-    if (flag)
-        fl_set_input(column_options_->input_column_width,pwidth.c_str());
+    else
+        fl_activate_object(column_options_->input_special_alignment);
+    pwidth = tabular->GetColumnPWidth(cell);
+    fl_set_input(column_options_->input_column_width,pwidth.c_str());
     if (lv_->buffer()->isReadonly()) {
         fl_deactivate_object(column_options_->input_column_width);
     } else {
@@ -306,20 +416,39 @@ bool FormTabular::local_update(bool flag)
         fl_set_object_lcol(cell_options_->radio_linebreak_cell, FL_INACTIVE);
         fl_set_button(cell_options_->radio_linebreak_cell,0);
     }
-    if ((!pwidth.empty() && !tabular->IsMultiColumn(cell)) ||
-        (align == LYX_ALIGN_LEFT))
+    align = tabular->GetAlignment(cell, true);
+    fl_set_button(column_options_->radio_align_left, 0);
+    fl_set_button(column_options_->radio_align_right, 0);
+    fl_set_button(column_options_->radio_align_center, 0);
+    if (!pwidth.empty() || (align == LYX_ALIGN_LEFT))
         fl_set_button(column_options_->radio_align_left, 1);
     else if (align == LYX_ALIGN_RIGHT)
         fl_set_button(column_options_->radio_align_right, 1);
     else
         fl_set_button(column_options_->radio_align_center, 1);
-    if (!pwidth.empty() && !tabular->IsMultiColumn(cell)) {
+    align = tabular->GetVAlignment(cell, true);
+    fl_set_button(column_options_->radio_valign_top, 0);
+    fl_set_button(column_options_->radio_valign_bottom, 0);
+    fl_set_button(column_options_->radio_valign_center, 0);
+    if (pwidth.empty() || (align == LyXTabular::LYX_VALIGN_CENTER))
+        fl_set_button(column_options_->radio_valign_center, 1);
+    else if (align == LyXTabular::LYX_VALIGN_BOTTOM)
+        fl_set_button(column_options_->radio_valign_bottom, 1);
+    else
+        fl_set_button(column_options_->radio_valign_top, 1);
+    if (!pwidth.empty()) {
         fl_deactivate_object(column_options_->radio_align_left);
         fl_deactivate_object(column_options_->radio_align_right);
         fl_deactivate_object(column_options_->radio_align_center);
         fl_set_object_lcol(column_options_->radio_align_left, FL_INACTIVE);
         fl_set_object_lcol(column_options_->radio_align_right, FL_INACTIVE);
         fl_set_object_lcol(column_options_->radio_align_center, FL_INACTIVE);
+        fl_activate_object(column_options_->radio_valign_top);
+        fl_activate_object(column_options_->radio_valign_bottom);
+        fl_activate_object(column_options_->radio_valign_center);
+        fl_set_object_lcol(column_options_->radio_valign_top, FL_BLACK);
+        fl_set_object_lcol(column_options_->radio_valign_bottom, FL_BLACK);
+        fl_set_object_lcol(column_options_->radio_valign_center, FL_BLACK);
     } else {
         fl_activate_object(column_options_->radio_align_left);
         fl_activate_object(column_options_->radio_align_right);
@@ -327,6 +456,12 @@ bool FormTabular::local_update(bool flag)
         fl_set_object_lcol(column_options_->radio_align_left, FL_BLACK);
         fl_set_object_lcol(column_options_->radio_align_right, FL_BLACK);
         fl_set_object_lcol(column_options_->radio_align_center, FL_BLACK);
+        fl_deactivate_object(column_options_->radio_valign_top);
+        fl_deactivate_object(column_options_->radio_valign_bottom);
+        fl_deactivate_object(column_options_->radio_valign_center);
+        fl_set_object_lcol(column_options_->radio_valign_top, FL_INACTIVE);
+        fl_set_object_lcol(column_options_->radio_valign_bottom, FL_INACTIVE);
+        fl_set_object_lcol(column_options_->radio_valign_center, FL_INACTIVE);
     }
     fl_set_button(tabular_options_->radio_longtable,
                  tabular->IsLongTabular());
@@ -341,14 +476,15 @@ bool FormTabular::local_update(bool flag)
         fl_set_object_lcol(longtable_options_->radio_lt_foot, FL_BLACK);
         fl_set_object_lcol(longtable_options_->radio_lt_lastfoot, FL_BLACK);
         fl_set_object_lcol(longtable_options_->radio_lt_newpage, FL_BLACK);
+       int dummy;
         fl_set_button(longtable_options_->radio_lt_firsthead,
-                      tabular->GetRowOfLTFirstHead(cell));
+                      tabular->GetRowOfLTFirstHead(cell, dummy));
         fl_set_button(longtable_options_->radio_lt_head,
-                     tabular->GetRowOfLTHead(cell));
+                     tabular->GetRowOfLTHead(cell, dummy));
         fl_set_button(longtable_options_->radio_lt_foot,
-                     tabular->GetRowOfLTFoot(cell));
+                     tabular->GetRowOfLTFoot(cell, dummy));
         fl_set_button(longtable_options_->radio_lt_lastfoot,
-                      tabular->GetRowOfLTLastFoot(cell));
+                      tabular->GetRowOfLTLastFoot(cell, dummy));
         fl_set_button(longtable_options_->radio_lt_newpage,
                      tabular->GetLTNewPage(cell));
     } else {
@@ -416,6 +552,20 @@ void FormTabular::SetTabularOptions(FL_OBJECT * ob, long)
         local_update(false); // update for alignment
         return;
     }
+    if (ob == cell_options_->input_mcolumn_width) {
+        string
+            str;
+        str = fl_get_input(ob);
+        if (!str.empty() && !isValidLength(str)) {
+            fl_set_object_label(dialog_->text_warning,
+                 _("Warning: Invalid Length (valid example: 10mm)"));
+            fl_show_object(dialog_->text_warning);
+            return;
+        }
+        inset_->TabularFeatures(lv_->view(), LyXTabular::SET_MPWIDTH,str);
+        local_update(false); // update for alignment
+        return;
+    }
     str = fl_get_input(column_options_->input_column_width);
     if (!str.empty() && !isValidLength(str)) {
         fl_set_object_label(
@@ -450,6 +600,12 @@ void FormTabular::SetTabularOptions(FL_OBJECT * ob, long)
         num = LyXTabular::ALIGN_RIGHT;
     else if (ob == column_options_->radio_align_center)
         num = LyXTabular::ALIGN_CENTER;
+    else if (ob == column_options_->radio_valign_top)
+        num = LyXTabular::VALIGN_TOP;
+    else if (ob == column_options_->radio_valign_bottom)
+        num = LyXTabular::VALIGN_BOTTOM;
+    else if (ob == column_options_->radio_valign_center)
+        num = LyXTabular::VALIGN_CENTER;
     else if (ob == cell_options_->radio_multicolumn)
         num = LyXTabular::MULTICOLUMN;
     else if (ob == tabular_options_->radio_longtable) {
@@ -461,14 +617,15 @@ void FormTabular::SetTabularOptions(FL_OBJECT * ob, long)
             fl_activate_object(longtable_options_->radio_lt_foot);
             fl_activate_object(longtable_options_->radio_lt_lastfoot);
             fl_activate_object(longtable_options_->radio_lt_newpage);
+           int dummy;
             fl_set_button(longtable_options_->radio_lt_firsthead,
-                          tabular->GetRowOfLTFirstHead(cell));
+                          tabular->GetRowOfLTFirstHead(cell, dummy));
             fl_set_button(longtable_options_->radio_lt_head,
-                         tabular->GetRowOfLTHead(cell));
+                         tabular->GetRowOfLTHead(cell, dummy));
             fl_set_button(longtable_options_->radio_lt_foot,
-                         tabular->GetRowOfLTFoot(cell));
+                         tabular->GetRowOfLTFoot(cell, dummy));
             fl_set_button(longtable_options_->radio_lt_lastfoot,
-                          tabular->GetRowOfLTLastFoot(cell));
+                          tabular->GetRowOfLTLastFoot(cell, dummy));
             fl_set_button(longtable_options_->radio_lt_firsthead,
                          tabular->GetLTNewPage(cell));
         } else {
@@ -522,7 +679,27 @@ void FormTabular::SetTabularOptions(FL_OBJECT * ob, long)
     } else if (ob == cell_options_->input_special_multialign) {
         special = fl_get_input(cell_options_->input_special_multialign);
         num = LyXTabular::SET_SPECIAL_MULTI;
-    } else
+    } else if (ob == cell_options_->radio_border_top)
+        num = LyXTabular::M_TOGGLE_LINE_TOP;
+    else if (ob == cell_options_->radio_border_bottom)
+        num = LyXTabular::M_TOGGLE_LINE_BOTTOM;
+    else if (ob == cell_options_->radio_border_left)
+        num = LyXTabular::M_TOGGLE_LINE_LEFT;
+    else if (ob == cell_options_->radio_border_right)
+        num = LyXTabular::M_TOGGLE_LINE_RIGHT;
+    else if (ob == cell_options_->radio_align_left)
+        num = LyXTabular::M_ALIGN_LEFT;
+    else if (ob == cell_options_->radio_align_right)
+        num = LyXTabular::M_ALIGN_RIGHT;
+    else if (ob == cell_options_->radio_align_center)
+        num = LyXTabular::M_ALIGN_CENTER;
+    else if (ob == cell_options_->radio_valign_top)
+        num = LyXTabular::M_VALIGN_TOP;
+    else if (ob == cell_options_->radio_valign_bottom)
+        num = LyXTabular::M_VALIGN_BOTTOM;
+    else if (ob == cell_options_->radio_valign_center)
+        num = LyXTabular::M_VALIGN_CENTER;
+    else
         return;
     
     inset_->TabularFeatures(lv_->view(), num, special);
index 49e1001e127465436b9756bde56dfdc62b4494a8..a6e45438ff8f9a9451d444a3a16670e51167a327 100644 (file)
@@ -23,10 +23,10 @@ FD_form_tabular * FormTabular::build_tabular()
   fdui->button_close = obj = fl_add_button(FL_NORMAL_BUTTON, 415, 250, 90, 30, idex(_("Close|#C")));fl_set_button_shortcut(obj, scex(_("Close|#C")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularCloseCB, 0);
-  fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 5, 250, 60, 30, "");
+  fdui->input_tabular_column = obj = fl_add_input(FL_NORMAL_INPUT, 64, 250, 60, 30, "");
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
-  fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 65, 250, 60, 30, "");
+  fdui->input_tabular_row = obj = fl_add_input(FL_NORMAL_INPUT, 5, 250, 60, 30, "");
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_TOP_LEFT);
   fdui->text_warning = obj = fl_add_text(FL_NORMAL_TEXT, 125, 250, 290, 30, "");
@@ -125,10 +125,10 @@ FD_form_column_options * FormTabular::build_column_options()
   fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 205, 30, 110, 25, idex(_("Left|#e")));fl_set_button_shortcut(obj, scex(_("Left|#e")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 205, 55, 115, 25, idex(_("Right|#i")));fl_set_button_shortcut(obj, scex(_("Right|#i")), 1);
+  fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 205, 80, 115, 25, idex(_("Right|#i")));fl_set_button_shortcut(obj, scex(_("Right|#i")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 205, 80, 115, 25, idex(_("Center|#c")));fl_set_button_shortcut(obj, scex(_("Center|#c")), 1);
+  fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 205, 55, 115, 25, idex(_("Center|#c")));fl_set_button_shortcut(obj, scex(_("Center|#c")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   fdui->input_column_width = obj = fl_add_input(FL_NORMAL_INPUT, 375, 150, 95, 30, _("Width of column:"));
@@ -136,15 +136,6 @@ FD_form_column_options * FormTabular::build_column_options()
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   obj = fl_add_frame(FL_ENGRAVED_FRAME, 340, 20, 130, 105, "");
     fl_set_object_color(obj, FL_COL1, FL_COL1);
-  fdui->radio_valign_top = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 345, 30, 110, 25, idex(_("Top|#p")));fl_set_button_shortcut(obj, scex(_("Top|#p")), 1);
-    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
-    fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 345, 55, 115, 25, idex(_("Center|#n")));fl_set_button_shortcut(obj, scex(_("Center|#n")), 1);
-    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
-    fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 345, 80, 115, 25, idex(_("Bottom|#o")));fl_set_button_shortcut(obj, scex(_("Bottom|#o")), 1);
-    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
-    fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   obj = fl_add_text(FL_NORMAL_TEXT, 345, 10, 115, 20, _("V. Alignment"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
@@ -159,6 +150,15 @@ FD_form_column_options * FormTabular::build_column_options()
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
     fl_set_object_lstyle(obj, FL_BOLD_STYLE);
+  fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 30, 125, 25, idex(_("Top|#p")));fl_set_button_shortcut(obj, scex(_("Top|#p")), 1);
+    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
+    fl_set_object_callback(obj, C_FormTabularInputCB, 0);
+  fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 55, 125, 25, idex(_("Center|#n")));fl_set_button_shortcut(obj, scex(_("Center|#n")), 1);
+    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
+    fl_set_object_callback(obj, C_FormTabularInputCB, 0);
+  fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 80, 120, 25, idex(_("Bottom|#o")));fl_set_button_shortcut(obj, scex(_("Bottom|#o")), 1);
+    fl_set_object_lsize(obj, FL_NORMAL_SIZE);
+    fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   fl_end_form();
 
   fdui->form_column_options->fdui = fdui;
@@ -175,6 +175,7 @@ FD_form_cell_options * FormTabular::build_cell_options()
   fdui->form_cell_options = fl_bgn_form(FL_NO_BOX, 505, 227);
   fdui->form_cell_options->u_vdata = this;
   obj = fl_add_box(FL_UP_BOX, 0, 0, 505, 227, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 335, 110, 155, 100, "");
   obj = fl_add_frame(FL_ENGRAVED_FRAME, 10, 110, 180, 100, "");
     fl_set_object_color(obj, FL_COL1, FL_COL1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
@@ -188,8 +189,6 @@ FD_form_cell_options * FormTabular::build_cell_options()
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
     fl_set_object_lstyle(obj, FL_BOLD_STYLE);
-  obj = fl_add_frame(FL_ENGRAVED_FRAME, 340, 110, 130, 100, "");
-    fl_set_object_color(obj, FL_COL1, FL_COL1);
   obj = fl_add_text(FL_NORMAL_TEXT, 345, 100, 115, 20, _("V. Alignment"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
@@ -205,17 +204,17 @@ FD_form_cell_options * FormTabular::build_cell_options()
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   fdui->radio_rotate_cell = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 10, 75, 145, 25, _("Rotate 90°"));
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 305, 85, "");
+  obj = fl_add_frame(FL_ENGRAVED_FRAME, 165, 15, 325, 85, "");
     fl_set_object_color(obj, FL_COL1, FL_COL1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
-  fdui->input_special_multialign = obj = fl_add_input(FL_NORMAL_INPUT, 175, 30, 280, 30, "");
+  fdui->input_special_multialign = obj = fl_add_input(FL_NORMAL_INPUT, 175, 30, 310, 30, "");
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   obj = fl_add_text(FL_NORMAL_TEXT, 170, 5, 290, 20, _("Special Multicolumn Alignment"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_lalign(obj, FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
     fl_set_object_lstyle(obj, FL_BOLD_STYLE);
-  fdui->input_mcolumn_width = obj = fl_add_input(FL_NORMAL_INPUT, 360, 65, 95, 30, _("Width of multi-column:"));
+  fdui->input_mcolumn_width = obj = fl_add_input(FL_NORMAL_INPUT, 360, 65, 125, 30, _("Width of multi-column:"));
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   fdui->radio_border_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 75, 135, 25, 25, idex(_("Top|#t")));fl_set_button_shortcut(obj, scex(_("Top|#t")), 1);
@@ -237,19 +236,19 @@ FD_form_cell_options * FormTabular::build_cell_options()
   fdui->radio_align_left = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 120, 110, 25, idex(_("Left|#e")));fl_set_button_shortcut(obj, scex(_("Left|#e")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 145, 115, 25, idex(_("Right|#i")));fl_set_button_shortcut(obj, scex(_("Right|#i")), 1);
+  fdui->radio_align_right = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 170, 115, 25, idex(_("Right|#i")));fl_set_button_shortcut(obj, scex(_("Right|#i")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 170, 115, 25, idex(_("Center|#c")));fl_set_button_shortcut(obj, scex(_("Center|#c")), 1);
+  fdui->radio_align_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 195, 145, 115, 25, idex(_("Center|#c")));fl_set_button_shortcut(obj, scex(_("Center|#c")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_top = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 340, 120, 110, 25, idex(_("Top|#p")));fl_set_button_shortcut(obj, scex(_("Top|#p")), 1);
+  fdui->radio_valign_top = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 120, 140, 25, idex(_("Top|#p")));fl_set_button_shortcut(obj, scex(_("Top|#p")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_center = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 340, 145, 115, 25, idex(_("Center|#n")));fl_set_button_shortcut(obj, scex(_("Center|#n")), 1);
+  fdui->radio_valign_center = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 145, 140, 25, idex(_("Center|#n")));fl_set_button_shortcut(obj, scex(_("Center|#n")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
-  fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_RADIO_BUTTON, 340, 170, 115, 25, idex(_("Bottom|#o")));fl_set_button_shortcut(obj, scex(_("Bottom|#o")), 1);
+  fdui->radio_valign_bottom = obj = fl_add_checkbutton(FL_PUSH_BUTTON, 345, 170, 140, 25, idex(_("Bottom|#o")));fl_set_button_shortcut(obj, scex(_("Bottom|#o")), 1);
     fl_set_object_lsize(obj, FL_NORMAL_SIZE);
     fl_set_object_callback(obj, C_FormTabularInputCB, 0);
   fl_end_form();
index e4f449e9e5039cc2ea5cf18f1f556e80d36d1952..51e35d564977404910bf217285116b30a753c5b9 100644 (file)
@@ -1,4 +1,4 @@
-/** Header file generated with fdesign on Fri Jul 14 15:53:33 2000.**/
+/** Header file generated with fdesign on Mon Jul 17 13:48:45 2000.**/
 
 #ifndef FD_form_tabular_h_
 #define FD_form_tabular_h_
@@ -52,10 +52,10 @@ struct FD_form_column_options {
        FL_OBJECT *radio_align_right;
        FL_OBJECT *radio_align_center;
        FL_OBJECT *input_column_width;
+       FL_OBJECT *input_special_alignment;
        FL_OBJECT *radio_valign_top;
        FL_OBJECT *radio_valign_center;
        FL_OBJECT *radio_valign_bottom;
-       FL_OBJECT *input_special_alignment;
 };
 struct FD_form_cell_options {
 
index 50d7b0352a7050df9186f5db1b3d41b88ed97e96..44558ef941aa5377f86e8da56a0b6874ce415bd4 100644 (file)
@@ -514,7 +514,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: RADIO_BUTTON
-box: 205 55 115 25
+box: 205 80 115 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -532,7 +532,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: RADIO_BUTTON
-box: 205 80 115 25
+box: 205 55 115 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -583,60 +583,6 @@ name:
 callback: 
 argument: 
 
---------------------
-class: FL_CHECKBUTTON
-type: RADIO_BUTTON
-box: 345 30 110 25
-boxtype: FL_NO_BOX
-colors: FL_COL1 FL_YELLOW
-alignment: FL_ALIGN_CENTER
-style: FL_NORMAL_STYLE
-size: FL_NORMAL_SIZE
-lcol: FL_BLACK
-label: Top|#p
-shortcut: 
-resize: FL_RESIZE_ALL
-gravity: FL_NoGravity FL_NoGravity
-name: radio_valign_top
-callback: C_FormTabularInputCB
-argument: 0
-
---------------------
-class: FL_CHECKBUTTON
-type: RADIO_BUTTON
-box: 345 55 115 25
-boxtype: FL_NO_BOX
-colors: FL_COL1 FL_YELLOW
-alignment: FL_ALIGN_CENTER
-style: FL_NORMAL_STYLE
-size: FL_NORMAL_SIZE
-lcol: FL_BLACK
-label: Center|#n
-shortcut: 
-resize: FL_RESIZE_ALL
-gravity: FL_NoGravity FL_NoGravity
-name: radio_valign_center
-callback: C_FormTabularInputCB
-argument: 0
-
---------------------
-class: FL_CHECKBUTTON
-type: RADIO_BUTTON
-box: 345 80 115 25
-boxtype: FL_NO_BOX
-colors: FL_COL1 FL_YELLOW
-alignment: FL_ALIGN_CENTER
-style: FL_NORMAL_STYLE
-size: FL_NORMAL_SIZE
-lcol: FL_BLACK
-label: Bottom|#o
-shortcut: 
-resize: FL_RESIZE_ALL
-gravity: FL_NoGravity FL_NoGravity
-name: radio_valign_bottom
-callback: C_FormTabularInputCB
-argument: 0
-
 --------------------
 class: FL_TEXT
 type: NORMAL_TEXT
@@ -709,6 +655,60 @@ name:
 callback: 
 argument: 
 
+--------------------
+class: FL_CHECKBUTTON
+type: PUSH_BUTTON
+box: 345 30 125 25
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Top|#p
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_valign_top
+callback: C_FormTabularInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: PUSH_BUTTON
+box: 345 55 125 25
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Center|#n
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_valign_center
+callback: C_FormTabularInputCB
+argument: 0
+
+--------------------
+class: FL_CHECKBUTTON
+type: PUSH_BUTTON
+box: 345 80 120 25
+boxtype: FL_NO_BOX
+colors: FL_COL1 FL_YELLOW
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_NORMAL_SIZE
+lcol: FL_BLACK
+label: Bottom|#o
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: radio_valign_bottom
+callback: C_FormTabularInputCB
+argument: 0
+
 =============== FORM ===============
 Name: form_cell_options
 Width: 505
@@ -733,6 +733,24 @@ name:
 callback: 
 argument: 
 
+--------------------
+class: FL_FRAME
+type: ENGRAVED_FRAME
+box: 335 110 155 100
+boxtype: FL_NO_BOX
+colors: FL_BLACK FL_COL1
+alignment: FL_ALIGN_CENTER
+style: FL_NORMAL_STYLE
+size: FL_DEFAULT_SIZE
+lcol: FL_BLACK
+label: 
+shortcut: 
+resize: FL_RESIZE_ALL
+gravity: FL_NoGravity FL_NoGravity
+name: 
+callback: 
+argument: 
+
 --------------------
 class: FL_FRAME
 type: ENGRAVED_FRAME
@@ -805,24 +823,6 @@ name:
 callback: 
 argument: 
 
---------------------
-class: FL_FRAME
-type: ENGRAVED_FRAME
-box: 340 110 130 100
-boxtype: FL_NO_BOX
-colors: FL_COL1 FL_COL1
-alignment: FL_ALIGN_CENTER
-style: FL_NORMAL_STYLE
-size: FL_DEFAULT_SIZE
-lcol: FL_BLACK
-label: 
-shortcut: 
-resize: FL_RESIZE_ALL
-gravity: FL_NoGravity FL_NoGravity
-name: 
-callback: 
-argument: 
-
 --------------------
 class: FL_TEXT
 type: NORMAL_TEXT
@@ -934,7 +934,7 @@ argument: 0
 --------------------
 class: FL_FRAME
 type: ENGRAVED_FRAME
-box: 165 15 305 85
+box: 165 15 325 85
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_COL1
 alignment: FL_ALIGN_CENTER
@@ -952,7 +952,7 @@ argument:
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 175 30 280 30
+box: 175 30 310 30
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT
@@ -988,7 +988,7 @@ argument:
 --------------------
 class: FL_INPUT
 type: NORMAL_INPUT
-box: 360 65 95 30
+box: 360 65 125 30
 boxtype: FL_DOWN_BOX
 colors: FL_COL1 FL_MCOL
 alignment: FL_ALIGN_LEFT
@@ -1096,7 +1096,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: RADIO_BUTTON
-box: 195 145 115 25
+box: 195 170 115 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1114,7 +1114,7 @@ argument: 0
 --------------------
 class: FL_CHECKBUTTON
 type: RADIO_BUTTON
-box: 195 170 115 25
+box: 195 145 115 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1131,8 +1131,8 @@ argument: 0
 
 --------------------
 class: FL_CHECKBUTTON
-type: RADIO_BUTTON
-box: 340 120 110 25
+type: PUSH_BUTTON
+box: 345 120 140 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1149,8 +1149,8 @@ argument: 0
 
 --------------------
 class: FL_CHECKBUTTON
-type: RADIO_BUTTON
-box: 340 145 115 25
+type: PUSH_BUTTON
+box: 345 145 140 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
@@ -1167,8 +1167,8 @@ argument: 0
 
 --------------------
 class: FL_CHECKBUTTON
-type: RADIO_BUTTON
-box: 340 170 115 25
+type: PUSH_BUTTON
+box: 345 170 140 25
 boxtype: FL_NO_BOX
 colors: FL_COL1 FL_YELLOW
 alignment: FL_ALIGN_CENTER
index 6e6aeac44ae78069c5e5f7bd1cb0a2a333b67e63..3a582d63ff40918d8407436f5f297a9df3b519ce 100644 (file)
@@ -1038,15 +1038,30 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
         what;
 
     switch (feature) {
+      case LyXTabular::M_ALIGN_LEFT:
       case LyXTabular::ALIGN_LEFT:
           setAlign=LYX_ALIGN_LEFT;
           break;
+      case LyXTabular::M_ALIGN_RIGHT:
       case LyXTabular::ALIGN_RIGHT:
           setAlign=LYX_ALIGN_RIGHT;
           break;
+      case LyXTabular::M_ALIGN_CENTER:
       case LyXTabular::ALIGN_CENTER:
           setAlign=LYX_ALIGN_CENTER;
           break;
+      case LyXTabular::M_VALIGN_TOP:
+      case LyXTabular::VALIGN_TOP:
+          setAlign=LyXTabular::LYX_VALIGN_TOP;
+          break;
+      case LyXTabular::M_VALIGN_BOTTOM:
+      case LyXTabular::VALIGN_BOTTOM:
+          setAlign=LyXTabular::LYX_VALIGN_BOTTOM;
+          break;
+      case LyXTabular::M_VALIGN_CENTER:
+      case LyXTabular::VALIGN_CENTER:
+          setAlign=LyXTabular::LYX_VALIGN_CENTER;
+          break;
       default:
           break;
     }
@@ -1078,16 +1093,30 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
 
     int row = tabular->row_of_cell(actcell);
     int column = tabular->column_of_cell(actcell);
-
+    bool flag = true;
+    
     switch (feature) {
     case LyXTabular::SET_PWIDTH:
+    {
+       bool update = (tabular->GetColumnPWidth(actcell) != val);
+       tabular->SetColumnPWidth(actcell,val);
+       if (update) {
+           for (int i=0; i < tabular->rows(); ++i) {
+               tabular->GetCellInset(tabular->GetCellNumber(i, column))->
+                   resizeLyXText(bv);
+           }
+           UpdateLocal(bv, INIT, true);
+       }
+    }
+    break;
+    case LyXTabular::SET_MPWIDTH:
     {
        bool update = (tabular->GetPWidth(actcell) != val);
-       tabular->SetPWidth(actcell,val);
+       tabular->SetMColumnPWidth(actcell,val);
        if (update) {
            for (int i=0; i < tabular->rows(); ++i) {
                tabular->GetCellInset(tabular->GetCellNumber(i, column))->
-                   deleteLyXText(bv);
+                   resizeLyXText(bv);
            }
            UpdateLocal(bv, INIT, true);
        }
@@ -1123,43 +1152,75 @@ void InsetTabular::TabularFeatures(BufferView * bv, int feature, string val)
        actcell = tabular->GetCellNumber(row, column);
        UpdateLocal(bv, INIT, true);
        break;
+    case LyXTabular::M_TOGGLE_LINE_TOP:
+       flag = false;
     case LyXTabular::TOGGLE_LINE_TOP:
-       lineSet = !tabular->TopLine(actcell);
+       lineSet = !tabular->TopLine(actcell, flag);
        for(i=sel_row_start; i<=sel_row_end; ++i)
            for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetTopLine(tabular->GetCellNumber(i,j),lineSet);
+               tabular->SetTopLine(tabular->GetCellNumber(i,j),lineSet, flag);
        UpdateLocal(bv, INIT, true);
        break;
     
+    case LyXTabular::M_TOGGLE_LINE_BOTTOM:
+       flag = false;
     case LyXTabular::TOGGLE_LINE_BOTTOM:
-       lineSet = !tabular->BottomLine(actcell); 
+       lineSet = !tabular->BottomLine(actcell, flag); 
        for(i=sel_row_start; i<=sel_row_end; ++i)
            for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetBottomLine(tabular->GetCellNumber(i,j),lineSet);
+               tabular->SetBottomLine(tabular->GetCellNumber(i,j),lineSet,
+                                      flag);
        UpdateLocal(bv, INIT, true);
        break;
                
+    case LyXTabular::M_TOGGLE_LINE_LEFT:
+       flag = false;
     case LyXTabular::TOGGLE_LINE_LEFT:
-       lineSet = !tabular->LeftLine(actcell);
+       lineSet = !tabular->LeftLine(actcell, flag);
        for(i=sel_row_start; i<=sel_row_end; ++i)
            for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetLeftLine(tabular->GetCellNumber(i,j),lineSet);
+               tabular->SetLeftLine(tabular->GetCellNumber(i,j),lineSet,
+                                    flag);
        UpdateLocal(bv, INIT, true);
        break;
 
+    case LyXTabular::M_TOGGLE_LINE_RIGHT:
+       flag = false;
     case LyXTabular::TOGGLE_LINE_RIGHT:
-       lineSet = !tabular->RightLine(actcell);
+       lineSet = !tabular->RightLine(actcell, flag);
        for(i=sel_row_start; i<=sel_row_end; ++i)
            for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetRightLine(tabular->GetCellNumber(i,j),lineSet);
+               tabular->SetRightLine(tabular->GetCellNumber(i,j),lineSet,
+                                     flag);
        UpdateLocal(bv, INIT, true);
        break;
+    case LyXTabular::M_ALIGN_LEFT:
+    case LyXTabular::M_ALIGN_RIGHT:
+    case LyXTabular::M_ALIGN_CENTER:
+       flag = false;
     case LyXTabular::ALIGN_LEFT:
     case LyXTabular::ALIGN_RIGHT:
     case LyXTabular::ALIGN_CENTER:
        for(i=sel_row_start; i<=sel_row_end; ++i)
            for(j=sel_col_start; j<=sel_col_end; ++j)
-               tabular->SetAlignment(tabular->GetCellNumber(i,j),setAlign);
+               tabular->SetAlignment(tabular->GetCellNumber(i,j),setAlign,
+                                     flag);
+       if (hasSelection())
+           UpdateLocal(bv, INIT, true);
+       else
+           UpdateLocal(bv, CELL, true);
+       break;
+    case LyXTabular::M_VALIGN_TOP:
+    case LyXTabular::M_VALIGN_BOTTOM:
+    case LyXTabular::M_VALIGN_CENTER:
+       flag = false;
+    case LyXTabular::VALIGN_TOP:
+    case LyXTabular::VALIGN_BOTTOM:
+    case LyXTabular::VALIGN_CENTER:
+       for(i=sel_row_start; i<=sel_row_end; ++i)
+           for(j=sel_col_start; j<=sel_col_end; ++j)
+               tabular->SetVAlignment(tabular->GetCellNumber(i,j), setAlign,
+                                      flag);
        if (hasSelection())
            UpdateLocal(bv, INIT, true);
        else
index feb9c652b79df35aaec89e061df5b9772df3fa66..79e65ba99df6dba418722163686782c994f0c911 100644 (file)
@@ -187,10 +187,10 @@ void LyXTabular::Init(int rows_arg, int columns_arg)
     set_row_column_number_info();
     is_long_tabular = false;
     rotate = 0;
-    endhead = -1;
-    endfirsthead = -1;
-    endfoot = -1;
-    endlastfoot = -1;
+    endhead = 0;
+    endfirsthead = 0;
+    endfoot = 0;
+    endlastfoot = 0;
 }
 
 
@@ -380,36 +380,40 @@ int LyXTabular::NumberOfCellsInRow(int cell) const
 
 
 /* returns 1 if there is a topline, returns 0 if not */ 
-bool LyXTabular::TopLine(int cell) const
+bool LyXTabular::TopLine(int cell, bool onlycolumn) const
 {
     int row = row_of_cell(cell);
     
-    if (IsMultiColumn(cell))
+    if (!onlycolumn && IsMultiColumn(cell))
         return cellinfo_of_cell(cell)->top_line;
     return row_info[row].top_line;
 }
 
 
-bool LyXTabular::BottomLine(int cell) const
+bool LyXTabular::BottomLine(int cell, bool onlycolumn) const
 {
     //no bottom line underneath non-existent cells if you please
     if(cell >= numberofcells)
        return false;
 
-    if (IsMultiColumn(cell))
+    if (!onlycolumn && IsMultiColumn(cell))
         return cellinfo_of_cell(cell)->bottom_line;
     return row_info[row_of_cell(cell)].bottom_line;
 }
 
 
-bool LyXTabular::LeftLine(int cell) const
+bool LyXTabular::LeftLine(int cell, bool onlycolumn) const
 {
+    if (!onlycolumn && IsMultiColumn(cell))
+        return cellinfo_of_cell(cell)->left_line;
     return column_info[column_of_cell(cell)].left_line;
 }
 
 
-bool LyXTabular::RightLine(int cell) const
+bool LyXTabular::RightLine(int cell, bool onlycolumn) const
 {
+    if (!onlycolumn && IsMultiColumn(cell))
+        return cellinfo_of_cell(cell)->right_line;
     return column_info[right_column_of_cell(cell)].right_line;
 }
 
@@ -604,35 +608,54 @@ bool LyXTabular::SetWidthOfCell(int cell, int new_width)
 }
 
 
-bool LyXTabular::SetAlignment(int cell, char align)
+bool LyXTabular::SetAlignment(int cell, char align, bool onlycolumn)
 {
-    if (!IsMultiColumn(cell))
+    if (!IsMultiColumn(cell) || onlycolumn)
         column_info[column_of_cell(cell)].alignment = align;
-    cellinfo_of_cell(cell)->alignment = align;
+    if (!onlycolumn)
+       cellinfo_of_cell(cell)->alignment = align;
+    return true;
+}
+
+
+bool LyXTabular::SetVAlignment(int cell, char align, bool onlycolumn)
+{
+    if (!IsMultiColumn(cell) || onlycolumn)
+        column_info[column_of_cell(cell)].valignment = align;
+    if (!onlycolumn)
+       cellinfo_of_cell(cell)->valignment = align;
+    return true;
+}
+
+
+bool LyXTabular::SetColumnPWidth(int cell, string const & width)
+{
+    bool flag = !width.empty();
+
+    int j = column_of_cell(cell);
+    int c;
+    column_info[j].p_width = width;
+    if (flag) // do this only if there is a width
+       SetAlignment(cell, LYX_ALIGN_LEFT);
+    for(int i=0; i < rows_; ++i) {
+       c = GetCellNumber(i, j);
+       flag = !GetPWidth(c).empty(); // because of multicolumns!
+       GetCellInset(c)->SetAutoBreakRows(flag);
+    }
     return true;
 }
 
 
-bool LyXTabular::SetPWidth(int cell, string const & width)
+bool LyXTabular::SetMColumnPWidth(int cell, string const & width)
 {
     bool flag = !width.empty();
 
+    cellinfo_of_cell(cell)->p_width = width;
     if (IsMultiColumn(cell)) {
-        cellinfo_of_cell(cell)->p_width = width;
        GetCellInset(cell)->SetAutoBreakRows(flag);
-    } else {
-       int j = column_of_cell(cell);
-       int c;
-        column_info[j].p_width = width;
-       if (flag) // do this only if there is a width
-               SetAlignment(cell, LYX_ALIGN_LEFT);
-       for(int i=0; i < rows_; ++i) {
-           c = GetCellNumber(i, j);
-           flag = !GetPWidth(c).empty(); // because of multicolumns!
-           GetCellInset(c)->SetAutoBreakRows(flag);
-       }
+       return true;
     }
-    return true;
+    return false;
 }
 
 
@@ -656,11 +679,11 @@ bool LyXTabular::SetAllLines(int cell, bool line)
 }
 
 
-bool LyXTabular::SetTopLine(int cell, bool line)
+bool LyXTabular::SetTopLine(int cell, bool line, bool onlycolumn)
 {
     int row = row_of_cell(cell);
 
-    if (!IsMultiColumn(cell))
+    if (onlycolumn || !IsMultiColumn(cell))
         row_info[row].top_line = line;
     else
         cellinfo_of_cell(cell)->top_line = line;
@@ -668,9 +691,9 @@ bool LyXTabular::SetTopLine(int cell, bool line)
 }
 
 
-bool LyXTabular::SetBottomLine(int cell, bool line)
+bool LyXTabular::SetBottomLine(int cell, bool line, bool onlycolumn)
 {
-    if (!IsMultiColumn(cell))
+    if (onlycolumn || !IsMultiColumn(cell))
         row_info[row_of_cell(cell)].bottom_line = line;
     else
         cellinfo_of_cell(cell)->bottom_line = line;
@@ -678,29 +701,44 @@ bool LyXTabular::SetBottomLine(int cell, bool line)
 }
 
 
-bool LyXTabular::SetLeftLine(int cell, bool line)
+bool LyXTabular::SetLeftLine(int cell, bool line, bool onlycolumn)
 {
-    column_info[column_of_cell(cell)].left_line = line;
+    if (onlycolumn || !IsMultiColumn(cell))
+       column_info[column_of_cell(cell)].left_line = line;
+    else
+        cellinfo_of_cell(cell)->left_line = line;
     return true;
 }
 
 
-bool LyXTabular::SetRightLine(int cell, bool line)
+bool LyXTabular::SetRightLine(int cell, bool line, bool onlycolumn)
 {
-    column_info[right_column_of_cell(cell)].right_line = line;
+    if (onlycolumn || !IsMultiColumn(cell))
+       column_info[right_column_of_cell(cell)].right_line = line;
+    else
+        cellinfo_of_cell(cell)->right_line = line;
     return true;
 }
 
 
-char LyXTabular::GetAlignment(int cell) const
+char LyXTabular::GetAlignment(int cell, bool onlycolumn) const
 {
-    if (IsMultiColumn(cell))
+    if (!onlycolumn && IsMultiColumn(cell))
        return cellinfo_of_cell(cell)->alignment;
     else
        return column_info[column_of_cell(cell)].alignment;
 }
 
 
+char LyXTabular::GetVAlignment(int cell, bool onlycolumn) const
+{
+    if (!onlycolumn && IsMultiColumn(cell))
+       return cellinfo_of_cell(cell)->valignment;
+    else
+       return column_info[column_of_cell(cell)].valignment;
+}
+
+
 string LyXTabular::GetPWidth(int cell) const
 {
     if (IsMultiColumn(cell))
@@ -709,6 +747,20 @@ string LyXTabular::GetPWidth(int cell) const
 }
 
 
+string LyXTabular::GetColumnPWidth(int cell) const
+{
+    return column_info[column_of_cell(cell)].p_width;
+}
+
+
+string LyXTabular::GetMColumnPWidth(int cell) const
+{
+    if (IsMultiColumn(cell))
+       return cellinfo_of_cell(cell)->p_width;
+    return string();
+}
+
+
 string LyXTabular::GetAlignSpecial(int cell, int what) const
 {
     if (what == SET_SPECIAL_MULTI)
@@ -871,6 +923,7 @@ void LyXTabular::Write(Buffer const * buf, ostream & os) const
        for (j = 0; j < columns_; ++j) {
            if (!i) {
                os << "<Column alignment=" << column_info[j].alignment <<
+                   " valignment=" << column_info[j].valignment <<
                    " leftline=" << column_info[j].left_line <<
                    " rightline=" << column_info[j].right_line <<
                    " width=\"" << VSpace(column_info[j].p_width).asLyXCommand() <<
@@ -881,8 +934,11 @@ void LyXTabular::Write(Buffer const * buf, ostream & os) const
            }
            os << "<Cell multicolumn=" << cell_info[i][j].multicolumn <<
                " alignment=" << cell_info[i][j].alignment <<
+               " valignment=" << cell_info[i][j].valignment <<
                " topline=" << cell_info[i][j].top_line <<
                " bottomline=" << cell_info[i][j].bottom_line <<
+               " leftline=" << cell_info[i][j].left_line <<
+               " rightline=" << cell_info[i][j].right_line <<
                " rotate=" << cell_info[i][j].rotate <<
                " linebreaks=" << cell_info[i][j].linebreaks <<
                " width=\"" << cell_info[i][j].p_width <<
@@ -1034,6 +1090,7 @@ void LyXTabular::Read(Buffer const * buf, LyXLex & lex)
            }
            if (!i) {
                (void)getTokenValue(line, "alignment", column_info[j].alignment);
+               (void)getTokenValue(line, "valignment", column_info[j].valignment);
                (void)getTokenValue(line, "leftline", column_info[j].left_line);
                (void)getTokenValue(line, "rightline", column_info[j].right_line);
                (void)getTokenValue(line, "width", column_info[j].p_width);
@@ -1047,8 +1104,11 @@ void LyXTabular::Read(Buffer const * buf, LyXLex & lex)
            }
            (void)getTokenValue(line, "multicolumn", cell_info[i][j].multicolumn);
            (void)getTokenValue(line, "alignment", cell_info[i][j].alignment);
+           (void)getTokenValue(line, "valignment", cell_info[i][j].valignment);
            (void)getTokenValue(line, "topline", cell_info[i][j].top_line);
            (void)getTokenValue(line, "bottomline", cell_info[i][j].bottom_line);
+           (void)getTokenValue(line, "leftline", cell_info[i][j].left_line);
+           (void)getTokenValue(line, "rightline", cell_info[i][j].right_line);
            (void)getTokenValue(line, "rotate", cell_info[i][j].rotate);
            (void)getTokenValue(line, "linebreaks", cell_info[i][j].linebreaks);
            (void)getTokenValue(line, "width", cell_info[i][j].p_width);
@@ -1636,67 +1696,73 @@ bool LyXTabular::GetLinebreaks(int cell) const
 void LyXTabular::SetLTHead(int cell, bool first)
 {
     int row = row_of_cell(cell);
+    int val = (row+1) * (column_of_cell(cell)? 1:-1);
 
     if (first) {
-        if (row == endfirsthead)
-            endfirsthead = -1;
+        if (endfirsthead == val)
+            endfirsthead = 0;
         else
-            endfirsthead = row;
+            endfirsthead = val;
     } else {
-        if (row == endhead)
-            endhead = -1;
+        if (endhead == val)
+            endhead = 0;
         else
-            endhead = row;
+            endhead = val;
     }
 }
 
 
-bool LyXTabular::GetRowOfLTHead(int cell) const
+bool LyXTabular::GetRowOfLTHead(int cell, int & row) const
 {
-    if ((endhead+1) > rows_)
+    row = endhead;
+    if (abs(endhead) > rows_)
         return false;
-    return (row_of_cell(cell) == endhead);
+    return (row_of_cell(cell) == (abs(endhead)-1));
 }
 
 
-bool LyXTabular::GetRowOfLTFirstHead(int cell) const
+bool LyXTabular::GetRowOfLTFirstHead(int cell, int & row) const
 {
-    if ((endfirsthead+1) > rows_)
+    row = endfirsthead;
+    if (abs(endfirsthead) > rows_)
         return false;
-    return (row_of_cell(cell) == endfirsthead);
+    return (row_of_cell(cell) == (abs(endfirsthead)-1));
 }
 
 
 void LyXTabular::SetLTFoot(int cell, bool last)
 {
     int row = row_of_cell(cell);
+    int val = (row + 1) * (column_of_cell(cell)? 1:-1);
 
     if (last) {
-        if (row == endlastfoot)
-            endlastfoot = -1;
+        if (endlastfoot == val)
+            endlastfoot = 0;
         else
-            endlastfoot = row;
+            endlastfoot = val;
     } else {
-        if (row == endfoot)
-            endfoot = -1;
+        if (endfoot == val)
+            endfoot = 0;
         else
-            endfoot = row;
+            endfoot = val;
     }
 }
 
 
-bool LyXTabular::GetRowOfLTFoot(int cell) const
+bool LyXTabular::GetRowOfLTFoot(int cell, int & row) const
 {
+    row = endfoot;
     if ((endfoot+1) > rows_)
         return false;
-    return (row_of_cell(cell) == endfoot);
+    return (row_of_cell(cell) == (abs(endfoot)-1));
 }
 
-bool LyXTabular::GetRowOfLTLastFoot(int cell) const
+bool LyXTabular::GetRowOfLTLastFoot(int cell, int & row) const
 {
-    if ((endlastfoot+1) > rows_)
+    row = endlastfoot;
+    if (abs(endlastfoot) > rows_)
         return false;
-    return (row_of_cell(cell) == endlastfoot);
+    return (row_of_cell(cell) == (abs(endlastfoot)-1));
 }
 
 
@@ -1845,7 +1911,18 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const
            if (LeftLine(cell))
                os << '|';
            if (!GetPWidth(cell).empty()) {
-               os << "p{" << GetPWidth(cell) << '}';
+               switch(GetVAlignment(cell)) {
+               case LYX_VALIGN_TOP:
+                   os << "p";
+                   break;
+               case LYX_VALIGN_CENTER:
+                   os << "m";
+                   break;
+               case LYX_VALIGN_BOTTOM:
+                   os << "b";
+                   break;
+               }
+               os << "{" << GetPWidth(cell) << '}';
            } else {
                switch (GetAlignment(cell)) {
                case LYX_ALIGN_LEFT:
@@ -1868,7 +1945,19 @@ int LyXTabular::TeXCellPreamble(ostream & os, int cell) const
        }
     }
     if (GetLinebreaks(cell)) {
-       os << "\\parbox[t]{" << GetPWidth(cell) << "}{\\smallskip{}";
+       os << "\\parbox[";
+       switch(GetVAlignment(cell)) {
+       case LYX_VALIGN_TOP:
+           os << "t";
+           break;
+       case LYX_VALIGN_CENTER:
+           os << "c";
+           break;
+       case LYX_VALIGN_BOTTOM:
+           os << "b";
+           break;
+       }
+       os << "]{" << GetPWidth(cell) << "}{\\smallskip{}";
     }
     return ret;
 }
@@ -1916,7 +2005,18 @@ int LyXTabular::Latex(Buffer const * buf, ostream & os, bool fragile, bool fp) c
        if (!column_info[i].align_special.empty()) {
            os << column_info[i].align_special;
        } else if (!column_info[i].p_width.empty()) {
-           os << "p{"
+           switch(column_info[i].valignment) {
+           case LYX_VALIGN_TOP:
+               os << "p";
+               break;
+           case LYX_VALIGN_CENTER:
+               os << "m";
+               break;
+           case LYX_VALIGN_BOTTOM:
+               os << "b";
+               break;
+           }
+           os << "{"
               << column_info[i].p_width
               << '}';
        } else {
@@ -1942,8 +2042,33 @@ int LyXTabular::Latex(Buffer const * buf, ostream & os, bool fragile, bool fp) c
     //+                      the single row and columns (cells)            +
     //+---------------------------------------------------------------------
 
+    int bret;
     for(i=0; i < rows_; ++i) {
        ret += TeXTopHLine(os, i);
+       bret = ret;
+       if (IsLongTabular()) {
+           if ((endhead < 0) && (i == (abs(endhead)-1))) {
+               os << "\\endhead\n";
+               ++ret;
+           }
+           if ((endfirsthead < 0) && (i == (abs(endfirsthead)-1))) {
+               os << "\\endfirsthead\n";
+               ++ret;
+           }
+           if ((endfoot < 0) && (i == (abs(endfoot)-1))) {
+               os << "\\endfoot\n";
+               ++ret;
+           }
+           if ((endlastfoot < 0) && (i == (abs(endlastfoot)-1))) {
+               os << "\\endlastfoot\n";
+               ++ret;
+           }
+       }
+       if (ret > bret) {
+           if (i > 0)
+               ret += TeXBottomHLine(os, i-1);
+           ret += TeXTopHLine(os, i);
+       }
        for(j=0; j < columns_; ++j) {
            if (IsPartOfMultiColumn(i,j))
                continue;
@@ -1958,23 +2083,26 @@ int LyXTabular::Latex(Buffer const * buf, ostream & os, bool fragile, bool fp) c
        }
        os << "\\\\" << endl;
        ret += TeXBottomHLine(os, i);
+       bret = ret;
        if (IsLongTabular()) {
-           if (i == endhead) {
+           if ((endhead > 0) && (i == (endhead-1))) {
                os << "\\endhead\n";
                ++ret;
            }
-           if (i == endfirsthead) {
+           if ((endfirsthead > 0) && (i == (endfirsthead-1))) {
                os << "\\endfirsthead\n";
                ++ret;
            }
-           if (i == endfoot) {
+           if ((endfoot > 0) && (i == (endfoot-1))) {
                os << "\\endfoot\n";
                ++ret;
            }
-           if (i == endlastfoot) {
+           if ((endlastfoot > 0) && (i == (endlastfoot-1))) {
                os << "\\endlastfoot\n";
                ++ret;
            }
+           if (ret > bret)
+               ret += TeXBottomHLine(os, i);
            if (row_info[i].newpage) {
                os << "\\newpage\n";
                ++ret;
@@ -2010,6 +2138,9 @@ void LyXTabular::Validate(LaTeXFeatures & features) const
         features.longtable = true;
     if (NeedRotating())
        features.rotating = true;
-    for(int cell = 0; cell < numberofcells; ++cell)
+    for(int cell = 0; cell < numberofcells; ++cell) {
+       if (GetVAlignment(cell) != LYX_VALIGN_TOP)
+           features.array = true;
        GetCellInset(cell)->Validate(features);
+    }
 }
index 0371e53805ba464b7b48e82c61fc4d83bae3891c..0483d1f55b74209e7b3ee03835bc7814269698b0 100644 (file)
@@ -30,7 +30,7 @@ class Buffer;
 ///
 class LyXTabular  {
 public:
-    // Are the values of these enums important? (Lgb)
+
     enum {
        APPEND_ROW = 0,
        APPEND_COLUMN,
@@ -40,9 +40,22 @@ public:
        TOGGLE_LINE_BOTTOM,
        TOGGLE_LINE_LEFT,
        TOGGLE_LINE_RIGHT,
-       ALIGN_LEFT, // what are these alignment enums used for?
+       ALIGN_LEFT,
        ALIGN_RIGHT,
        ALIGN_CENTER,
+       VALIGN_TOP,
+       VALIGN_BOTTOM,
+       VALIGN_CENTER,
+       M_TOGGLE_LINE_TOP,
+       M_TOGGLE_LINE_BOTTOM,
+       M_TOGGLE_LINE_LEFT,
+       M_TOGGLE_LINE_RIGHT,
+       M_ALIGN_LEFT,
+       M_ALIGN_RIGHT,
+       M_ALIGN_CENTER,
+       M_VALIGN_TOP,
+       M_VALIGN_BOTTOM,
+       M_VALIGN_CENTER,
        DELETE_TABULAR,
        MULTICOLUMN,
        SET_ALL_LINES,
@@ -50,6 +63,7 @@ public:
        SET_LONGTABULAR,
        UNSET_LONGTABULAR,
        SET_PWIDTH,
+       SET_MPWIDTH,
        SET_ROTATE_TABULAR,
        UNSET_ROTATE_TABULAR,
        SET_ROTATE_CELL,
@@ -69,6 +83,17 @@ public:
        CELL_BEGIN_OF_MULTICOLUMN,
        CELL_PART_OF_MULTICOLUMN
     };
+
+    ///
+    enum VAlignment {
+       ///
+       LYX_VALIGN_TOP = 0,
+       ///
+       LYX_VALIGN_BOTTOM = 1,
+       ///
+       LYX_VALIGN_CENTER = 2
+    };
+
     /* konstruktor */
     ///
     LyXTabular(InsetTabular *, int columns_arg, int rows_arg);
@@ -86,13 +111,13 @@ public:
     LyXTabular * Clone(InsetTabular *);
     
     /// Returns true if there is a topline, returns false if not
-    bool TopLine(int cell) const;
+    bool TopLine(int cell, bool onlycolumn=false) const;
     /// Returns true if there is a topline, returns false if not
-    bool BottomLine(int cell) const;
+    bool BottomLine(int cell, bool onlycolumn=false) const;
     /// Returns true if there is a topline, returns false if not
-    bool LeftLine(int cell) const;
+    bool LeftLine(int cell, bool onlycolumn=false) const;
     /// Returns true if there is a topline, returns false if not
-    bool RightLine(int cell) const;
+    bool RightLine(int cell, bool onlycolumn=false) const;
     
     ///
     bool TopAlreadyDrawed(int cell) const;
@@ -126,24 +151,34 @@ public:
     /// Returns true if a complete update is necessary, otherwise false
     bool SetAllLines(int cell, bool line);
     /// Returns true if a complete update is necessary, otherwise false
-    bool SetTopLine(int cell, bool line);
+    bool SetTopLine(int cell, bool line, bool onlycolumn=false);
+    /// Returns true if a complete update is necessary, otherwise false
+    bool SetBottomLine(int cell, bool line, bool onlycolumn=false);
     /// Returns true if a complete update is necessary, otherwise false
-    bool SetBottomLine(int cell, bool line);
+    bool SetLeftLine(int cell, bool line, bool onlycolumn=false);
     /// Returns true if a complete update is necessary, otherwise false
-    bool SetLeftLine(int cell, bool line);
+    bool SetRightLine(int cell, bool line, bool onlycolumn=false);
     /// Returns true if a complete update is necessary, otherwise false
-    bool SetRightLine(int cell, bool line);
+    bool SetAlignment(int cell, char align, bool onlycolumn = false);
     /// Returns true if a complete update is necessary, otherwise false
-    bool SetAlignment(int cell, char align);
+    bool SetVAlignment(int cell, char align, bool onlycolumn = false);
     ///
-    bool SetPWidth(int cell, string const & width);
+    bool SetColumnPWidth(int cell, string const & width);
+    ///
+    bool SetMColumnPWidth(int cell, string const & width);
     ///
     bool SetAlignSpecial(int cell, string const & special, int what);
     ///
-    char GetAlignment(int cell) const; // add approp. signedness
+    char GetAlignment(int cell, bool onlycolumn = false) const;
+    ///
+    char GetVAlignment(int cell, bool onlycolumn = false) const;
     ///
     string GetPWidth(int cell) const;
     ///
+    string GetColumnPWidth(int cell) const;
+    ///
+    string GetMColumnPWidth(int cell) const;
+    ///
     string GetAlignSpecial(int cell, int what) const;
     ///
     int GetWidthOfCell(int cell) const;
@@ -242,15 +277,15 @@ public:
     ///
     void SetLTHead(int cell, bool first);
     ///
-    bool GetRowOfLTHead(int cell) const;
+    bool GetRowOfLTHead(int cell, int & row) const;
     ///
-    bool GetRowOfLTFirstHead(int cell) const;
+    bool GetRowOfLTFirstHead(int cell, int & row) const;
     ///
     void SetLTFoot(int cell, bool last);
     ///
-    bool GetRowOfLTFoot(int cell) const;
+    bool GetRowOfLTFoot(int cell, int & row) const;
     ///
-    bool GetRowOfLTLastFoot(int cell) const;
+    bool GetRowOfLTLastFoot(int cell, int & row) const;
     ///
     void SetLTNewPage(int cell, bool what);
     ///
@@ -284,9 +319,11 @@ private: //////////////////////////////////////////////////////////////////
        ///
        int width_of_cell;
        ///
-       int  multicolumn; // add approp. signedness
+       int multicolumn;
+       ///
+       int alignment;
        ///
-       int alignment; // add approp. signedness
+       int valignment;
        ///
        bool top_line;
        ///
@@ -336,7 +373,8 @@ private: //////////////////////////////////////////////////////////////////
        ///
            //columnstruct & operator=(columnstruct const &);
        ///
-       int alignment; // add approp. signedness
+       int alignment;
+       int valignment;
        bool left_line;
        bool right_line;
        int  width_of_column;