#include <libebook/e-book.h>
#include <libosso-abook/osso-abook.h>
-GtkWidget *tree_view;
-
enum
{
COLUMN_AVATAR = 0,
NUM_COLS
};
+/* Application UI data struct */
+typedef struct _BirthdayData BirthdayData;
+struct _BirthdayData {
+ GtkWidget *window;
+ GtkWidget *label;
+ GtkWidget *view;
+ GtkWidget *search;
+
+ GtkTreeModel *sorted;
+ GtkTreeModel *filter;
+
+ gchar *searched_name;
+ gboolean found;
+};
+
+static gboolean
+birthday_filered_view_visible_func (GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer data)
+{
+ BirthdayData *priv;
+ gchar *fullname = NULL, *ascii_searched_name = NULL, *ascii_fullname = NULL;
+ gboolean found = FALSE;
+
+ g_return_val_if_fail (data, FALSE);
+ priv = (BirthdayData *) data;
+
+ if (priv->searched_name == NULL) {
+ priv->found = TRUE;
+ return TRUE;
+ }
+
+ ascii_searched_name = g_ascii_strdown (priv->searched_name, strlen (priv->searched_name));
+
+ gtk_tree_model_get (model, iter, COLUMN_FULLNAME, &fullname, -1);
+ if (fullname) {
+ ascii_fullname = g_ascii_strdown (fullname, strlen (fullname));
+ g_free (fullname);
+ }
+
+ if (g_strstr_len (ascii_fullname, strlen (ascii_fullname), ascii_searched_name) != NULL)
+ found = TRUE;
+
+ if (ascii_searched_name)
+ g_free (ascii_searched_name);
+
+ if (ascii_fullname)
+ g_free (ascii_fullname);
+
+ if (found)
+ priv->found = TRUE;
+
+ return found;
+}
+
static void
sort_by_name_clicked (GtkButton *button,
- GtkLabel *label)
+ gpointer data)
{
- GtkTreeModel *model;
+ BirthdayData *priv;
+
+ g_return_if_fail (data);
+ priv = (BirthdayData *) data;
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
- COLUMN_FULLNAME, GTK_SORT_ASCENDING);
+ if (priv->sorted) {
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->sorted),
+ COLUMN_FULLNAME, GTK_SORT_ASCENDING);
+ }
}
static void
sort_by_date_clicked (GtkButton *button,
- GtkLabel *label)
+ gpointer data)
{
- GtkTreeModel *model;
+ BirthdayData *priv;
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
- COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+ g_return_if_fail (data);
+ priv = (BirthdayData *) data;
+ if (priv->sorted) {
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (priv->sorted),
+ COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+ }
+}
+
+static void
+on_search_entry_changed (GtkEditable *editable,
+ gpointer data)
+{
+ BirthdayData *priv;
+ GtkWidget *pannable;
+
+ g_return_if_fail (data);
+ priv = (BirthdayData *) data;
+
+ priv->found = FALSE;
+
+ if (priv->searched_name)
+ g_free (priv->searched_name);
+ priv->searched_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (editable)));
+
+ /* refilter tree view */
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+
+ if (priv->found) {
+ /* hide label */
+ gtk_widget_hide (priv->label);
+
+ /* show tree view */
+ gtk_widget_show (priv->view);
+ } else {
+ /* hide label */
+ gtk_widget_show (priv->label);
+ gtk_label_set_text (GTK_LABEL (priv->label), _("No search results"));
+
+ /* show tree view */
+ gtk_widget_hide (priv->view);
+ }
+
+ pannable = g_object_get_data (G_OBJECT (priv->view), "pannable");
+ hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (pannable), 0, 0);
}
static void
on_search_close_clicked (GtkButton *button,
gpointer data)
{
- GtkWidget *search = GTK_WIDGET (data);
+ BirthdayData *priv;
+ GtkWidget *pannable;
+
+ g_return_if_fail (data);
+ priv = (BirthdayData *) data;
/* hide search bar */
- gtk_widget_hide (search);
+ gtk_widget_hide (priv->search);
+
+ /* hide label */
+ gtk_widget_hide (priv->label);
+
+ /* show tree view */
+ gtk_widget_show (priv->view);
- /* FIXME: refilter treeview */
+ /* clear searched name */
+ if (priv->searched_name)
+ g_free (priv->searched_name);
+ priv->searched_name = NULL;
+
+ /* refilter tree view */
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+
+ pannable = g_object_get_data (G_OBJECT (priv->view), "pannable");
+ hildon_pannable_area_jump_to (HILDON_PANNABLE_AREA (pannable), 0, 0);
}
GdkEventKey *event,
gpointer data)
{
- GtkWidget *search = GTK_WIDGET (data);
+ BirthdayData *priv;
+
+ g_return_val_if_fail (data, TRUE);
+ priv = (BirthdayData *) data;
+
+ if ((event->keyval > GDK_space) && (event->keyval <= GDK_stricteq) && !GTK_WIDGET_VISIBLE (priv->search)) {
+ GtkWidget *entry;
- if ((event->keyval > GDK_space) && (event->keyval <= GDK_stricteq) && !GTK_WIDGET_VISIBLE (search)) {
/* show search bar */
- gtk_widget_show (search);
+ gtk_widget_show (priv->search);
- /* FIXME: focus on entry */
+ /* focus on search entry */
+ entry = g_object_get_data (G_OBJECT (priv->search), "entry");
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ gtk_widget_grab_focus (GTK_WIDGET (entry));
+
+ /* refilter tree view */
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
}
return FALSE;
return store;
}
-static GtkWidget *
-create_search_bar ()
+static void
+create_search_bar (BirthdayData *priv)
{
- GtkWidget *hbox, *entry, *button;
+ GtkWidget *entry, *button;
GtkEntryCompletion *completion;
+ g_return_if_fail (priv);
+
/* search hbox */
- hbox = gtk_hbox_new (FALSE, HILDON_MARGIN_DEFAULT);
+ priv->search = gtk_hbox_new (FALSE, HILDON_MARGIN_DEFAULT);
/* search entry */
entry = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT);
hildon_gtk_entry_set_input_mode (GTK_ENTRY (entry), HILDON_GTK_INPUT_MODE_FULL);
- gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (priv->search), entry, TRUE, TRUE, 0);
completion = gtk_entry_completion_new ();
gtk_entry_completion_set_inline_completion (completion, TRUE);
/* clear button */
button = GTK_WIDGET (gtk_tool_button_new (gtk_image_new_from_icon_name
("general_close", (GtkIconSize) HILDON_ICON_PIXEL_SIZE_FINGER), "Clear"));
- gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+ gtk_box_pack_end (GTK_BOX (priv->search), button, FALSE, TRUE, 0);
/* search signals */
-// g_signal_connect (entry, "changed", G_CALLBACK (onSearchEntryChanged), this);
- g_signal_connect (button, "clicked", G_CALLBACK (on_search_close_clicked), hbox);
+ g_signal_connect (entry, "changed", G_CALLBACK (on_search_entry_changed), priv);
+ g_signal_connect (button, "clicked", G_CALLBACK (on_search_close_clicked), priv);
- return hbox;
+ g_object_set_data (G_OBJECT (priv->search), "entry", entry);
}
static void
-create_main_menu (GtkWidget *window)
+create_main_menu (BirthdayData *priv)
{
HildonAppMenu *menu;
GtkWidget *filter;
+ g_return_if_fail (priv);
+
menu = HILDON_APP_MENU (hildon_app_menu_new ());
- hildon_window_set_app_menu (HILDON_WINDOW (window), menu);
+ hildon_window_set_app_menu (HILDON_WINDOW (priv->window), menu);
filter = hildon_gtk_radio_button_new (HILDON_SIZE_FINGER_HEIGHT , NULL);
gtk_button_set_label (GTK_BUTTON (filter), _("Name"));
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (filter), FALSE);
- g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_name_clicked), NULL);
+ g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_name_clicked), priv);
hildon_app_menu_add_filter (menu, GTK_BUTTON (filter));
filter = hildon_gtk_radio_button_new_from_widget (HILDON_SIZE_FINGER_HEIGHT , GTK_RADIO_BUTTON (filter));
gtk_button_set_label (GTK_BUTTON (filter), _("Date"));
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (filter), FALSE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (filter), TRUE);
- g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_date_clicked), NULL);
+ g_signal_connect_after (filter, "clicked", G_CALLBACK (sort_by_date_clicked), priv);
hildon_app_menu_add_filter (menu, GTK_BUTTON (filter));
gtk_widget_show_all (GTK_WIDGET (menu));
}
-static GtkWidget *
-create_main_window (GtkListStore *store)
+static void
+create_main_window (BirthdayData *priv, GtkListStore *store)
{
HildonProgram *program = NULL;
- GtkWidget *window, *main_vbox, *alignment, *label, *pannable, *search;
+ GtkWidget *main_vbox, *alignment, *pannable, *tree_view;
+ GtkTreeModel *filter;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
+ g_return_if_fail (priv);
+
program = hildon_program_get_instance ();
g_set_application_name (_("Birthday"));
/* main window */
- window = hildon_stackable_window_new ();
- hildon_program_add_window (program, HILDON_WINDOW (window));
+ priv->window = hildon_stackable_window_new ();
+ hildon_program_add_window (program, HILDON_WINDOW (priv->window));
+
+ /* create main menu */
+ create_main_menu (priv);
/* aligment */
alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
HILDON_MARGIN_HALF, 0, HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DEFAULT);
- gtk_container_add (GTK_CONTAINER (window), alignment);
+ gtk_container_add (GTK_CONTAINER (priv->window), alignment);
/* main vbox */
main_vbox = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (alignment), main_vbox);
/* no_search_result label */
- label = gtk_label_new (_("No contacts with set birthdate"));
- hildon_helper_set_logical_color (label, GTK_RC_FG,
+ priv->label = gtk_label_new (_("No contacts with set birthdate"));
+ hildon_helper_set_logical_color (priv->label, GTK_RC_FG,
GTK_STATE_NORMAL, "SecondaryTextColor");
- hildon_helper_set_logical_font (label, "LargeSystemFont");
- gtk_box_pack_start (GTK_BOX (main_vbox), label, TRUE, TRUE, 0);
+ hildon_helper_set_logical_font (priv->label, "LargeSystemFont");
+ gtk_box_pack_start (GTK_BOX (main_vbox), priv->label, TRUE, TRUE, 0);
/* alignment for pannable area */
- alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
- gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
+ priv->view = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
+ gtk_alignment_set_padding (GTK_ALIGNMENT (priv->view),
0, 0, HILDON_MARGIN_DEFAULT, 0);
- gtk_box_pack_start (GTK_BOX (main_vbox), alignment, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (main_vbox), priv->view, TRUE, TRUE, 0);
/* pannable for tree view */
pannable = hildon_pannable_area_new ();
g_object_set (G_OBJECT (pannable), "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL);
- gtk_container_add (GTK_CONTAINER (alignment), pannable);
+ g_object_set_data (G_OBJECT (priv->view), "pannable", pannable);
+ gtk_container_add (GTK_CONTAINER (priv->view), pannable);
+
+ /* sort list by next birthdays */
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
+ COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+ priv->sorted = GTK_TREE_MODEL (store);
+
+ /* filtered view */
+ filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
+ gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter),
+ birthday_filered_view_visible_func,
+ priv,
+ NULL);
+ gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter));
+ priv->filter = GTK_TREE_MODEL (filter);
/* tree view */
- tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
+ tree_view = hildon_gtk_tree_view_new_with_model (HILDON_UI_MODE_NORMAL, filter);
gtk_container_add (GTK_CONTAINER (pannable), tree_view);
+
/* display column */
column = gtk_tree_view_column_new ();
gtk_tree_view_column_set_fixed_width (column, 709);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
/* search bar */
- search = create_search_bar();
- gtk_box_pack_end (GTK_BOX (main_vbox), search, FALSE, FALSE, 0);
+ create_search_bar(priv);
+ gtk_box_pack_end (GTK_BOX (main_vbox), priv->search, FALSE, FALSE, 0);
/* window signals */
- g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
-// g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (on_key_press_event), search);
+ g_signal_connect (G_OBJECT (priv->window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
+ g_signal_connect (G_OBJECT (priv->window), "key-press-event", G_CALLBACK (on_key_press_event), priv);
- gtk_widget_show_all (GTK_WIDGET (window));
- gtk_widget_hide (GTK_WIDGET (label));
- gtk_widget_hide (GTK_WIDGET (search));
- return window;
+ gtk_widget_show_all (GTK_WIDGET (priv->window));
+ gtk_widget_hide (GTK_WIDGET (priv->label));
+ gtk_widget_hide (GTK_WIDGET (priv->search));
}
int main (int argc, char **argv)
{
+ BirthdayData *data;
osso_context_t *osso_context;
EBook *ebook;
EBookQuery *query;
hildon_gtk_init (&argc, &argv);
+ /* create application data */
+ data = g_new0 (BirthdayData, 1);
+ data->searched_name = NULL;
+ data->found = TRUE;
+
/* initialize localization */
setlocale(LC_ALL, "");
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
}
store = create_bday_liststore (contacts);
- window = create_main_window (store);
- g_object_unref (G_OBJECT (store));
- create_main_menu (window);
-
- /* sort list by next birthdays */
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
- COLUMN_NEXT_BIRTHDAY, GTK_SORT_ASCENDING);
+ create_main_window (data, store);
gtk_main ();