31
31
#include "node_view.h"
33
33
#include "vfolder.h"
34
#include "vfolder_loader.h"
35
#include "ui/item_list_view.h"
34
36
#include "ui/itemview.h"
35
37
#include "ui/liferea_dialog.h"
36
38
#include "ui/rule_editor.h"
37
#include "ui/ui_feedlist.h"
39
#include "ui/feed_list_view.h"
39
41
/* shared functions */
42
* Loads a search result into the item list and renders
43
* some info text into the HTML view pane.
45
* @param searchResult valid search result node
46
* @param searchString search text (or NULL)
49
search_load_results (nodePtr searchResult, const gchar *searchString)
44
search_load_results (vfolderPtr searchResult)
53
nodeViewType viewMode;
55
/* Clear feed and item display and load search results */
56
ui_feedlist_select (NULL);
57
itemlist_unload (FALSE);
59
/* Ensure that we are in a useful viewing mode (3 paned) */
60
viewMode = itemlist_get_view_mode ();
61
if ((NODE_VIEW_MODE_NORMAL != viewMode) &&
62
(NODE_VIEW_MODE_WIDE != viewMode))
63
itemview_set_layout (NODE_VIEW_MODE_NORMAL);
46
feed_list_view_select (NULL);
65
itemSet = node_get_itemset (searchResult);
66
itemlist_load_search_result (itemSet);
67
itemset_free (itemSet);
69
buffer = g_string_new (NULL);
70
htmlview_start_output (buffer, NULL, TRUE, FALSE);
71
g_string_append_printf (buffer, "<div class='content'><h2>");
74
g_string_append_printf (buffer, ngettext("%d Search Result for \"%s\"",
75
"%d Search Results for \"%s\"",
76
searchResult->itemCount),
77
searchResult->itemCount, searchString);
79
g_string_append_printf (buffer, ngettext("%d Search Result",
81
searchResult->itemCount),
82
searchResult->itemCount);
84
g_string_append_printf (buffer, "</h2><p>");
85
g_string_append_printf (buffer, _("The item list now contains all items matching the "
86
"specified search pattern. If you want to save this search "
87
"result permanently you can click the \"Search Folder\" button in "
88
"the search dialog and Liferea will add a search folder to your "
90
g_string_append_printf (buffer, "</p></div>");
91
htmlview_finish_output (buffer);
92
itemview_display_info (buffer->str);
93
g_string_free (buffer, TRUE);
48
itemlist_add_search_result (vfolder_loader_new (searchResult->node));
96
51
/* complex search dialog */
98
53
static SearchDialog *search = NULL;
100
static void search_dialog_class_init (SearchDialogClass *klass);
101
static void search_dialog_init (SearchDialog *sd);
103
55
#define SEARCH_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), SEARCH_DIALOG_TYPE, SearchDialogPrivate))
105
57
struct SearchDialogPrivate {
106
58
GtkWidget *dialog; /**< the dialog widget */
107
59
RuleEditor *re; /**< search folder rule editor widget set */
109
nodePtr searchResult; /**< FIXME: evil no nodePtr should be necessary here! */
110
61
vfolderPtr vfolder; /**< temporary search folder representing the search result */
113
64
static GObjectClass *parent_class = NULL;
116
search_dialog_get_type (void)
118
static GType type = 0;
120
if (G_UNLIKELY (type == 0))
122
static const GTypeInfo our_info =
124
sizeof (SearchDialogClass),
125
NULL, /* base_init */
126
NULL, /* base_finalize */
127
(GClassInitFunc) search_dialog_class_init,
129
NULL, /* class_data */
130
sizeof (SearchDialog),
132
(GInstanceInitFunc) search_dialog_init
135
type = g_type_register_static (G_TYPE_OBJECT,
66
G_DEFINE_TYPE (SearchDialog, search_dialog, G_TYPE_OBJECT);
144
69
search_dialog_finalize (GObject *object)
169
94
search_dialog_init (SearchDialog *sd)
171
96
sd->priv = SEARCH_DIALOG_GET_PRIVATE (sd);
172
sd->priv->searchResult = node_new (vfolder_get_node_type ());
173
sd->priv->vfolder = vfolder_new (sd->priv->searchResult);
174
node_set_title (sd->priv->searchResult, "Saved Search");
97
sd->priv->vfolder = vfolder_new (node_new (vfolder_get_node_type ()));
98
node_set_title (sd->priv->vfolder->node, "Saved Search");
178
102
on_search_dialog_response (GtkDialog *dialog, gint responseId, gpointer user_data)
180
104
SearchDialog *sd = (SearchDialog *)user_data;
105
vfolderPtr vfolder = sd->priv->vfolder;
182
107
if (1 == responseId) { /* Search */
183
rule_editor_save (sd->priv->re, sd->priv->vfolder);
184
sd->priv->vfolder->anyMatch = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (sd->priv->dialog, "anyRuleRadioBtn2")));
108
rule_editor_save (sd->priv->re, vfolder->itemset);
109
vfolder->itemset->anyMatch = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (sd->priv->dialog, "anyRuleRadioBtn2")));
186
vfolder_refresh (sd->priv->vfolder);
187
search_load_results (sd->priv->searchResult, NULL);
111
search_load_results (vfolder);
190
114
if (2 == responseId) { /* + Search Folder */
191
rule_editor_save (sd->priv->re, sd->priv->vfolder);
192
sd->priv->vfolder->anyMatch = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (sd->priv->dialog, "anyRuleRadioBtn2")));
115
rule_editor_save (sd->priv->re, vfolder->itemset);
116
vfolder->itemset->anyMatch = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (liferea_dialog_lookup (sd->priv->dialog, "anyRuleRadioBtn2")));
194
nodePtr node = sd->priv->searchResult;
195
sd->priv->searchResult = NULL;
118
nodePtr node = vfolder->node;
196
119
sd->priv->vfolder = NULL;
197
120
feedlist_node_added (node);
249
172
static SimpleSearchDialog *simpleSearch = NULL;
251
static void simple_search_dialog_class_init (SimpleSearchDialogClass *klass);
252
static void simple_search_dialog_init (SimpleSearchDialog *ssd);
254
174
#define SIMPLE_SEARCH_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), SIMPLE_SEARCH_DIALOG_TYPE, SimpleSearchDialogPrivate))
256
176
struct SimpleSearchDialogPrivate {
257
177
GtkWidget *dialog; /**< the dialog widget */
258
178
GtkWidget *query; /**< entry widget for the search query */
260
nodePtr searchResult; /**< FIXME: evil no nodePtr should be necessary here! */
261
180
vfolderPtr vfolder; /**< temporary search folder representing the search result */
264
183
static GObjectClass *parent_class_simple = NULL;
267
simple_search_dialog_get_type (void)
269
static GType type = 0;
271
if (G_UNLIKELY (type == 0))
273
static const GTypeInfo our_info =
275
sizeof (SimpleSearchDialogClass),
276
NULL, /* base_init */
277
NULL, /* base_finalize */
278
(GClassInitFunc) simple_search_dialog_class_init,
280
NULL, /* class_data */
281
sizeof (SimpleSearchDialog),
283
(GInstanceInitFunc) simple_search_dialog_init
286
type = g_type_register_static (G_TYPE_OBJECT,
287
"SimpleSearchDialog",
185
G_DEFINE_TYPE (SimpleSearchDialog, simple_search_dialog, G_TYPE_OBJECT);
295
188
simple_search_dialog_finalize (GObject *object)
330
223
SimpleSearchDialog *ssd = (SimpleSearchDialog *)user_data;
331
224
const gchar *searchString;
225
vfolderPtr vfolder = ssd->priv->vfolder;
333
227
searchString = gtk_entry_get_text (GTK_ENTRY (ssd->priv->query));
335
229
if (1 == responseId) { /* Search */
336
230
/* Clean up old search result data and display... */
337
if (ssd->priv->searchResult) {
338
if (ssd->priv->searchResult == itemlist_get_displayed_node ())
232
if (vfolder->node == itemlist_get_displayed_node ())
339
233
itemlist_unload (FALSE);
341
node_free (ssd->priv->searchResult);
235
node_free (vfolder->node);
344
238
/* Create new search... */
345
ssd->priv->searchResult = node_new (vfolder_get_node_type ());
346
ssd->priv->vfolder = vfolder_new (ssd->priv->searchResult);
348
node_set_title (ssd->priv->searchResult, searchString);
349
vfolder_add_rule (ssd->priv->vfolder, "exact", searchString, TRUE);
350
vfolder_refresh (ssd->priv->vfolder);
239
ssd->priv->vfolder = vfolder = vfolder_new (node_new (vfolder_get_node_type ()));
240
node_set_title (vfolder->node, searchString);
241
itemset_add_rule (vfolder->itemset, "exact", searchString, TRUE);
352
search_load_results (ssd->priv->searchResult, searchString);
243
search_load_results (vfolder);
355
246
if (2 == responseId) /* Advanced... */