#include <libebook/e-book.h>
#include <libosso-abook/osso-abook.h>
+#define _HL(str) dgettext("hildon-libs",str)
+
enum
{
COLUMN_AVATAR = 0,
GtkWidget *view;
GtkWidget *search;
+ GtkWidget *tree_view;
GtkTreeModel *sorted;
GtkTreeModel *filter;
gchar *searched_name;
gboolean found;
+
+ guint n_contacts;
};
static gboolean
static void
sort_by_name_clicked (GtkButton *button,
- gpointer data)
+ gpointer data)
{
BirthdayData *priv;
static void
sort_by_date_clicked (GtkButton *button,
- gpointer data)
+ gpointer data)
{
BirthdayData *priv;
}
static void
+search_menu_clicked (GtkButton *button,
+ gpointer data)
+{
+ BirthdayData *priv;
+ GtkWidget *entry;
+
+ g_return_if_fail (data);
+ priv = (BirthdayData *) data;
+
+ /* show search bar */
+ gtk_widget_show (priv->search);
+
+ /* 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));
+}
+
+static void
on_search_entry_changed (GtkEditable *editable,
gpointer data)
{
BirthdayData *priv;
- GtkWidget *pannable;
g_return_if_fail (data);
priv = (BirthdayData *) data;
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);
+ /* ugly, but working way how to scroll to the first row */
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->tree_view),
+ gtk_tree_path_new_from_string ("0"), NULL, FALSE, 0, 0);
}
static void
gpointer data)
{
BirthdayData *priv;
- GtkWidget *pannable;
g_return_if_fail (data);
priv = (BirthdayData *) data;
/* 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);
+ /* ugly, but working way how to scroll to the first row */
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->tree_view),
+ gtk_tree_path_new_from_string ("0"), NULL, FALSE, 0, 0);
}
g_return_val_if_fail (data, TRUE);
priv = (BirthdayData *) data;
+ if (priv->n_contacts == 0)
+ return FALSE;
+
if ((event->keyval > GDK_space) && (event->keyval <= GDK_stricteq) && !GTK_WIDGET_VISIBLE (priv->search)) {
GtkWidget *entry;
static unsigned int
calc_age (EContactDate *bdate)
{
- struct tm tm_bday;
- struct tm *tm_age;
+ struct tm bday_tm;
+ struct tm *age_tm;
time_t t_age;
int age = 0;
- tm_bday.tm_sec = 0;
- tm_bday.tm_min = 0;
- tm_bday.tm_hour = 0;
- tm_bday.tm_mday = bdate->day;
- tm_bday.tm_mon = bdate->month - 1;
- tm_bday.tm_year = bdate->year - 1900;
+ bday_tm.tm_sec = 0;
+ bday_tm.tm_min = 0;
+ bday_tm.tm_hour = 0;
+ bday_tm.tm_mday = bdate->day;
+ bday_tm.tm_mon = bdate->month - 1;
+ bday_tm.tm_year = bdate->year - 1900;
- t_age = time (NULL) - mktime (&tm_bday);
- tm_age = gmtime (&t_age);
- age = tm_age->tm_year - 70;
+ t_age = time (NULL) - mktime (&bday_tm);
+ age_tm = gmtime (&t_age);
+ age = age_tm->tm_year - 70;
if (age < 0)
age = 0;
static unsigned int
calc_next_bday (EContactDate *bdate)
{
- struct tm tm_current_bday, tm_next_bday;
- struct tm *tm_current_date;
+ struct tm current_bday_tm, next_bday_tm;
+ struct tm *current_date_tm;
time_t t_current_date, t_current_bday, t_next_bday;
t_current_date = time (NULL);
- tm_current_date = localtime (&t_current_date);
+ current_date_tm = localtime (&t_current_date);
- tm_current_bday.tm_sec = 0;
- tm_current_bday.tm_min = 0;
- tm_current_bday.tm_hour = 0;
- tm_current_bday.tm_mday = bdate->day;
- tm_current_bday.tm_mon = bdate->month - 1;
- tm_current_bday.tm_year = tm_current_date->tm_year;
- t_current_bday = mktime (&tm_current_bday);
+ current_bday_tm.tm_sec = 0;
+ current_bday_tm.tm_min = 0;
+ current_bday_tm.tm_hour = 0;
+ current_bday_tm.tm_mday = bdate->day;
+ current_bday_tm.tm_mon = bdate->month - 1;
+ current_bday_tm.tm_year = current_date_tm->tm_year;
+ t_current_bday = mktime (¤t_bday_tm);
if (t_current_date > t_current_bday) {
- tm_next_bday.tm_sec = 0;
- tm_next_bday.tm_min = 0;
- tm_next_bday.tm_hour = 0;
- tm_next_bday.tm_mday = bdate->day;
- tm_next_bday.tm_mon = bdate->month - 1;
- tm_next_bday.tm_year = tm_current_date->tm_year + 1;
- t_next_bday = mktime (&tm_next_bday);
+ next_bday_tm.tm_sec = 0;
+ next_bday_tm.tm_min = 0;
+ next_bday_tm.tm_hour = 0;
+ next_bday_tm.tm_mday = bdate->day;
+ next_bday_tm.tm_mon = bdate->month - 1;
+ next_bday_tm.tm_year = current_date_tm->tm_year + 1;
+ t_next_bday = mktime (&next_bday_tm);
} else {
t_next_bday = t_current_bday;
}
}
static GtkListStore *
-create_bday_liststore (GList *contacts)
+create_bday_liststore (BirthdayData *priv, GList *contacts)
{
GtkListStore *store;
GtkTreeIter iter;
GList *contact;
gchar *text_font = NULL;
gchar *text_color = NULL;
+ guint n_contacts = 0;
+
+ g_return_val_if_fail (priv, NULL);
text_font = get_text_font_by_name ("SmallSystemFont");
text_color = get_text_color_by_name ("SecondaryTextColor");
guint age = 0, next_birthday = 0;
gchar *display_column = NULL;
gchar *next_birthday_text = NULL;
+ struct tm birthday_tm;
+ gchar birthday_text[11];
photo = e_contact_get (E_CONTACT (contact->data), E_CONTACT_PHOTO);
if (photo) {
}
}
+ birthday_tm.tm_sec = 0;
+ birthday_tm.tm_min = 0;
+ birthday_tm.tm_hour = 0;
+ birthday_tm.tm_mday = bdate->day;
+ birthday_tm.tm_mon = bdate->month - 1;
+ birthday_tm.tm_year = bdate->year - 1900;
+ strftime (birthday_text, 11, _HL("wdgt_va_date"), &birthday_tm);
+
age = calc_age(bdate);
next_birthday = calc_next_bday(bdate);
next_birthday_text = g_strdup_printf(ngettext ("next birthday in %d day", "next birthday in %d days", next_birthday), next_birthday);
- display_column = g_strdup_printf("%s <span font_desc=\"%s\" foreground=\"%s\"><sup>(%d)</sup>\n%02d.%02d.%04d, %s</span>",
- fullname, text_font, text_color, age, bdate->day, bdate->month, bdate->year, next_birthday_text);
+ display_column = g_strdup_printf("%s <span font_desc=\"%s\" foreground=\"%s\"><sup>(%d)</sup>\n%s, %s</span>",
+ fullname, text_font, text_color, age, birthday_text, next_birthday_text);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
COLUMN_FULLNAME, fullname,
COLUMN_NEXT_BIRTHDAY, next_birthday,
-1);
+ n_contacts++;
if (display_column)
g_free (display_column);
if (text_color)
g_free (text_color);
+ priv->n_contacts = n_contacts;
return store;
}
create_main_menu (BirthdayData *priv)
{
HildonAppMenu *menu;
- GtkWidget *filter;
+ GtkWidget *filter, *item;
g_return_if_fail (priv);
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));
+ item = hildon_gtk_button_new (HILDON_SIZE_AUTO);
+ gtk_button_set_label (GTK_BUTTON (item), _("Search"));
+ hildon_app_menu_append (menu, GTK_BUTTON (item));
+ g_signal_connect (item, "clicked", G_CALLBACK (search_menu_clicked), priv);
+
+ if (priv->n_contacts > 0)
+ gtk_widget_show_all (GTK_WIDGET (menu));
}
static void
gtk_container_add (GTK_CONTAINER (alignment), main_vbox);
/* no_search_result label */
- priv->label = gtk_label_new (_("No contacts with set birthdate"));
+ priv->label = gtk_label_new (_("No contacts with birthday"));
hildon_helper_set_logical_color (priv->label, GTK_RC_FG,
GTK_STATE_NORMAL, "SecondaryTextColor");
hildon_helper_set_logical_font (priv->label, "LargeSystemFont");
/* pannable for tree view */
pannable = hildon_pannable_area_new ();
g_object_set (G_OBJECT (pannable), "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL);
- g_object_set_data (G_OBJECT (priv->view), "pannable", pannable);
gtk_container_add (GTK_CONTAINER (priv->view), pannable);
/* sort list by next birthdays */
priv->filter = GTK_TREE_MODEL (filter);
/* tree view */
- tree_view = hildon_gtk_tree_view_new_with_model (HILDON_UI_MODE_NORMAL, filter);
- gtk_container_add (GTK_CONTAINER (pannable), tree_view);
+ priv->tree_view = hildon_gtk_tree_view_new_with_model (HILDON_UI_MODE_NORMAL, filter);
+ gtk_container_add (GTK_CONTAINER (pannable), priv->tree_view);
/* display column */
column = gtk_tree_view_column_new ();
NULL);
g_object_set (G_OBJECT (renderer), "xpad", 10, NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree_view), column);
/* avatar column */
column = gtk_tree_view_column_new ();
gtk_tree_view_column_set_attributes (column, renderer,
"pixbuf", COLUMN_AVATAR,
NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree_view), column);
/* search bar */
create_search_bar(priv);
g_signal_connect (G_OBJECT (priv->window), "key-press-event", G_CALLBACK (on_key_press_event), priv);
gtk_widget_show_all (GTK_WIDGET (priv->window));
- gtk_widget_hide (GTK_WIDGET (priv->label));
gtk_widget_hide (GTK_WIDGET (priv->search));
+
+ if (priv->n_contacts > 0) {
+ gtk_widget_hide (GTK_WIDGET (priv->label));
+ gtk_widget_show (GTK_WIDGET (priv->view));
+ } else {
+ gtk_widget_show (GTK_WIDGET (priv->label));
+ gtk_widget_hide (GTK_WIDGET (priv->view));
+ }
+}
+
+static GList *
+get_all_contacts (EBook *ebook)
+{
+ GError *error = NULL;
+ EBookQuery *query;
+ GList *contacts;
+
+ ebook = e_book_new_system_addressbook (&error);
+ if (!ebook) {
+ g_warning ("Error opening system address book: %s", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ if (!e_book_open (ebook, TRUE, &error)) {
+ g_warning ("Error opening system address book: %s", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ query = e_book_query_any_field_contains ("");
+
+ if (!e_book_get_contacts (ebook, query, &contacts, &error)) {
+ g_warning ("Error getting contacts: %s", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ return contacts;
}
int main (int argc, char **argv)
BirthdayData *data;
osso_context_t *osso_context;
EBook *ebook;
- EBookQuery *query;
- GError *error = NULL;
GtkWidget *window;
GtkListStore *store;
GList *contacts;
data = g_new0 (BirthdayData, 1);
data->searched_name = NULL;
data->found = TRUE;
+ data->n_contacts = 0;
/* initialize localization */
setlocale(LC_ALL, "");
goto exit;
}
- ebook = e_book_new_system_addressbook (&error);
- if (!ebook) {
- g_warning ("Error opening system address book: %s", error->message);
- g_error_free (error);
- goto exit;
- }
-
- if (!e_book_open (ebook, TRUE, &error)) {
- g_warning ("Error opening system address book: %s", error->message);
- g_error_free (error);
- goto exit;
- }
-
- query = e_book_query_any_field_contains ("");
-
- if (!e_book_get_contacts (ebook, query, &contacts, &error)) {
- g_warning ("Error getting contacts: %s", error->message);
- g_error_free (error);
- goto exit;
- }
+ contacts = get_all_contacts (ebook);
+ store = create_bday_liststore (data, contacts);
- store = create_bday_liststore (contacts);
+ /* create main widow */
create_main_window (data, store);
gtk_main ();