diff options
author | Christian Grothoff <christian@grothoff.org> | 2006-10-29 06:16:00 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2006-10-29 06:16:00 +0000 |
commit | b6eb2c21ad31d585bfcdf7be8d48df6433fd876f (patch) | |
tree | c7ca9df514b47cc51107286b98699d89323286b3 | |
parent | 8e2e522cbfcef9c8e8733e1b481dfd9934ccb0ff (diff) | |
download | gnunet-gtk-b6eb2c21ad31d585bfcdf7be8d48df6433fd876f.tar.gz gnunet-gtk-b6eb2c21ad31d585bfcdf7be8d48df6433fd876f.zip |
improving fs search code
-rw-r--r-- | gnunet-gtk.glade | 78 | ||||
-rw-r--r-- | src/plugins/daemon/daemon.c | 2 | ||||
-rw-r--r-- | src/plugins/fs/fs.c | 12 | ||||
-rw-r--r-- | src/plugins/fs/fs.h | 44 | ||||
-rw-r--r-- | src/plugins/fs/helper.c | 239 | ||||
-rw-r--r-- | src/plugins/fs/meta.c | 104 | ||||
-rw-r--r-- | src/plugins/fs/meta.h | 28 | ||||
-rw-r--r-- | src/plugins/fs/namespace.c | 8 | ||||
-rw-r--r-- | src/plugins/fs/search.c | 832 | ||||
-rw-r--r-- | src/plugins/fs/search.h | 2 | ||||
-rw-r--r-- | src/plugins/fs/upload.c | 2 |
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 <po@danielnylander.se> | |||
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 | ||
215 | void done_fs() { | 219 | void 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 | */ | ||
38 | enum { | ||
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 | */ | ||
33 | enum { | 51 | enum { |
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 | */ | ||
46 | enum { | 68 | enum { |
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 | |||
55 | enum { | ||
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 | ||
63 | enum { | 75 | enum { |
@@ -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 | */ | ||
101 | GtkWidget * | ||
102 | buildSearchTabLabel(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 | |||
214 | GtkWidget * 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 | ||
473 | unsigned int getAnonymityLevel(GladeXML * xml, | 477 | unsigned 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 | ||
488 | char * 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 | |||
498 | char * 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 | |||
522 | char * 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 | |||
540 | GdkPixbuf * 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 | |||
568 | GtkWidget * | ||
569 | extractMainWidgetFromWindow(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 | ||
54 | struct ECRS_MetaData * getMetaDataFromList(GladeXML * xml, | 54 | struct ECRS_MetaData * |
55 | const char * name, | 55 | getMetaDataFromList(GladeXML * xml, |
56 | const char * preview); | 56 | const char * name, |
57 | const char * preview); | ||
57 | 58 | ||
58 | struct ECRS_URI * getKeywordURIFromList(GladeXML * xml, | 59 | struct ECRS_URI * |
59 | const char * name); | 60 | getKeywordURIFromList(GladeXML * xml, |
61 | const char * name); | ||
60 | 62 | ||
61 | char * updateIntervalToString(TIME_T interval); | 63 | char * updateIntervalToString(TIME_T interval); |
62 | 64 | ||
@@ -67,8 +69,20 @@ int tryParseTimeInterval(GladeXML * xml, | |||
67 | int parseTimeInterval(const char * frequency, | 69 | int parseTimeInterval(const char * frequency, |
68 | TIME_T * interval); | 70 | TIME_T * interval); |
69 | 71 | ||
70 | unsigned int getAnonymityLevel(GladeXML * xml, | 72 | unsigned int getSpinButtonValue(GladeXML * xml, |
71 | const char * spinButtonName); | 73 | const char * spinButtonName); |
74 | |||
75 | char * getMimeTypeFromMetaData(const struct ECRS_MetaData * meta); | ||
76 | |||
77 | char * getFileNameFromMetaData(const struct ECRS_MetaData * meta); | ||
78 | |||
79 | char * getDescriptionFromMetaData(const struct ECRS_MetaData * meta); | ||
80 | |||
81 | GdkPixbuf * getThumbnailFromMetaData(const struct ECRS_MetaData * meta); | ||
82 | |||
83 | GtkWidget * 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 | */ |
47 | typedef struct SL { | 47 | typedef 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 | ||
56 | typedef struct DL { | 110 | typedef 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 | ||
75 | static struct GC_Configuration * cfg; | 158 | static struct GC_Configuration * cfg; |
76 | 159 | ||
77 | 160 | /** | |
161 | * The user has clicked the "SEARCH" button. | ||
162 | * Initiate a search. | ||
163 | */ | ||
78 | void on_fssearchbutton_clicked_fs(gpointer dummy2, | 164 | void 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 | */ | ||
198 | void on_closeSearchButton_clicked_fs(GtkWidget * searchPage, | 297 | void 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 | */ | ||
215 | void on_abortSearchButton_clicked_fs(GtkWidget * searchPage, | 316 | void 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 | ||
232 | static void stopSearch(GtkTreeModel * model, | 331 | static 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 | */ | ||
248 | void on_closeSearchSummaryButton_clicked_fs(GtkWidget * treeview, | 350 | void 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 | */ | ||
275 | void on_abortSearchSummaryButton_clicked_fs(GtkWidget * treeview, | 380 | void 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 | */ | ||
395 | static 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 | ||
439 | SearchList * | 479 | /** |
480 | * FSUI event: a search was started; create the | ||
481 | * tab and add an entry to the summary. | ||
482 | */ | ||
483 | struct SL * | ||
440 | fs_search_started(struct FSUI_SearchList * fsui_list, | 484 | fs_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 | */ | ||
551 | void fs_search_stopped(SearchList * list) { | 722 | void 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 | */ |
685 | struct DL * | 865 | struct DL * |
686 | fs_download_started(struct FSUI_DownloadList * fsui_dl, | 866 | fs_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 | */ | ||
1214 | void fs_search_start(struct GE_Context * e, | 1400 | void 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 | */ | ||
1355 | void fs_search_stop() { | 1534 | void 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 | ||
37 | struct DL * | 37 | struct DL * |
38 | fs_download_started(struct FSUI_DownloadList * fsui_dl, | 38 | fs_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, |