aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2006-10-29 06:16:00 +0000
committerChristian Grothoff <christian@grothoff.org>2006-10-29 06:16:00 +0000
commitb6eb2c21ad31d585bfcdf7be8d48df6433fd876f (patch)
treec7ca9df514b47cc51107286b98699d89323286b3
parent8e2e522cbfcef9c8e8733e1b481dfd9934ccb0ff (diff)
downloadgnunet-gtk-b6eb2c21ad31d585bfcdf7be8d48df6433fd876f.tar.gz
gnunet-gtk-b6eb2c21ad31d585bfcdf7be8d48df6433fd876f.zip
improving fs search code
-rw-r--r--gnunet-gtk.glade78
-rw-r--r--src/plugins/daemon/daemon.c2
-rw-r--r--src/plugins/fs/fs.c12
-rw-r--r--src/plugins/fs/fs.h44
-rw-r--r--src/plugins/fs/helper.c239
-rw-r--r--src/plugins/fs/meta.c104
-rw-r--r--src/plugins/fs/meta.h28
-rw-r--r--src/plugins/fs/namespace.c8
-rw-r--r--src/plugins/fs/search.c832
-rw-r--r--src/plugins/fs/search.h2
-rw-r--r--src/plugins/fs/upload.c2
11 files changed, 760 insertions, 591 deletions
diff --git a/gnunet-gtk.glade b/gnunet-gtk.glade
index 01f582e4..40c192ac 100644
--- a/gnunet-gtk.glade
+++ b/gnunet-gtk.glade
@@ -7820,4 +7820,82 @@ Daniel Nylander &lt;po@danielnylander.se&gt;
7820 </child> 7820 </child>
7821</widget> 7821</widget>
7822 7822
7823<widget class="GtkWindow" id="searchTabLabelWindow">
7824 <property name="visible">True</property>
7825 <property name="title" translatable="yes">Search Tab Label with Close Button</property>
7826 <property name="type">GTK_WINDOW_TOPLEVEL</property>
7827 <property name="window_position">GTK_WIN_POS_NONE</property>
7828 <property name="modal">False</property>
7829 <property name="resizable">True</property>
7830 <property name="destroy_with_parent">False</property>
7831 <property name="decorated">True</property>
7832 <property name="skip_taskbar_hint">False</property>
7833 <property name="skip_pager_hint">False</property>
7834 <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
7835 <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
7836 <property name="focus_on_map">True</property>
7837 <property name="urgency_hint">False</property>
7838
7839 <child>
7840 <widget class="GtkHBox" id="searchTabHBox">
7841 <property name="visible">True</property>
7842 <property name="homogeneous">False</property>
7843 <property name="spacing">0</property>
7844
7845 <child>
7846 <widget class="GtkLabel" id="searchTabLabel">
7847 <property name="visible">True</property>
7848 <property name="can_focus">True</property>
7849 <property name="label" translatable="yes">FIXME</property>
7850 <property name="use_underline">True</property>
7851 <property name="use_markup">False</property>
7852 <property name="justify">GTK_JUSTIFY_LEFT</property>
7853 <property name="wrap">False</property>
7854 <property name="selectable">True</property>
7855 <property name="xalign">0.5</property>
7856 <property name="yalign">0.5</property>
7857 <property name="xpad">5</property>
7858 <property name="ypad">0</property>
7859 <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
7860 <property name="width_chars">-1</property>
7861 <property name="single_line_mode">True</property>
7862 <property name="angle">0</property>
7863 </widget>
7864 <packing>
7865 <property name="padding">0</property>
7866 <property name="expand">False</property>
7867 <property name="fill">False</property>
7868 </packing>
7869 </child>
7870
7871 <child>
7872 <widget class="GtkButton" id="searchCloseButton">
7873 <property name="visible">True</property>
7874 <property name="tooltip" translatable="yes">Stop the search.</property>
7875 <property name="relief">GTK_RELIEF_NONE</property>
7876 <property name="focus_on_click">True</property>
7877 <signal name="clicked" handler="on_closeSearchButton_clicked_fs" object="searchTabHBox" last_modification_time="Sun, 29 Oct 2006 06:09:02 GMT"/>
7878
7879 <child>
7880 <widget class="GtkImage" id="image50">
7881 <property name="visible">True</property>
7882 <property name="stock">gtk-cancel</property>
7883 <property name="icon_size">4</property>
7884 <property name="xalign">0.5</property>
7885 <property name="yalign">0.5</property>
7886 <property name="xpad">0</property>
7887 <property name="ypad">0</property>
7888 </widget>
7889 </child>
7890 </widget>
7891 <packing>
7892 <property name="padding">0</property>
7893 <property name="expand">False</property>
7894 <property name="fill">False</property>
7895 </packing>
7896 </child>
7897 </widget>
7898 </child>
7899</widget>
7900
7823</glade-interface> 7901</glade-interface>
diff --git a/src/plugins/daemon/daemon.c b/src/plugins/daemon/daemon.c
index 003dcce3..3b8bf244 100644
--- a/src/plugins/daemon/daemon.c
+++ b/src/plugins/daemon/daemon.c
@@ -101,6 +101,8 @@ static void updateAppModelSafe(void * unused) {
101 "applicationList"); 101 "applicationList");
102 gtk_tree_view_set_model(GTK_TREE_VIEW(w), 102 gtk_tree_view_set_model(GTK_TREE_VIEW(w),
103 GTK_TREE_MODEL(model)); 103 GTK_TREE_MODEL(model));
104 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(searchList)),
105 GTK_SELECTION_NONE);
104 connection_destroy(sock); 106 connection_destroy(sock);
105} 107}
106 108
diff --git a/src/plugins/fs/fs.c b/src/plugins/fs/fs.c
index ee67ccaa..654d8c82 100644
--- a/src/plugins/fs/fs.c
+++ b/src/plugins/fs/fs.c
@@ -112,6 +112,8 @@ static void saveEventProcessor(void * arg) {
112 break; 112 break;
113 case FSUI_download_started: 113 case FSUI_download_started:
114 cls->ret = fs_download_started(event->data.DownloadStarted.dc.pos, 114 cls->ret = fs_download_started(event->data.DownloadStarted.dc.pos,
115 event->data.DownloadStarted.dc.pctx,
116 event->data.DownloadStarted.dc.sctx,
115 event->data.DownloadStarted.total, 117 event->data.DownloadStarted.total,
116 event->data.DownloadStarted.anonymityLevel, 118 event->data.DownloadStarted.anonymityLevel,
117 &event->data.DownloadStarted.fi, 119 &event->data.DownloadStarted.fi,
@@ -121,6 +123,8 @@ static void saveEventProcessor(void * arg) {
121 break; 123 break;
122 case FSUI_download_resumed: 124 case FSUI_download_resumed:
123 cls->ret = fs_download_started(event->data.DownloadResumed.dc.pos, 125 cls->ret = fs_download_started(event->data.DownloadResumed.dc.pos,
126 event->data.DownloadStarted.dc.pctx,
127 event->data.DownloadStarted.dc.sctx,
124 event->data.DownloadResumed.total, 128 event->data.DownloadResumed.total,
125 event->data.DownloadResumed.anonymityLevel, 129 event->data.DownloadResumed.anonymityLevel,
126 &event->data.DownloadResumed.fi, 130 &event->data.DownloadResumed.fi,
@@ -213,13 +217,17 @@ void init_fs(struct GE_Context * e,
213} 217}
214 218
215void done_fs() { 219void done_fs() {
216 DEBUG_BEGIN(); 220 GtkWidget * tab;
221
222 tab
223 = glade_xml_get_widget(getMainXML(),
224 "fsnotebook");
225 gtk_widget_hide(tab);
217 fs_search_stop(); 226 fs_search_stop();
218 fs_collection_stop(); 227 fs_collection_stop();
219 fs_namespace_stop(); 228 fs_namespace_stop();
220 fs_upload_stop(); 229 fs_upload_stop();
221 FSUI_stop(ctx); 230 FSUI_stop(ctx);
222 DEBUG_END();
223} 231}
224 232
225/* end of fs.c */ 233/* end of fs.c */
diff --git a/src/plugins/fs/fs.h b/src/plugins/fs/fs.h
index 3b691cf1..690bf072 100644
--- a/src/plugins/fs/fs.h
+++ b/src/plugins/fs/fs.h
@@ -30,6 +30,24 @@
30#include <GNUnet/gnunet_ecrs_lib.h> 30#include <GNUnet/gnunet_ecrs_lib.h>
31#include <GNUnet/gnunet_fsui_lib.h> 31#include <GNUnet/gnunet_fsui_lib.h>
32 32
33
34/**
35 * On search box, for namespace selection
36 * (for input of search URI; lists known namespaces).
37 */
38enum {
39 NS_SEARCH_DESCRIPTION = 0,
40 NS_SEARCH_ENCNAME,
41 NS_SEARCH_METADATA,
42 NS_SEARCH_FSUI,
43 NS_SEARCH_RATING,
44 NS_SEARCH_NUM,
45};
46
47/**
48 * For listing of search results for main search.
49 * Represents a search result.
50 */
33enum { 51enum {
34 SEARCH_NAME = 0, 52 SEARCH_NAME = 0,
35 SEARCH_SIZE, 53 SEARCH_SIZE,
@@ -43,21 +61,15 @@ enum {
43 SEARCH_NUM, 61 SEARCH_NUM,
44}; 62};
45 63
64/**
65 * Search entry in search summary list.
66 * Represents a search process.
67 */
46enum { 68enum {
47 NS_SEARCH_DESCRIPTION = 0, 69 SEARCH_SUMMARY_NAME = 0,
48 NS_SEARCH_ENCNAME, 70 SEARCH_SUMMARY_RESULT_COUNT,
49 NS_SEARCH_METADATA, 71 SEARCH_SUMMARY_INTERNAL,
50 NS_SEARCH_FSUI, 72 SEARCH_SUMMARY_NUM
51 NS_SEARCH_RATING,
52 NS_SEARCH_NUM,
53};
54
55enum {
56 SER_SUM_NAME = 0,
57 SER_SUM_COUNT,
58 SER_SUM_URI,
59 SER_SUM_FSUI,
60 SER_SUM_NUM
61}; 73};
62 74
63enum { 75enum {
@@ -67,9 +79,7 @@ enum {
67 DOWNLOAD_HSIZE, 79 DOWNLOAD_HSIZE,
68 DOWNLOAD_PROGRESS, 80 DOWNLOAD_PROGRESS,
69 DOWNLOAD_URISTRING, 81 DOWNLOAD_URISTRING,
70 DOWNLOAD_URI, 82 DOWNLOAD_INTERNAL, /* struct DL */
71 DOWNLOAD_TREEPATH,
72 DOWNLOAD_POS, /* struct DL */
73 DOWNLOAD_NUM 83 DOWNLOAD_NUM
74}; 84};
75 85
diff --git a/src/plugins/fs/helper.c b/src/plugins/fs/helper.c
index db35ea03..54110e76 100644
--- a/src/plugins/fs/helper.c
+++ b/src/plugins/fs/helper.c
@@ -95,243 +95,4 @@ int parseTime(const char * t,
95 return OK; 95 return OK;
96} 96}
97 97
98/**
99 * FIXME: convert this into a glade widget!
100 */
101GtkWidget *
102buildSearchTabLabel(GtkWidget *searchPage,
103 const char *title) {
104 GtkWidget *hbox;
105 GtkWidget *label_hbox;
106 GtkWidget *label_ebox;
107 GtkWidget *label;
108 GtkWidget *dummy_label;
109 GtkWidget *close_button;
110 GtkRcStyle *rcstyle;
111 GtkRequisition size;
112 GtkWidget *image;
113 char *short_title;
114 char *orig_title;
115 char *final_title;
116 char *short_title_end;
117 char *tip_title;
118 int short_title_len;
119 static GtkTooltips *searchTabLabelTooltip = NULL;
120 unsigned int *file_count;
121
122 if(!searchTabLabelTooltip)
123 searchTabLabelTooltip = gtk_tooltips_new();
124
125 hbox = gtk_hbox_new (FALSE, 2);
126
127 label_ebox = gtk_event_box_new ();
128 gtk_event_box_set_visible_window (GTK_EVENT_BOX (label_ebox), FALSE);
129 gtk_box_pack_start (GTK_BOX (hbox), label_ebox, TRUE, TRUE, 0);
130
131 label_hbox = gtk_hbox_new (FALSE, 2);
132 gtk_container_add (GTK_CONTAINER (label_ebox), label_hbox);
133
134 /* setup close button */
135 close_button = gtk_button_new ();
136 gtk_button_set_relief (GTK_BUTTON (close_button),
137 GTK_RELIEF_NONE);
138 /* don't allow focus on the close button */
139 gtk_button_set_focus_on_click (GTK_BUTTON (close_button), FALSE);
140
141 /* make it as small as possible */
142 rcstyle = gtk_rc_style_new ();
143 rcstyle->xthickness = 0;
144 rcstyle->ythickness = 0;
145 gtk_widget_modify_style (close_button, rcstyle);
146 gtk_rc_style_unref (rcstyle),
147
148 image = gtk_image_new_from_stock (GTK_STOCK_CLOSE,
149 GTK_ICON_SIZE_MENU);
150 gtk_widget_size_request (image, &size);
151 gtk_widget_set_size_request (close_button, size.width, size.height);
152 gtk_container_add (GTK_CONTAINER (close_button), image);
153 gtk_box_pack_start (GTK_BOX (hbox), close_button, FALSE, FALSE, 0);
154
155 g_signal_connect_swapped(close_button,
156 "clicked",
157 G_CALLBACK (on_closeSearchButton_clicked_fs),
158 searchPage);
159
160 /* truncate the description if needed */
161 if(g_utf8_strlen(title, 16) > 15) {
162 short_title_end = g_utf8_offset_to_pointer (title, 15);
163 short_title_len = short_title_end - title;
164 short_title = g_strndup(title, short_title_len);
165 orig_title = g_strconcat(short_title, "...", NULL);
166 FREE(short_title);
167 } else {
168 orig_title = STRDUP(title);
169 }
170
171 /* setup label */
172 final_title = g_strconcat(orig_title, " (0)", NULL);
173 label = gtk_label_new (final_title);
174 FREE(final_title);
175 98
176 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
177 gtk_misc_set_padding (GTK_MISC (label), 0, 0);
178 gtk_box_pack_start (GTK_BOX (label_hbox), label, FALSE, FALSE, 0);
179
180 /* add a forced space before the button */
181 dummy_label = gtk_label_new ("");
182 gtk_box_pack_start (GTK_BOX (label_hbox), dummy_label, TRUE, TRUE, 0);
183
184 /* tooltips */
185 gtk_tooltips_set_tip(searchTabLabelTooltip, close_button,
186 _("Close this search"), NULL);
187 tip_title = g_strconcat (_("Search: "), title, NULL);
188 gtk_tooltips_set_tip(searchTabLabelTooltip, label_ebox,
189 tip_title, NULL);
190
191 /* store some references to access count & title later */
192 file_count = malloc(sizeof(unsigned int));
193 *file_count = 0;
194 g_object_set_data(G_OBJECT(searchPage),
195 "file_count", (gpointer) file_count);
196 g_object_set_data(G_OBJECT(searchPage),
197 "label", (gpointer) label);
198 g_object_set_data(G_OBJECT(searchPage),
199 "title", (gpointer) orig_title);
200
201 gtk_widget_show (hbox);
202 gtk_widget_show (label_ebox);
203 gtk_widget_show (label_hbox);
204 gtk_widget_show (label);
205 gtk_widget_show (dummy_label);
206 gtk_widget_show (image);
207 gtk_widget_show (close_button);
208
209 return hbox;
210}
211
212
213
214GtkWidget * makeSearchResultFrame(struct GC_Configuration * cfg,
215 GtkWidget ** treeview,
216 GtkWidget ** anonSpin) {
217 GtkWidget * window;
218 GtkWidget * child;
219 GtkWidget * resultList;
220 GtkTreeViewColumn * column;
221 GtkCellRenderer * renderer;
222 GtkTreeStore * tree;
223 GladeXML * searchXML;
224 int col;
225
226 searchXML
227 = glade_xml_new(getGladeFileName(),
228 "searchResultsFrame",
229 PACKAGE_NAME);
230 connectGladeWithPlugins(searchXML);
231 window = glade_xml_get_widget(searchXML,
232 "searchResultsFrame");
233 resultList = glade_xml_get_widget(searchXML,
234 "searchResults");
235 *anonSpin = glade_xml_get_widget(searchXML,
236 "downloadAnonymitySpinButton");
237 if (treeview != NULL)
238 (*treeview) = GTK_WIDGET(GTK_TREE_VIEW(resultList));
239 tree =
240 gtk_tree_store_new(SEARCH_NUM,
241 G_TYPE_STRING, /* name */
242 G_TYPE_UINT64, /* size */
243 G_TYPE_STRING, /* human-readable size */
244 G_TYPE_STRING, /* mime-type */
245 G_TYPE_STRING, /* meta-data (some) */
246 GDK_TYPE_PIXBUF, /* preview */
247 G_TYPE_POINTER, /* url */
248 G_TYPE_POINTER, /* meta */
249 G_TYPE_POINTER); /* internal: download info/NULL */
250 gtk_tree_view_set_model(GTK_TREE_VIEW(resultList),
251 GTK_TREE_MODEL(tree));
252 renderer = gtk_cell_renderer_text_new();
253 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
254 -1,
255 _("Name"),
256 renderer,
257 "text", SEARCH_NAME,
258 NULL);
259 column = gtk_tree_view_get_column(GTK_TREE_VIEW(resultList),
260 col - 1);
261 gtk_tree_view_column_set_resizable(column, TRUE);
262 gtk_tree_view_column_set_clickable(column, TRUE);
263 gtk_tree_view_column_set_reorderable(column, TRUE);
264 gtk_tree_view_column_set_sort_column_id(column, SEARCH_NAME);
265 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
266 renderer = gtk_cell_renderer_text_new();
267 g_object_set (renderer, "xalign", 1.00, NULL);
268 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
269 -1,
270 _("Size"),
271 renderer,
272 "text", SEARCH_HSIZE,
273 NULL);
274 column = gtk_tree_view_get_column(GTK_TREE_VIEW(resultList),
275 col - 1);
276 gtk_tree_view_column_set_resizable(column, TRUE);
277 gtk_tree_view_column_set_clickable(column, TRUE);
278 gtk_tree_view_column_set_reorderable(column, TRUE);
279 gtk_tree_view_column_set_sort_column_id(column, SEARCH_SIZE);
280 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
281
282 renderer = gtk_cell_renderer_text_new();
283 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
284 -1,
285 _("Mime-type"),
286 renderer,
287 "text", SEARCH_MIME,
288 NULL);
289 column = gtk_tree_view_get_column(GTK_TREE_VIEW(resultList),
290 col - 1);
291 gtk_tree_view_column_set_resizable(column, TRUE);
292 gtk_tree_view_column_set_clickable(column, TRUE);
293 gtk_tree_view_column_set_reorderable(column, TRUE);
294 gtk_tree_view_column_set_sort_column_id(column, SEARCH_MIME);
295 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
296
297 renderer = gtk_cell_renderer_text_new();
298 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
299 -1,
300 _("Meta-data"),
301 renderer,
302 "text", SEARCH_DESC,
303 NULL);
304 column = gtk_tree_view_get_column(GTK_TREE_VIEW(resultList),
305 col - 1);
306 gtk_tree_view_column_set_resizable(column, TRUE);
307 gtk_tree_view_column_set_clickable(column, TRUE);
308 gtk_tree_view_column_set_reorderable(column, TRUE);
309 gtk_tree_view_column_set_sort_column_id(column, SEARCH_DESC);
310 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
311 if (YES != GC_get_configuration_value_yesno(cfg,
312 "GNUNET-GTK",
313 "DISABLE-PREVIEWS",
314 NO)) {
315 renderer = gtk_cell_renderer_pixbuf_new();
316 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
317 -1,
318 _("Preview"),
319 renderer,
320 "pixbuf", SEARCH_PIXBUF,
321 NULL);
322 column = gtk_tree_view_get_column(GTK_TREE_VIEW(resultList),
323 col - 1);
324 gtk_tree_view_column_set_resizable(column, TRUE);
325 gtk_tree_view_column_set_reorderable(column, TRUE);
326 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(resultList),
327 col - 1),
328 TRUE);
329 }
330 child = gtk_bin_get_child(GTK_BIN(window));
331 gtk_widget_ref(GTK_WIDGET(child));
332 gtk_container_remove(GTK_CONTAINER(window),
333 child);
334 gtk_widget_destroy(window);
335 UNREF(searchXML);
336 return child;
337}
diff --git a/src/plugins/fs/meta.c b/src/plugins/fs/meta.c
index 74ed7932..4c53891e 100644
--- a/src/plugins/fs/meta.c
+++ b/src/plugins/fs/meta.c
@@ -112,6 +112,8 @@ void createMetaDataListTreeView(GladeXML * xml,
112 TRUE); 112 TRUE);
113 gtk_tree_view_set_model(GTK_TREE_VIEW(metaList), 113 gtk_tree_view_set_model(GTK_TREE_VIEW(metaList),
114 GTK_TREE_MODEL(metamodel)); 114 GTK_TREE_MODEL(metamodel));
115 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(metaList)),
116 GTK_SELECTION_MULTIPLE);
115 if (init != NULL) 117 if (init != NULL)
116 ECRS_getMetaData(init, 118 ECRS_getMetaData(init,
117 &publishMetaData, 119 &publishMetaData,
@@ -193,6 +195,8 @@ void createKeywordListTreeView(GladeXML * xml,
193 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/ 195 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
194 gtk_tree_view_set_model(GTK_TREE_VIEW(keywordList), 196 gtk_tree_view_set_model(GTK_TREE_VIEW(keywordList),
195 GTK_TREE_MODEL(keymodel)); 197 GTK_TREE_MODEL(keymodel));
198 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(keywordList)),
199 GTK_SELECTION_MULTIPLE);
196 if (init != NULL) 200 if (init != NULL)
197 ECRS_getKeywordsFromUri(init, 201 ECRS_getKeywordsFromUri(init,
198 &publishKeyword, 202 &publishKeyword,
@@ -470,8 +474,8 @@ int tryParseTimeInterval(GladeXML * xml,
470 interval); 474 interval);
471} 475}
472 476
473unsigned int getAnonymityLevel(GladeXML * xml, 477unsigned int getSpinButtonValue(GladeXML * xml,
474 const char * spinButtonName) { 478 const char * spinButtonName) {
475 GtkWidget * spin; 479 GtkWidget * spin;
476 480
477 spin = glade_xml_get_widget(xml, 481 spin = glade_xml_get_widget(xml,
@@ -481,4 +485,100 @@ unsigned int getAnonymityLevel(GladeXML * xml,
481 485
482 486
483 487
488char * getMimeTypeFromMetaData(const struct ECRS_MetaData * meta) {
489 char * mime;
490
491 mime = ECRS_getFromMetaData(meta,
492 EXTRACTOR_MIMETYPE);
493 if (mime == NULL)
494 mime = STRDUP(_("unknown"));
495 return validate_utf8(mime);
496}
497
498char * getFileNameFromMetaData(const struct ECRS_MetaData * meta) {
499 char * name;
500
501 name = ECRS_getFirstFromMetaData(info->meta,
502 EXTRACTOR_FILENAME,
503 EXTRACTOR_TITLE,
504 EXTRACTOR_ARTIST,
505 EXTRACTOR_AUTHOR,
506 EXTRACTOR_PUBLISHER,
507 EXTRACTOR_CREATOR,
508 EXTRACTOR_PRODUCER,
509 EXTRACTOR_UNKNOWN,
510 -1);
511 if (name == NULL) {
512 name = STRDUP(_("no name given"));
513 } else {
514 char * dotdot;
515
516 while (NULL != (dotdot = strstr(name, "..")))
517 dotdot[0] = dotdot[1] = '_';
518 }
519 return validate_utf8(name);
520}
521
522char * getDescriptionFromMetaData(const struct ECRS_MetaData * meta) {
523 char * desc;
524
525 desc = ECRS_getFirstFromMetaData(info->meta,
526 EXTRACTOR_DESCRIPTION,
527 EXTRACTOR_GENRE,
528 EXTRACTOR_ALBUM,
529 EXTRACTOR_COMMENT,
530 EXTRACTOR_SUBJECT,
531 EXTRACTOR_FORMAT,
532 EXTRACTOR_SIZE,
533 EXTRACTOR_KEYWORDS,
534 -1);
535 if (desc == NULL)
536 desc = STRDUP("");
537 return validate_utf8(desc);
538}
539
540GdkPixbuf * getThumbnailFromMetaData(const struct ECRS_MetaData * meta) {
541 GdkPixbuf * pxibuf;
542 GdkPixbufLoader * loader;
543 size_t ts;
544 unsigned char * thumb;
545
546 thumb = NULL;
547 ts = ECRS_getThumbnailFromMetaData(meta,
548 &thumb);
549 if (ts != 0) {
550 loader = gdk_pixbuf_loader_new();
551 gdk_pixbuf_loader_write(loader,
552 (const guchar*) thumb,
553 ts,
554 NULL);
555 pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
556 gdk_pixbuf_loader_close(loader,
557 NULL);
558 if (pixbuf != NULL)
559 g_object_ref(pixbuf);
560 UNREF(loader);
561 } else {
562 pixbuf = NULL;
563 }
564 FREENONNULL(thumb);
565 return pixbuf;
566}
567
568GtkWidget *
569extractMainWidgetFromWindow(GladeXML * xml,
570 const char * windowName) {
571 GtkContainer * window;
572 GtkWidget * ret;
573
574 window = GTK_CONTAINER(glade_xml_get_widget(xml,
575 windowName));
576 ret = gtk_bin_get_child(GTK_BIN(window));
577 gtk_widget_ref(ret);
578 gtk_container_remove(window, ret);
579 gtk_widget_destroy(window);
580 return ret;
581}
582
583
484/* end of meta.c */ 584/* end of meta.c */
diff --git a/src/plugins/fs/meta.h b/src/plugins/fs/meta.h
index fb54e464..97fd8f64 100644
--- a/src/plugins/fs/meta.h
+++ b/src/plugins/fs/meta.h
@@ -51,12 +51,14 @@ void handleMetaDataListUpdate(GladeXML * xml,
51 const char * valueInputLineName, 51 const char * valueInputLineName,
52 const char * metaDataListName); 52 const char * metaDataListName);
53 53
54struct ECRS_MetaData * getMetaDataFromList(GladeXML * xml, 54struct ECRS_MetaData *
55 const char * name, 55getMetaDataFromList(GladeXML * xml,
56 const char * preview); 56 const char * name,
57 const char * preview);
57 58
58struct ECRS_URI * getKeywordURIFromList(GladeXML * xml, 59struct ECRS_URI *
59 const char * name); 60getKeywordURIFromList(GladeXML * xml,
61 const char * name);
60 62
61char * updateIntervalToString(TIME_T interval); 63char * updateIntervalToString(TIME_T interval);
62 64
@@ -67,8 +69,20 @@ int tryParseTimeInterval(GladeXML * xml,
67int parseTimeInterval(const char * frequency, 69int parseTimeInterval(const char * frequency,
68 TIME_T * interval); 70 TIME_T * interval);
69 71
70unsigned int getAnonymityLevel(GladeXML * xml, 72unsigned int getSpinButtonValue(GladeXML * xml,
71 const char * spinButtonName); 73 const char * spinButtonName);
74
75char * getMimeTypeFromMetaData(const struct ECRS_MetaData * meta);
76
77char * getFileNameFromMetaData(const struct ECRS_MetaData * meta);
78
79char * getDescriptionFromMetaData(const struct ECRS_MetaData * meta);
80
81GdkPixbuf * getThumbnailFromMetaData(const struct ECRS_MetaData * meta);
82
83GtkWidget * extractMainWidgetFromWindow(GladeXML * xml,
84 const char * windowName);
85
72 86
73/* end of meta.h */ 87/* end of meta.h */
74#endif 88#endif
diff --git a/src/plugins/fs/namespace.c b/src/plugins/fs/namespace.c
index f812488e..3b6e708f 100644
--- a/src/plugins/fs/namespace.c
+++ b/src/plugins/fs/namespace.c
@@ -99,6 +99,8 @@ static GtkWidget * makeNamespaceFrame(GtkWidget ** treeview,
99 G_TYPE_POINTER); /* META */ 99 G_TYPE_POINTER); /* META */
100 gtk_tree_view_set_model(GTK_TREE_VIEW(resultList), 100 gtk_tree_view_set_model(GTK_TREE_VIEW(resultList),
101 GTK_TREE_MODEL(model)); 101 GTK_TREE_MODEL(model));
102 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(resultList)),
103 GTK_SELECTION_MULTIPLE);
102 renderer = gtk_cell_renderer_text_new(); 104 renderer = gtk_cell_renderer_text_new();
103 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList), 105 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(resultList),
104 -1, 106 -1,
@@ -915,8 +917,8 @@ void on_namespaceInsertButton_clicked_fs(GtkWidget * dummy1,
915 "metaDataTreeView", 917 "metaDataTreeView",
916 "namespaceInsertPreview"); 918 "namespaceInsertPreview");
917 cls.anonymityLevel 919 cls.anonymityLevel
918 = getAnonymityLevel(metaXML, 920 = getSpinButtonValue(metaXML,
919 "anonymitySpinButton"); 921 "anonymitySpinButton");
920 nameLine = glade_xml_get_widget(metaXML, 922 nameLine = glade_xml_get_widget(metaXML,
921 "namespaceContentIdentifierEntry"); 923 "namespaceContentIdentifierEntry");
922 identifierName = gtk_entry_get_text(GTK_ENTRY(nameLine)); 924 identifierName = gtk_entry_get_text(GTK_ENTRY(nameLine));
@@ -1383,6 +1385,8 @@ void fs_namespace_start(struct GE_Context * e,
1383 G_TYPE_POINTER); /* uri */ 1385 G_TYPE_POINTER); /* uri */
1384 gtk_tree_view_set_model(GTK_TREE_VIEW(contentList), 1386 gtk_tree_view_set_model(GTK_TREE_VIEW(contentList),
1385 GTK_TREE_MODEL(model)); 1387 GTK_TREE_MODEL(model));
1388 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(contentList)),
1389 GTK_SELECTION_MULTIPLE);
1386 renderer = gtk_cell_renderer_text_new(); 1390 renderer = gtk_cell_renderer_text_new();
1387 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(contentList), 1391 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(contentList),
1388 -1, 1392 -1,
diff --git a/src/plugins/fs/search.c b/src/plugins/fs/search.c
index e7c1a63e..63d7622c 100644
--- a/src/plugins/fs/search.c
+++ b/src/plugins/fs/search.c
@@ -46,19 +46,102 @@
46 */ 46 */
47typedef struct SL { 47typedef struct SL {
48 struct SL * next; 48 struct SL * next;
49 GtkWidget * treeview; 49 /**
50 * Reference to the glade XML context that was
51 * used to create the search page.
52 */
53 GladeXML * searchXML;
54
55 /**
56 * Reference to the glade XML context that was
57 * used to create the search label.
58 */
59 GladeXML * labelXML;
60
61 /**
62 * Tree view widget that is used to display the
63 * search results.
64 */
65 GtkTreeView * treeview;
66
67 /**
68 * Model of the tree view.
69 */
70 GtkTreeStore * tree;
71
72 /**
73 * The label used in the notebook page.
74 */
75 GtkLabel * tab_label;
76
77 /**
78 * The notebook page that is associated with this
79 * search.
80 */
50 GtkWidget * searchpage; 81 GtkWidget * searchpage;
51 GtkWidget * anonymityButton; /* FIXME: initialize! */ 82
83 /**
84 * Path to the entry in the summary list
85 * for this search.
86 */
87 GtkTreeRowReference * summaryViewRowReference;
88
89 /**
90 * URI for this search.
91 */
52 struct ECRS_URI * uri; 92 struct ECRS_URI * uri;
53 struct FSUI_SearchList * fsui_list; /* FIXME: initialize! */ 93
94 /**
95 * String describing the search.
96 */
97 char * searchString;
98
99 /**
100 * Number of results received so far.
101 */
102 unsigned int resultsReceived;
103
104 /**
105 * FSUI search handle.
106 */
107 struct FSUI_SearchList * fsui_list;
54} SearchList; 108} SearchList;
55 109
56typedef struct DL { 110typedef struct DL {
57 struct DL * next; 111 struct DL * next;
112
113 /**
114 * URI of the download.
115 */
58 struct ECRS_URI * uri; 116 struct ECRS_URI * uri;
117
118 /**
119 * Where is the download being saved to?
120 */
59 char * filename; 121 char * filename;
60 GtkTreeRowReference * rr; 122
61 GtkTreeModel * model; 123 /**
124 * Path in the summary view for this download.
125 */
126 GtkTreeRowReference * summaryViewRowReference;
127
128 /**
129 * Search that this download belongs to.
130 * Maybe NULL.
131 */
132 struct SL * searchList;
133
134 /**
135 * Path in the search view that this
136 * download is represented by. Maybe NULL
137 * if search has been closed or if download
138 * was initiated from URI without search.
139 */
140 GtkTreeRowReference * searchViewRowReference;
141
142 /**
143 * FSUI reference for the download.
144 */
62 struct FSUI_DownloadList * fsui_list; 145 struct FSUI_DownloadList * fsui_list;
63} DownloadList; 146} DownloadList;
64 147
@@ -74,40 +157,38 @@ static struct GE_Context * ectx;
74 157
75static struct GC_Configuration * cfg; 158static struct GC_Configuration * cfg;
76 159
77 160/**
161 * The user has clicked the "SEARCH" button.
162 * Initiate a search.
163 */
78void on_fssearchbutton_clicked_fs(gpointer dummy2, 164void on_fssearchbutton_clicked_fs(gpointer dummy2,
79 GtkWidget * searchButton) { 165 GtkWidget * searchButton) {
80 struct ECRS_URI * uri; 166 struct ECRS_URI * uri;
81 const char * ss; 167 const char * searchString;
82 const char * ns;
83 gint pages; 168 gint pages;
84 const char * descStr;
85 char * ustring;
86 gint i; 169 gint i;
87 SearchList * list; 170 SearchList * list;
88 GtkListStore * model;
89 GtkTreeModel * tmodel;
90 GtkTreeIter iter; 171 GtkTreeIter iter;
91 GtkWidget * searchKeywordGtkCB; 172 GtkWidget * searchKeywordGtkCB;
92 GtkWidget * searchNamespaceGtkCB; 173 GtkWidget * searchNamespaceGtkCB;
93 GtkWidget * entry; 174 GtkNotebook * notebook;
94 GtkWidget * notebook;
95 GtkWidget * page;
96 175
97 DEBUG_BEGIN();
98 searchKeywordGtkCB 176 searchKeywordGtkCB
99 = glade_xml_get_widget(getMainXML(), 177 = glade_xml_get_widget(getMainXML(),
100 "fssearchKeywordComboBoxEntry"); 178 "fssearchKeywordComboBoxEntry");
101 entry = gtk_bin_get_child(GTK_BIN(searchKeywordGtkCB)); 179 searchString = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(searchKeywordGtkCB))));
102 ss = gtk_entry_get_text(GTK_ENTRY(entry)); 180 if (searchString == NULL) {
103 if (ss == NULL) {
104 GE_LOG(ectx, 181 GE_LOG(ectx,
105 GE_ERROR | GE_USER | GE_IMMEDIATE, 182 GE_ERROR | GE_USER | GE_IMMEDIATE,
106 _("Need a keyword to search!\n")); 183 _("Need a keyword to search!\n"));
107 return; 184 return;
108 } 185 }
186 /* add the keyword to the list of keywords that have
187 been used so far */
109 i = gtk_combo_box_get_active(GTK_COMBO_BOX(searchKeywordGtkCB)); 188 i = gtk_combo_box_get_active(GTK_COMBO_BOX(searchKeywordGtkCB));
110 if (i == -1) { 189 if (i == -1) {
190 GtkListStore * model;
191
111 model = GTK_LIST_STORE 192 model = GTK_LIST_STORE
112 (gtk_combo_box_get_model 193 (gtk_combo_box_get_model
113 (GTK_COMBO_BOX(searchKeywordGtkCB))); 194 (GTK_COMBO_BOX(searchKeywordGtkCB)));
@@ -115,18 +196,22 @@ void on_fssearchbutton_clicked_fs(gpointer dummy2,
115 &iter); 196 &iter);
116 gtk_list_store_set(model, 197 gtk_list_store_set(model,
117 &iter, 198 &iter,
118 0, ss, 199 0, searchString,
119 -1); 200 -1);
120 } 201 }
202 uri = NULL;
203 /* check for namespace search */
121 searchNamespaceGtkCB 204 searchNamespaceGtkCB
122 = glade_xml_get_widget(getMainXML(), 205 = glade_xml_get_widget(getMainXML(),
123 "searchNamespaceComboBoxEntry"); 206 "searchNamespaceComboBoxEntry");
124 tmodel = gtk_combo_box_get_model(GTK_COMBO_BOX(searchNamespaceGtkCB));
125 if (TRUE == gtk_combo_box_get_active_iter(GTK_COMBO_BOX(searchNamespaceGtkCB), 207 if (TRUE == gtk_combo_box_get_active_iter(GTK_COMBO_BOX(searchNamespaceGtkCB),
126 &iter)) { 208 &iter)) {
209 const char * descStr;
210 const char * ns;
211
127 ns = NULL; 212 ns = NULL;
128 descStr = NULL; 213 descStr = NULL;
129 gtk_tree_model_get(tmodel, 214 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(searchNamespaceGtkCB)),
130 &iter, 215 &iter,
131 NS_SEARCH_DESCRIPTION, &descStr, 216 NS_SEARCH_DESCRIPTION, &descStr,
132 NS_SEARCH_ENCNAME, &ns, 217 NS_SEARCH_ENCNAME, &ns,
@@ -141,43 +226,47 @@ void on_fssearchbutton_clicked_fs(gpointer dummy2,
141 if (descStr == NULL) 226 if (descStr == NULL)
142 descStr = ns; 227 descStr = ns;
143 } 228 }
144 } 229 if (ns != NULL) {
145 if (ns != NULL) { 230 char * ustring;
146 ustring = MALLOC(strlen(ss) + sizeof(EncName) + 231
147 strlen(ECRS_URI_PREFIX) + 232 ustring = MALLOC(strlen(searchString) + sizeof(EncName) +
148 strlen(ECRS_SUBSPACE_INFIX) + 10); 233 strlen(ECRS_URI_PREFIX) +
149 strcpy(ustring, ECRS_URI_PREFIX); 234 strlen(ECRS_SUBSPACE_INFIX) + 10);
150 strcat(ustring, ECRS_SUBSPACE_INFIX); 235 strcpy(ustring, ECRS_URI_PREFIX);
151 strcat(ustring, ns); 236 strcat(ustring, ECRS_SUBSPACE_INFIX);
152 strcat(ustring, "/"); 237 strcat(ustring, ns);
153 strcat(ustring, ss); 238 strcat(ustring, "/");
154 uri = ECRS_stringToUri(ectx, ustring); 239 strcat(ustring, searchString);
155 if (uri == NULL) { 240 uri = ECRS_stringToUri(ectx, ustring);
156 GE_LOG(ectx, 241 if (uri == NULL) {
157 GE_ERROR | GE_BULK | GE_USER, 242 GE_LOG(ectx,
158 _("Failed to create namespace URI from `%s'.\n"), 243 GE_ERROR | GE_BULK | GE_USER,
159 ustring); 244 _("Failed to create namespace URI from `%s'.\n"),
245 ustring);
246 }
247 FREE(ustring);
160 } 248 }
161 FREE(ustring);
162 } else {
163 uri = ECRS_parseCharKeywordURI(ectx, ss);
164 } 249 }
165 if (uri == NULL) 250 if (uri == NULL)
251 uri = ECRS_parseCharKeywordURI(ectx, searchString);
252 if (uri == NULL) {
253 GE_BREAK(ectx, 0);
166 return; 254 return;
255 }
167 /* check if search is already running */ 256 /* check if search is already running */
168 notebook 257 notebook
169 = glade_xml_get_widget(getMainXML(), 258 = GTK_NOTEBOOK(glade_xml_get_widget(getMainXML(),
170 "downloadNotebook"); 259 "downloadNotebook"));
171 pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); 260 pages = gtk_notebook_get_n_pages(notebook);
172 list = search_head; 261 list = search_head;
173 while (list != NULL) { 262 while (list != NULL) {
174 if (ECRS_equalsUri(list->uri, 263 if (ECRS_equalsUri(list->uri,
175 uri)) { 264 uri)) {
176 for (i=0;i<pages;i++) { 265 for (i=0;i<pages;i++) {
177 page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), 266 if (gtk_notebook_get_nth_page(notebook,
178 i); 267 i)
179 if (page == list->searchpage) { 268 == list->searchpage) {
180 gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 269 gtk_notebook_set_current_page(notebook,
181 i); 270 i);
182 ECRS_freeUri(uri); 271 ECRS_freeUri(uri);
183 return; 272 return;
@@ -188,35 +277,46 @@ void on_fssearchbutton_clicked_fs(gpointer dummy2,
188 list = list->next; 277 list = list->next;
189 } 278 }
190 FSUI_startSearch(ctx, 279 FSUI_startSearch(ctx,
191 getAnonymityLevel(getMainXML(), 280 getSpinButtonValue(getMainXML(),
192 "searchAnonymitySelectionSpinButton"), 281 "searchAnonymitySelectionSpinButton"),
193 1000, /* FIXME: max results */ 282 getSpinButtonValue(getMainXML(),
194 99 * cronYEARS, /* FIXME: timeout */ 283 "maxResultsSpinButton"),
284 getSpinButtonValue(getMainXML(),
285 "searchDelaySpinButton") * cronSECONDS,
195 uri); 286 uri);
196} 287}
197 288
289/**
290 * This method is called when the user clicks on either
291 * the "CLOSE" button (at the bottom of the search page)
292 * or on the "CANCEL (X)" button in the TAB of the
293 * search notebook. Note that "searchPage" can thus
294 * either refer to the main page in the tab or to the
295 * main entry of the tab label.
296 */
198void on_closeSearchButton_clicked_fs(GtkWidget * searchPage, 297void on_closeSearchButton_clicked_fs(GtkWidget * searchPage,
199 GtkWidget * closeButton) { 298 GtkWidget * closeButton) {
200 SearchList * list; 299 SearchList * list;
201 300
202 DEBUG_BEGIN();
203 list = search_head; 301 list = search_head;
204 while (list != NULL) { 302 while (list != NULL) {
205 if (list->searchpage == searchPage) 303 if ( (list->searchpage == searchPage) ||
304 (list->tab_label == searchPage) )
206 break; 305 break;
207 list = list->next; 306 list = list->next;
208 } 307 }
209 GE_ASSERT(ectx, list != NULL); 308 GE_ASSERT(ectx, list != NULL);
210 FSUI_stopSearch(ctx, 309 FSUI_stopSearch(ctx,
211 list->fsui_list); 310 list->fsui_list);
212 DEBUG_END();
213} 311}
214 312
313/**
314 * The abort button was clicked. Abort the search.
315 */
215void on_abortSearchButton_clicked_fs(GtkWidget * searchPage, 316void on_abortSearchButton_clicked_fs(GtkWidget * searchPage,
216 GtkWidget * closeButton) { 317 GtkWidget * closeButton) {
217 SearchList * list; 318 SearchList * list;
218 319
219 DEBUG_BEGIN();
220 list = search_head; 320 list = search_head;
221 while (list != NULL) { 321 while (list != NULL) {
222 if (list->searchpage == searchPage) 322 if (list->searchpage == searchPage)
@@ -226,25 +326,27 @@ void on_abortSearchButton_clicked_fs(GtkWidget * searchPage,
226 GE_ASSERT(ectx, list != NULL); 326 GE_ASSERT(ectx, list != NULL);
227 FSUI_abortSearch(ctx, 327 FSUI_abortSearch(ctx,
228 list->fsui_list); 328 list->fsui_list);
229 DEBUG_END();
230} 329}
231 330
232static void stopSearch(GtkTreeModel * model, 331static void stopSearch(GtkTreeModel * model,
233 GtkTreePath * path, 332 GtkTreePath * path,
234 GtkTreeIter * iter, 333 GtkTreeIter * iter,
235 gpointer unused) { 334 gpointer unused) {
236 struct FSUI_SearchList * s; 335 struct SL * s;
237 336
238 s = NULL; 337 s = NULL;
239 gtk_tree_model_get(model, 338 gtk_tree_model_get(model,
240 iter, 339 iter,
241 SER_SUM_FSUI, &s, 340 SEARCH_SUMMARY_INTERNAL, &s,
242 -1); 341 -1);
243 if (s != NULL) 342 if (s != NULL)
244 FSUI_stopSearch(ctx, 343 FSUI_stopSearch(ctx,
245 s); 344 s->fsui_list);
246} 345}
247 346
347/**
348 * The stop button in the search summary was clicked.
349 */
248void on_closeSearchSummaryButton_clicked_fs(GtkWidget * treeview, 350void on_closeSearchSummaryButton_clicked_fs(GtkWidget * treeview,
249 GtkWidget * closeButton) { 351 GtkWidget * closeButton) {
250 GtkTreeSelection * selection; 352 GtkTreeSelection * selection;
@@ -260,18 +362,21 @@ static void abortSearch(GtkTreeModel * model,
260 GtkTreePath * path, 362 GtkTreePath * path,
261 GtkTreeIter * iter, 363 GtkTreeIter * iter,
262 gpointer unused) { 364 gpointer unused) {
263 struct FSUI_SearchList * s; 365 struct SL * s;
264 366
265 s = NULL; 367 s = NULL;
266 gtk_tree_model_get(model, 368 gtk_tree_model_get(model,
267 iter, 369 iter,
268 SER_SUM_FSUI, &s, 370 SEARCH_SUMMARY_INTERNAL, &s,
269 -1); 371 -1);
270 if (s != NULL) 372 if (s != NULL)
271 FSUI_abortSearch(ctx, 373 FSUI_abortSearch(ctx,
272 s); 374 s->fsui_list);
273} 375}
274 376
377/**
378 * The abort button in the search summary was clicked.
379 */
275void on_abortSearchSummaryButton_clicked_fs(GtkWidget * treeview, 380void on_abortSearchSummaryButton_clicked_fs(GtkWidget * treeview,
276 GtkWidget * closeButton) { 381 GtkWidget * closeButton) {
277 GtkTreeSelection * selection; 382 GtkTreeSelection * selection;
@@ -284,6 +389,42 @@ void on_abortSearchSummaryButton_clicked_fs(GtkWidget * treeview,
284} 389}
285 390
286/** 391/**
392 * Update the number of results received for the given
393 * search in the summary and in the label of the tab.
394 */
395static void updateSearchSummary(struct SL * searchContext) {
396 GtkTreePath * path;
397 GtkTreeIter iter;
398 char * new_title;
399 GtkWidget * label;
400
401 path = gtk_tree_row_reference_get_path(searchContext->summaryViewRowReference);
402 if (TRUE != gtk_tree_model_get_iter(GTK_TREE_MODEL(search_summary),
403 &iter,
404 path)) {
405 GE_BREAK(ectx, 0);
406 return;
407 }
408 gtk_tree_path_free(path);
409 gtk_list_store_set(search_summary,
410 &iter,
411 SEARCH_SUMMARY_RESULT_COUNT, searchContext->resultsReceived,
412 -1);
413
414
415
416 /* update tab title with the number of results */
417 new_title =
418 g_strdup_printf("%s (%u)",
419 searchContext->searchString,
420 searchContext->resultsReceived);
421 label = glade_xml_get_widget(searchContext->labelXML,
422 "searchTabLabel");
423 gtk_label_set(label, new_title);
424 FREE(new_title);
425}
426
427/**
287 * Add the given result to the model (search result 428 * Add the given result to the model (search result
288 * list). 429 * list).
289 * 430 *
@@ -297,85 +438,20 @@ void fs_search_result_received(struct SL * searchContext,
297 char * name; 438 char * name;
298 char * mime; 439 char * mime;
299 char * desc; 440 char * desc;
300 unsigned char * thumb;
301 size_t ts;
302 GdkPixbuf * pixbuf;
303 GdkPixbufLoader * loader;
304 unsigned long long size; 441 unsigned long long size;
305 char * size_h; 442 char * size_h;
306 GtkTreeStore * model; 443 GtkTreeStore * model;
307 GtkTreeIter iter; 444 GtkTreeIter iter;
308 unsigned int * file_count;
309 GtkWidget * tab_label;
310 const char * tab_title;
311 char * new_title;
312 struct ECRS_URI * euri;
313 445
314 DEBUG_BEGIN(); 446 mime = getMimeTypeFromMetaData(info->meta);
447 desc = getDescriptionFromMetaData(info->meta);
448 name = getFileNameFromMetaData(info->meta);
449 size = ECRS_isFileUri(info->uri) ? ECRS_fileSize(info->uri) : 0
450 pixbuf = getThumbnailFromMetaData(info->meta);
451 size_h = string_get_fancy_byte_size(size);
315 model = GTK_TREE_STORE 452 model = GTK_TREE_STORE
316 (gtk_tree_view_get_model 453 (gtk_tree_view_get_model
317 (GTK_TREE_VIEW(searchContext->treeview))); 454 (GTK_TREE_VIEW(searchContext->treeview)));
318 mime = ECRS_getFromMetaData(info->meta,
319 EXTRACTOR_MIMETYPE);
320 if (mime == NULL)
321 mime = STRDUP(_("unknown"));
322 mime = validate_utf8(mime);
323 desc = ECRS_getFirstFromMetaData(info->meta,
324 EXTRACTOR_DESCRIPTION,
325 EXTRACTOR_GENRE,
326 EXTRACTOR_ALBUM,
327 EXTRACTOR_COMMENT,
328 EXTRACTOR_SUBJECT,
329 EXTRACTOR_FORMAT,
330 EXTRACTOR_SIZE,
331 EXTRACTOR_KEYWORDS,
332 -1);
333 if (desc == NULL)
334 desc = STRDUP("");
335 desc = validate_utf8(desc);
336 name = ECRS_getFirstFromMetaData(info->meta,
337 EXTRACTOR_FILENAME,
338 EXTRACTOR_TITLE,
339 EXTRACTOR_ARTIST,
340 EXTRACTOR_AUTHOR,
341 EXTRACTOR_PUBLISHER,
342 EXTRACTOR_CREATOR,
343 EXTRACTOR_PRODUCER,
344 EXTRACTOR_UNKNOWN,
345 -1);
346 if (name == NULL) {
347 name = STRDUP(_("no name given"));
348 } else {
349 char * dotdot;
350
351 while (NULL != (dotdot = strstr(name, "..")))
352 dotdot[0] = dotdot[1] = '_';
353 }
354 name = validate_utf8(name);
355
356 if (ECRS_isFileUri(info->uri))
357 size = ECRS_fileSize(info->uri);
358 else
359 size = 0;
360 thumb = NULL;
361 ts = ECRS_getThumbnailFromMetaData(info->meta,
362 &thumb);
363 if (ts != 0) {
364 loader = gdk_pixbuf_loader_new();
365 gdk_pixbuf_loader_write(loader,
366 (const guchar*) thumb,
367 ts,
368 NULL);
369 pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
370 gdk_pixbuf_loader_close(loader,
371 NULL);
372 if (pixbuf != NULL)
373 g_object_ref(pixbuf);
374 UNREF(loader);
375 } else {
376 pixbuf = NULL;
377 }
378 size_h = string_get_fancy_byte_size(size);
379 gtk_tree_store_append(model, 455 gtk_tree_store_append(model,
380 &iter, 456 &iter,
381 NULL); 457 NULL);
@@ -392,82 +468,35 @@ void fs_search_result_received(struct SL * searchContext,
392 SEARCH_INTERNAL, searchContext, 468 SEARCH_INTERNAL, searchContext,
393 -1); 469 -1);
394 FREE(size_h); 470 FREE(size_h);
395 FREE(mime);
396 FREE(desc);
397 FREE(name); 471 FREE(name);
398 FREENONNULL(thumb); 472 FREE(desc);
399 473 FREE(mime);
400 /* update tab title with the number of results */ 474 /* UNREF pixbuf? */
401 file_count = (unsigned int *) 475 searchContext->resultsReceived++;
402 g_object_get_data(G_OBJECT(searchContext->searchpage), "file_count"); 476 updateSearchSummary(searchContext);
403 (*file_count)++;
404 tab_label = (GtkWidget *)
405 g_object_get_data(G_OBJECT(searchContext->searchpage), "label");
406 tab_title = (const char *)
407 g_object_get_data(G_OBJECT(searchContext->searchpage), "title");
408 new_title =
409 g_strdup_printf("%s%s%u%s",
410 tab_title, " (", *file_count, ")");
411 gtk_label_set(GTK_LABEL(tab_label), new_title);
412 FREE(new_title);
413
414 if (! gtk_tree_model_get_iter_first(GTK_TREE_MODEL(search_summary),
415 &iter)) {
416 GE_BREAK(ectx, 0);
417 return;
418 }
419
420 do {
421 gtk_tree_model_get(GTK_TREE_MODEL(search_summary),
422 &iter,
423 SER_SUM_URI, &euri,
424 -1);
425 if (ECRS_equalsUri(euri,
426 uri)) {
427 gtk_list_store_set(GTK_LIST_STORE(search_summary),
428 &iter,
429 SER_SUM_COUNT, *file_count,
430 -1);
431 DEBUG_END();
432 return;
433 }
434
435 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(search_summary),
436 &iter));
437} 477}
438 478
439SearchList * 479/**
480 * FSUI event: a search was started; create the
481 * tab and add an entry to the summary.
482 */
483struct SL *
440fs_search_started(struct FSUI_SearchList * fsui_list, 484fs_search_started(struct FSUI_SearchList * fsui_list,
441 const struct ECRS_URI * uri, 485 const struct ECRS_URI * uri,
442 unsigned int anonymityLevel, 486 unsigned int anonymityLevel,
443 unsigned int resultCount, 487 unsigned int resultCount,
444 const ECRS_FileInfo * results) { 488 const ECRS_FileInfo * results) {
445 GtkWidget * notebook; 489 struct SL * list;
446 GtkWidget * label;
447 GtkTreeIter iter;
448 SearchList * list;
449 char * tabtxt;
450 int i;
451 const char * dhead;
452 gint pages; 490 gint pages;
453 char * description; 491 char * description;
454 492 const char * dhead;
455 notebook 493 GtkContainer * window;
456 = glade_xml_get_widget(getMainXML(), 494 GtkTreeViewColumn * column;
457 "downloadNotebook"); 495 GtkCellRenderer * renderer;
458 list 496 int col;
459 = MALLOC(sizeof(SearchList)); 497 GtkNotebook * notebook;
460 list->searchpage 498 GtkTreePath * path;
461 = makeSearchResultFrame(cfg, 499 GtkTreeIter iter;
462 &list->treeview,
463 &list->anonymityButton);
464 list->uri
465 = ECRS_dupUri(uri);
466 list->next
467 = search_head;
468 list->fsui_list
469 = fsui_list;
470 search_head = list;
471 500
472 description = ECRS_uriToString(uri); 501 description = ECRS_uriToString(uri);
473 if (description == NULL) { 502 if (description == NULL) {
@@ -485,31 +514,169 @@ fs_search_started(struct FSUI_SearchList * fsui_list,
485 ECRS_SUBSPACE_INFIX, 514 ECRS_SUBSPACE_INFIX,
486 strlen(ECRS_SUBSPACE_INFIX))) 515 strlen(ECRS_SUBSPACE_INFIX)))
487 dhead = &dhead[strlen(ECRS_SUBSPACE_INFIX)]; 516 dhead = &dhead[strlen(ECRS_SUBSPACE_INFIX)];
517 list
518 = MALLOC(sizeof(struct SL));
519 memset(list,
520 0,
521 sizeof(struct SL));
522 list->searchString
523 = STRDUP(dhead);
524 FREE(description);
525 list->uri
526 = ECRS_dupUri(uri);
527 list->fsui_list
528 = fsui_list;
529 list->next
530 = search_head;
531 search_head = list;
532 list->searchXML
533 = glade_xml_new(getGladeFileName(),
534 "searchResultsFrame",
535 PACKAGE_NAME);
536 connectGladeWithPlugins(list->searchXML);
537 list->searchpage
538 = extractMainWidgetFromWindow(list->searchXML,
539 "searchResultsFrame");
540 /* setup tree view and renderers */
541 list->treeview = GTK_TREE_VIEW(glade_xml_get_widget(list->searchXML,
542 "searchResults"));
543
544 list->tree =
545 gtk_tree_store_new(SEARCH_NUM,
546 G_TYPE_STRING, /* name */
547 G_TYPE_UINT64, /* size */
548 G_TYPE_STRING, /* human-readable size */
549 G_TYPE_STRING, /* mime-type */
550 G_TYPE_STRING, /* meta-data (some) */
551 GDK_TYPE_PIXBUF, /* preview */
552 G_TYPE_POINTER, /* url */
553 G_TYPE_POINTER, /* meta */
554 G_TYPE_POINTER); /* internal: download info/NULL */
555
556 gtk_tree_view_set_model(list->treeview,
557 GTK_TREE_MODEL(list->tree));
558 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(list->treeview),
559 GTK_SELECTION_MULTIPLE);
488 560
489 tabtxt = STRDUP("foo"); /* FIXME! */ 561 renderer = gtk_cell_renderer_text_new();
562 col = gtk_tree_view_insert_column_with_attributes(list->treeview,
563 -1,
564 _("Name"),
565 renderer,
566 "text", SEARCH_NAME,
567 NULL);
568 column = gtk_tree_view_get_column(list->treeview,
569 col - 1);
570 gtk_tree_view_column_set_resizable(column, TRUE);
571 gtk_tree_view_column_set_clickable(column, TRUE);
572 gtk_tree_view_column_set_reorderable(column, TRUE);
573 gtk_tree_view_column_set_sort_column_id(column, SEARCH_NAME);
574
575 renderer = gtk_cell_renderer_text_new();
576 g_object_set (renderer, "xalign", 1.00, NULL);
577 col = gtk_tree_view_insert_column_with_attributes(list->treeview,
578 -1,
579 _("Size"),
580 renderer,
581 "text", SEARCH_HSIZE,
582 NULL);
583 column = gtk_tree_view_get_column(list->treeview,
584 col - 1);
585 gtk_tree_view_column_set_resizable(column, TRUE);
586 gtk_tree_view_column_set_clickable(column, TRUE);
587 gtk_tree_view_column_set_reorderable(column, TRUE);
588 gtk_tree_view_column_set_sort_column_id(column, SEARCH_SIZE);
589
590 renderer = gtk_cell_renderer_text_new();
591 col = gtk_tree_view_insert_column_with_attributes(list->treeview,
592 -1,
593 _("Mime-type"),
594 renderer,
595 "text", SEARCH_MIME,
596 NULL);
597 column = gtk_tree_view_get_column(list->treeview,
598 col - 1);
599 gtk_tree_view_column_set_resizable(column, TRUE);
600 gtk_tree_view_column_set_clickable(column, TRUE);
601 gtk_tree_view_column_set_reorderable(column, TRUE);
602 gtk_tree_view_column_set_sort_column_id(column, SEARCH_MIME);
603
604 renderer = gtk_cell_renderer_text_new();
605 col = gtk_tree_view_insert_column_with_attributes(list->treeview,
606 -1,
607 _("Meta-data"),
608 renderer,
609 "text", SEARCH_DESC,
610 NULL);
611 column = gtk_tree_view_get_column(list->treeview,
612 col - 1);
613 gtk_tree_view_column_set_resizable(column, TRUE);
614 gtk_tree_view_column_set_clickable(column, TRUE);
615 gtk_tree_view_column_set_reorderable(column, TRUE);
616 gtk_tree_view_column_set_sort_column_id(column, SEARCH_DESC);
617 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
618 if (YES != GC_get_configuration_value_yesno(cfg,
619 "GNUNET-GTK",
620 "DISABLE-PREVIEWS",
621 NO)) {
622 renderer = gtk_cell_renderer_pixbuf_new();
623 col = gtk_tree_view_insert_column_with_attributes(list->treeview,
624 -1,
625 _("Preview"),
626 renderer,
627 "pixbuf", SEARCH_PIXBUF,
628 NULL);
629 column = gtk_tree_view_get_column(list->treeview,
630 col - 1);
631 gtk_tree_view_column_set_resizable(column, TRUE);
632 gtk_tree_view_column_set_reorderable(column, TRUE);
633 gtk_tree_view_column_set_resizable(column, TRUE);
634 }
635
636
637 /* add entry in search summary */
490 gtk_list_store_append(search_summary, 638 gtk_list_store_append(search_summary,
491 &iter); 639 &iter);
492 gtk_list_store_set(search_summary, 640 gtk_list_store_set(search_summary,
493 &iter, 641 &iter,
494 SER_SUM_NAME, dhead, 642 SEARCH_SUMMARY_NAME, dhead,
495 SER_SUM_COUNT, 0, 643 SEARCH_SUMMARY_RESULT_COUNT, 0,
496 SER_SUM_URI, ECRS_dupUri(uri), 644 SEARCH_SUMMARY_INTERNAL, list,
497 -1); 645 -1);
498 label = buildSearchTabLabel(list->searchpage, 646 path = gtk_tree_model_get_path(GTK_TREE_MODEL(search_summary),
499 dhead); 647 &iter);
500 pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)); 648 list->summaryViewRowReference
501 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), 649 = gtk_tree_row_reference_new(GTK_TREE_MODEL(search_summary),
502 list->searchpage, 650 path);
503 label); 651 gtk_tree_path_free(path);
504 gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 652
505 pages); 653 /* load label */
506 gtk_widget_show(notebook); 654 list->labelXML
507 FREE(description); 655 = glade_xml_new(getGladeFileName(),
656 "searchTabLabelWindow",
657 PACKAGE_NAME);
658 list->tab_label
659 = extractMainWidgetFromWindow(list->labelXML,
660 "searchTabLabelWindow");
661
662 /* process existing results */
508 for (i=0;i<resultCount;i++) 663 for (i=0;i<resultCount;i++)
509 fs_search_result_received(list, 664 fs_search_result_received(list,
510 &results[i], 665 &results[i],
511 uri); 666 uri);
512 DEBUG_END(); 667
668 /* insert new page into search notebook */
669 notebook
670 = GTK_NOTEBOOK(glade_xml_get_widget(getMainXML(),
671 "downloadNotebook"));
672 pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook));
673 gtk_notebook_append_page(notebook,
674 list->searchpage,
675 list->tab_label);
676 gtk_notebook_set_current_page(notebook,
677 pages);
678 gtk_widget_show(GTK_WIDGET(notebook)); /* may have been hidden! */
679
513 return list; 680 return list;
514} 681}
515 682
@@ -548,15 +715,21 @@ static void freeIterSubtree(GtkTreeModel * tree,
548 iter)); 715 iter));
549} 716}
550 717
718/**
719 * FSUI event: a search was stopped. Remove the
720 * respective tab and its entry in the summary.
721 */
551void fs_search_stopped(SearchList * list) { 722void fs_search_stopped(SearchList * list) {
552 GtkWidget * notebook; 723 GtkNotebook * notebook;
553 int index; 724 int index;
554 int i; 725 int i;
555 GtkTreeIter iter; 726 GtkTreeIter iter;
556 struct ECRS_URI * euri; 727 struct ECRS_URI * euri;
557 SearchList * prev; 728 SearchList * prev;
729 DownloadList * downloads;
730 GtkTreePath * path;
558 731
559 DEBUG_BEGIN(); 732 /* remove from linked list */
560 if (search_head == list) { 733 if (search_head == list) {
561 search_head = search_head->next; 734 search_head = search_head->next;
562 } else { 735 } else {
@@ -565,48 +738,53 @@ void fs_search_stopped(SearchList * list) {
565 prev = prev->next; 738 prev = prev->next;
566 prev->next = list->next; 739 prev->next = list->next;
567 } 740 }
741
742 /* remove links from download views */
743 downloads = download_head;
744 while (downloads != NULL) {
745 if (download->searchList == list) {
746 gtk_tree_row_reference_free(download->searchViewRowReference);
747 download->searchViewRowReference = NULL;
748 download->searchList = NULL;
749 }
750 downloads = downloads->next;
751 }
752
753 /* remove page from notebook */
568 notebook 754 notebook
569 = glade_xml_get_widget(getMainXML(), 755 = GTK_NOTEBOOK(glade_xml_get_widget(getMainXML(),
570 "downloadNotebook"); 756 "downloadNotebook"));
571 index = -1; 757 index = -1;
572 for (i=gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook))-1;i>=0;i--) 758 for (i=gtk_notebook_get_n_pages(notebook)-1;i>=0;i--)
573 if (list->searchpage == gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), 759 if (list->searchpage == gtk_notebook_get_nth_page(notebook,
574 i)) 760 i))
575 index = i; 761 index = i;
576 gtk_notebook_remove_page(GTK_NOTEBOOK(notebook), 762 GE_BREAK(ectx, index != -1);
763 gtk_notebook_remove_page(notebook,
577 index); 764 index);
578#if 0 765
579 /* recursively free download tree */ 766 /* recursively free search model */
580 if (gtk_tree_model_get_iter_first(list->model, 767 if (gtk_tree_model_get_iter_first(list->model,
581 &iter)) 768 &iter))
582 freeIterSubtree(list->model, 769 freeIterSubtree(list->model,
583 &iter); 770 &iter);
584#endif 771
585 if (! gtk_tree_model_get_iter_first(GTK_TREE_MODEL(search_summary), 772 /* destroy entry in summary */
586 &iter)) { 773 path = gtk_tree_row_reference_get_path(list->summaryViewRowReference);
587 GE_BREAK(ectx, 0); 774 gtk_tree_model_get_iter(GTK_TREE_MODEL(search_summary),
588 ECRS_freeUri(list->uri); 775 &iter,
589 FREE(list); 776 path);
590 DEBUG_END(); 777 gtk_tree_path_free(path);
591 return; 778 gtk_list_store_remove(search_summary,
592 } 779 &iter);
593 do { 780
594 gtk_tree_model_get(GTK_TREE_MODEL(search_summary), 781 /* free list state itself */
595 &iter, 782 UNREF(list->searchXML);
596 SER_SUM_URI, &euri, 783 UNREF(list->labelXML);
597 -1); 784 gtk_tree_row_reference_free(list->summaryViewRowReference);
598 if (ECRS_equalsUri(euri, 785 FREE(list->searchString);
599 list->uri)) {
600 gtk_list_store_remove(GTK_LIST_STORE(search_summary),
601 &iter);
602 ECRS_freeUri(euri);
603 break;
604 }
605 } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(search_summary),
606 &iter));
607 ECRS_freeUri(list->uri); 786 ECRS_freeUri(list->uri);
608 FREE(list); 787 FREE(list);
609 DEBUG_END();
610} 788}
611 789
612 790
@@ -678,12 +856,16 @@ static int addFilesToDirectory
678} 856}
679#endif 857#endif
680 858
859
681/** 860/**
682 * FIXME: somehow need way to pass 861 * A download has been started. Add an entry
683 * tree path for search into this download! 862 * to the search tree view (if applicable) and
863 * the download summary.
684 */ 864 */
685struct DL * 865struct DL *
686fs_download_started(struct FSUI_DownloadList * fsui_dl, 866fs_download_started(struct FSUI_DownloadList * fsui_dl,
867 struct DL * dl_parent,
868 struct SL * sl_parent,
687 unsigned long long total, 869 unsigned long long total,
688 unsigned int anonymityLevel, 870 unsigned int anonymityLevel,
689 const ECRS_FileInfo * fi, 871 const ECRS_FileInfo * fi,
@@ -1209,25 +1391,28 @@ void on_abortDownloadButton_clicked_fs(void * unused,
1209 1391
1210 1392
1211 1393
1394/* *************** startup/shutdown ****************** */
1212 1395
1213 1396/**
1397 * Setup the summary views (in particular the models
1398 * and the renderers).
1399 */
1214void fs_search_start(struct GE_Context * e, 1400void fs_search_start(struct GE_Context * e,
1215 struct GC_Configuration * c) { 1401 struct GC_Configuration * c) {
1216 GtkWidget * searchCB; 1402 GtkComboBoxEntry * searchCB;
1217 GtkWidget * searchList; 1403 GtkTreeView * searchList;
1404 GtkTreeView * downloadList;
1218 GtkListStore * model; 1405 GtkListStore * model;
1219 GtkCellRenderer * renderer; 1406 GtkCellRenderer * renderer;
1220 GtkTreeViewColumn * column; 1407 GtkTreeViewColumn * column;
1221 int col; 1408 int col;
1222 GtkWidget * downloadList;
1223 1409
1224 ectx = e; 1410 ectx = e;
1225 cfg = c; 1411 cfg = c;
1226 DEBUG_BEGIN();
1227 searchCB 1412 searchCB
1228 = glade_xml_get_widget(getMainXML(), 1413 = GTK_COMBO_BOX_ENTRY(glade_xml_get_widget(getMainXML(),
1229 "fssearchKeywordComboBoxEntry"); 1414 "fssearchKeywordComboBoxEntry"));
1230 1415
1231 model = gtk_list_store_new(NS_SEARCH_NUM, 1416 model = gtk_list_store_new(NS_SEARCH_NUM,
1232 G_TYPE_STRING, /* what we show */ 1417 G_TYPE_STRING, /* what we show */
1233 G_TYPE_STRING, /* EncName of namespace */ 1418 G_TYPE_STRING, /* EncName of namespace */
@@ -1236,54 +1421,52 @@ void fs_search_start(struct GE_Context * e,
1236 G_TYPE_INT); /* Meta-data about namespace */ 1421 G_TYPE_INT); /* Meta-data about namespace */
1237 gtk_combo_box_set_model(GTK_COMBO_BOX(searchCB), 1422 gtk_combo_box_set_model(GTK_COMBO_BOX(searchCB),
1238 GTK_TREE_MODEL(model)); 1423 GTK_TREE_MODEL(model));
1239 gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(searchCB), 1424 gtk_combo_box_entry_set_text_column(searchCB,
1240 NS_SEARCH_DESCRIPTION); 1425 NS_SEARCH_DESCRIPTION);
1241 searchList = glade_xml_get_widget(getMainXML(), 1426 searchList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(),
1242 "activeSearchesSummary"); 1427 "activeSearchesSummary"));
1243 search_summary = 1428 search_summary =
1244 gtk_list_store_new(SER_SUM_NUM, 1429 gtk_list_store_new(SER_SUM_NUM,
1245 G_TYPE_STRING, /* name */ 1430 G_TYPE_STRING, /* name */
1246 G_TYPE_INT, /* # results */ 1431 G_TYPE_INT, /* # results */
1247 G_TYPE_POINTER, /* internal: FSUI search list */ 1432 G_TYPE_POINTER); /* internal: search list */
1248 G_TYPE_POINTER); /* internal: uri */ 1433 gtk_tree_view_set_model(searchList,
1249 gtk_tree_view_set_model(GTK_TREE_VIEW(searchList),
1250 GTK_TREE_MODEL(search_summary)); 1434 GTK_TREE_MODEL(search_summary));
1435 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(searchList),
1436 GTK_SELECTION_MULTIPLE);
1437
1251 renderer = gtk_cell_renderer_text_new(); 1438 renderer = gtk_cell_renderer_text_new();
1252 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(searchList), 1439 col = gtk_tree_view_insert_column_with_attributes(searchList,
1253 -1, 1440 -1,
1254 _("Query"), 1441 _("Query"),
1255 renderer, 1442 renderer,
1256 "text", SER_SUM_NAME, 1443 "text", SERARCH_SUMMARY_NAME,
1257 NULL); 1444 NULL);
1258 column = gtk_tree_view_get_column(GTK_TREE_VIEW(searchList), 1445 column = gtk_tree_view_get_column(searchList,
1259 col - 1); 1446 col - 1);
1260 gtk_tree_view_column_set_resizable(column, TRUE); 1447 gtk_tree_view_column_set_resizable(column, TRUE);
1261 gtk_tree_view_column_set_clickable(column, TRUE); 1448 gtk_tree_view_column_set_clickable(column, TRUE);
1262 gtk_tree_view_column_set_reorderable(column, TRUE); 1449 gtk_tree_view_column_set_reorderable(column, TRUE);
1263 gtk_tree_view_column_set_sort_column_id(column, SER_SUM_NAME); 1450 gtk_tree_view_column_set_sort_column_id(column, SER_SUM_NAME);
1264 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(searchList), 1451 gtk_tree_view_column_set_resizable(column, TRUE);
1265 col - 1),
1266 TRUE);
1267 renderer = gtk_cell_renderer_text_new(); 1452 renderer = gtk_cell_renderer_text_new();
1268 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(searchList), 1453 col = gtk_tree_view_insert_column_with_attributes(searchList,
1269 -1, 1454 -1,
1270 _("Results"), 1455 _("Results"),
1271 renderer, 1456 renderer,
1272 "text", SER_SUM_COUNT, 1457 "text", SERARCH_SUMMARY_RESULT_COUNT,
1273 NULL); 1458 NULL);
1274 column = gtk_tree_view_get_column(GTK_TREE_VIEW(searchList), 1459 column = gtk_tree_view_get_column(searchList,
1275 col - 1); 1460 col - 1);
1276 gtk_tree_view_column_set_resizable(column, TRUE); 1461 gtk_tree_view_column_set_resizable(column, TRUE);
1277 gtk_tree_view_column_set_clickable(column, TRUE); 1462 gtk_tree_view_column_set_clickable(column, TRUE);
1278 gtk_tree_view_column_set_reorderable(column, TRUE); 1463 gtk_tree_view_column_set_reorderable(column, TRUE);
1279 gtk_tree_view_column_set_sort_column_id(column, SER_SUM_COUNT); 1464 gtk_tree_view_column_set_sort_column_id(column, SER_SUM_COUNT);
1280 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(searchList), 1465 gtk_tree_view_column_set_resizable(column, TRUE);
1281 col - 1),
1282 TRUE);
1283 1466
1284 1467
1285 downloadList = glade_xml_get_widget(getMainXML(), 1468 downloadList = GTK_TREE_VIEW(glade_xml_get_widget(getMainXML(),
1286 "activeDownloadsList"); 1469 "activeDownloadsList"));
1287 download_summary = 1470 download_summary =
1288 gtk_tree_store_new(DOWNLOAD_NUM, 1471 gtk_tree_store_new(DOWNLOAD_NUM,
1289 G_TYPE_STRING, /* name (full-path file name) */ 1472 G_TYPE_STRING, /* name (full-path file name) */
@@ -1291,68 +1474,73 @@ void fs_search_start(struct GE_Context * e,
1291 G_TYPE_UINT64, /* size */ 1474 G_TYPE_UINT64, /* size */
1292 G_TYPE_STRING, /* human readable size */ 1475 G_TYPE_STRING, /* human readable size */
1293 G_TYPE_INT, /* progress */ 1476 G_TYPE_INT, /* progress */
1294 G_TYPE_STRING, /* uri */ 1477 G_TYPE_STRING, /* uri as string */
1295 G_TYPE_POINTER, /* url */ 1478 G_TYPE_POINTER); /* internal download list ptr */
1296 G_TYPE_POINTER, /* internal: gtk tree path / NULL */ 1479 gtk_tree_view_set_model(downloadList,
1297 G_TYPE_POINTER); /* directory path if file is inside a dir */
1298 gtk_tree_view_set_model(GTK_TREE_VIEW(downloadList),
1299 GTK_TREE_MODEL(download_summary)); 1480 GTK_TREE_MODEL(download_summary));
1481 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(downloadList),
1482 GTK_SELECTION_MULTIPLE);
1300 renderer = gtk_cell_renderer_progress_new(); 1483 renderer = gtk_cell_renderer_progress_new();
1301 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList), 1484 col = gtk_tree_view_insert_column_with_attributes(downloadList,
1302 -1, 1485 -1,
1303 _("Name"), 1486 _("Name"),
1304 renderer, 1487 renderer,
1305 "value", DOWNLOAD_PROGRESS, 1488 "value", DOWNLOAD_PROGRESS,
1306 "text", DOWNLOAD_SHORTNAME, 1489 "text", DOWNLOAD_SHORTNAME,
1307 NULL); 1490 NULL);
1308 column = gtk_tree_view_get_column(GTK_TREE_VIEW(downloadList), 1491 column = gtk_tree_view_get_column(downloadList,
1309 col - 1); 1492 col - 1);
1310 gtk_tree_view_column_set_resizable(column, TRUE); 1493 gtk_tree_view_column_set_resizable(column, TRUE);
1311 gtk_tree_view_column_set_clickable(column, TRUE); 1494 gtk_tree_view_column_set_clickable(column, TRUE);
1312 gtk_tree_view_column_set_reorderable(column, TRUE); 1495 gtk_tree_view_column_set_reorderable(column, TRUE);
1313 gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_PROGRESS); 1496 gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_PROGRESS);
1314 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/ 1497 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
1315 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(downloadList), 1498 gtk_tree_view_column_set_resizable(column, TRUE);
1316 col - 1),
1317 TRUE);
1318 renderer = gtk_cell_renderer_text_new(); 1499 renderer = gtk_cell_renderer_text_new();
1319 g_object_set (renderer, "xalign", 1.00, NULL); 1500 g_object_set (renderer, "xalign", 1.00, NULL);
1320 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList), 1501 col = gtk_tree_view_insert_column_with_attributes(downloadList,
1321 -1, 1502 -1,
1322 _("Size"), 1503 _("Size"),
1323 renderer, 1504 renderer,
1324 "text", DOWNLOAD_HSIZE, 1505 "text", DOWNLOAD_HSIZE,
1325 NULL); 1506 NULL);
1326 1507
1327 column = gtk_tree_view_get_column(GTK_TREE_VIEW(downloadList), 1508 column = gtk_tree_view_get_column(downloadList,
1328 col - 1); 1509 col - 1);
1329 gtk_tree_view_column_set_resizable(column, TRUE); 1510 gtk_tree_view_column_set_resizable(column, TRUE);
1330 gtk_tree_view_column_set_clickable(column, TRUE); 1511 gtk_tree_view_column_set_clickable(column, TRUE);
1331 gtk_tree_view_column_set_reorderable(column, TRUE); 1512 gtk_tree_view_column_set_reorderable(column, TRUE);
1332 gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_SIZE); 1513 gtk_tree_view_column_set_sort_column_id(column, DOWNLOAD_SIZE);
1333 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/ 1514 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
1334 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(downloadList), 1515 gtk_tree_view_column_set_resizable(column, TRUE);
1335 col - 1),
1336 TRUE);
1337 renderer = gtk_cell_renderer_text_new(); 1516 renderer = gtk_cell_renderer_text_new();
1338 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(downloadList), 1517 col = gtk_tree_view_insert_column_with_attributes(downloadList,
1339 -1, 1518 -1,
1340 _("URI"), 1519 _("URI"),
1341 renderer, 1520 renderer,
1342 "text", DOWNLOAD_URISTRING, 1521 "text", DOWNLOAD_URISTRING,
1343 NULL); 1522 NULL);
1344 column = gtk_tree_view_get_column(GTK_TREE_VIEW(downloadList), 1523 column = gtk_tree_view_get_column(downloadList,
1345 col - 1); 1524 col - 1);
1346 gtk_tree_view_column_set_resizable(column, TRUE); 1525 gtk_tree_view_column_set_resizable(column, TRUE);
1347 gtk_tree_view_column_set_reorderable(column, TRUE); 1526 gtk_tree_view_column_set_reorderable(column, TRUE);
1348 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/ 1527 /*gtk_tree_view_column_set_sort_indicator(column, TRUE);*/
1349 gtk_tree_view_column_set_resizable(gtk_tree_view_get_column(GTK_TREE_VIEW(downloadList), 1528 gtk_tree_view_column_set_resizable(column, TRUE);
1350 col - 1),
1351 TRUE);
1352 DEBUG_END();
1353} 1529}
1354 1530
1531/**
1532 * Shutdown.
1533 */
1355void fs_search_stop() { 1534void fs_search_stop() {
1535 GtkComboBox * searchCB;
1536 GtkListStore * model;
1537
1538 searchCB
1539 = GTK_COMBO_BOX(glade_xml_get_widget(getMainXML(),
1540 "fssearchKeywordComboBoxEntry"));
1541 model = gtk_combo_box_get_model(searchCB);
1542 /* FIXME: iterate over model entries
1543 and free URIs and MetaData! */
1356} 1544}
1357 1545
1358 1546
diff --git a/src/plugins/fs/search.h b/src/plugins/fs/search.h
index 8b7a7f48..c161fb35 100644
--- a/src/plugins/fs/search.h
+++ b/src/plugins/fs/search.h
@@ -36,6 +36,8 @@ struct DL;
36 36
37struct DL * 37struct DL *
38fs_download_started(struct FSUI_DownloadList * fsui_dl, 38fs_download_started(struct FSUI_DownloadList * fsui_dl,
39 struct DL * dl_parent,
40 struct SL * sl_parent,
39 unsigned long long total, 41 unsigned long long total,
40 unsigned int anonymityLevel, 42 unsigned int anonymityLevel,
41 const ECRS_FileInfo * fi, 43 const ECRS_FileInfo * fi,
diff --git a/src/plugins/fs/upload.c b/src/plugins/fs/upload.c
index 9ef79e80..83c008d0 100644
--- a/src/plugins/fs/upload.c
+++ b/src/plugins/fs/upload.c
@@ -362,6 +362,8 @@ void fs_upload_start(struct GE_Context * e,
362 G_TYPE_STRING); /* URI (as string) - after completion */ 362 G_TYPE_STRING); /* URI (as string) - after completion */
363 gtk_tree_view_set_model(GTK_TREE_VIEW(uploadList), 363 gtk_tree_view_set_model(GTK_TREE_VIEW(uploadList),
364 GTK_TREE_MODEL(summary)); 364 GTK_TREE_MODEL(summary));
365 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(uploadList)),
366 GTK_SELECTION_MULTIPLE);
365 renderer = gtk_cell_renderer_progress_new(); 367 renderer = gtk_cell_renderer_progress_new();
366 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(uploadList), 368 col = gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(uploadList),
367 -1, 369 -1,