COLUMN_DISPLAY,
COLUMN_FULLNAME,
COLUMN_NEXT_BIRTHDAY,
+ COLUMN_ABOOK_CONTACT,
NUM_COLS
};
return TRUE;
}
- ascii_searched_name = g_ascii_strdown (priv->searched_name, strlen (priv->searched_name));
+ ascii_searched_name = g_utf8_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));
+ ascii_fullname = g_utf8_strdown (fullname, strlen (fullname));
g_free (fullname);
}
on_search_entry_changed (GtkEditable *editable,
gpointer data)
{
+ GtkTreeSelection *selection;
BirthdayData *priv;
g_return_if_fail (data);
g_free (priv->searched_name);
priv->searched_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (editable)));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+
+ /* ugly hack, set back mode to selection none to not generate "changed"
+ signal during re-filtering */
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
+
/* refilter tree view */
gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
/* 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);
+
+ /* ugly hack, set back mode to single selection */
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+
+ /* unselect selected rows */
+ gtk_tree_selection_unselect_all (selection);
}
static void
on_search_close_clicked (GtkButton *button,
gpointer data)
{
+ GtkTreeSelection *selection;
BirthdayData *priv;
g_return_if_fail (data);
priv = (BirthdayData *) data;
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+
+ /* ugly hack, set back mode to selection none to not generate "changed"
+ signal during re-filtering */
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
+
/* hide search bar */
gtk_widget_hide (priv->search);
/* 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);
+
+ /* ugly hack, set back mode to single selection */
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+
+ /* unselect selected rows */
+ gtk_tree_selection_unselect_all (selection);
}
return FALSE;
}
+static void
+on_selection_changed (GtkTreeSelection *selection,
+ gpointer data)
+{
+ BirthdayData *priv;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ GtkWidget *entry;
+
+ g_return_if_fail (data);
+ priv = (BirthdayData *) data;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+ OssoABookContact *abook_contact = NULL;
+
+ /* unselect selected rows */
+ gtk_tree_selection_unselect_all (selection);
+
+ gtk_tree_model_get (model, &iter, COLUMN_ABOOK_CONTACT, &abook_contact, -1);
+
+ if (abook_contact) {
+ GtkWidget *starter, *dialog;
+ OssoABookContactDetailStore *store;
+ OssoABookContactAction actions[9] = {OSSO_ABOOK_CONTACT_ACTION_TEL,
+ OSSO_ABOOK_CONTACT_ACTION_SMS,
+ OSSO_ABOOK_CONTACT_ACTION_CHATTO,
+ OSSO_ABOOK_CONTACT_ACTION_VOIPTO,
+ OSSO_ABOOK_CONTACT_ACTION_VOIPTO_AUDIO,
+ OSSO_ABOOK_CONTACT_ACTION_VOIPTO_VIDEO,
+ OSSO_ABOOK_CONTACT_ACTION_MAILTO,
+ OSSO_ABOOK_CONTACT_ACTION_CREATE_ACCOUNT,
+ OSSO_ABOOK_CONTACT_ACTION_BIND};
+
+ store = osso_abook_contact_detail_store_new (abook_contact,
+ OSSO_ABOOK_CONTACT_DETAIL_EMAIL |
+ OSSO_ABOOK_CONTACT_DETAIL_PHONE |
+ OSSO_ABOOK_CONTACT_DETAIL_IM_VOICE |
+ OSSO_ABOOK_CONTACT_DETAIL_IM_VIDEO |
+ OSSO_ABOOK_CONTACT_DETAIL_IM_CHAT |
+ OSSO_ABOOK_CONTACT_DETAIL_OTHERS |
+ OSSO_ABOOK_CONTACT_DETAIL_SMS);
+
+ starter = osso_abook_touch_contact_starter_new_with_store (store,
+ (OssoABookContactAction *) &actions,
+ sizeof (actions));
+
+ dialog = osso_abook_touch_contact_starter_dialog_new (GTK_WINDOW (priv->window),
+ OSSO_ABOOK_TOUCH_CONTACT_STARTER (starter));
+ gtk_widget_show_all (dialog);
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ }
+ }
+
+ /* grab focus to search entry */
+ entry = g_object_get_data (G_OBJECT (priv->search), "entry");
+ gtk_widget_grab_focus (GTK_WIDGET (entry));
+
+}
+
static unsigned int
calc_age (EContactDate *bdate, time_t current_date)
{
GDK_TYPE_PIXBUF, /* COLUMN_AVATAR */
G_TYPE_STRING, /* COLUMN_DISPLAY */
G_TYPE_STRING, /* COLUMN_FULLNAME */
- G_TYPE_INT); /* COLUMN_NEXT_BIRTHDAY */
+ G_TYPE_INT, /* COLUMN_NEXT_BIRTHDAY */
+ G_TYPE_POINTER); /* COLUMN_ABOOK_CONTACT */
for (contact = contacts; contact != NULL; contact = contact->next) {
+
EContactDate *bdate = NULL;
bdate = e_contact_get (E_CONTACT (contact->data), E_CONTACT_BIRTH_DATE);
if (bdate) {
- EContactPhoto *photo = NULL;
GError *error = NULL;
GdkPixbuf *avatar = NULL;
- gchar *fullname = NULL;
+ const gchar *fullname = NULL;
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) {
- if (photo->type == E_CONTACT_PHOTO_TYPE_INLINED) {
- GdkPixbufLoader *loader;
-
- loader = gdk_pixbuf_loader_new ();
- if (gdk_pixbuf_loader_write (loader, (guchar *) photo->data.inlined.data, photo->data.inlined.length, NULL))
- avatar = gdk_pixbuf_loader_get_pixbuf (loader);
-
- } else {
- gchar *avatar_filename = NULL;
-
- avatar_filename = g_filename_from_uri (photo->data.uri, NULL, NULL);
- if (avatar_filename) {
- avatar = gdk_pixbuf_new_from_file (avatar_filename, &error);
- g_free (avatar_filename);
- }
- }
-
- if (avatar) {
- gint height = gdk_pixbuf_get_height (avatar);
- if (height != 48) {
- gint new_height = 48;
- gint new_width = new_height * gdk_pixbuf_get_width (avatar) / height;
- avatar = gdk_pixbuf_scale_simple (avatar, new_width, new_height, GDK_INTERP_BILINEAR);
- }
- }
- e_contact_photo_free (photo);
- photo = NULL;
- } else {
+ avatar = osso_abook_avatar_get_image_rounded (OSSO_ABOOK_AVATAR (contact->data), 48, 48, TRUE, 4, NULL);
+ if (!avatar) {
avatar = gdk_pixbuf_new_from_file ("/usr/share/icons/hicolor/48x48/hildon/general_default_avatar.png", &error);
}
- fullname = e_contact_get (E_CONTACT (contact->data), E_CONTACT_FULL_NAME);
- if (!fullname) {
- fullname = e_contact_get (E_CONTACT (contact->data), E_CONTACT_GIVEN_NAME);
- if (!fullname) {
- fullname = e_contact_get (E_CONTACT (contact->data), E_CONTACT_FAMILY_NAME);
- if (!fullname) {
- fullname = e_contact_get (E_CONTACT (contact->data), E_CONTACT_NICKNAME);
- if (!fullname) {
- fullname = e_contact_get (E_CONTACT (contact->data), E_CONTACT_ORG);
- }
- }
- }
- }
+ fullname = osso_abook_contact_get_display_name (OSSO_ABOOK_CONTACT (contact->data));
birthday_tm.tm_sec = 0;
birthday_tm.tm_min = 0;
COLUMN_DISPLAY, display_column,
COLUMN_FULLNAME, fullname,
COLUMN_NEXT_BIRTHDAY, next_birthday,
+ COLUMN_ABOOK_CONTACT, contact->data,
-1);
n_contacts++;
g_free (display_column);
display_column = NULL;
- if (fullname)
- g_free (fullname);
- fullname = NULL;
-
if (next_birthday_text)
g_free (next_birthday_text);
next_birthday_text = NULL;
create_main_window (BirthdayData *priv, GtkListStore *store)
{
HildonProgram *program = NULL;
- GtkWidget *main_vbox, *alignment, *pannable, *tree_view;
+ GtkWidget *main_vbox, *alignment, *pannable;
GtkTreeModel *filter;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
+ GtkTreeSelection *selection;
g_return_if_fail (priv);
priv->filter = GTK_TREE_MODEL (filter);
/* tree view */
- priv->tree_view = hildon_gtk_tree_view_new_with_model (HILDON_UI_MODE_NORMAL, filter);
+ priv->tree_view = hildon_gtk_tree_view_new_with_model (HILDON_UI_MODE_EDIT, filter);
gtk_container_add (GTK_CONTAINER (pannable), priv->tree_view);
/* display column */
create_search_bar(priv);
gtk_box_pack_end (GTK_BOX (main_vbox), priv->search, FALSE, FALSE, 0);
- /* window signals */
- 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 (priv->window));
gtk_widget_hide (GTK_WIDGET (priv->search));
/* enable portrait mode support */
hildon_gtk_window_set_portrait_flags (GTK_WINDOW (priv->window),
HILDON_PORTRAIT_MODE_SUPPORT);
+
+ /* tree view signals */
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+ gtk_tree_selection_unselect_all (selection);
+ g_signal_connect (selection, "changed", G_CALLBACK (on_selection_changed), priv);
+
+ /* window signals */
+ 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);
}
static GList *
-get_all_contacts (EBook *ebook)
+get_all_contacts (void)
{
GError *error = NULL;
- EBookQuery *query;
+ OssoABookAggregator *aggregator;
GList *contacts;
- ebook = e_book_new_system_addressbook (&error);
- if (!ebook) {
- g_warning ("Error opening system address book: %s", error->message);
+ aggregator = OSSO_ABOOK_AGGREGATOR (osso_abook_aggregator_get_default (&error));
+ if (!aggregator) {
+ g_warning ("Error creating default abook aggregator: %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);
+ osso_abook_waitable_run (OSSO_ABOOK_WAITABLE (aggregator), g_main_context_default(), &error);
+ if (error) {
+ g_warning ("Error wating for abook: %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;
- }
+ contacts = osso_abook_aggregator_list_master_contacts (aggregator);
return contacts;
}
{
BirthdayData *data;
osso_context_t *osso_context;
- EBook *ebook;
- GtkWidget *window;
GtkListStore *store;
GList *contacts;
goto exit;
}
- contacts = get_all_contacts (ebook);
+ contacts = get_all_contacts ();
store = create_bday_liststore (data, contacts);
/* create main widow */