r2018 - trunk/src/target/OM-2007/applications/openmoko-contacts/src
thomas at sita.openmoko.org
thomas at sita.openmoko.org
Fri May 18 17:01:00 CEST 2007
Author: thomas
Date: 2007-05-18 17:00:58 +0200 (Fri, 18 May 2007)
New Revision: 2018
Added:
trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.c
trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.h
trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.c
trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.h
Log:
openmoko-contacts: add missing files
Added: trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.c 2007-05-18 14:59:55 UTC (rev 2017)
+++ trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.c 2007-05-18 15:00:58 UTC (rev 2018)
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2006-2007 by OpenMoko, Inc.
+ * Written by OpenedHand Ltd <info at openedhand.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "contacts-history-view.h"
+
+
+#include "contacts-ui.h"
+#include "contacts-main.h"
+#include "contacts-utils.h"
+#include "contacts-history.h"
+
+void
+contacts_history_pane_show (GtkWidget *button,
+ ContactsData *data)
+{
+ GtkTreeSelection *selection;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW
+ (data->ui->contacts_treeview));
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (data->ui->main_notebook),
+ CONTACTS_HISTORY_PANE);
+ contacts_history_pane_update_selection (selection, data);
+}
+
+void
+contacts_history_pane_update_selection (GtkTreeSelection *selection,
+ ContactsData *data)
+{
+ EContact *contact;
+ gchar *uid = NULL;
+
+ if (!selection) {
+ gtk_widget_set_sensitive (GTK_WIDGET (data->ui->history), FALSE);
+ return;
+ }
+
+ /* Get the currently selected contact and update the history view */
+ contact = contacts_contact_from_selection (selection, data->contacts_table);
+ if (!contact) {
+ gtk_widget_set_sensitive (GTK_WIDGET (data->ui->history), FALSE);
+ return;
+ }
+ gtk_widget_set_sensitive (GTK_WIDGET (data->ui->history), TRUE);
+
+ /* Get the contacts uid and update the history widget */
+ uid = (gchar*) e_contact_get (contact, E_CONTACT_UID);
+ if (uid)
+ contacts_history_update_uid (CONTACTS_HISTORY (data->ui->history), uid);
+
+ if (uid)
+ g_free (uid);
+}
+
+static void
+on_moko_journal_entry_activated (ContactsHistory *history,
+ MokoJournalEntry *entry)
+{
+ g_print ("Launch Viewer\n");
+}
+
+GtkWidget*
+contacts_history_pane_new (void)
+{
+ GtkWidget *history = contacts_history_new ();
+
+ g_signal_connect (G_OBJECT (history), "entry-activated",
+ G_CALLBACK (on_moko_journal_entry_activated), NULL);
+
+ return history;
+}
Added: trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.h 2007-05-18 14:59:55 UTC (rev 2017)
+++ trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history-view.h 2007-05-18 15:00:58 UTC (rev 2018)
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2006-2007 by OpenMoko, Inc.
+ * Written by OpenedHand Ltd <info at openedhand.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef HISTORY_VIEW_H
+#define HISTORY_VIEW_H
+
+#include <gtk/gtk.h>
+
+#include "contacts-defs.h"
+
+void
+contacts_history_pane_show (GtkWidget *button,
+ ContactsData *data);
+void
+contacts_history_pane_update_selection (GtkTreeSelection *selection,
+ ContactsData *data);
+
+GtkWidget*
+contacts_history_pane_new (void);
+
+#endif
Added: trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.c 2007-05-18 14:59:55 UTC (rev 2017)
+++ trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.c 2007-05-18 15:00:58 UTC (rev 2018)
@@ -0,0 +1,687 @@
+/*
+ * Copyright (C) 2006-2007 by OpenMoko, Inc.
+ * Written by OpenedHand Ltd <info at openedhand.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "contacts-history.h"
+
+#include <string.h>
+#include <time.h>
+
+G_DEFINE_TYPE (ContactsHistory, contacts_history, GTK_TYPE_VBOX);
+
+#define CONTACTS_HISTORY_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj),\
+ CONTACTS_TYPE_HISTORY, \
+ ContactsHistoryPrivate))
+
+struct _ContactsHistoryPrivate
+{
+ MokoJournal *journal;
+ GtkWidget *menu;
+ GtkWidget *open_item;
+
+ gchar *uid;
+
+};
+
+enum
+{
+ PROP_0,
+ PROP_UID
+};
+
+enum
+{
+ ACTIVATED,
+ LAST_SIGNAL
+};
+
+static guint _history_signals[LAST_SIGNAL] = { 0 };
+
+static GtkVBoxClass *parent_class = NULL;
+
+static GQuark entry_quark = 0;
+static GQuark label_quark = 0;
+static GQuark shown_quark = 0;
+static GQuark press_quark = 0;
+static GQuark preview_quark = 0;
+
+#define HISTORY_EMAIL_ICON "moko-history-mail"
+#define HISTORY_SMS_ICON "moko-history-im"
+#define HISTORY_CALL_IN_ICON "moko-history-call-in"
+#define HISTORY_CALL_OUT_ICON "moko-history-call-out"
+#define HISTORY_CALL_MISSED_ICON "moko-history-call-missed"
+
+#define GBOOLEAN_TO_POINTER(i) ((gpointer) ((i) ? 2 : 1))
+#define GPOINTER_TO_BOOLEAN(i) ((gboolean) ((((gint)(i)) == 2) ? TRUE : FALSE))
+
+static void
+contacts_history_preview_clicked (ContactsHistory *history, GtkWidget *preview)
+{
+ MokoJournalEntry *entry = NULL;
+ GtkWidget *label;
+ gboolean shown = 0;
+
+ entry = g_object_get_qdata (G_OBJECT (preview), entry_quark);
+ if (!entry)
+ return;
+
+ label = g_object_get_qdata (G_OBJECT (preview), label_quark);
+ shown = GPOINTER_TO_BOOLEAN (g_object_get_qdata (G_OBJECT (preview),
+ shown_quark));
+
+ switch (moko_journal_entry_get_type (entry)) {
+ case EMAIL_JOURNAL_ENTRY:
+ case SMS_JOURNAL_ENTRY:
+ if (!label)
+ break;
+ if (shown) {
+ gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+ gtk_label_set_line_wrap (GTK_LABEL (label), FALSE);
+ } else {
+ gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_NONE);
+ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+ }
+ break;
+
+ case VOICE_JOURNAL_ENTRY:
+ default:
+ break;
+ }
+ g_object_set_qdata (G_OBJECT (preview), shown_quark,
+ GBOOLEAN_TO_POINTER (!shown));
+
+}
+
+static void
+contacts_history_preview_show_menu (ContactsHistory *history,
+ GtkWidget *preview)
+{
+ ContactsHistoryPrivate *priv;
+
+ g_return_if_fail(CONTACTS_IS_HISTORY(history));
+ priv = CONTACTS_HISTORY_GET_PRIVATE (history);
+
+ g_object_set_qdata (G_OBJECT (priv->menu), preview_quark, (gpointer)preview);
+
+ gtk_menu_popup (GTK_MENU (priv->menu),
+ NULL, NULL,
+ NULL, NULL,
+ 0, gtk_get_current_event_time ());
+}
+
+static void
+contacts_history_preview_select (GtkMenuItem *item, ContactsHistory *history)
+{
+ ContactsHistoryPrivate *priv;
+ GtkWidget *preview = NULL;
+
+ g_return_if_fail(CONTACTS_IS_HISTORY(history));
+ priv = CONTACTS_HISTORY_GET_PRIVATE (history);
+
+ preview = g_object_get_qdata (G_OBJECT (priv->menu), preview_quark);
+ if (!GTK_IS_WIDGET (preview))
+ return;
+
+ contacts_history_preview_clicked (history, preview);
+}
+
+static void
+contacts_history_preview_open (GtkMenuItem *item, ContactsHistory *history)
+{
+ ContactsHistoryPrivate *priv;
+ GtkWidget *preview = NULL;
+ MokoJournalEntry *entry = NULL;
+
+ g_return_if_fail(CONTACTS_IS_HISTORY(history));
+ priv = CONTACTS_HISTORY_GET_PRIVATE (history);
+
+ preview = g_object_get_qdata (G_OBJECT (priv->menu), preview_quark);
+ if (!GTK_IS_WIDGET (preview))
+ return;
+
+ entry = g_object_get_qdata (G_OBJECT (preview), entry_quark);
+
+ g_signal_emit (history, _history_signals[ACTIVATED], 0, (gpointer)entry);
+}
+
+/*
+ * Handles all events for the preview widgets, deciding if there was a normal
+ * clicked event, or a press-wait-release event
+ */
+static gboolean
+contacts_history_button_released (GtkWidget *eb,
+ GdkEventButton *event,
+ ContactsHistory *history)
+{
+#define RELEASE_TIMEOUT 500
+ gint pressed =GPOINTER_TO_INT(g_object_get_qdata(G_OBJECT (eb), press_quark));
+ gint released = event->time;
+ gint diff = released - pressed;
+
+
+ if (diff < 500) {
+ contacts_history_preview_clicked (history, eb);
+ } else {
+ contacts_history_preview_show_menu (history, eb);
+ }
+
+ return FALSE;
+}
+
+/*
+ * Sets the press_quark on the event box the time of the button press event
+ */
+static gboolean
+contacts_history_button_pressed (GtkWidget *eb,
+ GdkEventButton *event,
+ ContactsHistory *history)
+{
+ g_object_set_qdata (G_OBJECT (eb), press_quark,GINT_TO_POINTER (event->time));
+ return FALSE;
+}
+
+
+/*
+ * Creates a nice email preview widget
+ */
+static GtkWidget*
+contacts_history_create_email_preview (MokoJournalEntry *entry,
+ enum MessageDirection direction)
+{
+#define BUF 256
+ GtkWidget *eb, *hbox, *icon, *label;
+ const MokoTime *mtime;
+ gchar *blurb = NULL;
+ gchar t[BUF];
+ GDate *date = NULL;
+ time_t time;
+
+ /* Make MokoTime into something human-readable */
+ mtime = moko_journal_entry_get_dtstart (entry);
+ if (mtime) {
+ time = moko_time_as_timet (mtime);
+ date = g_date_new ();
+ g_date_set_time_t (date, time);
+ g_date_strftime (t, BUF, "%a %d %B %Y", date);
+
+ } else {
+ t[0] = '\0';
+ }
+
+ /* Create the event box */
+ eb = gtk_event_box_new ();
+ gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), TRUE);
+ gtk_event_box_set_above_child (GTK_EVENT_BOX (eb), FALSE);
+
+ hbox = gtk_hbox_new (FALSE, 4);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
+ gtk_container_add (GTK_CONTAINER (eb), hbox);
+
+ /* Depending on the direction, we load the correct icon, and set the correct
+ name for theming */
+ gtk_widget_set_name (eb, "mokohistoryemail");
+ icon = gtk_image_new_from_icon_name (HISTORY_EMAIL_ICON,
+ GTK_ICON_SIZE_MENU);
+ blurb = g_strdup_printf ("<b>%s</b>\n<span size='x-small'>%s</span>",
+ moko_journal_entry_get_summary (entry),
+ t);
+
+ gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 2);
+
+ label = gtk_label_new ("");
+ gtk_widget_set_name (label, "mokohistorylabel");
+ gtk_label_set_markup (GTK_LABEL (label), blurb);
+ gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+ gtk_label_set_line_wrap (GTK_LABEL (label), FALSE);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 2);
+
+ /* Force theming */
+ gtk_widget_set_state (eb, GTK_STATE_PRELIGHT);
+
+ /* Set quark(s) */
+ g_object_set_qdata (G_OBJECT (eb), entry_quark, (gpointer)entry);
+ g_object_set_qdata (G_OBJECT (eb), label_quark, (gpointer)label);
+
+ if (date)
+ g_date_free (date);
+ g_free (blurb);
+
+ return eb;
+}
+
+/*
+ * Creates a nice sms preview widget
+ */
+static GtkWidget*
+contacts_history_create_sms_preview (MokoJournalEntry *entry,
+ enum MessageDirection direction)
+{
+ GtkWidget *eb, *hbox, *icon, *label;
+ gchar *blurb = NULL;
+
+ /* Create the event box */
+ eb = gtk_event_box_new ();
+ gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), TRUE);
+ gtk_event_box_set_above_child (GTK_EVENT_BOX (eb), FALSE);
+
+ hbox = gtk_hbox_new (FALSE, 4);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
+ gtk_container_add (GTK_CONTAINER (eb), hbox);
+
+ /* Depending on the direction, we load the correct icon, and set the correct
+ name for theming */
+ gtk_widget_set_name (eb, "mokohistorysms");
+ icon = gtk_image_new_from_icon_name (HISTORY_SMS_ICON, GTK_ICON_SIZE_MENU);
+ blurb = g_strdup_printf ("<b>%s</b>", moko_journal_entry_get_summary (entry));
+
+ gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 2);
+
+ label = gtk_label_new ("");
+ gtk_widget_set_name (label, "mokohistorylabel");
+ gtk_label_set_markup (GTK_LABEL (label), blurb);
+ gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
+ gtk_label_set_line_wrap (GTK_LABEL (label), FALSE);
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 2);
+
+ /* Force theming */
+ gtk_widget_set_state (eb, GTK_STATE_PRELIGHT);
+
+ /* Set quark(s) */
+ g_object_set_qdata (G_OBJECT (eb), entry_quark, (gpointer)entry);
+ g_object_set_qdata (G_OBJECT (eb), label_quark, (gpointer)label);
+
+ g_free (blurb);
+ return eb;
+}
+
+/*
+ * Creates a nice voice call preview widget
+ */
+static GtkWidget*
+contacts_history_create_voice_preview (MokoJournalEntry *entry,
+ enum MessageDirection direction)
+{
+#define BUF 256
+ GtkWidget *eb, *hbox, *icon, *label;
+ MokoJournalVoiceInfo *info;
+ const MokoTime *mtime;
+ gchar *blurb = NULL;
+ gchar t[BUF];
+ GDate *date = NULL;
+ time_t time;
+ gboolean missed = FALSE;
+
+ /* If we have call info, lets load it */
+ if (moko_journal_entry_get_voice_info (entry, &info)) {
+ missed = moko_journal_voice_info_get_was_missed (info);
+ }
+
+ /* Make MokoTime into something human-readable */
+ mtime = moko_journal_entry_get_dtstart (entry);
+ if (mtime) {
+ time = moko_time_as_timet (mtime);
+ date = g_date_new ();
+ g_date_set_time_t (date, time);
+ g_date_strftime (t, BUF, "%a %d %B %Y", date);
+
+ } else {
+ t[0] = '\0';
+ }
+
+ /* Create the event box */
+ eb = gtk_event_box_new ();
+ gtk_event_box_set_visible_window (GTK_EVENT_BOX (eb), TRUE);
+ gtk_event_box_set_above_child (GTK_EVENT_BOX (eb), FALSE);
+
+ hbox = gtk_hbox_new (FALSE, 4);
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
+ gtk_container_add (GTK_CONTAINER (eb), hbox);
+
+ /* Depending on the direction, we load the correct icon, and set the correct
+ name for theming */
+ if (missed) {
+ gtk_widget_set_name (eb, "mokohistorycall-missed");
+ icon = gtk_image_new_from_icon_name (HISTORY_CALL_MISSED_ICON,
+ GTK_ICON_SIZE_MENU);
+ blurb = g_strdup_printf ("<b>Missed Call :</b> "
+ "<span weight='heavy'>%s</span>", t);
+
+ } else if (direction == DIRECTION_IN) {
+ gtk_widget_set_name (eb, "mokohistorycall-in");
+ icon = gtk_image_new_from_icon_name (HISTORY_CALL_IN_ICON,
+ GTK_ICON_SIZE_MENU);
+ blurb = g_strdup_printf ("Recieved Call : <b>%s</b>", t);
+
+ } else {
+ gtk_widget_set_name (eb, "mokohistorycall-out");
+ icon = gtk_image_new_from_icon_name (HISTORY_CALL_OUT_ICON,
+ GTK_ICON_SIZE_MENU);
+ blurb = g_strdup_printf ("Dialed Call : <b>%s</b>", t);
+
+ }
+ gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 2);
+
+ label = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL (label), blurb);
+ gtk_widget_set_name (label, "mokohistorylabel");
+ gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 2);
+
+ /* Force theming */
+ gtk_widget_set_state (eb, GTK_STATE_PRELIGHT);
+
+ /* Set quark(s) */
+ g_object_set_qdata (G_OBJECT (eb), entry_quark, (gpointer)entry);
+
+ if (date)
+ g_date_free (date);
+ g_free (blurb);
+
+ return eb;
+}
+
+/*
+ * Filters the entry depending on type
+ */
+static GtkWidget*
+contacts_history_make_preview (ContactsHistory *history,
+ MokoJournalEntry *entry)
+{
+ ContactsHistoryPrivate *priv;
+ GtkWidget *preview = NULL;
+ enum MessageDirection direction;
+
+ g_return_val_if_fail(CONTACTS_IS_HISTORY(history), NULL);
+ priv = CONTACTS_HISTORY_GET_PRIVATE (history);
+
+ if (!moko_journal_entry_get_direction (entry, &direction))
+ direction = DIRECTION_IN;
+
+ switch (moko_journal_entry_get_type (entry)) {
+ case EMAIL_JOURNAL_ENTRY:
+ preview = contacts_history_create_email_preview (entry, direction);
+ break;
+
+ case SMS_JOURNAL_ENTRY:
+ preview = contacts_history_create_sms_preview (entry, direction);
+ break;
+
+ case VOICE_JOURNAL_ENTRY:
+ preview = contacts_history_create_voice_preview (entry, direction);
+ break;
+
+ default:
+ break;
+ }
+
+ /* Hook up the signals */
+ if (!GTK_WIDGET_NO_WINDOW (preview)) {
+ g_signal_connect (G_OBJECT (preview), "button-press-event",
+ G_CALLBACK (contacts_history_button_pressed),
+ (gpointer)history);
+ g_signal_connect (G_OBJECT (preview), "button-release-event",
+ G_CALLBACK (contacts_history_button_released),
+ (gpointer)history);
+ }
+ return preview;
+}
+
+/* Sorts a list of MokoJournalEntrys by their date */
+static gint
+_sort_by_date (MokoJournalEntry *a, MokoJournalEntry *b)
+{
+ const MokoTime *time;
+ time_t t1;
+ time_t t2;
+
+ time = moko_journal_entry_get_dtstart (a);
+ t1 = moko_time_as_timet (time);
+
+ time = moko_journal_entry_get_dtstart (b);
+ t2 = moko_time_as_timet (time);
+
+ return -1 * (t1 - t2);
+}
+
+/*
+ * Will remove the current history, and create all the widgets again.
+*/
+static void
+contacts_history_refresh_ui (ContactsHistory *history)
+{
+ ContactsHistoryPrivate *priv;
+ GList *children, *c;
+
+ g_return_if_fail(CONTACTS_IS_HISTORY(history));
+ priv = CONTACTS_HISTORY_GET_PRIVATE (history);
+
+ g_return_if_fail (priv->journal);
+
+ if (!priv->uid)
+ return;
+
+ /* First we remove all of the existing history-widgets */
+ children = gtk_container_get_children (GTK_CONTAINER (history));
+ for (c = children; c != NULL; c = c->next) {
+ gtk_container_remove (GTK_CONTAINER (history), GTK_WIDGET (c->data));
+ }
+
+ g_list_free (children);
+ children = NULL;
+
+ /* Traverse though the Journal looking for all entries that
+ correspond to the the priv->uid
+ FIXME : MokoJournal should have a special function for this.
+ */
+ g_print ("%s\n", priv->uid);
+ gint len = moko_journal_get_nb_entries (priv->journal);
+ gint i;
+ for (i = 0; i < len; i++) {
+ MokoJournalEntry *entry = NULL;
+
+ if (moko_journal_get_entry_at (priv->journal, i, &entry)) {
+ if (strcmp (priv->uid, moko_journal_entry_get_contact_uid (entry)) == 0) {
+ children = g_list_append (children, entry);
+ }
+ }
+ }
+
+ /* Sort the list in order of time, most recent first */
+ children = g_list_sort (children, (GCompareFunc)_sort_by_date);
+
+ /* Finally, go through the sorted list creating the widgets and adding them */
+ for (c = children; c != NULL; c = c->next) {
+ GtkWidget *preview = NULL;
+ if ((preview = contacts_history_make_preview (history, c->data)))
+ gtk_box_pack_start (GTK_BOX (history), preview, FALSE, FALSE, 0);
+ }
+
+ gtk_widget_show_all (GTK_WIDGET (history));
+}
+
+void
+contacts_history_update_uid (ContactsHistory *history, const gchar *uid)
+{
+ g_return_if_fail (CONTACTS_IS_HISTORY (history));
+
+ g_object_set (G_OBJECT (history), "uid", uid, NULL);
+}
+
+/* GObject functions */
+
+static void
+contacts_history_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ContactsHistoryPrivate *priv;
+
+ g_return_if_fail(CONTACTS_IS_HISTORY(object));
+ priv = CONTACTS_HISTORY_GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_UID:
+ if (priv->uid)
+ g_free (priv->uid);
+ priv->uid = g_strdup (g_value_get_string (value));
+ contacts_history_refresh_ui (CONTACTS_HISTORY (object));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+contacts_history_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ContactsHistoryPrivate *priv;
+
+ g_return_if_fail(CONTACTS_IS_HISTORY(object));
+ priv = CONTACTS_HISTORY_GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_UID:
+ g_value_set_string (value, priv->uid);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
+contacts_history_finalize(GObject *obj)
+{
+ ContactsHistoryPrivate *priv;
+
+ g_return_if_fail(CONTACTS_IS_HISTORY(obj));
+
+ priv = CONTACTS_HISTORY_GET_PRIVATE (obj);
+
+ if (priv->uid)
+ g_free (priv->uid);
+
+ if (priv->journal)
+ moko_journal_close (priv->journal);
+
+ if (G_OBJECT_CLASS(parent_class)->finalize)
+ G_OBJECT_CLASS(parent_class)->finalize(obj);
+}
+
+static void
+contacts_history_class_init (ContactsHistoryClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ parent_class = GTK_VBOX_CLASS (klass);
+
+ gobject_class->finalize = contacts_history_finalize;
+ gobject_class->get_property = contacts_history_get_property;
+ gobject_class->set_property = contacts_history_set_property;
+
+ g_type_class_add_private (gobject_class, sizeof (ContactsHistoryPrivate));
+
+ /* Install class properties */
+ g_object_class_install_property (gobject_class,
+ PROP_UID,
+ g_param_spec_string ("uid",
+ "UID",
+ "The Contact uid",
+ NULL,
+ G_PARAM_CONSTRUCT|G_PARAM_READWRITE));
+
+ /* Class signals */
+ _history_signals[ACTIVATED] =
+ g_signal_new ("entry-activated",
+ G_OBJECT_CLASS_TYPE (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ContactsHistoryClass, entry_activated),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE, 1, G_TYPE_POINTER);
+}
+
+static void
+contacts_history_init (ContactsHistory *self)
+{
+ ContactsHistoryPrivate *priv;
+ GtkWidget *menu;
+ GtkWidget *item;
+
+ priv = CONTACTS_HISTORY_GET_PRIVATE (self);
+
+ /* Create the quarks */
+ entry_quark = g_quark_from_static_string("contacts-history-entry");
+ label_quark = g_quark_from_static_string("contacts-history-label");
+ shown_quark = g_quark_from_static_string("contacts-history-shown");
+ press_quark = g_quark_from_static_string("contacts-history-button-pressed");
+ preview_quark = g_quark_from_static_string ("contacts-histroy-preview");
+
+ /* Create the MokoJournal object */
+ priv->journal = moko_journal_open_default ();
+ if (!priv->journal)
+ return;
+
+ /* load all journal entries from the journal on storage*/
+ if (!moko_journal_load_from_storage (priv->journal)) {
+ g_warning ("Unable to load journal from storage\n") ;
+ return;
+ }
+
+ /* Create the popmenu for tap-and-hold */
+ menu = gtk_menu_new ();
+ priv->menu = menu;
+
+ item = gtk_menu_item_new_with_label ("Select");
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ g_signal_connect (G_OBJECT (item), "activate",
+ G_CALLBACK (contacts_history_preview_select),
+ (gpointer)self);
+
+ item = gtk_menu_item_new_with_label ("Open...");
+ priv->open_item = item;
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ g_signal_connect (G_OBJECT (item), "activate",
+ G_CALLBACK (contacts_history_preview_open),
+ (gpointer)self);
+
+ gtk_widget_show_all (menu);
+}
+
+GtkWidget*
+contacts_history_new (void)
+{
+ ContactsHistory *history;
+ history = g_object_new (CONTACTS_TYPE_HISTORY,
+ "homogeneous", FALSE,
+ "spacing", 1,
+ "border-width", 10,
+ NULL);
+
+ return GTK_WIDGET(history);
+}
Added: trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.h 2007-05-18 14:59:55 UTC (rev 2017)
+++ trunk/src/target/OM-2007/applications/openmoko-contacts/src/contacts-history.h 2007-05-18 15:00:58 UTC (rev 2018)
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2006-2007 by OpenMoko, Inc.
+ * Written by OpenedHand Ltd <info at openedhand.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <libmokojournal/moko-journal.h>
+
+#ifndef _CONTACTS_HISTORY_H
+#define _CONTACTS_HISTORY_H
+
+
+G_BEGIN_DECLS
+
+#define CONTACTS_TYPE_HISTORY contacts_history_get_type()
+
+#define CONTACTS_HISTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ CONTACTS_TYPE_HISTORY, \
+ ContactsHistory))
+
+#define CONTACTS_HISTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
+ CONTACTS_TYPE_HISTORY, \
+ ContactsHistoryClass))
+
+#define CONTACTS_IS_HISTORY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ CONTACTS_TYPE_HISTORY))
+
+#define CONTACTS_IS_HISTORY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ CONTACTS_TYPE_HISTORY))
+
+#define CONTACTS_HISTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\
+ CONTACTS_TYPE_HISTORY, \
+ ContactsHistoryClass))
+
+typedef struct _ContactsHistory ContactsHistory;
+typedef struct _ContactsHistoryClass ContactsHistoryClass;
+typedef struct _ContactsHistoryPrivate ContactsHistoryPrivate;
+
+struct _ContactsHistory
+{
+ GtkVBox parent;
+
+ /* private */
+ ContactsHistoryPrivate *priv;
+};
+
+struct _ContactsHistoryClass
+{
+ /* private */
+ GtkVBoxClass parent_class;
+
+ void (*entry_activated) (ContactsHistory*, MokoJournalEntry*);
+ void (*_moko_reserved_1) (void);
+ void (*_moko_reserved_2) (void);
+ void (*_moko_reserved_3) (void);
+ void (*_moko_reserved_4) (void);
+};
+
+GType contacts_history_get_type (void) G_GNUC_CONST;
+
+GtkWidget*
+contacts_history_new (void);
+
+void
+contacts_history_update_uid (ContactsHistory *history, const gchar *uid);
+
+G_END_DECLS
+
+#endif /*CONTACTS_HISTORY_H*/
+
More information about the commitlog
mailing list