added set_value() class method, which sets the model value based on the

2001-10-22  Damon Chaplin  <damon@ximian.com>

	* e-cell-text.[hc]: added set_value() class method, which sets the
	model value based on the text. In ECellText itself it assumes the model
	value is a char* and passes the text directly. Subclasses may parse
	the text into some other datatype.
	Also made the calls the e_cell_text_get_text(), e_cell_text_free_text()
	and e_cell_text_set_value() public, since we need them in ECellCombo.

	* e-cell-combo.c (e_cell_combo_select_matching_item):
	(e_cell_combo_update_cell): use e_cell_text_get_text()/free_text()/
	set_value() so it can handle subclasses of ECellText as the child.

svn path=/trunk/; revision=13901
This commit is contained in:
Damon Chaplin
2001-10-22 22:33:20 +00:00
committed by Damon Chaplin
parent 798623d52b
commit b89da79e8c
4 changed files with 65 additions and 37 deletions

View File

@ -59,6 +59,7 @@
#include "gal/util/e-util.h"
#include "e-table-item.h"
#include "e-cell-combo.h"
#include "e-cell-text.h"
/* The height to make the popup list if there aren't any items in it. */
@ -257,6 +258,7 @@ e_cell_combo_select_matching_item (ECellCombo *ecc)
{
ECellPopup *ecp = E_CELL_POPUP (ecc);
ECellView *ecv = (ECellView*) ecp->popup_cell_view;
ECellText *ecell_text = E_CELL_TEXT (ecp->child);
ETableItem *eti = E_TABLE_ITEM (ecp->popup_cell_view->cell_view.e_table_item_view);
ETableCol *ecol;
GtkList *list;
@ -266,8 +268,8 @@ e_cell_combo_select_matching_item (ECellCombo *ecc)
char *cell_text, *list_item_text;
ecol = e_table_header_get_column (eti->header, ecp->popup_view_col);
cell_text = e_table_model_value_at (ecv->e_table_model,
ecol->col_idx, ecp->popup_row);
cell_text = e_cell_text_get_text (ecell_text, ecv->e_table_model,
ecol->col_idx, ecp->popup_row);
list = GTK_LIST (ecc->popup_list);
elem = list->children;
@ -291,6 +293,8 @@ e_cell_combo_select_matching_item (ECellCombo *ecc)
if (list->children)
gtk_widget_grab_focus (GTK_WIDGET (list->children->data));
}
e_cell_text_free_text (ecell_text, cell_text);
}
@ -299,8 +303,6 @@ e_cell_combo_show_popup (ECellCombo *ecc)
{
gint x, y, width, height, old_width, old_height;
g_print ("In e_cell_popup_popup_list\n");
/* This code is practically copied from GtkCombo. */
old_width = ecc->popup_window->allocation.width;
old_height = ecc->popup_window->allocation.height;
@ -470,8 +472,6 @@ e_cell_combo_button_press (GtkWidget *popup_window,
{
GtkWidget *event_widget;
g_print ("In e_cell_combo_button_press\n");
event_widget = gtk_get_event_widget (event);
/* If the button press was for a widget inside the popup list, but
@ -516,9 +516,6 @@ e_cell_combo_button_release (GtkWidget *popup_window,
event_widget = gtk_get_event_widget ((GdkEvent*) event);
g_print ("In e_cell_popup_button_release event_widget:%s\n",
gtk_widget_get_name (event_widget));
/* See if the button was released in the list (or its children). */
while (event_widget && event_widget != ecc->popup_list)
event_widget = event_widget->parent;
@ -549,8 +546,6 @@ e_cell_combo_key_press (GtkWidget *popup_window,
GdkEventKey *event,
ECellCombo *ecc)
{
g_print ("In e_cell_popup_key_press\n");
/* If the Escape key is pressed we hide the popup. */
if (event->keyval != GDK_Escape
&& event->keyval != GDK_Return
@ -579,14 +574,13 @@ e_cell_combo_update_cell (ECellCombo *ecc)
{
ECellPopup *ecp = E_CELL_POPUP (ecc);
ECellView *ecv = (ECellView*) ecp->popup_cell_view;
ECellText *ecell_text = E_CELL_TEXT (ecp->child);
ETableItem *eti = E_TABLE_ITEM (ecv->e_table_item_view);
ETableCol *ecol;
GtkList *list = GTK_LIST (ecc->popup_list);
GtkListItem *listitem;
gchar *text, *old_text;
g_print ("In e_cell_popup_update_cell\n");
/* Return if no item is selected. */
if (list->selection == NULL)
return;
@ -597,19 +591,17 @@ e_cell_combo_update_cell (ECellCombo *ecc)
/* Compare it with the existing cell contents. */
ecol = e_table_header_get_column (eti->header, ecp->popup_view_col);
old_text = e_table_model_value_at (ecv->e_table_model,
ecol->col_idx, ecp->popup_row);
g_print (" Old text: %s New text: %s\n", old_text, text);
old_text = e_cell_text_get_text (ecell_text, ecv->e_table_model,
ecol->col_idx, ecp->popup_row);
/* If they are different, update the cell contents. */
if (strcmp (old_text, text)) {
g_print (" Setting cell text...\n");
e_table_model_set_value_at (ecv->e_table_model,
ecol->col_idx, ecp->popup_row,
text);
g_print (" Set cell text.\n");
if (old_text && strcmp (old_text, text)) {
e_cell_text_set_value (ecell_text, ecv->e_table_model,
ecol->col_idx, ecp->popup_row, text);
}
e_cell_text_free_text (ecell_text, old_text);
}

View File

@ -25,7 +25,8 @@
/*
* ECellCombo - a subclass of ECellPopup used to support popup lists like a
* GtkCombo widget. It only supports a basic popup list of strings at present,
* with no auto-completion.
* with no auto-completion. The child ECell of the ECellPopup must be an
* ECellText or subclass.
*/
#ifndef _E_CELL_COMBO_H_
@ -56,6 +57,7 @@ typedef struct {
GtkType e_cell_combo_get_type (void);
ECell *e_cell_combo_new (void);
/* These must be UTF-8. */
void e_cell_combo_set_popdown_strings (ECellCombo *ecc,
GList *strings);

View File

@ -211,8 +211,8 @@ static GdkColor* e_cell_text_get_color (ECellTextView *cell_view, gchar *color_s
static ECellClass *parent_class;
static char *
ect_get_text (ECellText *cell, ETableModel *model, int col, int row)
char *
e_cell_text_get_text (ECellText *cell, ETableModel *model, int col, int row)
{
if (ECT_CLASS(cell)->get_text)
return ECT_CLASS(cell)->get_text (cell, model, col, row);
@ -220,13 +220,21 @@ ect_get_text (ECellText *cell, ETableModel *model, int col, int row)
return NULL;
}
static void
ect_free_text (ECellText *cell, char *text)
void
e_cell_text_free_text (ECellText *cell, char *text)
{
if (ECT_CLASS(cell)->free_text)
ECT_CLASS(cell)->free_text (cell, text);
}
void
e_cell_text_set_value (ECellText *cell, ETableModel *model, int col, int row,
const char *text)
{
if (ECT_CLASS(cell)->set_value)
ECT_CLASS(cell)->set_value (cell, model, col, row, text);
}
static char *
ect_real_get_text (ECellText *cell, ETableModel *model, int col, int row)
{
@ -238,6 +246,17 @@ ect_real_free_text (ECellText *cell, char *text)
{
}
/* This is the default method for setting the ETableModel value based on
the text in the ECellText. This simply uses the text as it is - it assumes
the value in the model is a char*. Subclasses may parse the text into
data structures to pass to the model. */
static void
ect_real_set_value (ECellText *cell, ETableModel *model, int col, int row,
const char *text)
{
e_table_model_set_value_at (model, col, row, text);
}
static void
ect_queue_redraw (ECellTextView *text_view, int view_col, int view_row)
{
@ -253,10 +272,12 @@ static void
ect_accept_edits (ECellTextView *text_view)
{
CurrentCell *cell = (CurrentCell *) text_view->edit;
ECellView *ecell_view = (ECellView *) text_view;
ECellText *ect = (ECellText *) ecell_view->ecell;
if (strcmp (text_view->edit->old_text, cell->text)) {
e_table_model_set_value_at (text_view->cell_view.e_table_model,
cell->model_col, cell->row, cell->text);
e_cell_text_set_value (ect, ecell_view->e_table_model,
cell->model_col, cell->row, cell->text);
}
}
@ -951,9 +972,9 @@ ect_height (ECellView *ecell_view, int model_col, int view_col, int row)
if (row == -1) {
value = e_font_height (font) + TEXT_PAD;
} else {
string = ect_get_text(ect, ecell_view->e_table_model, model_col, row);
string = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row);
value = e_font_height (font) * number_of_lines(string) + TEXT_PAD;
ect_free_text(ect, string);
e_cell_text_free_text(ect, string);
}
return value;
@ -1010,9 +1031,9 @@ ect_enter_edit (ECellView *ecell_view, int model_col, int view_col, int row)
edit->pointer_in = FALSE;
edit->default_cursor_shown = TRUE;
temp = ect_get_text(ect, ecell_view->e_table_model, model_col, row);
temp = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row);
edit->old_text = g_strdup (temp);
ect_free_text(ect, temp);
e_cell_text_free_text(ect, temp);
edit->cell.text = g_strdup (edit->old_text);
#if 0
@ -1059,7 +1080,7 @@ ect_print (ECellView *ecell_view, GnomePrintContext *context,
GnomeFont *font = gnome_font_new ("Helvetica", 12);
char *string;
ECellText *ect = E_CELL_TEXT(ecell_view->ecell);
string = ect_get_text(ect, ecell_view->e_table_model, model_col, row);
string = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row);
gnome_print_gsave(context);
if (gnome_print_moveto(context, 2, 2) == -1)
/* FIXME */;
@ -1077,7 +1098,7 @@ ect_print (ECellView *ecell_view, GnomePrintContext *context,
gnome_print_setfont(context, font);
gnome_print_show(context, string);
gnome_print_grestore(context);
ect_free_text(ect, string);
e_cell_text_free_text(ect, string);
}
static gdouble
@ -1421,6 +1442,7 @@ e_cell_text_class_init (GtkObjectClass *object_class)
ectc->get_text = ect_real_get_text;
ectc->free_text = ect_real_free_text;
ectc->set_value = ect_real_set_value;
object_class->get_arg = ect_get_arg;
object_class->set_arg = ect_set_arg;
@ -2415,9 +2437,9 @@ build_current_cell (CurrentCell *cell, ECellTextView *text_view, int model_col,
cell->row = row;
cell->breaks = NULL;
temp = ect_get_text(ect, ecell_view->e_table_model, model_col, row);
temp = e_cell_text_get_text(ect, ecell_view->e_table_model, model_col, row);
cell->text = g_strdup(temp);
ect_free_text(ect, temp);
e_cell_text_free_text(ect, temp);
cell->width = e_table_header_get_column (
((ETableItem *)ecell_view->e_table_item_view)->header,

View File

@ -69,12 +69,24 @@ typedef struct {
char *(*get_text) (ECellText *cell, ETableModel *model, int col, int row);
void (*free_text) (ECellText *cell, char *text);
void (*set_value) (ECellText *cell, ETableModel *model, int col, int row, const char *text);
} ECellTextClass;
GtkType e_cell_text_get_type (void);
ECell *e_cell_text_new (const char *fontname, GtkJustification justify);
ECell *e_cell_text_construct(ECellText *cell, const char *fontname, GtkJustification justify);
/* Gets the value from the model and converts it into a string. In ECellText
itself, the value is assumed to be a char* and so needs no conversion.
In subclasses the ETableModel value may be a more complicated datatype. */
char *e_cell_text_get_text (ECellText *cell, ETableModel *model, int col, int row);
/* Frees the value returned by e_cell_text_get_text(). */
void e_cell_text_free_text (ECellText *cell, char *text);
/* Sets the ETableModel value, based on the given string. */
void e_cell_text_set_value (ECellText *cell, ETableModel *model, int col, int row, const char *text);
END_GNOME_DECLS
#endif /* _E_CELL_TEXT_H_ */