diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | ChangeLog.ja | 12 | ||||
-rw-r--r-- | libsylph/filter.c | 23 | ||||
-rw-r--r-- | libsylph/procmsg.h | 1 | ||||
-rw-r--r-- | libsylph/virtual.c | 19 | ||||
-rw-r--r-- | src/compose.c | 2 | ||||
-rw-r--r-- | src/folderview.c | 1 | ||||
-rw-r--r-- | src/prefs_folder_item.c | 4 | ||||
-rw-r--r-- | src/summary_search.c | 11 | ||||
-rw-r--r-- | src/summaryview.c | 24 |
10 files changed, 93 insertions, 16 deletions
@@ -1,3 +1,15 @@ +2005-12-21 + + * libsylph/virtual.c + libsylph/filter.c + src/summary_search.c + src/prefs_folder_item.c + src/folderview.c: show progress when opening search folder. Don't + allow the search of search folder. + * libsylph/procmsg.h + src/compose.c + src/summaryview.c: added MSG_FLAG_CHANGED flag. + 2005-12-20 * src/compose.c: compose_is_itemized(): also check for enumerated diff --git a/ChangeLog.ja b/ChangeLog.ja index 9475fedd..3d8a2f27 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,3 +1,15 @@ +2005-12-21 + + * libsylph/virtual.c + libsylph/filter.c + src/summary_search.c + src/prefs_folder_item.c + src/folderview.c: 検索フォルダを開く時に進捗を表示するようにした。 + 検索フォルダの検索ができないようにした。 + * libsylph/procmsg.h + src/compose.c + src/summaryview.c: MSG_FLAG_CHANGED フラグを追加。 + 2005-12-20 * src/compose.c: compose_is_itemized(): (1), (2), 3. ... のように列挙 diff --git a/libsylph/filter.c b/libsylph/filter.c index dc2be18b..019ad24c 100644 --- a/libsylph/filter.c +++ b/libsylph/filter.c @@ -543,6 +543,7 @@ static gboolean filter_xml_node_func(GNode *node, gpointer data) const gchar *type = NULL; const gchar *name = NULL; const gchar *value = NULL; + gboolean case_sens = FALSE; FilterCond *cond; FilterCondType cond_type = FLT_COND_HEADER; FilterMatchType match_type = FLT_CONTAIN; @@ -555,22 +556,28 @@ static gboolean filter_xml_node_func(GNode *node, gpointer data) XMLAttr *attr = (XMLAttr *)list->data; if (!attr || !attr->name || !attr->value) continue; - if (!strcmp(attr->name, "type")) + + STR_SWITCH(attr->name) + STR_CASE_BEGIN("type") type = attr->value; - else if (!strcmp(attr->name, "name")) + STR_CASE("name") name = attr->value; - else if (!strcmp(attr->name, "recursive")) { + STR_CASE("case") + case_sens = TRUE; + STR_CASE("recursive") if (!strcmp(attr->value, "true")) recursive = TRUE; else recursive = FALSE; - } + STR_CASE_END } if (type) { filter_rule_match_type_str_to_enum (type, &match_type, &match_flag); } + if (case_sens) + match_flag |= FLT_CASE_SENS; value = xmlnode->element; STR_SWITCH(xmlnode->tag->tag) @@ -799,18 +806,26 @@ void filter_write_file(GSList *list, const gchar *file) NODE_NEW("match-header", cond->str_value); ADD_ATTR("type", match_type); ADD_ATTR("name", cond->header_name); + if (FLT_IS_CASE_SENS(cond->match_flag)) + ADD_ATTR("case", "true"); break; case FLT_COND_ANY_HEADER: NODE_NEW("match-any-header", cond->str_value); ADD_ATTR("type", match_type); + if (FLT_IS_CASE_SENS(cond->match_flag)) + ADD_ATTR("case", "true"); break; case FLT_COND_TO_OR_CC: NODE_NEW("match-to-or-cc", cond->str_value); ADD_ATTR("type", match_type); + if (FLT_IS_CASE_SENS(cond->match_flag)) + ADD_ATTR("case", "true"); break; case FLT_COND_BODY: NODE_NEW("match-body-text", cond->str_value); ADD_ATTR("type", match_type); + if (FLT_IS_CASE_SENS(cond->match_flag)) + ADD_ATTR("case", "true"); break; case FLT_COND_CMD_TEST: NODE_NEW("command-test", cond->str_value); diff --git a/libsylph/procmsg.h b/libsylph/procmsg.h index 8cae4440..c8a3ba16 100644 --- a/libsylph/procmsg.h +++ b/libsylph/procmsg.h @@ -88,6 +88,7 @@ typedef guint32 MsgPermFlags; #define MSG_IMAP (1U << 19) #define MSG_NEWS (1U << 20) #define MSG_SIGNED (1U << 21) +#define MSG_FLAG_CHANGED (1U << 27) #define MSG_CACHED (1U << 28) #define MSG_MIME (1U << 29) #define MSG_INVALID (1U << 30) diff --git a/libsylph/virtual.c b/libsylph/virtual.c index 897a7070..985215ee 100644 --- a/libsylph/virtual.c +++ b/libsylph/virtual.c @@ -144,19 +144,26 @@ static GSList *virtual_search_folder(FilterRule *rule, FolderItem *item) GSList *cur; FilterInfo fltinfo; gboolean full_headers; + gint count = 1, total; + GTimeVal tv_prev, tv_cur; g_return_val_if_fail(rule != NULL, NULL); g_return_val_if_fail(item != NULL, NULL); + g_return_val_if_fail(item->path != NULL, NULL); /* prevent circular reference */ if (item->stype == F_VIRTUAL) return NULL; + g_get_current_time(&tv_prev); + status_print(_("Searching %s ..."), item->path); + mlist = folder_item_get_msg_list(item, TRUE); + total = g_slist_length(mlist); memset(&fltinfo, 0, sizeof(FilterInfo)); - debug_print("start query search: %s\n", item->path ? item->path : ""); + debug_print("start query search: %s\n", item->path); full_headers = filter_rule_requires_full_headers(rule); @@ -164,6 +171,16 @@ static GSList *virtual_search_folder(FilterRule *rule, FolderItem *item) MsgInfo *msginfo = (MsgInfo *)cur->data; GSList *hlist; + g_get_current_time(&tv_cur); + if (tv_cur.tv_sec > tv_prev.tv_sec || + tv_cur.tv_usec - tv_prev.tv_usec > + PROGRESS_UPDATE_INTERVAL * 1000) { + status_print(_("Searching %s (%d / %d)..."), + item->path, count, total); + tv_prev = tv_cur; + } + ++count; + fltinfo.flags = msginfo->flags; if (full_headers) { gchar *file; diff --git a/src/compose.c b/src/compose.c index 123d4df1..b1d12dcc 100644 --- a/src/compose.c +++ b/src/compose.c @@ -768,6 +768,7 @@ void compose_reply(MsgInfo *msginfo, FolderItem *item, ComposeMode mode, MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED); MSG_SET_PERM_FLAGS(msginfo->flags, MSG_REPLIED); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); msginfo->folder->mark_dirty = TRUE; if (MSG_IS_IMAP(msginfo->flags)) imap_msg_set_perm_flags(msginfo, MSG_REPLIED); @@ -859,6 +860,7 @@ void compose_forward(GSList *mlist, FolderItem *item, gboolean as_attach, msginfo = (MsgInfo *)cur->data; MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_REPLIED); MSG_SET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); msginfo->folder->mark_dirty = TRUE; } msginfo = (MsgInfo *)mlist->data; diff --git a/src/folderview.c b/src/folderview.c index 8dca27ae..d79dd587 100644 --- a/src/folderview.c +++ b/src/folderview.c @@ -1601,6 +1601,7 @@ static gboolean folderview_menu_popup(FolderView *folderview, } if (item->stype == F_VIRTUAL) { rename_folder = delete_folder = TRUE; + search_folder = FALSE; } if (FOLDER_TYPE(folder) == F_IMAP || FOLDER_TYPE(folder) == F_NEWS) { diff --git a/src/prefs_folder_item.c b/src/prefs_folder_item.c index 9d777eba..37ad6be2 100644 --- a/src/prefs_folder_item.c +++ b/src/prefs_folder_item.c @@ -253,6 +253,8 @@ static void prefs_folder_item_general_create(PrefsFolderItemDialog *dialog) gtk_widget_set_sensitive(optmenu, FALSE); gtk_widget_set_sensitive(vbox2, FALSE); } + if (dialog->item->stype == F_VIRTUAL) + gtk_widget_set_sensitive(optmenu, FALSE); dialog->name_entry = name_entry; dialog->id_label = id_label; @@ -527,7 +529,7 @@ static void prefs_folder_item_apply_cb(GtkWidget *widget, type = (SpecialFolderItemType) g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID); - if (item->stype != type) { + if (item->stype != type && item->stype != F_VIRTUAL) { switch (type) { case F_NORMAL: break; diff --git a/src/summary_search.c b/src/summary_search.c index e63f1ef9..a5ff8f76 100644 --- a/src/summary_search.c +++ b/src/summary_search.c @@ -60,6 +60,7 @@ #include "manage_window.h" #include "alertpanel.h" #include "foldersel.h" +#include "statusbar.h" #include "procmsg.h" #include "procheader.h" #include "folder.h" @@ -176,7 +177,7 @@ void summary_search(FolderItem *item) else gtk_widget_hide(search_window.window); - if (item) { + if (item && item->stype != F_VIRTUAL) { id = folder_item_get_identifier(item); gtk_entry_set_text(GTK_ENTRY(search_window.folder_entry), id); g_free(id); @@ -515,6 +516,7 @@ static void summary_search_query(void) gtk_button_set_label(GTK_BUTTON(search_window.search_btn), GTK_STOCK_FIND); gtk_label_set_text(GTK_LABEL(search_window.status_label), _("Done.")); + statusbar_pop_all(); if (search_window.cancelled) debug_print("* query search cancelled.\n"); @@ -533,7 +535,7 @@ static void summary_search_folder(FolderItem *item) gint count = 1, total; GTimeVal tv_prev, tv_cur; - if (!item->path) + if (!item->path || item->stype == F_VIRTUAL) return; folder_name = g_path_get_basename(item->path); @@ -729,7 +731,7 @@ static void summary_select_folder(GtkButton *button, gpointer data) gchar *id; item = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL); - if (!item) + if (!item || item->stype == F_VIRTUAL) return; id = folder_item_get_identifier(item); @@ -779,7 +781,7 @@ static void summary_search_save_dialog_select_folder(GtkButton *button, gchar *id; item = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL); - if (!item) + if (!item || item->no_sub || item->stype == F_VIRTUAL) return; id = folder_item_get_identifier(item); @@ -929,6 +931,7 @@ static FolderItem *summary_search_create_vfolder(FolderItem *parent, item = folder_item_new(name, path); item->stype = F_VIRTUAL; + item->no_sub = TRUE; folder_item_append(parent, item); g_free(path); diff --git a/src/summaryview.c b/src/summaryview.c index bf10d2a7..39940ce1 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -2271,6 +2271,7 @@ static void summary_display_msg_full(SummaryView *summaryview, MSG_IS_UNREAD(msginfo->flags)) { MSG_UNSET_PERM_FLAGS (msginfo->flags, MSG_NEW | MSG_UNREAD); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); summaryview->folder_item->mark_dirty = TRUE; if (MSG_IS_IMAP(msginfo->flags)) imap_msg_unset_perm_flags @@ -2450,15 +2451,17 @@ static void summary_mark_row(SummaryView *summaryview, GtkTreeIter *iter) GET_MSG_INFO(msginfo, iter); msginfo->to_folder = NULL; - if (MSG_IS_DELETED(msginfo->flags)) + if (MSG_IS_DELETED(msginfo->flags)) { summaryview->deleted--; + MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED); + } if (MSG_IS_MOVE(msginfo->flags)) summaryview->moved--; if (MSG_IS_COPY(msginfo->flags)) summaryview->copied--; - MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED); MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY); MSG_SET_PERM_FLAGS(msginfo->flags, MSG_MARKED); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); summaryview->folder_item->mark_dirty = TRUE; summary_set_row(summaryview, iter, msginfo); @@ -2508,6 +2511,7 @@ static void summary_mark_row_as_read(SummaryView *summaryview, summaryview->folder_item->unread--; if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) { MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); summaryview->folder_item->mark_dirty = TRUE; summary_set_row(summaryview, iter, msginfo); debug_print(_("Message %d is marked as being read\n"), @@ -2597,6 +2601,7 @@ static void summary_mark_row_as_unread(SummaryView *summaryview, debug_print(_("Message %d is marked as unread\n"), msginfo->msgnum); } + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); summary_set_row(summaryview, iter, msginfo); } @@ -2646,6 +2651,7 @@ static void summary_delete_row(SummaryView *summaryview, GtkTreeIter *iter) summaryview->copied--; MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY); MSG_SET_PERM_FLAGS(msginfo->flags, MSG_DELETED); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); summaryview->deleted++; summaryview->folder_item->mark_dirty = TRUE; @@ -2771,6 +2777,7 @@ static void summary_unmark_row(SummaryView *summaryview, GtkTreeIter *iter) summaryview->copied--; MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED); MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); summaryview->folder_item->mark_dirty = TRUE; summary_set_row(summaryview, iter, msginfo); @@ -2818,9 +2825,11 @@ static void summary_move_row_to(SummaryView *summaryview, GtkTreeIter *iter, GET_MSG_INFO(msginfo, iter); msginfo->to_folder = to_folder; - if (MSG_IS_DELETED(msginfo->flags)) + if (MSG_IS_DELETED(msginfo->flags)) { summaryview->deleted--; - MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED); + MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); + } MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_COPY); if (!MSG_IS_MOVE(msginfo->flags)) { MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MOVE); @@ -2889,9 +2898,11 @@ static void summary_copy_row_to(SummaryView *summaryview, GtkTreeIter *iter, GET_MSG_INFO(msginfo, iter); msginfo->to_folder = to_folder; - if (MSG_IS_DELETED(msginfo->flags)) + if (MSG_IS_DELETED(msginfo->flags)) { summaryview->deleted--; - MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED); + MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); + } MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE); if (!MSG_IS_COPY(msginfo->flags)) { MSG_SET_TMP_FLAGS(msginfo->flags, MSG_COPY); @@ -4254,6 +4265,7 @@ void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor, MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_CLABEL_FLAG_MASK); MSG_SET_COLORLABEL_VALUE(msginfo->flags, labelcolor); + MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED); summary_set_row(summaryview, &iter, msginfo); } |