r1596 - trunk/src/target/OM-2007/applications/openmoko-messages/src

mickey at sita.openmoko.org mickey at sita.openmoko.org
Sun Apr 1 12:58:58 CEST 2007


Author: mickey
Date: 2007-04-01 12:58:55 +0200 (Sun, 01 Apr 2007)
New Revision: 1596

Modified:
   trunk/src/target/OM-2007/applications/openmoko-messages/src/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.c
   trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.h
   trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.c
   trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.h
   trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.c
   trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.h
   trunk/src/target/OM-2007/applications/openmoko-messages/src/main.c
   trunk/src/target/OM-2007/applications/openmoko-messages/src/main.h
   trunk/src/target/OM-2007/applications/openmoko-messages/src/message.h
   trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.c
   trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.h
   trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.c
   trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.h
   trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.c
   trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.h
Log:
openmoko-messages: remove bogus windows line endings, fix build error. closes #333


Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/Makefile.am	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/Makefile.am	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,17 +1,17 @@
-AM_CPPFLAGS = -DDATADIR=\"$(datadir)\" \
-              -DPKGDATADIR=\"$(pkgdatadir)\"
-
-INCLUDES = -DPKGDATADIR=\"$(pkgdatadir)\" @OPENMOKO_CFLAGS@ -Wall -std=c99 -pedantic
-
-bin_PROGRAMS = openmoko-messages
-
-openmoko_messages_SOURCES = main.c main.h \
-                            foldersdb.c foldersdb.h \
-			    callbacks.c callbacks.h \
-			    detail-area.c detail-area.h \
-			    sms-dialog-window.c sms-dialog-window.h \
-			    sms-membership-window.c sms-membership-window.h \
-			    sms-contact-window.c sms-contact-window.h
-
-openmoko_messages_LDADD = @OPENMOKO_LIBS@
-
+AM_CPPFLAGS = -DDATADIR=\"$(datadir)\" \
+              -DPKGDATADIR=\"$(pkgdatadir)\"
+
+INCLUDES = -DPKGDATADIR=\"$(pkgdatadir)\" @OPENMOKO_CFLAGS@ -Wall -std=c99 -pedantic
+
+bin_PROGRAMS = openmoko-messages
+
+openmoko_messages_SOURCES = main.c main.h \
+                            foldersdb.c foldersdb.h \
+			    callbacks.c callbacks.h \
+			    detail-area.c detail-area.h \
+			    sms-dialog-window.c sms-dialog-window.h \
+			    sms-membership-window.c sms-membership-window.h \
+			    sms-contact-window.c sms-contact-window.h
+
+openmoko_messages_LDADD = @OPENMOKO_LIBS@
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.c	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.c	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,615 +1,615 @@
-/*
- *  callbacks.c
- *
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *
- *  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 Public License for more details.
- *
- *  Current Version: $Rev$ ($Date$) [$Author$]
- */
-
-
-#include "callbacks.h"
-#include "detail-area.h"
-#include "sms-contact-window.h"
-#include <gtk/gtk.h>
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-
-void cb_addressBtn_clicked (GtkButton* button, gpointer* data);
-void sms_contact_select_done (GtkWidget* widget, gpointer data);
-
-void
-send_signal_to_footer (DBusConnection* bus, gchar* message_str)
-{
-  DBusMessage *message;
-
-  if(message_str == NULL)
-    g_debug("Input string is null");
-  else
-    g_debug(message_str);
-
-  message = dbus_message_new_signal ("/org/openmoko/footer",
-                                     "org.openmoko.dbus.TaskManager",
-                                     "push_statusbar_message");
-  dbus_message_append_args (message,
-                            DBUS_TYPE_STRING, &message_str,
-                            DBUS_TYPE_INVALID);
-  dbus_connection_send (bus, message, NULL);
-  dbus_message_unref (message);
-}
-
-static gboolean
-model_number_helper (GtkTreeModel* model,
-                     GtkTreePath*  path,
-                     GtkTreeIter*  iter,
-                     gpointer      data)
-{
-  MessengerData* d = (MessengerData*)data;
-  d->msg_num ++;
-  return FALSE;
-}
-
-gint get_model_number (MessengerData* d)
-{
-  d->msg_num = 0;
-  gtk_tree_model_foreach (d->filter,model_number_helper,d);
-  return d->msg_num;
-}
-
-gboolean cb_filter_changed(GtkWidget* widget, gchar* text, MessengerData* d)
-{
-  d->currentfolder = g_strdup(text);
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
-  gchar* str = g_strdup_printf("folder %s has %d messages",text,get_model_number(d));
-  send_signal_to_footer(d->bus,str);
-
-  return FALSE;
-}
-
-void cb_new_sms (GtkMenuItem* item, MessengerData* d)
-{
-  SmsDialogWindow* sms_window = sms_dialog_window_new();
-  sms_dialog_window_set_title (sms_window,"New SMS");
-  gtk_window_set_decorated (GTK_WINDOW(sms_window), FALSE);
-  gtk_widget_show_all (GTK_WIDGET(sms_window));
-
-  g_signal_connect (G_OBJECT(sms_window->addressBtn),
-                    "clicked",
-                    G_CALLBACK(cb_addressBtn_clicked),
-                    sms_window->toEntry );
-}
-
-void cb_new_mail (GtkMenuItem* item, MessengerData* d)
-{
-  SmsDialogWindow* mail_window = sms_dialog_window_new();
-  mail_dialog_window_set_title (mail_window,"New Email");
-  gtk_window_set_decorated (GTK_WINDOW(mail_window), FALSE);
-  gtk_widget_show_all ( GTK_WIDGET(mail_window) );
-
-  g_signal_connect (G_OBJECT(mail_window->addressBtn),
-                    "clicked",
-                    G_CALLBACK(cb_addressBtn_clicked),
-                    mail_window->toEntry);
-}
-
-void cb_new_folder (GtkMenuItem* item, MessengerData* d)
-{
-  g_debug ("new folder called");
-  GtkWidget* hbox;
-  GtkWidget* nfResetBtn;
-  GtkWidget* nfConfirmBtn;
-
-  if ((d->nfWin != NULL) && (d->nfWin->window != NULL))
-    gtk_entry_set_text (GTK_ENTRY(d->nfEntry),"");
-  else
-    {
-      d->nfWin = moko_dialog_window_new();
-      GtkWidget* nfBox = gtk_vbox_new (FALSE,10);
-      gtk_widget_set_size_request (nfBox, 480, -1);
-      GtkWidget* nfAlign = gtk_alignment_new (0,0,1,1);
-      gtk_alignment_set_padding (GTK_ALIGNMENT(nfAlign), 100, 0, 30, 10);
-      moko_dialog_window_set_title ( MOKO_DIALOG_WINDOW(d->nfWin), "New Folder");
-
-      GtkWidget* nfLabel = gtk_label_new ("Please input new folder name:");
-      gtk_misc_set_alignment (GTK_MISC(nfLabel),0,0.5);
-      gtk_box_pack_start (GTK_BOX(nfBox), nfLabel, FALSE, TRUE, 0);
-
-      d->nfEntry = gtk_entry_new ();
-      gtk_box_pack_start (GTK_BOX(nfBox), d->nfEntry, FALSE, TRUE, 0);
-
-      hbox = gtk_hbox_new (FALSE,20);
-      nfConfirmBtn = gtk_button_new_with_label ("OK");
-      nfResetBtn = gtk_button_new_with_label ("Reset");
-      gtk_box_pack_start (GTK_BOX(hbox), nfConfirmBtn, FALSE, TRUE, 0);
-      gtk_box_pack_start (GTK_BOX(hbox), nfResetBtn, FALSE, TRUE, 0);
-      gtk_box_pack_start (GTK_BOX(nfBox), hbox, FALSE, TRUE, 0);
-
-      gtk_container_add (GTK_CONTAINER(nfAlign),nfBox);
-
-      moko_dialog_window_set_contents (MOKO_DIALOG_WINDOW(d->nfWin), nfAlign);
-      g_signal_connect (G_OBJECT(nfConfirmBtn),
-                        "clicked",
-                        G_CALLBACK(cb_nfBtn_clicked),
-                        d);
-      g_signal_connect (G_OBJECT(nfResetBtn),
-                        "clicked",
-                        G_CALLBACK(cb_nfResetBtn_clicked),
-                        d);
-    }
-  gtk_window_set_decorated (GTK_WINDOW(d->nfWin), FALSE);
-  gtk_widget_show_all (d->nfWin);
-}
-
-void cb_mode_read (GtkMenuItem* item, MessengerData* d)
-{
-  g_debug ("mode read");
-  message* msg;
-  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( d->view ));
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
-
-  if ( has_selection )
-    {
-      msg = g_malloc(sizeof(message));
-      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
-    }
-  else msg = NULL;
-  detail_read_message (DETAIL_AREA(d->details),msg);
-}
-
-void cb_mode_reply (GtkMenuItem* item, MessengerData* d)
-{
-  g_debug ("mode reply");
-  message* msg;
-  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( d->view ));
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
-
-  if ( has_selection )
-    {
-      msg = g_malloc(sizeof(message));
-      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
-    }
-  else msg = NULL;
-
-  SmsDialogWindow* sms_window = sms_dialog_window_new();
-  if (msg != NULL)
-    {
-      sms_dialog_window_set_title (sms_window,"Reply SMS");
-      sms_dialog_reply_message (sms_window,msg);
-    }
-  else sms_dialog_window_set_title (sms_window,"New SMS");
-  gtk_widget_show_all ( GTK_WIDGET(sms_window) );
-}
-
-void cb_mode_forward (GtkMenuItem* item, MessengerData* d)
-{
-  g_debug ("mode forward");
-  message* msg;
-  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( d->view ));
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
-
-  if ( has_selection )
-    {
-      msg = g_malloc(sizeof(message));
-      gtk_tree_model_get( model, &iter,
-                          COLUMN_FROM, &msg->name,
-                          COLUMN_SUBJECT, &msg->subject,
-                          COLUMN_FOLDER, &msg->folder,
-                          COLUMN_CONTENT, &msg->content,
-                          -1 );
-    }
-  else msg = NULL;
-
-  SmsDialogWindow* sms_window = sms_dialog_window_new();
-  sms_dialog_window_set_title (sms_window,"Forward SMS");
-  sms_dialog_forward_message (sms_window, msg);
-  gtk_widget_show_all ( GTK_WIDGET(sms_window) );
-}
-
-void cb_delete_folder (GtkMenuItem* item, MessengerData* d)
-{
-  g_debug ("delete folder called");
-  GtkWidget* msgDialog;
-
-  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
-  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
-  gchar* oldName = g_strdup (gtk_label_get_text (GTK_LABEL(menulabel)));
-  if (!g_strcasecmp(oldName,"Inbox")  ||
-      !g_strcasecmp(oldName,"Outbox") ||
-      !g_strcasecmp(oldName,"Draft")  ||
-      !g_strcasecmp(oldName,"Sent")   ||
-      !g_strcasecmp(oldName,"Trash"))
-    {
-      msgDialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
-                                          GTK_DIALOG_DESTROY_WITH_PARENT,
-                                          GTK_MESSAGE_WARNING,
-                                          GTK_BUTTONS_CLOSE,
-                                          g_strdup_printf("Current folder '%s'\nis not a custom folder\nCan't delete",oldName) );
-      gtk_dialog_run (GTK_DIALOG (msgDialog));
-      gtk_widget_destroy (msgDialog);
-    }
-  else
-    {
-      GtkWidget* dialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
-                          GTK_DIALOG_DESTROY_WITH_PARENT,
-                          GTK_MESSAGE_WARNING,
-                          GTK_BUTTONS_OK_CANCEL,
-                          g_strdup_printf("Are you sure to delete folder: %s",d->currentfolder));
-      gint result = gtk_dialog_run (GTK_DIALOG (dialog));
-      switch (result)
-        {
-        case GTK_RESPONSE_OK:
-          g_debug ("clicked ok");
-          delete_folder(d,oldName);
-          break;
-        case GTK_RESPONSE_CANCEL:
-          g_debug ("clicked cancel");
-          break;
-        default:
-          g_debug ("clicked default");
-          break;
-        }
-      gtk_widget_destroy (dialog);
-    }
-}
-
-void cb_delete_message (GtkMenuItem* item, MessengerData* d)
-{
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  GtkTreeIter childiter;
-  GtkTreeSelection* selection;
-
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(d->view));
-  gboolean has_selection = gtk_tree_selection_get_selected (selection, &model,&iter);
-  if (has_selection)
-    {
-      gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(d->filter),&childiter,&iter);
-      gtk_list_store_remove (d->liststore, &childiter);
-    }
-  else
-    {
-      GtkWidget* dialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
-                          GTK_DIALOG_DESTROY_WITH_PARENT,
-                          GTK_MESSAGE_WARNING,
-                          GTK_BUTTONS_OK,
-                          "No message selected");
-      gtk_dialog_run (GTK_DIALOG (dialog));
-      gtk_widget_destroy (dialog);
-    }
-}
-
-void cb_mmitem_activate (GtkMenuItem* item, MessengerData* d)
-{
-  g_debug ("message membership");
-  d->mmWin = sms_membership_window_new();
-  gtk_window_set_decorated (GTK_WINDOW(d->mmWin), FALSE);
-  sms_membership_window_set_messages (SMS_MEMBERSHIP_WINDOW(d->mmWin), d->liststore);
-  sms_membership_window_set_menubox (SMS_MEMBERSHIP_WINDOW(d->mmWin), d->folderlist);
-  sms_membership_window_show ( SMS_MEMBERSHIP_WINDOW(d->mmWin) );
-}
-
-void cb_frBtn_clicked (GtkButton* button, MessengerData* d)
-{
-  GSList *c;
-  gchar* folder;
-
-  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
-  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
-  gchar* oldName = g_strdup (gtk_label_get_text (GTK_LABEL(menulabel)));
-  gchar* newName = g_strdup (gtk_entry_get_text(GTK_ENTRY(d->frEntry)));
-  gtk_label_set_text (GTK_LABEL(menulabel),newName);
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
-
-  c = d->folderlist;
-  for (; c; c = g_slist_next(c) )
-    {
-      folder = (gchar*) c->data;
-      if (!g_strcasecmp(folder,oldName))
-        {
-          g_debug ("old %s, new %s", oldName, newName);
-          c->data = g_strdup(newName);
-        }
-    }
-  d->filtmenu = reload_filter_menu (d,d->folderlist);
-  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( MOKO_PANED_WINDOW(d->window) );
-  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
-  moko_menu_box_set_filter_menu(menubox, GTK_MENU(d->filtmenu));
-  gtk_widget_show_all (GTK_WIDGET(menubox));
-  gtk_widget_hide (d->frWin);
-}
-
-void cb_frResetBtn_clicked (GtkButton* button, GtkWidget* entry)
-{
-  gtk_entry_set_text(GTK_ENTRY(entry),"");
-}
-
-void cb_fnitem_activate (GtkMenuItem* item, MessengerData* d)
-{
-  g_debug ("folder rename called");
-  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
-  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
-
-  gchar* oldName = g_strdup (gtk_label_get_text (GTK_LABEL(menulabel)));
-  if (!g_strcasecmp(oldName,"Inbox") ||
-      !g_strcasecmp(oldName,"Outbox") ||
-      !g_strcasecmp(oldName,"Draft") ||
-      !g_strcasecmp(oldName,"Sent") ||
-      !g_strcasecmp(oldName,"Sent"))
-    {
-      GtkWidget* msgDialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
-                             GTK_DIALOG_DESTROY_WITH_PARENT,
-                             GTK_MESSAGE_WARNING,
-                             GTK_BUTTONS_CLOSE,
-                             g_strdup_printf("Current folder '%s'\nis not a custom folder\nCan't rename",oldName) );
-      gtk_dialog_run (GTK_DIALOG (msgDialog));
-      gtk_widget_destroy (msgDialog);
-    }
-  else
-    {
-      GtkWidget* hbox;
-      GtkWidget* frResetBtn;
-      GtkWidget* frConfirmBtn;
-
-      if ((d->frWin != NULL) && (d->frWin->window != NULL))
-        gtk_entry_set_text (GTK_ENTRY(d->frEntry),"");
-      else
-        {
-          d->frWin = moko_dialog_window_new();
-          GtkWidget* frBox = gtk_vbox_new (FALSE,10);
-          gtk_widget_set_size_request (frBox, 480, -1);
-          GtkWidget* frAlign = gtk_alignment_new (0,0,1,1);
-          gtk_alignment_set_padding (GTK_ALIGNMENT(frAlign), 100, 0, 30, 10);
-          moko_dialog_window_set_title (MOKO_DIALOG_WINDOW(d->frWin), "Folder Rename");
-
-          GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
-          GtkWidget* menulabel = GTK_BIN(menuitem)->child;
-          GtkWidget* frLabel = gtk_label_new (g_strdup_printf("Please input new folder name for %s:",	gtk_label_get_text (GTK_LABEL(menulabel))));
-          gtk_misc_set_alignment (GTK_MISC(frLabel),0,0.5);
-          gtk_box_pack_start (GTK_BOX(frBox), frLabel, FALSE, TRUE, 0);
-
-          d->frEntry = gtk_entry_new ();
-          gtk_box_pack_start (GTK_BOX(frBox), d->frEntry, FALSE, TRUE, 0);
-
-          hbox = gtk_hbox_new (FALSE,20);
-          frConfirmBtn = gtk_button_new_with_label ("OK");
-          frResetBtn = gtk_button_new_with_label ("Reset");
-          gtk_box_pack_start (GTK_BOX(hbox), frConfirmBtn, FALSE, TRUE, 0);
-          gtk_box_pack_start (GTK_BOX(hbox), frResetBtn, FALSE, TRUE, 0);
-          gtk_box_pack_start (GTK_BOX(frBox), hbox, FALSE, TRUE, 0);
-          gtk_container_add (GTK_CONTAINER(frAlign),frBox);
-
-          moko_dialog_window_set_contents (MOKO_DIALOG_WINDOW(d->frWin), frAlign);
-          g_signal_connect (G_OBJECT(frConfirmBtn),
-                            "clicked",
-                            G_CALLBACK(cb_frBtn_clicked),
-                            d);
-          g_signal_connect (G_OBJECT(frResetBtn),
-                            "clicked",
-                            G_CALLBACK(cb_frResetBtn_clicked),
-                            d->frEntry);
-        }
-      gtk_widget_show_all ( GTK_WIDGET(d->frWin) );
-    }
-}
-
-void cb_nfBtn_clicked (GtkButton* button, MessengerData* d)
-{
-  gchar* folder = g_strdup(gtk_entry_get_text(GTK_ENTRY(d->nfEntry)));
-  g_debug ("new folder %s",folder);
-  d->folderlist = g_slist_append (d->folderlist,folder);
-  d->filtmenu = reload_filter_menu (d,d->folderlist);
-  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( d->window );
-  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
-  moko_menu_box_set_filter_menu(menubox,GTK_MENU(d->filtmenu));
-  gtk_widget_show_all (GTK_WIDGET(menubox));
-  foldersdb_update (d->folderlist);
-  update_folder_sensitive(d, d->folderlist);
-  gtk_widget_hide (d->nfWin);
-}
-
-void cb_nfResetBtn_clicked (GtkButton* button, MessengerData* d)
-{
-  gtk_entry_set_text(GTK_ENTRY(d->nfEntry),"");
-  g_debug ("reset entry");
-}
-
-void cb_dfBtn_clicked (GtkButton* button, MessengerData* d)
-{
-  GSList* c;
-
-  for( c =d->folderlist; c; c=g_slist_next(c))
-    {
-      if(!g_strcasecmp((gchar*)c->data, d->currentfolder))
-        {
-          d->folderlist = g_slist_remove (d->folderlist, c->data);
-          break;
-        }
-    }
-
-  d->filtmenu = reload_filter_menu (d,d->folderlist);
-  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( MOKO_PANED_WINDOW(d->window) );
-  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
-  moko_menu_box_set_filter_menu(menubox,GTK_MENU(d->filtmenu));
-
-  /*set the default filter item to "Inbox" */
-  gchar* str = g_strdup("Inbox");
-  moko_menu_box_set_active_filter (menubox,str);
-  gtk_widget_show_all (GTK_WIDGET(menubox));
-  update_folder_sensitive (d, d->folderlist);
-
-  /*result inform */
-  GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_parent_window(GTK_WIDGET(button))),
-                      GTK_DIALOG_DESTROY_WITH_PARENT,
-                      GTK_MESSAGE_INFO,
-                      GTK_BUTTONS_CLOSE,
-                      "Delete successful");
-  gtk_dialog_run (GTK_DIALOG (dialog));
-  gtk_widget_destroy (dialog);
-}
-
-void delete_folder (MessengerData* d, gchar* oldName)
-{
-  GSList* c;
-
-  for( c =d->folderlist; c; c=g_slist_next(c))
-    {
-      if(!g_strcasecmp((gchar*)c->data, oldName))
-        {
-          d->folderlist = g_slist_remove (d->folderlist, c->data);
-          break;
-        }
-    }
-
-  d->filtmenu = reload_filter_menu (d,d->folderlist);
-  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( MOKO_PANED_WINDOW(d->window) );
-  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
-  moko_menu_box_set_filter_menu(menubox,GTK_MENU(d->filtmenu));
-
-  /*set the default filter item to "Inbox" */
-  gchar* str = g_strdup("Inbox");
-  moko_menu_box_set_active_filter (menubox,str);
-  gtk_widget_show_all (GTK_WIDGET(menubox));
-  update_folder_sensitive (d, d->folderlist);
-}
-
-void on_mmode_rdo_btn_clicked (gchar* folder)
-{
-  g_debug ("switch to %s folder", folder);
-}
-
-void cb_cursor_changed(GtkTreeSelection* selection, MessengerData* d)
-{
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  GtkTreeIter childiter;
-  GtkTreeView* view;
-  message* msg;
-  GdkPixbuf* icon;
-  GError*   error = NULL;
-
-  view = gtk_tree_selection_get_tree_view( selection );
-  if ( gtk_tree_selection_get_selected( selection, &model, &iter ) )
-    {
-      msg = g_malloc(sizeof(message));
-      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_STATUS, &msg->status, -1);
-
-      if (msg->status == UNREAD)
-        {
-          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Read.png", &error);
-          msg->status = READ;
-          gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(d->filter),&childiter,&iter);
-          gtk_list_store_set (d->liststore, &childiter,
-                              COLUMN_ICON, icon,
-                              COLUMN_STATUS, msg->status,
-                              -1);
-        }
-      detail_read_message (DETAIL_AREA(d->details),msg);
-    }
-}
-
-void
-on_btnsend_clicked                 (GtkButton       *button,
-                                    gpointer         user_data)
-{
-  g_debug("Button send clicked\n");
-}
-
-void
-on_btn_address_clicked                 (GtkButton       *button,
-                                        gpointer         user_data)
-{
-  g_debug("Button address clicked\n");
-}
-
-void cb_search_entry_changed (GtkEditable* editable, MessengerData* d)
-{
-  GtkWidget* search_entry = GTK_WIDGET(editable);
-  d->s_key = g_strdup (gtk_entry_get_text(GTK_ENTRY(search_entry)));
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
-  g_debug ("search %s, result has %d messages",d->s_key,get_model_number(d));
-  gchar* str = g_strdup_printf("search %s, result has %d messages",d->s_key,get_model_number(d));
-  send_signal_to_footer(d->bus,str);
-}
-
-void cb_search_on (MessengerData* d)
-{
-  g_debug ("search on");
-  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
-  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
-  gtk_label_set_text (GTK_LABEL(menulabel),"Search Result");
-  d->searchOn = TRUE;
-}
-
-void cb_search_off (MessengerData* d)
-{
-  g_debug ("search off ");
-  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
-  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
-  gtk_label_set_text (GTK_LABEL(menulabel),"Inbox");
-  d->searchOn = FALSE;
-  GtkWidget* search_entry = GTK_WIDGET(moko_tool_box_get_entry (MOKO_TOOL_BOX(d->toolbox)));
-  gtk_entry_set_text (GTK_ENTRY(search_entry), "");
-  d->s_key = "";
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
-}
-
-void cb_addressBtn_clicked (GtkButton* button, gpointer* data)
-{
-  GtkWidget* contactWin = sms_contact_new();
-  gtk_window_set_decorated (GTK_WINDOW(contactWin),FALSE);
-  GtkWidget* toEntry = (GtkWidget*)data;
-  g_signal_connect (G_OBJECT(contactWin),"contact_select_done",
-                    G_CALLBACK(sms_contact_select_done), toEntry);
-  gtk_widget_show(contactWin);
-}
-
-void sms_contact_select_done (GtkWidget* widget, gpointer data)
-{
-  g_debug("sms select contact done");
-  GtkWidget* toEntry = (GtkWidget*)data;
-  GList* contacts = sms_get_selected_contacts(SMS_CONTACT_WINDOW(widget));
-  g_debug ("start to add %d contacts to entry", g_list_length(contacts));
-  gchar* nameList = NULL;
-  gchar* name;
-  GList* nextContext = contacts;
-  EContact *contact;
-  for ( ; nextContext != NULL; nextContext = nextContext->next){
-    contact =  E_CONTACT (nextContext->data);
-    name = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
-    if (nameList == NULL)
-      nameList = g_strdup (name);
-    else
-      nameList = g_strconcat (nameList,",",name,NULL);
-    g_debug(nameList);
-  }
-  if (strlen(gtk_entry_get_text (GTK_ENTRY(toEntry))) > 0)
-    gtk_entry_append_text (GTK_ENTRY(toEntry),g_strdup_printf(",%s",nameList));
-  else
-    gtk_entry_set_text (GTK_ENTRY(toEntry),nameList);
-  g_free(nameList);
-  g_free(name);
-}
-
+/*
+ *  callbacks.c
+ *
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+
+#include "callbacks.h"
+#include "detail-area.h"
+#include "sms-contact-window.h"
+#include <gtk/gtk.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+
+void cb_addressBtn_clicked (GtkButton* button, gpointer* data);
+void sms_contact_select_done (GtkWidget* widget, gpointer data);
+
+void
+send_signal_to_footer (DBusConnection* bus, gchar* message_str)
+{
+  DBusMessage *message;
+
+  if(message_str == NULL)
+    g_debug("Input string is null");
+  else
+    g_debug(message_str);
+
+  message = dbus_message_new_signal ("/org/openmoko/footer",
+                                     "org.openmoko.dbus.TaskManager",
+                                     "push_statusbar_message");
+  dbus_message_append_args (message,
+                            DBUS_TYPE_STRING, &message_str,
+                            DBUS_TYPE_INVALID);
+  dbus_connection_send (bus, message, NULL);
+  dbus_message_unref (message);
+}
+
+static gboolean
+model_number_helper (GtkTreeModel* model,
+                     GtkTreePath*  path,
+                     GtkTreeIter*  iter,
+                     gpointer      data)
+{
+  MessengerData* d = (MessengerData*)data;
+  d->msg_num ++;
+  return FALSE;
+}
+
+gint get_model_number (MessengerData* d)
+{
+  d->msg_num = 0;
+  gtk_tree_model_foreach (d->filter,model_number_helper,d);
+  return d->msg_num;
+}
+
+gboolean cb_filter_changed(GtkWidget* widget, gchar* text, MessengerData* d)
+{
+  d->currentfolder = g_strdup(text);
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
+  gchar* str = g_strdup_printf("folder %s has %d messages",text,get_model_number(d));
+  send_signal_to_footer(d->bus,str);
+
+  return FALSE;
+}
+
+void cb_new_sms (GtkMenuItem* item, MessengerData* d)
+{
+  SmsDialogWindow* sms_window = sms_dialog_window_new();
+  sms_dialog_window_set_title (sms_window,"New SMS");
+  gtk_window_set_decorated (GTK_WINDOW(sms_window), FALSE);
+  gtk_widget_show_all (GTK_WIDGET(sms_window));
+
+  g_signal_connect (G_OBJECT(sms_window->addressBtn),
+                    "clicked",
+                    G_CALLBACK(cb_addressBtn_clicked),
+                    sms_window->toEntry );
+}
+
+void cb_new_mail (GtkMenuItem* item, MessengerData* d)
+{
+  SmsDialogWindow* mail_window = sms_dialog_window_new();
+  mail_dialog_window_set_title (mail_window,"New Email");
+  gtk_window_set_decorated (GTK_WINDOW(mail_window), FALSE);
+  gtk_widget_show_all ( GTK_WIDGET(mail_window) );
+
+  g_signal_connect (G_OBJECT(mail_window->addressBtn),
+                    "clicked",
+                    G_CALLBACK(cb_addressBtn_clicked),
+                    mail_window->toEntry);
+}
+
+void cb_new_folder (GtkMenuItem* item, MessengerData* d)
+{
+  g_debug ("new folder called");
+  GtkWidget* hbox;
+  GtkWidget* nfResetBtn;
+  GtkWidget* nfConfirmBtn;
+
+  if ((d->nfWin != NULL) && (d->nfWin->window != NULL))
+    gtk_entry_set_text (GTK_ENTRY(d->nfEntry),"");
+  else
+    {
+      d->nfWin = moko_dialog_window_new();
+      GtkWidget* nfBox = gtk_vbox_new (FALSE,10);
+      gtk_widget_set_size_request (nfBox, 480, -1);
+      GtkWidget* nfAlign = gtk_alignment_new (0,0,1,1);
+      gtk_alignment_set_padding (GTK_ALIGNMENT(nfAlign), 100, 0, 30, 10);
+      moko_dialog_window_set_title ( MOKO_DIALOG_WINDOW(d->nfWin), "New Folder");
+
+      GtkWidget* nfLabel = gtk_label_new ("Please input new folder name:");
+      gtk_misc_set_alignment (GTK_MISC(nfLabel),0,0.5);
+      gtk_box_pack_start (GTK_BOX(nfBox), nfLabel, FALSE, TRUE, 0);
+
+      d->nfEntry = gtk_entry_new ();
+      gtk_box_pack_start (GTK_BOX(nfBox), d->nfEntry, FALSE, TRUE, 0);
+
+      hbox = gtk_hbox_new (FALSE,20);
+      nfConfirmBtn = gtk_button_new_with_label ("OK");
+      nfResetBtn = gtk_button_new_with_label ("Reset");
+      gtk_box_pack_start (GTK_BOX(hbox), nfConfirmBtn, FALSE, TRUE, 0);
+      gtk_box_pack_start (GTK_BOX(hbox), nfResetBtn, FALSE, TRUE, 0);
+      gtk_box_pack_start (GTK_BOX(nfBox), hbox, FALSE, TRUE, 0);
+
+      gtk_container_add (GTK_CONTAINER(nfAlign),nfBox);
+
+      moko_dialog_window_set_contents (MOKO_DIALOG_WINDOW(d->nfWin), nfAlign);
+      g_signal_connect (G_OBJECT(nfConfirmBtn),
+                        "clicked",
+                        G_CALLBACK(cb_nfBtn_clicked),
+                        d);
+      g_signal_connect (G_OBJECT(nfResetBtn),
+                        "clicked",
+                        G_CALLBACK(cb_nfResetBtn_clicked),
+                        d);
+    }
+  gtk_window_set_decorated (GTK_WINDOW(d->nfWin), FALSE);
+  gtk_widget_show_all (d->nfWin);
+}
+
+void cb_mode_read (GtkMenuItem* item, MessengerData* d)
+{
+  g_debug ("mode read");
+  message* msg;
+  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( d->view ));
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+
+  if ( has_selection )
+    {
+      msg = g_malloc(sizeof(message));
+      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
+    }
+  else msg = NULL;
+  detail_read_message (DETAIL_AREA(d->details),msg);
+}
+
+void cb_mode_reply (GtkMenuItem* item, MessengerData* d)
+{
+  g_debug ("mode reply");
+  message* msg;
+  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( d->view ));
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+
+  if ( has_selection )
+    {
+      msg = g_malloc(sizeof(message));
+      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
+    }
+  else msg = NULL;
+
+  SmsDialogWindow* sms_window = sms_dialog_window_new();
+  if (msg != NULL)
+    {
+      sms_dialog_window_set_title (sms_window,"Reply SMS");
+      sms_dialog_reply_message (sms_window,msg);
+    }
+  else sms_dialog_window_set_title (sms_window,"New SMS");
+  gtk_widget_show_all ( GTK_WIDGET(sms_window) );
+}
+
+void cb_mode_forward (GtkMenuItem* item, MessengerData* d)
+{
+  g_debug ("mode forward");
+  message* msg;
+  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW( d->view ));
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+
+  if ( has_selection )
+    {
+      msg = g_malloc(sizeof(message));
+      gtk_tree_model_get( model, &iter,
+                          COLUMN_FROM, &msg->name,
+                          COLUMN_SUBJECT, &msg->subject,
+                          COLUMN_FOLDER, &msg->folder,
+                          COLUMN_CONTENT, &msg->content,
+                          -1 );
+    }
+  else msg = NULL;
+
+  SmsDialogWindow* sms_window = sms_dialog_window_new();
+  sms_dialog_window_set_title (sms_window,"Forward SMS");
+  sms_dialog_forward_message (sms_window, msg);
+  gtk_widget_show_all ( GTK_WIDGET(sms_window) );
+}
+
+void cb_delete_folder (GtkMenuItem* item, MessengerData* d)
+{
+  g_debug ("delete folder called");
+  GtkWidget* msgDialog;
+
+  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
+  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
+  gchar* oldName = g_strdup (gtk_label_get_text (GTK_LABEL(menulabel)));
+  if (!g_strcasecmp(oldName,"Inbox")  ||
+      !g_strcasecmp(oldName,"Outbox") ||
+      !g_strcasecmp(oldName,"Draft")  ||
+      !g_strcasecmp(oldName,"Sent")   ||
+      !g_strcasecmp(oldName,"Trash"))
+    {
+      msgDialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
+                                          GTK_DIALOG_DESTROY_WITH_PARENT,
+                                          GTK_MESSAGE_WARNING,
+                                          GTK_BUTTONS_CLOSE,
+                                          g_strdup_printf("Current folder '%s'\nis not a custom folder\nCan't delete",oldName) );
+      gtk_dialog_run (GTK_DIALOG (msgDialog));
+      gtk_widget_destroy (msgDialog);
+    }
+  else
+    {
+      GtkWidget* dialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
+                          GTK_DIALOG_DESTROY_WITH_PARENT,
+                          GTK_MESSAGE_WARNING,
+                          GTK_BUTTONS_OK_CANCEL,
+                          g_strdup_printf("Are you sure to delete folder: %s",d->currentfolder));
+      gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+      switch (result)
+        {
+        case GTK_RESPONSE_OK:
+          g_debug ("clicked ok");
+          delete_folder(d,oldName);
+          break;
+        case GTK_RESPONSE_CANCEL:
+          g_debug ("clicked cancel");
+          break;
+        default:
+          g_debug ("clicked default");
+          break;
+        }
+      gtk_widget_destroy (dialog);
+    }
+}
+
+void cb_delete_message (GtkMenuItem* item, MessengerData* d)
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  GtkTreeIter childiter;
+  GtkTreeSelection* selection;
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(d->view));
+  gboolean has_selection = gtk_tree_selection_get_selected (selection, &model,&iter);
+  if (has_selection)
+    {
+      gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(d->filter),&childiter,&iter);
+      gtk_list_store_remove (d->liststore, &childiter);
+    }
+  else
+    {
+      GtkWidget* dialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
+                          GTK_DIALOG_DESTROY_WITH_PARENT,
+                          GTK_MESSAGE_WARNING,
+                          GTK_BUTTONS_OK,
+                          "No message selected");
+      gtk_dialog_run (GTK_DIALOG (dialog));
+      gtk_widget_destroy (dialog);
+    }
+}
+
+void cb_mmitem_activate (GtkMenuItem* item, MessengerData* d)
+{
+  g_debug ("message membership");
+  d->mmWin = sms_membership_window_new();
+  gtk_window_set_decorated (GTK_WINDOW(d->mmWin), FALSE);
+  sms_membership_window_set_messages (SMS_MEMBERSHIP_WINDOW(d->mmWin), d->liststore);
+  sms_membership_window_set_menubox (SMS_MEMBERSHIP_WINDOW(d->mmWin), d->folderlist);
+  sms_membership_window_show ( SMS_MEMBERSHIP_WINDOW(d->mmWin) );
+}
+
+void cb_frBtn_clicked (GtkButton* button, MessengerData* d)
+{
+  GSList *c;
+  gchar* folder;
+
+  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
+  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
+  gchar* oldName = g_strdup (gtk_label_get_text (GTK_LABEL(menulabel)));
+  gchar* newName = g_strdup (gtk_entry_get_text(GTK_ENTRY(d->frEntry)));
+  gtk_label_set_text (GTK_LABEL(menulabel),newName);
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
+
+  c = d->folderlist;
+  for (; c; c = g_slist_next(c) )
+    {
+      folder = (gchar*) c->data;
+      if (!g_strcasecmp(folder,oldName))
+        {
+          g_debug ("old %s, new %s", oldName, newName);
+          c->data = g_strdup(newName);
+        }
+    }
+  d->filtmenu = reload_filter_menu (d,d->folderlist);
+  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( MOKO_PANED_WINDOW(d->window) );
+  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
+  moko_menu_box_set_filter_menu(menubox, GTK_MENU(d->filtmenu));
+  gtk_widget_show_all (GTK_WIDGET(menubox));
+  gtk_widget_hide (d->frWin);
+}
+
+void cb_frResetBtn_clicked (GtkButton* button, GtkWidget* entry)
+{
+  gtk_entry_set_text(GTK_ENTRY(entry),"");
+}
+
+void cb_fnitem_activate (GtkMenuItem* item, MessengerData* d)
+{
+  g_debug ("folder rename called");
+  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
+  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
+
+  gchar* oldName = g_strdup (gtk_label_get_text (GTK_LABEL(menulabel)));
+  if (!g_strcasecmp(oldName,"Inbox") ||
+      !g_strcasecmp(oldName,"Outbox") ||
+      !g_strcasecmp(oldName,"Draft") ||
+      !g_strcasecmp(oldName,"Sent") ||
+      !g_strcasecmp(oldName,"Sent"))
+    {
+      GtkWidget* msgDialog = gtk_message_dialog_new( GTK_WINDOW(moko_application_get_main_window(d->app)),
+                             GTK_DIALOG_DESTROY_WITH_PARENT,
+                             GTK_MESSAGE_WARNING,
+                             GTK_BUTTONS_CLOSE,
+                             g_strdup_printf("Current folder '%s'\nis not a custom folder\nCan't rename",oldName) );
+      gtk_dialog_run (GTK_DIALOG (msgDialog));
+      gtk_widget_destroy (msgDialog);
+    }
+  else
+    {
+      GtkWidget* hbox;
+      GtkWidget* frResetBtn;
+      GtkWidget* frConfirmBtn;
+
+      if ((d->frWin != NULL) && (d->frWin->window != NULL))
+        gtk_entry_set_text (GTK_ENTRY(d->frEntry),"");
+      else
+        {
+          d->frWin = moko_dialog_window_new();
+          GtkWidget* frBox = gtk_vbox_new (FALSE,10);
+          gtk_widget_set_size_request (frBox, 480, -1);
+          GtkWidget* frAlign = gtk_alignment_new (0,0,1,1);
+          gtk_alignment_set_padding (GTK_ALIGNMENT(frAlign), 100, 0, 30, 10);
+          moko_dialog_window_set_title (MOKO_DIALOG_WINDOW(d->frWin), "Folder Rename");
+
+          GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
+          GtkWidget* menulabel = GTK_BIN(menuitem)->child;
+          GtkWidget* frLabel = gtk_label_new (g_strdup_printf("Please input new folder name for %s:",	gtk_label_get_text (GTK_LABEL(menulabel))));
+          gtk_misc_set_alignment (GTK_MISC(frLabel),0,0.5);
+          gtk_box_pack_start (GTK_BOX(frBox), frLabel, FALSE, TRUE, 0);
+
+          d->frEntry = gtk_entry_new ();
+          gtk_box_pack_start (GTK_BOX(frBox), d->frEntry, FALSE, TRUE, 0);
+
+          hbox = gtk_hbox_new (FALSE,20);
+          frConfirmBtn = gtk_button_new_with_label ("OK");
+          frResetBtn = gtk_button_new_with_label ("Reset");
+          gtk_box_pack_start (GTK_BOX(hbox), frConfirmBtn, FALSE, TRUE, 0);
+          gtk_box_pack_start (GTK_BOX(hbox), frResetBtn, FALSE, TRUE, 0);
+          gtk_box_pack_start (GTK_BOX(frBox), hbox, FALSE, TRUE, 0);
+          gtk_container_add (GTK_CONTAINER(frAlign),frBox);
+
+          moko_dialog_window_set_contents (MOKO_DIALOG_WINDOW(d->frWin), frAlign);
+          g_signal_connect (G_OBJECT(frConfirmBtn),
+                            "clicked",
+                            G_CALLBACK(cb_frBtn_clicked),
+                            d);
+          g_signal_connect (G_OBJECT(frResetBtn),
+                            "clicked",
+                            G_CALLBACK(cb_frResetBtn_clicked),
+                            d->frEntry);
+        }
+      gtk_widget_show_all ( GTK_WIDGET(d->frWin) );
+    }
+}
+
+void cb_nfBtn_clicked (GtkButton* button, MessengerData* d)
+{
+  gchar* folder = g_strdup(gtk_entry_get_text(GTK_ENTRY(d->nfEntry)));
+  g_debug ("new folder %s",folder);
+  d->folderlist = g_slist_append (d->folderlist,folder);
+  d->filtmenu = reload_filter_menu (d,d->folderlist);
+  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( d->window );
+  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
+  moko_menu_box_set_filter_menu(menubox,GTK_MENU(d->filtmenu));
+  gtk_widget_show_all (GTK_WIDGET(menubox));
+  foldersdb_update (d->folderlist);
+  update_folder_sensitive(d, d->folderlist);
+  gtk_widget_hide (d->nfWin);
+}
+
+void cb_nfResetBtn_clicked (GtkButton* button, MessengerData* d)
+{
+  gtk_entry_set_text(GTK_ENTRY(d->nfEntry),"");
+  g_debug ("reset entry");
+}
+
+void cb_dfBtn_clicked (GtkButton* button, MessengerData* d)
+{
+  GSList* c;
+
+  for( c =d->folderlist; c; c=g_slist_next(c))
+    {
+      if(!g_strcasecmp((gchar*)c->data, d->currentfolder))
+        {
+          d->folderlist = g_slist_remove (d->folderlist, c->data);
+          break;
+        }
+    }
+
+  d->filtmenu = reload_filter_menu (d,d->folderlist);
+  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( MOKO_PANED_WINDOW(d->window) );
+  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
+  moko_menu_box_set_filter_menu(menubox,GTK_MENU(d->filtmenu));
+
+  /*set the default filter item to "Inbox" */
+  gchar* str = g_strdup("Inbox");
+  moko_menu_box_set_active_filter (menubox,str);
+  gtk_widget_show_all (GTK_WIDGET(menubox));
+  update_folder_sensitive (d, d->folderlist);
+
+  /*result inform */
+  GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_parent_window(GTK_WIDGET(button))),
+                      GTK_DIALOG_DESTROY_WITH_PARENT,
+                      GTK_MESSAGE_INFO,
+                      GTK_BUTTONS_CLOSE,
+                      "Delete successful");
+  gtk_dialog_run (GTK_DIALOG (dialog));
+  gtk_widget_destroy (dialog);
+}
+
+void delete_folder (MessengerData* d, gchar* oldName)
+{
+  GSList* c;
+
+  for( c =d->folderlist; c; c=g_slist_next(c))
+    {
+      if(!g_strcasecmp((gchar*)c->data, oldName))
+        {
+          d->folderlist = g_slist_remove (d->folderlist, c->data);
+          break;
+        }
+    }
+
+  d->filtmenu = reload_filter_menu (d,d->folderlist);
+  MokoMenuBox* menubox = (MokoMenuBox*)moko_paned_window_get_menubox( MOKO_PANED_WINDOW(d->window) );
+  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
+  moko_menu_box_set_filter_menu(menubox,GTK_MENU(d->filtmenu));
+
+  /*set the default filter item to "Inbox" */
+  gchar* str = g_strdup("Inbox");
+  moko_menu_box_set_active_filter (menubox,str);
+  gtk_widget_show_all (GTK_WIDGET(menubox));
+  update_folder_sensitive (d, d->folderlist);
+}
+
+void on_mmode_rdo_btn_clicked (gchar* folder)
+{
+  g_debug ("switch to %s folder", folder);
+}
+
+void cb_cursor_changed(GtkTreeSelection* selection, MessengerData* d)
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  GtkTreeIter childiter;
+  GtkTreeView* view;
+  message* msg;
+  GdkPixbuf* icon;
+  GError*   error = NULL;
+
+  view = gtk_tree_selection_get_tree_view( selection );
+  if ( gtk_tree_selection_get_selected( selection, &model, &iter ) )
+    {
+      msg = g_malloc(sizeof(message));
+      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_STATUS, &msg->status, -1);
+
+      if (msg->status == UNREAD)
+        {
+          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Read.png", &error);
+          msg->status = READ;
+          gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(d->filter),&childiter,&iter);
+          gtk_list_store_set (d->liststore, &childiter,
+                              COLUMN_ICON, icon,
+                              COLUMN_STATUS, msg->status,
+                              -1);
+        }
+      detail_read_message (DETAIL_AREA(d->details),msg);
+    }
+}
+
+void
+on_btnsend_clicked                 (GtkButton       *button,
+                                    gpointer         user_data)
+{
+  g_debug("Button send clicked\n");
+}
+
+void
+on_btn_address_clicked                 (GtkButton       *button,
+                                        gpointer         user_data)
+{
+  g_debug("Button address clicked\n");
+}
+
+void cb_search_entry_changed (GtkEditable* editable, MessengerData* d)
+{
+  GtkWidget* search_entry = GTK_WIDGET(editable);
+  d->s_key = g_strdup (gtk_entry_get_text(GTK_ENTRY(search_entry)));
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
+  g_debug ("search %s, result has %d messages",d->s_key,get_model_number(d));
+  gchar* str = g_strdup_printf("search %s, result has %d messages",d->s_key,get_model_number(d));
+  send_signal_to_footer(d->bus,str);
+}
+
+void cb_search_on (MessengerData* d)
+{
+  g_debug ("search on");
+  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
+  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
+  gtk_label_set_text (GTK_LABEL(menulabel),"Search Result");
+  d->searchOn = TRUE;
+}
+
+void cb_search_off (MessengerData* d)
+{
+  g_debug ("search off ");
+  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
+  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
+  gtk_label_set_text (GTK_LABEL(menulabel),"Inbox");
+  d->searchOn = FALSE;
+  GtkWidget* search_entry = GTK_WIDGET(moko_tool_box_get_entry (MOKO_TOOL_BOX(d->toolbox)));
+  gtk_entry_set_text (GTK_ENTRY(search_entry), "");
+  d->s_key = "";
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
+}
+
+void cb_addressBtn_clicked (GtkButton* button, gpointer* data)
+{
+  GtkWidget* contactWin = sms_contact_new();
+  gtk_window_set_decorated (GTK_WINDOW(contactWin),FALSE);
+  GtkWidget* toEntry = (GtkWidget*)data;
+  g_signal_connect (G_OBJECT(contactWin),"contact_select_done",
+                    G_CALLBACK(sms_contact_select_done), toEntry);
+  gtk_widget_show(contactWin);
+}
+
+void sms_contact_select_done (GtkWidget* widget, gpointer data)
+{
+  g_debug("sms select contact done");
+  GtkWidget* toEntry = (GtkWidget*)data;
+  GList* contacts = sms_get_selected_contacts(SMS_CONTACT_WINDOW(widget));
+  g_debug ("start to add %d contacts to entry", g_list_length(contacts));
+  gchar* nameList = NULL;
+  gchar* name;
+  GList* nextContext = contacts;
+  EContact *contact;
+  for ( ; nextContext != NULL; nextContext = nextContext->next){
+    contact =  E_CONTACT (nextContext->data);
+    name = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
+    if (nameList == NULL)
+      nameList = g_strdup (name);
+    else
+      nameList = g_strconcat (nameList,",",name,NULL);
+    g_debug(nameList);
+  }
+  if (strlen(gtk_entry_get_text (GTK_ENTRY(toEntry))) > 0)
+    gtk_entry_append_text (GTK_ENTRY(toEntry),g_strdup_printf(",%s",nameList));
+  else
+    gtk_entry_set_text (GTK_ENTRY(toEntry),nameList);
+  g_free(nameList);
+  g_free(name);
+}
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/callbacks.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,60 +1,60 @@
-/*
- *  callbacks.h 
- *
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *
- *  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 Public License for more details.
- *
- *  Current Version: $Rev$ ($Date$) [$Author$]
- */
-
-#ifndef _CALLBACKS_H_
-#define _CALLBACKS_H_
-
-#include <gtk/gtk.h>
-#include "sms-dialog-window.h"
-#include "sms-membership-window.h"
-#include "main.h"
-
-gboolean cb_filter_changed(GtkWidget* widget, gchar* text, MessengerData* d);
-void send_signal_to_footer (DBusConnection* bus, gchar* message_str);
-
-void cb_new_sms (GtkMenuItem* item, MessengerData* d);
-void cb_new_mail (GtkMenuItem* item, MessengerData* d);
-void cb_new_folder (GtkMenuItem* item, MessengerData* d);
-void cb_mode_read (GtkMenuItem* item, MessengerData* d);
-void cb_mode_reply (GtkMenuItem* item, MessengerData* d);
-void cb_mode_forward (GtkMenuItem* item, MessengerData* d);
-void cb_delete_folder (GtkMenuItem* item, MessengerData* d);
-void cb_delete_message (GtkMenuItem* item, MessengerData* d);
-void cb_mmitem_activate (GtkMenuItem* item, MessengerData* d);
-void cb_fnitem_activate (GtkMenuItem* item, MessengerData* d);
-void cb_cursor_changed(GtkTreeSelection* selection, MessengerData* d);
-
-void cb_nfBtn_clicked (GtkButton* button, MessengerData* d);
-void cb_nfResetBtn_clicked (GtkButton* button, MessengerData* d);
-void cb_frBtn_clicked (GtkButton* button, MessengerData* d);
-void cb_frResetBtn_clicked (GtkButton* button, GtkWidget* entry);
-void cb_dfBtn_clicked (GtkButton* button, MessengerData* d);
-void on_mmode_rdo_btn_clicked (gchar* folder);
-void on_btnsend_clicked                (GtkButton       *button,
-                                        gpointer         user_data);
-void on_btn_address_clicked            (GtkButton       *button,
-                                        gpointer         user_data);
-
-void cb_search_entry_changed (GtkEditable* editable, MessengerData* d);
-void cb_search_on (MessengerData* d);
-void cb_search_off (MessengerData* d);
-void delete_folder (MessengerData* d, gchar* oldName);
-
-#endif
-
+/*
+ *  callbacks.h 
+ *
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+#ifndef _CALLBACKS_H_
+#define _CALLBACKS_H_
+
+#include <gtk/gtk.h>
+#include "sms-dialog-window.h"
+#include "sms-membership-window.h"
+#include "main.h"
+
+gboolean cb_filter_changed(GtkWidget* widget, gchar* text, MessengerData* d);
+void send_signal_to_footer (DBusConnection* bus, gchar* message_str);
+
+void cb_new_sms (GtkMenuItem* item, MessengerData* d);
+void cb_new_mail (GtkMenuItem* item, MessengerData* d);
+void cb_new_folder (GtkMenuItem* item, MessengerData* d);
+void cb_mode_read (GtkMenuItem* item, MessengerData* d);
+void cb_mode_reply (GtkMenuItem* item, MessengerData* d);
+void cb_mode_forward (GtkMenuItem* item, MessengerData* d);
+void cb_delete_folder (GtkMenuItem* item, MessengerData* d);
+void cb_delete_message (GtkMenuItem* item, MessengerData* d);
+void cb_mmitem_activate (GtkMenuItem* item, MessengerData* d);
+void cb_fnitem_activate (GtkMenuItem* item, MessengerData* d);
+void cb_cursor_changed(GtkTreeSelection* selection, MessengerData* d);
+
+void cb_nfBtn_clicked (GtkButton* button, MessengerData* d);
+void cb_nfResetBtn_clicked (GtkButton* button, MessengerData* d);
+void cb_frBtn_clicked (GtkButton* button, MessengerData* d);
+void cb_frResetBtn_clicked (GtkButton* button, GtkWidget* entry);
+void cb_dfBtn_clicked (GtkButton* button, MessengerData* d);
+void on_mmode_rdo_btn_clicked (gchar* folder);
+void on_btnsend_clicked                (GtkButton       *button,
+                                        gpointer         user_data);
+void on_btn_address_clicked            (GtkButton       *button,
+                                        gpointer         user_data);
+
+void cb_search_entry_changed (GtkEditable* editable, MessengerData* d);
+void cb_search_on (MessengerData* d);
+void cb_search_off (MessengerData* d);
+void delete_folder (MessengerData* d, gchar* oldName);
+
+#endif
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.c	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.c	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,164 +1,164 @@
-/* detail-area.c
- *
- * Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- * Copyright (C) 2006-2007 OpenMoko Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Public License as published by
- * the Free Software Foundation; version 2.1 of the license.
- * 
- * 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 Public License for more details.
- *
- * Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: Alex $]
- *
- */
-
-#include "detail-area.h"
-#include "main.h"
-
-GtkWidget* detail_area_mode_read (DetailArea* self);
-
-G_DEFINE_TYPE (DetailArea, detail_area, GTK_TYPE_SCROLLED_WINDOW)
-
-#define DETAIL_AREA_GET_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_DETAIL_AREA, DetailAreaPrivate))
-
-typedef struct _DetailAreaPrivate
-  {}
-DetailAreaPrivate;
-
-/* parent class pointer */
-GtkWindowClass* parent_class = NULL;
-
-/* forward declarations */
-gboolean
-_expose_event_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data)
-{
-  return TRUE;
-}
-
-static void
-detail_area_dispose (GObject *object)
-{
-  if (G_OBJECT_CLASS (detail_area_parent_class)->dispose)
-    G_OBJECT_CLASS (detail_area_parent_class)->dispose (object);
-}
-
-static void
-detail_area_finalize (GObject *object)
-{
-  G_OBJECT_CLASS (detail_area_parent_class)->finalize (object);
-}
-
-static void
-detail_area_class_init (DetailAreaClass *klass)
-{
-  /* hook parent */
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  parent_class = g_type_class_peek_parent(klass);
-
-  /* register private data */
-  g_type_class_add_private (klass, sizeof (DetailAreaPrivate));
-
-  object_class->dispose = detail_area_dispose;
-  object_class->finalize = detail_area_finalize;
-
-}
-
-static void
-detail_area_init (DetailArea *self)
-{
-  gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(self), GTK_POLICY_NEVER, GTK_POLICY_NEVER );
-
-  self->readAttributes = g_malloc (sizeof(ReadAttributes));
-  self->editAttributes = g_malloc (sizeof(EditAttributes));
-  self->notebook = GTK_NOTEBOOK( gtk_notebook_new() );
-  gtk_notebook_append_page (self->notebook,detail_area_mode_read(self),NULL);
-  gtk_notebook_set_show_tabs (self->notebook,FALSE);
-  gtk_notebook_set_show_border (self->notebook,FALSE);
-}
-
-GtkWidget* detail_area_new (void)
-{
-  return GTK_WIDGET(g_object_new(TYPE_DETAIL_AREA, NULL ));
-}
-
-GtkWidget* detail_area_get_notebook(DetailArea* self)
-{
-  return GTK_WIDGET(self->notebook);
-}
-
-GtkWidget* detail_area_mode_read (DetailArea* self)
-{
-  /* create detail box */
-  self->detailbox = GTK_VBOX(gtk_vbox_new(FALSE,0));
-
-  ReadAttributes* readAttributes = self->readAttributes;
-
-  GtkWidget* headerbox = gtk_vbox_new(FALSE,0);
-  GtkWidget* hbox = gtk_hbox_new(FALSE,0);
-  readAttributes->from_label = gtk_label_new ("Alex");
-  gtk_misc_set_alignment (GTK_MISC (readAttributes->from_label),1,0.5);
-  readAttributes->date_label = gtk_label_new ("Hello");
-  gtk_misc_set_alignment (GTK_MISC (readAttributes->date_label),1,0.5);
-
-  GtkWidget* cellalign = gtk_alignment_new (0.5, 0.5, 1, 1);
-  gtk_alignment_set_padding (GTK_ALIGNMENT(cellalign), 5,5,5,5);
-  GtkWidget* label = gtk_label_new ("From:");
-  gtk_misc_set_alignment (GTK_MISC (label),1,0.5);
-  gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
-  gtk_box_pack_start(GTK_BOX(hbox),readAttributes->from_label,FALSE,FALSE,0);
-  gtk_container_add(GTK_CONTAINER(cellalign),hbox);
-  gtk_box_pack_start(GTK_BOX(headerbox),cellalign,FALSE,FALSE,0);
-
-  cellalign = gtk_alignment_new (0.5, 0.5, 1, 1);
-  gtk_alignment_set_padding (GTK_ALIGNMENT(cellalign), 5,5,5,5);
-  hbox = gtk_hbox_new(FALSE,0);
-  label = gtk_label_new ("Date:");
-  gtk_misc_set_alignment (GTK_MISC (label),1,0.5);
-  gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
-  gtk_box_pack_start(GTK_BOX(hbox),readAttributes->date_label,FALSE,FALSE,0);
-  gtk_container_add(GTK_CONTAINER(cellalign),hbox);
-  gtk_box_pack_start(GTK_BOX(headerbox),cellalign,FALSE,FALSE,0);
-
-  GtkWidget* hseparator = gtk_hseparator_new();
-  GtkWidget* detailAlign = gtk_alignment_new(0, 0, 0, 0);
-  gtk_alignment_set_padding (GTK_ALIGNMENT(detailAlign), 10, 10, 10, 50);
-  /*GtkWidget* details = gtk_label_new("this is the detail");*/
-  readAttributes->details = gtk_label_new( "Add your widget for showing details for the selected\n"
-                            "\ndata entry here\n \n \n \n \n \n \n \nThis particular label\n \nis very long\n"
-                            "\nto make the fullscreen\n \ntrigger more interesting\n \n \n");
-  gtk_widget_set_size_request (readAttributes->details,420,-1);
-  gtk_label_set_line_wrap (GTK_LABEL(readAttributes->details),TRUE);
-  gtk_misc_set_alignment (GTK_MISC (readAttributes->details),0.1,0.5);
-  gtk_container_add (GTK_CONTAINER(detailAlign),readAttributes->details);
-  gtk_box_pack_start(GTK_BOX(self->detailbox),headerbox,FALSE,TRUE,0);
-  gtk_box_pack_start(GTK_BOX(self->detailbox),hseparator,FALSE,TRUE,0);
-  gtk_box_pack_start(GTK_BOX(self->detailbox),detailAlign,FALSE,TRUE,0);
-
-  return GTK_WIDGET(self->detailbox);
-}
-
-void detail_read_message (DetailArea* self, message* msg)
-{
-  ReadAttributes* readAttributes = self->readAttributes;
-  if(msg != NULL)
-    {
-      gtk_label_set_text(GTK_LABEL(readAttributes->from_label), msg->name);
-      gtk_label_set_text(GTK_LABEL(readAttributes->date_label), msg->subject);
-      gtk_label_set_text(GTK_LABEL(readAttributes->details), msg->folder);
-      g_free(msg);
-    }
-  else
-    {
-      gtk_label_set_text(GTK_LABEL(readAttributes->from_label), "");
-      gtk_label_set_text(GTK_LABEL(readAttributes->date_label), "");
-      gtk_label_set_text(GTK_LABEL(readAttributes->details), "please select a message");
-    }
-
-  gtk_notebook_set_current_page (self->notebook,PAGE_MODE_READ);
-}
-
+/* detail-area.c
+ *
+ * Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ * Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Public License as published by
+ * the Free Software Foundation; version 2.1 of the license.
+ * 
+ * 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 Public License for more details.
+ *
+ * Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: Alex $]
+ *
+ */
+
+#include "detail-area.h"
+#include "main.h"
+
+GtkWidget* detail_area_mode_read (DetailArea* self);
+
+G_DEFINE_TYPE (DetailArea, detail_area, GTK_TYPE_SCROLLED_WINDOW)
+
+#define DETAIL_AREA_GET_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_DETAIL_AREA, DetailAreaPrivate))
+
+typedef struct _DetailAreaPrivate
+  {}
+DetailAreaPrivate;
+
+/* parent class pointer */
+GtkWindowClass* parent_class = NULL;
+
+/* forward declarations */
+gboolean
+_expose_event_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+  return TRUE;
+}
+
+static void
+detail_area_dispose (GObject *object)
+{
+  if (G_OBJECT_CLASS (detail_area_parent_class)->dispose)
+    G_OBJECT_CLASS (detail_area_parent_class)->dispose (object);
+}
+
+static void
+detail_area_finalize (GObject *object)
+{
+  G_OBJECT_CLASS (detail_area_parent_class)->finalize (object);
+}
+
+static void
+detail_area_class_init (DetailAreaClass *klass)
+{
+  /* hook parent */
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  parent_class = g_type_class_peek_parent(klass);
+
+  /* register private data */
+  g_type_class_add_private (klass, sizeof (DetailAreaPrivate));
+
+  object_class->dispose = detail_area_dispose;
+  object_class->finalize = detail_area_finalize;
+
+}
+
+static void
+detail_area_init (DetailArea *self)
+{
+  gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(self), GTK_POLICY_NEVER, GTK_POLICY_NEVER );
+
+  self->readAttributes = g_malloc (sizeof(ReadAttributes));
+  self->editAttributes = g_malloc (sizeof(EditAttributes));
+  self->notebook = GTK_NOTEBOOK( gtk_notebook_new() );
+  gtk_notebook_append_page (self->notebook,detail_area_mode_read(self),NULL);
+  gtk_notebook_set_show_tabs (self->notebook,FALSE);
+  gtk_notebook_set_show_border (self->notebook,FALSE);
+}
+
+GtkWidget* detail_area_new (void)
+{
+  return GTK_WIDGET(g_object_new(TYPE_DETAIL_AREA, NULL ));
+}
+
+GtkWidget* detail_area_get_notebook(DetailArea* self)
+{
+  return GTK_WIDGET(self->notebook);
+}
+
+GtkWidget* detail_area_mode_read (DetailArea* self)
+{
+  /* create detail box */
+  self->detailbox = GTK_VBOX(gtk_vbox_new(FALSE,0));
+
+  ReadAttributes* readAttributes = self->readAttributes;
+
+  GtkWidget* headerbox = gtk_vbox_new(FALSE,0);
+  GtkWidget* hbox = gtk_hbox_new(FALSE,0);
+  readAttributes->from_label = gtk_label_new ("Alex");
+  gtk_misc_set_alignment (GTK_MISC (readAttributes->from_label),1,0.5);
+  readAttributes->date_label = gtk_label_new ("Hello");
+  gtk_misc_set_alignment (GTK_MISC (readAttributes->date_label),1,0.5);
+
+  GtkWidget* cellalign = gtk_alignment_new (0.5, 0.5, 1, 1);
+  gtk_alignment_set_padding (GTK_ALIGNMENT(cellalign), 5,5,5,5);
+  GtkWidget* label = gtk_label_new ("From:");
+  gtk_misc_set_alignment (GTK_MISC (label),1,0.5);
+  gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
+  gtk_box_pack_start(GTK_BOX(hbox),readAttributes->from_label,FALSE,FALSE,0);
+  gtk_container_add(GTK_CONTAINER(cellalign),hbox);
+  gtk_box_pack_start(GTK_BOX(headerbox),cellalign,FALSE,FALSE,0);
+
+  cellalign = gtk_alignment_new (0.5, 0.5, 1, 1);
+  gtk_alignment_set_padding (GTK_ALIGNMENT(cellalign), 5,5,5,5);
+  hbox = gtk_hbox_new(FALSE,0);
+  label = gtk_label_new ("Date:");
+  gtk_misc_set_alignment (GTK_MISC (label),1,0.5);
+  gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
+  gtk_box_pack_start(GTK_BOX(hbox),readAttributes->date_label,FALSE,FALSE,0);
+  gtk_container_add(GTK_CONTAINER(cellalign),hbox);
+  gtk_box_pack_start(GTK_BOX(headerbox),cellalign,FALSE,FALSE,0);
+
+  GtkWidget* hseparator = gtk_hseparator_new();
+  GtkWidget* detailAlign = gtk_alignment_new(0, 0, 0, 0);
+  gtk_alignment_set_padding (GTK_ALIGNMENT(detailAlign), 10, 10, 10, 50);
+  /*GtkWidget* details = gtk_label_new("this is the detail");*/
+  readAttributes->details = gtk_label_new( "Add your widget for showing details for the selected\n"
+                            "\ndata entry here\n \n \n \n \n \n \n \nThis particular label\n \nis very long\n"
+                            "\nto make the fullscreen\n \ntrigger more interesting\n \n \n");
+  gtk_widget_set_size_request (readAttributes->details,420,-1);
+  gtk_label_set_line_wrap (GTK_LABEL(readAttributes->details),TRUE);
+  gtk_misc_set_alignment (GTK_MISC (readAttributes->details),0.1,0.5);
+  gtk_container_add (GTK_CONTAINER(detailAlign),readAttributes->details);
+  gtk_box_pack_start(GTK_BOX(self->detailbox),headerbox,FALSE,TRUE,0);
+  gtk_box_pack_start(GTK_BOX(self->detailbox),hseparator,FALSE,TRUE,0);
+  gtk_box_pack_start(GTK_BOX(self->detailbox),detailAlign,FALSE,TRUE,0);
+
+  return GTK_WIDGET(self->detailbox);
+}
+
+void detail_read_message (DetailArea* self, message* msg)
+{
+  ReadAttributes* readAttributes = self->readAttributes;
+  if(msg != NULL)
+    {
+      gtk_label_set_text(GTK_LABEL(readAttributes->from_label), msg->name);
+      gtk_label_set_text(GTK_LABEL(readAttributes->date_label), msg->subject);
+      gtk_label_set_text(GTK_LABEL(readAttributes->details), msg->folder);
+      g_free(msg);
+    }
+  else
+    {
+      gtk_label_set_text(GTK_LABEL(readAttributes->from_label), "");
+      gtk_label_set_text(GTK_LABEL(readAttributes->date_label), "");
+      gtk_label_set_text(GTK_LABEL(readAttributes->details), "please select a message");
+    }
+
+  gtk_notebook_set_current_page (self->notebook,PAGE_MODE_READ);
+}
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/detail-area.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,85 +1,85 @@
-/*  detail-area.h
- *  
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *  
- *  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 Public License for more details.
- *  
- *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
- */
-
-#ifndef _DETAIL_AREA_H
-#define _DETAIL_AREA_H
-
-#include <gtk/gtk.h>
-#include <glib-object.h>
-#include <libmokoui/moko-details-window.h>
-#include <libmokoui/moko-pixmap-button.h>
-#include <libmokoui/moko-tool-box.h>
-#include <libmokoui/moko-fixed.h>
-#include "message.h"
-
-G_BEGIN_DECLS
-
-#define TYPE_DETAIL_AREA detail_area_get_type()
-#define DETAIL_AREA(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_DETAIL_AREA, DetailArea))
-#define DETAIL_AREA_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_DETAIL_AREA, DetailAreaClass))
-#define IS_DETAIL_AREA(obj)     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_DETAIL_AREA))
-#define IS_DETAIL_AREA_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_DETAIL_AREA))
-#define DETAIL_AREA_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_DETAIL_AREA, DetailAreaClass))
-
-typedef struct _Read_Attributes
-  {
-    GtkWidget* from_label;
-    GtkWidget* date_label;
-    GtkWidget* details;
-  }
-ReadAttributes;
-
-typedef struct _Edit_Attributes
-  {
-    GtkWidget* sendBtn;
-    GtkWidget* addrBtn;
-    GtkWidget* toEntry;
-    GtkWidget* txtView;
-  }
-EditAttributes;
-
-typedef struct _DetailArea
-  {
-    MokoDetailsWindow parent;
-    GtkNotebook* notebook;
-    GtkVBox* detailbox;
-    GtkHBox* toolbox;
-    MokoFixed* entryarea;
-    GSList* folderlist;
-    guint* page;
-    ReadAttributes* readAttributes;
-    EditAttributes* editAttributes;
-  }
-DetailArea;
-
-typedef struct _DetailAreaClass
-  {
-    MokoDetailsWindowClass parent_class;
-  }
-DetailAreaClass;
-
-GType detail_area_get_type();
-GtkWidget* detail_area_new(void);
-GtkWidget* detail_area_get_notebook(DetailArea* self);
-
-void detail_read_message (DetailArea* self, message* msg);
-
-G_END_DECLS
-
-#endif
-
+/*  detail-area.h
+ *  
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *  
+ *  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 Public License for more details.
+ *  
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
+ */
+
+#ifndef _DETAIL_AREA_H
+#define _DETAIL_AREA_H
+
+#include <gtk/gtk.h>
+#include <glib-object.h>
+#include <libmokoui/moko-details-window.h>
+#include <libmokoui/moko-pixmap-button.h>
+#include <libmokoui/moko-tool-box.h>
+#include <libmokoui/moko-fixed.h>
+#include "message.h"
+
+G_BEGIN_DECLS
+
+#define TYPE_DETAIL_AREA detail_area_get_type()
+#define DETAIL_AREA(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_DETAIL_AREA, DetailArea))
+#define DETAIL_AREA_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_DETAIL_AREA, DetailAreaClass))
+#define IS_DETAIL_AREA(obj)     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_DETAIL_AREA))
+#define IS_DETAIL_AREA_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_DETAIL_AREA))
+#define DETAIL_AREA_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_DETAIL_AREA, DetailAreaClass))
+
+typedef struct _Read_Attributes
+  {
+    GtkWidget* from_label;
+    GtkWidget* date_label;
+    GtkWidget* details;
+  }
+ReadAttributes;
+
+typedef struct _Edit_Attributes
+  {
+    GtkWidget* sendBtn;
+    GtkWidget* addrBtn;
+    GtkWidget* toEntry;
+    GtkWidget* txtView;
+  }
+EditAttributes;
+
+typedef struct _DetailArea
+  {
+    MokoDetailsWindow parent;
+    GtkNotebook* notebook;
+    GtkVBox* detailbox;
+    GtkHBox* toolbox;
+    MokoFixed* entryarea;
+    GSList* folderlist;
+    guint* page;
+    ReadAttributes* readAttributes;
+    EditAttributes* editAttributes;
+  }
+DetailArea;
+
+typedef struct _DetailAreaClass
+  {
+    MokoDetailsWindowClass parent_class;
+  }
+DetailAreaClass;
+
+GType detail_area_get_type();
+GtkWidget* detail_area_new(void);
+GtkWidget* detail_area_get_notebook(DetailArea* self);
+
+void detail_read_message (DetailArea* self, message* msg);
+
+G_END_DECLS
+
+#endif
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.c	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.c	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,114 +1,114 @@
-/*
- *  foldersdb.c
- *
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *
- *  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 Public License for more details.
- *
- *  Current Version: $Rev$ ($Date$) [$Author$]
- */
-
-
-#include "foldersdb.h"
-
-#include <stdio.h>
-
-G_DEFINE_TYPE (FoldersDB, foldersdb, G_TYPE_OBJECT)
-
-#define FOLDERSDB_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_FOLDERSDB, FoldersDBPrivate))
-
-/*typedef struct _FoldersDBPrivate
-{
-} FoldersDBPrivate;*/
-
-static void
-foldersdb_dispose (GObject *object)
-{
-  if (G_OBJECT_CLASS (foldersdb_parent_class)->dispose)
-    G_OBJECT_CLASS (foldersdb_parent_class)->dispose (object);
-}
-
-static void
-foldersdb_finalize (GObject *object)
-{
-  G_OBJECT_CLASS (foldersdb_parent_class)->finalize (object);
-}
-
-static void
-foldersdb_class_init (FoldersDBClass *klass)
-{
-  g_debug( "foldersdb_class_init" );
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  /* register private data */
-  /*g_type_class_add_private (klass, sizeof (FoldersDBPrivate));*/
-
-  /* hook virtual methods */
-  /* ... */
-
-  /* install properties */
-  /* ... */
-
-  object_class->dispose = foldersdb_dispose;
-  object_class->finalize = foldersdb_finalize;
-
-  FILE* file = fopen( PKGDATADIR "/folderlist", "rw" );
-  g_assert( file ); //FIXME error handling, if folder file is not present
-  char line[256];
-  char *elem;
-  char *tok = "\n";
-
-  while( fgets(line, sizeof(line), file) )
-    {
-      elem = g_strdup(strtok(line, tok));
-      klass->folders = g_slist_append(klass->folders, elem);
-    }
-
-  fclose( file );
-}
-
-static void
-foldersdb_init (FoldersDB *self)
-{}
-
-FoldersDB*
-foldersdb_new (void)
-{
-  return g_object_new (TYPE_FOLDERSDB, NULL);
-}
-
-GSList* foldersdb_get_folders(FoldersDB* self)
-{
-  FoldersDBClass* klass = FOLDERSDB_GET_CLASS(self);
-  return klass->folders;
-}
-
-void foldersdb_update ( GSList* folderlist )
-{
-  /*FILE* file = g_fopen( PKGDATADIR "/folderlist", "w" );*/
-  FILE* file = fopen( PKGDATADIR "/folderlist", "w" );
-  g_assert( file );
-  GSList* c;
-  char *elem;
-
-  for( c =folderlist; c; c=g_slist_next(c))
-    {
-      if(g_slist_next(c) != NULL)
-        elem = g_strdup_printf( "%s\n", (char*)c->data);
-      else
-        elem = g_strdup(c->data);
-      fputs(elem, file);
-    }
-  fclose( file );
-}
-
-
+/*
+ *  foldersdb.c
+ *
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+
+#include "foldersdb.h"
+
+#include <stdio.h>
+
+G_DEFINE_TYPE (FoldersDB, foldersdb, G_TYPE_OBJECT)
+
+#define FOLDERSDB_PRIVATE(o)     (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_FOLDERSDB, FoldersDBPrivate))
+
+/*typedef struct _FoldersDBPrivate
+{
+} FoldersDBPrivate;*/
+
+static void
+foldersdb_dispose (GObject *object)
+{
+  if (G_OBJECT_CLASS (foldersdb_parent_class)->dispose)
+    G_OBJECT_CLASS (foldersdb_parent_class)->dispose (object);
+}
+
+static void
+foldersdb_finalize (GObject *object)
+{
+  G_OBJECT_CLASS (foldersdb_parent_class)->finalize (object);
+}
+
+static void
+foldersdb_class_init (FoldersDBClass *klass)
+{
+  g_debug( "foldersdb_class_init" );
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  /* register private data */
+  /*g_type_class_add_private (klass, sizeof (FoldersDBPrivate));*/
+
+  /* hook virtual methods */
+  /* ... */
+
+  /* install properties */
+  /* ... */
+
+  object_class->dispose = foldersdb_dispose;
+  object_class->finalize = foldersdb_finalize;
+
+  FILE* file = fopen( PKGDATADIR "/folderlist", "rw" );
+  g_assert( file ); //FIXME error handling, if folder file is not present
+  char line[256];
+  char *elem;
+  char *tok = "\n";
+
+  while( fgets(line, sizeof(line), file) )
+    {
+      elem = g_strdup(strtok(line, tok));
+      klass->folders = g_slist_append(klass->folders, elem);
+    }
+
+  fclose( file );
+}
+
+static void
+foldersdb_init (FoldersDB *self)
+{}
+
+FoldersDB*
+foldersdb_new (void)
+{
+  return g_object_new (TYPE_FOLDERSDB, NULL);
+}
+
+GSList* foldersdb_get_folders(FoldersDB* self)
+{
+  FoldersDBClass* klass = FOLDERSDB_GET_CLASS(self);
+  return klass->folders;
+}
+
+void foldersdb_update ( GSList* folderlist )
+{
+  /*FILE* file = g_fopen( PKGDATADIR "/folderlist", "w" );*/
+  FILE* file = fopen( PKGDATADIR "/folderlist", "w" );
+  g_assert( file );
+  GSList* c;
+  char *elem;
+
+  for( c =folderlist; c; c=g_slist_next(c))
+    {
+      if(g_slist_next(c) != NULL)
+        elem = g_strdup_printf( "%s\n", (char*)c->data);
+      else
+        elem = g_strdup(c->data);
+      fputs(elem, file);
+    }
+  fclose( file );
+}
+
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/foldersdb.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,58 +1,58 @@
-/*
- *  foldersdb.h
- *
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc. 
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *
- *  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 Public License for more details.
- *
- *  Current Version: $Rev$ ($Date$) [$Author$]
- */
-
-#ifndef __FOLDERsDB_H_
-#define __FOLDERsDB_H_
-
-#include <glib-object.h>
-#include <stdio.h>
-#include <string.h>
-
-G_BEGIN_DECLS
-
-#define TYPE_FOLDERSDB foldersdb_get_type()
-#define FOLDERSDB(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj),     TYPE_FOLDERSDB, FoldersDB))
-#define FOLDERSDB_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass),     TYPE_FOLDERSDB, FoldersDBClass))
-#define IS_FOLDERSDB(obj)     (G_TYPE_CHECK_INSTANCE_TYPE ((obj),     TYPE_FOLDERSDB))
-#define IS_FOLDERSDB_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass),     TYPE_FOLDERSDB))
-#define FOLDERSDB_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj),     TYPE_FOLDERSDB, FoldersDBClass))
-
-typedef struct
-  {
-    GObject parent;
-  }
-FoldersDB;
-
-typedef struct
-  {
-    GObjectClass parent_class;
-    GSList* folders;
-  }
-FoldersDBClass;
-
-GType foldersdb_get_type (void);
-FoldersDB* foldersdb_new (void);
-GSList* foldersdb_get_folders(FoldersDB* self);
-void foldersdb_update ( GSList* folderlist );
-
-G_END_DECLS
-
-
-#endif // __FOLDERsDB_H_
-
+/*
+ *  foldersdb.h
+ *
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc. 
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+#ifndef __FOLDERsDB_H_
+#define __FOLDERsDB_H_
+
+#include <glib-object.h>
+#include <stdio.h>
+#include <string.h>
+
+G_BEGIN_DECLS
+
+#define TYPE_FOLDERSDB foldersdb_get_type()
+#define FOLDERSDB(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj),     TYPE_FOLDERSDB, FoldersDB))
+#define FOLDERSDB_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass),     TYPE_FOLDERSDB, FoldersDBClass))
+#define IS_FOLDERSDB(obj)     (G_TYPE_CHECK_INSTANCE_TYPE ((obj),     TYPE_FOLDERSDB))
+#define IS_FOLDERSDB_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass),     TYPE_FOLDERSDB))
+#define FOLDERSDB_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj),     TYPE_FOLDERSDB, FoldersDBClass))
+
+typedef struct
+  {
+    GObject parent;
+  }
+FoldersDB;
+
+typedef struct
+  {
+    GObjectClass parent_class;
+    GSList* folders;
+  }
+FoldersDBClass;
+
+GType foldersdb_get_type (void);
+FoldersDB* foldersdb_new (void);
+GSList* foldersdb_get_folders(FoldersDB* self);
+void foldersdb_update ( GSList* folderlist );
+
+G_END_DECLS
+
+
+#endif // __FOLDERsDB_H_
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/main.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/main.c	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/main.c	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,411 +1,411 @@
-/*
- *  Messages -- An messages application for OpenMoko Framework
- *
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *
- *  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 Public License for more details.
- *
- *  Current Version: $Rev$ ($Date$) [$Author$]
- */
-
-#include <unistd.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-
-#include "main.h"
-#include "foldersdb.h"
-#include "detail-area.h"
-#include "callbacks.h"
-#include "message.h"
-
-#include <libmokoui/moko-application.h>
-#include <libmokoui/moko-paned-window.h>
-#include <libmokoui/moko-tool-box.h>
-#include <libmokoui/moko-tree-view.h>
-#include <libmokoui/moko-details-window.h>
-
-#include <gtk/gtk.h>
-
-gboolean init_dbus (MessengerData* d)
-{
-  DBusError error;
-
-  /* Get a connection to the session bus */
-  dbus_error_init (&error);
-  d->bus = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
-
-  if (!d->bus)
-    {
-      g_warning ("Failed to connect to the D-BUS daemon: %s", error.message);
-      return FALSE;
-    }
-
-  if (dbus_error_is_set (&error))
-    {
-      fprintf(stdout, "Connection Error (%s)\n", error.message);
-      dbus_error_free (&error);
-    }
-
-  if (NULL == d->bus)
-    {
-      fprintf(stdout, "Connection Error: bus == NULL \n");
-      exit (1);
-    }
-
-  return TRUE;
-}
-
-int main( int argc, char** argv )
-{
-  g_debug( "openmoko-messenger starting up" );
-
-  /* Initialize GTK+ */
-  gtk_init( &argc, &argv );
-
-  MessengerData* d = g_new ( MessengerData, 1);
-  d->foldersdb = foldersdb_new();
-  d->s_key = "";
-  d->msg_num = 0;
-  d->app = MOKO_APPLICATION (moko_application_get_instance());
-  d->currentfolder = g_strdup("Inbox");
-  g_set_application_name( "Messages" );
-
-  if (init_dbus(d))
-    g_debug("D-Bus initialize successfully");
-
-  /* ui */
-  setup_ui(d);
-
-  /* disable mmitem if necessary*/
-  update_folder_sensitive (d, d->folderlist);
-
-  /* Set up this connection to work in a GLib event loop */
-  dbus_connection_setup_with_g_main (d->bus, NULL);
-
-  /* show everything and run main loop */
-  gtk_window_set_decorated (GTK_WINDOW(d->window), FALSE);
-  gtk_widget_show_all (GTK_WIDGET(d->window));
-  gtk_main();
-
-  return 0;
-
-}
-
-void update_folder_sensitive (MessengerData* d, GSList* folderlist)
-{
-  if (g_slist_length (folderlist) > 5)
-    {
-      gtk_widget_set_sensitive (d->mmitem, TRUE);
-      gtk_widget_set_sensitive (d->fnitem, TRUE);
-    }
-  else
-    {
-      gtk_widget_set_sensitive (d->mmitem, FALSE);
-      gtk_widget_set_sensitive (d->fnitem, FALSE);
-    }
-}
-
-GtkWidget* reload_filter_menu (MessengerData* d, GSList* folderlist)
-{
-  GSList *c;
-  GtkWidget* filtmenu;
-
-  filtmenu = gtk_menu_new();
-  c = folderlist;
-  for (; c; c = g_slist_next(c) )
-    {
-      gchar* folder = (gchar*) c->data;
-      g_debug( "adding folder '%s'", folder );
-      gtk_menu_shell_append( GTK_MENU_SHELL( filtmenu ), gtk_menu_item_new_with_label( folder ) );
-    }
-
-  return filtmenu;
-}
-
-void setup_ui( MessengerData* d )
-{
-  /* main window */
-  d->window = MOKO_PANED_WINDOW(moko_paned_window_new());
-  d->mmWin = NULL;
-
-  /* application menu */
-  d->menu = gtk_menu_new();
-  gtk_widget_show (d->menu);
-  d->mmitem = gtk_menu_item_new_with_label( "Message Membership" );
-  d->fnitem = gtk_menu_item_new_with_label( "Folder Rename" );
-  GtkWidget* accountitem = gtk_menu_item_new_with_label( "Account" );
-  GtkWidget* helpitem = gtk_menu_item_new_with_label( "Help" );
-  GtkWidget* sepitem = gtk_separator_menu_item_new();
-  GtkWidget* closeitem = gtk_menu_item_new_with_label( "Close" );
-  g_signal_connect( G_OBJECT(closeitem), "activate", G_CALLBACK(main_quit), d );
-  g_signal_connect( G_OBJECT(d->mmitem), "activate", G_CALLBACK(cb_mmitem_activate), d );
-  g_signal_connect( G_OBJECT(d->fnitem), "activate", G_CALLBACK(cb_fnitem_activate), d );
-  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), d->mmitem );
-  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), d->fnitem );
-  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), accountitem );
-  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), helpitem );
-  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), sepitem );
-  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), closeitem );
-  moko_paned_window_set_application_menu( d->window, GTK_MENU(d->menu) );
-
-  /* filter menu */
-  d->filtmenu = gtk_menu_new();
-  gtk_widget_show (d->filtmenu);
-  d->folderlist = foldersdb_get_folders( d->foldersdb );
-  d->filtmenu = reload_filter_menu( d, d->folderlist );
-
-  moko_paned_window_set_filter_menu( d->window, GTK_MENU(d->filtmenu) );
-  GtkWidget* menubox = GTK_WIDGET(moko_paned_window_get_menubox(d->window));
-  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
-
-  /* connect close event */
-  g_signal_connect( G_OBJECT(d->window), "delete_event", G_CALLBACK( main_quit ), d );
-
-  /* set navagation area */
-  populate_navigation_area( d );
-
-  /* set toolbox */
-  GtkWidget* newButton;
-  GtkWidget* modeButton;
-  GtkWidget* getmailButton;
-  GtkWidget* deleteButton;
-
-  GtkWidget* newMenu;
-  GtkWidget* modeMenu;
-  GtkWidget* deleteMenu;
-
-  GtkWidget* image;
-
-  /* set tool bar */
-  d->toolbox = moko_tool_box_new_with_search();
-  gtk_widget_show (d->toolbox);
-  GtkWidget* searchEntry = GTK_WIDGET (moko_tool_box_get_entry (MOKO_TOOL_BOX(d->toolbox)));
-  gtk_widget_show (searchEntry);
-  g_signal_connect( G_OBJECT(searchEntry), "changed", G_CALLBACK(cb_search_entry_changed), d );
-  g_signal_connect_swapped ( G_OBJECT(d->toolbox), "searchbox_visible", G_CALLBACK(cb_search_on), d );
-  g_signal_connect_swapped( G_OBJECT(d->toolbox), "searchbox_invisible", G_CALLBACK(cb_search_off), d );
-
-  /* set action buttons*/
-  deleteMenu = gtk_menu_new();
-  GtkWidget* delMsgItem = gtk_image_menu_item_new_with_label( "Delete Message" );
-  GtkWidget* delFolderItem = gtk_image_menu_item_new_with_label( "Delete Folder" );
-  g_signal_connect( G_OBJECT(delFolderItem), "activate", G_CALLBACK(cb_delete_folder), d );
-  g_signal_connect( G_OBJECT(delMsgItem), "activate", G_CALLBACK(cb_delete_message), d );
-
-  gtk_menu_shell_append( GTK_MENU_SHELL(deleteMenu), GTK_WIDGET(delMsgItem) );
-  gtk_menu_shell_append( GTK_MENU_SHELL(deleteMenu), GTK_WIDGET(delFolderItem) );
-  gtk_widget_show_all (deleteMenu);
-  deleteButton = GTK_WIDGET (moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
-  image = gtk_image_new_from_file (PKGDATADIR "/Delete_Message.png");
-  moko_pixmap_button_set_center_image (MOKO_PIXMAP_BUTTON(deleteButton),image);
-  moko_pixmap_button_set_menu (MOKO_PIXMAP_BUTTON(deleteButton), GTK_MENU(deleteMenu));
-
-  getmailButton = GTK_WIDGET(moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
-  image = gtk_image_new_from_file (PKGDATADIR "/GetMail.png");
-  moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(getmailButton),image);
-
-  modeMenu = gtk_menu_new();
-  GtkWidget* modeReadItem = gtk_image_menu_item_new_with_label( "Mode Read" );
-  GtkWidget* modeReplyItem = gtk_image_menu_item_new_with_label( "Mode Reply" );
-  GtkWidget* modeFwdItem = gtk_image_menu_item_new_with_label( "Mode Forward" );
-
-  gtk_menu_shell_append( GTK_MENU_SHELL(modeMenu),modeReadItem);
-  gtk_menu_shell_append( GTK_MENU_SHELL(modeMenu), modeReplyItem);
-  gtk_menu_shell_append( GTK_MENU_SHELL(modeMenu), modeFwdItem);
-  g_signal_connect( G_OBJECT(modeReadItem), "activate", G_CALLBACK(cb_mode_read), d );
-  g_signal_connect( G_OBJECT(modeReplyItem), "activate", G_CALLBACK(cb_mode_reply), d );
-  g_signal_connect( G_OBJECT(modeFwdItem), "activate", G_CALLBACK(cb_mode_forward), d );
-  gtk_widget_show_all (modeMenu);
-  modeButton = GTK_WIDGET(moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
-  image = gtk_image_new_from_file (PKGDATADIR "/Mode_Read.png");
-  moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(modeButton),image);
-  moko_pixmap_button_set_menu ( MOKO_PIXMAP_BUTTON(modeButton), GTK_MENU(modeMenu) );
-
-  newMenu = gtk_menu_new();
-  GtkWidget* newMsgItem = gtk_image_menu_item_new_with_label("New SMS") ;
-  GtkWidget* newFolderItem = gtk_image_menu_item_new_with_label("New Folder") ;
-  GtkWidget* newMailItem = gtk_image_menu_item_new_with_label("New Mail") ;
-
-  gtk_menu_shell_append( GTK_MENU_SHELL(newMenu), newMsgItem);
-  gtk_menu_shell_append( GTK_MENU_SHELL(newMenu), newMailItem);
-  gtk_menu_shell_append( GTK_MENU_SHELL(newMenu), newFolderItem);
-  gtk_widget_show_all (newMenu);
-  g_signal_connect( G_OBJECT(newMsgItem), "activate", G_CALLBACK(cb_new_sms), d );
-  g_signal_connect( G_OBJECT(newMailItem), "activate", G_CALLBACK(cb_new_mail), d );
-  g_signal_connect( G_OBJECT(newFolderItem), "activate", G_CALLBACK(cb_new_folder), d );
-  newButton = GTK_WIDGET(moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
-  image = gtk_image_new_from_file (PKGDATADIR "/New_Mail.png");
-  moko_pixmap_button_set_center_image (MOKO_PIXMAP_BUTTON(newButton),image);
-  moko_pixmap_button_set_menu ( MOKO_PIXMAP_BUTTON(newButton),GTK_MENU(newMenu) );
-
-  moko_paned_window_add_toolbox( d->window, MOKO_TOOL_BOX(d->toolbox) );
-
-  /* detail area */
-  populate_detail_area (d);
-
-  /* Fix default "Filter Menu" bug*/
-  d->currentfolder = g_strdup("Inbox");
-  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
-  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
-  gtk_label_set_text (GTK_LABEL(menulabel),"Inbox");
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
-
-  /* select the first column */
-  gint index = 0;
-  GtkTreeSelection* tree_selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(d->view) );
-  GtkTreePath *path = gtk_tree_path_new_from_indices( index, -1 );
-  gtk_tree_selection_select_path( tree_selection, path );
-  gtk_tree_view_set_cursor( GTK_TREE_VIEW(d->view), path, NULL, FALSE );
-  gtk_widget_grab_focus (d->view);
-
-  /* temporary setting */
-  GtkSettings* settings = gtk_settings_get_default();
-  g_object_set(settings,
-               "gtk-theme-name","openmoko-standard",
-	       NULL);
-}
-
-gboolean filter_visible_function (GtkTreeModel* model, GtkTreeIter* iter, MessengerData* d)
-{
-  gchar* folder;
-  gchar* from;
-  gchar* subject;
-
-  gtk_tree_model_get (model, iter, COLUMN_FOLDER, &folder, -1);
-  gtk_tree_model_get (model, iter, COLUMN_FROM, &from, -1);
-  gtk_tree_model_get (model, iter, COLUMN_SUBJECT, &subject, -1);
-
-  if (d->searchOn)
-    {
-      if ((strlen(d->s_key) > 0) && !strcasestr(from, d->s_key) && !strcasestr(subject, d->s_key))
-        return FALSE;
-    }
-  else
-    {
-      gtk_menu_set_active (GTK_MENU(d->filtmenu),0);
-      if(g_strcasecmp(folder,d->currentfolder))
-        return FALSE;
-    }
-
-  return TRUE;
-}
-
-void cell_data_func (GtkTreeViewColumn *col,
-                     GtkCellRenderer   *renderer,
-                     GtkTreeModel      *model,
-                     GtkTreeIter  	    *iter,
-                     gpointer          user_data)
-{
-  gint status;
-  gtk_tree_model_get(model, iter, COLUMN_STATUS, &status, -1);
-
-  if (status == UNREAD)
-    g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
-  else g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", FALSE, NULL);
-}
-
-void populate_navigation_area( MessengerData* d )
-{
-  guint         i;
-  GdkPixbuf*    icon = NULL;
-  GError*       error = NULL;
-  GtkTreeIter   iter;
-
-  d->liststore = gtk_list_store_new( NUM_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING );
-  d->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (d->liststore),NULL);
-  d->view = moko_tree_view_new_with_model (GTK_TREE_MODEL (d->filter));
-
-  for (i = 0;  i < G_N_ELEMENTS(names);  ++i)
-    {
-      gtk_list_store_append(d->liststore, &iter);
-      switch(states[i])
-        {
-        case UNREAD	  :
-          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Unread.png", &error);
-          break;
-        case READ	  :
-          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Read.png", &error);
-          break;
-        case REPLIED  :
-          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Reply.png", &error);
-          break;
-        case FORWARD  :
-          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Forward.png", &error);
-          break;
-        }
-      gtk_list_store_set(d->liststore, &iter,
-                         COLUMN_ICON, icon,
-                         COLUMN_FROM, names[i],
-                         COLUMN_SUBJECT, subjects[i],
-                         COLUMN_CONTENT, contents[i],
-                         COLUMN_STATUS, states[i],
-                         COLUMN_FOLDER, folders[i],
-                         -1);
-    }
-  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (d->filter),
-                                          (GtkTreeModelFilterVisibleFunc)filter_visible_function,
-                                          d,
-                                          NULL);
-  GtkCellRenderer* ren;
-  GtkTreeViewColumn* column = gtk_tree_view_column_new();
-  gtk_tree_view_column_set_title(column, "From");
-
-  /* Add status picture */
-  ren = gtk_cell_renderer_pixbuf_new();
-  gtk_tree_view_column_pack_start(column, ren, FALSE);
-  gtk_tree_view_column_set_attributes(column, ren, "pixbuf", COLUMN_ICON, NULL);
-
-  /* add message from name */
-  ren = gtk_cell_renderer_text_new();
-  gtk_tree_view_column_pack_start(column, ren, TRUE);
-  gtk_tree_view_column_set_attributes(column, ren,
-                                      "text", COLUMN_FROM,
-                                      NULL);
-
-  /* Bold if UNREAD */
-  gtk_tree_view_column_set_cell_data_func (column, ren, cell_data_func, d->liststore, NULL);
-  moko_tree_view_append_column( MOKO_TREE_VIEW(d->view), column );
-
-  ren = gtk_cell_renderer_text_new();
-  column = gtk_tree_view_column_new();
-  gtk_tree_view_column_set_title(column, "Subject");
-  gtk_tree_view_column_pack_start(column, ren, TRUE);
-  gtk_tree_view_column_set_attributes(column, ren, "text", COLUMN_SUBJECT, NULL);
-  gtk_tree_view_column_set_cell_data_func (column, ren, cell_data_func, d->liststore, NULL);
-  moko_tree_view_append_column( MOKO_TREE_VIEW(d->view), column );
-
-  GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(d->view) );
-  g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(cb_cursor_changed), d );
-  moko_paned_window_set_upper_pane( d->window, GTK_WIDGET(moko_tree_view_put_into_scrolled_window(MOKO_TREE_VIEW(d->view))) );
-}
-
-void populate_detail_area( MessengerData* d )
-{
-  d->details = detail_area_new();
-  gtk_widget_show (d->details);
-  gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(d->details), detail_area_get_notebook(DETAIL_AREA(d->details)));
-  moko_paned_window_set_lower_pane( MOKO_PANED_WINDOW(d->window), GTK_WIDGET(moko_details_window_put_in_box(d->details)));
-}
-
-void main_quit(GtkMenuItem* item, MessengerData* d)
-{
-  foldersdb_update (d->folderlist);
-  send_signal_to_footer(d->bus,"");
-  gtk_main_quit();
-}
-
+/*
+ *  Messages -- An messages application for OpenMoko Framework
+ *
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+
+#include "main.h"
+#include "foldersdb.h"
+#include "detail-area.h"
+#include "callbacks.h"
+#include "message.h"
+
+#include <libmokoui/moko-application.h>
+#include <libmokoui/moko-paned-window.h>
+#include <libmokoui/moko-tool-box.h>
+#include <libmokoui/moko-tree-view.h>
+#include <libmokoui/moko-details-window.h>
+
+#include <gtk/gtk.h>
+
+gboolean init_dbus (MessengerData* d)
+{
+  DBusError error;
+
+  /* Get a connection to the session bus */
+  dbus_error_init (&error);
+  d->bus = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+
+  if (!d->bus)
+    {
+      g_warning ("Failed to connect to the D-BUS daemon: %s", error.message);
+      return FALSE;
+    }
+
+  if (dbus_error_is_set (&error))
+    {
+      fprintf(stdout, "Connection Error (%s)\n", error.message);
+      dbus_error_free (&error);
+    }
+
+  if (NULL == d->bus)
+    {
+      fprintf(stdout, "Connection Error: bus == NULL \n");
+      exit (1);
+    }
+
+  return TRUE;
+}
+
+int main( int argc, char** argv )
+{
+  g_debug( "openmoko-messenger starting up" );
+
+  /* Initialize GTK+ */
+  gtk_init( &argc, &argv );
+
+  MessengerData* d = g_new ( MessengerData, 1);
+  d->foldersdb = foldersdb_new();
+  d->s_key = "";
+  d->msg_num = 0;
+  d->app = MOKO_APPLICATION (moko_application_get_instance());
+  d->currentfolder = g_strdup("Inbox");
+  g_set_application_name( "Messages" );
+
+  if (init_dbus(d))
+    g_debug("D-Bus initialize successfully");
+
+  /* ui */
+  setup_ui(d);
+
+  /* disable mmitem if necessary*/
+  update_folder_sensitive (d, d->folderlist);
+
+  /* Set up this connection to work in a GLib event loop */
+  dbus_connection_setup_with_g_main (d->bus, NULL);
+
+  /* show everything and run main loop */
+  gtk_window_set_decorated (GTK_WINDOW(d->window), FALSE);
+  gtk_widget_show_all (GTK_WIDGET(d->window));
+  gtk_main();
+
+  return 0;
+
+}
+
+void update_folder_sensitive (MessengerData* d, GSList* folderlist)
+{
+  if (g_slist_length (folderlist) > 5)
+    {
+      gtk_widget_set_sensitive (d->mmitem, TRUE);
+      gtk_widget_set_sensitive (d->fnitem, TRUE);
+    }
+  else
+    {
+      gtk_widget_set_sensitive (d->mmitem, FALSE);
+      gtk_widget_set_sensitive (d->fnitem, FALSE);
+    }
+}
+
+GtkWidget* reload_filter_menu (MessengerData* d, GSList* folderlist)
+{
+  GSList *c;
+  GtkWidget* filtmenu;
+
+  filtmenu = gtk_menu_new();
+  c = folderlist;
+  for (; c; c = g_slist_next(c) )
+    {
+      gchar* folder = (gchar*) c->data;
+      g_debug( "adding folder '%s'", folder );
+      gtk_menu_shell_append( GTK_MENU_SHELL( filtmenu ), gtk_menu_item_new_with_label( folder ) );
+    }
+
+  return filtmenu;
+}
+
+void setup_ui( MessengerData* d )
+{
+  /* main window */
+  d->window = MOKO_PANED_WINDOW(moko_paned_window_new());
+  d->mmWin = NULL;
+
+  /* application menu */
+  d->menu = gtk_menu_new();
+  gtk_widget_show (d->menu);
+  d->mmitem = gtk_menu_item_new_with_label( "Message Membership" );
+  d->fnitem = gtk_menu_item_new_with_label( "Folder Rename" );
+  GtkWidget* accountitem = gtk_menu_item_new_with_label( "Account" );
+  GtkWidget* helpitem = gtk_menu_item_new_with_label( "Help" );
+  GtkWidget* sepitem = gtk_separator_menu_item_new();
+  GtkWidget* closeitem = gtk_menu_item_new_with_label( "Close" );
+  g_signal_connect( G_OBJECT(closeitem), "activate", G_CALLBACK(main_quit), d );
+  g_signal_connect( G_OBJECT(d->mmitem), "activate", G_CALLBACK(cb_mmitem_activate), d );
+  g_signal_connect( G_OBJECT(d->fnitem), "activate", G_CALLBACK(cb_fnitem_activate), d );
+  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), d->mmitem );
+  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), d->fnitem );
+  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), accountitem );
+  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), helpitem );
+  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), sepitem );
+  gtk_menu_shell_append( GTK_MENU_SHELL(d->menu), closeitem );
+  moko_paned_window_set_application_menu( d->window, GTK_MENU(d->menu) );
+
+  /* filter menu */
+  d->filtmenu = gtk_menu_new();
+  gtk_widget_show (d->filtmenu);
+  d->folderlist = foldersdb_get_folders( d->foldersdb );
+  d->filtmenu = reload_filter_menu( d, d->folderlist );
+
+  moko_paned_window_set_filter_menu( d->window, GTK_MENU(d->filtmenu) );
+  GtkWidget* menubox = GTK_WIDGET(moko_paned_window_get_menubox(d->window));
+  g_signal_connect( G_OBJECT(menubox), "filter_changed", G_CALLBACK(cb_filter_changed), d );
+
+  /* connect close event */
+  g_signal_connect( G_OBJECT(d->window), "delete_event", G_CALLBACK( main_quit ), d );
+
+  /* set navagation area */
+  populate_navigation_area( d );
+
+  /* set toolbox */
+  GtkWidget* newButton;
+  GtkWidget* modeButton;
+  GtkWidget* getmailButton;
+  GtkWidget* deleteButton;
+
+  GtkWidget* newMenu;
+  GtkWidget* modeMenu;
+  GtkWidget* deleteMenu;
+
+  GtkWidget* image;
+
+  /* set tool bar */
+  d->toolbox = moko_tool_box_new_with_search();
+  gtk_widget_show (d->toolbox);
+  GtkWidget* searchEntry = GTK_WIDGET (moko_tool_box_get_entry (MOKO_TOOL_BOX(d->toolbox)));
+  gtk_widget_show (searchEntry);
+  g_signal_connect( G_OBJECT(searchEntry), "changed", G_CALLBACK(cb_search_entry_changed), d );
+  g_signal_connect_swapped ( G_OBJECT(d->toolbox), "searchbox_visible", G_CALLBACK(cb_search_on), d );
+  g_signal_connect_swapped( G_OBJECT(d->toolbox), "searchbox_invisible", G_CALLBACK(cb_search_off), d );
+
+  /* set action buttons*/
+  deleteMenu = gtk_menu_new();
+  GtkWidget* delMsgItem = gtk_image_menu_item_new_with_label( "Delete Message" );
+  GtkWidget* delFolderItem = gtk_image_menu_item_new_with_label( "Delete Folder" );
+  g_signal_connect( G_OBJECT(delFolderItem), "activate", G_CALLBACK(cb_delete_folder), d );
+  g_signal_connect( G_OBJECT(delMsgItem), "activate", G_CALLBACK(cb_delete_message), d );
+
+  gtk_menu_shell_append( GTK_MENU_SHELL(deleteMenu), GTK_WIDGET(delMsgItem) );
+  gtk_menu_shell_append( GTK_MENU_SHELL(deleteMenu), GTK_WIDGET(delFolderItem) );
+  gtk_widget_show_all (deleteMenu);
+  deleteButton = GTK_WIDGET (moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
+  image = gtk_image_new_from_file (PKGDATADIR "/Delete_Message.png");
+  moko_pixmap_button_set_center_image (MOKO_PIXMAP_BUTTON(deleteButton),image);
+  moko_pixmap_button_set_menu (MOKO_PIXMAP_BUTTON(deleteButton), GTK_MENU(deleteMenu));
+
+  getmailButton = GTK_WIDGET(moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
+  image = gtk_image_new_from_file (PKGDATADIR "/GetMail.png");
+  moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(getmailButton),image);
+
+  modeMenu = gtk_menu_new();
+  GtkWidget* modeReadItem = gtk_image_menu_item_new_with_label( "Mode Read" );
+  GtkWidget* modeReplyItem = gtk_image_menu_item_new_with_label( "Mode Reply" );
+  GtkWidget* modeFwdItem = gtk_image_menu_item_new_with_label( "Mode Forward" );
+
+  gtk_menu_shell_append( GTK_MENU_SHELL(modeMenu),modeReadItem);
+  gtk_menu_shell_append( GTK_MENU_SHELL(modeMenu), modeReplyItem);
+  gtk_menu_shell_append( GTK_MENU_SHELL(modeMenu), modeFwdItem);
+  g_signal_connect( G_OBJECT(modeReadItem), "activate", G_CALLBACK(cb_mode_read), d );
+  g_signal_connect( G_OBJECT(modeReplyItem), "activate", G_CALLBACK(cb_mode_reply), d );
+  g_signal_connect( G_OBJECT(modeFwdItem), "activate", G_CALLBACK(cb_mode_forward), d );
+  gtk_widget_show_all (modeMenu);
+  modeButton = GTK_WIDGET(moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
+  image = gtk_image_new_from_file (PKGDATADIR "/Mode_Read.png");
+  moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(modeButton),image);
+  moko_pixmap_button_set_menu ( MOKO_PIXMAP_BUTTON(modeButton), GTK_MENU(modeMenu) );
+
+  newMenu = gtk_menu_new();
+  GtkWidget* newMsgItem = gtk_image_menu_item_new_with_label("New SMS") ;
+  GtkWidget* newFolderItem = gtk_image_menu_item_new_with_label("New Folder") ;
+  GtkWidget* newMailItem = gtk_image_menu_item_new_with_label("New Mail") ;
+
+  gtk_menu_shell_append( GTK_MENU_SHELL(newMenu), newMsgItem);
+  gtk_menu_shell_append( GTK_MENU_SHELL(newMenu), newMailItem);
+  gtk_menu_shell_append( GTK_MENU_SHELL(newMenu), newFolderItem);
+  gtk_widget_show_all (newMenu);
+  g_signal_connect( G_OBJECT(newMsgItem), "activate", G_CALLBACK(cb_new_sms), d );
+  g_signal_connect( G_OBJECT(newMailItem), "activate", G_CALLBACK(cb_new_mail), d );
+  g_signal_connect( G_OBJECT(newFolderItem), "activate", G_CALLBACK(cb_new_folder), d );
+  newButton = GTK_WIDGET(moko_tool_box_add_action_button(MOKO_TOOL_BOX(d->toolbox)));
+  image = gtk_image_new_from_file (PKGDATADIR "/New_Mail.png");
+  moko_pixmap_button_set_center_image (MOKO_PIXMAP_BUTTON(newButton),image);
+  moko_pixmap_button_set_menu ( MOKO_PIXMAP_BUTTON(newButton),GTK_MENU(newMenu) );
+
+  moko_paned_window_add_toolbox( d->window, MOKO_TOOL_BOX(d->toolbox) );
+
+  /* detail area */
+  populate_detail_area (d);
+
+  /* Fix default "Filter Menu" bug*/
+  d->currentfolder = g_strdup("Inbox");
+  GtkWidget* menuitem = gtk_menu_get_attach_widget (GTK_MENU(d->filtmenu));
+  GtkWidget* menulabel = GTK_BIN(menuitem)->child;
+  gtk_label_set_text (GTK_LABEL(menulabel),"Inbox");
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(d->filter));
+
+  /* select the first column */
+  gint index = 0;
+  GtkTreeSelection* tree_selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(d->view) );
+  GtkTreePath *path = gtk_tree_path_new_from_indices( index, -1 );
+  gtk_tree_selection_select_path( tree_selection, path );
+  gtk_tree_view_set_cursor( GTK_TREE_VIEW(d->view), path, NULL, FALSE );
+  gtk_widget_grab_focus (d->view);
+
+  /* temporary setting */
+  GtkSettings* settings = gtk_settings_get_default();
+  g_object_set(settings,
+               "gtk-theme-name","openmoko-standard",
+	       NULL);
+}
+
+gboolean filter_visible_function (GtkTreeModel* model, GtkTreeIter* iter, MessengerData* d)
+{
+  gchar* folder;
+  gchar* from;
+  gchar* subject;
+
+  gtk_tree_model_get (model, iter, COLUMN_FOLDER, &folder, -1);
+  gtk_tree_model_get (model, iter, COLUMN_FROM, &from, -1);
+  gtk_tree_model_get (model, iter, COLUMN_SUBJECT, &subject, -1);
+
+  if (d->searchOn)
+    {
+      if ((strlen(d->s_key) > 0) && !strcasestr(from, d->s_key) && !strcasestr(subject, d->s_key))
+        return FALSE;
+    }
+  else
+    {
+      gtk_menu_set_active (GTK_MENU(d->filtmenu),0);
+      if(g_strcasecmp(folder,d->currentfolder))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
+void cell_data_func (GtkTreeViewColumn *col,
+                     GtkCellRenderer   *renderer,
+                     GtkTreeModel      *model,
+                     GtkTreeIter  	    *iter,
+                     gpointer          user_data)
+{
+  gint status;
+  gtk_tree_model_get(model, iter, COLUMN_STATUS, &status, -1);
+
+  if (status == UNREAD)
+    g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
+  else g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", FALSE, NULL);
+}
+
+void populate_navigation_area( MessengerData* d )
+{
+  guint         i;
+  GdkPixbuf*    icon = NULL;
+  GError*       error = NULL;
+  GtkTreeIter   iter;
+
+  d->liststore = gtk_list_store_new( NUM_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING );
+  d->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (d->liststore),NULL);
+  d->view = moko_tree_view_new_with_model (GTK_TREE_MODEL (d->filter));
+
+  for (i = 0;  i < G_N_ELEMENTS(names);  ++i)
+    {
+      gtk_list_store_append(d->liststore, &iter);
+      switch(states[i])
+        {
+        case UNREAD	  :
+          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Unread.png", &error);
+          break;
+        case READ	  :
+          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Read.png", &error);
+          break;
+        case REPLIED  :
+          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Reply.png", &error);
+          break;
+        case FORWARD  :
+          icon = gdk_pixbuf_new_from_file (PKGDATADIR "/Mode_Forward.png", &error);
+          break;
+        }
+      gtk_list_store_set(d->liststore, &iter,
+                         COLUMN_ICON, icon,
+                         COLUMN_FROM, names[i],
+                         COLUMN_SUBJECT, subjects[i],
+                         COLUMN_CONTENT, contents[i],
+                         COLUMN_STATUS, states[i],
+                         COLUMN_FOLDER, folders[i],
+                         -1);
+    }
+  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (d->filter),
+                                          (GtkTreeModelFilterVisibleFunc)filter_visible_function,
+                                          d,
+                                          NULL);
+  GtkCellRenderer* ren;
+  GtkTreeViewColumn* column = gtk_tree_view_column_new();
+  gtk_tree_view_column_set_title(column, "From");
+
+  /* Add status picture */
+  ren = gtk_cell_renderer_pixbuf_new();
+  gtk_tree_view_column_pack_start(column, ren, FALSE);
+  gtk_tree_view_column_set_attributes(column, ren, "pixbuf", COLUMN_ICON, NULL);
+
+  /* add message from name */
+  ren = gtk_cell_renderer_text_new();
+  gtk_tree_view_column_pack_start(column, ren, TRUE);
+  gtk_tree_view_column_set_attributes(column, ren,
+                                      "text", COLUMN_FROM,
+                                      NULL);
+
+  /* Bold if UNREAD */
+  gtk_tree_view_column_set_cell_data_func (column, ren, cell_data_func, d->liststore, NULL);
+  moko_tree_view_append_column( MOKO_TREE_VIEW(d->view), column );
+
+  ren = gtk_cell_renderer_text_new();
+  column = gtk_tree_view_column_new();
+  gtk_tree_view_column_set_title(column, "Subject");
+  gtk_tree_view_column_pack_start(column, ren, TRUE);
+  gtk_tree_view_column_set_attributes(column, ren, "text", COLUMN_SUBJECT, NULL);
+  gtk_tree_view_column_set_cell_data_func (column, ren, cell_data_func, d->liststore, NULL);
+  moko_tree_view_append_column( MOKO_TREE_VIEW(d->view), column );
+
+  GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(d->view) );
+  g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(cb_cursor_changed), d );
+  moko_paned_window_set_upper_pane( d->window, GTK_WIDGET(moko_tree_view_put_into_scrolled_window(MOKO_TREE_VIEW(d->view))) );
+}
+
+void populate_detail_area( MessengerData* d )
+{
+  d->details = detail_area_new();
+  gtk_widget_show (d->details);
+  gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(d->details), detail_area_get_notebook(DETAIL_AREA(d->details)));
+  moko_paned_window_set_lower_pane( MOKO_PANED_WINDOW(d->window), GTK_WIDGET(moko_details_window_put_in_box(d->details)));
+}
+
+void main_quit(GtkMenuItem* item, MessengerData* d)
+{
+  foldersdb_update (d->folderlist);
+  send_signal_to_footer(d->bus,"");
+  gtk_main_quit();
+}
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/main.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/main.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/main.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,91 +1,91 @@
-/*
- *  Messages -- An messages application for OpenMoko Framework
- *
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *
- *  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 Public License for more details.
- *
- *  Current Version: $Rev$ ($Date$) [$Author$]
- */
-
-#ifndef __MAIN__H_
-#define __MAIN__H_
-
-#include <libmokoui/moko-application.h>
-#include <libmokoui/moko-paned-window.h>
-#include <libmokoui/moko-tool-box.h>
-#include <libmokoui/moko-tree-view.h>
-#include <gtk/gtkliststore.h>
-#include <gtk/gtktreemodelfilter.h>
-#include <dbus/dbus.h>
-
-#include "foldersdb.h"
-#include "detail-area.h"
-
-typedef struct _MessengerData
-  {
-    MokoApplication* app;
-    MokoPanedWindow* window;
-    GtkWidget* menu;
-    GtkWidget* filtmenu;
-    FoldersDB* foldersdb;
-    GtkWidget* toolbox;
-    GtkListStore* liststore;
-    GtkTreeModel* filter;
-    GtkWidget* view;
-    GtkWidget* details;
-    GSList* folderlist;
-    gchar* currentfolder;
-    gchar* s_key;
-    gint   msg_num;
-    gboolean searchOn;
-    GtkWidget* mmWin;
-    GtkWidget* mmitem;
-    GtkWidget* fnitem;
-    GtkWidget* frWin;
-    GtkWidget* nfWin;
-    GtkWidget* nfEntry;
-    GtkWidget* frEntry;
-    DBusConnection *bus;
-  }
-MessengerData;
-
-enum {
-  COLUMN_ICON,
-  COLUMN_FROM,
-  COLUMN_SUBJECT,
-  COLUMN_CONTENT,
-  COLUMN_STATUS,
-  COLUMN_FOLDER,
-  NUM_COLS,
-};
-
-enum {
-  PAGE_EDIT_MODE,
-  PAGE_NEW_MAIL,
-  PAGE_MODE_READ,
-  PAGE_MODE_REPLY,
-  PAGE_MODE_FORWARD,
-  PAGE_MODE_MMSHIP,
-  NUM_PAGES,
-};
-
-GtkWidget* reload_filter_menu (MessengerData* d, GSList* folderlist);
-void setup_ui( MessengerData* d );
-void populate_navigation_area( MessengerData* d );
-void populate_detail_area( MessengerData* d );
-void main_quit(GtkMenuItem* item, MessengerData* d);
-void update_folder_sensitive (MessengerData* d, GSList* folderlist);
-gboolean init_dbus (MessengerData* d);
-
-#endif
-
+/*
+ *  Messages -- An messages application for OpenMoko Framework
+ *
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+#ifndef __MAIN__H_
+#define __MAIN__H_
+
+#include <libmokoui/moko-application.h>
+#include <libmokoui/moko-paned-window.h>
+#include <libmokoui/moko-tool-box.h>
+#include <libmokoui/moko-tree-view.h>
+#include <gtk/gtkliststore.h>
+#include <gtk/gtktreemodelfilter.h>
+#include <dbus/dbus.h>
+
+#include "foldersdb.h"
+#include "detail-area.h"
+
+typedef struct _MessengerData
+  {
+    MokoApplication* app;
+    MokoPanedWindow* window;
+    GtkWidget* menu;
+    GtkWidget* filtmenu;
+    FoldersDB* foldersdb;
+    GtkWidget* toolbox;
+    GtkListStore* liststore;
+    GtkTreeModel* filter;
+    GtkWidget* view;
+    GtkWidget* details;
+    GSList* folderlist;
+    gchar* currentfolder;
+    gchar* s_key;
+    gint   msg_num;
+    gboolean searchOn;
+    GtkWidget* mmWin;
+    GtkWidget* mmitem;
+    GtkWidget* fnitem;
+    GtkWidget* frWin;
+    GtkWidget* nfWin;
+    GtkWidget* nfEntry;
+    GtkWidget* frEntry;
+    DBusConnection *bus;
+  }
+MessengerData;
+
+enum {
+  COLUMN_ICON,
+  COLUMN_FROM,
+  COLUMN_SUBJECT,
+  COLUMN_CONTENT,
+  COLUMN_STATUS,
+  COLUMN_FOLDER,
+  NUM_COLS,
+};
+
+enum {
+  PAGE_EDIT_MODE,
+  PAGE_NEW_MAIL,
+  PAGE_MODE_READ,
+  PAGE_MODE_REPLY,
+  PAGE_MODE_FORWARD,
+  PAGE_MODE_MMSHIP,
+  NUM_PAGES,
+};
+
+GtkWidget* reload_filter_menu (MessengerData* d, GSList* folderlist);
+void setup_ui( MessengerData* d );
+void populate_navigation_area( MessengerData* d );
+void populate_detail_area( MessengerData* d );
+void main_quit(GtkMenuItem* item, MessengerData* d);
+void update_folder_sensitive (MessengerData* d, GSList* folderlist);
+gboolean init_dbus (MessengerData* d);
+
+#endif
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/message.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/message.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/message.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,67 +1,67 @@
-/*
- *  messages.h
- *
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *
- *  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 Public License for more details.
- *
- *  Current Version: $Rev$ ($Date$) [$Author$]
- */
-
-
-#ifndef _MESSAGE_H_
-#define _MESSAGE_H_
-
-typedef struct message
-  {
-    gchar* name;
-    gchar* subject;
-    gchar* folder;
-    gchar* content;
-    gint   status;
-  }
-message;
-
-enum {
-  UNREAD,
-  READ,
-  REPLIED,
-  FORWARD,
-  NUM_STATES,
-};
-
-const static gint states[] =
-  {
-    UNREAD, READ, UNREAD, UNREAD, FORWARD,
-    UNREAD, UNREAD, REPLIED, READ, UNREAD
-  };
-
-const static gchar *names[] =
-  { "John B.", "Jane Z.", "Carl O.", "Owen P.", "Jeremy F.",
-    "Michael M.", "Ute D.", "Akira T.", "Thomas F.", "Matthew J."
-  };
-
-const static gchar *subjects[] =
-  { "Hello Alex", "We need sms support", "I need u", "Help harald", "The gui is really cool", "Can't u see", "2:00 pm", "Bugzillia page", "Hi there", "Target support"
-  };
-
-const static gchar *folders[] =
-  { "Inbox", "Outbox", "Sent", "Inbox", "Inbox",
-    "Inbox", "Inbox", "Inbox", "Inbox", "Inbox"
-  };
-
-const static gchar *contents[] =
-  {"Hello Alex", "We need sms support", "I need u", "Help harald", "The gui is really cool", "Can't u see", "2:00 pm", "Bugzillia page", "Hi there", "Target support"
-  };
-
-#endif
-
+/*
+ *  messages.h
+ *
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  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 Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+
+#ifndef _MESSAGE_H_
+#define _MESSAGE_H_
+
+typedef struct message
+  {
+    gchar* name;
+    gchar* subject;
+    gchar* folder;
+    gchar* content;
+    gint   status;
+  }
+message;
+
+enum {
+  UNREAD,
+  READ,
+  REPLIED,
+  FORWARD,
+  NUM_STATES,
+};
+
+const static gint states[] =
+  {
+    UNREAD, READ, UNREAD, UNREAD, FORWARD,
+    UNREAD, UNREAD, REPLIED, READ, UNREAD
+  };
+
+const static gchar *names[] =
+  { "John B.", "Jane Z.", "Carl O.", "Owen P.", "Jeremy F.",
+    "Michael M.", "Ute D.", "Akira T.", "Thomas F.", "Matthew J."
+  };
+
+const static gchar *subjects[] =
+  { "Hello Alex", "We need sms support", "I need u", "Help harald", "The gui is really cool", "Can't u see", "2:00 pm", "Bugzillia page", "Hi there", "Target support"
+  };
+
+const static gchar *folders[] =
+  { "Inbox", "Outbox", "Sent", "Inbox", "Inbox",
+    "Inbox", "Inbox", "Inbox", "Inbox", "Inbox"
+  };
+
+const static gchar *contents[] =
+  {"Hello Alex", "We need sms support", "I need u", "Help harald", "The gui is really cool", "Can't u see", "2:00 pm", "Bugzillia page", "Hi there", "Target support"
+  };
+
+#endif
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.c	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.c	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,325 +1,325 @@
-/*
- *  sms-contact-window.c
- *  
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *  
- *  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 Public License for more details.
- *  
- *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
- */
-#include "sms-contact-window.h"
-
-G_DEFINE_TYPE (SmsContactWindow, sms_contact_window, MOKO_TYPE_WINDOW)
-
-#define SMS_CONTACT_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SMS_TYPE_CONTACT_WINDOW, SmsContactWindowPrivate))
-
-typedef struct
-{
-  /* private members define here */
-  GtkWidget* vbox;
-  GtkWidget* buttonbox;
-  GtkWidget* contacts_view;
-  SmsContactData* data;
-}SmsContactWindowPrivate;
-
-static gint sms_contact_signals[LAST_SIGNAL] = {0};
-
-static void sms_contact_window_close (SmsContactWindow* self);
-GtkWidget* create_contacts_list (SmsContactData* data);
-static gboolean open_book(SmsContactData* data);
-static void loadContacts (EBook* book, EBookStatus status, gpointer closure);
-static void updateContactsView (EBook* book, EBookStatus status, 
-                                GList* contacts, gpointer closure);
-static void contacts_view_cursor_changed(GtkTreeSelection* selection, SmsContactData* data);
-static void contact_select_done(SmsContactWindow* self);
-gboolean get_selected_contact (GtkTreeModel* model, GtkTreePath* path, 
-                               GtkTreeIter* iter, gpointer data);
-
-static void
-sms_contact_window_dispose(GObject* object)
-{
-  if (G_OBJECT_CLASS (sms_contact_window_parent_class)->dispose)
-    G_OBJECT_CLASS (sms_contact_window_parent_class)->dispose (object);
-}
-
-static void
-sms_contact_window_finalize(GObject* object)
-{
-  G_OBJECT_CLASS (sms_contact_window_parent_class)->finalize (object);
-}
-
-
-static void
-sms_contact_window_class_init (SmsContactWindowClass* klass)
-{
-  GObjectClass* object_class = G_OBJECT_CLASS(klass);
-  g_type_class_add_private (klass, sizeof(SmsContactWindowPrivate));
-
-  klass->contact_select_done = contact_select_done;
-  /* create a new signal */
-  sms_contact_signals[CONTACT_SELECT_DONE_SIGNAL] = g_signal_new("contact_select_done",
-                                                   SMS_TYPE_CONTACT_WINDOW,
-						   G_SIGNAL_RUN_FIRST,
-						   G_STRUCT_OFFSET(SmsContactWindowClass, contact_select_done),
-						   NULL,NULL,
-						   g_cclosure_marshal_VOID__VOID,
-						   G_TYPE_NONE,0,NULL);
-
-  object_class->dispose = sms_contact_window_dispose;
-  object_class->finalize = sms_contact_window_finalize;
-
-}
-
-GtkWidget* sms_contact_new()
-{
-  return GTK_WIDGET(g_object_new(SMS_TYPE_CONTACT_WINDOW, NULL));
-}
-
-static void updateContactsView (EBook* book, EBookStatus status, 
-                                GList* contacts, gpointer closure)
-{
-  GtkTreeIter iter;
-  SmsContactData* data = (SmsContactData*)closure;
-  GtkListStore *contacts_liststore = data->contacts_liststore;
-  GList* c = contacts;
-  data->contacts = contacts;
-  g_debug ("list length %d", g_list_length(c));
-
-  for (;c;c=c->next){
-    EContact *contact = E_CONTACT (c->data);
-    const gchar *name, *phoneNum;
-    name = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
-    phoneNum =  e_contact_get_const (contact, E_CONTACT_PHONE_BUSINESS);
-    gtk_list_store_append(contacts_liststore, &iter);
-    gtk_list_store_set (contacts_liststore, &iter, 
-                        CONTACT_SEL_COL, FALSE,
-                        CONTACT_NAME_COL, name,
-			CONTACT_CELLPHONE_COL, phoneNum,
-			-1);
-  }
-}
-
-static void loadContacts(EBook* book, EBookStatus status, gpointer closure)
-{
-  EBookQuery* query;
-  SmsContactData* data = (SmsContactData*)closure;
-
-  if(status == E_BOOK_ERROR_OK){
-    query = e_book_query_any_field_contains ("");
-    e_book_async_get_contacts(data->book, query, updateContactsView, data);
-    e_book_query_unref(query);
-    g_debug("start loading to tree view");
-  }
-  else
-    g_warning("Got error %d when opening book",status);
-}
-
-static gboolean
-open_book (SmsContactData* data)
-{
-  e_book_async_open(data->book,FALSE,loadContacts,data);
-  return FALSE;
-}
-
-static void
-sms_contact_window_init (SmsContactWindow* self)
-{
-  MokoWindow* parent = (MokoWindow*)moko_application_get_main_window( moko_application_get_instance() );
-  if ( parent )
-    {
-      gtk_window_set_transient_for( GTK_WINDOW(self), GTK_WINDOW(parent) );
-      gtk_window_set_modal( GTK_WINDOW(self), TRUE );
-      gtk_window_set_destroy_with_parent( GTK_WINDOW(self), TRUE );
-    }
-
-  /* initialzation */
-  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
-  priv->vbox = gtk_vbox_new(FALSE,0);
-  SmsContactData* data = g_new0(SmsContactData,1);
-  priv->data = data;
-  data->book = e_book_new_system_addressbook(NULL);
-  if (!data->book)
-    g_critical ("Could not load system addressbook");
-
-  /* Set the "select" window title */
-  GtkWidget* titleLabel = gtk_label_new ("Select Contacts");
-  gtk_widget_set_name( GTK_WIDGET(titleLabel), "mokodialogwindow-title-label" );
-  GtkWidget* eventbox = gtk_event_box_new();
-  gtk_container_add( GTK_CONTAINER(eventbox), GTK_WIDGET(titleLabel) );
-  gtk_widget_set_name( eventbox, "mokodialogwindow-title-labelbox" );  
-  gtk_box_pack_start(GTK_BOX(priv->vbox), eventbox, FALSE, TRUE, 0);
-
-  /* create contact list */
-  data->contacts_liststore = gtk_list_store_new (3, G_TYPE_BOOLEAN,
-                                                 G_TYPE_STRING, G_TYPE_STRING);
-  priv->contacts_view = create_contacts_list(data);
-  gtk_box_pack_start(GTK_BOX(priv->vbox), priv->contacts_view, TRUE, TRUE, 0);
-  g_object_unref (data->contacts_liststore);
-
-  /* add close and back window button */
-  GtkWidget* closebutton = moko_pixmap_button_new();
-  moko_pixmap_button_set_action_btn_lower_label ( MOKO_PIXMAP_BUTTON(closebutton),"Select");
-  g_signal_connect_swapped( G_OBJECT(closebutton), "clicked", G_CALLBACK(sms_contact_window_close), self );
-  GtkWidget* backbutton = moko_pixmap_button_new();
-  moko_pixmap_button_set_action_btn_lower_label ( MOKO_PIXMAP_BUTTON(backbutton),"Back");
-  g_signal_connect_swapped( G_OBJECT(backbutton), "clicked", G_CALLBACK(sms_contact_window_close), self );
-  priv->buttonbox = gtk_hbox_new (FALSE,0);
-  gtk_box_pack_start(GTK_BOX(priv->buttonbox), closebutton, TRUE, TRUE, 0);
-  gtk_box_pack_start(GTK_BOX(priv->buttonbox), backbutton, TRUE, TRUE, 0);
-  gtk_box_pack_start(GTK_BOX(priv->vbox), priv->buttonbox, FALSE, TRUE, 0);
-  
-  /* loading contacts */
-  g_idle_add((GSourceFunc)open_book,data);
-  //loadBook(data);
-
-  gtk_widget_show_all(priv->vbox);
-  gtk_container_add(GTK_CONTAINER(self), priv->vbox);
-
-}
-
-GtkWidget *
-create_contacts_list (SmsContactData *data)
-{
-  MokoNavigationList* moko_navigation_list = (MokoNavigationList*)moko_navigation_list_new ();
-  GtkWidget* treeview = GTK_WIDGET (moko_navigation_list_get_tree_view (moko_navigation_list));
-  
-  gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
-                           GTK_TREE_MODEL (data->contacts_liststore));
-
-  /* add columns to treeview */
-  GtkCellRenderer* renderer;
-  GtkTreeViewColumn* column;
-
-  /* name column */
-  column = gtk_tree_view_column_new();
-  gtk_tree_view_column_set_title(column, "Name");
-
-  renderer = gtk_cell_renderer_toggle_new();
-  gtk_tree_view_column_pack_start (column, renderer, TRUE);
-  gtk_tree_view_column_set_attributes (column, renderer,
-                                       "active", CONTACT_SEL_COL, NULL);
-
-  renderer = gtk_cell_renderer_text_new();
-  gtk_tree_view_column_pack_start (column, renderer, TRUE);
-  gtk_tree_view_column_set_attributes (column, renderer,
-                                       "text", CONTACT_NAME_COL, NULL);
-  gtk_tree_view_column_set_sort_column_id (column, CONTACT_NAME_COL);
-
-  moko_navigation_list_append_column (moko_navigation_list, column);
-
-  /* mobile column */
-  renderer = gtk_cell_renderer_text_new ();
-  column = gtk_tree_view_column_new_with_attributes ("Cell Phone", renderer,
-                                                     "text", CONTACT_CELLPHONE_COL, NULL);
-  gtk_tree_view_column_set_sort_column_id (column, CONTACT_CELLPHONE_COL);
-  moko_navigation_list_append_column (moko_navigation_list, column);
-
-  GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(treeview) );
-  g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(contacts_view_cursor_changed), data );
-
-  return GTK_WIDGET (moko_navigation_list);
-}
-
-gboolean get_selected_contact (GtkTreeModel* model, GtkTreePath* path, 
-                               GtkTreeIter* iter, gpointer data)
-{
-  SmsContactWindow* self = (SmsContactWindow*)data;
-  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
-  SmsContactData* contactData = priv->data;
-  g_debug ("select item contacts %d", g_list_length(contactData->contacts));
-
-  gchar* name;
-  gboolean selected;
-  gtk_tree_model_get (model, iter,
-                      CONTACT_SEL_COL, &selected,
-		      CONTACT_NAME_COL,&name,
-		      -1);
-  if (selected)
-    g_debug ("contact %s selected", name);
-  else {
-    g_debug ("contact %s not selected, remove from contacts list", name);
-    GList* contactListItem = contactData->contacts;
-    for ( ; contactListItem; contactListItem=contactListItem->next){
-      EContact* contact = E_CONTACT (contactListItem->data);
-      const gchar *contactName;
-      contactName = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
-      if (!g_strcasecmp(name, contactName)) 
-        contactData->contacts = g_list_remove (contactData->contacts,
-	                                       contactListItem->data);
-    }
-  }
-
-  return FALSE;
-}
-
-static void sms_contact_window_close (SmsContactWindow* self)
-{
-  /* emit selection done signal */
-  g_signal_emit (G_OBJECT(self),sms_contact_signals[CONTACT_SELECT_DONE_SIGNAL],0);
-
-  /* Synthesize delete_event to close dialog. */
-
-  GtkWidget *widget = GTK_WIDGET(self);
-  GdkEvent *event;
-
-  event = gdk_event_new( GDK_DELETE );
-
-  event->any.window = g_object_ref(widget->window);
-  event->any.send_event = TRUE;
-
-  gtk_main_do_event( event );
-  gdk_event_free( event );
-  
-}
-
-static void contacts_view_cursor_changed(GtkTreeSelection* selection, SmsContactData* data)
-{
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  //GtkTreeView* view = gtk_tree_selection_get_tree_view( selection );
-
-  if ( gtk_tree_selection_get_selected( selection, &model, &iter ) )
-  {
-     gchar* name;
-     gchar* phoneNum;
-     gboolean selected;
-     GtkListStore* liststore = data->contacts_liststore;
-
-     gtk_tree_model_get( model, &iter, 
-                         CONTACT_SEL_COL, &selected,
-			 CONTACT_NAME_COL, &name,
-                         CONTACT_CELLPHONE_COL, &phoneNum,
-                         -1);
-
-    if (selected)
-      gtk_list_store_set (liststore, &iter, CONTACT_SEL_COL, FALSE, -1);
-    else
-      gtk_list_store_set (liststore, &iter, CONTACT_SEL_COL, TRUE, -1);
-  }
-
-}
-
-static void contact_select_done(SmsContactWindow* self)
-{
-  g_debug("select ok");
-  /* get selected items */
-  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
-  GtkWidget* contactView = moko_navigation_list_get_tree_view(MOKO_NAVIGATION_LIST(priv->contacts_view));
-  GtkTreeModel* contactModel = gtk_tree_view_get_model (GTK_TREE_VIEW(contactView));
-  gtk_tree_model_foreach (contactModel, get_selected_contact, self);
-}
-
-GList* sms_get_selected_contacts(SmsContactWindow* self)
-{
-  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
-  return priv->data->contacts;
-}
+/*
+ *  sms-contact-window.c
+ *  
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *  
+ *  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 Public License for more details.
+ *  
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
+ */
+#include "sms-contact-window.h"
+
+G_DEFINE_TYPE (SmsContactWindow, sms_contact_window, MOKO_TYPE_WINDOW)
+
+#define SMS_CONTACT_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SMS_TYPE_CONTACT_WINDOW, SmsContactWindowPrivate))
+
+typedef struct
+{
+  /* private members define here */
+  GtkWidget* vbox;
+  GtkWidget* buttonbox;
+  GtkWidget* contacts_view;
+  SmsContactData* data;
+}SmsContactWindowPrivate;
+
+static gint sms_contact_signals[LAST_SIGNAL] = {0};
+
+static void sms_contact_window_close (SmsContactWindow* self);
+GtkWidget* create_contacts_list (SmsContactData* data);
+static gboolean open_book(SmsContactData* data);
+static void loadContacts (EBook* book, EBookStatus status, gpointer closure);
+static void updateContactsView (EBook* book, EBookStatus status, 
+                                GList* contacts, gpointer closure);
+static void contacts_view_cursor_changed(GtkTreeSelection* selection, SmsContactData* data);
+static void contact_select_done(SmsContactWindow* self);
+gboolean get_selected_contact (GtkTreeModel* model, GtkTreePath* path, 
+                               GtkTreeIter* iter, gpointer data);
+
+static void
+sms_contact_window_dispose(GObject* object)
+{
+  if (G_OBJECT_CLASS (sms_contact_window_parent_class)->dispose)
+    G_OBJECT_CLASS (sms_contact_window_parent_class)->dispose (object);
+}
+
+static void
+sms_contact_window_finalize(GObject* object)
+{
+  G_OBJECT_CLASS (sms_contact_window_parent_class)->finalize (object);
+}
+
+
+static void
+sms_contact_window_class_init (SmsContactWindowClass* klass)
+{
+  GObjectClass* object_class = G_OBJECT_CLASS(klass);
+  g_type_class_add_private (klass, sizeof(SmsContactWindowPrivate));
+
+  klass->contact_select_done = contact_select_done;
+  /* create a new signal */
+  sms_contact_signals[CONTACT_SELECT_DONE_SIGNAL] = g_signal_new("contact_select_done",
+                                                   SMS_TYPE_CONTACT_WINDOW,
+						   G_SIGNAL_RUN_FIRST,
+						   G_STRUCT_OFFSET(SmsContactWindowClass, contact_select_done),
+						   NULL,NULL,
+						   g_cclosure_marshal_VOID__VOID,
+						   G_TYPE_NONE,0,NULL);
+
+  object_class->dispose = sms_contact_window_dispose;
+  object_class->finalize = sms_contact_window_finalize;
+
+}
+
+GtkWidget* sms_contact_new()
+{
+  return GTK_WIDGET(g_object_new(SMS_TYPE_CONTACT_WINDOW, NULL));
+}
+
+static void updateContactsView (EBook* book, EBookStatus status, 
+                                GList* contacts, gpointer closure)
+{
+  GtkTreeIter iter;
+  SmsContactData* data = (SmsContactData*)closure;
+  GtkListStore *contacts_liststore = data->contacts_liststore;
+  GList* c = contacts;
+  data->contacts = contacts;
+  g_debug ("list length %d", g_list_length(c));
+
+  for (;c;c=c->next){
+    EContact *contact = E_CONTACT (c->data);
+    const gchar *name, *phoneNum;
+    name = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
+    phoneNum =  e_contact_get_const (contact, E_CONTACT_PHONE_BUSINESS);
+    gtk_list_store_append(contacts_liststore, &iter);
+    gtk_list_store_set (contacts_liststore, &iter, 
+                        CONTACT_SEL_COL, FALSE,
+                        CONTACT_NAME_COL, name,
+			CONTACT_CELLPHONE_COL, phoneNum,
+			-1);
+  }
+}
+
+static void loadContacts(EBook* book, EBookStatus status, gpointer closure)
+{
+  EBookQuery* query;
+  SmsContactData* data = (SmsContactData*)closure;
+
+  if(status == E_BOOK_ERROR_OK){
+    query = e_book_query_any_field_contains ("");
+    e_book_async_get_contacts(data->book, query, updateContactsView, data);
+    e_book_query_unref(query);
+    g_debug("start loading to tree view");
+  }
+  else
+    g_warning("Got error %d when opening book",status);
+}
+
+static gboolean
+open_book (SmsContactData* data)
+{
+  e_book_async_open(data->book,FALSE,loadContacts,data);
+  return FALSE;
+}
+
+static void
+sms_contact_window_init (SmsContactWindow* self)
+{
+  MokoWindow* parent = (MokoWindow*)moko_application_get_main_window( moko_application_get_instance() );
+  if ( parent )
+    {
+      gtk_window_set_transient_for( GTK_WINDOW(self), GTK_WINDOW(parent) );
+      gtk_window_set_modal( GTK_WINDOW(self), TRUE );
+      gtk_window_set_destroy_with_parent( GTK_WINDOW(self), TRUE );
+    }
+
+  /* initialzation */
+  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
+  priv->vbox = gtk_vbox_new(FALSE,0);
+  SmsContactData* data = g_new0(SmsContactData,1);
+  priv->data = data;
+  data->book = e_book_new_system_addressbook(NULL);
+  if (!data->book)
+    g_critical ("Could not load system addressbook");
+
+  /* Set the "select" window title */
+  GtkWidget* titleLabel = gtk_label_new ("Select Contacts");
+  gtk_widget_set_name( GTK_WIDGET(titleLabel), "mokodialogwindow-title-label" );
+  GtkWidget* eventbox = gtk_event_box_new();
+  gtk_container_add( GTK_CONTAINER(eventbox), GTK_WIDGET(titleLabel) );
+  gtk_widget_set_name( eventbox, "mokodialogwindow-title-labelbox" );  
+  gtk_box_pack_start(GTK_BOX(priv->vbox), eventbox, FALSE, TRUE, 0);
+
+  /* create contact list */
+  data->contacts_liststore = gtk_list_store_new (3, G_TYPE_BOOLEAN,
+                                                 G_TYPE_STRING, G_TYPE_STRING);
+  priv->contacts_view = create_contacts_list(data);
+  gtk_box_pack_start(GTK_BOX(priv->vbox), priv->contacts_view, TRUE, TRUE, 0);
+  g_object_unref (data->contacts_liststore);
+
+  /* add close and back window button */
+  GtkWidget* closebutton = moko_pixmap_button_new();
+  moko_pixmap_button_set_action_btn_lower_label ( MOKO_PIXMAP_BUTTON(closebutton),"Select");
+  g_signal_connect_swapped( G_OBJECT(closebutton), "clicked", G_CALLBACK(sms_contact_window_close), self );
+  GtkWidget* backbutton = moko_pixmap_button_new();
+  moko_pixmap_button_set_action_btn_lower_label ( MOKO_PIXMAP_BUTTON(backbutton),"Back");
+  g_signal_connect_swapped( G_OBJECT(backbutton), "clicked", G_CALLBACK(sms_contact_window_close), self );
+  priv->buttonbox = gtk_hbox_new (FALSE,0);
+  gtk_box_pack_start(GTK_BOX(priv->buttonbox), closebutton, TRUE, TRUE, 0);
+  gtk_box_pack_start(GTK_BOX(priv->buttonbox), backbutton, TRUE, TRUE, 0);
+  gtk_box_pack_start(GTK_BOX(priv->vbox), priv->buttonbox, FALSE, TRUE, 0);
+  
+  /* loading contacts */
+  g_idle_add((GSourceFunc)open_book,data);
+  //loadBook(data);
+
+  gtk_widget_show_all(priv->vbox);
+  gtk_container_add(GTK_CONTAINER(self), priv->vbox);
+
+}
+
+GtkWidget *
+create_contacts_list (SmsContactData *data)
+{
+  MokoNavigationList* moko_navigation_list = (MokoNavigationList*)moko_navigation_list_new ();
+  GtkWidget* treeview = GTK_WIDGET (moko_navigation_list_get_tree_view (moko_navigation_list));
+  
+  gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
+                           GTK_TREE_MODEL (data->contacts_liststore));
+
+  /* add columns to treeview */
+  GtkCellRenderer* renderer;
+  GtkTreeViewColumn* column;
+
+  /* name column */
+  column = gtk_tree_view_column_new();
+  gtk_tree_view_column_set_title(column, "Name");
+
+  renderer = gtk_cell_renderer_toggle_new();
+  gtk_tree_view_column_pack_start (column, renderer, TRUE);
+  gtk_tree_view_column_set_attributes (column, renderer,
+                                       "active", CONTACT_SEL_COL, NULL);
+
+  renderer = gtk_cell_renderer_text_new();
+  gtk_tree_view_column_pack_start (column, renderer, TRUE);
+  gtk_tree_view_column_set_attributes (column, renderer,
+                                       "text", CONTACT_NAME_COL, NULL);
+  gtk_tree_view_column_set_sort_column_id (column, CONTACT_NAME_COL);
+
+  moko_navigation_list_append_column (moko_navigation_list, column);
+
+  /* mobile column */
+  renderer = gtk_cell_renderer_text_new ();
+  column = gtk_tree_view_column_new_with_attributes ("Cell Phone", renderer,
+                                                     "text", CONTACT_CELLPHONE_COL, NULL);
+  gtk_tree_view_column_set_sort_column_id (column, CONTACT_CELLPHONE_COL);
+  moko_navigation_list_append_column (moko_navigation_list, column);
+
+  GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(treeview) );
+  g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(contacts_view_cursor_changed), data );
+
+  return GTK_WIDGET (moko_navigation_list);
+}
+
+gboolean get_selected_contact (GtkTreeModel* model, GtkTreePath* path, 
+                               GtkTreeIter* iter, gpointer data)
+{
+  SmsContactWindow* self = (SmsContactWindow*)data;
+  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
+  SmsContactData* contactData = priv->data;
+  g_debug ("select item contacts %d", g_list_length(contactData->contacts));
+
+  gchar* name;
+  gboolean selected;
+  gtk_tree_model_get (model, iter,
+                      CONTACT_SEL_COL, &selected,
+		      CONTACT_NAME_COL,&name,
+		      -1);
+  if (selected)
+    g_debug ("contact %s selected", name);
+  else {
+    g_debug ("contact %s not selected, remove from contacts list", name);
+    GList* contactListItem = contactData->contacts;
+    for ( ; contactListItem; contactListItem=contactListItem->next){
+      EContact* contact = E_CONTACT (contactListItem->data);
+      const gchar *contactName;
+      contactName = e_contact_get_const (contact, E_CONTACT_FULL_NAME);
+      if (!g_strcasecmp(name, contactName)) 
+        contactData->contacts = g_list_remove (contactData->contacts,
+	                                       contactListItem->data);
+    }
+  }
+
+  return FALSE;
+}
+
+static void sms_contact_window_close (SmsContactWindow* self)
+{
+  /* emit selection done signal */
+  g_signal_emit (G_OBJECT(self),sms_contact_signals[CONTACT_SELECT_DONE_SIGNAL],0);
+
+  /* Synthesize delete_event to close dialog. */
+
+  GtkWidget *widget = GTK_WIDGET(self);
+  GdkEvent *event;
+
+  event = gdk_event_new( GDK_DELETE );
+
+  event->any.window = g_object_ref(widget->window);
+  event->any.send_event = TRUE;
+
+  gtk_main_do_event( event );
+  gdk_event_free( event );
+  
+}
+
+static void contacts_view_cursor_changed(GtkTreeSelection* selection, SmsContactData* data)
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  //GtkTreeView* view = gtk_tree_selection_get_tree_view( selection );
+
+  if ( gtk_tree_selection_get_selected( selection, &model, &iter ) )
+  {
+     gchar* name;
+     gchar* phoneNum;
+     gboolean selected;
+     GtkListStore* liststore = data->contacts_liststore;
+
+     gtk_tree_model_get( model, &iter, 
+                         CONTACT_SEL_COL, &selected,
+			 CONTACT_NAME_COL, &name,
+                         CONTACT_CELLPHONE_COL, &phoneNum,
+                         -1);
+
+    if (selected)
+      gtk_list_store_set (liststore, &iter, CONTACT_SEL_COL, FALSE, -1);
+    else
+      gtk_list_store_set (liststore, &iter, CONTACT_SEL_COL, TRUE, -1);
+  }
+
+}
+
+static void contact_select_done(SmsContactWindow* self)
+{
+  g_debug("select ok");
+  /* get selected items */
+  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
+  GtkWidget* contactView = moko_navigation_list_get_tree_view(MOKO_NAVIGATION_LIST(priv->contacts_view));
+  GtkTreeModel* contactModel = gtk_tree_view_get_model (GTK_TREE_VIEW(contactView));
+  gtk_tree_model_foreach (contactModel, get_selected_contact, self);
+}
+
+GList* sms_get_selected_contacts(SmsContactWindow* self)
+{
+  SmsContactWindowPrivate* priv = SMS_CONTACT_WINDOW_GET_PRIVATE(self);
+  return priv->data->contacts;
+}

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-contact-window.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,77 +1,77 @@
-/*
- *  sms-contact-window.h
- *  
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *  
- *  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 Public License for more details.
- *  
- *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
- */
-#ifndef _SMS_CONTACT_WINDOW_H_
-#define _SMS_CONTACT_WINDOW_H_
-
-#include <libmokoui/moko-window.h>
-#include <libmokoui/moko-pixmap-button.h>
-#include <libmokoui/moko-navigation-list.h>
-#include <libmokoui/moko-application.h>
-#include <libebook/e-book.h>
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define SMS_TYPE_CONTACT_WINDOW  sms_contact_window_get_type()
-#define SMS_CONTACT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SMS_TYPE_CONTACT_WINDOW, SmsContactWindow))
-#define SMS_CONTACT_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SMS_TYPE_CONTACT_WINDOW, SmsContactWindowClass))
-#define SMS_IS_CONTACT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SMS_TYPE_CONTACT_WINDOW))
-#define SMS_IS_CONTACT_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), SMS_TYPE_CONTACT_WINDOW_CLASS)
-#define SMS_GET_CONTACT_WINDOW_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SMS_TYPE_CONTACT_WINDOW, SmsContactWindowClass)
-
-enum {
-  CONTACT_SEL_COL,
-  CONTACT_NAME_COL,
-  CONTACT_CELLPHONE_COL,
-  CONTACT_LAST_COL
-};
-
-enum {
-  CONTACT_SELECT_DONE_SIGNAL,
-  LAST_SIGNAL
-};
-
-typedef struct
-{
-  MokoWindow parent;
-  /* instance members */
-}SmsContactWindow;
-
-typedef struct
-{
-  MokoWindowClass parent_class;
-  /* class members */
-  void (*contact_select_done)(void);
-}SmsContactWindowClass;
-
-typedef struct
-{
-  EBook* book;
-  GtkListStore *contacts_liststore;
-  GList* contacts;
-}SmsContactData;
-
-GType sms_contact_window_get_type();
-GtkWidget* sms_contact_new();
-GList* sms_get_selected_contacts(SmsContactWindow* self);
-
-G_END_DECLS
-
-#endif
+/*
+ *  sms-contact-window.h
+ *  
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *  
+ *  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 Public License for more details.
+ *  
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
+ */
+#ifndef _SMS_CONTACT_WINDOW_H_
+#define _SMS_CONTACT_WINDOW_H_
+
+#include <libmokoui/moko-window.h>
+#include <libmokoui/moko-pixmap-button.h>
+#include <libmokoui/moko-navigation-list.h>
+#include <libmokoui/moko-application.h>
+#include <libebook/e-book.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define SMS_TYPE_CONTACT_WINDOW  sms_contact_window_get_type()
+#define SMS_CONTACT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SMS_TYPE_CONTACT_WINDOW, SmsContactWindow))
+#define SMS_CONTACT_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SMS_TYPE_CONTACT_WINDOW, SmsContactWindowClass))
+#define SMS_IS_CONTACT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SMS_TYPE_CONTACT_WINDOW))
+#define SMS_IS_CONTACT_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), SMS_TYPE_CONTACT_WINDOW_CLASS)
+#define SMS_GET_CONTACT_WINDOW_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SMS_TYPE_CONTACT_WINDOW, SmsContactWindowClass)
+
+enum {
+  CONTACT_SEL_COL,
+  CONTACT_NAME_COL,
+  CONTACT_CELLPHONE_COL,
+  CONTACT_LAST_COL
+};
+
+enum {
+  CONTACT_SELECT_DONE_SIGNAL,
+  LAST_SIGNAL
+};
+
+typedef struct
+{
+  MokoWindow parent;
+  /* instance members */
+}SmsContactWindow;
+
+typedef struct
+{
+  MokoWindowClass parent_class;
+  /* class members */
+  void (*contact_select_done)(void);
+}SmsContactWindowClass;
+
+typedef struct
+{
+  EBook* book;
+  GtkListStore *contacts_liststore;
+  GList* contacts;
+}SmsContactData;
+
+GType sms_contact_window_get_type();
+GtkWidget* sms_contact_new();
+GList* sms_get_selected_contacts(SmsContactWindow* self);
+
+G_END_DECLS
+
+#endif

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.c	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.c	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,454 +1,454 @@
-/*
- *  sms-dialog-window.c
- *  
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *  
- *  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 Public License for more details.
- *  
- *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
- */
-
-#include "sms-dialog-window.h"
-#include "main.h"
-#include <libmokoui/moko-pixmap-button.h>
-#include <libmokoui/moko-fixed.h>
-
-#include <gtk/gtkeventbox.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtktextview.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <gtk/gtkviewport.h>
-
-#include <pango/pango-font.h>
-
-#include <glib/gmain.h>
-
-G_DEFINE_TYPE (SmsDialogWindow, sms_dialog_window, MOKO_TYPE_WINDOW)
-
-#define SMS_DIALOG_WINDOW_GET_PRIVATE(o)   (G_TYPE_INSTANCE_GET_PRIVATE ((o), SMS_TYPE_DIALOG_WINDOW, SmsDialogWindowPrivate))
-
-typedef struct _SmsDialogWindowPrivate SmsDialogWindowPrivate;
-
-struct _SmsDialogWindowPrivate
-  {
-    GtkWidget* vbox;
-    GtkWidget* hbox;
-    GtkWidget* eventbox;
-    GtkWidget* titleLabel;
-    GtkWidget* textInLabel;
-    GtkWidget* toolbox;
-    GtkWidget* closebutton;
-    GtkWidget* txtView;
-  };
-
-typedef struct _SmsDialogRunInfo
-  {
-    SmsDialogWindow *dialog;
-    gint response_id;
-    GMainLoop *loop;
-    gboolean destroyed;
-  }
-SmsDialogRunInfo;
-
-static void sms_dialog_window_close(SmsDialogWindow* self);
-gboolean on_sms_txtView_key_release_event       (GtkWidget       *widget,
-    GdkEventKey     *event,
-    SmsDialogWindow *self);
-
-
-static void
-shutdown_loop (SmsDialogRunInfo *ri)
-{
-  if (g_main_loop_is_running (ri->loop))
-    g_main_loop_quit (ri->loop);
-}
-
-static void
-run_unmap_handler (SmsDialogWindow* dialog, gpointer data)
-{
-  SmsDialogRunInfo *ri = data;
-
-  shutdown_loop (ri);
-}
-
-static void
-run_response_handler (SmsDialogWindow* dialog,
-                      gint response_id,
-                      gpointer data)
-{
-  SmsDialogRunInfo *ri;
-
-  ri = data;
-
-  ri->response_id = response_id;
-
-  shutdown_loop (ri);
-}
-
-static gint
-run_delete_handler (SmsDialogWindow* dialog,
-                    GdkEventAny *event,
-                    gpointer data)
-{
-  SmsDialogRunInfo *ri = data;
-
-  shutdown_loop (ri);
-
-  return TRUE; /* Do not destroy */
-}
-
-static void
-run_destroy_handler (SmsDialogWindow* dialog, gpointer data)
-{
-  SmsDialogRunInfo *ri = data;
-
-  /* shutdown_loop will be called by run_unmap_handler */
-
-  ri->destroyed = TRUE;
-}
-
-
-static void
-sms_dialog_window_dispose(GObject* object)
-{
-  if (G_OBJECT_CLASS (sms_dialog_window_parent_class)->dispose)
-    G_OBJECT_CLASS (sms_dialog_window_parent_class)->dispose (object);
-}
-
-static void
-sms_dialog_window_finalize(GObject* object)
-{
-  G_OBJECT_CLASS (sms_dialog_window_parent_class)->finalize (object);
-}
-
-static void
-sms_dialog_window_class_init(SmsDialogWindowClass* klass)
-{
-  GObjectClass* object_class = G_OBJECT_CLASS(klass);
-
-  g_type_class_add_private (klass, sizeof(SmsDialogWindowPrivate));
-
-  object_class->dispose = sms_dialog_window_dispose;
-  object_class->finalize = sms_dialog_window_finalize;
-}
-
-SmsDialogWindow*
-sms_dialog_window_new(void)
-{
-  return g_object_new(SMS_TYPE_DIALOG_WINDOW, NULL);
-}
-
-static void
-sms_dialog_window_init(SmsDialogWindow* self)
-{
-  MokoWindow* parent = (MokoWindow*)moko_application_get_main_window( moko_application_get_instance() );
-  if ( parent )
-    {
-      gtk_window_set_transient_for( GTK_WINDOW(self), GTK_WINDOW(parent) );
-#ifndef DEBUG_THIS_FILE
-      gtk_window_set_modal( GTK_WINDOW(self), TRUE );
-#endif
-      gtk_window_set_destroy_with_parent( GTK_WINDOW(self), TRUE );
-    }
-}
-
-void sms_dialog_window_set_title(SmsDialogWindow* self, const gchar* title)
-{
-  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
-  if ( !priv->titleLabel )
-    {
-      priv->titleLabel = gtk_label_new( title );
-      priv->hbox = gtk_hbox_new( FALSE, 0 );
-      gtk_window_set_title( GTK_WINDOW(self), title );
-      gtk_widget_set_name( GTK_WIDGET(priv->titleLabel), "mokodialogwindow-title-label" );
-      gtk_box_pack_start( GTK_BOX(priv->hbox), GTK_WIDGET(priv->titleLabel), TRUE, TRUE, 0 );
-      PangoFontDescription* font_desc = pango_font_description_from_string ("Bold 10");
-      priv->textInLabel = gtk_label_new( "160(1)" );
-      gtk_widget_modify_font (priv->textInLabel, font_desc);
-      gtk_widget_set_name( GTK_WIDGET(priv->textInLabel), "mokodialogwindow-title-label" );
-      gtk_box_pack_start( GTK_BOX(priv->hbox), GTK_WIDGET(priv->textInLabel), FALSE, FALSE, 0);
-      priv->eventbox = gtk_event_box_new();
-      gtk_container_add( GTK_CONTAINER(priv->eventbox), GTK_WIDGET(priv->hbox) );
-      gtk_widget_set_name( GTK_WIDGET(priv->eventbox), "mokodialogwindow-title-labelbox" );
-      //FIXME get from theme
-      gtk_misc_set_padding( GTK_MISC(priv->titleLabel), 0, 6 );
-      gtk_widget_show( GTK_WIDGET(priv->titleLabel) );
-      gtk_widget_show( GTK_WIDGET(priv->eventbox) );
-    }
-  else
-    {
-      gtk_label_set_text( GTK_LABEL(priv->titleLabel), title );
-      gtk_window_set_title( GTK_WINDOW(self), title );
-    }
-  if ( !priv->vbox )
-    {
-      GtkWidget* image;
-      GtkWidget* smsSendBtn;
-      GtkWidget* emailBtn;
-
-      priv->vbox = gtk_vbox_new( FALSE, 0 );
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->eventbox), FALSE, FALSE, 0 );
-
-      //Add toolbox
-      priv->hbox = gtk_hbox_new( FALSE, 0 );
-      priv->toolbox = moko_tool_box_new();
-      GtkWidget* btnBox = moko_tool_box_get_button_box (MOKO_TOOL_BOX(priv->toolbox));
-      priv->closebutton = moko_pixmap_button_new();
-      image = gtk_image_new_from_file (PKGDATADIR "/Cancel.png");
-      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(priv->closebutton),image);
-      gtk_widget_set_name( GTK_WIDGET(priv->closebutton), "mokostylusbutton-black" );
-      gtk_box_pack_end (GTK_BOX(btnBox),priv->closebutton,FALSE,FALSE,280);
-      g_signal_connect_swapped( G_OBJECT(priv->closebutton), "clicked", G_CALLBACK(sms_dialog_window_close), self );
-
-      self->addressBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
-      gtk_widget_set_name( GTK_WIDGET(self->addressBtn ), "mokostylusbutton-white" );
-      image = gtk_image_new_from_file (PKGDATADIR "/Address.png");
-      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(self->addressBtn ),image);
-
-      smsSendBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
-      gtk_widget_set_name( GTK_WIDGET(smsSendBtn), "mokostylusbutton-white" );
-      image = gtk_image_new_from_file (PKGDATADIR "/Send.png");
-      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(smsSendBtn),image);
-
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->toolbox), FALSE, FALSE, 0 );
-      gtk_container_add( GTK_CONTAINER(self), GTK_WIDGET(priv->vbox) );
-
-      //Fill input entry
-      GtkAlignment* alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
-      gtk_alignment_set_padding (alignment, 10, 10, 50, 10);
-      GtkWidget* entrybox = gtk_hbox_new(FALSE,0);
-      GtkWidget* toLabel = gtk_label_new("To:");
-      gtk_widget_set_size_request (toLabel, 40, -1);
-      gtk_misc_set_alignment (GTK_MISC (toLabel),1,0.5);
-      self->toEntry = gtk_entry_new();
-      gtk_widget_set_size_request (self->toEntry, 320, -1);
-      gtk_box_pack_start (GTK_BOX(entrybox),toLabel,FALSE,TRUE,0);
-      gtk_box_pack_start (GTK_BOX(entrybox),self->toEntry,FALSE,TRUE,0);
-      gtk_container_add (GTK_CONTAINER(alignment), entrybox);
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(alignment), FALSE, FALSE, 0 );
-
-      /* fill textview */
-      priv->txtView = gtk_text_view_new();
-      GtkWidget* viewAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
-      gtk_alignment_set_padding (GTK_ALIGNMENT(viewAlign),10,10,30,30);
-      GtkWidget* scolwin = gtk_scrolled_window_new (NULL, NULL);
-      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scolwin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
-      GtkWidget*  viewport = gtk_viewport_new (NULL, NULL);
-      gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(priv->txtView),GTK_WRAP_CHAR);
-      gtk_container_add (GTK_CONTAINER(viewport), priv->txtView);
-      gtk_container_add (GTK_CONTAINER (scolwin), viewport);
-      gtk_container_add (GTK_CONTAINER(viewAlign),scolwin);
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(viewAlign), TRUE, TRUE, 0 );
-      gtk_widget_show_all( GTK_WIDGET(priv->vbox) );
-
-      g_signal_connect ( G_OBJECT(priv->txtView), "key_release_event",
-                         G_CALLBACK (on_sms_txtView_key_release_event),
-                         self);
-    }
-}
-
-void mail_dialog_window_set_title(SmsDialogWindow* self, const gchar* title)
-{
-  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
-  if ( !priv->titleLabel )
-    {
-      priv->titleLabel = gtk_label_new( title );
-      gtk_window_set_title( GTK_WINDOW(self), title );
-      gtk_widget_set_name( GTK_WIDGET(priv->titleLabel), "mokodialogwindow-title-label" );
-      priv->eventbox = gtk_event_box_new();
-      gtk_widget_set_name( GTK_WIDGET(priv->eventbox), "mokodialogwindow-title-labelbox" );
-      //FIXME get from theme
-      gtk_misc_set_padding( GTK_MISC(priv->titleLabel), 0, 6 );
-      gtk_container_add (GTK_CONTAINER(priv->eventbox), priv->titleLabel);
-      gtk_widget_show( GTK_WIDGET(priv->titleLabel) );
-      gtk_widget_show( GTK_WIDGET(priv->eventbox) );
-    }
-  else
-    {
-      gtk_label_set_text( GTK_LABEL(priv->titleLabel), title );
-      gtk_window_set_title( GTK_WINDOW(self), title );
-    }
-  if ( !priv->vbox )
-    {
-      GtkWidget* image;
-      GtkWidget* smsSendBtn;
-      GtkWidget* emailBtn;
-
-      priv->vbox = gtk_vbox_new( FALSE, 0 );
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->eventbox), FALSE, FALSE, 0 );
-
-      //Add toolbox
-      priv->hbox = gtk_hbox_new( FALSE, 0 );
-      priv->toolbox = moko_tool_box_new();
-      GtkWidget* btnBox = moko_tool_box_get_button_box (MOKO_TOOL_BOX(priv->toolbox));
-      priv->closebutton = moko_pixmap_button_new();
-      image = gtk_image_new_from_file (PKGDATADIR "/Cancel.png");
-      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(priv->closebutton),image);
-      gtk_widget_set_name( GTK_WIDGET(priv->closebutton), "mokostylusbutton-black" );
-      gtk_box_pack_end (GTK_BOX(btnBox),priv->closebutton,FALSE,FALSE, 200);
-      g_signal_connect_swapped( G_OBJECT(priv->closebutton), "clicked", G_CALLBACK(sms_dialog_window_close), self );
-
-      self->addressBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
-      gtk_widget_set_name( GTK_WIDGET(self->addressBtn), "mokostylusbutton-white" );
-      image = gtk_image_new_from_file (PKGDATADIR "/Address.png");
-      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(self->addressBtn),image);
-
-      emailBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
-      gtk_widget_set_name( GTK_WIDGET(emailBtn), "mokostylusbutton-white" );
-      image = gtk_image_new_from_file (PKGDATADIR "/Attached.png");
-      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(emailBtn),image);
-
-      smsSendBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
-      gtk_widget_set_name( GTK_WIDGET(smsSendBtn), "mokostylusbutton-white" );
-      image = gtk_image_new_from_file (PKGDATADIR "/Send.png");
-      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(smsSendBtn),image);
-
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->toolbox), FALSE, FALSE, 0 );
-      gtk_container_add( GTK_CONTAINER(self), GTK_WIDGET(priv->vbox) );
-
-      //Fill input entry
-      GtkAlignment* alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
-      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
-      GtkWidget* hbox = gtk_hbox_new(FALSE,0);
-      PangoFontDescription* font_desc;
-      font_desc = pango_font_description_from_string ("Bold 12");
-      GtkWidget* toLabel = gtk_label_new("To:");
-      gtk_widget_modify_font (toLabel, font_desc);
-      gtk_widget_set_size_request (toLabel, 110, -1);
-      gtk_misc_set_alignment (GTK_MISC (toLabel),0.9,0.5);
-      self->toEntry = gtk_entry_new();
-      gtk_widget_set_size_request (self->toEntry, 320, -1);
-      gtk_box_pack_start (GTK_BOX(hbox),toLabel,FALSE,TRUE,0);
-      gtk_box_pack_start (GTK_BOX(hbox),self->toEntry,FALSE,TRUE,0);
-      gtk_container_add (GTK_CONTAINER(alignment), hbox);
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(alignment), FALSE, FALSE, 0 );
-
-      alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
-      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
-      hbox = gtk_hbox_new(FALSE,0);
-      GtkWidget* ccLabel = gtk_label_new("CC:");
-      font_desc = pango_font_description_from_string ("Bold 12");
-      gtk_widget_set_size_request (ccLabel, 110, -1);
-      gtk_widget_modify_font (ccLabel, font_desc);
-      gtk_misc_set_alignment (GTK_MISC (ccLabel),0.9,0.5);
-      GtkWidget* ccEntry = gtk_entry_new();
-      gtk_widget_set_size_request (ccEntry, 320, -1);
-      gtk_box_pack_start (GTK_BOX(hbox),ccLabel,FALSE,TRUE,0);
-      gtk_box_pack_start (GTK_BOX(hbox),ccEntry,FALSE,TRUE,0);
-      gtk_container_add (GTK_CONTAINER(alignment), hbox);
-      gtk_box_pack_start (GTK_BOX(priv->vbox),GTK_WIDGET(alignment),FALSE,TRUE,0);
-
-      alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
-      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
-      hbox = gtk_hbox_new(FALSE,0);
-      GtkWidget* bccLabel = gtk_label_new("Bcc:");
-      font_desc = pango_font_description_from_string ("Bold 12");
-      gtk_widget_set_size_request (bccLabel, 110, -1);
-      gtk_widget_modify_font (bccLabel, font_desc);
-      gtk_misc_set_alignment (GTK_MISC (bccLabel),0.9,0.5);
-      GtkWidget* bccEntry = gtk_entry_new();
-      gtk_widget_set_size_request (bccEntry, 320, -1);
-      gtk_box_pack_start (GTK_BOX(hbox),bccLabel,FALSE,TRUE,0);
-      gtk_box_pack_start (GTK_BOX(hbox),bccEntry,FALSE,TRUE,0);
-      gtk_container_add (GTK_CONTAINER(alignment), hbox);
-      gtk_box_pack_start (GTK_BOX(priv->vbox),GTK_WIDGET(alignment),FALSE,TRUE,0);
-
-      alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
-      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
-      hbox = gtk_hbox_new(FALSE,0);
-      GtkWidget* subjectLabel = gtk_label_new("Subject:");
-      font_desc = pango_font_description_from_string ("Bold 12");
-      gtk_widget_modify_font (subjectLabel, font_desc);
-      gtk_widget_set_size_request (subjectLabel, 110, -1);
-      gtk_misc_set_alignment (GTK_MISC (subjectLabel),0.9,0.5);
-      GtkWidget* subjectEntry = gtk_entry_new();
-      gtk_widget_set_size_request (subjectEntry, 320, -1);
-      gtk_box_pack_start (GTK_BOX(hbox),subjectLabel,FALSE,TRUE,0);
-      gtk_box_pack_start (GTK_BOX(hbox),subjectEntry,FALSE,TRUE,0);
-      gtk_container_add (GTK_CONTAINER(alignment), hbox);
-      gtk_box_pack_start (GTK_BOX(priv->vbox),GTK_WIDGET(alignment),FALSE,TRUE,0);
-
-      /* fill textview */
-      GtkWidget* txtView = gtk_text_view_new();
-      GtkWidget* viewAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
-      gtk_alignment_set_padding (GTK_ALIGNMENT(viewAlign),10,10,30,30);
-      GtkWidget* scolwin = gtk_scrolled_window_new (NULL, NULL);
-      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scolwin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
-      GtkWidget*  viewport = gtk_viewport_new (NULL, NULL);
-      gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(txtView),GTK_WRAP_CHAR);
-      gtk_container_add (GTK_CONTAINER(viewport), txtView);
-      gtk_container_add (GTK_CONTAINER (scolwin), viewport);
-      gtk_container_add (GTK_CONTAINER(viewAlign),GTK_WIDGET(scolwin));
-      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(viewAlign), TRUE, TRUE, 0 );
-      gtk_widget_show_all( GTK_WIDGET(priv->vbox) );
-    }
-}
-
-void sms_dialog_window_set_contents(SmsDialogWindow* self, GtkWidget* contents)
-{
-  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
-  g_return_if_fail( priv->vbox );
-  gtk_box_pack_start( GTK_BOX(priv->vbox), contents, TRUE, TRUE, 0 );
-}
-
-static void sms_dialog_window_close(SmsDialogWindow* self)
-{
-  /* Synthesize delete_event to close dialog. */
-
-  GtkWidget *widget = GTK_WIDGET(self);
-  GdkEvent *event;
-
-  event = gdk_event_new( GDK_DELETE );
-
-  event->any.window = g_object_ref(widget->window);
-  event->any.send_event = TRUE;
-
-  gtk_main_do_event( event );
-  gdk_event_free( event );
-}
-
-void sms_dialog_reply_message(SmsDialogWindow* self, message* msg)
-{
-  g_assert (msg != NULL);
-  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
-  gtk_entry_set_text (GTK_ENTRY(self->toEntry), msg->name);
-  gtk_widget_grab_focus (priv->txtView);
-}
-
-void sms_dialog_forward_message(SmsDialogWindow* self, message* msg)
-{
-  g_assert (msg != NULL);
-  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
-  gtk_entry_set_text (GTK_ENTRY(self->toEntry), msg->name);
-  g_assert (priv->txtView != NULL);
-  GtkTextBuffer* buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->txtView));
-  gchar* text = g_strdup_printf("\n\n\n>%s",msg->content);
-  gtk_text_buffer_set_text (buffer, text, strlen(text));
-  gtk_widget_grab_focus (priv->txtView);
-}
-
-gboolean on_sms_txtView_key_release_event       (GtkWidget       *widget,
-                                                 GdkEventKey     *event,
-                                                 SmsDialogWindow *self)
-{
-  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
-  GtkTextBuffer * buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->txtView));
-  gint n = 160 - gtk_text_buffer_get_char_count(buffer)%160;
-  gint m = gtk_text_buffer_get_char_count(buffer)/160 + 1;
-  gtk_label_set_text(GTK_LABEL(priv->textInLabel),g_strdup_printf("%d(%d)",n,m));
-  return FALSE;
-}
-
-
+/*
+ *  sms-dialog-window.c
+ *  
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *  
+ *  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 Public License for more details.
+ *  
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
+ */
+
+#include "sms-dialog-window.h"
+#include "main.h"
+#include <libmokoui/moko-pixmap-button.h>
+#include <libmokoui/moko-fixed.h>
+
+#include <gtk/gtkeventbox.h>
+#include <gtk/gtkdialog.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtktextview.h>
+#include <gtk/gtkscrolledwindow.h>
+#include <gtk/gtkviewport.h>
+
+#include <pango/pango-font.h>
+
+#include <glib/gmain.h>
+
+G_DEFINE_TYPE (SmsDialogWindow, sms_dialog_window, MOKO_TYPE_WINDOW)
+
+#define SMS_DIALOG_WINDOW_GET_PRIVATE(o)   (G_TYPE_INSTANCE_GET_PRIVATE ((o), SMS_TYPE_DIALOG_WINDOW, SmsDialogWindowPrivate))
+
+typedef struct _SmsDialogWindowPrivate SmsDialogWindowPrivate;
+
+struct _SmsDialogWindowPrivate
+  {
+    GtkWidget* vbox;
+    GtkWidget* hbox;
+    GtkWidget* eventbox;
+    GtkWidget* titleLabel;
+    GtkWidget* textInLabel;
+    GtkWidget* toolbox;
+    GtkWidget* closebutton;
+    GtkWidget* txtView;
+  };
+
+typedef struct _SmsDialogRunInfo
+  {
+    SmsDialogWindow *dialog;
+    gint response_id;
+    GMainLoop *loop;
+    gboolean destroyed;
+  }
+SmsDialogRunInfo;
+
+static void sms_dialog_window_close(SmsDialogWindow* self);
+gboolean on_sms_txtView_key_release_event       (GtkWidget       *widget,
+    GdkEventKey     *event,
+    SmsDialogWindow *self);
+
+
+static void
+shutdown_loop (SmsDialogRunInfo *ri)
+{
+  if (g_main_loop_is_running (ri->loop))
+    g_main_loop_quit (ri->loop);
+}
+
+static void
+run_unmap_handler (SmsDialogWindow* dialog, gpointer data)
+{
+  SmsDialogRunInfo *ri = data;
+
+  shutdown_loop (ri);
+}
+
+static void
+run_response_handler (SmsDialogWindow* dialog,
+                      gint response_id,
+                      gpointer data)
+{
+  SmsDialogRunInfo *ri;
+
+  ri = data;
+
+  ri->response_id = response_id;
+
+  shutdown_loop (ri);
+}
+
+static gint
+run_delete_handler (SmsDialogWindow* dialog,
+                    GdkEventAny *event,
+                    gpointer data)
+{
+  SmsDialogRunInfo *ri = data;
+
+  shutdown_loop (ri);
+
+  return TRUE; /* Do not destroy */
+}
+
+static void
+run_destroy_handler (SmsDialogWindow* dialog, gpointer data)
+{
+  SmsDialogRunInfo *ri = data;
+
+  /* shutdown_loop will be called by run_unmap_handler */
+
+  ri->destroyed = TRUE;
+}
+
+
+static void
+sms_dialog_window_dispose(GObject* object)
+{
+  if (G_OBJECT_CLASS (sms_dialog_window_parent_class)->dispose)
+    G_OBJECT_CLASS (sms_dialog_window_parent_class)->dispose (object);
+}
+
+static void
+sms_dialog_window_finalize(GObject* object)
+{
+  G_OBJECT_CLASS (sms_dialog_window_parent_class)->finalize (object);
+}
+
+static void
+sms_dialog_window_class_init(SmsDialogWindowClass* klass)
+{
+  GObjectClass* object_class = G_OBJECT_CLASS(klass);
+
+  g_type_class_add_private (klass, sizeof(SmsDialogWindowPrivate));
+
+  object_class->dispose = sms_dialog_window_dispose;
+  object_class->finalize = sms_dialog_window_finalize;
+}
+
+SmsDialogWindow*
+sms_dialog_window_new(void)
+{
+  return g_object_new(SMS_TYPE_DIALOG_WINDOW, NULL);
+}
+
+static void
+sms_dialog_window_init(SmsDialogWindow* self)
+{
+  MokoWindow* parent = (MokoWindow*)moko_application_get_main_window( moko_application_get_instance() );
+  if ( parent )
+    {
+      gtk_window_set_transient_for( GTK_WINDOW(self), GTK_WINDOW(parent) );
+#ifndef DEBUG_THIS_FILE
+      gtk_window_set_modal( GTK_WINDOW(self), TRUE );
+#endif
+      gtk_window_set_destroy_with_parent( GTK_WINDOW(self), TRUE );
+    }
+}
+
+void sms_dialog_window_set_title(SmsDialogWindow* self, const gchar* title)
+{
+  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
+  if ( !priv->titleLabel )
+    {
+      priv->titleLabel = gtk_label_new( title );
+      priv->hbox = gtk_hbox_new( FALSE, 0 );
+      gtk_window_set_title( GTK_WINDOW(self), title );
+      gtk_widget_set_name( GTK_WIDGET(priv->titleLabel), "mokodialogwindow-title-label" );
+      gtk_box_pack_start( GTK_BOX(priv->hbox), GTK_WIDGET(priv->titleLabel), TRUE, TRUE, 0 );
+      PangoFontDescription* font_desc = pango_font_description_from_string ("Bold 10");
+      priv->textInLabel = gtk_label_new( "160(1)" );
+      gtk_widget_modify_font (priv->textInLabel, font_desc);
+      gtk_widget_set_name( GTK_WIDGET(priv->textInLabel), "mokodialogwindow-title-label" );
+      gtk_box_pack_start( GTK_BOX(priv->hbox), GTK_WIDGET(priv->textInLabel), FALSE, FALSE, 0);
+      priv->eventbox = gtk_event_box_new();
+      gtk_container_add( GTK_CONTAINER(priv->eventbox), GTK_WIDGET(priv->hbox) );
+      gtk_widget_set_name( GTK_WIDGET(priv->eventbox), "mokodialogwindow-title-labelbox" );
+      //FIXME get from theme
+      gtk_misc_set_padding( GTK_MISC(priv->titleLabel), 0, 6 );
+      gtk_widget_show( GTK_WIDGET(priv->titleLabel) );
+      gtk_widget_show( GTK_WIDGET(priv->eventbox) );
+    }
+  else
+    {
+      gtk_label_set_text( GTK_LABEL(priv->titleLabel), title );
+      gtk_window_set_title( GTK_WINDOW(self), title );
+    }
+  if ( !priv->vbox )
+    {
+      GtkWidget* image;
+      GtkWidget* smsSendBtn;
+      GtkWidget* emailBtn;
+
+      priv->vbox = gtk_vbox_new( FALSE, 0 );
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->eventbox), FALSE, FALSE, 0 );
+
+      //Add toolbox
+      priv->hbox = gtk_hbox_new( FALSE, 0 );
+      priv->toolbox = moko_tool_box_new();
+      GtkWidget* btnBox = moko_tool_box_get_button_box (MOKO_TOOL_BOX(priv->toolbox));
+      priv->closebutton = moko_pixmap_button_new();
+      image = gtk_image_new_from_file (PKGDATADIR "/Cancel.png");
+      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(priv->closebutton),image);
+      gtk_widget_set_name( GTK_WIDGET(priv->closebutton), "mokostylusbutton-black" );
+      gtk_box_pack_end (GTK_BOX(btnBox),priv->closebutton,FALSE,FALSE,280);
+      g_signal_connect_swapped( G_OBJECT(priv->closebutton), "clicked", G_CALLBACK(sms_dialog_window_close), self );
+
+      self->addressBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
+      gtk_widget_set_name( GTK_WIDGET(self->addressBtn ), "mokostylusbutton-white" );
+      image = gtk_image_new_from_file (PKGDATADIR "/Address.png");
+      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(self->addressBtn ),image);
+
+      smsSendBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
+      gtk_widget_set_name( GTK_WIDGET(smsSendBtn), "mokostylusbutton-white" );
+      image = gtk_image_new_from_file (PKGDATADIR "/Send.png");
+      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(smsSendBtn),image);
+
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->toolbox), FALSE, FALSE, 0 );
+      gtk_container_add( GTK_CONTAINER(self), GTK_WIDGET(priv->vbox) );
+
+      //Fill input entry
+      GtkAlignment* alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
+      gtk_alignment_set_padding (alignment, 10, 10, 50, 10);
+      GtkWidget* entrybox = gtk_hbox_new(FALSE,0);
+      GtkWidget* toLabel = gtk_label_new("To:");
+      gtk_widget_set_size_request (toLabel, 40, -1);
+      gtk_misc_set_alignment (GTK_MISC (toLabel),1,0.5);
+      self->toEntry = gtk_entry_new();
+      gtk_widget_set_size_request (self->toEntry, 320, -1);
+      gtk_box_pack_start (GTK_BOX(entrybox),toLabel,FALSE,TRUE,0);
+      gtk_box_pack_start (GTK_BOX(entrybox),self->toEntry,FALSE,TRUE,0);
+      gtk_container_add (GTK_CONTAINER(alignment), entrybox);
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(alignment), FALSE, FALSE, 0 );
+
+      /* fill textview */
+      priv->txtView = gtk_text_view_new();
+      GtkWidget* viewAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
+      gtk_alignment_set_padding (GTK_ALIGNMENT(viewAlign),10,10,30,30);
+      GtkWidget* scolwin = gtk_scrolled_window_new (NULL, NULL);
+      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scolwin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+      GtkWidget*  viewport = gtk_viewport_new (NULL, NULL);
+      gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(priv->txtView),GTK_WRAP_CHAR);
+      gtk_container_add (GTK_CONTAINER(viewport), priv->txtView);
+      gtk_container_add (GTK_CONTAINER (scolwin), viewport);
+      gtk_container_add (GTK_CONTAINER(viewAlign),scolwin);
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(viewAlign), TRUE, TRUE, 0 );
+      gtk_widget_show_all( GTK_WIDGET(priv->vbox) );
+
+      g_signal_connect ( G_OBJECT(priv->txtView), "key_release_event",
+                         G_CALLBACK (on_sms_txtView_key_release_event),
+                         self);
+    }
+}
+
+void mail_dialog_window_set_title(SmsDialogWindow* self, const gchar* title)
+{
+  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
+  if ( !priv->titleLabel )
+    {
+      priv->titleLabel = gtk_label_new( title );
+      gtk_window_set_title( GTK_WINDOW(self), title );
+      gtk_widget_set_name( GTK_WIDGET(priv->titleLabel), "mokodialogwindow-title-label" );
+      priv->eventbox = gtk_event_box_new();
+      gtk_widget_set_name( GTK_WIDGET(priv->eventbox), "mokodialogwindow-title-labelbox" );
+      //FIXME get from theme
+      gtk_misc_set_padding( GTK_MISC(priv->titleLabel), 0, 6 );
+      gtk_container_add (GTK_CONTAINER(priv->eventbox), priv->titleLabel);
+      gtk_widget_show( GTK_WIDGET(priv->titleLabel) );
+      gtk_widget_show( GTK_WIDGET(priv->eventbox) );
+    }
+  else
+    {
+      gtk_label_set_text( GTK_LABEL(priv->titleLabel), title );
+      gtk_window_set_title( GTK_WINDOW(self), title );
+    }
+  if ( !priv->vbox )
+    {
+      GtkWidget* image;
+      GtkWidget* smsSendBtn;
+      GtkWidget* emailBtn;
+
+      priv->vbox = gtk_vbox_new( FALSE, 0 );
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->eventbox), FALSE, FALSE, 0 );
+
+      //Add toolbox
+      priv->hbox = gtk_hbox_new( FALSE, 0 );
+      priv->toolbox = moko_tool_box_new();
+      GtkWidget* btnBox = moko_tool_box_get_button_box (MOKO_TOOL_BOX(priv->toolbox));
+      priv->closebutton = moko_pixmap_button_new();
+      image = gtk_image_new_from_file (PKGDATADIR "/Cancel.png");
+      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(priv->closebutton),image);
+      gtk_widget_set_name( GTK_WIDGET(priv->closebutton), "mokostylusbutton-black" );
+      gtk_box_pack_end (GTK_BOX(btnBox),priv->closebutton,FALSE,FALSE, 200);
+      g_signal_connect_swapped( G_OBJECT(priv->closebutton), "clicked", G_CALLBACK(sms_dialog_window_close), self );
+
+      self->addressBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
+      gtk_widget_set_name( GTK_WIDGET(self->addressBtn), "mokostylusbutton-white" );
+      image = gtk_image_new_from_file (PKGDATADIR "/Address.png");
+      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(self->addressBtn),image);
+
+      emailBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
+      gtk_widget_set_name( GTK_WIDGET(emailBtn), "mokostylusbutton-white" );
+      image = gtk_image_new_from_file (PKGDATADIR "/Attached.png");
+      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(emailBtn),image);
+
+      smsSendBtn = moko_tool_box_add_action_button (MOKO_TOOL_BOX(priv->toolbox));
+      gtk_widget_set_name( GTK_WIDGET(smsSendBtn), "mokostylusbutton-white" );
+      image = gtk_image_new_from_file (PKGDATADIR "/Send.png");
+      moko_pixmap_button_set_center_image ( MOKO_PIXMAP_BUTTON(smsSendBtn),image);
+
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->toolbox), FALSE, FALSE, 0 );
+      gtk_container_add( GTK_CONTAINER(self), GTK_WIDGET(priv->vbox) );
+
+      //Fill input entry
+      GtkAlignment* alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
+      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
+      GtkWidget* hbox = gtk_hbox_new(FALSE,0);
+      PangoFontDescription* font_desc;
+      font_desc = pango_font_description_from_string ("Bold 12");
+      GtkWidget* toLabel = gtk_label_new("To:");
+      gtk_widget_modify_font (toLabel, font_desc);
+      gtk_widget_set_size_request (toLabel, 110, -1);
+      gtk_misc_set_alignment (GTK_MISC (toLabel),0.9,0.5);
+      self->toEntry = gtk_entry_new();
+      gtk_widget_set_size_request (self->toEntry, 320, -1);
+      gtk_box_pack_start (GTK_BOX(hbox),toLabel,FALSE,TRUE,0);
+      gtk_box_pack_start (GTK_BOX(hbox),self->toEntry,FALSE,TRUE,0);
+      gtk_container_add (GTK_CONTAINER(alignment), hbox);
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(alignment), FALSE, FALSE, 0 );
+
+      alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
+      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
+      hbox = gtk_hbox_new(FALSE,0);
+      GtkWidget* ccLabel = gtk_label_new("CC:");
+      font_desc = pango_font_description_from_string ("Bold 12");
+      gtk_widget_set_size_request (ccLabel, 110, -1);
+      gtk_widget_modify_font (ccLabel, font_desc);
+      gtk_misc_set_alignment (GTK_MISC (ccLabel),0.9,0.5);
+      GtkWidget* ccEntry = gtk_entry_new();
+      gtk_widget_set_size_request (ccEntry, 320, -1);
+      gtk_box_pack_start (GTK_BOX(hbox),ccLabel,FALSE,TRUE,0);
+      gtk_box_pack_start (GTK_BOX(hbox),ccEntry,FALSE,TRUE,0);
+      gtk_container_add (GTK_CONTAINER(alignment), hbox);
+      gtk_box_pack_start (GTK_BOX(priv->vbox),GTK_WIDGET(alignment),FALSE,TRUE,0);
+
+      alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
+      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
+      hbox = gtk_hbox_new(FALSE,0);
+      GtkWidget* bccLabel = gtk_label_new("Bcc:");
+      font_desc = pango_font_description_from_string ("Bold 12");
+      gtk_widget_set_size_request (bccLabel, 110, -1);
+      gtk_widget_modify_font (bccLabel, font_desc);
+      gtk_misc_set_alignment (GTK_MISC (bccLabel),0.9,0.5);
+      GtkWidget* bccEntry = gtk_entry_new();
+      gtk_widget_set_size_request (bccEntry, 320, -1);
+      gtk_box_pack_start (GTK_BOX(hbox),bccLabel,FALSE,TRUE,0);
+      gtk_box_pack_start (GTK_BOX(hbox),bccEntry,FALSE,TRUE,0);
+      gtk_container_add (GTK_CONTAINER(alignment), hbox);
+      gtk_box_pack_start (GTK_BOX(priv->vbox),GTK_WIDGET(alignment),FALSE,TRUE,0);
+
+      alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
+      gtk_alignment_set_padding (alignment, 5, 5, 10, 10);
+      hbox = gtk_hbox_new(FALSE,0);
+      GtkWidget* subjectLabel = gtk_label_new("Subject:");
+      font_desc = pango_font_description_from_string ("Bold 12");
+      gtk_widget_modify_font (subjectLabel, font_desc);
+      gtk_widget_set_size_request (subjectLabel, 110, -1);
+      gtk_misc_set_alignment (GTK_MISC (subjectLabel),0.9,0.5);
+      GtkWidget* subjectEntry = gtk_entry_new();
+      gtk_widget_set_size_request (subjectEntry, 320, -1);
+      gtk_box_pack_start (GTK_BOX(hbox),subjectLabel,FALSE,TRUE,0);
+      gtk_box_pack_start (GTK_BOX(hbox),subjectEntry,FALSE,TRUE,0);
+      gtk_container_add (GTK_CONTAINER(alignment), hbox);
+      gtk_box_pack_start (GTK_BOX(priv->vbox),GTK_WIDGET(alignment),FALSE,TRUE,0);
+
+      /* fill textview */
+      GtkWidget* txtView = gtk_text_view_new();
+      GtkWidget* viewAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
+      gtk_alignment_set_padding (GTK_ALIGNMENT(viewAlign),10,10,30,30);
+      GtkWidget* scolwin = gtk_scrolled_window_new (NULL, NULL);
+      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scolwin), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+      GtkWidget*  viewport = gtk_viewport_new (NULL, NULL);
+      gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW(txtView),GTK_WRAP_CHAR);
+      gtk_container_add (GTK_CONTAINER(viewport), txtView);
+      gtk_container_add (GTK_CONTAINER (scolwin), viewport);
+      gtk_container_add (GTK_CONTAINER(viewAlign),GTK_WIDGET(scolwin));
+      gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(viewAlign), TRUE, TRUE, 0 );
+      gtk_widget_show_all( GTK_WIDGET(priv->vbox) );
+    }
+}
+
+void sms_dialog_window_set_contents(SmsDialogWindow* self, GtkWidget* contents)
+{
+  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
+  g_return_if_fail( priv->vbox );
+  gtk_box_pack_start( GTK_BOX(priv->vbox), contents, TRUE, TRUE, 0 );
+}
+
+static void sms_dialog_window_close(SmsDialogWindow* self)
+{
+  /* Synthesize delete_event to close dialog. */
+
+  GtkWidget *widget = GTK_WIDGET(self);
+  GdkEvent *event;
+
+  event = gdk_event_new( GDK_DELETE );
+
+  event->any.window = g_object_ref(widget->window);
+  event->any.send_event = TRUE;
+
+  gtk_main_do_event( event );
+  gdk_event_free( event );
+}
+
+void sms_dialog_reply_message(SmsDialogWindow* self, message* msg)
+{
+  g_assert (msg != NULL);
+  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
+  gtk_entry_set_text (GTK_ENTRY(self->toEntry), msg->name);
+  gtk_widget_grab_focus (priv->txtView);
+}
+
+void sms_dialog_forward_message(SmsDialogWindow* self, message* msg)
+{
+  g_assert (msg != NULL);
+  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
+  gtk_entry_set_text (GTK_ENTRY(self->toEntry), msg->name);
+  g_assert (priv->txtView != NULL);
+  GtkTextBuffer* buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->txtView));
+  gchar* text = g_strdup_printf("\n\n\n>%s",msg->content);
+  gtk_text_buffer_set_text (buffer, text, strlen(text));
+  gtk_widget_grab_focus (priv->txtView);
+}
+
+gboolean on_sms_txtView_key_release_event       (GtkWidget       *widget,
+                                                 GdkEventKey     *event,
+                                                 SmsDialogWindow *self)
+{
+  SmsDialogWindowPrivate* priv = SMS_DIALOG_WINDOW_GET_PRIVATE(self);
+  GtkTextBuffer * buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(priv->txtView));
+  gint n = 160 - gtk_text_buffer_get_char_count(buffer)%160;
+  gint m = gtk_text_buffer_get_char_count(buffer)/160 + 1;
+  gtk_label_set_text(GTK_LABEL(priv->textInLabel),g_strdup_printf("%d(%d)",n,m));
+  return FALSE;
+}
+
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-dialog-window.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,64 +1,64 @@
-/*
- *  sms-dialog-window.h
- *  
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *  
- *  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 Public License for more details.
- *  
- *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
- */
-
-#ifndef _SMS_DIALOG_WINDOW_H_
-#define _SMS_DIALOG_WINDOW_H_
-
-#include <libmokoui/moko-window.h>
-#include <libmokoui/moko-tool-box.h>
-#include "message.h"
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define SMS_TYPE_DIALOG_WINDOW sms_dialog_window_get_type()
-#define SMS_DIALOG_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj),   SMS_TYPE_DIALOG_WINDOW, SmsDialogWindow))
-#define SMS_DIALOG_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass),   SMS_TYPE_DIALOG_WINDOW, SmsDialogWindowClass))
-#define SMS_IS_DIALOG_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),   SMS_TYPE_DIALOG_WINDOW))
-#define SMS_IS_DIALOG_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass),   SMS_TYPE_DIALOG_WINDOW))
-#define SMS_DIALOG_WINDOW_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj),   SMS_TYPE_DIALOG_WINDOW, SmsDialogWindowClass))
-
-typedef struct
-{ 
-  MokoWindow parent;
-  GtkWidget* addressBtn;
-  GtkWidget* toEntry;
-}
-SmsDialogWindow;
-
-typedef struct
-{
-  MokoWindowClass parent_class;
-}
-SmsDialogWindowClass;
-
-GType sms_dialog_window_get_type();
-SmsDialogWindow* sms_dialog_window_new();
-
-void sms_dialog_window_set_title(SmsDialogWindow* self, const gchar* title);
-void mail_dialog_window_set_title(SmsDialogWindow* self, const gchar* title);
-void sms_dialog_window_set_contents(SmsDialogWindow* self, GtkWidget* contents);
-void sms_dialog_reply_message(SmsDialogWindow* self, message* msg);
-void sms_dialog_forward_message(SmsDialogWindow* self, message* msg);
-
-G_END_DECLS
-
-#endif // _SMS_DIALOG_WINDOW_H_
-
+/*
+ *  sms-dialog-window.h
+ *  
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *  
+ *  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 Public License for more details.
+ *  
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
+ */
+
+#ifndef _SMS_DIALOG_WINDOW_H_
+#define _SMS_DIALOG_WINDOW_H_
+
+#include <libmokoui/moko-window.h>
+#include <libmokoui/moko-tool-box.h>
+#include "message.h"
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define SMS_TYPE_DIALOG_WINDOW sms_dialog_window_get_type()
+#define SMS_DIALOG_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj),   SMS_TYPE_DIALOG_WINDOW, SmsDialogWindow))
+#define SMS_DIALOG_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass),   SMS_TYPE_DIALOG_WINDOW, SmsDialogWindowClass))
+#define SMS_IS_DIALOG_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),   SMS_TYPE_DIALOG_WINDOW))
+#define SMS_IS_DIALOG_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass),   SMS_TYPE_DIALOG_WINDOW))
+#define SMS_DIALOG_WINDOW_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj),   SMS_TYPE_DIALOG_WINDOW, SmsDialogWindowClass))
+
+typedef struct
+{ 
+  MokoWindow parent;
+  GtkWidget* addressBtn;
+  GtkWidget* toEntry;
+}
+SmsDialogWindow;
+
+typedef struct
+{
+  MokoWindowClass parent_class;
+}
+SmsDialogWindowClass;
+
+GType sms_dialog_window_get_type();
+SmsDialogWindow* sms_dialog_window_new();
+
+void sms_dialog_window_set_title(SmsDialogWindow* self, const gchar* title);
+void mail_dialog_window_set_title(SmsDialogWindow* self, const gchar* title);
+void sms_dialog_window_set_contents(SmsDialogWindow* self, GtkWidget* contents);
+void sms_dialog_reply_message(SmsDialogWindow* self, message* msg);
+void sms_dialog_forward_message(SmsDialogWindow* self, message* msg);
+
+G_END_DECLS
+
+#endif // _SMS_DIALOG_WINDOW_H_
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.c	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.c	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,433 +1,430 @@
-/*
- *  sms-membership-window.c
- *  
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *  
- *  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 Public License for more details.
- *  
- *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
- */
-
-#include "sms-membership-window.h"
-#include <libmokoui/moko-pixmap-button.h>
-#include <gtk/gtkeventbox.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkscrolledwindow.h>
-#include <gtk/gtkviewport.h>
-
-#include <pango/pango-font.h>
-
-#include <glib/gmain.h>
-
-G_DEFINE_TYPE (SmsMembershipWindow, sms_membership_window, MOKO_TYPE_WINDOW)
-
-#define SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(o)   (G_TYPE_INSTANCE_GET_PRIVATE ((o), SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindowPrivate))
-
-typedef struct _SmsMembershipWindowPrivate SmsMembershipWindowPrivate;
-typedef gboolean (*GtkTreeModelFilterVisibleFunc) (GtkTreeModel *model,
-    GtkTreeIter *iter,
-    gpointer data);
-
-struct _SmsMembershipWindowPrivate
-  {
-    GtkWidget* vbox;
-    GtkWidget* hbox;
-    GtkWidget* folderbox;
-    GtkWidget* eventbox;
-    GtkWidget* menubox;
-    GtkWidget* titleLabel;
-    GtkWidget* fromLabel;
-    GtkWidget* subjectLabel;
-    GtkWidget* closebutton;
-    GtkWidget* radioBtnBox;
-    GtkWidget* radioAlign;
-    GtkWidget* msgViewAlign;
-    GtkWidget* msgViewWin;
-    GtkTreeModel* filter;
-    GtkWidget* view;
-    GtkListStore* liststore;
-    GSList* rdoBtnList;
-  };
-
-typedef struct _SmsMembershipRunInfo
-  {
-    SmsMembershipWindow *dialog;
-    gint response_id;
-    GMainLoop *loop;
-    gboolean destroyed;
-  }
-SmsMembershipRunInfo;
-
-static void sms_membership_window_close(SmsMembershipWindow* self);
-
-/*static void
-shutdown_loop (SmsMembershipRunInfo *ri)
-{
-    if (g_main_loop_is_running (ri->loop))
-        g_main_loop_quit (ri->loop);
-}*/
-
-static void
-sms_membership_window_dispose(GObject* object)
-{
-  if (G_OBJECT_CLASS (sms_membership_window_parent_class)->dispose)
-    G_OBJECT_CLASS (sms_membership_window_parent_class)->dispose (object);
-}
-
-static void
-sms_membership_window_finalize(GObject* object)
-{
-  G_OBJECT_CLASS (sms_membership_window_parent_class)->finalize (object);
-}
-
-static void
-sms_membership_window_class_init(SmsMembershipWindowClass* klass)
-{
-  GObjectClass* object_class = G_OBJECT_CLASS(klass);
-
-  g_type_class_add_private (klass, sizeof(SmsMembershipWindowPrivate));
-
-  object_class->dispose = sms_membership_window_dispose;
-  object_class->finalize = sms_membership_window_finalize;
-}
-
-GtkWidget*
-sms_membership_window_new(void)
-{
-  return GTK_WIDGET(g_object_new(SMS_TYPE_MEMBERSHIP_WINDOW, NULL));
-}
-
-static void sms_membership_window_close(SmsMembershipWindow* self)
-{
-  GtkWidget *widget = GTK_WIDGET(self);
-  GdkEvent *event;
-
-  event = gdk_event_new( GDK_DELETE );
-
-  event->any.window = g_object_ref(widget->window);
-  event->any.send_event = TRUE;
-
-  gtk_main_do_event( event );
-  gdk_event_free( event );
-}
-
-gboolean membership_filter_changed(GtkWidget* widget, gchar* text, SmsMembershipWindow* self)
-{
-  g_debug("changed to %s folder",text);
-  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
-  self->currentfolder = g_strdup(text);
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(priv->filter));
-
-  return FALSE;
-}
-
-void sms_membership_window_show (SmsMembershipWindow* self)
-{
-  GtkWidget *widget = GTK_WIDGET(self);
-  gtk_widget_show (widget);
-}
-
-static void
-sms_membership_window_init(SmsMembershipWindow* self)
-{
-  MokoWindow* parent = (MokoWindow*)moko_application_get_main_window( moko_application_get_instance() );
-  if ( parent )
-    {
-      gtk_window_set_transient_for( GTK_WINDOW(self), GTK_WINDOW(parent) );
-#ifndef DEBUG_THIS_FILE
-      gtk_window_set_modal( GTK_WINDOW(self), TRUE );
-#endif
-      gtk_window_set_destroy_with_parent( GTK_WINDOW(self), TRUE );
-    }
-
-  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
-  self->currentfolder = g_strdup("Inbox");
-  //Set title
-  priv->liststore = NULL;
-  priv->vbox = gtk_vbox_new( FALSE, 0 );
-
-  priv->menubox = moko_menu_box_new();
-  gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->menubox), FALSE, FALSE, 0 );
-
-  priv->titleLabel = gtk_label_new( "Message Membership" );
-  gtk_window_set_title( GTK_WINDOW(self), "Message Membership" );
-  gtk_widget_set_name( GTK_WIDGET(priv->titleLabel), "mokodialogwindow-title-label" );
-  priv->eventbox = gtk_event_box_new();
-  gtk_container_add( GTK_CONTAINER(priv->eventbox), GTK_WIDGET(priv->titleLabel) );
-  gtk_widget_set_name( GTK_WIDGET(priv->eventbox), "mokodialogwindow-title-labelbox" );
-
-  //FIXME get from theme
-  gtk_misc_set_padding( GTK_MISC(priv->titleLabel), 0, 6 );
-  gtk_widget_show( GTK_WIDGET(priv->titleLabel) );
-  gtk_widget_show( GTK_WIDGET(priv->eventbox) );
-  gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->eventbox), FALSE, FALSE, 0 );
-  priv->folderbox = gtk_vbox_new( FALSE, 0 );
-
-  //Set folder list
-  GtkWidget* closebox = gtk_hbox_new( FALSE, 0 );
-  PangoFontDescription* font_desc;
-  font_desc = pango_font_description_from_string ("bold 12");
-  priv->fromLabel = gtk_label_new( "AlexTang" );
-  gtk_widget_modify_font (priv->fromLabel, font_desc);
-  gtk_widget_set_size_request (priv->fromLabel, 250, -1);
-  gtk_misc_set_alignment (GTK_MISC(priv->fromLabel), 0, 0.5);
-  priv->subjectLabel = gtk_label_new( "Subject" );
-  gtk_widget_set_size_request (priv->subjectLabel, 250, -1);
-  gtk_misc_set_alignment (GTK_MISC(priv->subjectLabel), 0, 0.5);
-
-  //set header box: two labels and a closebutton
-  GtkWidget* headerbox = gtk_vbox_new( FALSE, 0 );
-  gtk_box_set_spacing (GTK_BOX(headerbox),5);
-  priv->closebutton = gtk_button_new_with_label ("Close");
-  gtk_widget_set_size_request (priv->closebutton, -1, 38);
-  GtkAlignment* alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
-  gtk_alignment_set_padding (alignment, 5, 5, 5, 5);
-  gtk_container_add (GTK_CONTAINER(alignment), priv->closebutton);
-  GtkWidget* hsep = gtk_hseparator_new();
-  gtk_widget_set_size_request (hsep, -1, 3);
-
-  //set folder box alignment fbAlign
-  GtkAlignment* fbAlign = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
-  gtk_alignment_set_padding (fbAlign, 5, 5, 30, 30);
-  gtk_container_add( GTK_CONTAINER(fbAlign), GTK_WIDGET(priv->folderbox) );
-
-  gtk_box_pack_start( GTK_BOX(headerbox), GTK_WIDGET(priv->fromLabel), TRUE, TRUE, 0 );
-  gtk_box_pack_start( GTK_BOX(headerbox), GTK_WIDGET(priv->subjectLabel), TRUE, TRUE, 0 );
-  gtk_box_pack_start( GTK_BOX(closebox), GTK_WIDGET(headerbox), TRUE, FALSE, 0 );
-  gtk_box_pack_start( GTK_BOX(closebox), GTK_WIDGET(alignment), FALSE, FALSE, 0 );
-  gtk_box_pack_start( GTK_BOX(priv->folderbox), GTK_WIDGET(closebox), FALSE, FALSE, 0 );
-  gtk_box_pack_start( GTK_BOX(priv->folderbox), GTK_WIDGET(hsep), FALSE, FALSE, 0 );
-  gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(fbAlign), FALSE, FALSE, 0 );
-
-  gtk_widget_show_all( GTK_WIDGET(priv->vbox) );
-  gtk_container_add( GTK_CONTAINER(self), GTK_WIDGET(priv->vbox) );
-  g_signal_connect_swapped ( G_OBJECT(priv->closebutton), "clicked", G_CALLBACK(sms_membership_window_close), self );
-  g_signal_connect( G_OBJECT(priv->menubox), "filter_changed", G_CALLBACK(membership_filter_changed), self );
-
-}
-
-void membeship_rdo_btn_clicked ( GtkButton* button, SmsMembershipWindow* self)
-{
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  GtkTreeIter childiter;
-  GtkTreeSelection* selection;
-  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
-
-  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view));
-  gboolean has_selection = gtk_tree_selection_get_selected (selection, &model,&iter);
-  if (has_selection)
-    {
-      gchar* folder;
-      gtk_tree_model_get (model, &iter, COLUMN_FOLDER, &folder, -1);
-      g_debug ("folder is %s",folder);
-      self->currentfolder = g_strdup(folder);
-      gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(priv->filter),&childiter,&iter);
-      gtk_list_store_set(priv->liststore, &childiter, COLUMN_FOLDER, gtk_button_get_label(button), -1);
-      gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(priv->filter));
-    }
-}
-
-void sms_membership_window_set_menubox(SmsMembershipWindow* self, GSList* folderlist)
-{
-  GtkWidget* appmenu;
-  GtkWidget* filtmenu;
-
-  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
-
-  /* application menu */
-  appmenu = NULL;
-  /*GtkMenuItem* mmitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Message Membership" ));
-  GtkMenuItem* fnitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Folder Rename" ));
-  GtkMenuItem* accountitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Account" ));
-  GtkMenuItem* helpitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Help" ));
-  GtkWidget* sepitem = gtk_separator_menu_item_new(); 
-  GtkMenuItem* closeitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Close" ));
-  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(mmitem) );
-  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(fnitem) );
-  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(accountitem) );
-  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(helpitem) );
-  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(sepitem) );
-  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(closeitem) );*/
-
-  GtkWidget* rdobtnbox = gtk_vbox_new(FALSE, 0) ;
-  GtkWidget *rdo_btn = NULL;
-  GSList *rdo_btn_group;
-  GSList* c = folderlist;
-
-  filtmenu = gtk_menu_new();
-  for (; c; c = g_slist_next(c) )
-    {
-      //add folder to filter menu
-      gchar* folder = (gchar*) c->data;
-      g_debug( "adding folder '%s'", folder );
-      gtk_menu_shell_append( GTK_MENU_SHELL( filtmenu ), gtk_menu_item_new_with_label( folder ) );
-
-      //add folder to folder list
-      if(!g_strcasecmp(folder,"Inbox"))
-        {
-          rdo_btn = gtk_radio_button_new_with_label (NULL, folder);
-          rdo_btn_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rdo_btn));
-          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rdo_btn), TRUE);
-        }
-      else
-        rdo_btn = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rdo_btn), folder);
-      priv->rdoBtnList = g_slist_append (priv->rdoBtnList,rdo_btn);
-      g_signal_connect (G_OBJECT(rdo_btn), "released", G_CALLBACK (membeship_rdo_btn_clicked), self);
-      gtk_box_pack_start (GTK_BOX (rdobtnbox), rdo_btn, FALSE, TRUE, 0);
-    }
-
-  //set radio button box alignment
-  if (!GTK_IS_ALIGNMENT(priv->radioAlign))
-    {
-      g_debug("Should be the first fime");
-      priv->radioAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
-      gtk_alignment_set_padding (GTK_ALIGNMENT(priv->radioAlign), 5, 5, 30, 5);
-      priv->radioBtnBox = rdobtnbox;
-      gtk_container_add( GTK_CONTAINER(priv->radioAlign), GTK_WIDGET(priv->radioBtnBox) );
-      gtk_box_pack_start (GTK_BOX (priv->folderbox), GTK_WIDGET(priv->radioAlign), FALSE, FALSE, 0);
-      moko_menu_box_set_application_menu( MOKO_MENU_BOX(priv->menubox), GTK_MENU(appmenu) );
-    }
-  else
-    {
-      gtk_container_remove( GTK_CONTAINER(priv->radioAlign), GTK_WIDGET(priv->radioBtnBox) );
-      priv->radioBtnBox = rdobtnbox;
-      gtk_container_add( GTK_CONTAINER(priv->radioAlign), GTK_WIDGET(priv->radioBtnBox) );
-    }
-  moko_menu_box_set_filter_menu( MOKO_MENU_BOX(priv->menubox), GTK_MENU(filtmenu) );
-  gtk_widget_show (priv->menubox);
-  gtk_widget_show_all (priv->vbox);
-}
-
-void
-membership_cell_data_func (GtkTreeViewColumn *col,
-                           GtkCellRenderer   *renderer,
-                           GtkTreeModel      *model,
-                           GtkTreeIter       *iter,
-                           gpointer          user_data)
-{
-  gint status;
-
-  gtk_tree_model_get(model, iter, COLUMN_STATUS, &status, -1);
-  if (status == UNREAD)
-    g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
-  else
-    g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", FALSE, NULL);
-}
-
-void membership_cursor_changed(GtkTreeSelection    *selection,
-                               SmsMembershipWindow *self)
-{
-  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
-  GtkTreeModel* model;
-  GtkTreeIter iter;
-  message* msg;
-
-  if ( gtk_tree_selection_get_selected( selection, &model, &iter ) )
-    {
-      msg = g_malloc(sizeof(message));
-      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
-      gtk_tree_model_get( model, &iter, COLUMN_STATUS, &msg->status, -1);
-
-      gtk_label_set_text (GTK_LABEL(priv->fromLabel), msg->name);
-      gtk_label_set_text (GTK_LABEL(priv->subjectLabel), msg->subject);
-      g_debug ("radio list length: %d",g_slist_length(priv->rdoBtnList));
-
-      GSList* c;
-      GtkWidget *elem;
-      for( c =priv->rdoBtnList; c; c=g_slist_next(c))
-        {
-          elem = c->data;
-          if (!g_strcasecmp (msg->folder,gtk_button_get_label(GTK_BUTTON(elem))))
-            {
-              gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(elem), TRUE);
-              break;
-            }
-        }
-    }
-}
-
-gboolean membership_filter_visible_function (GtkTreeModel* model, GtkTreeIter* iter, SmsMembershipWindow* self)
-{
-  gchar* folder;
-  gtk_tree_model_get (model, iter, COLUMN_FOLDER, &folder, -1);
-
-  if(!g_strcasecmp(folder,self->currentfolder))
-    return TRUE;
-  else
-    return FALSE;
-}
-
-void sms_membership_window_set_messages (SmsMembershipWindow* self,
-    GtkListStore* liststore)
-{
-  GtkCellRenderer* ren;
-  GtkTreeViewColumn* column = gtk_tree_view_column_new();
-  gtk_tree_view_column_set_title(column, "From");
-
-
-  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
-  priv->liststore = liststore;
-  priv->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (priv->liststore),NULL);
-  priv->view = moko_tree_view_new_with_model( GTK_TREE_MODEL (priv->filter));
-  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter),
-                                          (GtkTreeModelFilterVisibleFunc)membership_filter_visible_function,
-                                          self,
-                                          NULL);
-  /* Add status picture */
-  ren = gtk_cell_renderer_pixbuf_new();
-  gtk_tree_view_column_pack_start(column, ren, FALSE);
-  gtk_tree_view_column_set_attributes(column, ren, "pixbuf", COLUMN_ICON, NULL);
-
-  /* add message from name */
-  ren = gtk_cell_renderer_text_new();
-  gtk_tree_view_column_pack_start(column, ren, TRUE);
-  gtk_tree_view_column_set_attributes(column, ren, "text", COLUMN_FROM, NULL);
-
-  /* Bold if UNREAD */
-  gtk_tree_view_column_set_cell_data_func (column, ren, membership_cell_data_func, priv->liststore, NULL);
-  moko_tree_view_append_column( MOKO_TREE_VIEW(priv->view), column );
-
-  ren = gtk_cell_renderer_text_new();
-  column = gtk_tree_view_column_new();
-  gtk_tree_view_column_set_title(column, "Subject");
-  gtk_tree_view_column_pack_start(column, ren, TRUE);
-  gtk_tree_view_column_set_attributes(column, ren, "text", COLUMN_SUBJECT, NULL);
-  gtk_tree_view_column_set_cell_data_func (column, ren, membership_cell_data_func, priv->liststore, NULL);
-  moko_tree_view_append_column( MOKO_TREE_VIEW(priv->view), column );
-
-  if (!GTK_IS_ALIGNMENT(priv->msgViewAlign))
-    {
-      GtkWidget* treeViewAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
-      gtk_alignment_set_padding (GTK_ALIGNMENT(treeViewAlign),10,10,10,10);
-      priv->msgViewAlign = treeViewAlign;
-      priv->msgViewWin = moko_tree_view_put_into_scrolled_window(MOKO_TREE_VIEW(priv->view));
-      gtk_container_add (GTK_CONTAINER(priv->msgViewAlign),priv->msgViewWin);
-      gtk_box_pack_start (GTK_BOX (priv->vbox), GTK_WIDGET(priv->msgViewAlign), TRUE, TRUE, 0);
-    }
-  else
-    {
-      gtk_container_remove (GTK_CONTAINER(priv->msgViewAlign),priv->msgViewWin);
-      priv->msgViewWin = moko_tree_view_put_into_scrolled_window(MOKO_TREE_VIEW(priv->view));
-      gtk_container_add (GTK_CONTAINER(priv->msgViewAlign),priv->msgViewWin);
-    }
-  gtk_widget_show_all (priv->vbox);
-
-  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view));
-  g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(membership_cursor_changed), self);
-}
-
+/*
+ *  sms-membership-window.c
+ *  
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *  
+ *  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 Public License for more details.
+ *  
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
+ */
+
+#include "sms-membership-window.h"
+#include <libmokoui/moko-pixmap-button.h>
+#include <gtk/gtkeventbox.h>
+#include <gtk/gtkdialog.h>
+#include <gtk/gtkhbox.h>
+#include <gtk/gtklabel.h>
+#include <gtk/gtkvbox.h>
+#include <gtk/gtkscrolledwindow.h>
+#include <gtk/gtkviewport.h>
+
+#include <pango/pango-font.h>
+
+#include <glib/gmain.h>
+
+G_DEFINE_TYPE (SmsMembershipWindow, sms_membership_window, MOKO_TYPE_WINDOW)
+
+#define SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(o)   (G_TYPE_INSTANCE_GET_PRIVATE ((o), SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindowPrivate))
+
+typedef struct _SmsMembershipWindowPrivate SmsMembershipWindowPrivate;
+
+struct _SmsMembershipWindowPrivate
+  {
+    GtkWidget* vbox;
+    GtkWidget* hbox;
+    GtkWidget* folderbox;
+    GtkWidget* eventbox;
+    GtkWidget* menubox;
+    GtkWidget* titleLabel;
+    GtkWidget* fromLabel;
+    GtkWidget* subjectLabel;
+    GtkWidget* closebutton;
+    GtkWidget* radioBtnBox;
+    GtkWidget* radioAlign;
+    GtkWidget* msgViewAlign;
+    GtkWidget* msgViewWin;
+    GtkTreeModel* filter;
+    GtkWidget* view;
+    GtkListStore* liststore;
+    GSList* rdoBtnList;
+  };
+
+typedef struct _SmsMembershipRunInfo
+  {
+    SmsMembershipWindow *dialog;
+    gint response_id;
+    GMainLoop *loop;
+    gboolean destroyed;
+  }
+SmsMembershipRunInfo;
+
+static void sms_membership_window_close(SmsMembershipWindow* self);
+
+/*static void
+shutdown_loop (SmsMembershipRunInfo *ri)
+{
+    if (g_main_loop_is_running (ri->loop))
+        g_main_loop_quit (ri->loop);
+}*/
+
+static void
+sms_membership_window_dispose(GObject* object)
+{
+  if (G_OBJECT_CLASS (sms_membership_window_parent_class)->dispose)
+    G_OBJECT_CLASS (sms_membership_window_parent_class)->dispose (object);
+}
+
+static void
+sms_membership_window_finalize(GObject* object)
+{
+  G_OBJECT_CLASS (sms_membership_window_parent_class)->finalize (object);
+}
+
+static void
+sms_membership_window_class_init(SmsMembershipWindowClass* klass)
+{
+  GObjectClass* object_class = G_OBJECT_CLASS(klass);
+
+  g_type_class_add_private (klass, sizeof(SmsMembershipWindowPrivate));
+
+  object_class->dispose = sms_membership_window_dispose;
+  object_class->finalize = sms_membership_window_finalize;
+}
+
+GtkWidget*
+sms_membership_window_new(void)
+{
+  return GTK_WIDGET(g_object_new(SMS_TYPE_MEMBERSHIP_WINDOW, NULL));
+}
+
+static void sms_membership_window_close(SmsMembershipWindow* self)
+{
+  GtkWidget *widget = GTK_WIDGET(self);
+  GdkEvent *event;
+
+  event = gdk_event_new( GDK_DELETE );
+
+  event->any.window = g_object_ref(widget->window);
+  event->any.send_event = TRUE;
+
+  gtk_main_do_event( event );
+  gdk_event_free( event );
+}
+
+gboolean membership_filter_changed(GtkWidget* widget, gchar* text, SmsMembershipWindow* self)
+{
+  g_debug("changed to %s folder",text);
+  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
+  self->currentfolder = g_strdup(text);
+  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(priv->filter));
+
+  return FALSE;
+}
+
+void sms_membership_window_show (SmsMembershipWindow* self)
+{
+  GtkWidget *widget = GTK_WIDGET(self);
+  gtk_widget_show (widget);
+}
+
+static void
+sms_membership_window_init(SmsMembershipWindow* self)
+{
+  MokoWindow* parent = (MokoWindow*)moko_application_get_main_window( moko_application_get_instance() );
+  if ( parent )
+    {
+      gtk_window_set_transient_for( GTK_WINDOW(self), GTK_WINDOW(parent) );
+#ifndef DEBUG_THIS_FILE
+      gtk_window_set_modal( GTK_WINDOW(self), TRUE );
+#endif
+      gtk_window_set_destroy_with_parent( GTK_WINDOW(self), TRUE );
+    }
+
+  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
+  self->currentfolder = g_strdup("Inbox");
+  //Set title
+  priv->liststore = NULL;
+  priv->vbox = gtk_vbox_new( FALSE, 0 );
+
+  priv->menubox = moko_menu_box_new();
+  gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->menubox), FALSE, FALSE, 0 );
+
+  priv->titleLabel = gtk_label_new( "Message Membership" );
+  gtk_window_set_title( GTK_WINDOW(self), "Message Membership" );
+  gtk_widget_set_name( GTK_WIDGET(priv->titleLabel), "mokodialogwindow-title-label" );
+  priv->eventbox = gtk_event_box_new();
+  gtk_container_add( GTK_CONTAINER(priv->eventbox), GTK_WIDGET(priv->titleLabel) );
+  gtk_widget_set_name( GTK_WIDGET(priv->eventbox), "mokodialogwindow-title-labelbox" );
+
+  //FIXME get from theme
+  gtk_misc_set_padding( GTK_MISC(priv->titleLabel), 0, 6 );
+  gtk_widget_show( GTK_WIDGET(priv->titleLabel) );
+  gtk_widget_show( GTK_WIDGET(priv->eventbox) );
+  gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(priv->eventbox), FALSE, FALSE, 0 );
+  priv->folderbox = gtk_vbox_new( FALSE, 0 );
+
+  //Set folder list
+  GtkWidget* closebox = gtk_hbox_new( FALSE, 0 );
+  PangoFontDescription* font_desc;
+  font_desc = pango_font_description_from_string ("bold 12");
+  priv->fromLabel = gtk_label_new( "AlexTang" );
+  gtk_widget_modify_font (priv->fromLabel, font_desc);
+  gtk_widget_set_size_request (priv->fromLabel, 250, -1);
+  gtk_misc_set_alignment (GTK_MISC(priv->fromLabel), 0, 0.5);
+  priv->subjectLabel = gtk_label_new( "Subject" );
+  gtk_widget_set_size_request (priv->subjectLabel, 250, -1);
+  gtk_misc_set_alignment (GTK_MISC(priv->subjectLabel), 0, 0.5);
+
+  //set header box: two labels and a closebutton
+  GtkWidget* headerbox = gtk_vbox_new( FALSE, 0 );
+  gtk_box_set_spacing (GTK_BOX(headerbox),5);
+  priv->closebutton = gtk_button_new_with_label ("Close");
+  gtk_widget_set_size_request (priv->closebutton, -1, 38);
+  GtkAlignment* alignment = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
+  gtk_alignment_set_padding (alignment, 5, 5, 5, 5);
+  gtk_container_add (GTK_CONTAINER(alignment), priv->closebutton);
+  GtkWidget* hsep = gtk_hseparator_new();
+  gtk_widget_set_size_request (hsep, -1, 3);
+
+  //set folder box alignment fbAlign
+  GtkAlignment* fbAlign = GTK_ALIGNMENT(gtk_alignment_new (0.5, 0.5, 1, 1));
+  gtk_alignment_set_padding (fbAlign, 5, 5, 30, 30);
+  gtk_container_add( GTK_CONTAINER(fbAlign), GTK_WIDGET(priv->folderbox) );
+
+  gtk_box_pack_start( GTK_BOX(headerbox), GTK_WIDGET(priv->fromLabel), TRUE, TRUE, 0 );
+  gtk_box_pack_start( GTK_BOX(headerbox), GTK_WIDGET(priv->subjectLabel), TRUE, TRUE, 0 );
+  gtk_box_pack_start( GTK_BOX(closebox), GTK_WIDGET(headerbox), TRUE, FALSE, 0 );
+  gtk_box_pack_start( GTK_BOX(closebox), GTK_WIDGET(alignment), FALSE, FALSE, 0 );
+  gtk_box_pack_start( GTK_BOX(priv->folderbox), GTK_WIDGET(closebox), FALSE, FALSE, 0 );
+  gtk_box_pack_start( GTK_BOX(priv->folderbox), GTK_WIDGET(hsep), FALSE, FALSE, 0 );
+  gtk_box_pack_start( GTK_BOX(priv->vbox), GTK_WIDGET(fbAlign), FALSE, FALSE, 0 );
+
+  gtk_widget_show_all( GTK_WIDGET(priv->vbox) );
+  gtk_container_add( GTK_CONTAINER(self), GTK_WIDGET(priv->vbox) );
+  g_signal_connect_swapped ( G_OBJECT(priv->closebutton), "clicked", G_CALLBACK(sms_membership_window_close), self );
+  g_signal_connect( G_OBJECT(priv->menubox), "filter_changed", G_CALLBACK(membership_filter_changed), self );
+
+}
+
+void membeship_rdo_btn_clicked ( GtkButton* button, SmsMembershipWindow* self)
+{
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  GtkTreeIter childiter;
+  GtkTreeSelection* selection;
+  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
+
+  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view));
+  gboolean has_selection = gtk_tree_selection_get_selected (selection, &model,&iter);
+  if (has_selection)
+    {
+      gchar* folder;
+      gtk_tree_model_get (model, &iter, COLUMN_FOLDER, &folder, -1);
+      g_debug ("folder is %s",folder);
+      self->currentfolder = g_strdup(folder);
+      gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(priv->filter),&childiter,&iter);
+      gtk_list_store_set(priv->liststore, &childiter, COLUMN_FOLDER, gtk_button_get_label(button), -1);
+      gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER(priv->filter));
+    }
+}
+
+void sms_membership_window_set_menubox(SmsMembershipWindow* self, GSList* folderlist)
+{
+  GtkWidget* appmenu;
+  GtkWidget* filtmenu;
+
+  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
+
+  /* application menu */
+  appmenu = NULL;
+  /*GtkMenuItem* mmitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Message Membership" ));
+  GtkMenuItem* fnitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Folder Rename" ));
+  GtkMenuItem* accountitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Account" ));
+  GtkMenuItem* helpitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Help" ));
+  GtkWidget* sepitem = gtk_separator_menu_item_new(); 
+  GtkMenuItem* closeitem = GTK_MENU_ITEM(gtk_menu_item_new_with_label( "Close" ));
+  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(mmitem) );
+  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(fnitem) );
+  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(accountitem) );
+  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(helpitem) );
+  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(sepitem) );
+  gtk_menu_shell_append( GTK_MENU_SHELL(appmenu), GTK_WIDGET(closeitem) );*/
+
+  GtkWidget* rdobtnbox = gtk_vbox_new(FALSE, 0) ;
+  GtkWidget *rdo_btn = NULL;
+  GSList *rdo_btn_group;
+  GSList* c = folderlist;
+
+  filtmenu = gtk_menu_new();
+  for (; c; c = g_slist_next(c) )
+    {
+      //add folder to filter menu
+      gchar* folder = (gchar*) c->data;
+      g_debug( "adding folder '%s'", folder );
+      gtk_menu_shell_append( GTK_MENU_SHELL( filtmenu ), gtk_menu_item_new_with_label( folder ) );
+
+      //add folder to folder list
+      if(!g_strcasecmp(folder,"Inbox"))
+        {
+          rdo_btn = gtk_radio_button_new_with_label (NULL, folder);
+          rdo_btn_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rdo_btn));
+          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rdo_btn), TRUE);
+        }
+      else
+        rdo_btn = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (rdo_btn), folder);
+      priv->rdoBtnList = g_slist_append (priv->rdoBtnList,rdo_btn);
+      g_signal_connect (G_OBJECT(rdo_btn), "released", G_CALLBACK (membeship_rdo_btn_clicked), self);
+      gtk_box_pack_start (GTK_BOX (rdobtnbox), rdo_btn, FALSE, TRUE, 0);
+    }
+
+  //set radio button box alignment
+  if (!GTK_IS_ALIGNMENT(priv->radioAlign))
+    {
+      g_debug("Should be the first fime");
+      priv->radioAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
+      gtk_alignment_set_padding (GTK_ALIGNMENT(priv->radioAlign), 5, 5, 30, 5);
+      priv->radioBtnBox = rdobtnbox;
+      gtk_container_add( GTK_CONTAINER(priv->radioAlign), GTK_WIDGET(priv->radioBtnBox) );
+      gtk_box_pack_start (GTK_BOX (priv->folderbox), GTK_WIDGET(priv->radioAlign), FALSE, FALSE, 0);
+      moko_menu_box_set_application_menu( MOKO_MENU_BOX(priv->menubox), GTK_MENU(appmenu) );
+    }
+  else
+    {
+      gtk_container_remove( GTK_CONTAINER(priv->radioAlign), GTK_WIDGET(priv->radioBtnBox) );
+      priv->radioBtnBox = rdobtnbox;
+      gtk_container_add( GTK_CONTAINER(priv->radioAlign), GTK_WIDGET(priv->radioBtnBox) );
+    }
+  moko_menu_box_set_filter_menu( MOKO_MENU_BOX(priv->menubox), GTK_MENU(filtmenu) );
+  gtk_widget_show (priv->menubox);
+  gtk_widget_show_all (priv->vbox);
+}
+
+void
+membership_cell_data_func (GtkTreeViewColumn *col,
+                           GtkCellRenderer   *renderer,
+                           GtkTreeModel      *model,
+                           GtkTreeIter       *iter,
+                           gpointer          user_data)
+{
+  gint status;
+
+  gtk_tree_model_get(model, iter, COLUMN_STATUS, &status, -1);
+  if (status == UNREAD)
+    g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", TRUE, NULL);
+  else
+    g_object_set(renderer, "weight", PANGO_WEIGHT_BOLD, "weight-set", FALSE, NULL);
+}
+
+void membership_cursor_changed(GtkTreeSelection    *selection,
+                               SmsMembershipWindow *self)
+{
+  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
+  GtkTreeModel* model;
+  GtkTreeIter iter;
+  message* msg;
+
+  if ( gtk_tree_selection_get_selected( selection, &model, &iter ) )
+    {
+      msg = g_malloc(sizeof(message));
+      gtk_tree_model_get( model, &iter, COLUMN_FROM, &msg->name, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_SUBJECT, &msg->subject, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_FOLDER, &msg->folder, -1 );
+      gtk_tree_model_get( model, &iter, COLUMN_STATUS, &msg->status, -1);
+
+      gtk_label_set_text (GTK_LABEL(priv->fromLabel), msg->name);
+      gtk_label_set_text (GTK_LABEL(priv->subjectLabel), msg->subject);
+      g_debug ("radio list length: %d",g_slist_length(priv->rdoBtnList));
+
+      GSList* c;
+      GtkWidget *elem;
+      for( c =priv->rdoBtnList; c; c=g_slist_next(c))
+        {
+          elem = c->data;
+          if (!g_strcasecmp (msg->folder,gtk_button_get_label(GTK_BUTTON(elem))))
+            {
+              gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(elem), TRUE);
+              break;
+            }
+        }
+    }
+}
+
+gboolean membership_filter_visible_function (GtkTreeModel* model, GtkTreeIter* iter, SmsMembershipWindow* self)
+{
+  gchar* folder;
+  gtk_tree_model_get (model, iter, COLUMN_FOLDER, &folder, -1);
+
+  if(!g_strcasecmp(folder,self->currentfolder))
+    return TRUE;
+  else
+    return FALSE;
+}
+
+void sms_membership_window_set_messages (SmsMembershipWindow* self,
+    GtkListStore* liststore)
+{
+  GtkCellRenderer* ren;
+  GtkTreeViewColumn* column = gtk_tree_view_column_new();
+  gtk_tree_view_column_set_title(column, "From");
+
+
+  SmsMembershipWindowPrivate* priv = SMS_MEMBERSHIP_WINDOW_GET_PRIVATE(self);
+  priv->liststore = liststore;
+  priv->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (priv->liststore),NULL);
+  priv->view = moko_tree_view_new_with_model( GTK_TREE_MODEL (priv->filter));
+  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter),
+                                          (GtkTreeModelFilterVisibleFunc)membership_filter_visible_function,
+                                          self,
+                                          NULL);
+  /* Add status picture */
+  ren = gtk_cell_renderer_pixbuf_new();
+  gtk_tree_view_column_pack_start(column, ren, FALSE);
+  gtk_tree_view_column_set_attributes(column, ren, "pixbuf", COLUMN_ICON, NULL);
+
+  /* add message from name */
+  ren = gtk_cell_renderer_text_new();
+  gtk_tree_view_column_pack_start(column, ren, TRUE);
+  gtk_tree_view_column_set_attributes(column, ren, "text", COLUMN_FROM, NULL);
+
+  /* Bold if UNREAD */
+  gtk_tree_view_column_set_cell_data_func (column, ren, membership_cell_data_func, priv->liststore, NULL);
+  moko_tree_view_append_column( MOKO_TREE_VIEW(priv->view), column );
+
+  ren = gtk_cell_renderer_text_new();
+  column = gtk_tree_view_column_new();
+  gtk_tree_view_column_set_title(column, "Subject");
+  gtk_tree_view_column_pack_start(column, ren, TRUE);
+  gtk_tree_view_column_set_attributes(column, ren, "text", COLUMN_SUBJECT, NULL);
+  gtk_tree_view_column_set_cell_data_func (column, ren, membership_cell_data_func, priv->liststore, NULL);
+  moko_tree_view_append_column( MOKO_TREE_VIEW(priv->view), column );
+
+  if (!GTK_IS_ALIGNMENT(priv->msgViewAlign))
+    {
+      GtkWidget* treeViewAlign = gtk_alignment_new (0.5, 0.5, 1, 1);
+      gtk_alignment_set_padding (GTK_ALIGNMENT(treeViewAlign),10,10,10,10);
+      priv->msgViewAlign = treeViewAlign;
+      priv->msgViewWin = moko_tree_view_put_into_scrolled_window(MOKO_TREE_VIEW(priv->view));
+      gtk_container_add (GTK_CONTAINER(priv->msgViewAlign),priv->msgViewWin);
+      gtk_box_pack_start (GTK_BOX (priv->vbox), GTK_WIDGET(priv->msgViewAlign), TRUE, TRUE, 0);
+    }
+  else
+    {
+      gtk_container_remove (GTK_CONTAINER(priv->msgViewAlign),priv->msgViewWin);
+      priv->msgViewWin = moko_tree_view_put_into_scrolled_window(MOKO_TREE_VIEW(priv->view));
+      gtk_container_add (GTK_CONTAINER(priv->msgViewAlign),priv->msgViewWin);
+    }
+  gtk_widget_show_all (priv->vbox);
+
+  GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->view));
+  g_signal_connect( G_OBJECT(selection), "changed", G_CALLBACK(membership_cursor_changed), self);
+}
+

Modified: trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.h	2007-04-01 10:54:33 UTC (rev 1595)
+++ trunk/src/target/OM-2007/applications/openmoko-messages/src/sms-membership-window.h	2007-04-01 10:58:55 UTC (rev 1596)
@@ -1,69 +1,69 @@
-/*
- *  sms-membership-window.h
- *  
- *  Authored By Alex Tang <alex at fic-sh.com.cn>
- *
- *  Copyright (C) 2006-2007 OpenMoko Inc.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU Public License as published by
- *  the Free Software Foundation; version 2.1 of the license.
- *  
- *  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 Public License for more details.
- *  
- *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
- */
-
-#ifndef _SMS_MEMBERSHIP_WINDOW_H_
-#define _SMS_MEMBERSHIP_WINDOW_H_
-
-#include <libmokoui/moko-window.h>
-#include <libmokoui/moko-menu-box.h>
-#include <libmokoui/moko-tree-view.h>
-#include <gtk/gtklist.h>
-#include <gtk/gtkliststore.h>
-#include <gtk/gtkradiobutton.h>
-#include <gtk/gtktogglebutton.h>
-
-#include "main.h"
-#include "message.h"
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define SMS_TYPE_MEMBERSHIP_WINDOW sms_membership_window_get_type()
-#define SMS_MEMBERSHIP_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj),   SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindow))
-#define SMS_MEMBERSHIP_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass),   SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindowClass))
-#define SMS_IS_MEMBERSHIP_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),   SMS_TYPE_MEMBERSHIP_WINDOW))
-#define SMS_IS_MEMBERSHIP_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass),   SMS_TYPE_MEMBERSHIP_WINDOW))
-#define SMS_MEMBERSHIP_WINDOW_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj),   SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindowClass))
-
-typedef struct
-  {
-    MokoWindow parent;
-    gchar* currentfolder;
-  }
-SmsMembershipWindow;
-
-typedef struct
-  {
-    MokoWindowClass parent_class;
-  }
-SmsMembershipWindowClass;
-
-GType sms_membership_window_get_type();
-GtkWidget* sms_membership_window_new();
-
-void sms_membership_window_set_menubox(SmsMembershipWindow* self, GSList* folderlist);
-void sms_membership_window_set_messages (SmsMembershipWindow* self, GtkListStore* liststore);
-void sms_membership_window_show (SmsMembershipWindow* self);
-guint sms_membership_window_run(SmsMembershipWindow* self);
-
-G_END_DECLS
-
-#endif // _SMS_MEMBERSHIP_WINDOW_H_
-
-
+/*
+ *  sms-membership-window.h
+ *  
+ *  Authored By Alex Tang <alex at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006-2007 OpenMoko Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *  
+ *  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 Public License for more details.
+ *  
+ *  Current Version: $Rev$ ($Date: 2006/10/05 17:38:14 $) [$Author: alex $]
+ */
+
+#ifndef _SMS_MEMBERSHIP_WINDOW_H_
+#define _SMS_MEMBERSHIP_WINDOW_H_
+
+#include <libmokoui/moko-window.h>
+#include <libmokoui/moko-menu-box.h>
+#include <libmokoui/moko-tree-view.h>
+#include <gtk/gtklist.h>
+#include <gtk/gtkliststore.h>
+#include <gtk/gtkradiobutton.h>
+#include <gtk/gtktogglebutton.h>
+
+#include "main.h"
+#include "message.h"
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define SMS_TYPE_MEMBERSHIP_WINDOW sms_membership_window_get_type()
+#define SMS_MEMBERSHIP_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_CAST ((obj),   SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindow))
+#define SMS_MEMBERSHIP_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass),   SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindowClass))
+#define SMS_IS_MEMBERSHIP_WINDOW(obj)   (G_TYPE_CHECK_INSTANCE_TYPE ((obj),   SMS_TYPE_MEMBERSHIP_WINDOW))
+#define SMS_IS_MEMBERSHIP_WINDOW_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass),   SMS_TYPE_MEMBERSHIP_WINDOW))
+#define SMS_MEMBERSHIP_WINDOW_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj),   SMS_TYPE_MEMBERSHIP_WINDOW, SmsMembershipWindowClass))
+
+typedef struct
+  {
+    MokoWindow parent;
+    gchar* currentfolder;
+  }
+SmsMembershipWindow;
+
+typedef struct
+  {
+    MokoWindowClass parent_class;
+  }
+SmsMembershipWindowClass;
+
+GType sms_membership_window_get_type();
+GtkWidget* sms_membership_window_new();
+
+void sms_membership_window_set_menubox(SmsMembershipWindow* self, GSList* folderlist);
+void sms_membership_window_set_messages (SmsMembershipWindow* self, GtkListStore* liststore);
+void sms_membership_window_show (SmsMembershipWindow* self);
+guint sms_membership_window_run(SmsMembershipWindow* self);
+
+G_END_DECLS
+
+#endif // _SMS_MEMBERSHIP_WINDOW_H_
+
+





More information about the commitlog mailing list