]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettabular.C
prepare for 1.1.6pre2
[lyx.git] / src / insets / insettabular.C
index b16366a71eb25be82bd3d2e6effc6ad4324d4c1a..3636d99d7903110856b04d8374fcddc573840b5c 100644 (file)
@@ -129,9 +129,9 @@ InsetTabular::InsetTabular(Buffer const & buf, int rows, int columns)
     locked = no_selection = cursor_visible = false;
     cursor.x_fix(-1);
     oldcell = -1;
-    actcell = 0;
+    actrow = actcell = 0;
     cursor.pos(0);
-    sel_pos_start = sel_pos_end = sel_cell_start = sel_cell_end = 0;
+    clearSelection();
     need_update = INIT;
 }
 
@@ -144,7 +144,7 @@ InsetTabular::InsetTabular(InsetTabular const & tab, Buffer const & buf)
     locked = no_selection = cursor_visible = false;
     cursor.x_fix(-1);
     oldcell = -1;
-    actcell = 0;
+    actrow = actcell = 0;
     cursor.pos(0);
     sel_pos_start = sel_pos_end = sel_cell_start = sel_cell_end = 0;
     need_update = INIT;
@@ -223,7 +223,7 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
                        float & x, bool cleared) const
 {
     Painter & pain = bv->painter();
-    int i, j, cell = 0;
+    int i, j;
     int nx;
     float cx;
 
@@ -252,11 +252,12 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
     bool dodraw;
     x += ADD_TO_TABULAR_WIDTH;
     if (cleared) {
-       for(i = 0; i < tabular->rows(); ++i) {
+       int cell = 0;
+       for (i = 0; i < tabular->rows(); ++i) {
            nx = int(x);
            dodraw = ((baseline + tabular->GetDescentOfRow(i)) > 0) &&
                    (baseline - tabular->GetAscentOfRow(i))<pain.paperHeight();
-           for(j = 0; j < tabular->columns(); ++j) {
+           for (j = 0; j < tabular->columns(); ++j) {
                if (tabular->IsPartOfMultiColumn(i, j))
                    continue;
                cx = nx + tabular->GetBeginningOfTextInCell(cell);
@@ -275,48 +276,100 @@ void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
                tabular->GetAdditionalHeight(cell);
        }
     } else if (need_update == CELL) {
+       int cell = 0;
        nx = int(x);
-       for(i = 0; (cell < actcell) && (i < tabular->rows()); ++i) {
-           for(j = 0; (cell < actcell) && (j < tabular->columns()); ++j) {
-               if (tabular->IsPartOfMultiColumn(i, j))
-                   continue;
-               nx += tabular->GetWidthOfColumn(cell);
-               ++cell;
+       if (the_locking_inset) {
+           Inset * inset = tabular->GetCellInset(cell);
+           for (i = 0; (inset != the_locking_inset) && (i < tabular->rows());
+                ++i)
+           {
+               for (j = 0; (inset != the_locking_inset) && (j < tabular->columns()); ++j)
+               {
+                   if (tabular->IsPartOfMultiColumn(i, j))
+                       continue;
+                   nx += tabular->GetWidthOfColumn(cell);
+                   ++cell;
+                   inset = tabular->GetCellInset(cell);
+               }
+               if (tabular->row_of_cell(cell) > i) {
+                   nx = int(x);
+                   baseline += tabular->GetDescentOfRow(i) +
+                       tabular->GetAscentOfRow(i + 1) +
+                       tabular->GetAdditionalHeight(cell);
+               }
            }
-           if (tabular->row_of_cell(cell) > i) {
-               nx = int(x);
-               baseline += tabular->GetDescentOfRow(i) +
-                   tabular->GetAscentOfRow(i + 1) +
-                   tabular->GetAdditionalHeight(cell);
+       } else {
+           for (i = 0; (cell < actcell) && (i < tabular->rows()); ++i) {
+               for (j = 0; (cell < actcell) && (j < tabular->columns()); ++j) {
+                   if (tabular->IsPartOfMultiColumn(i, j))
+                       continue;
+                   nx += tabular->GetWidthOfColumn(cell);
+                   ++cell;
+               }
+               if (tabular->row_of_cell(cell) > i) {
+                   nx = int(x);
+                   baseline += tabular->GetDescentOfRow(i) +
+                       tabular->GetAscentOfRow(i + 1) +
+                       tabular->GetAdditionalHeight(cell);
+               }
            }
        }
-        i = tabular->row_of_cell(actcell);
-       if (the_locking_inset == tabular->GetCellInset(cell)) {
-           LyXText::text_status st = bv->text->status;
-           do {
-               cx = nx + tabular->GetBeginningOfTextInCell(cell);
-               bv->text->status = st;
-               if (need_update == CELL) {
-                    // clear before the inset
-                   pain.fillRectangle(
-                       nx + 1,
-                       baseline - tabular->GetAscentOfRow(i) + 1,
-                       int(cx - nx - 1),
-                       tabular->GetAscentOfRow(i) +
-                       tabular->GetDescentOfRow(i) - 1);
-                   // clear behind the inset
-                   pain.fillRectangle(
-                       int(cx + the_locking_inset->width(bv,font) + 1),
-                       baseline - tabular->GetAscentOfRow(i) + 1,
-                       tabular->GetWidthOfColumn(cell) -
-                       tabular->GetBeginningOfTextInCell(cell) -
-                       the_locking_inset->width(bv,font) - 1,
-                       tabular->GetAscentOfRow(i) +
-                       tabular->GetDescentOfRow(i) - 1);
-               }
-               tabular->GetCellInset(cell)->draw(bv,font,baseline, cx, false);
-           } while(bv->text->status == LyXText::CHANGED_IN_DRAW);
+       i = tabular->row_of_cell(cell);
+       if (the_locking_inset != tabular->GetCellInset(cell)) {
+           lyxerr[Debug::INSETS] << "ERROR this shouldn't happen\n";
+           return;
+       }
+#if 0
+       LyXText::text_status st = bv->text->status;
+       do {
+           cx = nx + tabular->GetBeginningOfTextInCell(cell);
+           bv->text->status = st;
+           if (need_update == CELL) {
+               // clear before the inset
+               pain.fillRectangle(
+                   nx + 1,
+                   baseline - tabular->GetAscentOfRow(i) + 1,
+                   int(cx - nx - 1),
+                   tabular->GetAscentOfRow(i) +
+                   tabular->GetDescentOfRow(i) - 1);
+               // clear behind the inset
+               pain.fillRectangle(
+                   int(cx + the_locking_inset->width(bv,font) + 1),
+                   baseline - tabular->GetAscentOfRow(i) + 1,
+                   tabular->GetWidthOfColumn(cell) -
+                   tabular->GetBeginningOfTextInCell(cell) -
+                   the_locking_inset->width(bv,font) -
+                   tabular->GetAdditionalWidth(cell) - 1,
+                   tabular->GetAscentOfRow(i) +
+                   tabular->GetDescentOfRow(i) - 1);
+           }
+           tabular->GetCellInset(cell)->draw(bv,font,baseline, cx, false);
+       } while(bv->text->status == LyXText::CHANGED_IN_DRAW);
+#else
+       cx = nx + tabular->GetBeginningOfTextInCell(cell);
+       if (need_update == CELL) {
+           // clear before the inset
+           pain.fillRectangle(
+               nx + 1,
+               baseline - tabular->GetAscentOfRow(i) + 1,
+               int(cx - nx - 1),
+               tabular->GetAscentOfRow(i) +
+               tabular->GetDescentOfRow(i) - 1);
+           // clear behind the inset
+           pain.fillRectangle(
+               int(cx + the_locking_inset->width(bv,font) + 1),
+               baseline - tabular->GetAscentOfRow(i) + 1,
+               tabular->GetWidthOfColumn(cell) -
+               tabular->GetBeginningOfTextInCell(cell) -
+               the_locking_inset->width(bv,font) -
+               tabular->GetAdditionalWidth(cell) - 1,
+               tabular->GetAscentOfRow(i) +
+               tabular->GetDescentOfRow(i) - 1);
        }
+       tabular->GetCellInset(cell)->draw(bv,font,baseline, cx, false);
+       if (bv->text->status == LyXText::CHANGED_IN_DRAW)
+           return;
+#endif
     }
     x -= ADD_TO_TABULAR_WIDTH;
     x += width(bv, font);
@@ -402,7 +455,7 @@ void InsetTabular::update(BufferView * bv, LyXFont const & font, bool reinit)
 //     inset_x = cursor.x() - top_x + tabular->GetBeginningOfTextInCell(actcell);
 //     inset_y = cursor.y();
     }
-    switch(need_update) {
+    switch (need_update) {
     case INIT:
     case FULL:
     case CELL:
@@ -592,8 +645,8 @@ bool InsetTabular::InsertInset(BufferView * bv, Inset * inset)
 
 void InsetTabular::InsetButtonPress(BufferView * bv, int x, int y, int button)
 {
-    if (hasSelection()) {
-       sel_pos_start = sel_pos_end = sel_cell_start = sel_cell_end = 0;
+    if (hasSelection() && (button != 3)) {
+       clearSelection();
        UpdateLocal(bv, SELECTION, false);
     }
     no_selection = false;
@@ -964,9 +1017,20 @@ bool InsetTabular::calculate_dimensions_of_cells(BufferView * bv,
     InsetText * inset;
     bool changed = false;
     
-    for(int i = 0; i < tabular->rows(); ++i) {
+    // if we have a locking_inset we should have to check only this cell for
+    // change so I'll try this to have a boost, but who knows ;)
+    if ((need_update != INIT) &&
+       (the_locking_inset == tabular->GetCellInset(actcell))) {
+       maxAsc = the_locking_inset->ascent(bv, font);
+       maxDesc = the_locking_inset->descent(bv, font);
+       changed = tabular->SetWidthOfCell(actcell, the_locking_inset->width(bv, font));
+       changed = tabular->SetAscentOfRow(actrow, maxAsc + ADD_TO_HEIGHT) || changed;
+       changed = tabular->SetDescentOfRow(actrow, maxDesc + ADD_TO_HEIGHT) || changed;
+       return changed;
+    }
+    for (int i = 0; i < tabular->rows(); ++i) {
        maxAsc = maxDesc = 0;
-       for(int j= 0; j < tabular->columns(); ++j) {
+       for (int j= 0; j < tabular->columns(); ++j) {
            if (tabular->IsPartOfMultiColumn(i,j))
                continue;
            ++cell;
@@ -1060,9 +1124,9 @@ void InsetTabular::setPos(BufferView * bv, int x, int y) const
     // now search the right column
     int lx = tabular->GetWidthOfColumn(actcell) -
        tabular->GetAdditionalWidth(actcell);
-#warning Jürgen, can you rewrite this to _not_ use the sequencing operator. (Lgb)
 #if 0
-    for(; !tabular->IsLastCellInRow(actcell) && (lx < x);
+#warning Jürgen, can you rewrite this to _not_ use the sequencing operator. (Lgb)
+    for (; !tabular->IsLastCellInRow(actcell) && (lx < x);
        ++actcell,lx += tabular->GetWidthOfColumn(actcell) +
            tabular->GetAdditionalWidth(actcell - 1));
 #else
@@ -1089,10 +1153,10 @@ int InsetTabular::getCellXPos(int cell) const
 {
     int c = cell;
 
-    for(; !tabular->IsFirstCellInRow(c); --c)
+    for (; !tabular->IsFirstCellInRow(c); --c)
        ;
     int lx = tabular->GetWidthOfColumn(cell);
-    for(; c < cell; ++c) {
+    for (; c < cell; ++c) {
        lx += tabular->GetWidthOfColumn(c);
     }
     return (lx - tabular->GetWidthOfColumn(cell) + top_x);
@@ -1108,7 +1172,7 @@ void InsetTabular::resetPos(BufferView * bv) const
     int cell = 0;
     actrow = 0;
     cursor.y(0);
-    for(; (cell < actcell) && !tabular->IsLastRow(cell); ++cell) {
+    for (; (cell < actcell) && !tabular->IsLastRow(cell); ++cell) {
        if (tabular->IsLastCellInRow(cell)) {
            cursor.y(cursor.y() + tabular->GetDescentOfRow(actrow) +
                tabular->GetAscentOfRow(actrow + 1) +
@@ -1117,7 +1181,10 @@ void InsetTabular::resetPos(BufferView * bv) const
        }
     }
     static int const offset = ADD_TO_TABULAR_WIDTH + 2;
-    cursor.x(getCellXPos(actcell) + offset);
+    int new_x = getCellXPos(actcell);
+    new_x += offset;
+    cursor.x(new_x);
+//    cursor.x(getCellXPos(actcell) + offset);
     if (((cursor.x() - offset) > 20) &&
        ((cursor.x()-offset+tabular->GetWidthOfColumn(actcell)) >
         (bv->workWidth()-20)))
@@ -1239,7 +1306,7 @@ bool InsetTabular::TabularFeatures(BufferView * bv, string const & what)
     LyXTabular::Feature action = LyXTabular::LAST_ACTION;
 
     int i = 0;
-    for(; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
+    for (; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
        string const tmp = tabularFeatures[i].feature;
            
        if (tmp == what.substr(0, tmp.length())) {
@@ -1387,6 +1454,7 @@ void InsetTabular::TabularFeatures(BufferView * bv,
        if ((row+1) > tabular->rows())
            --row;
        actcell = tabular->GetCellNumber(row, column);
+       clearSelection();
        UpdateLocal(bv, INIT, true);
        break;
     case LyXTabular::DELETE_COLUMN:
@@ -1394,14 +1462,15 @@ void InsetTabular::TabularFeatures(BufferView * bv,
        if ((column+1) > tabular->columns())
            --column;
        actcell = tabular->GetCellNumber(row, column);
+       clearSelection();
        UpdateLocal(bv, INIT, true);
        break;
     case LyXTabular::M_TOGGLE_LINE_TOP:
        flag = false;
     case LyXTabular::TOGGLE_LINE_TOP:
        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)
+       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, flag);
        UpdateLocal(bv, INIT, true);
        break;
@@ -1410,8 +1479,8 @@ void InsetTabular::TabularFeatures(BufferView * bv,
        flag = false;
     case LyXTabular::TOGGLE_LINE_BOTTOM:
        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)
+       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,
                                       flag);
        UpdateLocal(bv, INIT, true);
@@ -1421,8 +1490,8 @@ void InsetTabular::TabularFeatures(BufferView * bv,
        flag = false;
     case LyXTabular::TOGGLE_LINE_LEFT:
        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)
+       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,
                                     flag);
        UpdateLocal(bv, INIT, true);
@@ -1432,8 +1501,8 @@ void InsetTabular::TabularFeatures(BufferView * bv,
        flag = false;
     case LyXTabular::TOGGLE_LINE_RIGHT:
        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)
+       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,
                                      flag);
        UpdateLocal(bv, INIT, true);
@@ -1445,8 +1514,8 @@ void InsetTabular::TabularFeatures(BufferView * bv,
     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)
+       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,
                                      flag);
        if (hasSelection())
@@ -1461,8 +1530,8 @@ void InsetTabular::TabularFeatures(BufferView * bv,
     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)
+       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),
                                       setVAlign, flag);
        if (hasSelection())
@@ -1513,8 +1582,8 @@ void InsetTabular::TabularFeatures(BufferView * bv,
     case LyXTabular::SET_ALL_LINES:
        setLines = 1;
     case LyXTabular::UNSET_ALL_LINES:
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetAllLines(tabular->GetCellNumber(i,j), setLines);
        UpdateLocal(bv, INIT, true);
        break;
@@ -1533,13 +1602,13 @@ void InsetTabular::TabularFeatures(BufferView * bv,
        tabular->SetRotateTabular(false);
        break;
     case LyXTabular::SET_ROTATE_CELL:
-       for(i=sel_row_start; i<=sel_row_end; ++i)
-           for(j=sel_col_start; j<=sel_col_end; ++j)
+       for (i=sel_row_start; i<=sel_row_end; ++i)
+           for (j=sel_col_start; j<=sel_col_end; ++j)
                tabular->SetRotateCell(tabular->GetCellNumber(i,j),true);
        break;
     case LyXTabular::UNSET_ROTATE_CELL:
-       for(i = sel_row_start; i <= sel_row_end; ++i)
-           for(j = sel_col_start; j <= sel_col_end; ++j)
+       for (i = sel_row_start; i <= sel_row_end; ++i)
+           for (j = sel_col_start; j <= sel_col_end; ++j)
                tabular->SetRotateCell(tabular->GetCellNumber(i, j), false);
        break;
     case LyXTabular::SET_USEBOX:
@@ -1547,8 +1616,8 @@ void InsetTabular::TabularFeatures(BufferView * bv,
        LyXTabular::BoxType val = LyXTabular::BoxType(strToInt(value));
        if (val == tabular->GetUsebox(actcell))
            val = LyXTabular::BOX_NONE;
-       for(i = sel_row_start; i <= sel_row_end; ++i)
-           for(j = sel_col_start; j <= sel_col_end; ++j)
+       for (i = sel_row_start; i <= sel_row_end; ++i)
+           for (j = sel_col_start; j <= sel_col_end; ++j)
                tabular->SetUsebox(tabular->GetCellNumber(i, j), val);
        break;
     }
@@ -1604,16 +1673,16 @@ bool InsetTabular::ActivateCellInset(BufferView * bv, int x, int y, int button,
 bool InsetTabular::InsetHit(BufferView * bv, int x, int ) const
 {
     InsetText * inset = tabular->GetCellInset(actcell);
-    int x1 = x + top_x;
+    int const x1 = x + top_x;
 
     if (!cellstart(cursor.pos())) {
-       return (((x + top_x) < cursor.x()) &&
-               ((x + top_x) > (cursor.x() - inset->width(bv,
-                                                     LyXFont(LyXFont::ALL_SANE)))));
+       return ((x + top_x) < cursor.x() &&
+               (x + top_x) > (cursor.x() - inset->width(bv,
+                                                     LyXFont(LyXFont::ALL_SANE))));
     } else {
-       int x2 = cursor.x() + tabular->GetBeginningOfTextInCell(actcell);
-       return ((x1 > x2) &&
-               (x1 < (x2 + inset->width(bv, LyXFont(LyXFont::ALL_SANE)))));
+       int const x2 = cursor.x() + tabular->GetBeginningOfTextInCell(actcell);
+       return (x1 > x2 &&
+               x1 < (x2 + inset->width(bv, LyXFont(LyXFont::ALL_SANE))));
     }
 }
 
@@ -1635,7 +1704,7 @@ int InsetTabular::getMaxWidth(Painter & pain,
 {
     int const n = tabular->GetNumberOfCells();
     int cell = 0;
-    for(; cell < n; ++cell) {
+    for (; cell < n; ++cell) {
        if (tabular->GetCellInset(cell) == inset)
            break;
     }
@@ -1689,7 +1758,7 @@ LyXFunc::func_status InsetTabular::getStatus(string const & what) const
     LyXFunc::func_status status = LyXFunc::OK;
     
     int i = 0;
-    for(; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
+    for (; tabularFeatures[i].action != LyXTabular::LAST_ACTION; ++i) {
        string const tmp = tabularFeatures[i].feature;
        if (tmp == what.substr(0, tmp.length())) {                  
        //if (!strncmp(tabularFeatures[i].feature.c_str(), what.c_str(),
@@ -1934,14 +2003,14 @@ bool InsetTabular::copySelection(BufferView * bv)
 
     paste_tabular = new LyXTabular(this, *tabular); // rows, columns);
     int i;
-    for(i=0; i < sel_row_start; ++i)
+    for (i=0; i < sel_row_start; ++i)
        paste_tabular->DeleteRow(0);
     while(paste_tabular->rows() > rows)
        paste_tabular->DeleteRow(rows);
     paste_tabular->SetTopLine(0, true, true);
     paste_tabular->SetBottomLine(paste_tabular->GetFirstCellInRow(rows-1),
                                 true, true);
-    for(i=0; i < sel_col_start; ++i)
+    for (i=0; i < sel_col_start; ++i)
        paste_tabular->DeleteColumn(0);
     while(paste_tabular->columns() > columns)
        paste_tabular->DeleteColumn(columns);
@@ -1950,7 +2019,7 @@ bool InsetTabular::copySelection(BufferView * bv)
 
     ostringstream sstr;
     paste_tabular->Ascii(bv->buffer(), sstr);
-    bv->stuffClipboard(sstr.str());
+    bv->stuffClipboard(sstr.str().c_str());
     return true;
 }
 
@@ -1959,7 +2028,7 @@ bool InsetTabular::pasteSelection(BufferView * bv)
 {
     if (!paste_tabular)
        return false;
-    for(int j=0, i=actcell; j<paste_tabular->GetNumberOfCells(); ++j,++i) {
+    for (int j=0, i=actcell; j<paste_tabular->GetNumberOfCells(); ++j,++i) {
        while (paste_tabular->row_of_cell(j) > tabular->row_of_cell(i)-actrow)
            ++i;
        if (tabular->GetNumberOfCells() <= i)
@@ -2006,8 +2075,8 @@ bool InsetTabular::cutSelection()
            //sel_cell_end = tmp;
        swap(sel_cell_start, sel_cell_end);
     }
-    for(int i = sel_row_start; i <= sel_row_end; ++i) {
-       for(int j = sel_col_start; j <= sel_col_end; ++j) {
+    for (int i = sel_row_start; i <= sel_row_end; ++i) {
+       for (int j = sel_col_start; j <= sel_col_end; ++j) {
            tabular->GetCellInset(tabular->GetCellNumber(i, j))->clear();
        }
     }