diff --git a/ChangeLog b/ChangeLog index d97aa92630..de9e8606d9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2001-01-04 Juergen Vigna + + * 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 * src/mathed/math_panel.C (deco_cb): check the decoration index is diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 3ad866ed13..33e1575236 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -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)); diff --git a/src/text.C b/src/text.C index be6bb3b6a3..e0c054484d 100644 --- a/src/text.C +++ b/src/text.C @@ -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) {