From b22ec780fbe4629d4200f40b8fdced00f50990f8 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Tue, 9 Jan 2007 10:36:51 +0000 Subject: [PATCH] * Migration to GtkUIManager almost completed * Added a modest-ui.xml file with the interface description * Moved modest-icon-names.h modest-edit-msg-window.h modest-main-window.h to widgets/ * Moved modest-ui.c to src/ * ModestUI now manages all the UI signals * ModestWidgetFactory is now just a factory pmo-trunk-r588 --- docs/reference/Makefile.am | 1 + docs/reference/modest-docs.sgml | 24 +- docs/reference/modest-sections.txt | 138 ++- docs/reference/tmpl/modest-account-mgr.sgml | 19 + docs/reference/tmpl/modest-conf.sgml | 9 + docs/reference/tmpl/modest-error.sgml | 1 + docs/reference/tmpl/modest-folder-view.sgml | 18 + docs/reference/tmpl/modest-header-view.sgml | 58 +- docs/reference/tmpl/modest-icon-names.sgml | 7 - docs/reference/tmpl/modest-mail-operation.sgml | 7 + docs/reference/tmpl/modest-main-window.sgml | 1 + docs/reference/tmpl/modest-msg-view.sgml | 48 + docs/reference/tmpl/modest-store-widget.sgml | 21 + docs/reference/tmpl/modest-text-utils.sgml | 31 +- docs/reference/tmpl/modest-tny-account-store.sgml | 19 + docs/reference/tmpl/modest-toolbar.sgml | 16 + docs/reference/tmpl/modest-ui.sgml | 1 + docs/reference/tmpl/modest-unused.sgml | 88 ++ docs/reference/tmpl/modest-widget-factory.sgml | 20 - src/Makefile.am | 16 +- src/gtk/Makefile.am | 7 +- src/gtk/modest-account-assistant.c | 10 +- src/gtk/modest-edit-msg-window.c | 3 +- src/gtk/modest-edit-msg-window.h | 92 -- src/gtk/modest-icon-names.h | 80 -- src/gtk/modest-main-window.c | 453 +------- src/gtk/modest-main-window.h | 47 - src/gtk/modest-store-widget.c | 4 +- src/gtk/modest-ui.c | 209 ---- src/maemo/modest-edit-msg-window.h | 85 -- src/maemo/modest-icon-names.h | 80 -- src/maemo/modest-main-window.c | 487 +------- src/maemo/modest-main-window.h | 47 - src/maemo/modest-ui.c | 220 ---- src/modest-error.h | 3 +- src/modest-mail-operation.c | 25 +- src/modest-main.c | 42 +- src/modest-text-utils.h | 2 +- src/modest-tny-account-store.c | 15 +- src/modest-tny-platform-factory.c | 4 + src/modest-ui.c | 1226 +++++++++++++++++++++ src/modest-ui.h | 18 +- src/modest-widget-factory.c | 491 +-------- src/modest-widget-factory.h | 48 +- src/ui/modest-ui.xml | 89 ++ src/widgets/Makefile.am | 9 +- src/widgets/modest-edit-msg-window.h | 92 ++ src/widgets/modest-folder-view.c | 39 - src/widgets/modest-header-view.c | 110 +- src/widgets/modest-header-view.h | 15 +- src/widgets/modest-icon-names.h | 90 ++ src/widgets/modest-main-window.h | 47 + tests/check_text-utils.c | 10 +- 53 files changed, 2242 insertions(+), 2500 deletions(-) delete mode 100644 src/gtk/modest-edit-msg-window.h delete mode 100644 src/gtk/modest-icon-names.h delete mode 100644 src/gtk/modest-main-window.h delete mode 100644 src/gtk/modest-ui.c delete mode 100644 src/maemo/modest-edit-msg-window.h delete mode 100644 src/maemo/modest-icon-names.h delete mode 100644 src/maemo/modest-main-window.h delete mode 100644 src/maemo/modest-ui.c create mode 100644 src/modest-ui.c create mode 100644 src/ui/modest-ui.xml create mode 100644 src/widgets/modest-edit-msg-window.h create mode 100644 src/widgets/modest-icon-names.h create mode 100644 src/widgets/modest-main-window.h diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am index eee2972..f454268 100644 --- a/docs/reference/Makefile.am +++ b/docs/reference/Makefile.am @@ -102,6 +102,7 @@ GTKDOC_LIBS= \ ${top_builddir}/src/modest-tny-msg-actions.o \ ${top_builddir}/src/modest-tny-platform-factory.o \ ${top_builddir}/src/modest-tny-stream-gtkhtml.o \ + ${top_builddir}/src/modest-ui.o \ ${top_builddir}/src/modest-widget-factory.o \ ${top_builddir}/src/modest-widget-memory.o diff --git a/docs/reference/modest-docs.sgml b/docs/reference/modest-docs.sgml index 6bfe3db..561d65b 100644 --- a/docs/reference/modest-docs.sgml +++ b/docs/reference/modest-docs.sgml @@ -24,6 +24,7 @@ + @@ -31,16 +32,15 @@ + - - @@ -99,28 +99,28 @@ &ModestTnyPlatformFactory; &ModestTnyStoreActions; &ModestTnyStreamGtkhtml; + &ModestUI; &ModestWidgetFactory; &ModestWidgetMemory; - - Gtk - >k-ModestAccountViewWindow; - >k-ModestAccountAssistant; - >k-ModestEditMsgWindow; - >k-ModestMainWindow; - >k-ModestStoreWidget; - >k-modestTransportWidget; - >k-modestUi; - Widgets &widgets-ModestAccountView; &widgets-ModestComboBox; &widgets-ModestFolderView; &widgets-ModestHeaderView; + &widgets-ModestMainWindow; &widgets-ModestMsgView; &widgets-modestToolbar; + + Gtk + >k-ModestAccountViewWindow; + >k-ModestAccountAssistant; + >k-ModestEditMsgWindow; + >k-ModestStoreWidget; + >k-modestTransportWidget; + diff --git a/docs/reference/modest-sections.txt b/docs/reference/modest-sections.txt index be5f2d6..859d317 100644 --- a/docs/reference/modest-sections.txt +++ b/docs/reference/modest-sections.txt @@ -382,6 +382,7 @@ MODEST_EDIT_MSG_WINDOW_GET_CLASS ModestMainWindow ModestMainWindow modest_main_window_new +modest_main_window_get_widget_factory MODEST_MAIN_WINDOW MODEST_IS_MAIN_WINDOW @@ -802,6 +803,7 @@ MODEST_EDIT_MSG_WINDOW_GET_CLASS ModestMainWindow ModestMainWindow modest_main_window_new +modest_main_window_get_widget_factory MODEST_MAIN_WINDOW MODEST_IS_MAIN_WINDOW @@ -1196,6 +1198,7 @@ MODEST_EDIT_MSG_WINDOW_GET_CLASS ModestMainWindow ModestMainWindow modest_main_window_new +modest_main_window_get_widget_factory MODEST_MAIN_WINDOW MODEST_IS_MAIN_WINDOW @@ -1456,7 +1459,10 @@ modest_text_utils_inline modest_text_utils_remove_address modest_text_utils_convert_to_html modest_text_utils_strftime -modest_text_utils_display_address +modest_text_utils_get_display_address +modest_text_utils_get_subject_prefix_len +modest_text_utils_utf8_strcmp +modest_text_utils_get_display_date
@@ -1539,19 +1545,6 @@ modest_proto_auth_protos
-modest-widget-memory -modest_widget_memory_save -modest_widget_memory_restore -
- -
-modest-tny-msg-actions -modest_tny_msg_actions_find_body_part -modest_tny_msg_actions_find_nth_part -modest_tny_msg_actions_find_body -
- -
modest-marshal modest_marshal_VOID__POINTER_POINTER modest_marshal_VOID__POINTER_POINTER_POINTER @@ -1567,6 +1560,19 @@ modest_marshal_VOID__STRING_POINTER_POINTER_POINTER
+modest-widget-memory +modest_widget_memory_save +modest_widget_memory_restore +
+ +
+modest-tny-msg-actions +modest_tny_msg_actions_find_body_part +modest_tny_msg_actions_find_nth_part +modest_tny_msg_actions_find_body +
+ +
modest-error ModestErrorDomain ModestErrorCode @@ -1603,6 +1609,26 @@ MODEST_TOOLBAR_ICON_DELETE MODEST_TOOLBAR_ICON_NEXT MODEST_TOOLBAR_ICON_PREV MODEST_TOOLBAR_ICON_STOP +MODEST_STOCK_MAIL_SEND +MODEST_STOCK_NEW_MAIL +MODEST_STOCK_SEND_RECEIVE +MODEST_STOCK_REPLY +MODEST_STOCK_REPLY_ALL +MODEST_STOCK_FORWARD +MODEST_STOCK_DELETE +MODEST_STOCK_NEXT +MODEST_STOCK_PREV +MODEST_STOCK_STOP +
+ +
+modest-ui-actions +modest_ui_actions_on_about +modest_ui_actions_on_delete +modest_ui_actions_on_quit +modest_ui_actions_on_accounts +modest_ui_actions_on_new_msg +modest_ui_actions_on_reply_forward
@@ -1647,39 +1673,6 @@ MODEST_TOOLBAR_ICON_STOP
-modest-icon-names -PIXMAP_PREFIX -MODEST_APP_ICON -MODEST_HEADER_ICON_READ -MODEST_HEADER_ICON_UNREAD -MODEST_HEADER_ICON_DELETED -MODEST_HEADER_ICON_ATTACH -MODEST_FOLDER_ICON_OPEN -MODEST_FOLDER_ICON_CLOSED -MODEST_FOLDER_ICON_ACCOUNT -MODEST_FOLDER_ICON_INBOX -MODEST_FOLDER_ICON_OUTBOX -MODEST_FOLDER_ICON_SENT -MODEST_FOLDER_ICON_TRASH -MODEST_FOLDER_ICON_JUNK -MODEST_FOLDER_ICON_DRAFTS -MODEST_FOLDER_ICON_NORMAL -MODEST_FOLDER_ICON_CONTACTS -MODEST_FOLDER_ICON_NOTES -MODEST_FOLDER_ICON_CALENDAR -MODEST_TOOLBAR_ICON_MAIL_SEND -MODEST_TOOLBAR_ICON_NEW_MAIL -MODEST_TOOLBAR_ICON_SEND_RECEIVE -MODEST_TOOLBAR_ICON_REPLY -MODEST_TOOLBAR_ICON_REPLY_ALL -MODEST_TOOLBAR_ICON_FORWARD -MODEST_TOOLBAR_ICON_DELETE -MODEST_TOOLBAR_ICON_NEXT -MODEST_TOOLBAR_ICON_PREV -MODEST_TOOLBAR_ICON_STOP -
- -
modest-tny-store-actions modest_tny_store_actions_create_folder modest_tny_store_actions_remove_folder @@ -1720,7 +1713,10 @@ modest_text_utils_inline modest_text_utils_remove_address modest_text_utils_convert_to_html modest_text_utils_strftime -modest_text_utils_display_address +modest_text_utils_get_display_address +modest_text_utils_get_subject_prefix_len +modest_text_utils_utf8_strcmp +modest_text_utils_get_display_date
@@ -1803,19 +1799,6 @@ modest_proto_auth_protos
-modest-widget-memory -modest_widget_memory_save -modest_widget_memory_restore -
- -
-modest-tny-msg-actions -modest_tny_msg_actions_find_body_part -modest_tny_msg_actions_find_nth_part -modest_tny_msg_actions_find_body -
- -
modest-marshal modest_marshal_VOID__POINTER_POINTER modest_marshal_VOID__POINTER_POINTER_POINTER @@ -1831,6 +1814,19 @@ modest_marshal_VOID__STRING_POINTER_POINTER_POINTER
+modest-widget-memory +modest_widget_memory_save +modest_widget_memory_restore +
+ +
+modest-tny-msg-actions +modest_tny_msg_actions_find_body_part +modest_tny_msg_actions_find_nth_part +modest_tny_msg_actions_find_body +
+ +
modest-error ModestErrorDomain ModestErrorCode @@ -1867,6 +1863,26 @@ MODEST_TOOLBAR_ICON_DELETE MODEST_TOOLBAR_ICON_NEXT MODEST_TOOLBAR_ICON_PREV MODEST_TOOLBAR_ICON_STOP +MODEST_STOCK_MAIL_SEND +MODEST_STOCK_NEW_MAIL +MODEST_STOCK_SEND_RECEIVE +MODEST_STOCK_REPLY +MODEST_STOCK_REPLY_ALL +MODEST_STOCK_FORWARD +MODEST_STOCK_DELETE +MODEST_STOCK_NEXT +MODEST_STOCK_PREV +MODEST_STOCK_STOP +
+ +
+modest-ui-actions +modest_ui_actions_on_about +modest_ui_actions_on_delete +modest_ui_actions_on_quit +modest_ui_actions_on_accounts +modest_ui_actions_on_new_msg +modest_ui_actions_on_reply_forward
diff --git a/docs/reference/tmpl/modest-account-mgr.sgml b/docs/reference/tmpl/modest-account-mgr.sgml index f4d862c..9451b66 100644 --- a/docs/reference/tmpl/modest-account-mgr.sgml +++ b/docs/reference/tmpl/modest-account-mgr.sgml @@ -44,6 +44,25 @@ ModestAccountMgr @arg1: @arg2: + + + + + +@modestaccountmgr: the object which received the signal. +@arg1: +@arg2: +@arg3: + + + + + + +@modestaccountmgr: the object which received the signal. +@arg1: +@arg2: + diff --git a/docs/reference/tmpl/modest-conf.sgml b/docs/reference/tmpl/modest-conf.sgml index 1381572..bc6dde9 100644 --- a/docs/reference/tmpl/modest-conf.sgml +++ b/docs/reference/tmpl/modest-conf.sgml @@ -52,6 +52,15 @@ ModestConf @arg1: @arg2: + + + + + +@modestconf: the object which received the signal. +@arg1: +@arg2: + diff --git a/docs/reference/tmpl/modest-error.sgml b/docs/reference/tmpl/modest-error.sgml index 19e571a..c304ca4 100644 --- a/docs/reference/tmpl/modest-error.sgml +++ b/docs/reference/tmpl/modest-error.sgml @@ -34,4 +34,5 @@ modest-error @MODEST_MAIL_OPERATION_ERROR_BAD_ACCOUNT: @MODEST_MAIL_OPERATION_ERROR_MISSING_PARAMETER: @MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED: +@MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND: diff --git a/docs/reference/tmpl/modest-folder-view.sgml b/docs/reference/tmpl/modest-folder-view.sgml index a28a5a2..c743bf6 100644 --- a/docs/reference/tmpl/modest-folder-view.sgml +++ b/docs/reference/tmpl/modest-folder-view.sgml @@ -34,6 +34,24 @@ ModestFolderView @: @: + + + + + +@: +@: +@: + + + + + + +@: +@: +@: + diff --git a/docs/reference/tmpl/modest-header-view.sgml b/docs/reference/tmpl/modest-header-view.sgml index bd0c464..78d291e 100644 --- a/docs/reference/tmpl/modest-header-view.sgml +++ b/docs/reference/tmpl/modest-header-view.sgml @@ -65,6 +65,14 @@ ModestHeaderView + + + + + +@modestheaderview: the object which received the signal. +@arg1: + @@ -73,7 +81,25 @@ ModestHeaderView @: @: - + + + + + +@modestheaderview: the object which received the signal. +@arg1: +@arg2: +@arg3: + + + + + + +@modestheaderview: the object which received the signal. +@arg1: + + @@ -86,10 +112,36 @@ ModestHeaderView +@modestheaderview: the object which received the signal. +@arg1: +@arg2: +@arg3: + + + + + + +@modestheaderview: the object which received the signal. +@arg1: + + + + + + @: @: -@: -@: + + + + + + +@modestheaderview: the object which received the signal. +@arg1: +@arg2: +@arg3: diff --git a/docs/reference/tmpl/modest-icon-names.sgml b/docs/reference/tmpl/modest-icon-names.sgml index 9e44b91..065178e 100644 --- a/docs/reference/tmpl/modest-icon-names.sgml +++ b/docs/reference/tmpl/modest-icon-names.sgml @@ -19,13 +19,6 @@ modest-icon-names - - - - - - - diff --git a/docs/reference/tmpl/modest-mail-operation.sgml b/docs/reference/tmpl/modest-mail-operation.sgml index 9668d88..8d15059 100644 --- a/docs/reference/tmpl/modest-mail-operation.sgml +++ b/docs/reference/tmpl/modest-mail-operation.sgml @@ -69,6 +69,13 @@ ModestMailOperation @: + + + + + +@: + diff --git a/docs/reference/tmpl/modest-main-window.sgml b/docs/reference/tmpl/modest-main-window.sgml index 45fea64..935d576 100644 --- a/docs/reference/tmpl/modest-main-window.sgml +++ b/docs/reference/tmpl/modest-main-window.sgml @@ -31,6 +31,7 @@ ModestMainWindow @factory: +@ui_manager: @Returns: diff --git a/docs/reference/tmpl/modest-msg-view.sgml b/docs/reference/tmpl/modest-msg-view.sgml index 291af8f..9b7de65 100644 --- a/docs/reference/tmpl/modest-msg-view.sgml +++ b/docs/reference/tmpl/modest-msg-view.sgml @@ -49,6 +49,54 @@ ModestMsgView @: @: + + + + + +@: +@: + + + + + + +@: +@: + + + + + + +@: +@: + + + + + + +@: +@: + + + + + + +@: +@: + + + + + + +@: +@: + diff --git a/docs/reference/tmpl/modest-store-widget.sgml b/docs/reference/tmpl/modest-store-widget.sgml index 1b41490..67aa850 100644 --- a/docs/reference/tmpl/modest-store-widget.sgml +++ b/docs/reference/tmpl/modest-store-widget.sgml @@ -39,6 +39,27 @@ ModestStoreWidget @modeststorewidget: the object which received the signal. + + + + + +@modeststorewidget: the object which received the signal. + + + + + + +@modeststorewidget: the object which received the signal. + + + + + + +@modeststorewidget: the object which received the signal. + diff --git a/docs/reference/tmpl/modest-text-utils.sgml b/docs/reference/tmpl/modest-text-utils.sgml index bab1d21..f40aab9 100644 --- a/docs/reference/tmpl/modest-text-utils.sgml +++ b/docs/reference/tmpl/modest-text-utils.sgml @@ -99,7 +99,7 @@ modest-text-utils @Returns: - + @@ -108,3 +108,32 @@ modest-text-utils @Returns: + + + + + +@subject: +@Returns: + + + + + + + +@s1: +@s2: +@insensitive: +@Returns: + + + + + + + +@date: +@Returns: + + diff --git a/docs/reference/tmpl/modest-tny-account-store.sgml b/docs/reference/tmpl/modest-tny-account-store.sgml index 3673db2..dbf4c6c 100644 --- a/docs/reference/tmpl/modest-tny-account-store.sgml +++ b/docs/reference/tmpl/modest-tny-account-store.sgml @@ -50,6 +50,25 @@ ModestTnyAccountStore @Param4: @Param5: + + + + + +@modesttnyaccountstore: the object which received the signal. +@arg1: + + + + + + +@: +@Param2: +@Param3: +@Param4: +@Param5: + diff --git a/docs/reference/tmpl/modest-toolbar.sgml b/docs/reference/tmpl/modest-toolbar.sgml index 9699dce..b2c1084 100644 --- a/docs/reference/tmpl/modest-toolbar.sgml +++ b/docs/reference/tmpl/modest-toolbar.sgml @@ -52,6 +52,22 @@ ModestToolbar @: @: + + + + + +@: +@: + + + + + + +@: +@: + diff --git a/docs/reference/tmpl/modest-ui.sgml b/docs/reference/tmpl/modest-ui.sgml index 9d0df49..057d514 100644 --- a/docs/reference/tmpl/modest-ui.sgml +++ b/docs/reference/tmpl/modest-ui.sgml @@ -30,6 +30,7 @@ ModestUI +@account_store: @Returns: diff --git a/docs/reference/tmpl/modest-unused.sgml b/docs/reference/tmpl/modest-unused.sgml index 22a3922..c9f58b0 100644 --- a/docs/reference/tmpl/modest-unused.sgml +++ b/docs/reference/tmpl/modest-unused.sgml @@ -233,6 +233,14 @@ modest.glade @parent: + + + + + +@modestheaderview: the object which received the signal. +@arg1: + @@ -283,6 +291,12 @@ modest.glade + + + + + + @@ -532,6 +546,14 @@ modest.glade @subject: @Returns: + + + + + +@address: +@Returns: + @@ -637,6 +659,54 @@ modest.glade @attachments_list: @Returns: + + + + + +@widget: +@user_data: + + + + + + +@widget: +@main_window: + + + + + + +@widget: +@main_window: + + + + + + +@widget: +@main_window: + + + + + + +@widget: +@main_window: + + + + + + +@widget: +@main_window: + @@ -746,6 +816,24 @@ modest.glade @ui: @Returns: + + + + + +@self: +@items: +@Returns: + + + + + + +@self: +@items: +@Returns: + diff --git a/docs/reference/tmpl/modest-widget-factory.sgml b/docs/reference/tmpl/modest-widget-factory.sgml index a6520df..d529a32 100644 --- a/docs/reference/tmpl/modest-widget-factory.sgml +++ b/docs/reference/tmpl/modest-widget-factory.sgml @@ -126,23 +126,3 @@ ModestWidgetFactory @Returns: - - - - - -@self: -@items: -@Returns: - - - - - - - -@self: -@items: -@Returns: - - diff --git a/src/Makefile.am b/src/Makefile.am index 766f8b1..c33e44b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,11 +8,14 @@ INCLUDES=\ $(MODEST_GSTUFF_CFLAGS)\ $(MODEST_LIBTINYMAIL_GNOME_DESKTOP_CFLAGS) \ $(MODEST_LIBTINYMAIL_MAEMO_CFLAGS) \ + -I ${top_srcdir}/src/widgets \ -I$(MODEST_PLATFORM) \ -DPREFIX=\"@prefix@\" \ - -DMODESTLOCALEDIR=\""$(modestlocaledir)"\" \ + -DMODEST_LOCALEDIR=\"$(MODEST_LOCALEDIR)\" \ -DMODEST_PLATFORM=\"$(MODEST_PLATFORM)\" \ - -DMODEST_PLATFORM_ID=$(MODEST_PLATFORM_ID) + -DMODEST_PLATFORM_ID=$(MODEST_PLATFORM_ID) \ + -DPIXMAP_PREFIX=\"${datadir}/pixmaps/modest/\" \ + -DMODEST_UIDIR=\"$(datadir)/modest/ui/\" BUILT_SOURCES = modest-marshal.c modest-marshal.h @@ -52,6 +55,7 @@ modest_SOURCES=\ modest-protocol-mgr.c\ modest-proto.h\ modest-proto.c\ + modest-ui.c\ modest-ui.h\ modest-text-utils.h\ modest-text-utils.c\ @@ -78,4 +82,10 @@ modest_LDADD = \ $(MODEST_PLATFORM)/libmodest-ui.la \ widgets/libmodest-widgets.la -EXTRA_DIST=modest-marshal.list +EXTRA_DIST=modest-marshal.list ui/* + +UI_FILES=\ + ui/modest-ui.xml + +uidir = $(datadir)/modest/ui +ui_DATA = $(UI_FILES) diff --git a/src/gtk/Makefile.am b/src/gtk/Makefile.am index 7c914b2..5f56d63 100644 --- a/src/gtk/Makefile.am +++ b/src/gtk/Makefile.am @@ -9,8 +9,11 @@ INCLUDES=\ $(MODEST_GSTUFF_CFLAGS) \ $(MODEST_LIBTINYMAIL_GNOME_DESKTOP_CFLAGS) \ + -I ${top_srcdir}/src/widgets \ -I ${top_srcdir}/src \ -DPREFIX=\"@prefix@\" \ + -DPIXMAP_PREFIX=\"${datadir}/pixmaps/modest/\" \ + -DMODEST_UIDIR=\""$(datadir)/modest/ui/"\" \ -Wall noinst_LTLIBRARIES=\ @@ -21,8 +24,6 @@ PIXMAP_FILES=\ pixmaps/*.svg libmodest_ui_la_SOURCES= \ - modest-ui.c \ - modest-icon-names.h \ modest-main-window.h \ modest-main-window.c \ modest-account-view-window.c \ @@ -42,5 +43,5 @@ LDADD = \ EXTRA_DIST=pixmaps/* -pixmapdir = $(prefix)/share/modest/pixmaps +pixmapdir = $(datadir)/pixmaps/modest pixmap_DATA = $(PIXMAP_FILES) diff --git a/src/gtk/modest-account-assistant.c b/src/gtk/modest-account-assistant.c index cc4265a..cb4cd10 100644 --- a/src/gtk/modest-account-assistant.c +++ b/src/gtk/modest-account-assistant.c @@ -237,13 +237,13 @@ receiving_page_update_completeness (GtkEditable *editable, priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); - txt = modest_store_widget_get_username (priv->store_widget); + txt = modest_store_widget_get_username (MODEST_STORE_WIDGET (priv->store_widget)); if (!txt || strlen(txt) == 0) { set_current_page_complete (self, FALSE); return; } - txt = modest_store_widget_get_servername (priv->store_widget); + txt = modest_store_widget_get_servername (MODEST_STORE_WIDGET (priv->store_widget)); if (!txt || strlen(txt) == 0) { set_current_page_complete (self, FALSE); return; @@ -270,7 +270,7 @@ on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self if (!strcmp (chosen, MODEST_PROTO_POP) || !strcmp (chosen, MODEST_PROTO_IMAP)) { g_signal_connect (priv->store_widget, "data_changed", - receiving_page_update_completeness, + G_CALLBACK (receiving_page_update_completeness), self); set_current_page_complete (self, FALSE); } else @@ -317,7 +317,7 @@ add_receiving_page (ModestAccountAssistant *self) TRUE, TRUE, 0); /* Force the selection */ - on_receiving_combo_box_changed (combo, self); + on_receiving_combo_box_changed (GTK_COMBO_BOX (combo), self); gtk_assistant_append_page (GTK_ASSISTANT(self), page); @@ -392,7 +392,7 @@ add_sending_page (ModestAccountAssistant *self) FALSE, FALSE, 0); /* Force the selection */ - on_sending_combo_box_changed (combo, self); + on_sending_combo_box_changed (GTK_COMBO_BOX (combo), self); gtk_assistant_append_page (GTK_ASSISTANT(self), page); diff --git a/src/gtk/modest-edit-msg-window.c b/src/gtk/modest-edit-msg-window.c index acc3095..3b3d53b 100644 --- a/src/gtk/modest-edit-msg-window.c +++ b/src/gtk/modest-edit-msg-window.c @@ -28,6 +28,7 @@ */ #include #include +#include "modest-toolbar.h" #include "modest-edit-msg-window.h" #include "modest-widget-memory.h" #include "modest-mail-operation.h" @@ -353,7 +354,7 @@ toolbar_new (ModestEditMsgWindow *self) for (i = 0 ; i != sizeof(button_ids) / sizeof(ModestToolbarButton); ++i) buttons = g_slist_append (buttons, GINT_TO_POINTER(button_ids[i])); - toolbar = modest_widget_factory_get_edit_toolbar (priv->factory, buttons); + toolbar = modest_toolbar_new (buttons); g_slist_free (buttons); g_signal_connect (G_OBJECT(toolbar), "button_clicked", diff --git a/src/gtk/modest-edit-msg-window.h b/src/gtk/modest-edit-msg-window.h deleted file mode 100644 index 63cf77e..0000000 --- a/src/gtk/modest-edit-msg-window.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MODEST_EDIT_MSG_WINDOW_H__ -#define __MODEST_EDIT_MSG_WINDOW_H__ - -#include -#include -#include "modest-conf.h" -#include "modest-widget-factory.h" - -G_BEGIN_DECLS - -/* convenience macros */ -#define MODEST_TYPE_EDIT_MSG_WINDOW (modest_edit_msg_window_get_type()) -#define MODEST_EDIT_MSG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_EDIT_MSG_WINDOW,ModestEditMsgWindow)) -#define MODEST_EDIT_MSG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_EDIT_MSG_WINDOW,GtkWindow)) -#define MODEST_IS_EDIT_MSG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_EDIT_MSG_WINDOW)) -#define MODEST_IS_EDIT_MSG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_EDIT_MSG_WINDOW)) -#define MODEST_EDIT_MSG_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_EDIT_MSG_WINDOW,ModestEditMsgWindowClass)) - -typedef struct _ModestEditMsgWindow ModestEditMsgWindow; -typedef struct _ModestEditMsgWindowClass ModestEditMsgWindowClass; - -struct _ModestEditMsgWindow { - GtkWindow parent; - /* insert public members, if any */ -}; - -struct _ModestEditMsgWindowClass { - GtkWindowClass parent_class; - /* insert signal callback declarations, eg. */ - /* void (* my_event) (ModestEditMsgWindow* obj); */ -}; - - -typedef enum _ModestEditType { - MODEST_EDIT_TYPE_NEW, - MODEST_EDIT_TYPE_REPLY, - MODEST_EDIT_TYPE_FORWARD, - MODEST_EDIT_TYPE_VIEW, - - MODEST_EDIT_TYPE_NUM -} ModestEditType; -/* typedef enum _ModestEditType ModestEditType; */ - - -/* member functions */ -GType modest_edit_msg_window_get_type (void) G_GNUC_CONST; - -GtkWidget* modest_edit_msg_window_new (ModestWidgetFactory *factory, - ModestEditType type); - -/** - * modest_edit_msg_window_set_msg: - * @self: a #ModestEditMsgWindow - * @msg: a #TnyMsg - * - * shows the message @msg in a #ModestEditMsgWindow - **/ -void modest_edit_msg_window_set_msg (ModestEditMsgWindow *self, - TnyMsg *msg); -G_END_DECLS - -#endif /* __MODEST_EDIT_MSG_WINDOW_H__ */ - diff --git a/src/gtk/modest-icon-names.h b/src/gtk/modest-icon-names.h deleted file mode 100644 index 9c2aac3..0000000 --- a/src/gtk/modest-icon-names.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/* modest-tny-icon-names.h */ - -/* - * FIXME: this should go the front-end dirs, - * with specific icons - */ - -#ifndef __MODEST_TNY_ICON_NAMES_H__ -#define __MODEST_TNY_ICON_NAMES_H__ - -#define PIXMAP_PREFIX PREFIX "/share/modest/pixmaps/" - -/* icons */ - -#define MODEST_APP_ICON PIXMAP_PREFIX "modest.png" - -#define MODEST_HEADER_ICON_READ PIXMAP_PREFIX "qgn_list_messagin_mail.png" -#define MODEST_HEADER_ICON_UNREAD PIXMAP_PREFIX "qgn_list_messagin_mail_unread.png" -#define MODEST_HEADER_ICON_DELETED PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" -#define MODEST_HEADER_ICON_ATTACH PIXMAP_PREFIX "qgn_list_gene_attacpap.png" - -#define MODEST_FOLDER_ICON_OPEN PIXMAP_PREFIX "qgn_list_gene_fldr_opn.png" -#define MODEST_FOLDER_ICON_CLOSED PIXMAP_PREFIX "qgn_list_gene_fldr_cls.png" - -#define MODEST_FOLDER_ICON_ACCOUNT PIXMAP_PREFIX "qgn_addr_icon_user_group.png" -#define MODEST_FOLDER_ICON_INBOX PIXMAP_PREFIX "qgn_list_messagin_inbox.png" -#define MODEST_FOLDER_ICON_OUTBOX PIXMAP_PREFIX "qgn_list_messagin_outbox.png" -#define MODEST_FOLDER_ICON_SENT PIXMAP_PREFIX "qgn_list_messagin_sent.png" -#define MODEST_FOLDER_ICON_TRASH PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" -#define MODEST_FOLDER_ICON_JUNK PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" -#define MODEST_FOLDER_ICON_DRAFTS PIXMAP_PREFIX "qgn_list_messagin_drafts.png" -#define MODEST_FOLDER_ICON_NORMAL PIXMAP_PREFIX "qgn_list_gene_fldr_cls.png" - -#define MODEST_FOLDER_ICON_CONTACTS PIXMAP_PREFIX "qgn_addr_icon_user_group.png" -#define MODEST_FOLDER_ICON_NOTES PIXMAP_PREFIX "qgn_list_messagin_viewer.png" -#define MODEST_FOLDER_ICON_CALENDAR PIXMAP_PREFIX "qgn_widg_datedit.png" - -/* toolbar */ -#define MODEST_TOOLBAR_ICON_MAIL_SEND PIXMAP_PREFIX "qgn_list_messagin_sent.png" -#define MODEST_TOOLBAR_ICON_NEW_MAIL PIXMAP_PREFIX "qgn_list_messagin_editor.png" -#define MODEST_TOOLBAR_ICON_SEND_RECEIVE PIXMAP_PREFIX "gtk-refresh.png" -#define MODEST_TOOLBAR_ICON_REPLY PIXMAP_PREFIX "mail-reply-sender.png" -#define MODEST_TOOLBAR_ICON_REPLY_ALL PIXMAP_PREFIX "mail-reply-all.png" -#define MODEST_TOOLBAR_ICON_FORWARD PIXMAP_PREFIX "mail-forward.png" -#define MODEST_TOOLBAR_ICON_DELETE PIXMAP_PREFIX "mail-mark-junk.png" -#define MODEST_TOOLBAR_ICON_NEXT PIXMAP_PREFIX "forward.png" -#define MODEST_TOOLBAR_ICON_PREV PIXMAP_PREFIX "back.png" -#define MODEST_TOOLBAR_ICON_STOP PIXMAP_PREFIX "stock-stop.svg" - -#endif /*__MODEST_TNY_ICON_NAMES_H__*/ diff --git a/src/gtk/modest-main-window.c b/src/gtk/modest-main-window.c index 3d6d8b1..9fe8cc1 100644 --- a/src/gtk/modest-main-window.c +++ b/src/gtk/modest-main-window.c @@ -28,23 +28,21 @@ */ #include -#include #include -#include -#include - -#include - #include "modest-main-window.h" +#include "modest-widget-factory.h" +#include "modest-widget-memory.h" +#include "modest-icon-factory.h" +#include "modest-ui.h" #include "modest-account-view-window.h" #include "modest-account-mgr.h" #include "modest-conf.h" #include "modest-edit-msg-window.h" -#include "modest-icon-names.h" #include "modest-tny-platform-factory.h" #include "modest-tny-msg-actions.h" #include "modest-mail-operation.h" +#include "modest-icon-names.h" /* 'private'/'protected' functions */ static void modest_main_window_class_init (ModestMainWindowClass *klass); @@ -53,7 +51,6 @@ static void modest_main_window_finalize (GObject *obj); static void restore_sizes (ModestMainWindow *self); static void save_sizes (ModestMainWindow *self); -static void get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data); /* list my signals */ enum { @@ -65,6 +62,8 @@ enum { typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate; struct _ModestMainWindowPrivate { + GtkUIManager *ui_manager; + GtkWidget *toolbar; GtkWidget *menubar; @@ -167,332 +166,6 @@ modest_main_window_finalize (GObject *obj) } -static void -on_menu_about (GtkWidget *widget, gpointer data) -{ - GtkWidget *about; - const gchar *authors[] = { - "Dirk-Jan C. Binnema ", - NULL - }; - about = gtk_about_dialog_new (); - gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME); - gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION); - gtk_about_dialog_set_copyright ( - GTK_ABOUT_DIALOG(about), - _("Copyright (c) 2006, Nokia Corporation\n" - "All rights reserved.")); - gtk_about_dialog_set_comments ( GTK_ABOUT_DIALOG(about), - _("a modest e-mail client\n\n" - "design and implementation: Dirk-Jan C. Binnema\n" - "contributions from the fine people at KernelConcepts and Igalia\n" - "uses the tinymail email framework written by Philip van Hoof")); - gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors); - gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org"); - - gtk_dialog_run (GTK_DIALOG (about)); - gtk_widget_destroy(about); -} - - -static void -on_menu_accounts (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - GtkWidget *account_win; - ModestMainWindowPrivate *priv; - - g_return_if_fail (widget); - g_return_if_fail (self); - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - account_win = modest_account_view_window_new (priv->widget_factory); - - gtk_window_set_transient_for (GTK_WINDOW(account_win), - GTK_WINDOW(self)); - - gtk_widget_show (account_win); -} - - -static void -on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - GtkWidget *msg_win; - ModestMainWindowPrivate *priv; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - msg_win = modest_edit_msg_window_new (priv->widget_factory, - MODEST_EDIT_TYPE_NEW); - gtk_widget_show (msg_win); -} - -static void -get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) -{ - GtkWidget *msg_win; - TnyHeader *new_header; - TnyMsg *new_msg; - ModestMainWindowPrivate *priv; - ModestEditType edit_type = -2; - GetMsgAsyncHelper *helper; - - helper = (GetMsgAsyncHelper *) (user_data); - - /* FIXME: select proper action */ - priv = helper->main_window_private; - new_msg = NULL; - switch (helper->action) { - case 1: - new_msg = - modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type, - MODEST_MAIL_OPERATION_REPLY_MODE_SENDER); - edit_type = MODEST_EDIT_TYPE_REPLY; - break; - case 2: - new_msg = - modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type, - MODEST_MAIL_OPERATION_REPLY_MODE_ALL); - edit_type = MODEST_EDIT_TYPE_REPLY; - break; - case 3: - new_msg = - modest_mail_operation_create_forward_mail (msg, helper->from, helper->forward_type); - edit_type = MODEST_EDIT_TYPE_FORWARD; - break; - default: - g_warning ("unexpected action type: %d", helper->action); - } - - if (new_msg) { - /* Set from */ - new_header = tny_msg_get_header (new_msg); - tny_header_set_from (new_header, helper->from); - g_object_unref (G_OBJECT (new_header)); - - /* Show edit window */ - msg_win = modest_edit_msg_window_new (priv->widget_factory, - edit_type); - modest_edit_msg_window_set_msg (MODEST_EDIT_MSG_WINDOW (msg_win), - new_msg); - gtk_widget_show (msg_win); - - /* Clean and go on */ - g_object_unref (new_msg); - } - - tny_iterator_next (helper->iter); - if (tny_iterator_is_done (helper->iter)) { - TnyList *headers; - headers = tny_iterator_get_list (helper->iter); - g_object_unref (G_OBJECT (headers)); - g_object_unref (G_OBJECT (helper->iter)); - g_slice_free (GetMsgAsyncHelper, helper); - } else - tny_folder_get_msg_async (folder, TNY_HEADER (tny_iterator_get_current (helper->iter)), - get_msg_cb, helper); -} - -static void -on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - ModestMainWindowPrivate *priv; - ModestHeaderView *header_view; - TnyList *header_list; - gchar *reply_key, *forward_key; - ModestMailOperationReplyType reply_type; - ModestMailOperationForwardType forward_type; - ModestConf *conf; - GError *error; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); - - header_view = modest_widget_factory_get_header_view (priv->widget_factory); - header_list = modest_header_view_get_selected_headers (header_view); - - /* Get reply and forward types */ - error = NULL; - reply_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_REPLY_TYPE); - reply_type = modest_conf_get_int (conf, reply_key, &error); - if (error || reply_type == 0) { - g_warning ("key %s not defined", reply_key); - reply_type = MODEST_MAIL_OPERATION_REPLY_TYPE_CITE; - if (error) { - g_error_free (error); - error = NULL; - } - } - g_free (reply_key); - - forward_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_FORWARD_TYPE); - forward_type = modest_conf_get_int (conf, forward_key, &error); - if (error || forward_type == 0) { - g_warning ("key %s not defined", forward_key); - forward_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE; - if (error) { - g_error_free (error); - error = NULL; - } - } - g_free (forward_key); - - if (header_list) { - TnyHeader *header; - TnyFolder *folder; - gchar *from, *email_key; - const gchar *account_name; - GetMsgAsyncHelper *helper; - - /* We assume that we can only select messages of the - same folder and that we reply all of them from the - same account. In fact the interface currently only - allows single selection */ - account_name = modest_folder_view_get_selected_account (priv->folder_view); - email_key = g_strdup_printf ("%s/%s/%s", MODEST_ACCOUNT_NAMESPACE, - account_name, MODEST_ACCOUNT_EMAIL); - from = modest_conf_get_string (conf, email_key, NULL); - if (!from) - from = g_strdup ("Invalid"); - g_free (email_key); - - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->main_window_private = priv; - helper->reply_type = reply_type; - helper->forward_type = forward_type; - helper->action = action; - helper->from = from; - helper->iter = tny_list_create_iterator (header_list); - - header = TNY_HEADER (tny_iterator_get_current (helper->iter)); - folder = tny_header_get_folder (header); - - /* The callback will call it per each header */ - tny_folder_get_msg_async (folder, header, get_msg_cb, helper); - - /* Clean */ - g_object_unref (G_OBJECT (folder)); - } -} - -static void -on_menu_quit (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - save_sizes (self); - gtk_widget_destroy (GTK_WIDGET(self)); -} - -static void -on_menu_delete (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - ModestMainWindowPrivate *priv; - ModestHeaderView *header_view; - TnyList *header_list; - TnyIterator *iter; - GtkTreeModel *model; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - header_view = modest_widget_factory_get_header_view (priv->widget_factory); - header_list = modest_header_view_get_selected_headers (header_view); - - if (header_list) { - iter = tny_list_create_iterator (header_list); - model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); - if (GTK_IS_TREE_MODEL_SORT (model)) - model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); - do { - TnyHeader *header; - ModestMailOperation *mail_op; - - header = TNY_HEADER (tny_iterator_get_current (iter)); - /* TODO: thick grain mail operation involving - a list of objects. Composite pattern ??? */ - mail_op = modest_mail_operation_new (); - - /* Move to trash */ - modest_mail_operation_remove_msg (mail_op, header, TRUE); - - /* Remove from tree model */ - tny_list_remove (TNY_LIST (model), G_OBJECT (header)); - - g_object_unref (G_OBJECT (mail_op)); - g_object_unref (header); - tny_iterator_next (iter); - - } while (!tny_iterator_is_done (iter)); - } -} - - -/* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */ -static GtkItemFactoryEntry menu_items[] = { - { "/_File", NULL, NULL, 0, "", NULL }, - { "/File/_New", "N", NULL, 0, "", GTK_STOCK_NEW }, - { "/File/_Open", "O", NULL, 0, "", GTK_STOCK_OPEN }, - { "/File/_Save", "S", NULL, 0, "", GTK_STOCK_SAVE }, - { "/File/Save _As", NULL, NULL, 0, "", NULL }, - { "/File/sep1", NULL, NULL, 0, "", NULL }, - { "/File/_Quit", "Q", on_menu_quit, 0, "", GTK_STOCK_QUIT }, - - { "/_Edit", NULL, NULL, 0, "", NULL }, - { "/Edit/_Undo", "Z", NULL, 0, "", GTK_STOCK_UNDO }, - { "/Edit/_Redo", "Z", NULL, 0, "", GTK_STOCK_REDO }, - { "/Edit/sep1", NULL, NULL, 0, "", NULL }, - { "/Edit/Cut", "X", NULL, 0, "", GTK_STOCK_CUT }, - { "/Edit/Copy", "C", NULL, 0, "", GTK_STOCK_COPY }, - { "/Edit/Paste", NULL, NULL, 0, "", GTK_STOCK_PASTE}, - { "/Edit/sep2", NULL, NULL, 0, "", NULL }, - { "/Edit/Delete", "Q", NULL, 0, "" ,NULL}, - { "/Edit/Select all", "A", NULL, 0, "" ,NULL}, - { "/Edit/Deelect all", "A", NULL, 0, "" ,NULL}, - - { "/_Actions", NULL, NULL, 0, "" ,NULL}, - { "/Actions/_New Message", NULL, on_menu_new_message, 0, "",NULL }, - { "/Actions/_Reply", NULL, on_menu_reply_forward, 1, "" ,NULL}, - { "/Actions/_Forward", NULL, on_menu_reply_forward, 3, "" ,NULL}, - { "/Actions/_Bounce", NULL, NULL, 0, "",NULL }, - - { "/_Options", NULL, NULL, 0, "" ,NULL}, - { "/Options/_Accounts", NULL, on_menu_accounts,0, "" ,NULL}, - { "/Options/_Contacts", NULL, NULL, 0, "" ,NULL }, - - - { "/_Help", NULL, NULL, 0, "" ,NULL}, - { "/_Help/About", NULL, on_menu_about, 0, "", GTK_STOCK_ABOUT}, -}; - -static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); - - -static GtkWidget * -menubar_new (ModestMainWindow *self) -{ - GtkItemFactory *item_factory; - GtkAccelGroup *accel_group; - - /* Make an accelerator group (shortcut keys) */ - accel_group = gtk_accel_group_new (); - - /* Make an ItemFactory (that makes a menubar) */ - item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "
", - accel_group); - - /* This function generates the menu items. Pass the item factory, - the number of items in the array, the array itself, and any - callback data for the the menu items. */ - gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, self); - - ///* Attach the new accelerator group to the window. */ - gtk_window_add_accel_group (GTK_WINDOW (self), accel_group); - - /* Finally, return the actual menu bar created by the item factory. */ - return gtk_item_factory_get_widget (item_factory, "
"); -} - - - - static ModestHeaderView* header_view_new (ModestMainWindow *self) { @@ -520,95 +193,6 @@ header_view_new (ModestMainWindow *self) return header_view; } -static void -on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id, - ModestMainWindow *self) -{ - GtkTreeSelection *sel; - GtkTreeIter iter; - GtkTreeModel *model; - ModestMainWindowPrivate *priv; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - switch (button_id) { - case MODEST_TOOLBAR_BUTTON_NEW_MAIL: - on_menu_new_message (self, 0, NULL); - break; - case MODEST_TOOLBAR_BUTTON_REPLY: - on_menu_reply_forward (self, 1, NULL); - break; - case MODEST_TOOLBAR_BUTTON_REPLY_ALL: - on_menu_reply_forward (self, 2, NULL); - break; - case MODEST_TOOLBAR_BUTTON_FORWARD: - on_menu_reply_forward (self, 3, NULL); - break; - case MODEST_TOOLBAR_BUTTON_SEND_RECEIVE: - - - case MODEST_TOOLBAR_BUTTON_NEXT: - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(priv->header_view)); - if (sel) { - gtk_tree_selection_get_selected (sel, &model, &iter); - gtk_tree_model_iter_next (model, &iter); - gtk_tree_selection_select_iter (sel, &iter); - } - - case MODEST_TOOLBAR_BUTTON_PREV: - /* if (sel) { */ -/* gtk_tree_selection_get_selected (sel, &model, &iter); */ -/* gtk_tree_model_iter_prev (model, &iter); */ -/* gtk_tree_selection_select_iter (sel, &iter); */ -/* } */ - - break; - case MODEST_TOOLBAR_BUTTON_DELETE: - on_menu_delete (self, 0, GTK_WIDGET (toolbar)); - break; - - default: - g_printerr ("modest: key %d pressed\n", button_id); - } -} - -static ModestToolbar* -toolbar_new (ModestMainWindow *self) -{ - int i; - ModestToolbar *toolbar; - GSList *buttons = NULL; - ModestMainWindowPrivate *priv; - - ModestToolbarButton button_ids[] = { - MODEST_TOOLBAR_BUTTON_NEW_MAIL, - MODEST_TOOLBAR_BUTTON_REPLY, - MODEST_TOOLBAR_BUTTON_REPLY_ALL, - MODEST_TOOLBAR_BUTTON_FORWARD, - MODEST_TOOLBAR_SEPARATOR, - MODEST_TOOLBAR_BUTTON_SEND_RECEIVE, - MODEST_TOOLBAR_SEPARATOR, - MODEST_TOOLBAR_BUTTON_PREV, - MODEST_TOOLBAR_BUTTON_NEXT, - MODEST_TOOLBAR_SEPARATOR, - MODEST_TOOLBAR_BUTTON_DELETE - }; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - for (i = 0 ; i != sizeof(button_ids) / sizeof(ModestToolbarButton); ++i) - buttons = g_slist_append (buttons, GINT_TO_POINTER(button_ids[i])); - - toolbar = modest_widget_factory_get_main_toolbar (priv->widget_factory, buttons); - g_slist_free (buttons); - - g_signal_connect (G_OBJECT(toolbar), "button_clicked", - G_CALLBACK(on_toolbar_button_clicked), self); - - return toolbar; -} - - static void restore_sizes (ModestMainWindow *self) @@ -681,11 +265,11 @@ on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) GtkWidget* -modest_main_window_new (ModestWidgetFactory *widget_factory) +modest_main_window_new (ModestWidgetFactory *widget_factory, + GtkUIManager *ui_manager) { GObject *obj; ModestMainWindowPrivate *priv; - GtkWidget *main_vbox; GtkWidget *status_hbox; GtkWidget *header_win, *folder_win; @@ -695,8 +279,19 @@ modest_main_window_new (ModestWidgetFactory *widget_factory) obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); - g_object_ref (widget_factory); - priv->widget_factory = widget_factory; + priv->widget_factory = g_object_ref (widget_factory); + priv->ui_manager = g_object_ref (ui_manager); + + /* Add accelerators */ + gtk_window_add_accel_group (GTK_WINDOW (obj), + gtk_ui_manager_get_accel_group (priv->ui_manager)); + + + /* Toolbar / Menubar */ + priv->toolbar = gtk_ui_manager_get_widget (priv->ui_manager, "/ToolBar"); + priv->menubar = gtk_ui_manager_get_widget (priv->ui_manager, "/MenuBar"); + + gtk_toolbar_set_tooltips (GTK_TOOLBAR (priv->toolbar), TRUE); /* widgets from factory */ priv->folder_view = modest_widget_factory_get_folder_view (widget_factory); @@ -707,10 +302,6 @@ modest_main_window_new (ModestWidgetFactory *widget_factory) FALSE); header_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->header_view), FALSE); - - /* tool/menubar */ - priv->menubar = menubar_new (MODEST_MAIN_WINDOW(obj)); - priv->toolbar = GTK_WIDGET(toolbar_new (MODEST_MAIN_WINDOW(obj))); /* paned */ priv->folder_paned = gtk_vpaned_new (); diff --git a/src/gtk/modest-main-window.h b/src/gtk/modest-main-window.h deleted file mode 100644 index be89bf0..0000000 --- a/src/gtk/modest-main-window.h +++ /dev/null @@ -1,47 +0,0 @@ -/* modest-main-window.h */ -/* insert (c)/licensing information) */ - -#ifndef __MODEST_MAIN_WINDOW_H__ -#define __MODEST_MAIN_WINDOW_H__ - -#include -#include - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ - -G_BEGIN_DECLS - -/* convenience macros */ -#define MODEST_TYPE_MAIN_WINDOW (modest_main_window_get_type()) -#define MODEST_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_MAIN_WINDOW,ModestMainWindow)) -#define MODEST_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_MAIN_WINDOW,GtkWindow)) -#define MODEST_IS_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_MAIN_WINDOW)) -#define MODEST_IS_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_MAIN_WINDOW)) -#define MODEST_MAIN_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_MAIN_WINDOW,ModestMainWindowClass)) - -typedef struct _ModestMainWindow ModestMainWindow; -typedef struct _ModestMainWindowClass ModestMainWindowClass; - -struct _ModestMainWindow { - GtkWindow parent; - /* insert public members, if any */ -}; - -struct _ModestMainWindowClass { - GtkWindowClass parent_class; - /* insert signal callback declarations, eg. */ - /* void (* my_event) (ModestMainWindow* obj); */ -}; - -/* member functions */ -GType modest_main_window_get_type (void) G_GNUC_CONST; - - -GtkWidget* modest_main_window_new (ModestWidgetFactory *factory); - -G_END_DECLS - -#endif /* __MODEST_MAIN_WINDOW_H__ */ - diff --git a/src/gtk/modest-store-widget.c b/src/gtk/modest-store-widget.c index c10216e..47d7ef8 100644 --- a/src/gtk/modest-store-widget.c +++ b/src/gtk/modest-store-widget.c @@ -253,8 +253,8 @@ imap_pop_configuration (ModestStoreWidget *self) gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0); /* Handle entry modifications */ - g_signal_connect (priv->username, "changed", on_entry_changed, self); - g_signal_connect (priv->servername, "changed", on_entry_changed, self); + g_signal_connect (priv->username, "changed", G_CALLBACK (on_entry_changed), self); + g_signal_connect (priv->servername, "changed", G_CALLBACK (on_entry_changed), self); return box; } diff --git a/src/gtk/modest-ui.c b/src/gtk/modest-ui.c deleted file mode 100644 index fadca5b..0000000 --- a/src/gtk/modest-ui.c +++ /dev/null @@ -1,209 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ - -#include "../modest-ui.h" -#include "../modest-account-mgr.h" -#include "../modest-widget-factory.h" -#include "modest-main-window.h" -#include "modest-tny-platform-factory.h" - - -/* 'private'/'protected' functions */ -static void modest_ui_class_init (ModestUIClass *klass); -static void modest_ui_init (ModestUI *obj); -static void modest_ui_finalize (GObject *obj); - -gchar *on_password_requested (TnyAccountIface *, const gchar *, gboolean *); - - -typedef struct _ModestUIPrivate ModestUIPrivate; -struct _ModestUIPrivate { - ModestWidgetFactory *widget_factory; - - GtkWidget *main_window; -}; - -#define MODEST_UI_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - MODEST_TYPE_UI, \ - ModestUIPrivate)) - - -/* list my signals */ -enum { - /* MY_SIGNAL_1, */ - /* MY_SIGNAL_2, */ - LAST_SIGNAL -}; - -/* globals */ -static GObjectClass *parent_class = NULL; - - -GType -modest_ui_get_type (void) -{ - static GType my_type = 0; - if (!my_type) { - static const GTypeInfo my_info = { - sizeof(ModestUIClass), - NULL, /* base init */ - NULL, /* base finalize */ - (GClassInitFunc) modest_ui_class_init, - NULL, /* class finalize */ - NULL, /* class data */ - sizeof(ModestUI), - 1, /* n_preallocs */ - (GInstanceInitFunc) modest_ui_init, - NULL - }; - my_type = g_type_register_static (G_TYPE_OBJECT, - "ModestUI", - &my_info, 0); - } - return my_type; -} - - -static void -modest_ui_class_init (ModestUIClass *klass) -{ - GObjectClass *gobject_class; - gobject_class = (GObjectClass*) klass; - - parent_class = g_type_class_peek_parent (klass); - gobject_class->finalize = modest_ui_finalize; - - g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate)); - -} - - -static void -modest_ui_init (ModestUI *obj) -{ - ModestUIPrivate *priv; - - priv = MODEST_UI_GET_PRIVATE(obj); - - priv->widget_factory = NULL; - priv->main_window = NULL; -} - - -static void -modest_ui_finalize (GObject *obj) -{ - - ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj); - - if (priv->widget_factory) { - g_object_unref (G_OBJECT(priv->widget_factory)); - priv->widget_factory = NULL; - } - - G_OBJECT_CLASS(parent_class)->finalize (obj); -} - - -ModestUI* -modest_ui_new (void) -{ - GObject *obj; - ModestUIPrivate *priv; - TnyPlatformFactory *fact; - ModestAccountMgr *account_mgr; - TnyAccountStore *account_store; - - obj = g_object_new(MODEST_TYPE_UI, NULL); - priv = MODEST_UI_GET_PRIVATE(obj); - - /* Get the platform-dependent instances */ - fact = modest_tny_platform_factory_get_instance (); - - account_mgr = modest_tny_platform_factory_get_modest_account_mgr_instance (fact); - if (!account_mgr) { - g_printerr ("modest: could not create ModestAccountMgr instance\n"); - g_object_unref (obj); - return NULL; - } - - account_store = tny_platform_factory_new_account_store (fact); - if (!account_store) { - g_printerr ("modest: could not initialze ModestTnyAccountStore instance\n"); - return NULL; - } - - priv->widget_factory = modest_widget_factory_new (); - if (!priv->widget_factory) { - g_printerr ("modest: could not initialize widget factory\n"); - return NULL; - } - - return MODEST_UI(obj); -} - -static gboolean -on_main_window_destroy (GtkObject *widget, ModestUI *self) -{ - /* FIXME: check if there any viewer/editing windows opened */ - gtk_main_quit (); - return FALSE; -} - - -GtkWidget* -modest_ui_main_window (ModestUI *modest_ui) -{ - ModestUIPrivate *priv; - - g_return_val_if_fail (modest_ui, NULL); - priv = MODEST_UI_GET_PRIVATE(modest_ui); - - if (!priv->main_window) { - priv->main_window = - modest_main_window_new (priv->widget_factory); - g_signal_connect (G_OBJECT(priv->main_window), "destroy", - G_CALLBACK(on_main_window_destroy), modest_ui); - - } - - if (!priv->main_window) - g_printerr ("modest: could not create main window\n"); - - return priv->main_window; -} diff --git a/src/maemo/modest-edit-msg-window.h b/src/maemo/modest-edit-msg-window.h deleted file mode 100644 index 8844255..0000000 --- a/src/maemo/modest-edit-msg-window.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MODEST_EDIT_MSG_WINDOW_H__ -#define __MODEST_EDIT_MSG_WINDOW_H__ - -#include -#include -#include - -#include "modest-conf.h" -#include "modest-widget-factory.h" - -G_BEGIN_DECLS - -/* convenience macros */ -#define MODEST_TYPE_EDIT_MSG_WINDOW (modest_edit_msg_window_get_type()) -#define MODEST_EDIT_MSG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_EDIT_MSG_WINDOW,ModestEditMsgWindow)) -#define MODEST_EDIT_MSG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_EDIT_MSG_WINDOW,GtkWindow)) -#define MODEST_IS_EDIT_MSG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_EDIT_MSG_WINDOW)) -#define MODEST_IS_EDIT_MSG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_EDIT_MSG_WINDOW)) -#define MODEST_EDIT_MSG_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_EDIT_MSG_WINDOW,ModestEditMsgWindowClass)) - -typedef struct _ModestEditMsgWindow ModestEditMsgWindow; -typedef struct _ModestEditMsgWindowClass ModestEditMsgWindowClass; - -struct _ModestEditMsgWindow { - HildonWindow parent; - /* insert public members, if any */ -}; - -struct _ModestEditMsgWindowClass { - HildonWindowClass parent_class; - /* insert signal callback declarations, eg. */ - /* void (* my_event) (ModestEditMsgWindow* obj); */ -}; - - -typedef enum _ModestEditType { - MODEST_EDIT_TYPE_NEW, - MODEST_EDIT_TYPE_REPLY, - MODEST_EDIT_TYPE_FORWARD, - MODEST_EDIT_TYPE_VIEW, - - MODEST_EDIT_TYPE_NUM -} ModestEditType; -/* typedef enum _ModestEditType ModestEditType; */ - - -/* member functions */ -GType modest_edit_msg_window_get_type (void) G_GNUC_CONST; - -GtkWidget* modest_edit_msg_window_new (ModestWidgetFactory *factory, - ModestEditType type, - TnyMsg *msg); -G_END_DECLS - -#endif /* __MODEST_EDIT_MSG_WINDOW_H__ */ - diff --git a/src/maemo/modest-icon-names.h b/src/maemo/modest-icon-names.h deleted file mode 100644 index 9c2aac3..0000000 --- a/src/maemo/modest-icon-names.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/* modest-tny-icon-names.h */ - -/* - * FIXME: this should go the front-end dirs, - * with specific icons - */ - -#ifndef __MODEST_TNY_ICON_NAMES_H__ -#define __MODEST_TNY_ICON_NAMES_H__ - -#define PIXMAP_PREFIX PREFIX "/share/modest/pixmaps/" - -/* icons */ - -#define MODEST_APP_ICON PIXMAP_PREFIX "modest.png" - -#define MODEST_HEADER_ICON_READ PIXMAP_PREFIX "qgn_list_messagin_mail.png" -#define MODEST_HEADER_ICON_UNREAD PIXMAP_PREFIX "qgn_list_messagin_mail_unread.png" -#define MODEST_HEADER_ICON_DELETED PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" -#define MODEST_HEADER_ICON_ATTACH PIXMAP_PREFIX "qgn_list_gene_attacpap.png" - -#define MODEST_FOLDER_ICON_OPEN PIXMAP_PREFIX "qgn_list_gene_fldr_opn.png" -#define MODEST_FOLDER_ICON_CLOSED PIXMAP_PREFIX "qgn_list_gene_fldr_cls.png" - -#define MODEST_FOLDER_ICON_ACCOUNT PIXMAP_PREFIX "qgn_addr_icon_user_group.png" -#define MODEST_FOLDER_ICON_INBOX PIXMAP_PREFIX "qgn_list_messagin_inbox.png" -#define MODEST_FOLDER_ICON_OUTBOX PIXMAP_PREFIX "qgn_list_messagin_outbox.png" -#define MODEST_FOLDER_ICON_SENT PIXMAP_PREFIX "qgn_list_messagin_sent.png" -#define MODEST_FOLDER_ICON_TRASH PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" -#define MODEST_FOLDER_ICON_JUNK PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" -#define MODEST_FOLDER_ICON_DRAFTS PIXMAP_PREFIX "qgn_list_messagin_drafts.png" -#define MODEST_FOLDER_ICON_NORMAL PIXMAP_PREFIX "qgn_list_gene_fldr_cls.png" - -#define MODEST_FOLDER_ICON_CONTACTS PIXMAP_PREFIX "qgn_addr_icon_user_group.png" -#define MODEST_FOLDER_ICON_NOTES PIXMAP_PREFIX "qgn_list_messagin_viewer.png" -#define MODEST_FOLDER_ICON_CALENDAR PIXMAP_PREFIX "qgn_widg_datedit.png" - -/* toolbar */ -#define MODEST_TOOLBAR_ICON_MAIL_SEND PIXMAP_PREFIX "qgn_list_messagin_sent.png" -#define MODEST_TOOLBAR_ICON_NEW_MAIL PIXMAP_PREFIX "qgn_list_messagin_editor.png" -#define MODEST_TOOLBAR_ICON_SEND_RECEIVE PIXMAP_PREFIX "gtk-refresh.png" -#define MODEST_TOOLBAR_ICON_REPLY PIXMAP_PREFIX "mail-reply-sender.png" -#define MODEST_TOOLBAR_ICON_REPLY_ALL PIXMAP_PREFIX "mail-reply-all.png" -#define MODEST_TOOLBAR_ICON_FORWARD PIXMAP_PREFIX "mail-forward.png" -#define MODEST_TOOLBAR_ICON_DELETE PIXMAP_PREFIX "mail-mark-junk.png" -#define MODEST_TOOLBAR_ICON_NEXT PIXMAP_PREFIX "forward.png" -#define MODEST_TOOLBAR_ICON_PREV PIXMAP_PREFIX "back.png" -#define MODEST_TOOLBAR_ICON_STOP PIXMAP_PREFIX "stock-stop.svg" - -#endif /*__MODEST_TNY_ICON_NAMES_H__*/ diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 8576e2b..9fe8cc1 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -28,24 +28,21 @@ */ #include -#include -#include #include -#include -#include - -#include - #include "modest-main-window.h" +#include "modest-widget-factory.h" +#include "modest-widget-memory.h" +#include "modest-icon-factory.h" +#include "modest-ui.h" #include "modest-account-view-window.h" #include "modest-account-mgr.h" #include "modest-conf.h" #include "modest-edit-msg-window.h" -#include "modest-icon-names.h" #include "modest-tny-platform-factory.h" #include "modest-tny-msg-actions.h" #include "modest-mail-operation.h" +#include "modest-icon-names.h" /* 'private'/'protected' functions */ static void modest_main_window_class_init (ModestMainWindowClass *klass); @@ -68,15 +65,15 @@ struct _ModestMainWindowPrivate { GtkUIManager *ui_manager; GtkWidget *toolbar; - GtkWidget *menu; + GtkWidget *menubar; - //GtkWidget *folder_paned; + GtkWidget *folder_paned; GtkWidget *msg_paned; GtkWidget *main_paned; ModestWidgetFactory *widget_factory; TnyPlatformFactory *factory; - + ModestHeaderView *header_view; ModestFolderView *folder_view; ModestMsgView *msg_preview; @@ -87,16 +84,15 @@ struct _ModestMainWindowPrivate { MODEST_TYPE_MAIN_WINDOW, \ ModestMainWindowPrivate)) - typedef struct _GetMsgAsyncHelper { - ModestMainWindowPrivate *main_window_private; - guint action; - ModestMailOperationReplyType reply_type; - ModestMailOperationForwardType forward_type; - gchar *from; + ModestMainWindowPrivate *main_window_private; + guint action; + ModestMailOperationReplyType reply_type; + ModestMailOperationForwardType forward_type; + gchar *from; + TnyIterator *iter; } GetMsgAsyncHelper; - /* globals */ static GtkWindowClass *parent_class = NULL; @@ -120,7 +116,7 @@ modest_main_window_get_type (void) (GInstanceInitFunc) modest_main_window_init, NULL }; - my_type = g_type_register_static (HILDON_TYPE_WINDOW, + my_type = g_type_register_static (GTK_TYPE_WINDOW, "ModestMainWindow", &my_info, 0); } @@ -170,304 +166,6 @@ modest_main_window_finalize (GObject *obj) } -static void -on_menu_about (GtkWidget *widget, gpointer data) -{ - GtkWidget *about; - const gchar *authors[] = { - "Dirk-Jan C. Binnema ", - NULL - }; - about = gtk_about_dialog_new (); - gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME); - gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION); - gtk_about_dialog_set_copyright ( - GTK_ABOUT_DIALOG(about), - _("Copyright (c) 2006, Nokia Corporation\n" - "All rights reserved.")); - gtk_about_dialog_set_comments ( GTK_ABOUT_DIALOG(about), - _("a modest e-mail client\n\n" - "design and implementation: Dirk-Jan C. Binnema\n" - "contributions from the fine people at KernelConcepts and Igalia\n\n" - "uses the tinymail email framework written by Philip van Hoof")); - gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors); - gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org"); - - gtk_dialog_run (GTK_DIALOG (about)); - gtk_widget_destroy(about); -} - - -static void -on_menu_accounts (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - GtkWidget *account_win; - ModestMainWindowPrivate *priv; - - g_return_if_fail (widget); - g_return_if_fail (self); - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - account_win = modest_account_view_window_new (priv->widget_factory); - - gtk_window_set_transient_for (GTK_WINDOW(account_win), - GTK_WINDOW(self)); - - gtk_widget_show (account_win); -} - - -static void -on_menu_new_message (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - GtkWidget *msg_win; - ModestMainWindowPrivate *priv; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - msg_win = modest_edit_msg_window_new (priv->widget_factory, - MODEST_EDIT_TYPE_NEW, - NULL); - gtk_widget_show (msg_win); -} - -static void -get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) -{ - GtkWidget *msg_win; - TnyHeader *new_header; - TnyMsg *new_msg; - ModestMainWindowPrivate *priv; - ModestEditType edit_type = -2; - GetMsgAsyncHelper *helper; - - helper = (GetMsgAsyncHelper *) (user_data); - priv = helper->main_window_private; - - /* FIXME: select proper action */ - new_msg = NULL; - switch (helper->action) { - case 1: - new_msg = - modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type, - MODEST_MAIL_OPERATION_REPLY_MODE_SENDER); - edit_type = MODEST_EDIT_TYPE_REPLY; - break; - case 2: - new_msg = - modest_mail_operation_create_reply_mail (msg, helper->from, helper->reply_type, - MODEST_MAIL_OPERATION_REPLY_MODE_ALL); - edit_type = MODEST_EDIT_TYPE_REPLY; - break; - case 3: - new_msg = - modest_mail_operation_create_forward_mail (msg, helper->from, helper->forward_type); - edit_type = MODEST_EDIT_TYPE_FORWARD; - break; - default: - g_warning ("unexpected action type: %d", helper->action); - } - - if (new_msg) { - /* Set from */ - new_header = tny_msg_get_header (new_msg); - tny_header_set_from (new_header, helper->from); - - /* Show edit window */ - msg_win = modest_edit_msg_window_new (priv->widget_factory, - edit_type, - new_msg); - gtk_widget_show (msg_win); - - /* Clean and go on */ - g_object_unref (new_msg); - } -} - -static void -on_menu_reply_forward (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - ModestMainWindowPrivate *priv; - ModestHeaderView *header_view; - TnyList *header_list; - TnyIterator *iter; - gchar *reply_key, *forward_key; - ModestMailOperationReplyType reply_type; - ModestMailOperationForwardType forward_type; - ModestConf *conf; - GError *error; - GetMsgAsyncHelper *helper; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); - - header_view = modest_widget_factory_get_header_view (priv->widget_factory); - header_list = modest_header_view_get_selected_headers (header_view); - - /* Get reply and forward types */ - error = NULL; - reply_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_REPLY_TYPE); - reply_type = modest_conf_get_int (conf, reply_key, &error); - if (error || reply_type == 0) { - g_warning ("key %s not defined", reply_key); - reply_type = MODEST_MAIL_OPERATION_REPLY_TYPE_CITE; - if (error) { - g_error_free (error); - error = NULL; - } - } - g_free (reply_key); - - forward_key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, MODEST_CONF_FORWARD_TYPE); - forward_type = modest_conf_get_int (conf, forward_key, &error); - if (error || forward_type == 0) { - g_warning ("key %s not defined", forward_key); - forward_type = MODEST_MAIL_OPERATION_FORWARD_TYPE_INLINE; - if (error) { - g_error_free (error); - error = NULL; - } - } - g_free (forward_key); - - if (header_list) { - TnyHeader *header; - TnyFolder *folder; - gchar *from, *email_key; - const gchar *account_name; - - /* We assume that we can only select messages of the - same folder and that we reply all of them from the - same account. In fact the interface currently only - allows single selection */ - account_name = modest_folder_view_get_selected_account (priv->folder_view); - email_key = g_strdup_printf ("%s/%s/%s", MODEST_ACCOUNT_NAMESPACE, - account_name, MODEST_ACCOUNT_EMAIL); - from = modest_conf_get_string (conf, email_key, NULL); - g_free (email_key); - - iter = tny_list_create_iterator (header_list); - header = TNY_HEADER (tny_iterator_get_current (iter)); - folder = tny_header_get_folder (header); - - do { - /* Since it's not an object, we need to create - it each time due to it's not a GObject and - we can not do a g_object_ref. No need to - free it, tinymail will do it for us. */ - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->main_window_private = priv; - helper->reply_type = reply_type; - helper->forward_type = forward_type; - helper->action = action; - helper->from = from; - - /* Get msg from header */ - header = TNY_HEADER (tny_iterator_get_current (iter)); - tny_folder_get_msg_async (folder, header, get_msg_cb, helper); - tny_iterator_next (iter); - - } while (!tny_iterator_is_done (iter)); - - /* Clean */ - g_free (from); - g_object_unref (G_OBJECT (iter)); - g_object_unref (G_OBJECT (folder)); - } -} - -static void -on_menu_quit (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - save_sizes (self); - gtk_widget_destroy (GTK_WIDGET(self)); -} - -static void -on_menu_delete (ModestMainWindow *self, guint action, GtkWidget *widget) -{ - ModestMainWindowPrivate *priv; - ModestHeaderView *header_view; - TnyList *header_list; - TnyIterator *iter; - GtkTreeModel *model; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - header_view = modest_widget_factory_get_header_view (priv->widget_factory); - header_list = modest_header_view_get_selected_headers (header_view); - - if (header_list) { - iter = tny_list_create_iterator (header_list); - model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); - if (GTK_IS_TREE_MODEL_SORT (model)) - model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); - do { - TnyHeader *header; - ModestMailOperation *mail_op; - - header = TNY_HEADER (tny_iterator_get_current (iter)); - /* TODO: thick grain mail operation involving - a list of objects. Composite pattern ??? */ - mail_op = modest_mail_operation_new (); - - /* Move to trash */ - modest_mail_operation_remove_msg (mail_op, header, TRUE); - - /* Remove from tree model */ - tny_list_remove (TNY_LIST (model), G_OBJECT (header)); - - g_object_unref (G_OBJECT (mail_op)); - g_object_unref (header); - tny_iterator_next (iter); - - } while (!tny_iterator_is_done (iter)); - } -} - - -/* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */ -static const gchar* UI_DEF= -// "" - "" - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - ""; - -static GtkMenu * -get_menu (ModestMainWindow *self) -{ - GtkWidget *w; - GError *err = NULL; - int i = 0; - - ModestMainWindowPrivate *priv; - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - priv->ui_manager = gtk_ui_manager_new (); - - if (!gtk_ui_manager_add_ui_from_string (priv->ui_manager, - UI_DEF, strlen(UI_DEF), - &err)) { - g_warning (err->message); - g_error_free (err); - } - - w = gtk_ui_manager_get_widget (priv->ui_manager, "/ui/popup"); - return GTK_MENU(w); -} - - - static ModestHeaderView* header_view_new (ModestMainWindow *self) { @@ -478,10 +176,10 @@ header_view_new (ModestMainWindow *self) ModestHeaderViewColumn cols[] = { MODEST_HEADER_VIEW_COLUMN_MSGTYPE, MODEST_HEADER_VIEW_COLUMN_ATTACH, - MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER -// MODEST_HEADER_VIEW_COLUMN_FROM, -// MODEST_HEADER_VIEW_COLUMN_SUBJECT, -// MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE +/* MODEST_HEADER_VIEW_COLUMN_COMPACT_HEADER, */ + MODEST_HEADER_VIEW_COLUMN_FROM, + MODEST_HEADER_VIEW_COLUMN_SUBJECT, + MODEST_HEADER_VIEW_COLUMN_RECEIVED_DATE }; priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); @@ -497,96 +195,6 @@ header_view_new (ModestMainWindow *self) static void -on_toolbar_button_clicked (ModestToolbar *toolbar, ModestToolbarButton button_id, - ModestMainWindow *self) -{ - GtkTreeSelection *sel; - GtkTreeIter iter; - GtkTreeModel *model; - ModestMainWindowPrivate *priv; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - switch (button_id) { - case MODEST_TOOLBAR_BUTTON_NEW_MAIL: - on_menu_new_message (self, 0, NULL); - break; - case MODEST_TOOLBAR_BUTTON_REPLY: - on_menu_reply_forward (self, 1, NULL); - break; - case MODEST_TOOLBAR_BUTTON_REPLY_ALL: - on_menu_reply_forward (self, 2, NULL); - break; - case MODEST_TOOLBAR_BUTTON_FORWARD: - on_menu_reply_forward (self, 3, NULL); - break; - case MODEST_TOOLBAR_BUTTON_SEND_RECEIVE: - - - case MODEST_TOOLBAR_BUTTON_NEXT: - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(priv->header_view)); - if (sel) { - gtk_tree_selection_get_selected (sel, &model, &iter); - gtk_tree_model_iter_next (model, &iter); - gtk_tree_selection_select_iter (sel, &iter); - } - - case MODEST_TOOLBAR_BUTTON_PREV: - /* if (sel) { */ -/* gtk_tree_selection_get_selected (sel, &model, &iter); */ -/* gtk_tree_model_iter_prev (model, &iter); */ -/* gtk_tree_selection_select_iter (sel, &iter); */ -/* } */ - - break; - case MODEST_TOOLBAR_BUTTON_DELETE: - on_menu_delete (self, 0, GTK_WIDGET (toolbar)); - break; - - default: - g_printerr ("modest: key %d pressed\n", button_id); - } -} - -static ModestToolbar* -toolbar_new (ModestMainWindow *self) -{ - int i; - ModestToolbar *toolbar; - GSList *buttons = NULL; - ModestMainWindowPrivate *priv; - - ModestToolbarButton button_ids[] = { - MODEST_TOOLBAR_BUTTON_NEW_MAIL, - MODEST_TOOLBAR_BUTTON_REPLY, - MODEST_TOOLBAR_BUTTON_REPLY_ALL, - MODEST_TOOLBAR_BUTTON_FORWARD, - MODEST_TOOLBAR_SEPARATOR, - MODEST_TOOLBAR_BUTTON_SEND_RECEIVE, - MODEST_TOOLBAR_SEPARATOR, - MODEST_TOOLBAR_BUTTON_PREV, - MODEST_TOOLBAR_BUTTON_NEXT, - MODEST_TOOLBAR_SEPARATOR, - MODEST_TOOLBAR_BUTTON_DELETE - }; - - priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); - - for (i = 0 ; i != sizeof(button_ids) / sizeof(ModestToolbarButton); ++i) - buttons = g_slist_append (buttons, GINT_TO_POINTER(button_ids[i])); - - toolbar = modest_widget_factory_get_main_toolbar (priv->widget_factory, buttons); - g_slist_free (buttons); - - g_signal_connect (G_OBJECT(toolbar), "button_clicked", - G_CALLBACK(on_toolbar_button_clicked), self); - - return toolbar; -} - - - -static void restore_sizes (ModestMainWindow *self) { ModestConf *conf; @@ -596,11 +204,15 @@ restore_sizes (ModestMainWindow *self) conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); modest_widget_memory_restore (conf,G_OBJECT(self), - "modest-main-window"); + "modest-main-window"); + modest_widget_memory_restore (conf, G_OBJECT(priv->folder_paned), + "modest-folder-paned"); modest_widget_memory_restore (conf, G_OBJECT(priv->msg_paned), - "modest-msg-paned"); + "modest-msg-paned"); modest_widget_memory_restore (conf, G_OBJECT(priv->main_paned), - "modest-main-paned"); + "modest-main-paned"); + modest_widget_memory_restore (conf, G_OBJECT(priv->header_view), + "header-view"); } @@ -613,12 +225,14 @@ save_sizes (ModestMainWindow *self) priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self); conf = modest_tny_platform_factory_get_modest_conf_instance (priv->factory); - modest_widget_memory_save (conf,G_OBJECT(self), - "modest-main-window"); + modest_widget_memory_save (conf,G_OBJECT(self), "modest-main-window"); + modest_widget_memory_save (conf, G_OBJECT(priv->folder_paned), + "modest-folder-paned"); modest_widget_memory_save (conf, G_OBJECT(priv->msg_paned), - "modest-msg-paned"); + "modest-msg-paned"); modest_widget_memory_save (conf, G_OBJECT(priv->main_paned), - "modest-main-paned"); + "modest-main-paned"); + modest_widget_memory_save (conf, G_OBJECT(priv->header_view), "header-view"); } static GtkWidget* @@ -651,22 +265,33 @@ on_delete_event (GtkWidget *widget, GdkEvent *event, ModestMainWindow *self) GtkWidget* -modest_main_window_new (ModestWidgetFactory *widget_factory) +modest_main_window_new (ModestWidgetFactory *widget_factory, + GtkUIManager *ui_manager) { GObject *obj; ModestMainWindowPrivate *priv; - GtkWidget *main_vbox; GtkWidget *status_hbox; - GtkWidget *header_win, *folder_win, *favorites_win; + GtkWidget *header_win, *folder_win; g_return_val_if_fail (widget_factory, NULL); obj = g_object_new(MODEST_TYPE_MAIN_WINDOW, NULL); priv = MODEST_MAIN_WINDOW_GET_PRIVATE(obj); - g_object_ref (widget_factory); - priv->widget_factory = widget_factory; + priv->widget_factory = g_object_ref (widget_factory); + priv->ui_manager = g_object_ref (ui_manager); + + /* Add accelerators */ + gtk_window_add_accel_group (GTK_WINDOW (obj), + gtk_ui_manager_get_accel_group (priv->ui_manager)); + + + /* Toolbar / Menubar */ + priv->toolbar = gtk_ui_manager_get_widget (priv->ui_manager, "/ToolBar"); + priv->menubar = gtk_ui_manager_get_widget (priv->ui_manager, "/MenuBar"); + + gtk_toolbar_set_tooltips (GTK_TOOLBAR (priv->toolbar), TRUE); /* widgets from factory */ priv->folder_view = modest_widget_factory_get_folder_view (widget_factory); @@ -676,26 +301,21 @@ modest_main_window_new (ModestWidgetFactory *widget_factory) folder_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->folder_view), FALSE); header_win = wrapped_in_scrolled_window (GTK_WIDGET(priv->header_view), - FALSE); - /*menu */ - priv->menu = get_menu (MODEST_MAIN_WINDOW(obj)); - hildon_window_set_menu (HILDON_WINDOW(obj), GTK_MENU(priv->menu)); - - priv->toolbar = GTK_WIDGET(toolbar_new (MODEST_MAIN_WINDOW(obj))); - + FALSE); + /* paned */ + priv->folder_paned = gtk_vpaned_new (); priv->msg_paned = gtk_vpaned_new (); priv->main_paned = gtk_hpaned_new (); - gtk_paned_add1 (GTK_PANED(priv->main_paned), folder_win); gtk_paned_add2 (GTK_PANED(priv->main_paned), priv->msg_paned); - gtk_paned_add1 (GTK_PANED(priv->msg_paned), header_win); gtk_paned_add2 (GTK_PANED(priv->msg_paned), GTK_WIDGET(priv->msg_preview)); gtk_widget_show (GTK_WIDGET(priv->header_view)); gtk_tree_view_columns_autosize (GTK_TREE_VIEW(priv->header_view)); + /* status bar / progress */ status_hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(status_hbox), @@ -713,8 +333,9 @@ modest_main_window_new (ModestWidgetFactory *widget_factory) /* putting it all together... */ main_vbox = gtk_vbox_new (FALSE, 6); + gtk_box_pack_start (GTK_BOX(main_vbox), priv->menubar, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_paned, TRUE, TRUE,0); - gtk_box_pack_start (GTK_BOX(main_vbox), priv->toolbar, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX(main_vbox), status_hbox, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER(obj), main_vbox); diff --git a/src/maemo/modest-main-window.h b/src/maemo/modest-main-window.h deleted file mode 100644 index 9164e90..0000000 --- a/src/maemo/modest-main-window.h +++ /dev/null @@ -1,47 +0,0 @@ -/* modest-main-window.h */ -/* insert (c)/licensing information) */ - -#ifndef __MODEST_MAIN_WINDOW_H__ -#define __MODEST_MAIN_WINDOW_H__ - -#include -#include - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ - -G_BEGIN_DECLS - -/* convenience macros */ -#define MODEST_TYPE_MAIN_WINDOW (modest_main_window_get_type()) -#define MODEST_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_MAIN_WINDOW,ModestMainWindow)) -#define MODEST_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_MAIN_WINDOW,GtkWindow)) -#define MODEST_IS_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_MAIN_WINDOW)) -#define MODEST_IS_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_MAIN_WINDOW)) -#define MODEST_MAIN_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_MAIN_WINDOW,ModestMainWindowClass)) - -typedef struct _ModestMainWindow ModestMainWindow; -typedef struct _ModestMainWindowClass ModestMainWindowClass; - -struct _ModestMainWindow { - HildonWindow parent; - /* insert public members, if any */ -}; - -struct _ModestMainWindowClass { - HildonWindowClass parent_class; - /* insert signal callback declarations, eg. */ - /* void (* my_event) (ModestMainWindow* obj); */ -}; - -/* member functions */ -GType modest_main_window_get_type (void) G_GNUC_CONST; - - -GtkWidget* modest_main_window_new (ModestWidgetFactory *factory); - -G_END_DECLS - -#endif /* __MODEST_MAIN_WINDOW_H__ */ - diff --git a/src/maemo/modest-ui.c b/src/maemo/modest-ui.c deleted file mode 100644 index a457f1a..0000000 --- a/src/maemo/modest-ui.c +++ /dev/null @@ -1,220 +0,0 @@ -/* Copyright (c) 2006, Nokia Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the Nokia Corporation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ - -#include - -#include -#include -#include -#include -#include - - -/* 'private'/'protected' functions */ -static void modest_ui_class_init (ModestUIClass *klass); -static void modest_ui_init (ModestUI *obj); -static void modest_ui_finalize (GObject *obj); - -gchar *on_password_requested (TnyAccountIface *, const gchar *, gboolean *); - - -typedef struct _ModestUIPrivate ModestUIPrivate; -struct _ModestUIPrivate { - ModestWidgetFactory *widget_factory; - GtkWidget *main_window; - HildonProgram *hildon_program; -}; - -#define MODEST_UI_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - MODEST_TYPE_UI, \ - ModestUIPrivate)) - - -/* list my signals */ -enum { - /* MY_SIGNAL_1, */ - /* MY_SIGNAL_2, */ - LAST_SIGNAL -}; - -/* globals */ -static GObjectClass *parent_class = NULL; - - -GType -modest_ui_get_type (void) -{ - static GType my_type = 0; - if (!my_type) { - static const GTypeInfo my_info = { - sizeof(ModestUIClass), - NULL, /* base init */ - NULL, /* base finalize */ - (GClassInitFunc) modest_ui_class_init, - NULL, /* class finalize */ - NULL, /* class data */ - sizeof(ModestUI), - 1, /* n_preallocs */ - (GInstanceInitFunc) modest_ui_init, - NULL - }; - my_type = g_type_register_static (G_TYPE_OBJECT, - "ModestUI", - &my_info, 0); - } - return my_type; -} - - -static void -modest_ui_class_init (ModestUIClass *klass) -{ - GObjectClass *gobject_class; - gobject_class = (GObjectClass*) klass; - - parent_class = g_type_class_peek_parent (klass); - gobject_class->finalize = modest_ui_finalize; - - g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate)); - -} - - -static void -modest_ui_init (ModestUI *obj) -{ - ModestUIPrivate *priv; - - priv = MODEST_UI_GET_PRIVATE(obj); - - priv->widget_factory = NULL; - - priv->main_window = NULL; -} - - -static void -modest_ui_finalize (GObject *obj) -{ - - ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj); - - if (priv->widget_factory) { - g_object_unref (G_OBJECT(priv->widget_factory)); - priv->widget_factory = NULL; - } -} - - -ModestUI* -modest_ui_new (void) -{ - GObject *obj; - ModestUIPrivate *priv; - TnyPlatformFactory *fact; - ModestAccountMgr *account_mgr; - TnyAccountStore *account_store; - - obj = g_object_new(MODEST_TYPE_UI, NULL); - priv = MODEST_UI_GET_PRIVATE(obj); - - /* Get the platform-dependent instances */ - fact = modest_tny_platform_factory_get_instance (); - - account_mgr = modest_tny_platform_factory_get_modest_account_mgr_instance (fact); - if (!account_mgr) { - g_printerr ("modest: could not create ModestAccountMgr instance\n"); - g_object_unref (obj); - return NULL; - } - - account_store = tny_platform_factory_new_account_store (fact); - if (!account_store) { - g_printerr ("modest: could not initialze ModestTnyAccountStore instance\n"); - return NULL; - } - - priv->widget_factory = modest_widget_factory_new (); - if (!priv->widget_factory) { - g_printerr ("modest: could not initialize widget factory\n"); - return NULL; - } - - g_set_application_name ("Modest"); - - priv->hildon_program = HILDON_PROGRAM (hildon_program_get_instance()); - if (!priv->hildon_program) { - g_printerr ("modest: could not initialize HildonProgram instance\n"); - return NULL; - } - - return MODEST_UI(obj); -} - -static gboolean -on_main_window_destroy (GtkObject *widget, ModestUI *self) -{ - /* FIXME: check if there any viewer/editing windows opened */ - gtk_main_quit (); - return FALSE; -} - - -GtkWidget* -modest_ui_main_window (ModestUI *modest_ui) -{ - ModestUIPrivate *priv; - - g_return_val_if_fail (modest_ui, NULL); - priv = MODEST_UI_GET_PRIVATE(modest_ui); - - if (!priv->main_window) { - priv->main_window = - modest_main_window_new (priv->widget_factory); - g_signal_connect (G_OBJECT(priv->main_window), "destroy", - G_CALLBACK(on_main_window_destroy), modest_ui); - - } - - if (!priv->main_window) - g_printerr ("modest: could not create main window\n"); - - hildon_program_add_window (priv->hildon_program, priv->main_window); - - return priv->main_window; -} diff --git a/src/modest-error.h b/src/modest-error.h index 4d269bf..e71c044 100644 --- a/src/modest-error.h +++ b/src/modest-error.h @@ -42,7 +42,8 @@ typedef enum _ModestErrorDomain { typedef enum _ModestErrorCode { MODEST_MAIL_OPERATION_ERROR_BAD_ACCOUNT, MODEST_MAIL_OPERATION_ERROR_MISSING_PARAMETER, - MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED + MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED, + MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND } ModestErrorCode; G_END_DECLS diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 9a99a59..6eefdf6 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -880,7 +880,19 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, store_account = TNY_STORE_ACCOUNT (tny_folder_get_account (folder)); trash_folder = modest_mail_operation_find_trash_folder (self, store_account); - modest_mail_operation_move_msg (self, header, trash_folder); + if (trash_folder) { + modest_mail_operation_move_msg (self, header, trash_folder); +/* g_object_unref (trash_folder); */ + } else { + ModestMailOperationPrivate *priv; + + /* Set status failed and set an error */ + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); + priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; + g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, + MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, + _("Error trying to delete a message. Trash folder not found")); + } g_object_unref (G_OBJECT (store_account)); } else { @@ -966,17 +978,6 @@ get_content_type(const gchar *s) return g_string_free(type, FALSE); } -static GQuark -modest_error_quark (void) -{ - static GQuark err_q = 0; - - if (err_q == 0) - err_q = g_quark_from_static_string ("modest-error-quark"); - - return err_q; -} - static void add_attachments (TnyMsg *msg, GList *attachments_list) { diff --git a/src/modest-main.c b/src/modest-main.c index 2f85ae8..3b59c39 100644 --- a/src/modest-main.c +++ b/src/modest-main.c @@ -63,7 +63,8 @@ static gboolean hildon_init (); /* NOP if HILDON is not defined */ static int start_ui (const gchar* mailto, const gchar *cc, - const gchar *bcc, const gchar* subject, const gchar *body); + const gchar *bcc, const gchar* subject, const gchar *body, + TnyAccountStore *account_store); static int send_mail (const gchar* mailto, const gchar *cc, const gchar *bcc, const gchar* subject, const gchar *body); @@ -71,9 +72,10 @@ static int send_mail (const gchar* mailto, const gchar *cc, const gchar *bcc, int main (int argc, char *argv[]) { - GOptionContext *context = NULL; - TnyPlatformFactory *fact = NULL; - ModestConf *modest_conf = NULL; + GOptionContext *context = NULL; + TnyPlatformFactory *fact = NULL; + TnyAccountStore *account_store = NULL; + ModestConf *modest_conf = NULL; GError *err = NULL; int retval = MODEST_ERR_NONE; @@ -99,7 +101,7 @@ main (int argc, char *argv[]) { NULL, 0, 0, 0, NULL, NULL, NULL } }; - bindtextdomain (GETTEXT_PACKAGE, MODESTLOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, MODEST_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); @@ -118,8 +120,11 @@ main (int argc, char *argv[]) goto cleanup; } g_option_context_free (context); - + + /* Get platform factory */ fact = modest_tny_platform_factory_get_instance (); + + /* Check modest conf */ modest_conf = modest_tny_platform_factory_get_modest_conf_instance (fact); if (!modest_conf) { g_printerr ("modest: failed to initialize config system, exiting\n"); @@ -127,6 +132,14 @@ main (int argc, char *argv[]) goto cleanup; } + /* Get the account store */ + account_store = tny_platform_factory_new_account_store (fact); + if (!account_store) { + g_printerr ("modest: could not initialize a ModestTnyAccountStore instance\n"); + retval = MODEST_ERR_RUN; + goto cleanup; + } + if (debug) g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_WARNING); @@ -135,7 +148,7 @@ main (int argc, char *argv[]) if (!batch) { gtk_init (&argc, &argv); - retval = start_ui (mailto, cc, bcc, subject, body); + retval = start_ui (mailto, cc, bcc, subject, body, account_store); } else retval = send_mail (mailto, cc, bcc, subject, body); @@ -148,7 +161,8 @@ cleanup: static int start_ui (const gchar* mailto, const gchar *cc, const gchar *bcc, - const gchar* subject, const gchar *body) + const gchar* subject, const gchar *body, + TnyAccountStore *account_store) { ModestUI *modest_ui; @@ -158,7 +172,7 @@ start_ui (const gchar* mailto, const gchar *cc, const gchar *bcc, GtkWidget *win; #endif - modest_ui = MODEST_UI(modest_ui_new ()); + modest_ui = MODEST_UI(modest_ui_new (account_store)); if (!modest_ui) { g_printerr ("modest: failed to initialize ui, exiting\n"); retval = MODEST_ERR_UI; @@ -186,9 +200,17 @@ start_ui (const gchar* mailto, const gchar *cc, const gchar *bcc, win = modest_ui_main_window (modest_ui); if (win) { + TnyDevice *device; + gtk_widget_show (win); + + /* Go online */ + device = tny_account_store_get_device (account_store); + tny_device_force_online (device); + g_object_unref (G_OBJECT (device)); + gtk_main(); - } + } cleanup: if (modest_ui) g_object_unref (modest_ui); diff --git a/src/modest-text-utils.h b/src/modest-text-utils.h index 08e57db..56c83a5 100644 --- a/src/modest-text-utils.h +++ b/src/modest-text-utils.h @@ -169,7 +169,7 @@ gchar* modest_text_utils_get_display_address (gchar *address); * * Returns: the length of the prefix, or 0 if there is none */ -gint modest_text_utils_get_subject_prefix_len (const gchar *sub); +gint modest_text_utils_get_subject_prefix_len (const gchar *subject); /** diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index bce0157..561e0f8 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -217,7 +217,7 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) gchar *pwd = NULL; gboolean already_asked; - g_return_val_if_fail (account, NULL); + gdk_threads_enter (); key = tny_account_get_id (account); account_store = TNY_ACCOUNT_STORE(get_account_store_for_account (account)); @@ -226,7 +226,7 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); /* is it in the hash? if it's already there, it must be wrong... */ - already_asked = g_hash_table_lookup_extended (priv->password_hash, + already_asked = g_hash_table_lookup_extended (priv->password_hash, key, NULL, (gpointer *) &pwd); /* if the password is not already there, try ModestConf */ @@ -245,8 +245,6 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) gboolean remember; pwd = NULL; - gdk_threads_enter (); - g_signal_emit (G_OBJECT(self), signals[PASSWORD_REQUESTED_SIGNAL], 0, name, &pwd, cancel, &remember); @@ -254,7 +252,7 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) if (remember) modest_account_mgr_set_string (priv->account_mgr, key, MODEST_ACCOUNT_PASSWORD, - pwd, + pwd, TRUE, NULL); /* We need to dup the string even knowing that it's already a dup of the contents of an @@ -266,10 +264,11 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) g_free (pwd); pwd = NULL; } - gdk_threads_leave (); } else *cancel = FALSE; + gdk_threads_leave (); + return pwd; } @@ -302,8 +301,6 @@ forget_password (TnyAccount *account) { TRUE, NULL); } - - /* create a tnyaccount for the server account connected to the account with name 'key' */ static TnyAccount* @@ -496,7 +493,7 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr) { g_object_unref (obj); return NULL; } - tny_device_force_online (priv->device); +/* tny_device_force_online (priv->device); */ priv->tny_session_camel = tny_session_camel_new (TNY_ACCOUNT_STORE(obj)); diff --git a/src/modest-tny-platform-factory.c b/src/modest-tny-platform-factory.c index 3512312..1e3ae1e 100644 --- a/src/modest-tny-platform-factory.c +++ b/src/modest-tny-platform-factory.c @@ -30,6 +30,10 @@ /* modest-tny-platform-factory.c */ #include +#include +#include +#include + /* MODES_PLATFORM_ID: 1 ==> gtk, 2==> maemo */ #if MODEST_PLATFORM_ID==1 #include diff --git a/src/modest-ui.c b/src/modest-ui.c new file mode 100644 index 0000000..ab6e035 --- /dev/null +++ b/src/modest-ui.c @@ -0,0 +1,1226 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif /*HAVE_CONFIG_H*/ + +#include +#include +#include +#include +#include "modest-ui.h" +#include "modest-tny-account-store.h" +#include "modest-account-mgr.h" +#include "modest-widget-factory.h" +#include "modest-tny-platform-factory.h" + +#include "modest-edit-msg-window.h" +#include "modest-account-view-window.h" +#include "modest-icon-names.h" +#include "modest-main-window.h" + +typedef struct _ModestUIPrivate ModestUIPrivate; +struct _ModestUIPrivate { + ModestWidgetFactory *widget_factory; + TnyAccountStore *account_store; + GtkWidget *main_window; +}; + +#define MODEST_UI_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ + MODEST_TYPE_UI, \ + ModestUIPrivate)) + +typedef struct _GetMsgAsyncHelper { + ModestUIPrivate *priv; + TnyIterator *iter; + GFunc func; + gpointer user_data; +} GetMsgAsyncHelper; + +typedef enum _ReplyForwardAction { + ACTION_REPLY, + ACTION_REPLY_TO_ALL, + ACTION_FORWARD +} ReplyForwardAction; + +typedef struct _ReplyForwardHelper { + guint reply_forward_type; + ReplyForwardAction action; + gchar *from; +} ReplyForwardHelper; + +/* globals */ +static GObjectClass *parent_class = NULL; + +/* 'private'/'protected' functions */ +static void modest_ui_class_init (ModestUIClass *klass); +static void modest_ui_init (ModestUI *obj); +static void modest_ui_finalize (GObject *obj); + +static void register_stock_icons (); +static void connect_signals (ModestUI *self); +static void connect_main_window_signals (ModestUI *self); +static GtkUIManager *create_ui_manager (); + +static void reply_forward_func (gpointer data, gpointer user_data); +static void read_msg_func (gpointer data, gpointer user_data); +static void get_msg_cb (TnyFolder *folder, + TnyMsg *msg, + GError **err, + gpointer user_data); + +static void reply_forward (GtkWidget *widget, + ReplyForwardAction action, + ModestUIPrivate *priv); + +/* Menu & toolbar actions */ +static void modest_ui_actions_on_about (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_delete (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_quit (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_accounts (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_new_msg (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_reply (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_forward (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_reply_all (GtkWidget *widget, ModestUIPrivate *priv); + +static void modest_ui_actions_on_next (GtkWidget *widget, ModestUIPrivate *priv); + +/* Widget actions */ +static void modest_ui_actions_on_header_selected (ModestHeaderView *folder_view, + TnyHeader *header, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, + TnyFolder *folder, + gboolean selected, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_password_requested (ModestTnyAccountStore *account_store, + const gchar* account_name, + gchar **password, + gboolean *cancel, + gboolean *remember, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_connection_changed (TnyDevice *device, + gboolean online, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_online_toggle_toggled (GtkToggleButton *toggle, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_item_not_found (ModestHeaderView *header_view, + ModestItemType type, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_header_status_update (ModestHeaderView *header_view, + const gchar *msg, + gint num, + gint total, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, + const gchar* link, + ModestUIPrivate *priv); + + +static void modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, + const gchar* link, + ModestUIPrivate *priv); + +static void modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, + int index, + ModestUIPrivate *priv); + + +/* Action entries */ +static const GtkActionEntry modest_action_entries [] = { + + /* Toplevel */ + { "File", NULL, N_("_File") }, + { "Edit", NULL, N_("_Edit") }, + { "Actions", NULL, N_("_Actions") }, + { "Options", NULL, N_("_Options") }, + { "Help", NULL, N_("_Help") }, + + /* FILE menu */ + { "FileNew", GTK_STOCK_NEW, N_("_New"), "N", N_("Compose new message"), G_CALLBACK (modest_ui_actions_on_new_msg) }, + { "FileOpen", GTK_STOCK_OPEN, N_("_Open"), "O", N_("Open a message"), NULL }, + { "FileSave", GTK_STOCK_SAVE, N_("_Save"), "S", N_("Save a message"), NULL }, + { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("Save _As"), NULL, N_("Save a message as"), NULL }, + { "FileQuit", GTK_STOCK_QUIT, N_("_Quit"), "Q", N_("Exit the application"), G_CALLBACK (modest_ui_actions_on_quit) }, + + /* EDIT menu */ + { "EditUndo", GTK_STOCK_UNDO, N_("_Undo"), "Z", N_("Undo last action"), NULL }, + { "EditRedo", GTK_STOCK_REDO, N_("_Redo"), "Z", N_("Redo previous action"), NULL }, + { "EditCut", GTK_STOCK_CUT, N_("Cut"), "X", N_("_Cut"), NULL }, + { "EditCopy", GTK_STOCK_COPY, N_("Copy"), "C", N_("Copy"), NULL }, + { "EditPaste", GTK_STOCK_PASTE, N_("Paste"), "V", N_("Paste"), NULL }, + { "EditDelete", GTK_STOCK_DELETE, N_("_Delete"), "Q", N_("Delete"), NULL }, + { "EditSelectAll", NULL, N_("Select all"), "A", N_("Select all"), NULL }, + { "EditDeselectAll", NULL, N_("Deselect all"), "A", N_("Deselect all"), NULL }, + + /* ACTIONS menu */ + { "ActionsNew", MODEST_STOCK_MAIL_SEND, N_("_New Message"), NULL, N_("Compose a new message"), G_CALLBACK (modest_ui_actions_on_new_msg) }, + { "ActionsReply", MODEST_STOCK_REPLY, N_("_Reply"), NULL, N_("Reply to a message"), G_CALLBACK (modest_ui_actions_on_reply) }, + { "ActionsReplyAll", MODEST_STOCK_REPLY_ALL, N_("Reply to all"), NULL, N_("Reply to all"), G_CALLBACK (modest_ui_actions_on_reply_all) }, + { "ActionsForward", MODEST_STOCK_FORWARD, N_("_Forward"), NULL, N_("Forward a message"), G_CALLBACK (modest_ui_actions_on_forward) }, + { "ActionsBounce", NULL, N_("_Bounce"), NULL, N_("Bounce a message"), NULL }, + { "ActionsSendReceive", MODEST_STOCK_SEND_RECEIVE, N_("Send/Receive"), NULL, N_("Send and receive messages"), NULL }, + { "ActionsDelete", MODEST_STOCK_DELETE, N_("Delete message"), NULL, N_("Delete messages"), G_CALLBACK (modest_ui_actions_on_delete) }, + + /* GOTO menu */ + { "GotoPrevious", MODEST_STOCK_PREV, N_("Previous"), NULL, N_("Go to previous message"), NULL }, + { "GotoNext", MODEST_STOCK_NEXT, N_("Next"), NULL, N_("Go to next message"), G_CALLBACK (modest_ui_actions_on_next) }, + + /* OPTIONS menu */ + { "OptionsAccounts", NULL, N_("_Accounts"), NULL, N_("Manage accounts"), G_CALLBACK (modest_ui_actions_on_accounts) }, + { "OptionsContacts", NULL, N_("_Contacts"), NULL, N_("Manage contacts"), NULL }, + + /* HELP menu */ + { "HelpAbout", GTK_STOCK_ABOUT, N_("About"), NULL, N_("About Modest"), G_CALLBACK (modest_ui_actions_on_about) }, +}; + +GType +modest_ui_get_type (void) +{ + static GType my_type = 0; + if (!my_type) { + static const GTypeInfo my_info = { + sizeof(ModestUIClass), + NULL, /* base init */ + NULL, /* base finalize */ + (GClassInitFunc) modest_ui_class_init, + NULL, /* class finalize */ + NULL, /* class data */ + sizeof(ModestUI), + 1, /* n_preallocs */ + (GInstanceInitFunc) modest_ui_init, + NULL + }; + my_type = g_type_register_static (G_TYPE_OBJECT, + "ModestUI", + &my_info, 0); + } + return my_type; +} + + +static void +modest_ui_class_init (ModestUIClass *klass) +{ + GObjectClass *gobject_class; + gobject_class = (GObjectClass*) klass; + + parent_class = g_type_class_peek_parent (klass); + gobject_class->finalize = modest_ui_finalize; + + g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate)); + +} + + +static void +modest_ui_init (ModestUI *obj) +{ + ModestUIPrivate *priv; + + priv = MODEST_UI_GET_PRIVATE(obj); + + priv->widget_factory = NULL; + priv->main_window = NULL; + priv->account_store = NULL; +} + + +static void +modest_ui_finalize (GObject *obj) +{ + + ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj); + + if (priv->widget_factory) { + g_object_unref (G_OBJECT(priv->widget_factory)); + priv->widget_factory = NULL; + } + + G_OBJECT_CLASS(parent_class)->finalize (obj); +} + + +ModestUI* +modest_ui_new (TnyAccountStore *account_store) +{ + GObject *obj; + ModestUIPrivate *priv; + TnyPlatformFactory *fact; + ModestAccountMgr *account_mgr; + + obj = g_object_new(MODEST_TYPE_UI, NULL); + priv = MODEST_UI_GET_PRIVATE(obj); + + /* Get the platform-dependent instances */ + fact = modest_tny_platform_factory_get_instance (); + + priv->account_store = account_store; + + account_mgr = modest_tny_platform_factory_get_modest_account_mgr_instance (fact); + if (!account_mgr) { + g_printerr ("modest: could not create ModestAccountMgr instance\n"); + g_object_unref (obj); + return NULL; + } + + priv->widget_factory = modest_widget_factory_new (); + if (!priv->widget_factory) { + g_printerr ("modest: could not initialize widget factory\n"); + return NULL; + } + + /* Connect signals */ + connect_signals (MODEST_UI (obj)); + + return MODEST_UI(obj); +} + +static gboolean +on_main_window_destroy (GtkObject *widget, ModestUI *self) +{ + /* FIXME: check if there any viewer/editing windows opened */ + gtk_main_quit (); + return FALSE; +} + + +GtkWidget* +modest_ui_main_window (ModestUI *self) +{ + ModestUIPrivate *priv; + GtkUIManager *ui_manager; + + g_return_val_if_fail (self, NULL); + priv = MODEST_UI_GET_PRIVATE(self); + + if (!priv->main_window) { + TnyDevice *device; + + /* Register our own icons as stock icons in order to + use them with the UI manager */ + register_stock_icons (); + + /* Create UI manager */ + ui_manager = create_ui_manager (self); + + /* Create main window */ + priv->main_window = modest_main_window_new (priv->widget_factory, ui_manager); + g_signal_connect (G_OBJECT(priv->main_window), "destroy", + G_CALLBACK(on_main_window_destroy), self); + + /* Connect Main Window signals */ + connect_main_window_signals (self); + + g_object_unref (G_OBJECT (ui_manager)); + } + + if (!priv->main_window) + g_printerr ("modest: could not create main window\n"); + + return priv->main_window; +} + +static GtkUIManager * +create_ui_manager (ModestUI *self) +{ + GtkUIManager *ui_manager; + GtkActionGroup *action_group; + GError *error = NULL; + ModestUIPrivate *priv; + + priv = MODEST_UI_GET_PRIVATE(self); + + /* Create UI manager */ + ui_manager = gtk_ui_manager_new(); + + /* Create action group */ + action_group = gtk_action_group_new ("ModestMainWindowActions"); + gtk_action_group_add_actions (action_group, + modest_action_entries, + G_N_ELEMENTS (modest_action_entries), + priv); + gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); + g_object_unref (action_group); + + /* Load the UI definition */ + gtk_ui_manager_add_ui_from_file (ui_manager, MODEST_UIDIR "modest-ui.xml", &error); + if (error != NULL) { + g_warning ("Could not merge modest-ui.xml: %s", error->message); + g_error_free (error); + } + return ui_manager; +} + +/* + * This function registers our custom toolbar icons, so they can be + * themed. The idea of this function was taken from the gtk-demo + */ +static void +register_stock_icons () +{ + static gboolean registered = FALSE; + + if (!registered) { + GdkPixbuf *pixbuf; + GtkIconFactory *factory; + gchar *filename; + gint i; + + static GtkStockItem items[] = { + { MODEST_STOCK_MAIL_SEND, "send mail", 0, 0, NULL }, + { MODEST_STOCK_NEW_MAIL, "new mail", 0, 0, NULL }, + { MODEST_STOCK_SEND_RECEIVE, "send receive", 0, 0, NULL }, + { MODEST_STOCK_REPLY, "reply", 0, 0, NULL }, + { MODEST_STOCK_REPLY_ALL, "reply all", 0, 0, NULL }, + { MODEST_STOCK_FORWARD, "forward", 0, 0, NULL }, + { MODEST_STOCK_DELETE, "delete", 0, 0, NULL }, + { MODEST_STOCK_NEXT, "next", 0, 0, NULL }, + { MODEST_STOCK_PREV, "prev", 0, 0, NULL }, + { MODEST_STOCK_STOP, "stop", 0, 0, NULL } + }; + + static gchar *items_names [] = { + MODEST_TOOLBAR_ICON_MAIL_SEND, + MODEST_TOOLBAR_ICON_NEW_MAIL, + MODEST_TOOLBAR_ICON_SEND_RECEIVE, + MODEST_TOOLBAR_ICON_REPLY, + MODEST_TOOLBAR_ICON_REPLY_ALL, + MODEST_TOOLBAR_ICON_FORWARD, + MODEST_TOOLBAR_ICON_DELETE, + MODEST_TOOLBAR_ICON_NEXT, + MODEST_TOOLBAR_ICON_PREV, + MODEST_TOOLBAR_ICON_STOP + }; + + registered = TRUE; + + /* Register our stock items */ + gtk_stock_add (items, G_N_ELEMENTS (items)); + + /* Add our custom icon factory to the list of defaults */ + factory = gtk_icon_factory_new (); + gtk_icon_factory_add_default (factory); + + /* Register icons to accompany stock items */ + for (i = 0; i < G_N_ELEMENTS (items); i++) { + pixbuf = NULL; + pixbuf = gdk_pixbuf_new_from_file (items_names[i], NULL); + + if (pixbuf != NULL) { + GtkIconSet *icon_set; + GdkPixbuf *transparent; + + transparent = gdk_pixbuf_add_alpha (pixbuf, TRUE, 0xff, 0xff, 0xff); + + icon_set = gtk_icon_set_new_from_pixbuf (transparent); + gtk_icon_factory_add (factory, items[i].stock_id, icon_set); + gtk_icon_set_unref (icon_set); + g_object_unref (pixbuf); + g_object_unref (transparent); + } + else + g_warning ("failed to load %s icon", items_names[i]); + } + /* Drop our reference to the factory, GTK will hold a reference. */ + g_object_unref (factory); + } +} + +/* FIXME: uninit these as well */ +static void +connect_signals (ModestUI *self) +{ + TnyDevice *device; + ModestUIPrivate *priv; + ModestFolderView *folder_view; + ModestHeaderView *header_view; + ModestMsgView *msg_view; + GtkWidget *toggle; + + priv = MODEST_UI_GET_PRIVATE(self); + + folder_view = modest_widget_factory_get_folder_view (priv->widget_factory); + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + msg_view = modest_widget_factory_get_msg_preview (priv->widget_factory); + toggle = modest_widget_factory_get_online_toggle (priv->widget_factory); + device = tny_account_store_get_device (priv->account_store); + + /* folder view */ + g_signal_connect (G_OBJECT(folder_view), "folder_selection_changed", + G_CALLBACK(modest_ui_actions_on_folder_selection_changed), + priv); +/* g_signal_connect (G_OBJECT(folder_view), "key-press-event", */ +/* G_CALLBACK(on_folder_key_press_event), priv->widget_factory); */ + + /* header view */ + g_signal_connect (G_OBJECT(header_view), "status_update", + G_CALLBACK(modest_ui_actions_on_header_status_update), + priv); + g_signal_connect (G_OBJECT(header_view), "header_selected", + G_CALLBACK(modest_ui_actions_on_header_selected), + priv); + g_signal_connect (G_OBJECT(header_view), "item_not_found", + G_CALLBACK(modest_ui_actions_on_item_not_found), + priv); + + + /* msg preview */ + g_signal_connect (G_OBJECT(msg_view), "link_clicked", + G_CALLBACK(modest_ui_actions_on_msg_link_clicked), + priv); + g_signal_connect (G_OBJECT(msg_view), "link_hover", + G_CALLBACK(modest_ui_actions_on_msg_link_hover), + priv); + g_signal_connect (G_OBJECT(msg_view), "attachment_clicked", + G_CALLBACK(modest_ui_actions_on_msg_attachment_clicked), + priv); + + /* Device */ + g_signal_connect (G_OBJECT(device), "connection_changed", + G_CALLBACK(modest_ui_actions_on_connection_changed), + priv); + g_signal_connect (G_OBJECT(toggle), "toggled", + G_CALLBACK(modest_ui_actions_on_online_toggle_toggled), + priv); + + /* Init toggle in correct state */ + modest_ui_actions_on_connection_changed (device, + tny_device_is_online (device), + priv); +} + + +static void +connect_main_window_signals (ModestUI *self) +{ + ModestUIPrivate *priv; + + priv = MODEST_UI_GET_PRIVATE(self); + + /* account store */ + g_signal_connect (G_OBJECT (priv->account_store), + "password_requested", + G_CALLBACK(modest_ui_actions_on_password_requested), + priv); +} + +/* ***************************************************************** */ +/* M O D E S T U I A C T I O N S */ +/* ***************************************************************** */ +static void +modest_ui_actions_on_about (GtkWidget *widget, + ModestUIPrivate *priv) +{ + GtkWidget *about; + const gchar *authors[] = { + "Dirk-Jan C. Binnema ", + NULL + }; + about = gtk_about_dialog_new (); + gtk_about_dialog_set_name (GTK_ABOUT_DIALOG(about), PACKAGE_NAME); + gtk_about_dialog_set_version (GTK_ABOUT_DIALOG(about),PACKAGE_VERSION); + gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG(about), + _("Copyright (c) 2006, Nokia Corporation\n" + "All rights reserved.")); + gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG(about), + _("a modest e-mail client\n\n" + "design and implementation: Dirk-Jan C. Binnema\n" + "contributions from the fine people at KernelConcepts and Igalia\n" + "uses the tinymail email framework written by Philip van Hoof")); + gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG(about), authors); + gtk_about_dialog_set_website (GTK_ABOUT_DIALOG(about), "http://modest.garage.maemo.org"); + + gtk_dialog_run (GTK_DIALOG (about)); + gtk_widget_destroy(about); +} + +static void +modest_ui_actions_on_delete (GtkWidget *widget, + ModestUIPrivate *priv) +{ + ModestWidgetFactory *widget_factory; + ModestHeaderView *header_view; + TnyList *header_list; + TnyIterator *iter; + GtkTreeModel *model; + + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + header_list = modest_header_view_get_selected_headers (header_view); + + if (header_list) { + iter = tny_list_create_iterator (header_list); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (header_view)); + if (GTK_IS_TREE_MODEL_SORT (model)) + model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model)); + do { + TnyHeader *header; + ModestMailOperation *mail_op; + + header = TNY_HEADER (tny_iterator_get_current (iter)); + /* TODO: thick grain mail operation involving + a list of objects. Composite pattern ??? */ + mail_op = modest_mail_operation_new (); + + /* TODO: add confirmation dialog */ + + /* Move to trash */ + modest_mail_operation_remove_msg (mail_op, header, TRUE); + + /* Remove from tree model */ + if (modest_mail_operation_get_status (mail_op) == + MODEST_MAIL_OPERATION_STATUS_SUCCESS) + tny_list_remove (TNY_LIST (model), G_OBJECT (header)); + else { + /* TODO: error handling management */ + const GError *error; + error = modest_mail_operation_get_error (mail_op); + g_warning (error->message); + } + + g_object_unref (G_OBJECT (mail_op)); + g_object_unref (header); + tny_iterator_next (iter); + + } while (!tny_iterator_is_done (iter)); + } +} + +static void +modest_ui_actions_on_quit (GtkWidget *widget, + ModestUIPrivate *priv) +{ + /* FIXME: save size of main window */ +/* save_sizes (main_window); */ + gtk_widget_destroy (GTK_WIDGET (priv->main_window)); +} + +static void +modest_ui_actions_on_accounts (GtkWidget *widget, + ModestUIPrivate *priv) +{ + GtkWidget *account_win; + + account_win = modest_account_view_window_new (priv->widget_factory); + + gtk_window_set_transient_for (GTK_WINDOW (account_win), + GTK_WINDOW (priv->main_window)); + + gtk_widget_show (account_win); +} + +static void +modest_ui_actions_on_new_msg (GtkWidget *widget, + ModestUIPrivate *priv) +{ + GtkWidget *msg_win; + + msg_win = modest_edit_msg_window_new (priv->widget_factory, + MODEST_EDIT_TYPE_NEW); + gtk_widget_show (msg_win); +} + +static void +reply_forward_func (gpointer data, gpointer user_data) +{ + TnyHeader *new_header; + TnyMsg *msg, *new_msg; + GetMsgAsyncHelper *helper; + ReplyForwardHelper *rf_helper; + GtkWidget *msg_win; + ModestEditType edit_type; + + msg = TNY_MSG (data); + helper = (GetMsgAsyncHelper *) user_data; + rf_helper = (ReplyForwardHelper *) helper->user_data; + + /* Create reply mail */ + switch (rf_helper->action) { + case ACTION_REPLY: + new_msg = + modest_mail_operation_create_reply_mail (msg, + rf_helper->from, + rf_helper->reply_forward_type, + MODEST_MAIL_OPERATION_REPLY_MODE_SENDER); + case ACTION_REPLY_TO_ALL: + new_msg = + modest_mail_operation_create_reply_mail (msg, rf_helper->from, rf_helper->reply_forward_type, + MODEST_MAIL_OPERATION_REPLY_MODE_ALL); + edit_type = MODEST_EDIT_TYPE_REPLY; + break; + case ACTION_FORWARD: + new_msg = + modest_mail_operation_create_forward_mail (msg, rf_helper->from, rf_helper->reply_forward_type); + edit_type = MODEST_EDIT_TYPE_FORWARD; + break; + } + + /* Set from */ + new_header = tny_msg_get_header (new_msg); + tny_header_set_from (new_header, rf_helper->from); + g_object_unref (G_OBJECT (new_header)); + + /* Show edit window */ + msg_win = modest_edit_msg_window_new (helper->priv->widget_factory, + edit_type); + modest_edit_msg_window_set_msg (MODEST_EDIT_MSG_WINDOW (msg_win), + new_msg); + gtk_widget_show (msg_win); + + /* Clean */ + g_object_unref (new_msg); + g_free (rf_helper->from); + g_slice_free (ReplyForwardHelper, rf_helper); +} + +/* + * Common code for the reply and forward actions + */ +static void +reply_forward (GtkWidget *widget, + ReplyForwardAction action, + ModestUIPrivate *priv) +{ + ModestHeaderView *header_view; + TnyList *header_list; + guint reply_forward_type; + ModestConf *conf; + TnyPlatformFactory *plat_factory; + TnyHeader *header; + TnyFolder *folder; + gchar *from, *key; + ModestFolderView *folder_view; + GetMsgAsyncHelper *helper; + ReplyForwardHelper *rf_helper; + + /* Get ModestConf */ + plat_factory = modest_tny_platform_factory_get_instance (); + conf = modest_tny_platform_factory_get_modest_conf_instance (plat_factory); + + /* Get reply or forward type */ + key = g_strdup_printf ("%s/%s", MODEST_CONF_NAMESPACE, + (action == ACTION_FORWARD) ? MODEST_CONF_FORWARD_TYPE : MODEST_CONF_REPLY_TYPE); + reply_forward_type = modest_conf_get_int (conf, key, NULL); + g_free (key); + + /* Get the list of headers */ + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + header_list = modest_header_view_get_selected_headers (header_view); + + if (!header_list) + return; + + /* We assume that we can only select messages of the + same folder and that we reply all of them from the + same account. In fact the interface currently only + allows single selection */ + + /* TODO: get the from string from account */ + from = g_strdup ("Invalid"); + + /* Fill helpers */ + rf_helper = g_slice_new0 (ReplyForwardHelper); + rf_helper->reply_forward_type = reply_forward_type; + rf_helper->action = action; + rf_helper->from = from; + + helper = g_slice_new0 (GetMsgAsyncHelper); + helper->priv = priv; + helper->func = reply_forward_func; + helper->iter = tny_list_create_iterator (header_list); + helper->user_data = rf_helper; + + header = TNY_HEADER (tny_iterator_get_current (helper->iter)); + folder = tny_header_get_folder (header); + + /* The callback will call it per each header */ + tny_folder_get_msg_async (folder, header, get_msg_cb, helper); + + /* Clean */ + g_object_unref (G_OBJECT (folder)); +} + +static void +modest_ui_actions_on_reply (GtkWidget *widget, + ModestUIPrivate *priv) +{ + reply_forward (widget, ACTION_REPLY, priv); +} + +static void +modest_ui_actions_on_forward (GtkWidget *widget, + ModestUIPrivate *priv) +{ + reply_forward (widget, ACTION_FORWARD, priv); +} + +static void +modest_ui_actions_on_reply_all (GtkWidget *widget, + ModestUIPrivate *priv) +{ + reply_forward (widget, ACTION_REPLY_TO_ALL, priv); +} + +static void +modest_ui_actions_on_next (GtkWidget *widget, + ModestUIPrivate *priv) +{ + ModestHeaderView *header_view; + + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + modest_header_view_select_next (header_view); +} + +/* + * Marks a message as read and passes it to the msg preview widget + */ +static void +read_msg_func (gpointer data, gpointer user_data) +{ + ModestMsgView *msg_view; + TnyMsg *msg; + TnyHeader *header; + GetMsgAsyncHelper *helper; + TnyHeaderFlags header_flags; + + msg = TNY_MSG (data); + helper = (GetMsgAsyncHelper *) user_data; + + /* mark message as seen; _set_flags crashes, bug in tinymail? */ + header = TNY_HEADER (tny_iterator_get_current (helper->iter)); + header_flags = tny_header_get_flags (header); + tny_header_set_flags (header, header_flags | TNY_HEADER_FLAG_SEEN); + g_object_unref (G_OBJECT (header)); + + /* Set message on msg view */ + msg_view = modest_widget_factory_get_msg_preview (helper->priv->widget_factory); + modest_msg_view_set_message (msg_view, msg); +} + +/* + * This function is a generic handler for the tny_folder_get_msg_async + * call. It expects as user_data a #GetMsgAsyncHelper. This helper + * contains a user provided function that is called inside this + * method. This will allow us to use this callback in many different + * places. This callback performs the common actions for the + * get_msg_async call, more specific actions will be done by the user + * function + */ +static void +get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) +{ + GetMsgAsyncHelper *helper; + + helper = (GetMsgAsyncHelper *) user_data; + + if (*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) { + ModestHeaderView *header_view; + + header_view = modest_widget_factory_get_header_view (helper->priv->widget_factory); + modest_ui_actions_on_item_not_found (header_view, MODEST_ITEM_TYPE_MESSAGE, helper->priv); + return; + } + + if (!msg) + return; + + /* Call user function */ + helper->func (msg, user_data); + + /* Process next element (if exists) */ + tny_iterator_next (helper->iter); + if (tny_iterator_is_done (helper->iter)) { + TnyList *headers; + headers = tny_iterator_get_list (helper->iter); + /* Free resources */ + g_object_unref (G_OBJECT (headers)); + g_object_unref (G_OBJECT (helper->iter)); + g_slice_free (GetMsgAsyncHelper, helper); + } else + tny_folder_get_msg_async (folder, + TNY_HEADER (tny_iterator_get_current (helper->iter)), + get_msg_cb, helper); +} + +static void +modest_ui_actions_on_header_selected (ModestHeaderView *folder_view, + TnyHeader *header, + ModestUIPrivate *priv) +{ + TnyFolder *folder; + GetMsgAsyncHelper *helper; + TnyList *list; + TnyIterator *iter; + + if (!header) + return; + + folder = tny_header_get_folder (TNY_HEADER(header)); + + /* Create list */ + list = tny_simple_list_new (); + tny_list_prepend (list, G_OBJECT (header)); + + /* Fill helper data */ + helper = g_slice_new0 (GetMsgAsyncHelper); + helper->priv = priv; + helper->iter = tny_list_create_iterator (list); + helper->func = read_msg_func; + + tny_folder_get_msg_async (TNY_FOLDER(folder), + header, + get_msg_cb, + helper); + + /* Frees */ + g_object_unref (G_OBJECT (folder)); +} + +static void +modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, + TnyFolder *folder, + gboolean selected, + ModestUIPrivate *priv) +{ + GtkLabel *folder_info_label; + TnyPlatformFactory *factory; + gchar *txt; + ModestConf *conf; + ModestHeaderView *header_view; + + folder_info_label = + GTK_LABEL (modest_widget_factory_get_folder_info_label (priv->widget_factory)); + + if (!folder) { + gtk_label_set_label (GTK_LABEL(folder_info_label), ""); + return; + } + + factory = modest_tny_platform_factory_get_instance (); + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + conf = modest_tny_platform_factory_get_modest_conf_instance (factory); + + if (!selected) { /* the folder was unselected; save it's settings */ + modest_widget_memory_save (conf, G_OBJECT (header_view), + "header-view"); + } else { /* the folder was selected */ + guint num, unread; + num = tny_folder_get_all_count (folder); + unread = tny_folder_get_unread_count (folder); + + txt = g_strdup_printf (_("%d %s, %d unread"), + num, num==1 ? _("item") : _("items"), unread); + gtk_label_set_label (GTK_LABEL(folder_info_label), txt); + g_free (txt); + + modest_header_view_set_folder (header_view, folder); + modest_widget_memory_restore (conf, G_OBJECT(header_view), + "header-view"); + } +} + +static void +modest_ui_actions_on_password_requested (ModestTnyAccountStore *account_store, + const gchar* account_name, + gchar **password, + gboolean *cancel, + gboolean *remember, + ModestUIPrivate *priv) +{ + gchar *txt; + GtkWidget *dialog, *entry, *remember_pass_check; + + dialog = gtk_dialog_new_with_buttons (_("Password requested"), + GTK_WINDOW (priv->main_window), + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + + txt = g_strdup_printf (_("Please enter your password for %s"), account_name); + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt), + FALSE, FALSE, 0); + g_free (txt); + + entry = gtk_entry_new_with_max_length (40); + gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); + gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */ + + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, + TRUE, FALSE, 0); + + remember_pass_check = gtk_check_button_new_with_label (_("Remember password")); + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check, + TRUE, FALSE, 0); + + gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + + if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry))); + *cancel = FALSE; + } else { + *password = NULL; + *cancel = TRUE; + } + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check))) + *remember = TRUE; + else + *remember = FALSE; + + gtk_widget_destroy (dialog); + + while (gtk_events_pending ()) + gtk_main_iteration (); +} + +/****************************************************/ +/* + * below some stuff to clearup statusbar messages after 1,5 seconds.... + */ +typedef struct { + GtkWidget *status_bar; + GtkWidget *progress_bar; + guint msg_id; +} StatusRemoveData; + +static gboolean +on_statusbar_remove_msg (StatusRemoveData *data) +{ + /* we need to test types, as this callback maybe called after the + * widgets have been destroyed + */ + if (GTK_IS_STATUSBAR(data->status_bar)) + gtk_statusbar_remove (GTK_STATUSBAR(data->status_bar), + 0, data->msg_id); + if (GTK_IS_PROGRESS_BAR(data->progress_bar)) + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(data->progress_bar), + 1.0); + g_free (data); + return FALSE; +} + +static void +statusbar_push (ModestWidgetFactory *factory, guint context_id, const gchar *msg) +{ + guint id; + StatusRemoveData *data; + GtkWidget *status_bar, *progress_bar; + + if (!msg) + return; + + progress_bar = modest_widget_factory_get_progress_bar (factory); + status_bar = modest_widget_factory_get_status_bar (factory); + + id = gtk_statusbar_push (GTK_STATUSBAR(status_bar), 0, msg); + + data = g_new (StatusRemoveData, 1); + data->status_bar = status_bar; + data->progress_bar = progress_bar; + data->msg_id = id; + + g_timeout_add (1500, (GSourceFunc)on_statusbar_remove_msg, data); +} +/****************************************************************************/ + +static void +modest_ui_actions_on_connection_changed (TnyDevice *device, + gboolean online, + ModestUIPrivate *priv) +{ + GtkWidget *online_toggle; + ModestHeaderView *header_view; + + header_view = modest_widget_factory_get_header_view (priv->widget_factory); + online_toggle = modest_widget_factory_get_online_toggle (priv->widget_factory); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(online_toggle), + online); + gtk_button_set_label (GTK_BUTTON(online_toggle), + online ? _("Online") : _("Offline")); + + statusbar_push (priv->widget_factory, 0, + online ? _("Modest went online") : _("Modest went offline")); + + /* If Modest has became online and the header view has a + header selected then show it */ + if (online) { + GtkTreeSelection *selected; + + selected = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view)); + _modest_header_view_change_selection (selected, header_view); + } +} + +static void +modest_ui_actions_on_online_toggle_toggled (GtkToggleButton *toggle, + ModestUIPrivate *priv) +{ + gboolean online; + TnyDevice *device; + + online = gtk_toggle_button_get_active (toggle); + device = tny_account_store_get_device (priv->account_store); + + if (online) + tny_device_force_online (device); + else + tny_device_force_offline (device); +} + +static void +modest_ui_actions_on_item_not_found (ModestHeaderView *header_view, + ModestItemType type, + ModestUIPrivate *priv) +{ + GtkWidget *dialog; + gchar *txt, *item; + gboolean online; + TnyDevice *device; + + item = (type == MODEST_ITEM_TYPE_FOLDER) ? "folder" : "message"; + device = tny_account_store_get_device (priv->account_store); + + gdk_threads_enter (); + online = tny_device_is_online (device); + + if (online) { + /* already online -- the item is simply not there... */ + dialog = gtk_message_dialog_new (GTK_WINDOW (priv->main_window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + _("The %s you selected cannot be found"), + item); + gtk_dialog_run (GTK_DIALOG(dialog)); + } else { + + dialog = gtk_dialog_new_with_buttons (_("Connection requested"), + GTK_WINDOW (priv->main_window), + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + + txt = g_strdup_printf (_("This %s is not available in offline mode.\n" + "Do you want to get online?"), item); + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), + gtk_label_new (txt), FALSE, FALSE, 0); + gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + g_free (txt); + + gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300); + if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + tny_device_force_online (device); + } + } + gtk_widget_destroy (dialog); + gdk_threads_leave (); +} + +static void +modest_ui_actions_on_header_status_update (ModestHeaderView *header_view, const gchar *msg, + gint num, gint total, ModestUIPrivate *priv) +{ + GtkWidget *progress_bar; + + progress_bar = modest_widget_factory_get_progress_bar (priv->widget_factory); + + if (total != 0) + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(progress_bar), + (gdouble)num/(gdouble)total); + else + gtk_progress_bar_pulse (GTK_PROGRESS_BAR(progress_bar)); + + statusbar_push (priv->widget_factory, 0, msg); +} + + +static void +modest_ui_actions_on_msg_link_hover (ModestMsgView *msgview, const gchar* link, + ModestUIPrivate *priv) +{ + + statusbar_push (priv->widget_factory, 0, link); + + /* TODO: do something */ +} + + +static void +modest_ui_actions_on_msg_link_clicked (ModestMsgView *msgview, const gchar* link, + ModestUIPrivate *priv) +{ + gchar *msg; + msg = g_strdup_printf (_("Opening %s..."), link); + + statusbar_push (priv->widget_factory, 0, msg); + g_free (msg); + + /* TODO: do something */ +} + +static void +modest_ui_actions_on_msg_attachment_clicked (ModestMsgView *msgview, int index, + ModestUIPrivate *priv) +{ + gchar *msg; + + msg = g_strdup_printf (_("Opening attachment %d..."), index); + statusbar_push (priv->widget_factory, 0, msg); + + g_free (msg); + + /* TODO: do something */ +} diff --git a/src/modest-ui.h b/src/modest-ui.h index 57c811c..20a9b40 100644 --- a/src/modest-ui.h +++ b/src/modest-ui.h @@ -31,9 +31,7 @@ #define __MODEST_UI_H__ #include -#include -#include "modest-conf.h" -#include "widgets/modest-msg-view.h" +#include G_BEGIN_DECLS @@ -59,7 +57,6 @@ struct _ModestUIClass { /* void (* my_event) (ModestUI* obj); */ }; - /** * modest_ui_get_type: * @@ -71,19 +68,26 @@ GType modest_ui_get_type (void) G_GNUC_CONST; /** * modest_ui_new: + * @account_store: a #TnyAccountStore * * Returns: a new ModestUI, or NULL in case of error */ -ModestUI* modest_ui_new (void); +ModestUI* modest_ui_new (TnyAccountStore *account_store); /** * modest_ui_main_window: * @modest_ui: a ModestUI instance * - * Returns: a new main window, or NULL in case of error + * Creates an new main window and returns it. If there is already a + * main window then the current one is returned and no new window is + * created + * + * Returns: a #ModestMainWindow, or NULL in case of error */ -GtkWidget *modest_ui_main_window (ModestUI *modest_ui); +GtkWidget* modest_ui_main_window (ModestUI *modest_ui); + + G_END_DECLS #endif /* __MODEST_UI_H__ */ diff --git a/src/modest-widget-factory.c b/src/modest-widget-factory.c index 92ed3ec..cf0c97c 100644 --- a/src/modest-widget-factory.c +++ b/src/modest-widget-factory.c @@ -48,35 +48,6 @@ static void modest_widget_factory_init (ModestWidgetFactory *obj); static void modest_widget_factory_finalize (GObject *obj); -/* callbacks */ -static void on_folder_selection_changed (ModestFolderView *folder_view, - TnyFolder *folder, gboolean selected, - ModestWidgetFactory *self); -static void on_folder_key_press_event (ModestFolderView *header_view, - GdkEventKey *event, - gpointer user_data); -static void on_message_selected (ModestHeaderView *header_view, TnyMsg *msg, - ModestWidgetFactory *self); -static void on_header_status_update (ModestHeaderView *header_view, const gchar *msg, - gint num, gint total, ModestWidgetFactory *self); -static void on_msg_link_hover (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self); -static void on_msg_link_clicked (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self); -static void on_msg_attachment_clicked (ModestMsgView *msgview, int index, - ModestWidgetFactory *self); - -static void on_connection_changed (TnyDevice *device, gboolean online, - ModestWidgetFactory *self); -static void on_online_toggle_toggled (GtkToggleButton *toggle, ModestWidgetFactory *factory); - -static void on_password_requested (ModestTnyAccountStore *account_store, const gchar* account_name, - gchar **password, gboolean *cancel, gboolean *remember, ModestWidgetFactory *self); - -static void on_item_not_found (ModestHeaderView* header_view, ModestItemType type, - ModestWidgetFactory *self); - - /* list my signals */ enum { /* MY_SIGNAL_1, */ @@ -94,7 +65,6 @@ struct _ModestWidgetFactoryPrivate { ModestHeaderView *header_view; ModestFolderView *folder_view; ModestMsgView *msg_preview; - ModestToolbar *main_toolbar, *edit_toolbar; GtkWidget *progress_bar; GtkWidget *status_bar; @@ -181,58 +151,6 @@ modest_widget_factory_finalize (GObject *obj) } - -/* FIXME: uninit these as well */ -static void -init_signals (ModestWidgetFactory *self) -{ - TnyDevice *device; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - /* folder view */ - g_signal_connect (G_OBJECT(priv->folder_view), "folder_selection_changed", - G_CALLBACK(on_folder_selection_changed), self); - g_signal_connect (G_OBJECT(priv->folder_view), "key-press-event", - G_CALLBACK(on_folder_key_press_event), self); - - /* header view */ - g_signal_connect (G_OBJECT(priv->header_view), "status_update", - G_CALLBACK(on_header_status_update), self); - g_signal_connect (G_OBJECT(priv->header_view), "message_selected", - G_CALLBACK(on_message_selected), self); - g_signal_connect (G_OBJECT(priv->header_view), "item_not_found", - G_CALLBACK(on_item_not_found), self); - - - /* msg preview */ - g_signal_connect (G_OBJECT(priv->msg_preview), "link_clicked", - G_CALLBACK(on_msg_link_clicked), self); - g_signal_connect (G_OBJECT(priv->msg_preview), "link_hover", - G_CALLBACK(on_msg_link_hover), self); - g_signal_connect (G_OBJECT(priv->msg_preview), "attachment_clicked", - G_CALLBACK(on_msg_attachment_clicked), self); - - /* account store */ - g_signal_connect (G_OBJECT (priv->account_store), "password_requested", - G_CALLBACK(on_password_requested), self); - - /* FIXME: const casting is evil ==> tinymail */ - device = (TnyDevice*) tny_account_store_get_device (priv->account_store); - if (device) { - g_signal_connect (G_OBJECT(device), "connection_changed", - G_CALLBACK(on_connection_changed), self); - g_signal_connect (G_OBJECT(priv->online_toggle), "toggled", - G_CALLBACK(on_online_toggle_toggled), self); - - /* init toggle in correct state */ - on_connection_changed (device, - tny_device_is_online (device), - self); - } -} - static gboolean init_widgets (ModestWidgetFactory *self) { @@ -276,7 +194,7 @@ init_widgets (ModestWidgetFactory *self) the current folder */ priv->folder_info_label = gtk_label_new (NULL); - init_signals (self); +/* init_signals (self); */ return TRUE; } @@ -450,376 +368,41 @@ modest_widget_factory_get_folder_info_label (ModestWidgetFactory *self) return MODEST_WIDGET_FACTORY_GET_PRIVATE(self)->folder_info_label; } -ModestToolbar* -modest_widget_factory_get_main_toolbar (ModestWidgetFactory *self, - GSList *items) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - if (priv->main_toolbar) - return priv->main_toolbar; - - priv->main_toolbar = modest_toolbar_new (items); - if (!priv->main_toolbar) { - g_printerr ("modest: failed to create main toolbar\n"); - return NULL; - } - - return priv->main_toolbar; -} - - -ModestToolbar* -modest_widget_factory_get_edit_toolbar (ModestWidgetFactory *self, - GSList *items) -{ - return modest_toolbar_new (items); -} - - - -static void -on_folder_selection_changed (ModestFolderView *folder_view, TnyFolder *folder, - gboolean selected, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - gchar *txt; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - if (folder) { - ModestConf *conf; - - conf = modest_tny_platform_factory_get_modest_conf_instance (priv->fact); - - if (!selected) { /* the folder was unselected; save it's settings */ - modest_widget_memory_save (conf, G_OBJECT (priv->header_view), - "header-view"); - } else { /* the folder was selected */ - guint num, unread; - num = tny_folder_get_all_count (folder); - unread = tny_folder_get_unread_count (folder); - - txt = g_strdup_printf (_("%d %s, %d unread"), - num, num==1 ? _("item") : _("items"), unread); - gtk_label_set_label (GTK_LABEL(priv->folder_info_label), txt); - g_free (txt); - - modest_header_view_set_folder (priv->header_view, folder); - modest_widget_memory_restore (conf, G_OBJECT(priv->header_view), - "header-view"); - } - } else - gtk_label_set_label (GTK_LABEL(priv->folder_info_label), ""); -} /*********************** Test code ********************/ -static void -on_folder_key_press_event (ModestFolderView *folder_view, GdkEventKey *event, gpointer user_data) -{ - GtkTreeSelection *selection; - GtkTreeModel *model; - GtkTreeIter iter; - TnyFolderStore *folder; - gint type; - ModestMailOperation *mail_op; - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view)); - gtk_tree_selection_get_selected (selection, &model, &iter); - - gtk_tree_model_get (model, &iter, - TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type, - TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder, - -1); - - mail_op = modest_mail_operation_new (); - - if (event->keyval == GDK_C || event->keyval == GDK_c) { - if (type != TNY_FOLDER_TYPE_ROOT) - modest_mail_operation_create_folder (mail_op, folder, "New"); - } else if (event->keyval == GDK_D || event->keyval == GDK_d) { - if (type != TNY_FOLDER_TYPE_ROOT) - modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), FALSE); - } else if (event->keyval == GDK_N || event->keyval == GDK_n) { - if (type != TNY_FOLDER_TYPE_ROOT) - modest_mail_operation_rename_folder (mail_op, TNY_FOLDER (folder), "New Name"); - } else if (event->keyval == GDK_T || event->keyval == GDK_t) { - if (type != TNY_FOLDER_TYPE_ROOT) - modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), TRUE); - } - - g_object_unref (G_OBJECT (mail_op)); -} -/****************************************************/ - -static void -on_message_selected (ModestHeaderView *folder_view, TnyMsg *msg, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - modest_msg_view_set_message (priv->msg_preview, msg); -} - - -/* - * below some stuff to clearup statusbar messages after 1,5 seconds.... - */ -typedef struct { - GtkWidget *status_bar; - GtkWidget *progress_bar; - guint msg_id; -} StatusRemoveData; - - -static gboolean -on_statusbar_remove_msg (StatusRemoveData *data) -{ - /* we need to test types, as this callback maybe called after the - * widgets have been destroyed - */ - if (GTK_IS_STATUSBAR(data->status_bar)) - gtk_statusbar_remove (GTK_STATUSBAR(data->status_bar), - 0, data->msg_id); - if (GTK_IS_PROGRESS_BAR(data->progress_bar)) - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(data->progress_bar), - 1.0); - g_free (data); - return FALSE; -} - - -static void -statusbar_push (ModestWidgetFactory *self, guint context_id, const gchar *msg) -{ - guint id; - StatusRemoveData *data; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - if (!msg) - return; - - id = gtk_statusbar_push (GTK_STATUSBAR(priv->status_bar), 0, msg); - - data = g_new (StatusRemoveData, 1); - data->status_bar = priv->status_bar; - data->progress_bar = priv->progress_bar; - data->msg_id = id; - - g_timeout_add (1500, (GSourceFunc)on_statusbar_remove_msg, data); -} -/****************************************************************************/ - - -static void -on_header_status_update (ModestHeaderView *header_view, const gchar *msg, - gint num, gint total, ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - if (total != 0) - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(priv->progress_bar), - (gdouble)num/(gdouble)total); - else - gtk_progress_bar_pulse (GTK_PROGRESS_BAR(priv->progress_bar)); - - statusbar_push (self, 0, msg); -} - - -static void -on_msg_link_hover (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - statusbar_push (self, 0, link); - -} - - -static void -on_msg_link_clicked (ModestMsgView *msgview, const gchar* link, - ModestWidgetFactory *self) -{ - gchar *msg; - msg = g_strdup_printf (_("Opening %s..."), link); - statusbar_push (self, 0, msg); - g_free (msg); -} - -static void -on_msg_attachment_clicked (ModestMsgView *msgview, int index, - ModestWidgetFactory *self) -{ - gchar *msg; - - msg = g_strdup_printf (_("Opening attachment %d..."), index); - statusbar_push (self, 0, msg); - - g_free (msg); -} - - -static void -on_connection_changed (TnyDevice *device, gboolean online, - ModestWidgetFactory *self) -{ - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->online_toggle), - online); - gtk_button_set_label (GTK_BUTTON(priv->online_toggle), - online ? _("Online") : _("Offline")); - - statusbar_push (self, 0, online ? _("Modest went online") : _("Modest went offline")); - - /* If Modest has became online and the header view has a - header selected then show it */ - if (online) { - GtkTreeSelection *selected; - - selected = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->header_view)); - _modest_header_view_change_selection (selected, priv->header_view); - } -} - - -static void -on_online_toggle_toggled (GtkToggleButton *toggle, ModestWidgetFactory *self) -{ - gboolean online; - const TnyDevice *device; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - online = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->online_toggle)); - device = tny_account_store_get_device (priv->account_store); - - /* FIXME: const casting should not be necessary ==> tinymail */ - if (online) /* we're moving to online state */ - tny_device_force_online ((TnyDevice*)device); - else /* we're moving to offline state */ - tny_device_force_offline ((TnyDevice*)device); -} - - -static void -on_item_not_found (ModestHeaderView* header_view, ModestItemType type, - ModestWidgetFactory *self) -{ - /* FIXME ==> ask from UI... */ - GtkWidget *dialog, *window; - gchar *txt; - gboolean online; - gchar *item = type == MODEST_ITEM_TYPE_FOLDER ? "folder" : "message"; - - TnyDevice *device; - ModestWidgetFactoryPrivate *priv; - - priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self); - device = tny_account_store_get_device (priv->account_store); - - gdk_threads_enter (); - online = tny_device_is_online (device); - /* FIXME: get main window */ - window = NULL; - if (online) { - /* already online -- the item is simply not there... */ - dialog = gtk_message_dialog_new (window, - GTK_DIALOG_MODAL, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_OK, - _("The %s you selected cannot be found"), - item); - gtk_dialog_run (GTK_DIALOG(dialog)); - } else { - - dialog = gtk_dialog_new_with_buttons (_("Connection requested"), - window, - GTK_DIALOG_MODAL, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL); - - txt = g_strdup_printf (_("This %s is not available in offline mode.\n" - "Do you want to get online?"), item); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), - gtk_label_new (txt), FALSE, FALSE, 0); - gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); - g_free (txt); - - gtk_window_set_default_size (GTK_WINDOW(dialog), 300, 300); - if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - tny_device_force_online (device); - } - } - gtk_widget_destroy (dialog); - gdk_threads_leave (); -} - - - -static void -on_password_requested (ModestTnyAccountStore *account_store, const gchar* account_name, - gchar **password, gboolean *cancel, gboolean *remember, ModestWidgetFactory *self) -{ - gchar *txt; - GtkWidget *dialog, *entry, *remember_pass_check, *window; - - /* FIXME: get main window */ - window = NULL; - dialog = gtk_dialog_new_with_buttons (_("Password requested"), - window, - GTK_DIALOG_MODAL, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL); - - txt = g_strdup_printf (_("Please enter your password for %s"), account_name); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt), - FALSE, FALSE, 0); - g_free (txt); - - entry = gtk_entry_new_with_max_length (40); - gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); - gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */ - - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, - TRUE, FALSE, 0); - - remember_pass_check = gtk_check_button_new_with_label (_("Remember password")); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check, - TRUE, FALSE, 0); - - gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); - - if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry))); - *cancel = FALSE; - } else { - *password = NULL; - *cancel = TRUE; - } - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check))) - *remember = TRUE; - else - *remember = FALSE; - - gtk_widget_destroy (dialog); -} - +/* static void */ +/* on_folder_key_press_event (ModestFolderView *folder_view, GdkEventKey *event, gpointer user_data) */ +/* { */ +/* GtkTreeSelection *selection; */ +/* GtkTreeModel *model; */ +/* GtkTreeIter iter; */ +/* TnyFolderStore *folder; */ +/* gint type; */ +/* ModestMailOperation *mail_op; */ + +/* selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (folder_view)); */ +/* gtk_tree_selection_get_selected (selection, &model, &iter); */ + +/* gtk_tree_model_get (model, &iter, */ +/* TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type, */ +/* TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder, */ +/* -1); */ + +/* mail_op = modest_mail_operation_new (); */ + +/* if (event->keyval == GDK_C || event->keyval == GDK_c) { */ +/* if (type != TNY_FOLDER_TYPE_ROOT) */ +/* modest_mail_operation_create_folder (mail_op, folder, "New"); */ +/* } else if (event->keyval == GDK_D || event->keyval == GDK_d) { */ +/* if (type != TNY_FOLDER_TYPE_ROOT) */ +/* modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), FALSE); */ +/* } else if (event->keyval == GDK_N || event->keyval == GDK_n) { */ +/* if (type != TNY_FOLDER_TYPE_ROOT) */ +/* modest_mail_operation_rename_folder (mail_op, TNY_FOLDER (folder), "New Name"); */ +/* } else if (event->keyval == GDK_T || event->keyval == GDK_t) { */ +/* if (type != TNY_FOLDER_TYPE_ROOT) */ +/* modest_mail_operation_remove_folder (mail_op, TNY_FOLDER (folder), TRUE); */ +/* } */ + +/* g_object_unref (G_OBJECT (mail_op)); */ +/* } */ diff --git a/src/modest-widget-factory.h b/src/modest-widget-factory.h index 07a3fe7..0eeb0bd 100644 --- a/src/modest-widget-factory.h +++ b/src/modest-widget-factory.h @@ -36,7 +36,6 @@ #include "widgets/modest-folder-view.h" #include "widgets/modest-msg-view.h" #include "widgets/modest-account-view.h" -#include "widgets/modest-toolbar.h" #include "widgets/modest-combo-box.h" G_BEGIN_DECLS @@ -193,60 +192,27 @@ GtkWidget* modest_widget_factory_get_status_bar (ModestWidgetFactory *self); GtkWidget* modest_widget_factory_get_combo_box (ModestWidgetFactory *self, ModestComboBoxType type); - /** - * modest_widget_factory_get_online_combo + * modest_widget_factory_get_online_toggle * @self: a ModestWidgetFactory instance - * + * * return a toggle which with one can see whether online/offline mode is active. * In case of auto-connect, this will automatically be sync'd with the * account_store / device - * - * Returns: the combo box + * + * Returns: the toggle button */ GtkWidget* modest_widget_factory_get_online_toggle (ModestWidgetFactory *self); - - - /** * modest_widget_factory_get_folder_info_label * @self: a ModestWidgetFactory instance - * - * return a label with the number of items, unread items in the current folder - * - * Returns: the label - */ -GtkWidget* modest_widget_factory_get_folder_info_label (ModestWidgetFactory *self); - - -/** - * modest_widget_factory_get_main_toolbar - * @self: a ModestWidgetFactory instance - * @items: a list of ModestToolbarButtons (button_ids) * - * returns the main toolbar widget; their enabled/disabled state synchronized with - * the other widgets. Note that after the first calling, this function will - * always return the same toolbar, regardless of the items - * - * Returns: the toolbar - */ -ModestToolbar *modest_widget_factory_get_main_toolbar (ModestWidgetFactory *self, - GSList *items); - -/** - * modest_widget_factory_get_edit_toolbar - * @self: a ModestWidgetFactory instance - * @items: a list of ModestToolbarButtons (button_ids) + * return a label with the number of items, unread items in the current folder * - * returns the toolbar widget for edit windows; the enabled/disabled - * state synchronized with the other widgets. - * - * Returns: the toolbar + * Returns: the label */ -ModestToolbar *modest_widget_factory_get_edit_toolbar (ModestWidgetFactory *self, - GSList *items); - +GtkWidget* modest_widget_factory_get_folder_info_label (ModestWidgetFactory *self); G_END_DECLS diff --git a/src/ui/modest-ui.xml b/src/ui/modest-ui.xml new file mode 100644 index 0000000..04ba930 --- /dev/null +++ b/src/ui/modest-ui.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/widgets/Makefile.am b/src/widgets/Makefile.am index d6ee292..8746c7d 100644 --- a/src/widgets/Makefile.am +++ b/src/widgets/Makefile.am @@ -6,9 +6,10 @@ INCLUDES=\ $(MODEST_GSTUFF_CFLAGS) \ $(MODEST_LIBTINYMAIL_GNOME_DESKTOP_CFLAGS) \ $(MODEST_LIBTINYMAIL_MAEMO_CFLAGS) \ - -I${top_srcdir}/src/$(MODEST_PLATFORM) \ - -DPREFIX=\"@prefix@\" \ + -I ${top_srcdir}/src/$(MODEST_PLATFORM) \ -I ${top_srcdir}/src \ + -DPREFIX=\"@prefix@\" \ + -DPIXMAP_PREFIX=\"${datadir}/pixmaps/modest/\" \ -Wall noinst_LTLIBRARIES=\ @@ -24,8 +25,8 @@ libmodest_widgets_la_SOURCES= \ modest-header-view-priv.h \ modest-msg-view.c \ modest-msg-view.h \ - modest-toolbar.h \ - modest-toolbar.c \ + modest-toolbar.c \ + modest-toolbar.h \ modest-combo-box.c \ modest-combo-box.h diff --git a/src/widgets/modest-edit-msg-window.h b/src/widgets/modest-edit-msg-window.h new file mode 100644 index 0000000..63cf77e --- /dev/null +++ b/src/widgets/modest-edit-msg-window.h @@ -0,0 +1,92 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __MODEST_EDIT_MSG_WINDOW_H__ +#define __MODEST_EDIT_MSG_WINDOW_H__ + +#include +#include +#include "modest-conf.h" +#include "modest-widget-factory.h" + +G_BEGIN_DECLS + +/* convenience macros */ +#define MODEST_TYPE_EDIT_MSG_WINDOW (modest_edit_msg_window_get_type()) +#define MODEST_EDIT_MSG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_EDIT_MSG_WINDOW,ModestEditMsgWindow)) +#define MODEST_EDIT_MSG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_EDIT_MSG_WINDOW,GtkWindow)) +#define MODEST_IS_EDIT_MSG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_EDIT_MSG_WINDOW)) +#define MODEST_IS_EDIT_MSG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_EDIT_MSG_WINDOW)) +#define MODEST_EDIT_MSG_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_EDIT_MSG_WINDOW,ModestEditMsgWindowClass)) + +typedef struct _ModestEditMsgWindow ModestEditMsgWindow; +typedef struct _ModestEditMsgWindowClass ModestEditMsgWindowClass; + +struct _ModestEditMsgWindow { + GtkWindow parent; + /* insert public members, if any */ +}; + +struct _ModestEditMsgWindowClass { + GtkWindowClass parent_class; + /* insert signal callback declarations, eg. */ + /* void (* my_event) (ModestEditMsgWindow* obj); */ +}; + + +typedef enum _ModestEditType { + MODEST_EDIT_TYPE_NEW, + MODEST_EDIT_TYPE_REPLY, + MODEST_EDIT_TYPE_FORWARD, + MODEST_EDIT_TYPE_VIEW, + + MODEST_EDIT_TYPE_NUM +} ModestEditType; +/* typedef enum _ModestEditType ModestEditType; */ + + +/* member functions */ +GType modest_edit_msg_window_get_type (void) G_GNUC_CONST; + +GtkWidget* modest_edit_msg_window_new (ModestWidgetFactory *factory, + ModestEditType type); + +/** + * modest_edit_msg_window_set_msg: + * @self: a #ModestEditMsgWindow + * @msg: a #TnyMsg + * + * shows the message @msg in a #ModestEditMsgWindow + **/ +void modest_edit_msg_window_set_msg (ModestEditMsgWindow *self, + TnyMsg *msg); +G_END_DECLS + +#endif /* __MODEST_EDIT_MSG_WINDOW_H__ */ + diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index be893a7..9ae28e1 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -58,7 +58,6 @@ static void on_subscription_changed (TnyStoreAccount *store_account, Tn static gboolean modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *account_store); -static const gchar *get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter); static void modest_folder_view_disconnect_store_account_handlers (GtkTreeView *self); @@ -468,21 +467,6 @@ modest_folder_view_new (ModestTnyAccountStore *account_store, } -const gchar * -modest_folder_view_get_selected_account (ModestFolderView *self) -{ - GtkTreeModel *model; - GtkTreeIter iter; - ModestFolderViewPrivate *priv; - - g_return_val_if_fail (self, NULL); - priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - - gtk_tree_selection_get_selected (priv->cur_selection, &model, &iter); - - return get_account_name_from_folder (model, iter); -} - static gboolean update_model_empty (ModestFolderView *self) { @@ -662,26 +646,3 @@ modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *accoun return retval; } - - -/* ugly */ -static const gchar * -get_account_name_from_folder (GtkTreeModel *model, GtkTreeIter iter) -{ - GtkTreePath *path; - GtkTreeIter new_iter; - TnyFolder *account_folder; - gint depth, i; - - path = gtk_tree_model_get_path (model, &iter); - depth = gtk_tree_path_get_depth (path); - - for (i = 1; i < depth; ++i) - gtk_tree_path_up (path); - - gtk_tree_model_get_iter (model, &new_iter, path); - gtk_tree_model_get (model, &new_iter, - TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &account_folder, - -1); - return tny_account_get_name (TNY_ACCOUNT (account_folder)); -} diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 02ebd2f..d08cdd7 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -47,7 +47,7 @@ static void on_selection_changed (GtkTreeSelection *sel, gpointer user_data); #define MODEST_HEADER_VIEW_PTR "modest-header-view" enum { - MESSAGE_SELECTED_SIGNAL, + HEADER_SELECTED_SIGNAL, ITEM_NOT_FOUND_SIGNAL, STATUS_UPDATE_SIGNAL, LAST_SIGNAL @@ -67,11 +67,6 @@ struct _ModestHeaderViewPrivate { MODEST_TYPE_HEADER_VIEW, \ ModestHeaderViewPrivate)) -typedef struct _GetMsgAsyncHelper { - ModestHeaderView *self; - TnyHeader *header; -} GetMsgAsyncHelper; - /* globals */ static GObjectClass *parent_class = NULL; @@ -113,11 +108,11 @@ modest_header_view_class_init (ModestHeaderViewClass *klass) g_type_class_add_private (gobject_class, sizeof(ModestHeaderViewPrivate)); - signals[MESSAGE_SELECTED_SIGNAL] = - g_signal_new ("message_selected", + signals[HEADER_SELECTED_SIGNAL] = + g_signal_new ("header_selected", G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (ModestHeaderViewClass,message_selected), + G_STRUCT_OFFSET (ModestHeaderViewClass,header_selected), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); @@ -131,14 +126,14 @@ modest_header_view_class_init (ModestHeaderViewClass *klass) g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); - signals[STATUS_UPDATE_SIGNAL] = + signals[STATUS_UPDATE_SIGNAL] = g_signal_new ("status_update", G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (ModestHeaderViewClass,message_selected), + G_STRUCT_OFFSET (ModestHeaderViewClass,status_update), NULL, NULL, modest_marshal_VOID__STRING_INT_INT, - G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); + G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT); } static void @@ -539,6 +534,20 @@ modest_header_view_get_selected_headers (ModestHeaderView *self) return header_list; } +void +modest_header_view_select_next (ModestHeaderView *self) +{ + GtkTreeSelection *sel; + GtkTreeIter iter; + GtkTreeModel *model; + + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (self)); + if (sel) { + gtk_tree_selection_get_selected (sel, &model, &iter); + gtk_tree_model_iter_next (model, &iter); + gtk_tree_selection_select_iter (sel, &iter); + } +} GList* modest_header_view_get_columns (ModestHeaderView *self) @@ -547,9 +556,6 @@ modest_header_view_get_columns (ModestHeaderView *self) return gtk_tree_view_get_columns (GTK_TREE_VIEW(self)); } - - - gboolean modest_header_view_set_style (ModestHeaderView *self, ModestHeaderViewStyle style) @@ -704,6 +710,7 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err, GtkTreeModel *sortable; ModestHeaderView *self; ModestHeaderViewPrivate *priv; + GError *error = NULL; if (cancelled) return; @@ -722,13 +729,19 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err, g_object_unref (priv->headers); priv->headers = TNY_LIST(tny_gtk_header_list_model_new ()); - tny_folder_get_headers (folder, priv->headers, FALSE, NULL); /* FIXME */ - + tny_folder_get_headers (folder, priv->headers, FALSE, &error); /* FIXME */ + if (error) { + g_signal_emit (G_OBJECT(self), signals[ITEM_NOT_FOUND_SIGNAL], + 0, MODEST_ITEM_TYPE_MESSAGE); + g_print (error->message); + g_error_free (error); + return; + } + tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(priv->headers),folder, TRUE); /*async*/ - - sortable = gtk_tree_model_sort_new_with_model - (GTK_TREE_MODEL(priv->headers)); + + sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers)); /* install our special sorting functions */ cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self)); @@ -746,7 +759,6 @@ on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err, gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable); gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(self),TRUE); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(self), TRUE); - /* no need to unref sortable */ } } @@ -795,36 +807,12 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) } /* no message selected */ - g_signal_emit (G_OBJECT(self), signals[MESSAGE_SELECTED_SIGNAL], 0, + g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0, NULL); return TRUE; } static void -get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) -{ - GetMsgAsyncHelper *helper; - TnyHeaderFlags header_flags; - - helper = (GetMsgAsyncHelper *) user_data; - - if (msg) { - g_signal_emit (G_OBJECT(helper->self), signals[MESSAGE_SELECTED_SIGNAL], 0, - msg); - - /* mark message as seen; _set_flags crashes, bug in tinymail? */ - header_flags = tny_header_get_flags (helper->header); - tny_header_set_flags (helper->header, header_flags | TNY_HEADER_FLAG_SEEN); - } else { - g_signal_emit (G_OBJECT(helper->self), signals[ITEM_NOT_FOUND_SIGNAL], - 0, MODEST_ITEM_TYPE_MESSAGE); - } - - /* Frees */ - g_slice_free (GetMsgAsyncHelper, helper); -} - -static void on_selection_changed (GtkTreeSelection *sel, gpointer user_data) { GtkTreeModel *model; @@ -832,8 +820,6 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) GtkTreeIter iter; ModestHeaderView *self; ModestHeaderViewPrivate *priv; - TnyFolder *folder; - GetMsgAsyncHelper *helper; g_return_if_fail (sel); g_return_if_fail (user_data); @@ -847,31 +833,11 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) gtk_tree_model_get (model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header, -1); - - if (!header) { - g_printerr ("modest: cannot find header\n"); - return; - } - - folder = tny_header_get_folder (TNY_HEADER(header)); - if (!folder) { - g_signal_emit (G_OBJECT(self), signals[ITEM_NOT_FOUND_SIGNAL], 0, - MODEST_ITEM_TYPE_FOLDER); - return; - } - - helper = g_slice_new0 (GetMsgAsyncHelper); - helper->self = self; - helper->header = header; - - /* Get message asynchronously. The callback will issue a - signal if the message was retrieved correctly and then will - set the header flags as read. */ - tny_folder_get_msg_async (TNY_FOLDER(folder), - header, get_msg_cb, helper); - /* Frees */ - g_object_unref (G_OBJECT (folder)); + /* Emit signal */ + g_signal_emit (G_OBJECT(self), + signals[HEADER_SELECTED_SIGNAL], + 0, header); } diff --git a/src/widgets/modest-header-view.h b/src/widgets/modest-header-view.h index c8abdf0..9048171 100644 --- a/src/widgets/modest-header-view.h +++ b/src/widgets/modest-header-view.h @@ -84,9 +84,9 @@ typedef enum _ModestItemType { struct _ModestHeaderViewClass { GtkTreeViewClass parent_class; - void (*message_selected) (ModestHeaderView* self, - TnyMsg *msg, - gpointer user_data); + void (*header_selected) (ModestHeaderView* self, + TnyHeader *header, + gpointer user_data); void (*item_not_found) (ModestHeaderView* self, ModestItemType type, @@ -209,6 +209,15 @@ ModestHeaderViewStyle modest_header_view_get_style (ModestHeaderView *self); */ TnyList* modest_header_view_get_selected_headers (ModestHeaderView *self); + +/** + * modest_header_view_select_next: + * @self: a #ModestHeaderView + * + * Selects the header next to the current selected one + **/ +void modest_header_view_select_next (ModestHeaderView *self); + G_END_DECLS diff --git a/src/widgets/modest-icon-names.h b/src/widgets/modest-icon-names.h new file mode 100644 index 0000000..f503e9a --- /dev/null +++ b/src/widgets/modest-icon-names.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/* modest-icon-names.h */ + +/* + * FIXME: this should go the front-end dirs, + * with specific icons + */ + +#ifndef __MODEST_ICON_NAMES_H__ +#define __MODEST_ICON_NAMES_H__ + +/* icons */ + +#define MODEST_APP_ICON PIXMAP_PREFIX "modest.png" + +#define MODEST_HEADER_ICON_READ PIXMAP_PREFIX "qgn_list_messagin_mail.png" +#define MODEST_HEADER_ICON_UNREAD PIXMAP_PREFIX "qgn_list_messagin_mail_unread.png" +#define MODEST_HEADER_ICON_DELETED PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" +#define MODEST_HEADER_ICON_ATTACH PIXMAP_PREFIX "qgn_list_gene_attacpap.png" + +#define MODEST_FOLDER_ICON_OPEN PIXMAP_PREFIX "qgn_list_gene_fldr_opn.png" +#define MODEST_FOLDER_ICON_CLOSED PIXMAP_PREFIX "qgn_list_gene_fldr_cls.png" + +#define MODEST_FOLDER_ICON_ACCOUNT PIXMAP_PREFIX "qgn_addr_icon_user_group.png" +#define MODEST_FOLDER_ICON_INBOX PIXMAP_PREFIX "qgn_list_messagin_inbox.png" +#define MODEST_FOLDER_ICON_OUTBOX PIXMAP_PREFIX "qgn_list_messagin_outbox.png" +#define MODEST_FOLDER_ICON_SENT PIXMAP_PREFIX "qgn_list_messagin_sent.png" +#define MODEST_FOLDER_ICON_TRASH PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" +#define MODEST_FOLDER_ICON_JUNK PIXMAP_PREFIX "qgn_list_messagin_mail_deleted.png" +#define MODEST_FOLDER_ICON_DRAFTS PIXMAP_PREFIX "qgn_list_messagin_drafts.png" +#define MODEST_FOLDER_ICON_NORMAL PIXMAP_PREFIX "qgn_list_gene_fldr_cls.png" + +#define MODEST_FOLDER_ICON_CONTACTS PIXMAP_PREFIX "qgn_addr_icon_user_group.png" +#define MODEST_FOLDER_ICON_NOTES PIXMAP_PREFIX "qgn_list_messagin_viewer.png" +#define MODEST_FOLDER_ICON_CALENDAR PIXMAP_PREFIX "qgn_widg_datedit.png" + +/* toolbar */ +#define MODEST_TOOLBAR_ICON_MAIL_SEND PIXMAP_PREFIX "qgn_list_messagin_sent.png" +#define MODEST_TOOLBAR_ICON_NEW_MAIL PIXMAP_PREFIX "qgn_list_messagin_editor.png" +#define MODEST_TOOLBAR_ICON_SEND_RECEIVE PIXMAP_PREFIX "gtk-refresh.png" +#define MODEST_TOOLBAR_ICON_REPLY PIXMAP_PREFIX "mail-reply-sender.png" +#define MODEST_TOOLBAR_ICON_REPLY_ALL PIXMAP_PREFIX "mail-reply-all.png" +#define MODEST_TOOLBAR_ICON_FORWARD PIXMAP_PREFIX "mail-forward.png" +#define MODEST_TOOLBAR_ICON_DELETE PIXMAP_PREFIX "mail-mark-junk.png" +#define MODEST_TOOLBAR_ICON_NEXT PIXMAP_PREFIX "forward.png" +#define MODEST_TOOLBAR_ICON_PREV PIXMAP_PREFIX "back.png" +#define MODEST_TOOLBAR_ICON_STOP PIXMAP_PREFIX "stock-stop.svg" + +/* Stock icon names */ +#define MODEST_STOCK_MAIL_SEND "modest-stock-mail-send" +#define MODEST_STOCK_NEW_MAIL "modest-stock-new-mail" +#define MODEST_STOCK_SEND_RECEIVE "modest-stock-send-receive" +#define MODEST_STOCK_REPLY "modest-stock-reply" +#define MODEST_STOCK_REPLY_ALL "modest-stock-reply-all" +#define MODEST_STOCK_FORWARD "modest-stock-forward" +#define MODEST_STOCK_DELETE "modest-stock-delete" +#define MODEST_STOCK_NEXT "modest-stock-next" +#define MODEST_STOCK_PREV "modest-stock-prev" +#define MODEST_STOCK_STOP "modest-stock-stop" + +#endif /*__MODEST_ICON_NAMES_H__*/ diff --git a/src/widgets/modest-main-window.h b/src/widgets/modest-main-window.h new file mode 100644 index 0000000..120da4a --- /dev/null +++ b/src/widgets/modest-main-window.h @@ -0,0 +1,47 @@ +/* modest-main-window.h */ +/* insert (c)/licensing information) */ + +#ifndef __MODEST_MAIN_WINDOW_H__ +#define __MODEST_MAIN_WINDOW_H__ + +#include +#include + +#ifdef HAVE_CONFIG_H +#include +#endif /*HAVE_CONFIG_H*/ + +G_BEGIN_DECLS + +/* convenience macros */ +#define MODEST_TYPE_MAIN_WINDOW (modest_main_window_get_type()) +#define MODEST_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),MODEST_TYPE_MAIN_WINDOW,ModestMainWindow)) +#define MODEST_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),MODEST_TYPE_MAIN_WINDOW,GtkWindow)) +#define MODEST_IS_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),MODEST_TYPE_MAIN_WINDOW)) +#define MODEST_IS_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),MODEST_TYPE_MAIN_WINDOW)) +#define MODEST_MAIN_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),MODEST_TYPE_MAIN_WINDOW,ModestMainWindowClass)) + +typedef struct _ModestMainWindow ModestMainWindow; +typedef struct _ModestMainWindowClass ModestMainWindowClass; + +struct _ModestMainWindow { + GtkWindow parent; + /* insert public members, if any */ +}; + +struct _ModestMainWindowClass { + GtkWindowClass parent_class; + /* insert signal callback declarations, eg. */ + /* void (* my_event) (ModestMainWindow* obj); */ +}; + +/* member functions */ +GType modest_main_window_get_type (void) G_GNUC_CONST; + + +GtkWidget* modest_main_window_new (ModestWidgetFactory *factory, + GtkUIManager *ui_manager); + +G_END_DECLS + +#endif /* __MODEST_MAIN_WINDOW_H__ */ diff --git a/tests/check_text-utils.c b/tests/check_text-utils.c index 76013b6..729d5f8 100644 --- a/tests/check_text-utils.c +++ b/tests/check_text-utils.c @@ -30,7 +30,7 @@ #include #include #include -#include +#include "modest-text-utils.h" typedef struct { const gchar *original; @@ -47,7 +47,7 @@ typedef struct { * - Test 4: Check issues in tests 1, 2 and 3 together * - Test 5: Check with an empty address */ -START_TEST (test_display_address_regular) +START_TEST (test_get_display_address_regular) { gint i; const StringPair tests[] = { @@ -76,7 +76,7 @@ END_TEST * Test invalid usage of modest_text_utils_get_display_address * - Test 1: Check with NULL address (should return NULL) */ -START_TEST (test_display_address_invalid) +START_TEST (test_get_display_address_invalid) { /* Test 1 */ fail_unless (modest_text_utils_get_display_address (NULL) == NULL, @@ -765,8 +765,8 @@ text_utils_suite (void) /* Tests case for "display adress" */ tc = tcase_create ("display_adress"); - tcase_add_test (tc, test_display_address_regular); - tcase_add_test (tc, test_display_address_invalid); + tcase_add_test (tc, test_get_display_address_regular); + tcase_add_test (tc, test_get_display_address_invalid); suite_add_tcase (suite, tc); /* Test case for "derived subject" */ -- 1.7.9.5