]> git.lyx.org Git - features.git/commitdiff
Fixes for tabular-clipboard-paste and tabular-scroll.
authorJürgen Vigna <jug@sad.it>
Thu, 4 Jan 2001 12:06:29 +0000 (12:06 +0000)
committerJürgen Vigna <jug@sad.it>
Thu, 4 Jan 2001 12:06:29 +0000 (12:06 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1301 a592a061-630c-0410-9148-cb99ea01b6c8

ChangeLog
src/insets/insettabular.C
src/text.C

index d97aa926301e34238064f11a0522cdf7090f1ba9..de9e8606d9872630938516672a470367eef5124a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-01-04  Juergen Vigna  <jug@sad.it>
+
+       * src/insets/insettabular.C (resetPos): an extra scroll, but we
+       really should redo all this scrolling code!
+
+       * src/text.C (GetVisibleRow): check that y/h values are good otherwise
+       change them.
+
+       * src/insets/insettabular.C (LocalDispatch): fixes to PASTESELECTION.
+       (pasteSelection): pay attention to multicolumn cells.
+       (calculate_dimensions_of_cells): forgot to reset maxAsc/Desc.
+
 2001-01-03  Jean-Marc Lasgouttes  <Jean-Marc.Lasgouttes@inria.fr>
 
        * src/mathed/math_panel.C (deco_cb): check the decoration index is
index 3ad866ed13c02dea7de2c1b63e1024950a258c52..33e15752363f3269120219d846890f6e964da969 100644 (file)
@@ -970,36 +970,40 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action,
        if (clip.empty())
            break;
        if (clip.find('\t') != string::npos) {
-           int cols = 0;
-           int rows = 0;
-           int maxCols = 0;
+           int cols = 1;
+           int rows = 1;
+           int maxCols = 1;
+           unsigned int len = clip.length();
            string::size_type p = 0;
 
-           while((p < clip.length()) &&
-                 (p = clip.find_first_of("\t\n", p)) != string::npos)
+           while((p < len) &&
+                 ((p = clip.find_first_of("\t\n", p)) != string::npos))
            {
                switch(clip[p]) {
                case '\t':
                    ++cols;
                    break;
                case '\n':
-                   ++rows;
-                   maxCols = max(cols+1, maxCols);
-                   cols = 0;
+                   if ((p+1) < len)
+                       ++rows;
+                   maxCols = max(cols, maxCols);
+                   cols = 1;
                    break;
                }
                ++p;
            }
+           maxCols = max(cols, maxCols);
            delete paste_tabular;
-           paste_tabular = new LyXTabular(this, rows+1, maxCols);
+           paste_tabular = new LyXTabular(this, rows, maxCols);
            string::size_type op = 0;
            int cell = 0;
-           unsigned int len = clip.length();
            int cells = paste_tabular->GetNumberOfCells();
            p = cols = 0;
            while((cell < cells) && (p < len) &&
                  (p = clip.find_first_of("\t\n", p)) != string::npos)
            {
+               if (p >= len)
+                   break;
                switch(clip[p]) {
                case '\t':
                    paste_tabular->GetCellInset(cell)->SetText(clip.substr(op, p-op));
@@ -1013,12 +1017,12 @@ UpdatableInset::RESULT InsetTabular::LocalDispatch(BufferView * bv, int action,
                    cols = 0;
                    break;
                }
-               op = p + 1;
                ++p;
+               op = p;
            }
            // check for the last cell if there is no trailing '\n'
-           if ((cell < cells) && ((op-1) < len))
-               paste_tabular->GetCellInset(cell)->SetText(clip.substr(op, p-op));
+           if ((cell < cells) && (op < len))
+               paste_tabular->GetCellInset(cell)->SetText(clip.substr(op, len-op));
        } else {
            // so that the clipboard is used and it goes on to default
            // and executes LFUN_PASTESELECTION in insettext!
@@ -1131,6 +1135,8 @@ bool InsetTabular::calculate_dimensions_of_cells(BufferView * bv,
        return changed;
     }
     for (int i = 0; i < tabular->rows(); ++i) {
+       maxAsc = 0;
+       maxDesc = 0;
        for (int j= 0; j < tabular->columns(); ++j) {
            if (tabular->IsPartOfMultiColumn(i,j))
                continue;
@@ -1283,6 +1289,7 @@ void InsetTabular::resetPos(BufferView * bv) const
     }
     static int const offset = ADD_TO_TABULAR_WIDTH + 2;
     int new_x = getCellXPos(actcell);
+    int old_x = cursor.x();
     new_x += offset;
     cursor.x(new_x);
 //    cursor.x(getCellXPos(actcell) + offset);
@@ -1299,6 +1306,9 @@ void InsetTabular::resetPos(BufferView * bv) const
        LyXFont font(LyXFont::ALL_SANE);
        cursor.x(cursor.x() + tabular->GetCellInset(actcell)->width(bv,font) +
                tabular->GetBeginningOfTextInCell(actcell));
+    } else if (scroll() && (top_x > 20) &&
+              ((top_x+tabular->GetWidthOfTabular()) > (bv->workWidth()-20))) {
+       scroll(bv, old_x - cursor.x());
     }
     if ((!the_locking_inset ||
         !the_locking_inset->GetFirstLockingInsetOfType(TABULAR_CODE)) &&
@@ -2138,6 +2148,17 @@ bool InsetTabular::pasteSelection(BufferView * bv)
            (c1 < paste_tabular->columns()) && (c2 < tabular->columns());
            ++c1, ++c2)
        {
+           if (paste_tabular->IsPartOfMultiColumn(r1,c1) &&
+               tabular->IsPartOfMultiColumn(r2,c2))
+               continue;
+           if (paste_tabular->IsPartOfMultiColumn(r1,c1)) {
+               --c2;
+               continue;
+           }
+           if (tabular->IsPartOfMultiColumn(r2,c2)) {
+               --c1;
+               continue;
+           }
            int n1 = paste_tabular->GetCellNumber(r1, c1);
            int n2 = tabular->GetCellNumber(r2, c2);
            *(tabular->GetCellInset(n2)) = *(paste_tabular->GetCellInset(n1));
index be6bb3b6a327410124bc246034bbc5a53e213455..e0c054484d3cd4888e8935dc90285b3d4891aa73 100644 (file)
@@ -3079,10 +3079,18 @@ void LyXText::GetVisibleRow(BufferView * bview, int y_offset, int x_offset,
        } else if (clear_area) {
 #ifdef WITH_WARNINGS
 #warning Should be fixed with a lyxinset::clear_width(bv, font) function! (Jug)
+#warning Should we not fix this in the Painter, please have a look Lars! (Jug)
 #endif
-               int const w = (inset_owner ?
-                              inset_owner->width(bview, font)-2 : ww);
-               pain.fillRectangle(x_offset, y_offset, w, row_ptr->height());
+               int w = (inset_owner ? inset_owner->width(bview, font)-2 : ww);
+               int h = row_ptr->height();
+               int x = x_offset;
+               int y = y_offset;
+               if (y < 0) {
+                   h += y;
+                   y = 0;
+               }
+
+               pain.fillRectangle(x, y, w, h);
        } else if (inset != 0) {
                int h = row_ptr->baseline() - inset->ascent(bview, font);
                if (h > 0) {