Hi, thanks for pointing that out. I have a slightly simpler fix to apply. html_engine_get_table should not return e->cursor->object and there should not be two "Table" menu entries in popup menu.
Cheers Radek On Čt, 2003-01-02 at 03:18, Yuedong Du wrote: > Just resend this mail, it seems that hackers back now. > > > > > Please do not omit this mail just because size of the patch or the mail. > Please > be patient, compare to the problems it resolves, I think it worths. > > > Then I will first describe problems in current table. Then the solution > provided in the patch. > > Bugzilla link of this bug: > http://bugzilla.ximian.com/show_bug.cgi?id=35557 > > 1. Current Problems > ================================================================== > There are some serious problems found in table of composer: > I. When select the outmost bound of table resize the table will cause > hang the cpu. > II. Select the table like I, edit the table, add column undo will crash. > III.In the case table contain a subtable, select the subtable, and right > click the sub-table. Select 'Table' in the popup. There are actually > two 'Table'. One represent table, another sub-table. But if when you > click it, you found both the properties in the dialog are for one > of the 'Table'. It is, if you have table of subtable of different > size, the properties of them are of the same. > > Actually I think there are very likely more problems I do not know. All > these problems caused by similiar root reasons: > > a. First is the widely used function html_engine_get_table(). It return > a table. either object point to by the current cursor or grandfather of > the object. Then the table is used. Consider case III mentioned above, > if we use this function, we cannot tell which table is the one we want. > > By grep and wc you find there are more than 60 of usages of it. > > b. In functions that edit the table, e.g., delete_table_column(). > It just assume user's focus is on table's cell and want to edit > the table contain it. In case I and II above, this is not true. > > > > 2. Solutions in the patch > =========================================================== > Actually there are too many use of these functions. So I can't > fix all of them at once, just focus on table edit use the popup > menu. And also try to not affect other part. > > Thus to resolve this problems, the patch attached do follow jobs: > > a. First we must know whether user specified is which table. Thus > add a flag into the structure GtkHTMLEditTableProperties. And > in popup.c, when generate the pop up menu, add a case so that > we can set the new added flag into GtkHTMLEditTableProperties. > > b. a new function html_engine_get_table_2(), compare to > html_engine_get_table(), one more parameter is added to specify whether > you want table point by cursor or grandfather of it. The choose that > not to rewrite html_engine_get_table() is because the wide use of it. > > c. Use the html_engine_get_table_2() in table editing functions,e.g., > delete_table_column(). Also add a flag to this function, thus to specify > which table to use. Add html_engine_delete_table_column_2() which call > delte_table_column() and specify using the object point by cursor > as table. Because html_engine_delete_table_column() will assume the > grandfather. Choose not modify html_engine_get_table() directly is > because it is used in gtkhtml.c. > > Any comments are wellcome! > > I will resend the mail after Jan.2, when hackers back,:-). And I > also hope copyright problem will be resolved at that time. > > > Best Regards > York Du > > > ______________________________________________________________________ > > Index: components/html-editor/popup.c > =================================================================== > RCS file: /cvs/gnome/gtkhtml/components/html-editor/popup.c,v > retrieving revision 1.62 > diff -u -4 -r1.62 popup.c > --- components/html-editor/popup.c 2 Oct 2002 17:11:34 -0000 1.62 > +++ components/html-editor/popup.c 24 Dec 2002 07:26:46 -0000 > @@ -230,8 +230,15 @@ > rule_properties, > rule_apply_cb, > rule_close_cb); > break; > + case GTK_HTML_EDIT_PROPERTY_TABLE_SELF: > + gtk_html_edit_properties_dialog_add_entry >(cd->properties_dialog, > + t, _("Table"), > + table_properties_2, > + table_apply_cb, > + table_close_cb); > + break; > case GTK_HTML_EDIT_PROPERTY_TABLE: > gtk_html_edit_properties_dialog_add_entry >(cd->properties_dialog, > t, _("Table"), > table_properties, > @@ -496,9 +503,9 @@ > ADD_PROP (PARAGRAPH); > break; > case HTML_TYPE_TABLE: > ADD_SEP; > - ADD_PROP (TABLE); > + ADD_PROP (TABLE_SELF); > ADD_ITEM (_("Table..."), prop_dialog, TABLE); > default: > } > if (obj->parent && obj->parent->parent && HTML_IS_TABLE_CELL >(obj->parent->parent)) { > Index: components/html-editor/properties.h > =================================================================== > RCS file: /cvs/gnome/gtkhtml/components/html-editor/properties.h,v > retrieving revision 1.12 > diff -u -4 -r1.12 properties.h > --- components/html-editor/properties.h 2 Oct 2002 17:11:34 -0000 1.12 > +++ components/html-editor/properties.h 24 Dec 2002 07:26:46 -0000 > @@ -38,8 +38,9 @@ > GTK_HTML_EDIT_PROPERTY_LINK, > GTK_HTML_EDIT_PROPERTY_BODY, > GTK_HTML_EDIT_PROPERTY_RULE, > GTK_HTML_EDIT_PROPERTY_TABLE, > + GTK_HTML_EDIT_PROPERTY_TABLE_SELF, /* It is a table */ > GTK_HTML_EDIT_PROPERTY_CELL, > }; > > GtkHTMLEditPropertiesDialog * gtk_html_edit_properties_dialog_new >(GtkHTMLControlData *cd, > Index: components/html-editor/table.c > =================================================================== > RCS file: /cvs/gnome/gtkhtml/components/html-editor/table.c,v > retrieving revision 1.35 > diff -u -4 -r1.35 table.c > --- components/html-editor/table.c 16 Oct 2001 21:19:19 -0000 1.35 > +++ components/html-editor/table.c 24 Dec 2002 07:26:48 -0000 > @@ -96,8 +96,9 @@ > GtkWidget *option_template; > > gboolean disable_change; > gboolean insert; > + gboolean self; > } GtkHTMLEditTableProperties; > > static void set_insert_ui (GtkHTMLEditTableProperties *d); > > @@ -711,13 +712,15 @@ > FILL; > } > > static void > -get_data (GtkHTMLEditTableProperties *d) > +get_data (GtkHTMLEditTableProperties *d, gboolean self) > { > - d->table = html_engine_get_table (d->cd->html->engine); > + d->table = html_engine_get_table_2 (d->cd->html->engine, self); > g_return_if_fail (d->table); > > + if (self) d->self = TRUE; > + > if (d->table->bgColor) { > d->has_bg_color = TRUE; > d->bg_color = *d->table->bgColor; > } > @@ -756,10 +759,25 @@ > table_properties (GtkHTMLControlData *cd, gpointer *set_data) > { > GtkHTMLEditTableProperties *data = data_new (cd); > GtkWidget *rv; > + gboolean flag; > + > + get_data (data, FALSE); > + *set_data = data; > + rv = table_widget (data); > + set_ui (data); > + > + return rv; > +} > + > +GtkWidget * > +table_properties_2 (GtkHTMLControlData *cd, gpointer *set_data) > +{ > + GtkHTMLEditTableProperties *data = data_new (cd); > + GtkWidget *rv; > > - get_data (data); > + get_data (data, TRUE); > *set_data = data; > rv = table_widget (data); > set_ui (data); > > @@ -833,13 +851,13 @@ > d->has_width ? d->width : 0, d->has_width >? d->width_percent : FALSE); > d->changed_width = FALSE; > } > if (d->changed_cols) { > - html_engine_table_set_cols (d->cd->html->engine, d->cols); > + html_engine_table_set_cols (d->cd->html->engine, d->cols, d->self); > d->changed_cols = FALSE; > } > if (d->changed_rows) { > - html_engine_table_set_rows (d->cd->html->engine, d->rows); > + html_engine_table_set_rows (d->cd->html->engine, d->rows, d->self); > d->changed_rows = FALSE; > } > } > > Index: components/html-editor/table.h > =================================================================== > RCS file: /cvs/gnome/gtkhtml/components/html-editor/table.h,v > retrieving revision 1.2 > diff -u -4 -r1.2 table.h > --- components/html-editor/table.h 15 May 2001 16:53:13 -0000 1.2 > +++ components/html-editor/table.h 24 Dec 2002 07:26:48 -0000 > @@ -26,8 +26,9 @@ > #include <gnome.h> > #include "control-data.h" > > GtkWidget * table_properties (GtkHTMLControlData *cd, gpointer >*set_data); > +GtkWidget * table_properties_2 (GtkHTMLControlData *cd, gpointer >*set_data); > GtkWidget * table_insert (GtkHTMLControlData *cd, gpointer >*set_data); > void table_insert_cb (GtkHTMLControlData *cd, gpointer >get_data); > void table_apply_cb (GtkHTMLControlData *cd, gpointer >get_data); > void table_close_cb (GtkHTMLControlData *cd, gpointer >get_data); > Index: src/htmlengine-edit-table.c > =================================================================== > RCS file: /cvs/gnome/gtkhtml/src/htmlengine-edit-table.c,v > retrieving revision 1.56 > diff -u -4 -r1.56 htmlengine-edit-table.c > --- src/htmlengine-edit-table.c 7 Oct 2002 10:02:23 -0000 1.56 > +++ src/htmlengine-edit-table.c 24 Dec 2002 07:26:55 -0000 > @@ -35,12 +35,16 @@ > #include "htmltablecell.h" > #include "htmltablepriv.h" > #include "htmlundo.h" > > -static void delete_table_column (HTMLEngine *e, HTMLUndoDirection dir); > -static void insert_table_column (HTMLEngine *e, gboolean after, HTMLTableCell >**column_cells, HTMLUndoDirection dir); > -static void delete_table_row (HTMLEngine *e, HTMLUndoDirection dir); > -static void insert_table_row (HTMLEngine *e, gboolean after, HTMLTableCell >**row_cells, HTMLUndoDirection dir); > +struct _DeleteCellsUndo; > +typedef struct _DeleteCellsUndo DeleteCellsUndo; > + > +static void delete_table_column (HTMLEngine *e, HTMLUndoDirection dir, int col, >gboolean self); > +static void insert_table_column (HTMLEngine *e, gint col, HTMLTableCell >**column_cells, HTMLUndoDirection dir, gboolean self); > +static void delete_table_row (HTMLEngine *e, HTMLUndoDirection dir, int row, >gboolean self); > +static void insert_table_row (HTMLEngine *e, gint row, HTMLTableCell >**row_cells, HTMLUndoDirection dir, gboolean self); > +static DeleteCellsUndo * delete_cells_undo_new (HTMLTableCell **cells, gint size, >gint pos, gboolean self); > > HTMLTable * > html_engine_get_table (HTMLEngine *e) > { > @@ -55,8 +59,27 @@ > else > return HTML_TABLE (e->cursor->object->parent->parent->parent); > } > > +HTMLTable * > +html_engine_get_table_2(HTMLEngine *e, gboolean flag) > +{ > + if (flag) { > + if (HTML_IS_TABLE (e->cursor->object)) > + return HTML_TABLE (e->cursor->object); > + return NULL; > + } > + > + if (!e->cursor->object->parent > + || !e->cursor->object->parent->parent > + || !e->cursor->object->parent->parent->parent) > + return NULL; > + else if (!HTML_IS_TABLE (e->cursor->object->parent->parent->parent)) > + return NULL; > + else > + return HTML_TABLE (e->cursor->object->parent->parent->parent); > +} > + > HTMLTableCell * > html_engine_new_cell (HTMLEngine *e, HTMLTable *table) > { > HTMLObject *cell; > @@ -84,8 +107,18 @@ > * > * Inserts new table with one cell containing an empty flow with an empty text. >Inserted table has 1 row and 1 column. > **/ > > +struct _DeleteCellsUndo { > + HTMLUndoData data; > + > + HTMLTableCell **cells; > + gint size; > + gint pos; > + gboolean self; > +}; > + > + > void > html_engine_insert_table_1_1 (HTMLEngine *e) > { > HTMLObject *table; > @@ -134,17 +167,18 @@ > > static void > insert_column_undo_action (HTMLEngine *e, HTMLUndoData *data, HTMLUndoDirection >dir, guint position_after) > { > - delete_table_column (e, html_undo_direction_reverse (dir)); > + DeleteCellsUndo * undo_data = (DeleteCellsUndo *) data; > + delete_table_column (e, html_undo_direction_reverse (dir), undo_data->pos, >undo_data->self); > } > > static void > -insert_column_setup_undo (HTMLEngine *e, guint position_before, HTMLUndoDirection >dir) > +insert_column_setup_undo (HTMLEngine *e, guint position_before, HTMLUndoDirection >dir, gint col, gboolean self) > { > html_undo_add_action (e->undo, > html_undo_action_new ("Insert table column", >insert_column_undo_action, > - NULL, html_cursor_get_position >(e->cursor), > + >HTML_UNDO_DATA(delete_cells_undo_new(NULL, 0, col, self)), html_cursor_get_position >(e->cursor), > position_before), > dir); > } > > @@ -179,23 +213,25 @@ > } while (html_cursor_forward (e->cursor, e)); > } > > static void > -insert_table_column (HTMLEngine *e, gint col, HTMLTableCell **column, >HTMLUndoDirection dir) > +insert_table_column (HTMLEngine *e, gint col, HTMLTableCell **column, >HTMLUndoDirection dir, gboolean self) > { > HTMLTable *t; > HTMLTableCell *cell; > gint c, r; > guint position_before; > > - t = HTML_TABLE (html_object_nth_parent (e->cursor->object, 3)); > + t = html_engine_get_table_2(e, self); > + > if (!t) > return; > > html_engine_freeze (e); > > position_before = e->cursor->position; > - go_table_0 (e, HTML_OBJECT (t)); > + if (!self) > + go_table_0 (e, HTML_OBJECT (t)); > > html_table_alloc_cell (t, 0, t->totalCols); > for (r = 0; r < t->totalRows; r ++) { > for (c = t->totalCols - 1; c >= col; c --) { > @@ -219,10 +255,12 @@ > html_table_cell_set_position (t->cells [r][col], r, col); > } > } > > - go_after_col (e, HTML_OBJECT (t), col); > - insert_column_setup_undo (e, position_before, dir); > + /* If the table itself is selected, do not need to move cursor. */ > + if (!self) > + go_after_col (e, HTML_OBJECT (t), col); > + insert_column_setup_undo (e, position_before, dir, col, self); > html_object_change_set (HTML_OBJECT (t), HTML_CHANGE_ALL_CALC); > html_engine_queue_draw (e, HTML_OBJECT (t)); > html_engine_thaw (e); > } > @@ -242,24 +280,21 @@ > HTMLObject *cell; > > cell = html_object_nth_parent (e->cursor->object, 2); > if (cell && HTML_IS_TABLE_CELL (cell)) > - insert_table_column (e, HTML_TABLE_CELL (cell)->col + (after ? 1 : 0), >NULL, HTML_UNDO_UNDO); > + insert_table_column (e, HTML_TABLE_CELL (cell)->col + (after ? 1 : 0), >NULL, HTML_UNDO_UNDO, FALSE); > +} > + > +void > +html_engine_insert_table_column_2(HTMLEngine *e, int col, gboolean after) > +{ > + insert_table_column (e, col + (after ? 1 : 0), NULL, HTML_UNDO_UNDO, TRUE); > } > > /* > * Delete column > */ > > -struct _DeleteCellsUndo { > - HTMLUndoData data; > - > - HTMLTableCell **cells; > - gint size; > - gint pos; > -}; > -typedef struct _DeleteCellsUndo DeleteCellsUndo; > - > static void > delete_cells_undo_destroy (HTMLUndoData *undo_data) > { > DeleteCellsUndo *data = (DeleteCellsUndo *) undo_data; > @@ -269,9 +304,9 @@ > html_object_destroy (HTML_OBJECT (data->cells [i])); > } > > static DeleteCellsUndo * > -delete_cells_undo_new (HTMLTableCell **cells, gint size, gint pos) > +delete_cells_undo_new (HTMLTableCell **cells, gint size, gint pos, gboolean self) > { > DeleteCellsUndo *data; > > data = g_new0 (DeleteCellsUndo, 1); > @@ -281,8 +316,9 @@ > data->data.destroy = delete_cells_undo_destroy; > data->cells = cells; > data->pos = pos; > data->size = size; > + data->self = self; > > return data; > } > > @@ -290,45 +326,50 @@ > delete_column_undo_action (HTMLEngine *e, HTMLUndoData *undo_data, >HTMLUndoDirection dir, guint position_after) > { > DeleteCellsUndo *data = (DeleteCellsUndo *) undo_data; > > - g_assert (data->size == HTML_TABLE (html_object_nth_parent (e->cursor->object, >3))->totalRows); > - insert_table_column (e, data->pos, data->cells, html_undo_direction_reverse >(dir)); > + insert_table_column (e, data->pos, data->cells, html_undo_direction_reverse >(dir), data->self); > } > > static void > -delete_column_setup_undo (HTMLEngine *e, HTMLTableCell **column, gint size, guint >position_before, gint col, HTMLUndoDirection dir) > +delete_column_setup_undo (HTMLEngine *e, HTMLTableCell **column, gint size, guint >position_before, gint col, HTMLUndoDirection dir, gboolean self) > { > html_undo_add_action (e->undo, > html_undo_action_new ("Delete table column", >delete_column_undo_action, > - HTML_UNDO_DATA >(delete_cells_undo_new (column, size, col)), > + HTML_UNDO_DATA >(delete_cells_undo_new (column, size, col, self)), > html_cursor_get_position >(e->cursor), > position_before), dir); > } > > static void > -delete_table_column (HTMLEngine *e, HTMLUndoDirection dir) > +delete_table_column (HTMLEngine *e, HTMLUndoDirection dir, int del_col, gboolean >self) > { > HTMLTable *t; > HTMLTableCell *cell; > HTMLTableCell **column; > gint r, c, col; > guint position_before; > > - t = HTML_TABLE (html_object_nth_parent (e->cursor->object, 3)); > + t = html_engine_get_table_2(e, self); > > /* this command is valid only in table and when this table has > 1 column */ > if (!t || !HTML_IS_TABLE (HTML_OBJECT (t)) || t->totalCols < 2) > return; > > html_engine_freeze (e); > > position_before = e->cursor->position; > - cell = HTML_TABLE_CELL (html_object_nth_parent (e->cursor->object, 2)); > - col = cell->col; > + if (!self) { > + cell = HTML_TABLE_CELL (html_object_nth_parent (e->cursor->object, 2)); > + col = cell->col; > + } else { > + col = del_col; > + } > + > column = g_new0 (HTMLTableCell *, t->totalRows); > > - go_table_0 (e, HTML_OBJECT (t)); > + if (!self) > + go_table_0 (e, HTML_OBJECT (t)); > for (r = 0; r < t->totalRows; r ++) { > cell = t->cells [r][col]; > > /* remove & keep old one */ > @@ -347,10 +388,12 @@ > t->cells [r][c] = NULL; > } > } > } > - go_after_col (e, HTML_OBJECT (t), MIN (col, t->totalCols - 1)); > - delete_column_setup_undo (e, column, t->totalRows, position_before, col, dir); > + > + if (!self) > + go_after_col (e, HTML_OBJECT (t), MIN (col, t->totalCols - 1)); > + delete_column_setup_undo (e, column, t->totalRows, position_before, col, dir, >self); > t->totalCols --; > > html_object_change_set (HTML_OBJECT (t), HTML_CHANGE_ALL_CALC); > html_engine_queue_draw (e, HTML_OBJECT (t)); > @@ -366,9 +409,15 @@ > > void > html_engine_delete_table_column (HTMLEngine *e) > { > - delete_table_column (e, HTML_UNDO_UNDO); > + delete_table_column (e, HTML_UNDO_UNDO, 0 , FALSE); > +} > + > +void > +html_engine_delete_table_column_2 (HTMLEngine *e, int col) > +{ > + delete_table_column (e, HTML_UNDO_UNDO, col, TRUE); > } > > /* > * Insert Row > @@ -376,37 +425,40 @@ > > static void > insert_row_undo_action (HTMLEngine *e, HTMLUndoData *data, HTMLUndoDirection dir, >guint position_after) > { > - delete_table_row (e, html_undo_direction_reverse (dir)); > + DeleteCellsUndo * undo_data = (DeleteCellsUndo *) data; > + delete_table_row (e, html_undo_direction_reverse (dir), undo_data->pos , >undo_data->self); > } > > static void > -insert_row_setup_undo (HTMLEngine *e, guint position_before, HTMLUndoDirection dir) > +insert_row_setup_undo (HTMLEngine *e, guint position_before, HTMLUndoDirection dir, >gint row, gboolean self) > { > html_undo_add_action (e->undo, > html_undo_action_new ("Insert table row", >insert_row_undo_action, > - NULL, > + >HTML_UNDO_DATA(delete_cells_undo_new(NULL, 0, row, self)), > html_cursor_get_position >(e->cursor), > html_cursor_get_position >(e->cursor)), > dir); > } > > static void > -insert_table_row (HTMLEngine *e, gint row, HTMLTableCell **row_cells, >HTMLUndoDirection dir) > +insert_table_row (HTMLEngine *e, gint row, HTMLTableCell **row_cells, >HTMLUndoDirection dir, gboolean self) > { > HTMLTable *t; > HTMLTableCell *cell; > gint r, c; > guint position_before; > > - t = HTML_TABLE (html_object_nth_parent (e->cursor->object, 3)); > + t = html_engine_get_table_2 (e, self); > + > if (!t) > return; > > html_engine_freeze (e); > position_before = e->cursor->position; > - go_table_0 (e, HTML_OBJECT (t)); > + if (!self) > + go_table_0 (e, HTML_OBJECT (t)); > > html_table_alloc_cell (t, t->totalRows, 0); > for (c = 0; c < t->totalCols; c ++) { > for (r = t->totalRows; r > row; r --) { > @@ -430,10 +482,11 @@ > html_table_cell_set_position (t->cells [row][c], row, c); > } > } > > - go_after_row (e, HTML_OBJECT (t), row); > - insert_row_setup_undo (e, position_before, dir); > + if (!self) > + go_after_row (e, HTML_OBJECT (t), row); > + insert_row_setup_undo (e, position_before, dir, row, self); > html_object_change_set (HTML_OBJECT (t), HTML_CHANGE_ALL_CALC); > html_engine_queue_draw (e, HTML_OBJECT (t)); > html_engine_thaw (e); > } > @@ -453,9 +506,15 @@ > HTMLObject *cell; > > cell = html_object_nth_parent (e->cursor->object, 2); > if (cell && HTML_IS_TABLE_CELL (cell)) > - insert_table_row (e, HTML_TABLE_CELL (cell)->row + (after ? 1 : 0), >NULL, HTML_UNDO_UNDO); > + insert_table_row (e, HTML_TABLE_CELL (cell)->row + (after ? 1 : 0), >NULL, HTML_UNDO_UNDO, FALSE); > +} > + > +void > +html_engine_insert_table_row_2 (HTMLEngine *e, int row, gboolean after) > +{ > + insert_table_row (e, row + (after ? 1 : 0), NULL, HTML_UNDO_UNDO, TRUE); > } > > /* > * Delete row > @@ -465,46 +524,49 @@ > delete_row_undo_action (HTMLEngine *e, HTMLUndoData *undo_data, HTMLUndoDirection >dir, guint position_after) > { > DeleteCellsUndo *data = (DeleteCellsUndo *) undo_data; > > - g_assert (data->size == HTML_TABLE (html_object_nth_parent (e->cursor->object, >3))->totalCols); > - insert_table_row (e, data->pos, data->cells, html_undo_direction_reverse >(dir)); > + insert_table_row (e, data->pos, data->cells, html_undo_direction_reverse >(dir), data->self); > } > > static void > delete_row_setup_undo (HTMLEngine *e, HTMLTableCell **row_cells, gint size, guint >position_before, > - gint row, HTMLUndoDirection dir) > + gint row, HTMLUndoDirection dir, gboolean self) > { > html_undo_add_action (e->undo, > html_undo_action_new ("Delete table row", >delete_row_undo_action, > - HTML_UNDO_DATA >(delete_cells_undo_new (row_cells, size, row)), > + HTML_UNDO_DATA >(delete_cells_undo_new (row_cells, size, row, self)), > html_cursor_get_position >(e->cursor), > position_before), dir); > } > > static void > -delete_table_row (HTMLEngine *e, HTMLUndoDirection dir) > +delete_table_row (HTMLEngine *e, HTMLUndoDirection dir, int del_row, gboolean self) > { > HTMLTable *t; > HTMLTableCell *cell; > HTMLTableCell **row_cells; > gint r, c, row; > guint position_before; > > - t = HTML_TABLE (html_object_nth_parent (e->cursor->object, 3)); > + t = html_engine_get_table_2 (e, self); > > /* this command is valid only in table and when this table has > 1 row */ > if (!t || !HTML_IS_TABLE (HTML_OBJECT (t)) || t->totalRows < 2) > return; > > html_engine_freeze (e); > > position_before = e->cursor->position; > - cell = HTML_TABLE_CELL (html_object_nth_parent (e->cursor->object, 2)); > - row = cell->row; > + if (!self) { > + cell = HTML_TABLE_CELL (html_object_nth_parent (e->cursor->object, 2)); > + row = cell->row; > + } else > + row = del_row; > row_cells = g_new0 (HTMLTableCell *, t->totalCols); > > - go_table_0 (e, HTML_OBJECT (t)); > + if (!self) > + go_table_0 (e, HTML_OBJECT (t)); > for (c = 0; c < t->totalCols; c ++) { > cell = t->cells [row][c]; > > /* remove & keep old one */ > @@ -524,11 +586,12 @@ > } > } > } > > - go_after_row (e, HTML_OBJECT (t), MIN (row, t->totalCols - 1)); > + if (!self) > + go_after_row (e, HTML_OBJECT (t), MIN (row, t->totalCols - 1)); > t->totalRows --; > - delete_row_setup_undo (e, row_cells, t->totalCols, position_before, row, dir); > + delete_row_setup_undo (e, row_cells, t->totalCols, position_before, row, dir, >self); > html_object_change_set (HTML_OBJECT (t), HTML_CHANGE_ALL_CALC); > html_engine_queue_draw (e, HTML_OBJECT (t)); > html_engine_thaw (e); > } > @@ -542,9 +605,15 @@ > > void > html_engine_delete_table_row (HTMLEngine *e) > { > - delete_table_row (e, HTML_UNDO_UNDO); > + delete_table_row (e, HTML_UNDO_UNDO, 0, FALSE); > +} > + > +void > +html_engine_delete_table_row_2 (HTMLEngine *e, int row) > +{ > + delete_table_row (e, HTML_UNDO_UNDO, row, TRUE); > } > > typedef enum { > HTML_TABLE_BORDER, > @@ -1056,18 +1125,32 @@ > * set number of columns in current table > */ > > void > -html_engine_table_set_cols (HTMLEngine *e, gint cols) > +html_engine_table_set_cols (HTMLEngine *e, gint cols, gboolean self) > { > - HTMLTable *table = html_engine_get_table (e); > + HTMLTable *table; > + > + table = html_engine_get_table_2 (e, self); > > if (!table) > return; > > if (table->totalCols == cols) > return; > > + /* Orignal code actually assume table is the parent, not self. */ > + if (self) { > + if (table->totalCols < cols) { > + while (table->totalCols < cols) > + html_engine_insert_table_column_2 (e, >table->totalCols-1, TRUE); > + } else { > + while (table->totalCols > cols) > + html_engine_delete_table_column_2 (e, >table->totalCols-1); > + } > + return; > + } > + > if (table->totalCols < cols) { > html_engine_table_goto_col (e, table->totalCols - 1); > while (table->totalCols < cols) > html_engine_insert_table_column (e, TRUE); > @@ -1075,30 +1158,39 @@ > html_engine_table_goto_col (e, table->totalCols - 1); > while (table->totalCols > cols) > html_engine_delete_table_column (e); > } > - > - /* > - FIXME: jump to some well defined position (like the same position as before > - or at beginning of 1st new column or to last position in remaining cells > - */ > } > > /* > * set number of rows in current table > */ > > void > -html_engine_table_set_rows (HTMLEngine *e, gint rows) > +html_engine_table_set_rows (HTMLEngine *e, gint rows, gboolean self) > { > - HTMLTable *table = html_engine_get_table (e); > + HTMLTable *table; > + > + table = html_engine_get_table_2 (e, self); > > if (!table) > return; > > if (table->totalRows == rows) > return; > > + /* Orignal code actually assume table is the parent, not self. */ > + if (self) { > + if (table->totalRows < rows) { > + while (table->totalRows < rows) > + html_engine_insert_table_row_2 (e, table->totalRows-1, > TRUE); > + } else { > + while (table->totalRows > rows) > + html_engine_delete_table_row_2 (e, table->totalRows - >1); > + } > + return; > + } > + > if (table->totalRows < rows) { > html_engine_table_goto_row (e, table->totalRows - 1); > while (table->totalRows < rows) > html_engine_insert_table_row (e, TRUE); > @@ -1106,12 +1198,8 @@ > html_engine_table_goto_row (e, table->totalRows - 1); > while (table->totalRows > rows) > html_engine_delete_table_row (e); > } > - > - /* > - FIXME: like set_cols > - */ > } > > void > html_engine_delete_table (HTMLEngine *e) > Index: src/htmlengine-edit-table.h > =================================================================== > RCS file: /cvs/gnome/gtkhtml/src/htmlengine-edit-table.h,v > retrieving revision 1.20 > diff -u -4 -r1.20 htmlengine-edit-table.h > --- src/htmlengine-edit-table.h 16 Oct 2001 21:19:04 -0000 1.20 > +++ src/htmlengine-edit-table.h 24 Dec 2002 07:26:55 -0000 > @@ -67,11 +67,13 @@ > HTMLTable *t, > gint width, > gboolean percent); > void html_engine_table_set_cols (HTMLEngine *e, > - gint cols); > + gint cols, > + gboolean self); > void html_engine_table_set_rows (HTMLEngine *e, > - gint rows); > + gint rows, > + gboolean self); > HTMLTable *html_engine_get_table (HTMLEngine *e); > gboolean html_engine_table_goto_0_0 (HTMLEngine *e); > gboolean html_engine_table_goto_col (HTMLEngine *e, > gint col); -- Radek Doulík <[EMAIL PROTECTED]> Ximian, Inc.
Index: components/html-editor/popup.c =================================================================== RCS file: /cvs/gnome/gtkhtml/components/html-editor/popup.c,v retrieving revision 1.62 diff -u -p -r1.62 popup.c --- components/html-editor/popup.c 2 Oct 2002 17:11:34 -0000 1.62 +++ components/html-editor/popup.c 2 Jan 2003 17:03:40 -0000 @@ -495,10 +495,6 @@ prepare_properties_and_menu (GtkHTMLCont ADD_ITEM (_("Paragraph..."), prop_dialog, PARAGRAPH); ADD_PROP (PARAGRAPH); break; - case HTML_TYPE_TABLE: - ADD_SEP; - ADD_PROP (TABLE); - ADD_ITEM (_("Table..."), prop_dialog, TABLE); default: } if (obj->parent && obj->parent->parent && HTML_IS_TABLE_CELL (obj->parent->parent)) { Index: src/htmlengine-edit-table.c =================================================================== RCS file: /cvs/gnome/gtkhtml/src/htmlengine-edit-table.c,v retrieving revision 1.56 diff -u -p -r1.56 htmlengine-edit-table.c --- src/htmlengine-edit-table.c 7 Oct 2002 10:02:23 -0000 1.56 +++ src/htmlengine-edit-table.c 2 Jan 2003 17:03:40 -0000 @@ -44,13 +44,10 @@ static void insert_table_row (HTMLEng HTMLTable * html_engine_get_table (HTMLEngine *e) { - if (HTML_IS_TABLE (e->cursor->object)) - return HTML_TABLE (e->cursor->object); - else if (!e->cursor->object->parent - || !e->cursor->object->parent->parent - || !e->cursor->object->parent->parent->parent) - return NULL; - else if (!HTML_IS_TABLE (e->cursor->object->parent->parent->parent)) + if (!e->cursor->object->parent + || !e->cursor->object->parent->parent + || !e->cursor->object->parent->parent->parent + || !HTML_IS_TABLE (e->cursor->object->parent->parent->parent)) return NULL; else return HTML_TABLE (e->cursor->object->parent->parent->parent);