hildon_time_editor_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
-static gboolean
-hildon_time_editor_entry_keypress (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data);
+static gboolean
+hildon_time_editor_focus (GtkWidget *widget,
+ GtkDirectionType direction);
+
+static gboolean
+hildon_time_editor_entry_keypress (GtkEntry *entry,
+ GdkEventKey* event,
+ gpointer user_data);
static gboolean
hildon_time_editor_check_locale (HildonTimeEditor *editor);
+#ifdef MAEMO_GTK
static void
hildon_time_editor_tap_and_hold_setup (GtkWidget *widget,
GtkWidget *menu,
GtkCallback func,
GtkWidgetTapAndHoldFlags flags);
+#endif
+
static void
hildon_time_editor_validate (HildonTimeEditor *editor,
gboolean allow_intermediate);
object_class->set_property = hildon_time_editor_set_property;
widget_class->size_request = hildon_time_editor_size_request;
widget_class->size_allocate = hildon_time_editor_size_allocate;
- widget_class->tap_and_hold_setup = hildon_time_editor_tap_and_hold_setup;
- widget_class->focus = hildon_private_composite_focus;
+ widget_class->focus = hildon_time_editor_focus;
container_class->forall = hildon_time_editor_forall;
GTK_OBJECT_CLASS (editor_class)->destroy = hildon_time_editor_destroy;
G_PARAM_READABLE | G_PARAM_WRITABLE) );
}
+#ifdef MAEMO_GTK
static void
hildon_time_editor_tap_and_hold_setup (GtkWidget *widget,
GtkWidget *menu,
gtk_widget_tap_and_hold_setup (priv->iconbutton, menu, func,
GTK_TAP_AND_HOLD_NONE);
}
+#endif
static void
hildon_time_editor_entry_changed (GtkWidget *widget,
/* No frames for entries, so that they all appear to be inside one long entry */
gtk_entry_set_has_frame (GTK_ENTRY (priv->entries[i]), FALSE);
+#ifdef MAEMO_GTK
/* Set the entries to accept only numeric characters */
g_object_set (priv->entries[i], "hildon-input-mode", HILDON_GTK_INPUT_MODE_NUMERIC, NULL);
+#endif
/* The entry fields all take exactly two characters */
gtk_entry_set_max_length (GTK_ENTRY (priv->entries[i]), 2);
hildon_time_editor_set_to_current_time (editor);
gtk_widget_pop_composite_child ();
+
+#ifdef MAEMO_GTK
+ g_signal_connect (editor, "tap-and-hold-setup",
+ G_CALLBACK (hildon_time_editor_tap_and_hold_setup),
+ NULL);
+#endif
+
}
static void
HildonTimeEditorPrivate *priv = HILDON_TIME_EDITOR_GET_PRIVATE (widget);
GtkAllocation alloc;
GtkRequisition req, max_req;
+ gboolean rtl;
g_assert (priv);
+ rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
widget->allocation = *allocation;
gtk_widget_get_child_requisition (widget, &max_req);
alloc.y = allocation->y + MAX (allocation->height - max_req.height, 0) / 2;
/* allocate frame */
- gtk_widget_get_child_requisition (priv->frame, &req);
+ if (rtl)
+ gtk_widget_get_child_requisition (priv->iconbutton, &req);
+ else
+ gtk_widget_get_child_requisition (priv->frame, &req);
alloc.width = req.width;
alloc.height = max_req.height;
- gtk_widget_size_allocate (priv->frame, &alloc);
+ if (rtl)
+ gtk_widget_size_allocate (priv->iconbutton, &alloc);
+ else
+ gtk_widget_size_allocate (priv->frame, &alloc);
/* allocate icon */
if (GTK_WIDGET_VISIBLE (priv->iconbutton)) {
- gtk_widget_get_child_requisition (priv->iconbutton, &req);
+ if (rtl)
+ gtk_widget_get_child_requisition (priv->frame, &req);
+ else
+ gtk_widget_get_child_requisition (priv->iconbutton, &req);
alloc.x += alloc.width + HILDON_MARGIN_DEFAULT;
alloc.width = req.width;
- gtk_widget_size_allocate (priv->iconbutton, &alloc);
+
+ if (rtl)
+ gtk_widget_size_allocate (priv->frame, &alloc);
+ else
+ gtk_widget_size_allocate (priv->iconbutton, &alloc);
}
/* FIXME: ugly way to move labels up. They just don't seem move up
gtk_widget_size_allocate (priv->sec_label, &alloc);
}
-static gboolean
-hildon_time_editor_entry_keypress (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
+static gboolean
+hildon_time_editor_focus (GtkWidget *widget,
+ GtkDirectionType direction)
{
- HildonTimeEditor *editor;
- HildonTimeEditorPrivate *priv;
- gint cursor_pos;
- gboolean r;
+ gboolean retval;
+ GtkDirectionType effective_direction;
- g_assert (GTK_IS_ENTRY (widget));
- g_assert (event != NULL);
- g_assert (HILDON_IS_TIME_EDITOR (data));
+ g_assert (HILDON_IS_TIME_EDITOR (widget));
- editor = HILDON_TIME_EDITOR (data);
- priv = HILDON_TIME_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
- cursor_pos = gtk_editable_get_position (GTK_EDITABLE (widget));
-
- /* Show error message in case the key pressed is not allowed
- (only digits and control characters are allowed )*/
- if (!g_unichar_isdigit (event->keyval) && ! (event->keyval & 0xF000)) {
- g_signal_emit (editor, time_editor_signals[TIME_ERROR], 0, HILDON_DATE_TIME_ERROR_INVALID_CHAR, &r);
- hildon_banner_show_information (widget, NULL, c_("ckct_ib_illegal_character"));
- return TRUE;
- }
-
- switch (event->keyval)
- {
- case GDK_Return:
- /* Return key popups up time picker dialog. Visually it looks as if
- the time picker icon was clicked. Before opening the time picker
- the fields are first validated and fixed. */
-
- /* hildon_time_editor_validate (editor, FALSE);
- hildon_gtk_button_set_depressed (GTK_BUTTON (priv->iconbutton), TRUE);
- hildon_time_editor_icon_clicked (widget, data);
- hildon_gtk_button_set_depressed (GTK_BUTTON (priv->iconbutton), FALSE);
-
- FIXME The above code used to be here before the consolidation that removed the
- _set_depressed crap. However, I think this code had NO EFFECT anyways, since
- there is no expose event after the _set functions. So I'm just cutting it out.
- Another story would be to actually fix it... */
-
- hildon_time_editor_icon_clicked (widget, data);
- return TRUE;
-
- case GDK_Left:
- /* left arrow pressed in the entry. If we are on first position, try to
- move to the previous field. */
- if (cursor_pos == 0) {
- (void) gtk_widget_child_focus (GTK_WIDGET (editor), GTK_DIR_LEFT);
- return TRUE;
- }
- break;
+ retval = hildon_private_composite_focus (widget, direction, &effective_direction);
- case GDK_Right:
- /* right arrow pressed in the entry. If we are on last position, try to
- move to the next field. */
- if (cursor_pos >= g_utf8_strlen (gtk_entry_get_text (GTK_ENTRY (widget)), -1)) {
- (void) gtk_widget_child_focus (GTK_WIDGET (editor), GTK_DIR_RIGHT);
- return TRUE;
- }
- break;
+ if (retval == TRUE)
+ return GTK_WIDGET_CLASS (parent_class)->focus (widget, effective_direction);
+ else
+ return FALSE;
+}
- default:
- break;
- };
+static gboolean
+hildon_time_editor_entry_keypress (GtkEntry *entry,
+ GdkEventKey *event,
+ gpointer data)
+{
+ switch (event->keyval)
+ {
+ case GDK_Return:
+ case GDK_ISO_Enter:
+ hildon_time_editor_icon_clicked (GTK_WIDGET (entry), data);
+ return TRUE;
+ default:
+ return FALSE;
+ }
- return FALSE;
+ g_assert_not_reached ();
}
static void