${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
<!ENTITY ModestTnyPlatformFactory SYSTEM "xml/modest-tny-platform-factory.xml">
<!ENTITY ModestTnyStoreActions SYSTEM "xml/modest-tny-store-actions.xml">
<!ENTITY ModestTnyStreamGtkhtml SYSTEM "xml/modest-tny-stream-gtkhtml.xml">
+<!ENTITY ModestUI SYSTEM "xml/modest-ui.xml">
<!ENTITY ModestWidgetFactory SYSTEM "xml/modest-widget-factory.xml">
<!ENTITY ModestWidgetMemory SYSTEM "xml/modest-widget-memory.xml">
<!ENTITY widgets-ModestComboBox SYSTEM "xml/modest-combo-box.xml">
<!ENTITY widgets-ModestFolderView SYSTEM "xml/modest-folder-view.xml">
<!ENTITY widgets-ModestHeaderView SYSTEM "xml/modest-header-view.xml">
+<!ENTITY widgets-ModestMainWindow SYSTEM "xml/modest-main-window.xml">
<!ENTITY widgets-ModestMsgView SYSTEM "xml/modest-msg-view.xml">
<!ENTITY widgets-modestToolbar SYSTEM "xml/modest-toolbar.xml">
<!ENTITY gtk-ModestAccountViewWindow SYSTEM "xml/modest-account-view-window.xml">
<!ENTITY gtk-ModestAccountAssistant SYSTEM "xml/modest-account-assistant.xml">
<!ENTITY gtk-ModestEditMsgWindow SYSTEM "xml/modest-edit-msg-window.xml">
-<!ENTITY gtk-ModestMainWindow SYSTEM "xml/modest-main-window.xml">
<!ENTITY gtk-ModestStoreWidget SYSTEM "xml/modest-store-widget.xml">
<!ENTITY gtk-modestTransportWidget SYSTEM "xml/modest-transport-widget.xml">
-<!ENTITY gtk-modestUi SYSTEM "xml/modest-ui.xml">
<!ENTITY index-Object-Tree SYSTEM "xml/tree_index.sgml">
&ModestTnyPlatformFactory;
&ModestTnyStoreActions;
&ModestTnyStreamGtkhtml;
+ &ModestUI;
&ModestWidgetFactory;
&ModestWidgetMemory;
</chapter>
- <chapter id="gtk">
- <title>Gtk</title>
- >k-ModestAccountViewWindow;
- >k-ModestAccountAssistant;
- >k-ModestEditMsgWindow;
- >k-ModestMainWindow;
- >k-ModestStoreWidget;
- >k-modestTransportWidget;
- >k-modestUi;
- </chapter>
<chapter id="widgets">
<title>Widgets</title>
&widgets-ModestAccountView;
&widgets-ModestComboBox;
&widgets-ModestFolderView;
&widgets-ModestHeaderView;
+ &widgets-ModestMainWindow;
&widgets-ModestMsgView;
&widgets-modestToolbar;
</chapter>
+ <chapter id="gtk">
+ <title>Gtk</title>
+ >k-ModestAccountViewWindow;
+ >k-ModestAccountAssistant;
+ >k-ModestEditMsgWindow;
+ >k-ModestStoreWidget;
+ >k-modestTransportWidget;
+ </chapter>
</reference>
<TITLE>ModestMainWindow</TITLE>
ModestMainWindow
modest_main_window_new
+modest_main_window_get_widget_factory
<SUBSECTION Standard>
MODEST_MAIN_WINDOW
MODEST_IS_MAIN_WINDOW
<TITLE>ModestMainWindow</TITLE>
ModestMainWindow
modest_main_window_new
+modest_main_window_get_widget_factory
<SUBSECTION Standard>
MODEST_MAIN_WINDOW
MODEST_IS_MAIN_WINDOW
<TITLE>ModestMainWindow</TITLE>
ModestMainWindow
modest_main_window_new
+modest_main_window_get_widget_factory
<SUBSECTION Standard>
MODEST_MAIN_WINDOW
MODEST_IS_MAIN_WINDOW
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
</SECTION>
<SECTION>
</SECTION>
<SECTION>
-<FILE>modest-widget-memory</FILE>
-modest_widget_memory_save
-modest_widget_memory_restore
-</SECTION>
-
-<SECTION>
-<FILE>modest-tny-msg-actions</FILE>
-modest_tny_msg_actions_find_body_part
-modest_tny_msg_actions_find_nth_part
-modest_tny_msg_actions_find_body
-</SECTION>
-
-<SECTION>
<FILE>modest-marshal</FILE>
modest_marshal_VOID__POINTER_POINTER
modest_marshal_VOID__POINTER_POINTER_POINTER
</SECTION>
<SECTION>
+<FILE>modest-widget-memory</FILE>
+modest_widget_memory_save
+modest_widget_memory_restore
+</SECTION>
+
+<SECTION>
+<FILE>modest-tny-msg-actions</FILE>
+modest_tny_msg_actions_find_body_part
+modest_tny_msg_actions_find_nth_part
+modest_tny_msg_actions_find_body
+</SECTION>
+
+<SECTION>
<FILE>modest-error</FILE>
ModestErrorDomain
ModestErrorCode
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
+</SECTION>
+
+<SECTION>
+<FILE>modest-ui-actions</FILE>
+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
</SECTION>
<SECTION>
</SECTION>
<SECTION>
-<FILE>modest-icon-names</FILE>
-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
-</SECTION>
-
-<SECTION>
<FILE>modest-tny-store-actions</FILE>
modest_tny_store_actions_create_folder
modest_tny_store_actions_remove_folder
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
</SECTION>
<SECTION>
</SECTION>
<SECTION>
-<FILE>modest-widget-memory</FILE>
-modest_widget_memory_save
-modest_widget_memory_restore
-</SECTION>
-
-<SECTION>
-<FILE>modest-tny-msg-actions</FILE>
-modest_tny_msg_actions_find_body_part
-modest_tny_msg_actions_find_nth_part
-modest_tny_msg_actions_find_body
-</SECTION>
-
-<SECTION>
<FILE>modest-marshal</FILE>
modest_marshal_VOID__POINTER_POINTER
modest_marshal_VOID__POINTER_POINTER_POINTER
</SECTION>
<SECTION>
+<FILE>modest-widget-memory</FILE>
+modest_widget_memory_save
+modest_widget_memory_restore
+</SECTION>
+
+<SECTION>
+<FILE>modest-tny-msg-actions</FILE>
+modest_tny_msg_actions_find_body_part
+modest_tny_msg_actions_find_nth_part
+modest_tny_msg_actions_find_body
+</SECTION>
+
+<SECTION>
<FILE>modest-error</FILE>
ModestErrorDomain
ModestErrorCode
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
+</SECTION>
+
+<SECTION>
+<FILE>modest-ui-actions</FILE>
+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
</SECTION>
<SECTION>
@arg1:
@arg2:
+<!-- ##### SIGNAL ModestAccountMgr::account-changed ##### -->
+<para>
+
+</para>
+
+@modestaccountmgr: the object which received the signal.
+@arg1:
+@arg2:
+@arg3:
+
+<!-- ##### SIGNAL ModestAccountMgr::account-removed ##### -->
+<para>
+
+</para>
+
+@modestaccountmgr: the object which received the signal.
+@arg1:
+@arg2:
+
<!-- ##### STRUCT ModestServerAccountData ##### -->
<para>
@arg1:
@arg2:
+<!-- ##### SIGNAL ModestConf::key-changed ##### -->
+<para>
+
+</para>
+
+@modestconf: the object which received the signal.
+@arg1:
+@arg2:
+
<!-- ##### FUNCTION modest_conf_new ##### -->
<para>
@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:
@:
@:
+<!-- ##### SIGNAL ModestFolderView::folder-selection-changed ##### -->
+<para>
+
+</para>
+
+@:
+@:
+@:
+
+<!-- ##### SIGNAL ModestFolderView::folder-selection-changed ##### -->
+<para>
+
+</para>
+
+@:
+@:
+@:
+
<!-- ##### FUNCTION modest_folder_view_new ##### -->
<para>
</para>
+<!-- ##### SIGNAL ModestHeaderView::header-selected ##### -->
+<para>
+
+</para>
+
+@modestheaderview: the object which received the signal.
+@arg1:
+
<!-- ##### SIGNAL ModestHeaderView::item-not-found ##### -->
<para>
@:
@:
-<!-- ##### SIGNAL ModestHeaderView::message-selected ##### -->
+<!-- ##### SIGNAL ModestHeaderView::status-update ##### -->
+<para>
+
+</para>
+
+@modestheaderview: the object which received the signal.
+@arg1:
+@arg2:
+@arg3:
+
+<!-- ##### SIGNAL ModestHeaderView::header-selected ##### -->
+<para>
+
+</para>
+
+@modestheaderview: the object which received the signal.
+@arg1:
+
+<!-- ##### SIGNAL ModestHeaderView::item-not-found ##### -->
<para>
</para>
</para>
+@modestheaderview: the object which received the signal.
+@arg1:
+@arg2:
+@arg3:
+
+<!-- ##### SIGNAL ModestHeaderView::header-selected ##### -->
+<para>
+
+</para>
+
+@modestheaderview: the object which received the signal.
+@arg1:
+
+<!-- ##### SIGNAL ModestHeaderView::item-not-found ##### -->
+<para>
+
+</para>
+
@:
@:
-@:
-@:
+
+<!-- ##### SIGNAL ModestHeaderView::status-update ##### -->
+<para>
+
+</para>
+
+@modestheaderview: the object which received the signal.
+@arg1:
+@arg2:
+@arg3:
<!-- ##### FUNCTION modest_header_view_new ##### -->
<para>
<!-- ##### SECTION Stability_Level ##### -->
-<!-- ##### MACRO PIXMAP_PREFIX ##### -->
-<para>
-
-</para>
-
-
-
<!-- ##### MACRO MODEST_APP_ICON ##### -->
<para>
@:
+<!-- ##### SIGNAL ModestMailOperation::progress-changed ##### -->
+<para>
+
+</para>
+
+@:
+
<!-- ##### FUNCTION modest_mail_operation_new ##### -->
<para>
</para>
@factory:
+@ui_manager:
@Returns:
@:
@:
+<!-- ##### SIGNAL ModestMsgView::attachment-clicked ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
+<!-- ##### SIGNAL ModestMsgView::link-clicked ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
+<!-- ##### SIGNAL ModestMsgView::link-hover ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
+<!-- ##### SIGNAL ModestMsgView::attachment-clicked ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
+<!-- ##### SIGNAL ModestMsgView::link-clicked ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
+<!-- ##### SIGNAL ModestMsgView::link-hover ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
<!-- ##### FUNCTION modest_msg_view_new ##### -->
<para>
@modeststorewidget: the object which received the signal.
+<!-- ##### SIGNAL ModestStoreWidget::data-changed ##### -->
+<para>
+
+</para>
+
+@modeststorewidget: the object which received the signal.
+
+<!-- ##### SIGNAL ModestStoreWidget::data-changed ##### -->
+<para>
+
+</para>
+
+@modeststorewidget: the object which received the signal.
+
+<!-- ##### SIGNAL ModestStoreWidget::data-changed ##### -->
+<para>
+
+</para>
+
+@modeststorewidget: the object which received the signal.
+
<!-- ##### FUNCTION modest_store_widget_new ##### -->
<para>
@Returns:
-<!-- ##### FUNCTION modest_text_utils_display_address ##### -->
+<!-- ##### FUNCTION modest_text_utils_get_display_address ##### -->
<para>
</para>
@Returns:
+<!-- ##### FUNCTION modest_text_utils_get_subject_prefix_len ##### -->
+<para>
+
+</para>
+
+@subject:
+@Returns:
+
+
+<!-- ##### FUNCTION modest_text_utils_utf8_strcmp ##### -->
+<para>
+
+</para>
+
+@s1:
+@s2:
+@insensitive:
+@Returns:
+
+
+<!-- ##### FUNCTION modest_text_utils_get_display_date ##### -->
+<para>
+
+</para>
+
+@date:
+@Returns:
+
+
@Param4:
@Param5:
+<!-- ##### SIGNAL ModestTnyAccountStore::account-update ##### -->
+<para>
+
+</para>
+
+@modesttnyaccountstore: the object which received the signal.
+@arg1:
+
+<!-- ##### SIGNAL ModestTnyAccountStore::password-requested ##### -->
+<para>
+
+</para>
+
+@:
+@Param2:
+@Param3:
+@Param4:
+@Param5:
+
<!-- ##### FUNCTION modest_tny_account_store_new ##### -->
<para>
@:
@:
+<!-- ##### SIGNAL ModestToolbar::button-clicked ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
+<!-- ##### SIGNAL ModestToolbar::button-clicked ##### -->
+<para>
+
+</para>
+
+@:
+@:
+
<!-- ##### FUNCTION modest_toolbar_new ##### -->
<para>
</para>
+@account_store:
@Returns:
@parent:
+<!-- ##### SIGNAL ModestHeaderView::message-selected ##### -->
+<para>
+
+</para>
+
+@modestheaderview: the object which received the signal.
+@arg1:
+
<!-- ##### STRUCT ModestOpenWindow ##### -->
<para>
</para>
+<!-- ##### MACRO PIXMAP_PREFIX ##### -->
+<para>
+
+</para>
+
+
<!-- ##### FUNCTION modest_account_mgr_get_account_bool ##### -->
<para>
@subject:
@Returns:
+<!-- ##### FUNCTION modest_text_utils_display_address ##### -->
+<para>
+
+</para>
+
+@address:
+@Returns:
+
<!-- ##### FUNCTION modest_text_utils_remove_mail_from_mail_list ##### -->
<para>
@attachments_list:
@Returns:
+<!-- ##### FUNCTION modest_ui_actions_on_about ##### -->
+<para>
+
+</para>
+
+@widget:
+@user_data:
+
+<!-- ##### FUNCTION modest_ui_actions_on_accounts ##### -->
+<para>
+
+</para>
+
+@widget:
+@main_window:
+
+<!-- ##### FUNCTION modest_ui_actions_on_delete ##### -->
+<para>
+
+</para>
+
+@widget:
+@main_window:
+
+<!-- ##### FUNCTION modest_ui_actions_on_new_msg ##### -->
+<para>
+
+</para>
+
+@widget:
+@main_window:
+
+<!-- ##### FUNCTION modest_ui_actions_on_quit ##### -->
+<para>
+
+</para>
+
+@widget:
+@main_window:
+
+<!-- ##### FUNCTION modest_ui_actions_on_reply_forward ##### -->
+<para>
+
+</para>
+
+@widget:
+@main_window:
+
<!-- ##### FUNCTION modest_ui_editor_window_set_bcc_header ##### -->
<para>
@ui:
@Returns:
+<!-- ##### FUNCTION modest_widget_factory_get_edit_toolbar ##### -->
+<para>
+
+</para>
+
+@self:
+@items:
+@Returns:
+
+<!-- ##### FUNCTION modest_widget_factory_get_main_toolbar ##### -->
+<para>
+
+</para>
+
+@self:
+@items:
+@Returns:
+
<!-- ##### FUNCTION modest_window_mgr_find_by_id ##### -->
<para>
@Returns:
-<!-- ##### FUNCTION modest_widget_factory_get_main_toolbar ##### -->
-<para>
-
-</para>
-
-@self:
-@items:
-@Returns:
-
-
-<!-- ##### FUNCTION modest_widget_factory_get_edit_toolbar ##### -->
-<para>
-
-</para>
-
-@self:
-@items:
-@Returns:
-
-
$(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
modest-protocol-mgr.c\
modest-proto.h\
modest-proto.c\
+ modest-ui.c\
modest-ui.h\
modest-text-utils.h\
modest-text-utils.c\
$(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)
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=\
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 \
EXTRA_DIST=pixmaps/*
-pixmapdir = $(prefix)/share/modest/pixmaps
+pixmapdir = $(datadir)/pixmaps/modest
pixmap_DATA = $(PIXMAP_FILES)
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;
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
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);
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);
*/
#include <glib/gi18n.h>
#include <tny-account-store.h>
+#include "modest-toolbar.h"
#include "modest-edit-msg-window.h"
#include "modest-widget-memory.h"
#include "modest-mail-operation.h"
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",
+++ /dev/null
-/* 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 <gtk/gtk.h>
-#include <tny-msg.h>
-#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__ */
-
+++ /dev/null
-/* 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__*/
*/
#include <glib/gi18n.h>
-#include <gtk/gtkaboutdialog.h>
#include <gtk/gtktreeviewcolumn.h>
-#include <modest-widget-memory.h>
-#include <modest-icon-factory.h>
-
-#include <widgets/modest-toolbar.h>
-
#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);
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 {
typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
struct _ModestMainWindowPrivate {
+ GtkUIManager *ui_manager;
+
GtkWidget *toolbar;
GtkWidget *menubar;
}
-static void
-on_menu_about (GtkWidget *widget, gpointer data)
-{
- GtkWidget *about;
- const gchar *authors[] = {
- "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
- 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, "<Branch>", NULL },
- { "/File/_New", "<control>N", NULL, 0, "<StockItem>", GTK_STOCK_NEW },
- { "/File/_Open", "<control>O", NULL, 0, "<StockItem>", GTK_STOCK_OPEN },
- { "/File/_Save", "<control>S", NULL, 0, "<StockItem>", GTK_STOCK_SAVE },
- { "/File/Save _As", NULL, NULL, 0, "<Item>", NULL },
- { "/File/sep1", NULL, NULL, 0, "<Separator>", NULL },
- { "/File/_Quit", "<CTRL>Q", on_menu_quit, 0, "<StockItem>", GTK_STOCK_QUIT },
-
- { "/_Edit", NULL, NULL, 0, "<Branch>", NULL },
- { "/Edit/_Undo", "<CTRL>Z", NULL, 0, "<StockItem>", GTK_STOCK_UNDO },
- { "/Edit/_Redo", "<shift><CTRL>Z", NULL, 0, "<StockItem>", GTK_STOCK_REDO },
- { "/Edit/sep1", NULL, NULL, 0, "<Separator>", NULL },
- { "/Edit/Cut", "<control>X", NULL, 0, "<StockItem>", GTK_STOCK_CUT },
- { "/Edit/Copy", "<CTRL>C", NULL, 0, "<StockItem>", GTK_STOCK_COPY },
- { "/Edit/Paste", NULL, NULL, 0, "<StockItem>", GTK_STOCK_PASTE},
- { "/Edit/sep2", NULL, NULL, 0, "<Separator>", NULL },
- { "/Edit/Delete", "<CTRL>Q", NULL, 0, "<Item>" ,NULL},
- { "/Edit/Select all", "<CTRL>A", NULL, 0, "<Item>" ,NULL},
- { "/Edit/Deelect all", "<Shift><CTRL>A", NULL, 0, "<Item>" ,NULL},
-
- { "/_Actions", NULL, NULL, 0, "<Branch>" ,NULL},
- { "/Actions/_New Message", NULL, on_menu_new_message, 0, "<Item>",NULL },
- { "/Actions/_Reply", NULL, on_menu_reply_forward, 1, "<Item>" ,NULL},
- { "/Actions/_Forward", NULL, on_menu_reply_forward, 3, "<Item>" ,NULL},
- { "/Actions/_Bounce", NULL, NULL, 0, "<Item>",NULL },
-
- { "/_Options", NULL, NULL, 0, "<Branch>" ,NULL},
- { "/Options/_Accounts", NULL, on_menu_accounts,0, "<Item>" ,NULL},
- { "/Options/_Contacts", NULL, NULL, 0, "<Item>" ,NULL },
-
-
- { "/_Help", NULL, NULL, 0, "<Branch>" ,NULL},
- { "/_Help/About", NULL, on_menu_about, 0, "<StockItem>", 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, "<main>",
- 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, "<main>");
-}
-
-
-
-
static ModestHeaderView*
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)
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;
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);
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 ();
+++ /dev/null
-/* modest-main-window.h */
-/* insert (c)/licensing information) */
-
-#ifndef __MODEST_MAIN_WINDOW_H__
-#define __MODEST_MAIN_WINDOW_H__
-
-#include <gtk/gtkwindow.h>
-#include <modest-widget-factory.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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__ */
-
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;
}
+++ /dev/null
-/* 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 <gtk/gtk.h>
-#include <glade/glade.h>
-#include <glib/gi18n.h>
-#include <string.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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;
-}
+++ /dev/null
-/* 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 <gtk/gtk.h>
-#include <tny-msg.h>
-#include <hildon-widgets/hildon-window.h>
-
-#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__ */
-
+++ /dev/null
-/* 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__*/
*/
#include <glib/gi18n.h>
-#include <string.h>
-#include <gtk/gtkaboutdialog.h>
#include <gtk/gtktreeviewcolumn.h>
-#include <modest-widget-memory.h>
-#include <modest-icon-factory.h>
-
-#include <widgets/modest-toolbar.h>
-
#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);
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;
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;
(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);
}
}
-static void
-on_menu_about (GtkWidget *widget, gpointer data)
-{
- GtkWidget *about;
- const gchar *authors[] = {
- "Dirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>",
- 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=
-// "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- "<ui>"
- " <popup>"
- " <menu name=\"Message\" action=\"MenuMessage\">"
- " <menuitem name=\"New\" action=\"on_menu_new_message\" />"
- " </menu>"
- " <menu name=\"JustifyMenu\" action=\"JustifyMenuAction\">"
- " <menuitem name=\"Left\" action=\"justify-left\"/>"
- " <menuitem name=\"Centre\" action=\"justify-center\"/>"
- " <menuitem name=\"Right\" action=\"justify-right\"/>"
- " <menuitem name=\"Fill\" action=\"justify-fill\"/>"
- " </menu>"
- " </popup>"
- "</ui>";
-
-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)
{
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);
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;
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");
}
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*
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);
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),
/* 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);
+++ /dev/null
-/* modest-main-window.h */
-/* insert (c)/licensing information) */
-
-#ifndef __MODEST_MAIN_WINDOW_H__
-#define __MODEST_MAIN_WINDOW_H__
-
-#include <hildon-widgets/hildon-window.h>
-#include <modest-widget-factory.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#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__ */
-
+++ /dev/null
-/* 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 <gtk/gtk.h>
-#include <glade/glade.h>
-#include <glib/gi18n.h>
-#include <string.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif /*HAVE_CONFIG_H*/
-
-#include <hildon-widgets/hildon-program.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;
- 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;
-}
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
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 {
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)
{
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);
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;
{ 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);
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");
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);
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);
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;
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;
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);
*
* 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);
/**
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));
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 */
gboolean remember;
pwd = NULL;
- gdk_threads_enter ();
-
g_signal_emit (G_OBJECT(self), signals[PASSWORD_REQUESTED_SIGNAL], 0,
name, &pwd, cancel, &remember);
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
g_free (pwd);
pwd = NULL;
}
- gdk_threads_leave ();
} else
*cancel = FALSE;
+ gdk_threads_leave ();
+
return pwd;
}
TRUE, NULL);
}
-
-
/* create a tnyaccount for the server account connected to the account with name 'key'
*/
static TnyAccount*
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));
/* modest-tny-platform-factory.c */
#include <config.h>
+#include <tny-camel-header.h>
+#include <tny-camel-mime-part.h>
+#include <tny-camel-msg.h>
+
/* MODES_PLATFORM_ID: 1 ==> gtk, 2==> maemo */
#if MODEST_PLATFORM_ID==1
#include <tny-gnome-device.h>
--- /dev/null
+/* 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 <gtk/gtk.h>
+#include <glade/glade.h>
+#include <glib/gi18n.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif /*HAVE_CONFIG_H*/
+
+#include <glib/gi18n.h>
+#include <gtk/gtkuimanager.h>
+#include <tny-error.h>
+#include <tny-simple-list.h>
+#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"), "<CTRL>N", N_("Compose new message"), G_CALLBACK (modest_ui_actions_on_new_msg) },
+ { "FileOpen", GTK_STOCK_OPEN, N_("_Open"), "<CTRL>O", N_("Open a message"), NULL },
+ { "FileSave", GTK_STOCK_SAVE, N_("_Save"), "<CTRL>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"), "<CTRL>Q", N_("Exit the application"), G_CALLBACK (modest_ui_actions_on_quit) },
+
+ /* EDIT menu */
+ { "EditUndo", GTK_STOCK_UNDO, N_("_Undo"), "<CTRL>Z", N_("Undo last action"), NULL },
+ { "EditRedo", GTK_STOCK_REDO, N_("_Redo"), "<shift><CTRL>Z", N_("Redo previous action"), NULL },
+ { "EditCut", GTK_STOCK_CUT, N_("Cut"), "<CTRL>X", N_("_Cut"), NULL },
+ { "EditCopy", GTK_STOCK_COPY, N_("Copy"), "<CTRL>C", N_("Copy"), NULL },
+ { "EditPaste", GTK_STOCK_PASTE, N_("Paste"), "<CTRL>V", N_("Paste"), NULL },
+ { "EditDelete", GTK_STOCK_DELETE, N_("_Delete"), "<CTRL>Q", N_("Delete"), NULL },
+ { "EditSelectAll", NULL, N_("Select all"), "<CTRL>A", N_("Select all"), NULL },
+ { "EditDeselectAll", NULL, N_("Deselect all"), "<Shift><CTRL>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 <dirk-jan.binnema@nokia.com>",
+ 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 */
+}
#define __MODEST_UI_H__
#include <glib-object.h>
-#include <gtk/gtkcontainer.h>
-#include "modest-conf.h"
-#include "widgets/modest-msg-view.h"
+#include <tny-account-store.h>
G_BEGIN_DECLS
/* void (* my_event) (ModestUI* obj); */
};
-
/**
* modest_ui_get_type:
*
/**
* 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__ */
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, */
ModestHeaderView *header_view;
ModestFolderView *folder_view;
ModestMsgView *msg_preview;
- ModestToolbar *main_toolbar, *edit_toolbar;
GtkWidget *progress_bar;
GtkWidget *status_bar;
}
-
-/* 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)
{
the current folder */
priv->folder_info_label = gtk_label_new (NULL);
- init_signals (self);
+/* init_signals (self); */
return TRUE;
}
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)); */
+/* } */
#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
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
--- /dev/null
+<!--
+ * 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.
+-->
+
+<ui>
+
+ <menubar name="MenuBar">
+ <menu name="FileMenu" action="File">
+ <menuitem name="FileNewMenu" action="FileNew"/>
+ <menuitem name="FileOpenMenu" action="FileOpen"/>
+ <separator/>
+ <menuitem name="FileSaveMenu" action="FileSave"/>
+ <menuitem name="FileSaveAsMenu" action="FileSaveAs"/>
+ <separator/>
+ <menuitem name="FileQuitMenu" action="FileQuit"/>
+ </menu>
+
+ <menu name="EditMenu" action="Edit">
+ <menuitem name="EditUndoMenu" action="EditUndo"/>
+ <menuitem name="EditRedoMenu" action="EditRedo"/>
+ <separator/>
+ <menuitem name="EditCutMenu" action="EditCut"/>
+ <menuitem name="EditCopyMenu" action="EditCopy"/>
+ <menuitem name="EditPasteMenu" action="EditPaste"/>
+ <menuitem name="EditDeleteMenu" action="EditDelete"/>
+ <separator/>
+ <menuitem name="EditSelectAllMenu" action="EditSelectAll"/>
+ <menuitem name="EditDeselectAllMenu" action="EditDeselectAll"/>
+ </menu>
+
+ <menu name="ActionsMenu" action="Actions">
+ <menuitem name="ActionsNewMenu" action="ActionsNew"/>
+ <menuitem name="ActionsReplyMenu" action="ActionsReply"/>
+ <menuitem name="ActionsForwardMenu" action="ActionsForward"/>
+ <menuitem name="ActionsBounceMenu" action="ActionsBounce"/>
+ </menu>
+
+ <menu name="OptionsMenu" action="Options">
+ <menuitem name="OptionsAccountsMenu" action="OptionsAccounts"/>
+ <menuitem name="OptionsContactsMenu" action="OptionsContacts"/>
+ </menu>
+
+ <menu name="HelpMenu" action="Help">
+ <menuitem name="HelpAboutMenu" action="HelpAbout"/>
+ </menu>
+ </menubar>
+
+ <toolbar name="ToolBar">
+ <toolitem action="ActionsNew"/>
+ <separator/>
+ <toolitem action="ActionsReply"/>
+ <toolitem action="ActionsReplyAll"/>
+ <toolitem action="ActionsForward"/>
+ <separator/>
+ <toolitem action="ActionsSendReceive"/>
+ <separator/>
+ <toolitem action="GotoPrevious"/>
+ <toolitem action="GotoNext"/>
+ <separator/>
+ <toolitem action="ActionsDelete"/>
+ </toolbar>
+
+</ui>
$(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=\
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
--- /dev/null
+/* 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 <gtk/gtk.h>
+#include <tny-msg.h>
+#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__ */
+
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);
}
-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)
{
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));
-}
#define MODEST_HEADER_VIEW_PTR "modest-header-view"
enum {
- MESSAGE_SELECTED_SIGNAL,
+ HEADER_SELECTED_SIGNAL,
ITEM_NOT_FOUND_SIGNAL,
STATUS_UPDATE_SIGNAL,
LAST_SIGNAL
MODEST_TYPE_HEADER_VIEW, \
ModestHeaderViewPrivate))
-typedef struct _GetMsgAsyncHelper {
- ModestHeaderView *self;
- TnyHeader *header;
-} GetMsgAsyncHelper;
-
/* globals */
static GObjectClass *parent_class = NULL;
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);
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
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)
return gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
}
-
-
-
gboolean
modest_header_view_set_style (ModestHeaderView *self,
ModestHeaderViewStyle style)
GtkTreeModel *sortable;
ModestHeaderView *self;
ModestHeaderViewPrivate *priv;
+ GError *error = NULL;
if (cancelled)
return;
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));
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 */
}
}
}
/* 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;
GtkTreeIter iter;
ModestHeaderView *self;
ModestHeaderViewPrivate *priv;
- TnyFolder *folder;
- GetMsgAsyncHelper *helper;
g_return_if_fail (sel);
g_return_if_fail (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);
}
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,
*/
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
--- /dev/null
+/* 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__*/
--- /dev/null
+/* modest-main-window.h */
+/* insert (c)/licensing information) */
+
+#ifndef __MODEST_MAIN_WINDOW_H__
+#define __MODEST_MAIN_WINDOW_H__
+
+#include <gtk/gtkwindow.h>
+#include <modest-widget-factory.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#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__ */
#include <check.h>
#include <stdlib.h>
#include <string.h>
-#include <modest-text-utils.h>
+#include "modest-text-utils.h"
typedef struct {
const gchar *original;
* - 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[] = {
* 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,
/* 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" */