Ejemplo n.º 1
0
static void messageview_set_menu_state(MessageView *messageview)
{
	GtkItemFactory *ifactory;
	GtkWidget *menuitem;

	messageview->menu_locked = TRUE;

	ifactory = gtk_item_factory_from_widget(messageview->menubar);
	menuitem = gtk_item_factory_get_widget
		(ifactory, "/View/All headers");
	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
				       messageview->textview->show_all_headers);

	if (messageview->msginfo &&
	    FOLDER_ITEM_IS_SENT_FOLDER(messageview->msginfo->folder))
		menu_set_sensitive(ifactory, "/Message/Re-edit", TRUE);
	else
		menu_set_sensitive(ifactory, "/Message/Re-edit", FALSE);

	messageview->menu_locked = FALSE;
}
Ejemplo n.º 2
0
GSList *quick_search_filter(QuickSearch *qsearch, QSearchCondType type,
			   const gchar *key)
{
	SummaryView *summaryview = qsearch->summaryview;
	FilterCondType ftype;
	FilterRule *status_rule = NULL;
	FilterRule *rule = NULL;
	FilterCond *cond;
	FilterInfo fltinfo;
	GSList *cond_list = NULL;
	GSList *rule_list = NULL;
	GSList *flt_mlist = NULL;
	GSList *cur;
	gint count = 0, total = 0;
	gchar status_text[1024];
	gboolean dmode;

	if (!summaryview->all_mlist)
		return NULL;

	debug_print("quick_search_filter: filtering summary (type: %d)\n",
		    type);

	switch (type) {
	case QS_UNREAD:
	case QS_MARK:
	case QS_CLABEL:
	case QS_MIME:
		ftype = qsearch_cond_types[type].ftype;
		cond = filter_cond_new(ftype, 0, 0, NULL, NULL);
		cond_list = g_slist_append(cond_list, cond);
		status_rule = filter_rule_new("Status filter rule", FLT_OR,
					      cond_list, NULL);
		break;
	case QS_W1DAY:
		cond = filter_cond_new(FLT_COND_AGE_GREATER, 0, FLT_NOT_MATCH,
				       NULL, "1");
		cond_list = g_slist_append(cond_list, cond);
		status_rule = filter_rule_new("Status filter rule", FLT_OR,
					      cond_list, NULL);
		break;
	case QS_LAST5:
		cond = filter_cond_new(FLT_COND_AGE_GREATER, 0, FLT_NOT_MATCH,
				       NULL, "5");
		cond_list = g_slist_append(cond_list, cond);
		status_rule = filter_rule_new("Status filter rule", FLT_OR,
					      cond_list, NULL);
		break;
	case QS_LAST7:
		cond = filter_cond_new(FLT_COND_AGE_GREATER, 0, FLT_NOT_MATCH,
				       NULL, "7");
		cond_list = g_slist_append(cond_list, cond);
		status_rule = filter_rule_new("Status filter rule", FLT_OR,
					      cond_list, NULL);
		break;
	case QS_LAST30:
		cond = filter_cond_new(FLT_COND_AGE_GREATER, 0, FLT_NOT_MATCH,
				       NULL, "30");
		cond_list = g_slist_append(cond_list, cond);
		status_rule = filter_rule_new("Status filter rule", FLT_OR,
					      cond_list, NULL);
		break;
	case QS_IN_ADDRESSBOOK:
		cond = filter_cond_new(FLT_COND_HEADER, FLT_IN_ADDRESSBOOK, 0,
				       "From", NULL);
		cond_list = g_slist_append(cond_list, cond);
		status_rule = filter_rule_new("Status filter rule", FLT_OR,
					      cond_list, NULL);
		break;
	case QS_ALL:
	default:
		break;
	}

	if (key) {
		gchar **keys;
		gint i;

		keys = g_strsplit(key, " ", -1);
		for (i = 0; keys[i] != NULL; i++) {
			cond_list = NULL;

			if (keys[i] == '\0')
				continue;

			cond = filter_cond_new(FLT_COND_HEADER, FLT_CONTAIN, 0,
					       "Subject", keys[i]);
			cond_list = g_slist_append(cond_list, cond);
			cond = filter_cond_new(FLT_COND_HEADER, FLT_CONTAIN, 0,
					       "From", keys[i]);
			cond_list = g_slist_append(cond_list, cond);
			if (FOLDER_ITEM_IS_SENT_FOLDER(summaryview->folder_item)) {
				cond = filter_cond_new(FLT_COND_TO_OR_CC, FLT_CONTAIN,
						       0, NULL, keys[i]);
				cond_list = g_slist_append(cond_list, cond);
			}

			if (cond_list) {
				rule = filter_rule_new("Quick search rule",
						       FLT_OR, cond_list, NULL);
				rule_list = g_slist_append(rule_list, rule);
			}
		}
		g_strfreev(keys);
	}

	memset(&fltinfo, 0, sizeof(FilterInfo));
	dmode = get_debug_mode();
	set_debug_mode(FALSE);

	for (cur = summaryview->all_mlist; cur != NULL; cur = cur->next) {
		MsgInfo *msginfo = (MsgInfo *)cur->data;
		GSList *hlist = NULL;
		gboolean matched = TRUE;

		total++;

		if (status_rule) {
			if (type == QS_IN_ADDRESSBOOK)
				hlist = procheader_get_header_list_from_msginfo
					(msginfo);
			if (!filter_match_rule(status_rule, msginfo, hlist,
					       &fltinfo)) {
				if (hlist)
					procheader_header_list_destroy(hlist);
				continue;
			}
		}

		if (rule_list) {
			GSList *rcur;

			if (!hlist)
				hlist = procheader_get_header_list_from_msginfo
					(msginfo);

			/* AND keyword match */
			for (rcur = rule_list; rcur != NULL; rcur = rcur->next) {
				rule = (FilterRule *)rcur->data;
				if (!filter_match_rule(rule, msginfo, hlist, &fltinfo)) {
					matched = FALSE;
					break;
				}
			}
		}

		if (matched) {
			flt_mlist = g_slist_prepend(flt_mlist, msginfo);
			count++;
		}

		if (hlist)
			procheader_header_list_destroy(hlist);
	}
	flt_mlist = g_slist_reverse(flt_mlist);

	set_debug_mode(dmode);

	if (status_rule || rule) {
		if (count > 0)
			g_snprintf(status_text, sizeof(status_text),
				   _("%1$d in %2$d matched"), count, total);
		else
			g_snprintf(status_text, sizeof(status_text),
				   _("No messages matched"));
		gtk_label_set_text(GTK_LABEL(qsearch->status_label),
				   status_text);
	} else
		gtk_label_set_text(GTK_LABEL(qsearch->status_label), "");

	filter_rule_list_free(rule_list);
	filter_rule_free(status_rule);

	return flt_mlist;
}