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:

committed by
Damon Chaplin

parent
798623d52b
commit
b89da79e8c
@ -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,7 +268,7 @@ 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,
|
||||
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);
|
||||
@ -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,
|
||||
|
||||
old_text = e_cell_text_get_text (ecell_text, ecv->e_table_model,
|
||||
ecol->col_idx, ecp->popup_row);
|
||||
|
||||
g_print (" Old text: %s New text: %s\n", old_text, text);
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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,9 +272,11 @@ 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,
|
||||
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,
|
||||
|
@ -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_ */
|
||||
|
Reference in New Issue
Block a user