aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'widgets')
-rw-r--r--widgets/misc/ChangeLog9
-rw-r--r--widgets/misc/Makefile.am2
-rw-r--r--widgets/misc/e-cell-date-edit.c21
-rw-r--r--widgets/misc/e-cell-percent.c159
-rw-r--r--widgets/misc/e-cell-percent.h56
5 files changed, 240 insertions, 7 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog
index 32daa5b163..3766e0e45f 100644
--- a/widgets/misc/ChangeLog
+++ b/widgets/misc/ChangeLog
@@ -1,3 +1,12 @@
+2001-10-22 Damon Chaplin <damon@ximian.com>
+
+ * e-cell-date-edit.c (e_cell_date_edit_set_popup_values):
+ (e_cell_date_edit_update_cell): use the new ECellText methods to get
+ the text and set the value.
+
+ * e-cell-percent.c: new subclass of ECellText to display & edit a
+ percentage value.
+
2001-10-20 Jon Trowbridge <trow@ximian.com>
* e-dateedit.c (e_date_edit_check_date_changed): Keep us from
diff --git a/widgets/misc/Makefile.am b/widgets/misc/Makefile.am
index dc8b47bdc7..69af225a13 100644
--- a/widgets/misc/Makefile.am
+++ b/widgets/misc/Makefile.am
@@ -22,6 +22,8 @@ libemiscwidgets_a_SOURCES = \
e-calendar-item.h \
e-cell-date-edit.c \
e-cell-date-edit.h \
+ e-cell-percent.c \
+ e-cell-percent.h \
e-charset-picker.c \
e-charset-picker.h \
e-clipped-label.c \
diff --git a/widgets/misc/e-cell-date-edit.c b/widgets/misc/e-cell-date-edit.c
index 2554b70ff1..6e2daf5326 100644
--- a/widgets/misc/e-cell-date-edit.c
+++ b/widgets/misc/e-cell-date-edit.c
@@ -37,6 +37,7 @@
#include <gdk/gdkkeysyms.h>
#include <gal/util/e-util.h>
#include <gal/e-table/e-table-item.h>
+#include <gal/e-table/e-cell-text.h>
#include <libgnomeui/gnome-messagebox.h>
#include <libgnomeui/gnome-stock.h>
#include <libgnome/gnome-i18n.h>
@@ -437,6 +438,7 @@ static void
e_cell_date_edit_set_popup_values (ECellDateEdit *ecde)
{
ECellPopup *ecp = E_CELL_POPUP (ecde);
+ ECellText *ecell_text = E_CELL_TEXT (ecp->child);
ECellView *ecv = (ECellView*) ecp->popup_cell_view;
ETableItem *eti = E_TABLE_ITEM (ecp->popup_cell_view->cell_view.e_table_item_view);
ETableCol *ecol;
@@ -448,8 +450,8 @@ e_cell_date_edit_set_popup_values (ECellDateEdit *ecde)
char buffer[64];
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);
status = e_time_parse_date_and_time (cell_text, &date_tm);
@@ -472,6 +474,8 @@ e_cell_date_edit_set_popup_values (ECellDateEdit *ecde)
e_cell_date_edit_select_matching_time (ecde, buffer);
}
+
+ e_cell_text_free_text (ecell_text, cell_text);
}
@@ -822,6 +826,7 @@ e_cell_date_edit_update_cell (ECellDateEdit *ecde,
char *text)
{
ECellPopup *ecp = E_CELL_POPUP (ecde);
+ ECellText *ecell_text = E_CELL_TEXT (ecp->child);
ECellView *ecv = (ECellView*) ecp->popup_cell_view;
ETableItem *eti = E_TABLE_ITEM (ecv->e_table_item_view);
ETableCol *ecol;
@@ -829,15 +834,17 @@ e_cell_date_edit_update_cell (ECellDateEdit *ecde,
/* Compare the new text 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);
+
+ 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)) {
- e_table_model_set_value_at (ecv->e_table_model,
- ecol->col_idx, ecp->popup_row,
- 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);
}
diff --git a/widgets/misc/e-cell-percent.c b/widgets/misc/e-cell-percent.c
new file mode 100644
index 0000000000..e1e14212e6
--- /dev/null
+++ b/widgets/misc/e-cell-percent.c
@@ -0,0 +1,159 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * Author :
+ * Damon Chaplin <damon@ximian.com>
+ *
+ * Copyright 2001, Ximian, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/*
+ * ECellPercent - a subclass of ECellText used to show an integer percentage
+ * in an ETable.
+ */
+
+#include <config.h>
+
+#include <ctype.h>
+
+#include <sys/time.h>
+#include <unistd.h>
+#include <gal/util/e-util.h>
+#include <libgnomeui/gnome-messagebox.h>
+#include <libgnomeui/gnome-stock.h>
+#include <libgnome/gnome-i18n.h>
+
+#include "e-cell-percent.h"
+
+#define PARENT_TYPE e_cell_text_get_type ()
+
+static ECellTextClass *parent_class;
+
+
+static char *
+ecp_get_text (ECellText *cell, ETableModel *model, int col, int row)
+{
+ int percent;
+ static char buffer[8];
+
+ percent = GPOINTER_TO_INT (e_table_model_value_at (model, col, row));
+
+ /* A -ve value means the property is not set. */
+ if (percent < 0) {
+ buffer[0] = '\0';
+ } else {
+ g_snprintf (buffer, sizeof (buffer), "%i%%", percent);
+ }
+
+ return buffer;
+}
+
+static void
+ecp_free_text(ECellText *cell, char *text)
+{
+ /* Do Nothing. */
+}
+
+/* FIXME: We need to set the "transient_for" property for the dialog. */
+static void
+show_percent_warning (void)
+{
+ GtkWidget *dialog;
+
+ dialog = gnome_message_box_new (_("The percent value must be between 0 and 100, inclusive"),
+ GNOME_MESSAGE_BOX_ERROR,
+ GNOME_STOCK_BUTTON_OK, NULL);
+ gtk_widget_show (dialog);
+}
+
+static void
+ecp_set_value (ECellText *cell, ETableModel *model, int col, int row,
+ const char *text)
+{
+ int matched, percent;
+ gboolean empty = TRUE;
+ const char *p;
+
+ if (text) {
+ p = text;
+ while (*p) {
+ if (!isspace ((unsigned char) *p)) {
+ empty = FALSE;
+ break;
+ }
+ p++;
+ }
+ }
+
+ if (empty) {
+ percent = -1;
+ } else {
+ matched = sscanf (text, "%i", &percent);
+
+ if (matched != 1 || percent < 0 || percent > 100) {
+ show_percent_warning ();
+ return;
+ }
+ }
+
+ e_table_model_set_value_at (model, col, row,
+ GINT_TO_POINTER (percent));
+}
+
+static void
+e_cell_percent_class_init (GtkObjectClass *object_class)
+{
+ ECellTextClass *ectc = (ECellTextClass *) object_class;
+
+ parent_class = gtk_type_class (PARENT_TYPE);
+
+ ectc->get_text = ecp_get_text;
+ ectc->free_text = ecp_free_text;
+ ectc->set_value = ecp_set_value;
+}
+
+static void
+e_cell_percent_init (GtkObject *object)
+{
+}
+
+/**
+ * e_cell_percent_new:
+ * @fontname: font to be used to render on the screen
+ * @justify: Justification of the string in the cell.
+ *
+ * Creates a new ECell renderer that can be used to render an integer
+ * percentage that comes from the model. The value returned from the model is
+ * interpreted as being an int.
+ *
+ * See ECellText for other features.
+ *
+ * Returns: an ECell object that can be used to render numbers.
+ */
+ECell *
+e_cell_percent_new (const char *fontname, GtkJustification justify)
+{
+ ECellPercent *ecn = gtk_type_new (e_cell_percent_get_type ());
+
+ e_cell_text_construct (E_CELL_TEXT(ecn), fontname, justify);
+
+ return (ECell *) ecn;
+}
+
+E_MAKE_TYPE (e_cell_percent, "ECellPercent", ECellPercent,
+ e_cell_percent_class_init, e_cell_percent_init, PARENT_TYPE);
diff --git a/widgets/misc/e-cell-percent.h b/widgets/misc/e-cell-percent.h
new file mode 100644
index 0000000000..cb8f96baf3
--- /dev/null
+++ b/widgets/misc/e-cell-percent.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+/*
+ * Author :
+ * Damon Chaplin <damon@ximian.com>
+ *
+ * Copyright 2001, Ximian, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+/*
+ * ECellPercent - a subclass of ECellText used to show an integer percentage
+ * in an ETable.
+ */
+
+#ifndef _E_CELL_PERCENT_H_
+#define _E_CELL_PERCENT_H_
+
+#include <gal/e-table/e-cell-text.h>
+
+BEGIN_GNOME_DECLS
+
+#define E_CELL_PERCENT_TYPE (e_cell_percent_get_type ())
+#define E_CELL_PERCENT(o) (GTK_CHECK_CAST ((o), E_CELL_PERCENT_TYPE, ECellPercent))
+#define E_CELL_PERCENT_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CELL_PERCENT_TYPE, ECellPercentClass))
+#define E_IS_CELL_NUMBER(o) (GTK_CHECK_TYPE ((o), E_CELL_PERCENT_TYPE))
+#define E_IS_CELL_NUMBER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CELL_PERCENT_TYPE))
+
+typedef struct {
+ ECellText base;
+} ECellPercent;
+
+typedef struct {
+ ECellTextClass parent_class;
+} ECellPercentClass;
+
+GtkType e_cell_percent_get_type (void);
+ECell *e_cell_percent_new (const char *fontname, GtkJustification justify);
+
+END_GNOME_DECLS
+
+#endif /* _E_CELL_PERCENT_H_ */