/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2007 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
{"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
{"Tools/---", NULL, "---", NULL, NULL, NULL },
- {"Tools/CreateFilterRule", NULL, "_Create filter rule" },
+ {"Tools/CreateFilterRule", NULL, N_("_Create filter rule") },
{"Tools/CreateFilterRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
{"Tools/CreateFilterRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
{"Tools/CreateFilterRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO */
{"Tools/CreateFilterRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
- {"Tools/CreateProcessingRule", NULL, "Create processing rule" },
+ {"Tools/CreateProcessingRule", NULL, N_("Create processing rule") },
{"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
{"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
{"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
#ifndef MAEMO
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
#else
- MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENU)
+ MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_POPUP)
#endif
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
gtk_widget_set_size_request(window, prefs_common.msgwin_width,
prefs_common.msgwin_height);
+#ifdef G_OS_WIN32
+ gtk_window_move(GTK_WINDOW(window), 48, 48);
+#endif
msgview = messageview_create(mainwin);
{
char *src;
- g_return_if_fail(src_ != NULL);
- g_return_if_fail(dest != NULL);
+ cm_return_if_fail(src_ != NULL);
+ cm_return_if_fail(dest != NULL);
if (len < 1) return;
return encinfo;
}
+static gboolean find_broken_func(GNode *node, gpointer data)
+{
+ MimeInfo *mimeinfo = (MimeInfo *) node->data;
+ MimeInfo **brokeninfo = (MimeInfo **) data;
+
+ if (mimeinfo->broken) {
+ *brokeninfo = mimeinfo;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static MimeInfo *find_broken_part(MimeInfo *rootinfo)
+{
+ MimeInfo *brokeninfo = NULL;
+
+ g_node_traverse(rootinfo->node, G_IN_ORDER, G_TRAVERSE_ALL, -1,
+ find_broken_func, &brokeninfo);
+
+ return brokeninfo;
+}
+
gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
gboolean all_headers)
{
+ gchar *text = NULL;
gchar *file;
- MimeInfo *mimeinfo, *encinfo;
+ MimeInfo *mimeinfo, *encinfo, *brokeninfo;
gchar *subject = NULL;
- g_return_val_if_fail(msginfo != NULL, -1);
+ cm_return_val_if_fail(msginfo != NULL, -1);
if (msginfo != messageview->msginfo)
messageview->show_full_text = FALSE;
while ((encinfo = find_encrypted_part(mimeinfo)) != NULL) {
debug_print("decrypting message part\n");
if (privacy_mimeinfo_decrypt(encinfo) < 0) {
- alertpanel_error(_("Couldn't decrypt: %s"),
- privacy_get_error());
+ text = g_strdup_printf(_("Couldn't decrypt: %s"),
+ privacy_get_error());
+ noticeview_show(messageview->noticeview);
+ noticeview_set_icon(messageview->noticeview,
+ STOCK_PIXMAP_NOTICE_WARN);
+ noticeview_set_text(messageview->noticeview, text);
+ gtk_widget_hide(messageview->noticeview->button);
+ gtk_widget_hide(messageview->noticeview->button2);
+ g_free(text);
break;
}
}
return_receipt_show(messageview->noticeview,
messageview->msginfo);
+ if ((brokeninfo = find_broken_part(mimeinfo)) != NULL) {
+ noticeview_set_icon(messageview->noticeview,
+ STOCK_PIXMAP_NOTICE_WARN);
+ if (!noticeview_is_visible(messageview->noticeview)) {
+ noticeview_set_text(messageview->noticeview, _("Message doesn't conform to MIME standard. "
+ "It may render wrongly."));
+ gtk_widget_hide(messageview->noticeview->button);
+ gtk_widget_hide(messageview->noticeview->button2);
+ } else {
+ gchar *full = g_strconcat(
+ gtk_label_get_text(GTK_LABEL(messageview->noticeview->text)),
+ "\n",
+ _("Message doesn't conform to MIME standard. "
+ "It may render wrongly."), NULL);
+ noticeview_set_text(messageview->noticeview, full);
+ g_free(full);
+ }
+ noticeview_show(messageview->noticeview);
+ }
+
mimeinfo = procmime_mimeinfo_next(mimeinfo);
if (!all_headers && mimeinfo
&& (mimeinfo->type != MIMETYPE_TEXT ||
MimeInfo *alt_parent = mimeinfo;
/* if multipart/{related,mixed} part, look inside for a multipart/alternative child */
- if (prefs_common.promote_html_part &&
- mimeinfo->type == MIMETYPE_MULTIPART &&
+ if (mimeinfo->type == MIMETYPE_MULTIPART &&
(!strcasecmp(mimeinfo->subtype, "related") ||
!strcasecmp(mimeinfo->subtype, "mixed"))) {
for (; mimeinfo; mimeinfo = procmime_mimeinfo_next(mimeinfo)) {
break;
}
if (mimeinfo->type == MIMETYPE_TEXT &&
- !strcasecmp(mimeinfo->subtype, "html")) {
- /* we got it */
+ !strcasecmp(mimeinfo->subtype, "calendar") &&
+ mimeview_has_viewer_for_content_type(messageview->mimeview,
+ "text/calendar")) {
+ mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
+ goto done;
+ } else if (mimeinfo->type == MIMETYPE_TEXT &&
+ !strcasecmp(mimeinfo->subtype, "html") &&
+ prefs_common.promote_html_part) {
mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
goto done;
}
/* if we now have a multipart/alternative part (possibly inside a
* multipart/{related,mixed} part, look for an HTML part inside */
- if (prefs_common.promote_html_part && mimeinfo &&
- mimeinfo->type == MIMETYPE_MULTIPART &&
+ if (mimeinfo && mimeinfo->type == MIMETYPE_MULTIPART &&
!strcasecmp(mimeinfo->subtype, "alternative")) {
for (; mimeinfo; mimeinfo = procmime_mimeinfo_next(mimeinfo)) {
if (mimeinfo->node->parent != alt_parent->node) {
continue;
}
if (mimeinfo->type == MIMETYPE_TEXT &&
- !strcasecmp(mimeinfo->subtype, "html")) {
- /* we got it */
+ !strcasecmp(mimeinfo->subtype, "calendar") &&
+ mimeview_has_viewer_for_content_type(messageview->mimeview,
+ "text/calendar")) {
+ mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
+ goto done;
+ } else if (mimeinfo->type == MIMETYPE_TEXT &&
+ !strcasecmp(mimeinfo->subtype, "html") &&
+ prefs_common.promote_html_part) {
mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
goto done;
}
}
}
done:
+ /* plugins may hook in here to work with the message view */
+ hooks_invoke(MESSAGE_VIEW_SHOW_DONE_HOOKLIST, messageview);
+
g_free(file);
return 0;
} else {
msginfo = msgview->msginfo;
- g_return_if_fail(msginfo != NULL);
+ cm_return_if_fail(msginfo != NULL);
/* to get the trash folder, we have to choose either
* the folder's or account's trash default - we prefer
trash = folder_get_default_trash();
}
- g_return_if_fail(trash != NULL);
+ cm_return_if_fail(trash != NULL);
if (prefs_common.immediate_exec)
/* TODO: Delete from trash */
{
SummaryView *summaryview = (SummaryView*)msgview->mainwin->summaryview;
- g_return_if_fail(summaryview != NULL);
+ cm_return_if_fail(summaryview != NULL);
if (summaryview->selected) {
MsgInfo *msginfo = summary_get_selected_msg(summaryview);
static void messageview_size_allocate_cb(GtkWidget *widget,
GtkAllocation *allocation)
{
- g_return_if_fail(allocation != NULL);
+ cm_return_if_fail(allocation != NULL);
prefs_common.msgwin_width = allocation->width;
prefs_common.msgwin_height = allocation->height;
return TRUE;
}
- if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK|GDK_SHIFT_MASK)) != 0)
+ if (event && (event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK|GDK_SHIFT_MASK)) != 0)
return FALSE;
g_signal_stop_emission_by_name(G_OBJECT(widget),
GtkWidget *optmenu;
gint account_id;
- g_return_val_if_fail(ac_list != NULL, NULL);
- g_return_val_if_fail(ac_list->data != NULL, NULL);
+ cm_return_val_if_fail(ac_list != NULL, NULL);
+ cm_return_val_if_fail(ac_list->data != NULL, NULL);
optmenu = gtkut_account_menu_new(ac_list,
G_CALLBACK(select_account_cb),
GtkTextBuffer *textbuf;
gint body_pos = 0;
- g_return_val_if_fail(msgview != NULL, NULL);
+ cm_return_val_if_fail(msgview != NULL, NULL);
if (msgview->mimeview->type == MIMEVIEW_VIEWER) {
MimeViewer *viewer = msgview->mimeview->mimeviewer;
}
textview = messageview_get_current_textview(msgview);
- g_return_val_if_fail(textview != NULL, NULL);
+ cm_return_val_if_fail(textview != NULL, NULL);
edit = GTK_TEXT_VIEW(textview->text);
- g_return_val_if_fail(edit != NULL, NULL);
+ cm_return_val_if_fail(edit != NULL, NULL);
body_pos = textview->body_pos;
textbuf = gtk_text_view_get_buffer(edit);
#if !defined(USE_GNOMEPRINT) && !GTK_CHECK_VERSION(2,10,0)
cmdline = input_dialog(_("Print"),
- _("Enter the print command line:\n"
+ _("Enter the print command-line:\n"
"('%s' will be replaced with file name)"),
prefs_common.print_cmd);
if (!cmdline) return;
if (!(p = strchr(cmdline, '%')) || *(p + 1) != 's' ||
strchr(p + 2, '%')) {
- alertpanel_error(_("Print command line is invalid:\n'%s'"),
+ alertpanel_error(_("Print command-line is invalid:\n'%s'"),
cmdline);
g_free(cmdline);
return;
gint action = COMPOSE_REPLY;
const gchar *a_name = gtk_action_get_name(gaction);
- g_return_if_fail(messageview->msginfo);
+ cm_return_if_fail(messageview->msginfo);
DO_ACTION("Message/Reply", COMPOSE_REPLY);
DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);