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