1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
3
/***************************************************************************
6
* dim mai 22 11:20:54 2005
7
* Copyright 2005 Philippe Rouquier
8
* brasero-app@wanadoo.fr
9
****************************************************************************/
12
* Brasero is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2 of the License, or
15
* (at your option) any later version.
17
* Brasero is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU Library General Public License for more details.
22
* You should have received a copy of the GNU General Public License
23
* along with this program; if not, write to:
24
* The Free Software Foundation, Inc.,
25
* 51 Franklin Street, Fifth Floor
26
* Boston, MA 02110-1301, USA.
37
#include <glib/gi18n-lib.h>
38
#include <glib-object.h>
44
#include "brasero-search.h"
45
#include "brasero-search-engine.h"
47
#include "brasero-misc.h"
49
#include "brasero-app.h"
50
#include "brasero-utils.h"
51
#include "brasero-search-entry.h"
52
#include "brasero-mime-filter.h"
53
#include "brasero-search-engine.h"
54
#include "eggtreemultidnd.h"
56
#include "brasero-uri-container.h"
57
#include "brasero-layout-object.h"
60
struct BraseroSearchPrivate {
61
GtkTreeViewColumn *sort_column;
69
GtkWidget *results_label;
71
BraseroSearchEngine *engine;
83
static GtkTargetEntry ntables_find[] = {
84
{"text/uri-list", 0, TARGET_URIS_LIST}
86
static guint nb_ntables_find = sizeof (ntables_find) / sizeof (ntables_find[0]);
88
#define BRASERO_SEARCH_SPACING 6
90
static void brasero_search_iface_uri_container_init (BraseroURIContainerIFace *iface);
91
static void brasero_search_iface_layout_object_init (BraseroLayoutObjectIFace *iface);
93
G_DEFINE_TYPE_WITH_CODE (BraseroSearch,
96
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_URI_CONTAINER,
97
brasero_search_iface_uri_container_init)
98
G_IMPLEMENT_INTERFACE (BRASERO_TYPE_LAYOUT_OBJECT,
99
brasero_search_iface_layout_object_init));
104
brasero_search_column_icon_cb (GtkTreeViewColumn *tree_column,
105
GtkCellRenderer *cell,
114
gtk_tree_model_get (model, iter,
115
BRASERO_SEARCH_TREE_HIT_COL, &hit,
118
mime = brasero_search_engine_mime_from_hit (BRASERO_SEARCH (data)->priv->engine, hit);
122
if (!strcmp (mime, "inode/directory"))
123
mime = "x-directory/normal";
125
icon = g_content_type_get_icon (mime);
126
g_object_set (G_OBJECT (cell),
129
g_object_unref (icon);
133
brasero_search_name_from_hit (BraseroSearch *search,
138
gchar *unescaped_uri;
140
uri = brasero_search_engine_uri_from_hit (search->priv->engine, hit);
142
/* beagle can return badly formed uri not
143
* encoded in UTF-8 locale charset so we
144
* check them just in case */
145
unescaped_uri = g_uri_unescape_string (uri, NULL);
146
if (!g_utf8_validate (unescaped_uri, -1, NULL)) {
147
g_free (unescaped_uri);
151
name = g_path_get_basename (unescaped_uri);
152
g_free (unescaped_uri);
157
brasero_search_column_name_cb (GtkTreeViewColumn *tree_column,
158
GtkCellRenderer *cell,
166
gtk_tree_model_get (model, iter,
167
BRASERO_SEARCH_TREE_HIT_COL, &hit,
170
name = brasero_search_name_from_hit (data, hit);
171
g_object_set (G_OBJECT (cell),
178
brasero_search_description_from_hit (BraseroSearch *search,
183
mime = brasero_search_engine_mime_from_hit (search->priv->engine, hit);
187
return g_content_type_get_description (mime);
191
brasero_search_column_description_cb (GtkTreeViewColumn *tree_column,
192
GtkCellRenderer *cell,
197
const gchar *description;
200
gtk_tree_model_get (model, iter,
201
BRASERO_SEARCH_TREE_HIT_COL, &hit,
204
description = brasero_search_description_from_hit (data, hit);
205
g_object_set (G_OBJECT (cell),
211
brasero_search_increase_activity (BraseroSearch *search)
215
cursor = gdk_cursor_new (GDK_WATCH);
216
gdk_window_set_cursor (GTK_WIDGET (search)->window, cursor);
217
gdk_cursor_unref (cursor);
221
brasero_search_decrease_activity (BraseroSearch *search)
223
gdk_window_set_cursor (GTK_WIDGET (search)->window, NULL);
227
brasero_search_update_header (BraseroSearch *search)
232
num_hits = brasero_search_engine_num_hits (search->priv->engine);
237
last = search->priv->first_hit + search->priv->max_results;
238
last = MIN (last, num_hits);
240
tmp = g_strdup_printf (_("Results %i–%i (out of %i)"),
241
search->priv->first_hit + 1,
244
string = g_strdup_printf ("<b>%s</b>", tmp);
248
string = g_strdup_printf ("<b>%s</b>", _("No results"));
250
gtk_label_set_markup (GTK_LABEL (search->priv->results_label), string);
253
if (search->priv->first_hit + search->priv->max_results < num_hits)
254
gtk_widget_set_sensitive (search->priv->right, TRUE);
256
gtk_widget_set_sensitive (search->priv->right, FALSE);
258
if (search->priv->first_hit > 0)
259
gtk_widget_set_sensitive (search->priv->left, TRUE);
261
gtk_widget_set_sensitive (search->priv->left, FALSE);
265
brasero_search_empty_tree (BraseroSearch *search)
271
sort = gtk_tree_view_get_model (GTK_TREE_VIEW (search->priv->tree));
272
model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (sort));
274
if (gtk_tree_model_get_iter_first (model, &row)) {
280
gtk_tree_model_get (model, &row,
281
BRASERO_SEARCH_TREE_HIT_COL, &hit,
287
mime = brasero_search_engine_mime_from_hit (search->priv->engine, hit);
291
brasero_mime_filter_unref_mime (BRASERO_MIME_FILTER (search->priv->filter), mime);
292
} while (gtk_list_store_remove (GTK_LIST_STORE (model), &row));
297
brasero_search_row_inserted (GtkTreeModel *model,
300
BraseroSearch *search)
305
gtk_tree_model_get (model, iter,
306
BRASERO_SEARCH_TREE_HIT_COL, &hit,
312
mime = brasero_search_engine_mime_from_hit (search->priv->engine, hit);
315
/* add the mime type to the filter combo */
316
brasero_mime_filter_add_mime (BRASERO_MIME_FILTER (search->priv->filter), mime);
321
brasero_search_update_tree (BraseroSearch *search)
328
if (search->priv->first_hit < 0)
329
search->priv->first_hit = 0;
331
max_hits = brasero_search_engine_num_hits (search->priv->engine);
332
if (search->priv->first_hit > max_hits) {
333
search->priv->first_hit = max_hits;
337
last_hit = MIN (max_hits, search->priv->max_results + search->priv->first_hit);
339
brasero_search_empty_tree (search);
341
sort = gtk_tree_view_get_model (GTK_TREE_VIEW (search->priv->tree));
342
model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (sort));
344
brasero_search_engine_add_hits (search->priv->engine,
346
search->priv->first_hit,
349
brasero_search_update_header (search);
354
brasero_search_left_button_clicked_cb (GtkButton *button,
355
BraseroSearch *search)
357
search->priv->first_hit -= search->priv->max_results;
358
brasero_search_update_tree (search);
362
brasero_search_right_button_clicked_cb (GtkButton *button,
363
BraseroSearch *search)
365
search->priv->first_hit += search->priv->max_results;
366
brasero_search_update_tree (search);
370
brasero_search_max_results_num_changed_cb (GtkComboBox *combo,
371
BraseroSearch *search)
376
if (search->priv->max_results)
377
page_num = search->priv->first_hit / search->priv->max_results;
381
index = gtk_combo_box_get_active (combo);
384
search->priv->max_results = 20;
387
search->priv->max_results = 50;
390
search->priv->max_results = 100;
394
search->priv->first_hit = page_num * search->priv->max_results;
395
brasero_search_update_tree (search);
399
brasero_search_finished_cb (BraseroSearchEngine *engine,
400
BraseroSearch *search)
402
brasero_search_decrease_activity (search);
406
brasero_search_error_cb (BraseroSearchEngine *engine,
408
BraseroSearch *search)
410
brasero_search_update_header (search);
412
brasero_app_alert (brasero_app_get_default (),
413
_("Error querying for keywords."),
417
brasero_search_decrease_activity (search);
421
brasero_search_hit_added_cb (BraseroSearchEngine *engine,
423
BraseroSearch *search)
431
hit_num = brasero_search_engine_num_hits (search->priv->engine);
432
if (hit_num < search->priv->first_hit
433
&& hit_num >= search->priv->first_hit + search->priv->max_results) {
434
brasero_search_update_header (search);
438
model = gtk_tree_view_get_model (GTK_TREE_VIEW (search->priv->tree));
439
model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
441
num = gtk_tree_model_iter_n_children (model, NULL);
442
if (num >= search->priv->max_results) {
443
brasero_search_update_header (search);
447
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), &iter, -1,
448
BRASERO_SEARCH_TREE_HIT_COL, hit,
451
mime = brasero_search_engine_mime_from_hit (search->priv->engine, hit);
452
brasero_search_update_header (search);
456
brasero_search_hit_removed_cb (BraseroSearchEngine *engine,
458
BraseroSearch *search)
466
model = gtk_tree_view_get_model (GTK_TREE_VIEW (search->priv->tree));
467
model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
469
if (!gtk_tree_model_get_iter_first (model, &iter))
476
gtk_tree_model_get (model, &iter,
477
BRASERO_SEARCH_TREE_HIT_COL, &model_hit,
480
if (hit == model_hit) {
483
mime = brasero_search_engine_mime_from_hit (search->priv->engine, hit);
484
brasero_mime_filter_unref_mime (BRASERO_MIME_FILTER (search->priv->filter), mime);
486
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
491
} while (gtk_tree_model_iter_next (model, &iter));
493
if (num < search->priv->first_hit
494
&& num >= search->priv->first_hit + search->priv->max_results) {
495
brasero_search_update_header (search);
499
range_start = search->priv->first_hit + search->priv->max_results - 1;
500
range_end = search->priv->first_hit + search->priv->max_results;
501
brasero_search_engine_add_hits (search->priv->engine,
506
brasero_search_update_header (search);
510
brasero_search_entry_activated_cb (BraseroSearchEntry *entry,
511
BraseroSearch *search)
513
brasero_search_increase_activity (search);
515
/* we first empty everything including the filter box */
516
brasero_search_empty_tree (search);
517
brasero_search_entry_set_query (entry, search->priv->engine);
518
brasero_search_engine_start_query (search->priv->engine);
519
brasero_search_update_header (search);
523
brasero_search_is_visible_cb (GtkTreeModel *model,
525
BraseroSearch *search)
527
const gchar *uri, *mime;
532
gtk_tree_model_get (model, iter,
533
BRASERO_SEARCH_TREE_HIT_COL, &hit,
536
name = brasero_search_name_from_hit (search, hit);
537
uri = brasero_search_engine_uri_from_hit (search->priv->engine, hit);
538
mime = brasero_search_engine_mime_from_hit (search->priv->engine, hit);
539
result = brasero_mime_filter_filter (BRASERO_MIME_FILTER (search->priv->filter),
550
brasero_search_mime_filter_changed (GtkComboBox *combo,
551
BraseroSearch *search)
553
gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (gtk_tree_view_get_model (GTK_TREE_VIEW (search->priv->tree))));
557
brasero_search_tree_activated_cb (GtkTreeView *tree,
559
GtkTreeViewColumn *column,
560
BraseroSearch *search)
562
brasero_uri_container_uri_activated (BRASERO_URI_CONTAINER (search));
566
brasero_search_get_selected_rows (BraseroSearch *search)
568
GtkTreeSelection *selection;
575
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (search->priv->tree));
576
rows = gtk_tree_selection_get_selected_rows (selection, &model);
580
uris = g_new0 (char *, g_list_length (rows) + 1);
581
for (iter = rows, i = 0; iter != NULL; iter = iter->next, i++) {
584
gtk_tree_model_get_iter (model,
586
(GtkTreePath *) iter->data);
587
gtk_tree_path_free (iter->data);
590
gtk_tree_model_get (model, &row,
591
BRASERO_SEARCH_TREE_HIT_COL, &hit,
593
uris[i] = g_strdup (brasero_search_engine_uri_from_hit (search->priv->engine, hit));
601
brasero_search_drag_data_get_cb (GtkTreeView *tree,
602
GdkDragContext *drag_context,
603
GtkSelectionData *selection_data,
605
guint time, BraseroSearch *search)
609
uris = brasero_search_get_selected_rows (search);
610
gtk_selection_data_set_uris (selection_data, uris);
615
brasero_search_get_selected_uri (BraseroURIContainer *container)
617
BraseroSearch *search;
621
search = BRASERO_SEARCH (container);
622
uris = brasero_search_get_selected_rows (search);
625
uri = g_strdup (uris [0]);
634
brasero_search_get_selected_uris (BraseroURIContainer *container)
636
BraseroSearch *search;
638
search = BRASERO_SEARCH (container);
639
return brasero_search_get_selected_rows (search);
643
brasero_search_tree_selection_changed_cb (GtkTreeSelection *selection,
644
BraseroSearch *search)
646
brasero_uri_container_uri_selected (BRASERO_URI_CONTAINER (search));
650
brasero_search_get_proportion (BraseroLayoutObject *object,
655
GtkRequisition requisition;
657
gtk_widget_size_request (BRASERO_SEARCH (object)->priv->filters,
659
*footer = requisition.height + BRASERO_SEARCH_SPACING;
663
brasero_search_set_context (BraseroLayoutObject *object,
664
BraseroLayoutType type)
668
self = BRASERO_SEARCH (object);
669
brasero_search_entry_set_context (BRASERO_SEARCH_ENTRY (self->priv->entry), type);
673
brasero_search_sort_name (GtkTreeModel *model,
680
gchar *name1, *name2;
681
BraseroSearch *search = BRASERO_SEARCH (user_data);
683
gtk_tree_model_get (model, iter1,
684
BRASERO_SEARCH_TREE_HIT_COL, &hit1,
686
gtk_tree_model_get (model, iter2,
687
BRASERO_SEARCH_TREE_HIT_COL, &hit2,
690
name1 = brasero_search_name_from_hit (search, hit1);
691
name2 = brasero_search_name_from_hit (search, hit2);
693
res = g_strcmp0 (name1, name2);
701
brasero_search_sort_description (GtkTreeModel *model,
707
BraseroSearch *search = BRASERO_SEARCH (user_data);
709
gtk_tree_model_get (model, iter1,
710
BRASERO_SEARCH_TREE_HIT_COL, &hit1,
712
gtk_tree_model_get (model, iter2,
713
BRASERO_SEARCH_TREE_HIT_COL, &hit2,
716
return g_strcmp0 (brasero_search_description_from_hit (search, hit1),
717
brasero_search_description_from_hit (search, hit2));
721
brasero_search_sort_score (GtkTreeModel *model,
727
BraseroSearch *search = BRASERO_SEARCH (user_data);
729
gtk_tree_model_get (model, iter1,
730
BRASERO_SEARCH_TREE_HIT_COL, &hit1,
732
gtk_tree_model_get (model, iter2,
733
BRASERO_SEARCH_TREE_HIT_COL, &hit2,
736
return brasero_search_engine_score_from_hit (search->priv->engine, hit2) -
737
brasero_search_engine_score_from_hit (search->priv->engine, hit1);
741
brasero_search_column_clicked (GtkTreeViewColumn *column,
742
BraseroSearch *search)
746
GtkSortType model_order;
748
sort = gtk_tree_view_get_model (GTK_TREE_VIEW (search->priv->tree));
749
model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (sort));
751
gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model),
755
if (!gtk_tree_view_column_get_sort_indicator (column)) {
756
GtkTreeIterCompareFunc sort_func;
758
if (search->priv->sort_column)
759
gtk_tree_view_column_set_sort_indicator (search->priv->sort_column, FALSE);
761
search->priv->sort_column = column;
762
gtk_tree_view_column_set_sort_indicator (column, TRUE);
764
gtk_tree_view_column_set_sort_order (column, GTK_SORT_ASCENDING);
765
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
766
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
769
sort_func = g_object_get_data (G_OBJECT (column), "SortFunc");
770
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model),
775
else if (model_order == GTK_SORT_DESCENDING) {
776
gtk_tree_view_column_set_sort_indicator (column, FALSE);
777
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model),
778
brasero_search_sort_score,
781
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
782
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
786
gtk_tree_view_column_set_sort_order (column, GTK_SORT_DESCENDING);
787
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
788
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
789
GTK_SORT_DESCENDING);
792
g_signal_stop_emission_by_name (column, "clicked");
796
brasero_search_try_again (BraseroSearch *search)
798
if (brasero_search_engine_is_available (search->priv->engine)) {
799
gtk_widget_set_sensitive (GTK_WIDGET (search), TRUE);
800
search->priv->id = 0;
808
brasero_search_init (BraseroSearch *obj)
819
GtkWidget *separator;
820
GtkTreeViewColumn *column;
821
GtkCellRenderer *renderer;
822
GtkFileFilter *file_filter;
823
GtkTreeSelection *selection;
825
gtk_box_set_spacing (GTK_BOX (obj), BRASERO_SEARCH_SPACING);
826
obj->priv = g_new0 (BraseroSearchPrivate, 1);
828
obj->priv->engine = brasero_search_engine_new_default ();
829
g_signal_connect (obj->priv->engine,
831
G_CALLBACK (brasero_search_finished_cb),
833
g_signal_connect (obj->priv->engine,
835
G_CALLBACK (brasero_search_error_cb),
837
g_signal_connect (obj->priv->engine,
839
G_CALLBACK (brasero_search_hit_removed_cb),
841
g_signal_connect (obj->priv->engine,
843
G_CALLBACK (brasero_search_hit_added_cb),
847
separator = gtk_hseparator_new ();
848
gtk_box_pack_start (GTK_BOX (obj), separator, FALSE, FALSE, 0);
851
obj->priv->entry = brasero_search_entry_new ();
852
g_signal_connect (G_OBJECT (obj->priv->entry),
854
G_CALLBACK (brasero_search_entry_activated_cb),
856
gtk_box_pack_start (GTK_BOX (obj), obj->priv->entry, FALSE, FALSE, 0);
859
separator = gtk_hseparator_new ();
860
gtk_box_pack_start (GTK_BOX (obj), separator, FALSE, FALSE, 0);
862
/* results navigation */
863
box = gtk_hbox_new (FALSE, 6);
864
gtk_box_pack_start (GTK_BOX (obj), box, FALSE, FALSE, 0);
866
button = brasero_utils_make_button (_("Previous Results"),
869
GTK_ICON_SIZE_BUTTON);
870
gtk_button_set_alignment (GTK_BUTTON (button), 0.0, 0.5);
871
gtk_widget_set_sensitive (button, FALSE);
872
g_signal_connect (G_OBJECT (button),
874
G_CALLBACK (brasero_search_left_button_clicked_cb),
876
gtk_box_pack_start (GTK_BOX (box), button, FALSE, TRUE, 0);
877
obj->priv->left = button;
879
string = g_strdup_printf ("<b>%s</b>", _("No results"));
880
label = gtk_label_new (string);
883
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
884
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
885
obj->priv->results_label = label;
887
button = brasero_utils_make_button (_("Next Results"),
888
GTK_STOCK_GO_FORWARD,
890
GTK_ICON_SIZE_BUTTON);
891
gtk_button_set_alignment (GTK_BUTTON (button), 1.0, 0.5);
892
gtk_widget_set_sensitive (button, FALSE);
893
g_signal_connect (G_OBJECT (button),
895
G_CALLBACK (brasero_search_right_button_clicked_cb),
897
gtk_box_pack_start (GTK_BOX (box), button, FALSE, TRUE, 0);
898
obj->priv->right = button;
901
store = gtk_list_store_new (BRASERO_SEARCH_TREE_NB_COL,
904
gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (store),
905
brasero_search_sort_score,
909
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
910
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
913
g_signal_connect (store,
915
G_CALLBACK (brasero_search_row_inserted),
918
model = gtk_tree_model_filter_new (GTK_TREE_MODEL (store), NULL);
919
g_object_unref (G_OBJECT (store));
921
gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (model),
922
(GtkTreeModelFilterVisibleFunc) brasero_search_is_visible_cb,
926
obj->priv->tree = gtk_tree_view_new_with_model (model);
927
g_object_unref (G_OBJECT (model));
929
gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW (obj->priv->tree), TRUE);
930
egg_tree_multi_drag_add_drag_support (GTK_TREE_VIEW (obj->priv->tree));
932
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (obj->priv->tree));
933
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
935
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (obj->priv->tree), TRUE);
936
g_signal_connect (G_OBJECT (obj->priv->tree),
938
G_CALLBACK (brasero_search_tree_activated_cb),
940
g_signal_connect (G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (obj->priv->tree))),
942
G_CALLBACK (brasero_search_tree_selection_changed_cb),
945
gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (obj->priv->tree), TRUE);
947
column = gtk_tree_view_column_new ();
949
gtk_tree_view_column_set_clickable (column, TRUE);
950
gtk_tree_view_column_set_resizable (column, TRUE);
951
gtk_tree_view_column_set_title (column, _("Files"));
952
gtk_tree_view_column_set_min_width (column, 128);
954
g_object_set_data (G_OBJECT (column), "SortFunc", brasero_search_sort_name);
955
g_signal_connect (column,
957
G_CALLBACK (brasero_search_column_clicked),
960
renderer = gtk_cell_renderer_pixbuf_new ();
961
gtk_tree_view_column_pack_start (column, renderer, FALSE);
962
gtk_tree_view_column_set_cell_data_func (column,
964
brasero_search_column_icon_cb,
968
renderer = gtk_cell_renderer_text_new ();
969
gtk_tree_view_column_pack_start (column, renderer, TRUE);
970
gtk_tree_view_column_set_cell_data_func (column,
972
brasero_search_column_name_cb,
976
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
979
column = gtk_tree_view_column_new ();
980
gtk_tree_view_column_set_title (column, _("Description"));
981
gtk_tree_view_column_set_clickable (column, TRUE);
982
gtk_tree_view_column_set_resizable (column, TRUE);
983
gtk_tree_view_column_set_min_width (column, 128);
985
g_object_set_data (G_OBJECT (column), "SortFunc", brasero_search_sort_description);
986
g_signal_connect (column,
988
G_CALLBACK (brasero_search_column_clicked),
991
renderer = gtk_cell_renderer_text_new ();
992
gtk_tree_view_column_pack_start (column, renderer, TRUE);
993
gtk_tree_view_column_set_cell_data_func (column,
995
brasero_search_column_description_cb,
998
gtk_tree_view_append_column (GTK_TREE_VIEW (obj->priv->tree),
1001
gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (obj->priv->tree),
1007
g_signal_connect (G_OBJECT (obj->priv->tree),
1009
G_CALLBACK (brasero_search_drag_data_get_cb),
1012
scroll = gtk_scrolled_window_new (NULL, NULL);
1013
gtk_container_add (GTK_CONTAINER (scroll), obj->priv->tree);
1014
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll),
1016
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
1017
GTK_POLICY_AUTOMATIC,
1018
GTK_POLICY_AUTOMATIC);
1019
gtk_box_pack_start (GTK_BOX (obj), scroll, TRUE, TRUE, 0);
1022
box = gtk_hbox_new (FALSE, 32);
1023
obj->priv->filters = box;
1024
gtk_box_pack_end (GTK_BOX (obj), box, FALSE, FALSE, 0);
1026
obj->priv->filter = brasero_mime_filter_new ();
1027
g_signal_connect (G_OBJECT (BRASERO_MIME_FILTER (obj->priv->filter)->combo),
1029
G_CALLBACK (brasero_search_mime_filter_changed),
1032
file_filter = gtk_file_filter_new ();
1033
gtk_file_filter_set_name (file_filter, _("All files"));
1034
gtk_file_filter_add_pattern (file_filter, "*");
1035
brasero_mime_filter_add_filter (BRASERO_MIME_FILTER (obj->priv->filter),
1037
g_object_unref (file_filter);
1039
gtk_box_pack_end (GTK_BOX (box), obj->priv->filter, FALSE, FALSE, 0);
1041
box1 = gtk_hbox_new (FALSE, 6);
1042
gtk_box_pack_end (GTK_BOX (box), box1, FALSE, FALSE, 0);
1044
label = gtk_label_new (_("Number of results displayed"));
1045
gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
1047
combo = gtk_combo_box_new_text ();
1048
g_signal_connect (combo,
1050
G_CALLBACK (brasero_search_max_results_num_changed_cb),
1052
gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "20");
1053
gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "50");
1054
gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "100");
1056
gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
1057
obj->priv->max_results = 50;
1059
gtk_box_pack_start (GTK_BOX (box1), combo, FALSE, FALSE, 0);
1061
if (!brasero_search_engine_is_available (obj->priv->engine)) {
1062
gtk_widget_set_sensitive (GTK_WIDGET (obj), FALSE);
1064
/* we will retry in 10 seconds */
1065
obj->priv->id = g_timeout_add_seconds (10,
1066
(GSourceFunc) brasero_search_try_again,
1072
brasero_search_destroy (GtkObject *object)
1074
BraseroSearch *search;
1076
search = BRASERO_SEARCH (object);
1077
if (search->priv->tree) {
1078
g_signal_handlers_disconnect_by_func (gtk_tree_view_get_selection (GTK_TREE_VIEW (search->priv->tree)),
1079
brasero_search_tree_selection_changed_cb,
1082
g_signal_handlers_disconnect_by_func (search->priv->filter,
1083
brasero_search_mime_filter_changed,
1086
brasero_search_empty_tree (search);
1087
search->priv->filter = NULL;
1088
search->priv->tree = NULL;
1091
if (search->priv->id) {
1092
g_source_remove (search->priv->id);
1093
search->priv->id = 0;
1096
if (search->priv->engine) {
1097
g_object_unref (search->priv->engine);
1098
search->priv->engine = NULL;
1101
if (GTK_OBJECT_CLASS (brasero_search_parent_class)->destroy)
1102
GTK_OBJECT_CLASS (brasero_search_parent_class)->destroy (object);
1106
brasero_search_finalize (GObject *object)
1108
BraseroSearch *cobj;
1110
cobj = BRASERO_SEARCH (object);
1112
g_free (cobj->priv);
1113
G_OBJECT_CLASS (brasero_search_parent_class)->finalize (object);
1117
brasero_search_iface_layout_object_init (BraseroLayoutObjectIFace *iface)
1119
iface->get_proportion = brasero_search_get_proportion;
1120
iface->set_context = brasero_search_set_context;
1124
brasero_search_iface_uri_container_init (BraseroURIContainerIFace *iface)
1126
iface->get_selected_uri = brasero_search_get_selected_uri;
1127
iface->get_selected_uris = brasero_search_get_selected_uris;
1131
brasero_search_class_init (BraseroSearchClass *klass)
1133
GObjectClass *object_class = G_OBJECT_CLASS (klass);
1134
GtkObjectClass *gtkobject_class = GTK_OBJECT_CLASS (klass);
1136
object_class->finalize = brasero_search_finalize;
1137
gtkobject_class->destroy = brasero_search_destroy;
1141
brasero_search_new ()
1143
return g_object_new (BRASERO_TYPE_SEARCH, NULL);