On Fri, Feb 11, 2005 at 09:42:28PM +0100, Andre Poenitz wrote:
> On Wed, Feb 09, 2005 at 11:15:40AM +0200, Martin Vermeer wrote:
> > What I meant is that the lines_ parameter in RowInfo only describes
> > hlines _above_ the row. If you see a simple fix, great.
> 
> rowinfo_.size() == nrows() + 1
> 
> > Actually I have no problem putting a hline above the first row, or
> > outputting it to LaTeX. So no need for this condition. (Or a vline left
> > of the first column.)
> 
> rowinfo_[nrows()].lines_  give the number of lines above the row after
> the last row of this table  - aka the number of lines below the last
> row.
> 
> > > But the problem is that we don't know row here!
> 
> The Cursor should know.
> 
> Andre'

Indeed... indeed... indeed. All true and taken into account.

See attached patch, which has been on the list for a few days.

Lars, I think this should go still in in spite of the freeze. As being part 
of ongoing and unfinished work. But if you want me to hold for 1.4.1, that's 
fine with me too. Though the 1.4 UI will look funnily half-done ;-)

Your call.

- Martin

Index: lib/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/ChangeLog,v
retrieving revision 1.672
diff -u -r1.672 ChangeLog
--- lib/ChangeLog       9 Feb 2005 18:56:00 -0000       1.672
+++ lib/ChangeLog       10 Feb 2005 13:38:07 -0000
@@ -1,3 +1,12 @@
+2005-02-10  Georg Baum  <[EMAIL PROTECTED]>
+
+       * ui/stdmenus.ui: add more facilities for drawing/deleting partition
+       lines in matrix
+
+2005-02-10  Martin Vermeer  <[EMAIL PROTECTED]>
+
+       * bind/math.bind: provide key bindings for lines in matrix
+
 2005-02-09  Martin Vermeer  <[EMAIL PROTECTED]>
 
        * ui/stdmenus.ui: add facilities for drawing/deleting partition 
Index: src/mathed/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/ChangeLog,v
retrieving revision 1.470
diff -u -r1.470 ChangeLog
--- src/mathed/ChangeLog        9 Feb 2005 18:56:00 -0000       1.470
+++ src/mathed/ChangeLog        10 Feb 2005 13:38:08 -0000
@@ -1,4 +1,19 @@
-<<<<<<< ChangeLog
+2005-02-10  Georg Baum  <[EMAIL PROTECTED]>
+
+       * math_gridinset.C (halign): fix '|' to the right of the last column
+       * math_gridinset.[Ch]: remove unused leftline_ and rightline_
+       * math_gridinset.C: add more facilities for adding/deleting
+       partition lines in matrix.
+       * math_gridinset.C (getStatus): implement missing LFUN_TABULAR_FEATURE
+       * math_parser.C (delEmptyLastRow): new
+       * math_parser.C (parse1): Store active environment and use it to
+       detect nonmatching \end{} and removing superflous rows with
+       delEmptyLastRow()
+
+2005-02-10  Martin Vermeer  <[EMAIL PROTECTED]>
+
+       * math_gridinset.C: implement getStatus for tabular-features.
+
 2005-02-09  Martin Vermeer  <[EMAIL PROTECTED]>
 
        * math_gridinset.[hC]: add facilities for drawing/deleting partition
Index: src/mathed/math_gridinset.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_gridinset.C,v
retrieving revision 1.155
diff -u -r1.155 math_gridinset.C
--- src/mathed/math_gridinset.C 9 Feb 2005 18:56:00 -0000       1.155
+++ src/mathed/math_gridinset.C 10 Feb 2005 13:38:08 -0000
@@ -22,6 +22,7 @@
 #include "cursor.h"
 #include "debug.h"
 #include "funcrequest.h"
+#include "gettext.h"
 #include "undo.h"
 
 #include "frontends/Painter.h"
@@ -124,7 +125,7 @@
 
 
 MathGridInset::ColInfo::ColInfo()
-       : align_('c'), leftline_(false), rightline_(false), lines_(0)
+       : align_('c'), lines_(0)
 {}
 
 
@@ -215,11 +216,12 @@
 {
        col_type col = 0;
        for (string::const_iterator it = hh.begin(); it != hh.end(); ++it) {
-               if (col >= ncols())
-                       break;
                char c = *it;
                if (c == '|') {
                        colinfo_[col].lines_++;
+               } else if (col >= ncols()) {
+                       // Only '|' is allowed in the last dummy column
+                       break;
                } else if (c == 'c' || c == 'l' || c == 'r') {
                        colinfo_[col].align_ = c;
                        ++col;
@@ -1102,8 +1104,12 @@
                        swapRow(cur.row());
                else if (s == "add-hline-above")
                        rowinfo_[cur.row()].lines_++;
+               else if (s == "add-hline-below")
+                       rowinfo_[cur.row()+1].lines_++;
                else if (s == "delete-hline-above")
-                       rowinfo_[cur.row()].lines_ = 0;
+                       rowinfo_[cur.row()].lines_--;
+               else if (s == "delete-hline-below")
+                       rowinfo_[cur.row()+1].lines_--;
                else if (s == "append-column")
                        for (int i = 0, n = extractInt(is); i < n; ++i) {
                                row_type r = cur.row();
@@ -1125,9 +1131,13 @@
                else if (s == "swap-column")
                        swapCol(col(cur.idx()));
                else if (s == "add-vline-left")
-                       colinfo_[col(cur.idx())].lines_++;                      
+                       colinfo_[col(cur.idx())].lines_++;
+               else if (s == "add-vline-right")
+                       colinfo_[col(cur.idx())+1].lines_++;
                else if (s == "delete-vline-left")
-                       colinfo_[col(cur.idx())].lines_ = 0;
+                       colinfo_[col(cur.idx())].lines_--;
+               else if (s == "delete-vline-right")
+                       colinfo_[col(cur.idx())+1].lines_--;
                else {
                        cur.undispatched();
                        break;
@@ -1223,25 +1233,41 @@
 {
        bool ret = true;
        switch (cmd.action) {
-       case LFUN_TABULAR_FEATURE:
-#if 0
-               // should be more precise
-               if (v_align_ == '\0') {
-                       flag.enable(true);
-                       break;
+       case LFUN_TABULAR_FEATURE: {
+               istringstream is(cmd.argument);
+                string s;
+                is >> s;
+               if (nrows() <= 1
+                       && (s == "delete-row" || s == "swap-row")) {
+                       flag.message(N_("Only one row"));
+                        flag.enabled(false);
+                       return true;
                }
-               if (cmd.argument.empty()) {
-                       flag.enable(false);
-                       break;
+               if (ncols() <= 1
+                       && (s == "delete-column" || s == "swap-column")) {
+                       flag.message(N_("Only one column"));
+                        flag.enabled(false);
+                       return true;
                }
-               if (!contains("tcb", cmd.argument[0])) {
-                       flag.enable(false);
-                       break;
+               if ((colinfo_[col(cur.idx())].lines_ == 0
+                       && (s == "delete-vline-left")) 
+                       || ((colinfo_[col(cur.idx()) + 1].lines_ == 0)
+                       && (s == "delete-vline-right"))) {
+                       flag.message(N_("No vline to delete"));
+                        flag.enabled(false);
+                       return true;
                }
-               flag.setOnOff(cmd.argument[0] == v_align_);
-#endif
+               if ((rowinfo_[cur.row()].lines_ == 0
+                       && (s == "delete-hline-above"))
+                       || ((rowinfo_[cur.row() + 1].lines_ == 0)
+                       && (s == "delete-hline-below"))) {
+                        flag.message(N_("No hline to delete"));
+                        flag.enabled(false);
+                        return true;
+               }       
                flag.enabled(true);
-               break;
+               return true;
+               }
        default:
                ret = MathNestInset::getStatus(cur, cmd, flag);
                break;
Index: src/mathed/math_gridinset.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_gridinset.h,v
retrieving revision 1.85
diff -u -r1.85 math_gridinset.h
--- src/mathed/math_gridinset.h 19 Jan 2005 15:03:31 -0000      1.85
+++ src/mathed/math_gridinset.h 10 Feb 2005 13:38:08 -0000
@@ -74,10 +74,6 @@
                mutable int width_;
                /// cached offset
                mutable int offset_;
-               /// do we need a line to the left?
-               bool leftline_;
-               /// do we need a line to the right?
-               bool rightline_;
                /// how many lines to the left of this column?
                int lines_;
                /// additional amount to be skipped when drawing
@@ -159,21 +155,21 @@
        /// pulls cell after pressing erase
        void idxGlue(idx_type idx);
 
-       ///
+       /// add a row
        virtual void addRow(row_type r);
-       ///
+       /// delete a row
        virtual void delRow(row_type r);
-       ///
+       /// copy a row
        virtual void copyRow(row_type r);
-       ///
+       /// swap two rows
        virtual void swapRow(row_type r);
-       ///
+       /// add a column
        virtual void addCol(col_type c);
-       ///
+       /// delete a column
        virtual void delCol(col_type c);
-       ///
+       /// copy a column
        virtual void copyCol(col_type c);
-       ///
+       /// swap two columns
        virtual void swapCol(col_type c);
        ///
        virtual void appendRow();
@@ -229,9 +225,11 @@
        void splitCell(LCursor & cur);
 
 public:
-       /// row info
+       /// row info.
+       /// rowinfo_[nrows()] is a dummy row used only for hlines.
        std::vector<RowInfo> rowinfo_;
-       /// column info
+       /// column info.
+       /// colinfo_[ncols()] is a dummy column used only for vlines.
        std::vector<ColInfo> colinfo_;
        /// cell info
        std::vector<CellInfo> cellinfo_;
Index: src/mathed/math_parser.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_parser.C,v
retrieving revision 1.310
diff -u -r1.310 math_parser.C
--- src/mathed/math_parser.C    27 Jan 2005 21:05:43 -0000      1.310
+++ src/mathed/math_parser.C    10 Feb 2005 13:38:08 -0000
@@ -159,6 +159,29 @@
        return true;
 }
 
+/*!
+ * Check wether the last row is empty and remove it if yes.
+ * Otherwise the following code
+ * \verbatim
+\begin{array}{|c|c|}
+\hline
+1 & 2 \\ \hline
+3 & 4 \\ \hline
+\end{array}
+ * \endverbatim
+ * will result in a grid with 3 rows (+ the dummy row that is always present),
+ * because the last '\\' opens a new row.
+ */
+void delEmptyLastRow(MathGridInset & grid)
+{
+        MathGridInset::row_type const row = grid.nrows() - 1;
+        for (MathGridInset::col_type col = 0; col < grid.ncols(); ++col) {
+                  if (!grid.cell(grid.index(row, col)).empty())
+                            return;
+        }
+        grid.delRow(row + 1);
+}
+
 
 // These are TeX's catcodes
 enum CatCode {
@@ -317,6 +340,8 @@
        vector<Token> tokens_;
        ///
        unsigned pos_;
+       /// Stack of active environments
+       vector<string> environments_;
 };
 
 
@@ -897,12 +922,24 @@
                else if (t.cs() == "end") {
                        if (flags & FLAG_END) {
                                // eat environment name
-                               //string const name =
-                               getArg('{', '}');
-                               // FIXME: check that we ended the correct 
environment
-                               return;
-                       }
-                       error("found 'end' unexpectedly");
+                               string const name = getArg('{', '}');
+                               if (environments_.empty())
+                                       error("'found \\end{" + name +
+                                               "}' without matching '\\begin{" 
+
+                                               name + "}'");
+                               else if (name != environments_.back())
+                                       error("'\\end{" + name +
+                                               "}' does not match '\\begin{" +
+                                               environments_.back() + "}'");
+                               else {
+                                       environments_.pop_back();
+                                               if (name == "array" ||
+                                                       name == "subarray")
+                                               delEmptyLastRow(grid);
+                                               return;
+                                       }
+                               } else
+                                       error("found 'end' unexpectedly");
                }
 
                else if (t.cs() == ")") {
@@ -1028,6 +1065,7 @@
 
                else if (t.cs() == "begin") {
                        string const name = getArg('{', '}');
+                       environments_.push_back(name);
 
                        if (name == "array" || name == "subarray") {
                                string const valign = parse_verbatim_option() + 
'c';
Index: lib/ui/stdmenus.ui
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/ui/stdmenus.ui,v
retrieving revision 1.40
diff -u -r1.40 stdmenus.ui
--- lib/ui/stdmenus.ui  9 Feb 2005 18:56:01 -0000       1.40
+++ lib/ui/stdmenus.ui  10 Feb 2005 13:38:08 -0000
@@ -159,14 +159,18 @@
                Item "Copy Row" "tabular-feature copy-row"
                Item "Swap Rows" "tabular-feature swap-row"
                Item "Add Line Above" "tabular-feature add-hline-above"
+               Item "Add Line Below" "tabular-feature add-hline-below"
                Item "Delete Line Above" "tabular-feature delete-hline-above"
+               Item "Delete Line Below" "tabular-feature delete-hline-below"
                Separator
                Item "Add Column|C" "tabular-feature append-column"
                Item "Delete Column|e" "tabular-feature delete-column"
                Item "Copy Column" "tabular-feature copy-column"
                Item "Swap Columns" "tabular-feature swap-column"
                Item "Add Line to Left" "tabular-feature add-vline-left"
+               Item "Add Line to Right" "tabular-feature add-vline-right"
                Item "Delete Line to Left" "tabular-feature delete-vline-left"
+               Item "Delete Line to Right" "tabular-feature delete-vline-right"
        End
 
        Menu "edit_math_limits"
Index: lib/bind/math.bind
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/lib/bind/math.bind,v
retrieving revision 1.25
diff -u -r1.25 math.bind
--- lib/bind/math.bind  19 May 2004 16:27:43 -0000      1.25
+++ lib/bind/math.bind  10 Feb 2005 13:38:08 -0000
@@ -77,11 +77,19 @@
 \bind "M-m c d"   "tabular-feature delete-column"
 \bind "M-m c c"   "tabular-feature copy-column"
 \bind "M-m c s"   "tabular-feature swap-column"
+\bind "M-m c a"   "tabular-feature add-vline-left"
+\bind "M-m c e"   "tabular-feature delete-vline-left"
+\bind "M-m c z"   "tabular-feature add-vline-right"
+\bind "M-m c x"   "tabular-feature delete-vline-right"
 
 \bind "M-m w i"   "tabular-feature append-row"
 \bind "M-m w d"   "tabular-feature delete-row"
 \bind "M-m w c"   "tabular-feature copy-row"
 \bind "M-m w s"   "tabular-feature swap-row"
+\bind "M-m w a"   "tabular-feature add-hline-above"
+\bind "M-m w e"   "tabular-feature delete-hline-above"
+\bind "M-m w z"   "tabular-feature add-hline-below"
+\bind "M-m w x"   "tabular-feature delete-hline-below"
 
 \bind "M-m w t"   "tabular-feature valign-top"
 \bind "M-m w m"   "tabular-feature valign-middle"

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to