aboutsummaryrefslogtreecommitdiff
path: root/hildon/hildon-number-editor.c
diff options
context:
space:
mode:
Diffstat (limited to 'hildon/hildon-number-editor.c')
-rw-r--r--hildon/hildon-number-editor.c1049
1 files changed, 0 insertions, 1049 deletions
diff --git a/hildon/hildon-number-editor.c b/hildon/hildon-number-editor.c
deleted file mode 100644
index a8f57f7..0000000
--- a/hildon/hildon-number-editor.c
+++ /dev/null
@@ -1,1049 +0,0 @@
-/*
- * This file is a part of hildon
- *
- * Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
- *
- * Contact: Rodrigo Novo <rodrigo.novo@nokia.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
- *
- */
-
-/**
- * SECTION:hildon-number-editor
- * @short_description: A widget used to enter a number within a pre-defined range.
- *
- * HildonNumberEditor is used to enter a number from a specific range.
- * There are two buttons to scroll the value in number field.
- * Manual input is also possible.
- *
- * <note>
- * <para>
- * #HildonNumberEditor has been deprecated since Hildon 2.2
- * See <link linkend="hildon-migrating-number-widgets">Migrating Number Widgets</link>
- * section to know how to migrate this deprecated widget.
- * </para>
- * </note>
- *
- * <example>
- * <title>HildonNumberEditor example</title>
- * <programlisting>
- * number_editor = hildon_number_editor_new (-250, 500);
- * hildon_number_editor_set_range (number_editor, 0, 100);
- * </programlisting>
- * </example>
- */
-
-#undef HILDON_DISABLE_DEPRECATED
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <libintl.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "hildon-number-editor.h"
-#include "hildon-marshalers.h"
-#include "hildon-defines.h"
-#include "hildon-enum-types.h"
-#include "hildon-banner.h"
-#include "hildon-number-editor-private.h"
-#include "hildon-private.h"
-
-#define _(String) dgettext("hildon-libs", String)
-
-/*Pixel spec defines*/
-#define NUMBER_EDITOR_HEIGHT 30
-
-/* Size of plus and minus buttons */
-#define BUTTON_HEIGHT 30
-
-#define BUTTON_WIDTH 30
-
-static void
-hildon_number_editor_class_init (HildonNumberEditorClass *editor_class);
-
-static void
-hildon_number_editor_init (HildonNumberEditor *editor);
-
-static gboolean
-hildon_number_editor_entry_focusout (GtkWidget *widget,
- GdkEventFocus *event,
- gpointer data);
-
-static void
-hildon_number_editor_entry_changed (GtkWidget *widget,
- gpointer data);
-
-static void
-hildon_number_editor_size_request (GtkWidget *widget,
- GtkRequisition *requisition);
-
-static void
-set_widget_allocation (GtkWidget *widget,
- GtkAllocation *alloc,
- const GtkAllocation *allocation);
-
-static void
-hildon_number_editor_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-
-static gboolean
-hildon_number_editor_focus (GtkWidget *widget,
- GtkDirectionType direction);
-
-static gboolean
-hildon_number_editor_entry_keypress (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data);
-
-static gboolean
-hildon_number_editor_button_pressed (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data);
-
-static gboolean
-hildon_number_editor_entry_button_released (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data);
-static gboolean
-hildon_number_editor_button_released (GtkWidget *widget,
- GdkEvent *event,
- HildonNumberEditor *editor);
-static gboolean
-do_mouse_timeout (HildonNumberEditor *editor);
-
-static void
-change_numbers (HildonNumberEditor *editor,
- gint update);
-
-static void
-hildon_number_editor_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-
-static void
-hildon_number_editor_destroy (GtkObject *self);
-
-static gboolean
-hildon_number_editor_start_timer (HildonNumberEditor *editor);
-
-static void
-hildon_number_editor_finalize (GObject *self);
-
-static gboolean
-hildon_number_editor_range_error (HildonNumberEditor *editor,
- HildonNumberEditorErrorType type);
-
-static gboolean
-hildon_number_editor_select_all (HildonNumberEditorPrivate *priv);
-
-static void
-hildon_number_editor_validate_value (HildonNumberEditor *editor,
- gboolean allow_intermediate);
-
-static void
-hildon_number_editor_set_property (GObject * object,
- guint prop_id,
- const GValue * value,
- GParamSpec * pspec);
-
-static void
-hildon_number_editor_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec * pspec);
-
-enum
-{
- RANGE_ERROR,
- LAST_SIGNAL
-};
-
-enum {
- PROP_0,
- PROP_VALUE
-};
-
-static GtkContainerClass* parent_class;
-
-static guint HildonNumberEditor_signal[LAST_SIGNAL] = {0};
-
-/**
- * hildon_number_editor_get_type:
- *
- * Returns GType for HildonNumberEditor.
- *
- * Returns: HildonNumberEditor type
- */
-GType G_GNUC_CONST
-hildon_number_editor_get_type (void)
-{
- static GType editor_type = 0;
-
- if (!editor_type)
- {
- static const GTypeInfo editor_info =
- {
- sizeof (HildonNumberEditorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) hildon_number_editor_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (HildonNumberEditor),
- 0, /* n_preallocs */
- (GInstanceInitFunc) hildon_number_editor_init,
- };
- editor_type = g_type_register_static (GTK_TYPE_CONTAINER,
- "HildonNumberEditor",
- &editor_info, 0);
- }
- return editor_type;
-}
-
-static void
-hildon_number_editor_class_init (HildonNumberEditorClass *editor_class)
-{
- GtkContainerClass *container_class = GTK_CONTAINER_CLASS (editor_class);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (editor_class);
- GObjectClass *gobject_class = G_OBJECT_CLASS (editor_class);
-
- g_type_class_add_private (editor_class,
- sizeof (HildonNumberEditorPrivate));
-
- parent_class = g_type_class_peek_parent (editor_class);
-
- widget_class->size_request = hildon_number_editor_size_request;
- widget_class->size_allocate = hildon_number_editor_size_allocate;
- widget_class->focus = hildon_number_editor_focus;
-
- editor_class->range_error = hildon_number_editor_range_error;
-
- /* Because we derived our widget from GtkContainer, we should override
- forall method */
- container_class->forall = hildon_number_editor_forall;
- GTK_OBJECT_CLASS(editor_class)->destroy = hildon_number_editor_destroy;
- gobject_class->finalize = hildon_number_editor_finalize;
- gobject_class->set_property = hildon_number_editor_set_property;
- gobject_class->get_property = hildon_number_editor_get_property;
-
- /**
- * HildonNumberEditor:value:
- *
- * The current value of the number editor.
- */
- g_object_class_install_property (gobject_class, PROP_VALUE,
- g_param_spec_int ("value",
- "Value",
- "The current value of number editor",
- G_MININT,
- G_MAXINT,
- 0, G_PARAM_READWRITE));
-
- HildonNumberEditor_signal[RANGE_ERROR] =
- g_signal_new ("range_error", HILDON_TYPE_NUMBER_EDITOR,
- G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET
- (HildonNumberEditorClass, range_error),
- g_signal_accumulator_true_handled, NULL,
- _hildon_marshal_BOOLEAN__ENUM,
- G_TYPE_BOOLEAN, 1, HILDON_TYPE_NUMBER_EDITOR_ERROR_TYPE);
-}
-
-static void
-hildon_number_editor_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- HildonNumberEditorPrivate *priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (container);
-
- g_assert (callback != NULL);
- g_assert (priv);
-
- if (! include_internals)
- return;
-
- /* Enumerate child widgets */
- (*callback) (priv->minus, callback_data);
- (*callback) (priv->num_entry, callback_data);
- (*callback) (priv->plus, callback_data);
-}
-
-static void
-hildon_number_editor_destroy (GtkObject *self)
-{
- HildonNumberEditorPrivate *priv;
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (self);
- g_assert (priv);
-
- /* Free child widgets */
- if (priv->minus)
- {
- gtk_widget_unparent (priv->minus);
- priv->minus = NULL;
- }
- if (priv->num_entry)
- {
- gtk_widget_unparent (priv->num_entry);
- priv->num_entry = NULL;
- }
- if (priv->plus)
- {
- gtk_widget_unparent (priv->plus);
- priv->plus = NULL;
- }
-
- if (GTK_OBJECT_CLASS (parent_class)->destroy)
- GTK_OBJECT_CLASS (parent_class)->destroy(self);
-}
-
-static void
-hildon_number_editor_stop_repeat_timer (HildonNumberEditorPrivate *priv)
-{
- g_assert (priv != NULL);
-
- if (priv->button_event_id)
- {
- g_source_remove (priv->button_event_id);
- priv->button_event_id = 0;
- }
-}
-
-static void
-hildon_number_editor_finalize (GObject *self)
-{
- HildonNumberEditorPrivate *priv;
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (self);
- g_assert (priv);
-
- /* Free timers */
- hildon_number_editor_stop_repeat_timer (priv);
-
- if (priv->select_all_idle_id)
- g_source_remove (priv->select_all_idle_id);
-
- /* Call parent class finalize, if have one */
- if (G_OBJECT_CLASS (parent_class)->finalize)
- G_OBJECT_CLASS (parent_class)->finalize(self);
-}
-
-static void
-hildon_number_editor_init (HildonNumberEditor *editor)
-{
- HildonNumberEditorPrivate *priv;
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- GTK_WIDGET_SET_FLAGS (GTK_WIDGET (editor), GTK_NO_WINDOW);
-
- /* Create child widgets */
- priv->num_entry = gtk_entry_new ();
- priv->minus = gtk_button_new ();
- priv->plus = gtk_button_new ();
-
- gtk_widget_set_name (priv->minus, "ne-minus-button");
- gtk_widget_set_name (priv->plus, "ne-plus-button" );
- gtk_widget_set_size_request (priv->minus, BUTTON_WIDTH, BUTTON_HEIGHT);
- gtk_widget_set_size_request (priv->plus, BUTTON_WIDTH, BUTTON_HEIGHT);
- gtk_entry_set_alignment (GTK_ENTRY(priv->num_entry), 1);
-
- GTK_WIDGET_UNSET_FLAGS (priv->minus, GTK_CAN_FOCUS);
- GTK_WIDGET_UNSET_FLAGS (priv->plus, GTK_CAN_FOCUS);
-
- priv->button_event_id = 0;
- priv->select_all_idle_id = 0;
-
- gtk_widget_set_parent (priv->minus, GTK_WIDGET (editor));
- gtk_widget_set_parent (priv->num_entry, GTK_WIDGET (editor));
- gtk_widget_set_parent (priv->plus, GTK_WIDGET (editor));
-
- /* Connect child widget signals */
- g_signal_connect (GTK_OBJECT (priv->num_entry), "changed",
- G_CALLBACK (hildon_number_editor_entry_changed),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->num_entry), "focus-out-event",
- G_CALLBACK (hildon_number_editor_entry_focusout),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->num_entry), "key-press-event",
- G_CALLBACK (hildon_number_editor_entry_keypress),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->num_entry), "button-release-event",
- G_CALLBACK (hildon_number_editor_entry_button_released),
- NULL);
-
- g_signal_connect (GTK_OBJECT (priv->minus), "button-press-event",
- G_CALLBACK (hildon_number_editor_button_pressed),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->plus), "button-press-event",
- G_CALLBACK (hildon_number_editor_button_pressed),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->minus), "button-release-event",
- G_CALLBACK (hildon_number_editor_button_released),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->plus), "button-release-event",
- G_CALLBACK (hildon_number_editor_button_released),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->minus), "leave-notify-event",
- G_CALLBACK(hildon_number_editor_button_released),
- editor);
-
- g_signal_connect (GTK_OBJECT (priv->plus), "leave-notify-event",
- G_CALLBACK (hildon_number_editor_button_released),
- editor);
-
-#ifdef MAEMO_GTK
- g_object_set (G_OBJECT (priv->num_entry),
- "hildon-input-mode", HILDON_GTK_INPUT_MODE_NUMERIC, NULL);
-#endif
-
- gtk_widget_show (priv->num_entry);
- gtk_widget_show (priv->minus);
- gtk_widget_show (priv->plus);
-
- hildon_number_editor_set_range (editor, G_MININT, G_MAXINT);
-}
-
-static gboolean
-hildon_number_editor_entry_button_released (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
-{
- gtk_editable_select_region (GTK_EDITABLE (widget), 0, -1);
- return FALSE;
-}
-
-static gboolean
-hildon_number_editor_button_released (GtkWidget *widget,
- GdkEvent *event,
- HildonNumberEditor *editor)
-{
- HildonNumberEditorPrivate *priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- hildon_number_editor_stop_repeat_timer (priv);
- return FALSE;
-}
-
-/* Format given number to editor field, no checks performed, all signals
- are sent normally. */
-static void
-hildon_number_editor_real_set_value (HildonNumberEditorPrivate *priv,
- gint value)
-{
- gchar *buffer;
-
- /* Update text in entry to new value */
- buffer = g_strdup_printf ("%d", value);
- gtk_entry_set_text (GTK_ENTRY (priv->num_entry), buffer);
- g_free (buffer);
-}
-
-static gboolean
-hildon_number_editor_button_pressed (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
-{
- /* FIXME: XXX Why aren't we using hildon_number_editor_start_timer here? XXX */
- /* Need to fetch current value from entry and increment or decrement
- it */
-
- HildonNumberEditor *editor;
- HildonNumberEditorPrivate *priv;
- GtkSettings *settings;
- guint timeout;
-
- g_assert (HILDON_IS_NUMBER_EDITOR (data));
-
- editor = HILDON_NUMBER_EDITOR (data);
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- settings = gtk_settings_get_default ();
- g_object_get (settings, "gtk-timeout-initial", &timeout, NULL);
-
- /* Save type of button pressed */
- if (GTK_BUTTON (widget) == GTK_BUTTON (priv->plus))
- priv->button_type = 1;
- else
- priv->button_type = -1;
-
- /* Start repetition timer */
- if (! priv->button_event_id)
- {
- change_numbers (editor, priv->button_type);
- priv->button_event_id = gdk_threads_add_timeout (timeout,
- (GSourceFunc) hildon_number_editor_start_timer,
- editor);
- }
-
- return FALSE;
-}
-
-static gboolean
-hildon_number_editor_start_timer (HildonNumberEditor *editor)
-{
- HildonNumberEditorPrivate *priv;
- GtkSettings *settings;
- guint timeout;
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- settings = gtk_settings_get_default ();
- g_object_get (settings, "gtk-timeout-repeat", &timeout, NULL);
- timeout *= 8;
-
- priv->button_event_id = gdk_threads_add_timeout (timeout,
- (GSourceFunc) do_mouse_timeout,
- editor);
-
- return FALSE;
-}
-
-static gboolean
-do_mouse_timeout (HildonNumberEditor *editor)
-{
- HildonNumberEditorPrivate *priv;
- g_assert (HILDON_IS_NUMBER_EDITOR (editor));
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- /* Update value based on button held */
- change_numbers (editor, priv->button_type);
-
- return TRUE;
-}
-
-/* Changes the current number value by the amount of update
- and verifies the result. */
-static void
-change_numbers (HildonNumberEditor *editor,
- gint update)
-{
- HildonNumberEditorPrivate *priv;
- gint current_value;
-
- g_assert (HILDON_IS_NUMBER_EDITOR (editor));
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- current_value = hildon_number_editor_get_value (editor);
-
- /* We need to rerun validation by hand, since validation
- done in "changed" callback allows intermediate values */
- hildon_number_editor_real_set_value (priv, current_value + update);
- hildon_number_editor_validate_value (editor, FALSE);
- g_object_notify (G_OBJECT (editor), "value");
-}
-
-static void
-add_select_all_idle (HildonNumberEditorPrivate *priv)
-{
- g_assert (priv);
-
- if (! priv->select_all_idle_id)
- {
- priv->select_all_idle_id =
- gdk_threads_add_idle ((GSourceFunc) hildon_number_editor_select_all, priv);
- }
-}
-
-static void
-hildon_number_editor_validate_value (HildonNumberEditor *editor,
- gboolean allow_intermediate)
-{
- HildonNumberEditorPrivate *priv;
- gint error_code, fixup_value;
- const gchar *text;
- long value;
- gchar *tail;
- gboolean r;
-
- g_assert (HILDON_IS_NUMBER_EDITOR(editor));
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- text = gtk_entry_get_text (GTK_ENTRY (priv->num_entry));
- error_code = -1;
- fixup_value = priv->default_val;
-
- if (text && text[0])
- {
- /* Try to convert entry text to number */
- value = strtol (text, &tail, 10);
-
- /* Check if conversion succeeded */
- if (tail[0] == 0)
- {
- /* Check if value is in allowed range. This is tricky in those
- cases when user is editing a value.
- For example: Range = [100, 500] and user have just inputted "4".
- This should not lead into error message. Otherwise value is
- resetted back to "100" and next "4" press will reset it back
- and so on. */
- if (allow_intermediate)
- {
- /* We now have the following error cases:
- * If inputted value as above maximum and
- maximum is either positive or then maximum
- negative and value is positive.
- * If inputted value is below minimum and minimum
- is negative or minumum positive and value
- negative or zero.
- In all other cases situation can be fixed just by
- adding new numbers to the string.
- */
- if (value > priv->end && (priv->end >= 0 || (priv->end < 0 && value >= 0)))
- {
- error_code = HILDON_NUMBER_EDITOR_ERROR_MAXIMUM_VALUE_EXCEED;
- fixup_value = priv->end;
- }
- else if (value < priv->start && (priv->start < 0 || (priv->start >= 0 && value <= 0)))
- {
- error_code = HILDON_NUMBER_EDITOR_ERROR_MINIMUM_VALUE_EXCEED;
- fixup_value = priv->start;
- }
- }
- else
- {
- if (value > priv->end) {
- error_code = HILDON_NUMBER_EDITOR_ERROR_MAXIMUM_VALUE_EXCEED;
- fixup_value = priv->end;
- }
- else if (value < priv->start) {
- error_code = HILDON_NUMBER_EDITOR_ERROR_MINIMUM_VALUE_EXCEED;
- fixup_value = priv->start;
- }
- }
- }
- /* The only valid case when conversion can fail is when we
- have plain '-', intermediate forms are allowed AND
- minimum bound is negative */
- else if (! allow_intermediate || strcmp (text, "-") != 0 || priv->start >= 0)
- error_code = HILDON_NUMBER_EDITOR_ERROR_ERRONEOUS_VALUE;
- }
- else if (! allow_intermediate)
- error_code = HILDON_NUMBER_EDITOR_ERROR_ERRONEOUS_VALUE;
-
- if (error_code != -1)
- {
- /* If entry is empty and intermediate forms are nor allowed,
- emit error signal */
- /* Change to default value */
- hildon_number_editor_set_value (editor, fixup_value);
- g_signal_emit (editor, HildonNumberEditor_signal[RANGE_ERROR], 0, error_code, &r);
- add_select_all_idle (priv);
- }
-}
-
-static void
-hildon_number_editor_entry_changed (GtkWidget *widget,
- gpointer data)
-{
- g_assert (HILDON_IS_NUMBER_EDITOR (data));
- hildon_number_editor_validate_value (HILDON_NUMBER_EDITOR (data), TRUE);
- g_object_notify (G_OBJECT (data), "value");
-}
-
-static void
-hildon_number_editor_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- HildonNumberEditor *editor;
- HildonNumberEditorPrivate *priv;
- GtkRequisition req;
-
- editor = HILDON_NUMBER_EDITOR (widget);
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- /* Requested size is size of all child widgets plus border space */
- gtk_widget_size_request (priv->minus, &req);
- requisition->width = req.width;
-
- gtk_widget_size_request (priv->num_entry, &req);
- requisition->width += req.width;
-
- gtk_widget_size_request (priv->plus, &req);
- requisition->width += req.width;
-
- requisition->width += HILDON_MARGIN_DEFAULT * 2;
-
- /* FIXME: XXX Height is fixed */
- requisition->height = NUMBER_EDITOR_HEIGHT;
-}
-
-/* Update alloc->width so widget fits, update alloc->x to point to free space */
-static void
-set_widget_allocation (GtkWidget *widget,
- GtkAllocation *alloc,
- const GtkAllocation *allocation)
-{
- GtkRequisition child_requisition;
-
- gtk_widget_get_child_requisition (widget, &child_requisition);
-
- /* Fit to widget width */
- if (allocation->width + allocation->x > alloc->x + child_requisition.width)
- alloc->width = child_requisition.width;
- else
- {
- alloc->width = allocation->width - (alloc->x - allocation->x);
- if (alloc->width < 0)
- alloc->width = 0;
- }
-
- gtk_widget_size_allocate (widget, alloc);
- /* Update x position */
- alloc->x += alloc->width;
-}
-
-static void
-hildon_number_editor_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- HildonNumberEditor *editor;
- HildonNumberEditorPrivate *priv;
- GtkAllocation alloc;
-
- editor = HILDON_NUMBER_EDITOR (widget);
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- widget->allocation = *allocation;
-
- /* Add upper border */
- alloc.y = widget->allocation.y + widget->style->ythickness;
-
- /* Fix height */
- if (widget->allocation.height > NUMBER_EDITOR_HEIGHT)
- {
- alloc.height = NUMBER_EDITOR_HEIGHT - widget->style->ythickness * 2;
- alloc.y += (widget->allocation.height - NUMBER_EDITOR_HEIGHT) / 2;
- }
- else
- alloc.height = widget->allocation.height - widget->style->ythickness * 2;
-
- if (alloc.height < 0)
- alloc.height = 0;
-
- /* Add left border */
- alloc.x = allocation->x + widget->style->xthickness;
-
- /* Allocate positions for widgets (left-to-right) */
- set_widget_allocation(priv->minus, &alloc, &widget->allocation);
- alloc.x += HILDON_MARGIN_DEFAULT;
-
- set_widget_allocation(priv->num_entry, &alloc, &widget->allocation);
- alloc.x += HILDON_MARGIN_DEFAULT;
-
- set_widget_allocation(priv->plus, &alloc, &widget->allocation);
-}
-
-static gboolean
-hildon_number_editor_focus (GtkWidget *widget,
- GtkDirectionType direction)
-{
- gboolean retval;
- GtkDirectionType effective_direction;
-
- g_assert (HILDON_IS_NUMBER_EDITOR (widget));
-
- retval = hildon_private_composite_focus (widget, direction, &effective_direction);
-
- if (retval == TRUE)
- return GTK_WIDGET_CLASS (parent_class)->focus (widget, effective_direction);
- else
- return FALSE;
-}
-
-static gboolean
-hildon_number_editor_entry_focusout (GtkWidget *widget,
- GdkEventFocus *event,
- gpointer data)
-{
- g_assert (HILDON_IS_NUMBER_EDITOR(data));
-
- hildon_number_editor_validate_value (HILDON_NUMBER_EDITOR(data), FALSE);
- return FALSE;
-}
-
-static gboolean
-hildon_number_editor_entry_keypress (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
-{
- GtkEditable *editable;
- gint cursor_pos;
-
- g_assert (HILDON_IS_NUMBER_EDITOR (data));
-
- editable = GTK_EDITABLE (widget);
- cursor_pos = gtk_editable_get_position (editable);
-
- switch (event->keyval)
- {
- case GDK_Left:
- /* If the cursor is on the left, try to decrement */
- if (cursor_pos == 0) {
- change_numbers (HILDON_NUMBER_EDITOR (data), -1);
- return TRUE;
- }
- break;
-
- case GDK_Right:
- /* If the cursor is on the right, try to increment */
- if (cursor_pos >= g_utf8_strlen(gtk_entry_get_text (GTK_ENTRY (widget)), -1))
- {
- change_numbers (HILDON_NUMBER_EDITOR (data), 1);
- gtk_editable_set_position(editable, cursor_pos);
- return TRUE;
- }
- break;
-
- default:
- break;
- };
-
- return FALSE;
-}
-
-static gboolean
-hildon_number_editor_range_error (HildonNumberEditor *editor,
- HildonNumberEditorErrorType type)
-{
-
- gint min, max;
- gchar *err_msg = NULL;
- HildonNumberEditorPrivate *priv;
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- min = priv->start;
- max = priv->end;
-
- /* Construct error message */
- switch (type)
- {
- case HILDON_NUMBER_EDITOR_ERROR_MAXIMUM_VALUE_EXCEED:
- err_msg = g_strdup_printf (_("ckct_ib_maximum_value"), max, max);
- break;
-
- case HILDON_NUMBER_EDITOR_ERROR_MINIMUM_VALUE_EXCEED:
- err_msg = g_strdup_printf (_("ckct_ib_minimum_value"), min, min);
- break;
-
- case HILDON_NUMBER_EDITOR_ERROR_ERRONEOUS_VALUE:
- err_msg =
- g_strdup_printf (_("ckct_ib_set_a_value_within_range"), min, max);
- break;
- }
-
- /* Infoprint error */
- if (err_msg)
- {
- hildon_banner_show_information (GTK_WIDGET (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET(editor),
- GTK_TYPE_WINDOW))), NULL, err_msg);
- g_free(err_msg);
- }
-
- return TRUE;
-}
-
-/**
- * hildon_number_editor_new:
- * @min: minimum accepted value
- * @max: maximum accepted value
- *
- * Creates new number editor
- *
- * Returns: a new #HildonNumberEditor widget
- */
-GtkWidget*
-hildon_number_editor_new (gint min,
- gint max)
-{
- HildonNumberEditor *editor = g_object_new (HILDON_TYPE_NUMBER_EDITOR, NULL);
-
- /* Set user inputted range to editor */
- hildon_number_editor_set_range (editor, min, max);
-
- return GTK_WIDGET (editor);
-}
-
-/**
- * hildon_number_editor_set_range:
- * @editor: a #HildonNumberEditor widget
- * @min: minimum accepted value
- * @max: maximum accepted value
- *
- * Sets accepted number range for editor
- */
-void
-hildon_number_editor_set_range (HildonNumberEditor *editor,
- gint min,
- gint max)
-{
- HildonNumberEditorPrivate *priv;
- gchar buffer_min[32], buffer_max[32];
- gint a, b;
-
- g_return_if_fail (HILDON_IS_NUMBER_EDITOR (editor));
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- /* Set preferences */
- priv->start = MIN (min, max);
- priv->end = MAX (min, max);
-
- /* Find maximum allowed length of value */
- g_snprintf (buffer_min, sizeof (buffer_min), "%d", min);
- g_snprintf (buffer_max, sizeof (buffer_max), "%d", max);
- a = strlen (buffer_min);
- b = strlen (buffer_max);
-
- /* Set maximum size of entry */
- gtk_entry_set_width_chars (GTK_ENTRY (priv->num_entry), MAX (a, b));
- hildon_number_editor_set_value (editor, priv->start);
-}
-
-/**
- * hildon_number_editor_get_value:
- * @editor: a #HildonNumberEditor
- *
- * Gets the current value of the number editor.
- *
- * Returns: the current value
- */
-gint
-hildon_number_editor_get_value (HildonNumberEditor *editor)
-{
- HildonNumberEditorPrivate *priv;
-
- g_return_val_if_fail (HILDON_IS_NUMBER_EDITOR (editor), 0);
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- return atoi (gtk_entry_get_text (GTK_ENTRY (priv->num_entry)));
-}
-
-/**
- * hildon_number_editor_set_value:
- * @editor: a #HildonNumberEditor
- * @value: numeric value for number editor
- *
- * Sets numeric value for number editor
- */
-void
-hildon_number_editor_set_value (HildonNumberEditor *editor,
- gint value)
-{
- HildonNumberEditorPrivate *priv;
-
- g_return_if_fail (HILDON_IS_NUMBER_EDITOR (editor));
-
- priv = HILDON_NUMBER_EDITOR_GET_PRIVATE (editor);
- g_assert (priv);
-
- g_return_if_fail (value <= priv->end);
- g_return_if_fail (value >= priv->start);
-
- priv->default_val = value;
- hildon_number_editor_real_set_value (priv, value);
- g_object_notify (G_OBJECT(editor), "value");
-}
-
-/* When calling gtk_entry_set_text, the entry widget does things that can
- * cause the whole widget to redraw. This redrawing is delayed and if any
- * selections are made right after calling the gtk_entry_set_text the
- * setting of the selection might seem to have no effect.
- *
- * If the selection is delayed with a lower priority than the redrawing,
- * the selection should stick. Calling this function with g_idle_add should
- * do it.
- */
-static gboolean
-hildon_number_editor_select_all (HildonNumberEditorPrivate *priv)
-{
- gtk_editable_select_region (GTK_EDITABLE (priv->num_entry), 0, -1);
- priv->select_all_idle_id = 0;
- return FALSE;
-}
-
-static void
-hildon_number_editor_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- HildonNumberEditor *editor;
-
- editor = HILDON_NUMBER_EDITOR (object);
-
- switch (prop_id) {
-
- case PROP_VALUE:
- hildon_number_editor_set_value (editor, g_value_get_int (value));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- break;
- }
-}
-
-static void
-hildon_number_editor_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- HildonNumberEditor *editor;
-
- editor = HILDON_NUMBER_EDITOR (object);
-
- switch (prop_id) {
-
- case PROP_VALUE:
- g_value_set_int(value, hildon_number_editor_get_value (editor));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-