aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/misc')
-rw-r--r--widgets/misc/ChangeLog9
-rw-r--r--widgets/misc/e-calendar-item.c75
-rw-r--r--widgets/misc/e-dateedit.c158
-rw-r--r--widgets/misc/e-dateedit.h14
4 files changed, 211 insertions, 45 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog
index d86cfd08eb..422ca071aa 100644
--- a/widgets/misc/ChangeLog
+++ b/widgets/misc/ChangeLog
@@ -1,3 +1,12 @@
+2000-10-11 Damon Chaplin <damon@helixcode.com>
+
+ * e-calendar-item.c (e_calendar_item_recalc_sizes): fixed to
+ recalculate min_cell_width/height in case the show_week_numbers option
+ is changed.
+
+ * e-dateedit.c: added support for hiding the date field, and added
+ get/set_time_of_day() functions to get/set just the time.
+
2000-09-30 Damon Chaplin <damon@helixcode.com>
* e-calendar-item.c:
diff --git a/widgets/misc/e-calendar-item.c b/widgets/misc/e-calendar-item.c
index e84f24329d..de93fd988a 100644
--- a/widgets/misc/e-calendar-item.c
+++ b/widgets/misc/e-calendar-item.c
@@ -1502,53 +1502,52 @@ e_calendar_item_recalc_sizes (ECalendarItem *calitem)
g_return_if_fail (wkfont != NULL);
/* If both fonts are the same, just return. */
- if (font == calitem->old_font
- && wkfont == calitem->old_week_number_font)
- return;
-
- if (calitem->old_font)
- gdk_font_unref (calitem->old_font);
- calitem->old_font = font;
- gdk_font_ref (font);
-
- if (calitem->old_week_number_font)
- gdk_font_unref (calitem->old_week_number_font);
- calitem->old_week_number_font = wkfont;
- gdk_font_ref (wkfont);
-
- for (day = 0; day < 7; day++)
- calitem->day_widths[day] = gdk_char_width (font,
- calitem->days[day]);
-
- max_digit_width = 0;
- max_week_number_digit_width = 0;
- for (digit = 0; digit < 10; digit++) {
- width = gdk_char_width (font, digits[digit]);
- calitem->digit_widths[digit] = width;
- max_digit_width = MAX (max_digit_width, width);
-
- if (wkfont) {
- width = gdk_char_width (wkfont, digits[digit]);
- calitem->week_number_digit_widths[digit] = width;
- max_week_number_digit_width = MAX (max_week_number_digit_width, width);
- } else {
- calitem->week_number_digit_widths[digit] = width;
- max_week_number_digit_width = max_digit_width;
+ if (font != calitem->old_font
+ || wkfont != calitem->old_week_number_font) {
+ if (calitem->old_font)
+ gdk_font_unref (calitem->old_font);
+ calitem->old_font = font;
+ gdk_font_ref (font);
+
+ if (calitem->old_week_number_font)
+ gdk_font_unref (calitem->old_week_number_font);
+ calitem->old_week_number_font = wkfont;
+ gdk_font_ref (wkfont);
+
+ for (day = 0; day < 7; day++)
+ calitem->day_widths[day] = gdk_char_width (font, calitem->days[day]);
+
+ max_digit_width = 0;
+ max_week_number_digit_width = 0;
+ for (digit = 0; digit < 10; digit++) {
+ width = gdk_char_width (font, digits[digit]);
+ calitem->digit_widths[digit] = width;
+ max_digit_width = MAX (max_digit_width, width);
+
+ if (wkfont) {
+ width = gdk_char_width (wkfont, digits[digit]);
+ calitem->week_number_digit_widths[digit] = width;
+ max_week_number_digit_width = MAX (max_week_number_digit_width, width);
+ } else {
+ calitem->week_number_digit_widths[digit] = width;
+ max_week_number_digit_width = max_digit_width;
+ }
}
+ calitem->max_digit_width = max_digit_width;
+ calitem->max_week_number_digit_width = max_week_number_digit_width;
}
- calitem->max_digit_width = max_digit_width;
- calitem->max_week_number_digit_width = max_week_number_digit_width;
-
- min_cell_width = max_digit_width * 2 + E_CALENDAR_ITEM_MIN_CELL_XPAD;
+ min_cell_width = calitem->max_digit_width * 2
+ + E_CALENDAR_ITEM_MIN_CELL_XPAD;
min_cell_height = char_height + E_CALENDAR_ITEM_MIN_CELL_YPAD;
calitem->min_month_width = E_CALENDAR_ITEM_XPAD_BEFORE_WEEK_NUMBERS
+ E_CALENDAR_ITEM_XPAD_BEFORE_CELLS + min_cell_width * 7
+ E_CALENDAR_ITEM_XPAD_AFTER_CELLS;
- if (calitem->show_week_numbers)
- calitem->min_month_width += max_week_number_digit_width * 2
+ if (calitem->show_week_numbers) {
+ calitem->min_month_width += calitem->max_week_number_digit_width * 2
+ E_CALENDAR_ITEM_XPAD_AFTER_WEEK_NUMBERS + 1;
+ }
calitem->min_month_height = style->klass->ythickness * 2
+ E_CALENDAR_ITEM_YPAD_ABOVE_MONTH_NAME + char_height
diff --git a/widgets/misc/e-dateedit.c b/widgets/misc/e-dateedit.c
index 1c4617491e..ac6e504366 100644
--- a/widgets/misc/e-dateedit.c
+++ b/widgets/misc/e-dateedit.c
@@ -67,6 +67,7 @@ struct _EDateEditPrivate {
GtkWidget *today_button;
GtkWidget *none_button;
+ gboolean show_date;
gboolean show_time;
gboolean use_24_hour_format;
@@ -197,6 +198,7 @@ e_date_edit_init (EDateEdit *dedit)
dedit->_priv = priv = g_new0 (EDateEditPrivate, 1);
+ priv->show_date = TRUE;
priv->show_time = TRUE;
priv->use_24_hour_format = TRUE;
@@ -240,7 +242,6 @@ create_children (EDateEdit *dedit)
priv->date_entry = gtk_entry_new ();
gtk_widget_set_usize (priv->date_entry, 90, 0);
gtk_box_pack_start (GTK_BOX (dedit), priv->date_entry, FALSE, TRUE, 0);
- gtk_widget_show (priv->date_entry);
priv->date_button = gtk_button_new ();
gtk_signal_connect (GTK_OBJECT (priv->date_button), "clicked",
@@ -252,7 +253,10 @@ create_children (EDateEdit *dedit)
gtk_container_add (GTK_CONTAINER (priv->date_button), arrow);
gtk_widget_show (arrow);
- gtk_widget_show (priv->date_button);
+ if (priv->show_date) {
+ gtk_widget_show (priv->date_entry);
+ gtk_widget_show (priv->date_button);
+ }
/* This is just to create a space between the date & time parts. */
priv->space = gtk_drawing_area_new ();
@@ -264,10 +268,11 @@ create_children (EDateEdit *dedit)
gtk_box_pack_start (GTK_BOX (dedit), priv->time_combo, FALSE, TRUE, 0);
rebuild_time_popup (dedit);
- if (priv->show_time) {
- gtk_widget_show (priv->space);
+ if (priv->show_time)
gtk_widget_show (priv->time_combo);
- }
+
+ if (priv->show_date && priv->show_time)
+ gtk_widget_show (priv->space);
priv->cal_popup = gtk_window_new (GTK_WINDOW_POPUP);
gtk_widget_set_events (priv->cal_popup,
@@ -735,6 +740,142 @@ e_date_edit_set_time (EDateEdit *dedit, time_t the_time)
/**
+ * e_date_edit_get_time_of_day:
+ * @dedit: an #EDateEdit widget.
+ * @hour: returns the hour set.
+ * @minute: returns the minute set.
+ * @Returns: TRUE if the time could be parsed.
+ *
+ * Description: Returns the current time in the time field.
+ */
+gboolean
+e_date_edit_get_time_of_day (EDateEdit *dedit,
+ gint *hour,
+ gint *minute)
+{
+ EDateEditPrivate *priv;
+ struct tm time_tm = { 0 };
+ char *time_text, *format;
+
+ g_return_val_if_fail (E_IS_DATE_EDIT (dedit), FALSE);
+
+ priv = dedit->_priv;
+
+ time_text = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (priv->time_combo)->entry));
+
+ if (priv->use_24_hour_format)
+ /* This is a strptime() format. %H = hour (0-23), %M = minute. */
+ format = _("%H:%M");
+ else
+ /* This is a strptime() format. %I = hour (1-12), %M = minute, %p = am/pm string. */
+ format = _("%I:%M %p");
+
+ if (!strptime (time_text, format, &time_tm))
+ return FALSE;
+
+ *hour = time_tm.tm_hour;
+ *minute = time_tm.tm_min;
+
+ return TRUE;
+}
+
+
+/**
+ * e_date_edit_set_time_of_day:
+ * @dedit: an #EDateEdit widget.
+ * @hour: the hour to set.
+ * @minute: the minute to set.
+ *
+ * Description: Sets the time in the time field.
+ */
+void
+e_date_edit_set_time_of_day (EDateEdit *dedit,
+ gint hour,
+ gint minute)
+{
+ EDateEditPrivate *priv;
+ struct tm mytm = { 0 };
+ char buffer[40], *format;
+
+ g_return_if_fail (E_IS_DATE_EDIT (dedit));
+
+ priv = dedit->_priv;
+
+ mytm.tm_year = 2000;
+ mytm.tm_mon = 0;
+ mytm.tm_mday = 1;
+ mytm.tm_hour = hour;
+ mytm.tm_min = minute;
+ mytm.tm_sec = 0;
+
+ if (priv->use_24_hour_format)
+ /* This is a strftime() format. %H = hour (0-23), %M = minute. */
+ format = _("%H:%M");
+ else
+ /* This is a strftime() format. %I = hour (1-12), %M = minute, %p = am/pm string. */
+ format = _("%I:%M %p");
+
+ strftime (buffer, sizeof (buffer), format, &mytm);
+ gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (priv->time_combo)->entry),
+ buffer);
+}
+
+
+/**
+ * e_date_edit_get_show_date:
+ * @dedit: an #EDateEdit widget.
+ * @Returns: Whether the date field is shown.
+ *
+ * Description: Returns TRUE if the date field is currently shown.
+ */
+gboolean
+e_date_edit_get_show_date (EDateEdit *dedit)
+{
+ g_return_val_if_fail (E_IS_DATE_EDIT (dedit), TRUE);
+
+ return dedit->_priv->show_date;
+}
+
+
+/**
+ * e_date_edit_set_show_date:
+ * @dedit: an #EDateEdit widget.
+ * @show_time: TRUE if the date field should be shown.
+ *
+ * Description: Specifies whether the date field should be shown. The date
+ * field would be hidden if only a time needed to be entered.
+ */
+void
+e_date_edit_set_show_date (EDateEdit *dedit,
+ gboolean show_date)
+{
+ EDateEditPrivate *priv;
+
+ g_return_if_fail (E_IS_DATE_EDIT (dedit));
+
+ priv = dedit->_priv;
+
+ if (priv->show_date == show_date)
+ return;
+
+ priv->show_date = show_date;
+
+ if (show_date) {
+ gtk_widget_show (priv->date_entry);
+ gtk_widget_show (priv->date_button);
+ } else {
+ gtk_widget_hide (priv->date_entry);
+ gtk_widget_hide (priv->date_button);
+ }
+
+ if (priv->show_date && priv->show_time)
+ gtk_widget_show (priv->space);
+ else
+ gtk_widget_hide (priv->space);
+}
+
+
+/**
* e_date_edit_get_show_time:
* @dedit: an #EDateEdit widget
* @Returns: Whether the time field is shown.
@@ -774,13 +915,16 @@ e_date_edit_set_show_time (EDateEdit *dedit,
priv->show_time = show_time;
if (show_time) {
- gtk_widget_show (priv->space);
gtk_widget_show (priv->time_combo);
} else {
- gtk_widget_hide (priv->space);
gtk_widget_hide (priv->time_combo);
gtk_widget_hide (priv->now_button);
}
+
+ if (priv->show_date && priv->show_time)
+ gtk_widget_show (priv->space);
+ else
+ gtk_widget_hide (priv->space);
}
diff --git a/widgets/misc/e-dateedit.h b/widgets/misc/e-dateedit.h
index a2783c1814..b616e7b581 100644
--- a/widgets/misc/e-dateedit.h
+++ b/widgets/misc/e-dateedit.h
@@ -71,6 +71,20 @@ time_t e_date_edit_get_time (EDateEdit *dedit);
void e_date_edit_set_time (EDateEdit *dedit,
time_t the_time);
+/* These get or set the value in the time field, useful if only a time is
+ being edited. */
+gboolean e_date_edit_get_time_of_day (EDateEdit *dedit,
+ gint *hour,
+ gint *minute);
+void e_date_edit_set_time_of_day (EDateEdit *dedit,
+ gint hour,
+ gint minute);
+
+/* Whether we show the date field. */
+gboolean e_date_edit_get_show_date (EDateEdit *dedit);
+void e_date_edit_set_show_date (EDateEdit *dedit,
+ gboolean show_date);
+
/* Whether we show the time field. */
gboolean e_date_edit_get_show_time (EDateEdit *dedit);
void e_date_edit_set_show_time (EDateEdit *dedit,