aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--ChangeLog.ja12
-rw-r--r--libsylph/filter.c23
-rw-r--r--libsylph/procmsg.h1
-rw-r--r--libsylph/virtual.c19
-rw-r--r--src/compose.c2
-rw-r--r--src/folderview.c1
-rw-r--r--src/prefs_folder_item.c4
-rw-r--r--src/summary_search.c11
-rw-r--r--src/summaryview.c24
10 files changed, 93 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 7683a14f..711bf317 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
}