void nemo_window_pane_sync_search_widgets (NemoWindowPane *pane) { NemoWindowSlot *slot; NemoDirectory *directory; NemoSearchDirectory *search_directory; slot = pane->active_slot; search_directory = NULL; directory = nemo_directory_get (slot->location); if (NEMO_IS_SEARCH_DIRECTORY (directory)) { search_directory = NEMO_SEARCH_DIRECTORY (directory); } if (search_directory != NULL) { if (!nemo_search_directory_is_saved_search (search_directory)) { nemo_toolbar_set_show_search_bar (NEMO_TOOLBAR (pane->tool_bar), TRUE); pane->temporary_search_bar = FALSE; } else { toggle_toolbar_search_button (pane); } } else { search_bar_cancel_callback (pane->search_bar, pane); } nemo_directory_unref (directory); }
static void search_bar_activate_callback (NemoSearchBar *bar, NemoWindowPane *pane) { char *uri, *current_uri; NemoDirectory *directory; NemoSearchDirectory *search_directory; NemoQuery *query; GFile *location; uri = nemo_search_directory_generate_new_uri (); location = g_file_new_for_uri (uri); directory = nemo_directory_get (location); g_assert (NEMO_IS_SEARCH_DIRECTORY (directory)); search_directory = NEMO_SEARCH_DIRECTORY (directory); query = nemo_search_bar_get_query (NEMO_SEARCH_BAR (pane->search_bar)); if (query != NULL) { current_uri = nemo_window_slot_get_location_uri (pane->active_slot); nemo_query_set_location (query, current_uri); nemo_search_directory_set_query (search_directory, query); g_free (current_uri); g_object_unref (query); } nemo_window_slot_go_to (pane->active_slot, location, FALSE); nemo_directory_unref (directory); g_object_unref (location); g_free (uri); }
static void search_force_reload (NemoDirectory *directory) { NemoSearchDirectory *search; search = NEMO_SEARCH_DIRECTORY (directory); if (!search->details->query) { return; } search->details->search_finished = FALSE; if (!search->details->engine) { return; } /* Remove file monitors */ reset_file_list (search); if (search->details->search_running) { nemo_search_engine_stop (search->details->engine); nemo_search_engine_set_query (search->details->engine, search->details->query); nemo_search_engine_start (search->details->engine); } }
static void search_cancel_callback (NemoDirectory *directory, NemoDirectoryCallback callback, gpointer callback_data) { NemoSearchDirectory *search; SearchCallback *search_callback; search = NEMO_SEARCH_DIRECTORY (directory); search_callback = search_callback_find (search, callback, callback_data); if (search_callback) { search->details->callback_list = g_list_remove (search->details->callback_list, search_callback); search_callback_destroy (search_callback); return; } /* Check for a pending callback */ search_callback = search_callback_find_pending (search, callback, callback_data); if (search_callback) { search->details->pending_callback_list = g_list_remove (search->details->pending_callback_list, search_callback); search_callback_destroy (search_callback); /* We might need to stop the search engine now */ start_or_stop_search_engine (search, FALSE); } }
static void search_monitor_add (NemoDirectory *directory, gconstpointer client, gboolean monitor_hidden_files, NemoFileAttributes file_attributes, NemoDirectoryCallback callback, gpointer callback_data) { GList *list; SearchMonitor *monitor; NemoSearchDirectory *search; NemoFile *file; search = NEMO_SEARCH_DIRECTORY (directory); monitor = g_new0 (SearchMonitor, 1); monitor->monitor_hidden_files = monitor_hidden_files; monitor->monitor_attributes = file_attributes; monitor->client = client; search->details->monitor_list = g_list_prepend (search->details->monitor_list, monitor); if (callback != NULL) { (* callback) (directory, search->details->files, callback_data); } for (list = search->details->files; list != NULL; list = list->next) { file = list->data; /* Add monitors */ nemo_file_monitor_add (file, monitor, file_attributes); } start_or_stop_search_engine (search, TRUE); }
static GList * search_get_file_list (NemoDirectory *directory) { NemoSearchDirectory *search; search = NEMO_SEARCH_DIRECTORY (directory); return nemo_file_list_copy (search->details->files); }
static gboolean search_is_not_empty (NemoDirectory *directory) { NemoSearchDirectory *search; search = NEMO_SEARCH_DIRECTORY (directory); return search->details->files != NULL; }
static gboolean search_are_all_files_seen (NemoDirectory *directory) { NemoSearchDirectory *search; search = NEMO_SEARCH_DIRECTORY (directory); return (!search->details->query || search->details->search_finished); }
static gboolean search_contains_file (NemoDirectory *directory, NemoFile *file) { NemoSearchDirectory *search; search = NEMO_SEARCH_DIRECTORY (directory); /* FIXME: Maybe put the files in a hash */ return (g_list_find (search->details->files, file) != NULL); }
static void search_call_when_ready (NemoDirectory *directory, NemoFileAttributes file_attributes, gboolean wait_for_file_list, NemoDirectoryCallback callback, gpointer callback_data) { NemoSearchDirectory *search; SearchCallback *search_callback; search = NEMO_SEARCH_DIRECTORY (directory); search_callback = search_callback_find (search, callback, callback_data); if (search_callback == NULL) { search_callback = search_callback_find_pending (search, callback, callback_data); } if (search_callback) { g_warning ("tried to add a new callback while an old one was pending"); return; } search_callback = g_new0 (SearchCallback, 1); search_callback->search_directory = search; search_callback->callback = callback; search_callback->callback_data = callback_data; search_callback->wait_for_attributes = file_attributes; search_callback->wait_for_file_list = wait_for_file_list; if (wait_for_file_list && !search->details->search_finished) { /* Add it to the pending callback list, which will be * processed when the directory has finished loading */ search->details->pending_callback_list = g_list_prepend (search->details->pending_callback_list, search_callback); /* We might need to start the search engine */ start_or_stop_search_engine (search, TRUE); } else { search_callback->file_list = nemo_file_list_copy (search->details->files); search_callback->non_ready_hash = file_list_to_hash_table (search->details->files); if (!search_callback->non_ready_hash) { /* If there are no ready files, we invoke the callback with an empty list. */ search_callback_invoke_and_destroy (search_callback); } else { search->details->callback_list = g_list_prepend (search->details->callback_list, search_callback); search_callback_add_file_callbacks (search_callback); } } }
static void search_finalize (GObject *object) { NemoSearchDirectory *search; search = NEMO_SEARCH_DIRECTORY (object); g_free (search->details->saved_search_uri); g_free (search->details); G_OBJECT_CLASS (nemo_search_directory_parent_class)->finalize (object); }
static void search_dispose (GObject *object) { NemoSearchDirectory *search; GList *list; search = NEMO_SEARCH_DIRECTORY (object); /* Remove search monitors */ if (search->details->monitor_list) { for (list = search->details->monitor_list; list != NULL; list = list->next) { search_monitor_destroy ((SearchMonitor *)list->data, search); } g_list_free (search->details->monitor_list); search->details->monitor_list = NULL; } reset_file_list (search); if (search->details->callback_list) { /* Remove callbacks */ g_list_foreach (search->details->callback_list, (GFunc)search_callback_destroy, NULL); g_list_free (search->details->callback_list); search->details->callback_list = NULL; } if (search->details->pending_callback_list) { g_list_foreach (search->details->pending_callback_list, (GFunc)search_callback_destroy, NULL); g_list_free (search->details->pending_callback_list); search->details->pending_callback_list = NULL; } if (search->details->query) { g_object_unref (search->details->query); search->details->query = NULL; } if (search->details->engine) { if (search->details->search_running) { nemo_search_engine_stop (search->details->engine); } g_object_unref (search->details->engine); search->details->engine = NULL; } G_OBJECT_CLASS (nemo_search_directory_parent_class)->dispose (object); }
static void sync_search_directory (NemoWindowSlot *slot) { NemoDirectory *directory; NemoQuery *query; g_assert (NEMO_IS_FILE (slot->viewed_file)); directory = nemo_directory_get_for_file (slot->viewed_file); g_assert (NEMO_IS_SEARCH_DIRECTORY (directory)); query = nemo_query_editor_get_query (slot->query_editor); nemo_search_directory_set_query (NEMO_SEARCH_DIRECTORY (directory), query); g_object_unref (query); nemo_window_slot_reload (slot); nemo_directory_unref (directory); }
static void update_query_editor (NemoWindowSlot *slot) { NemoDirectory *directory; NemoSearchDirectory *search_directory; directory = nemo_directory_get (slot->location); if (NEMO_IS_SEARCH_DIRECTORY (directory)) { NemoQuery *query; search_directory = NEMO_SEARCH_DIRECTORY (directory); query = nemo_search_directory_get_query (search_directory); if (query != NULL) { nemo_query_editor_set_query (slot->query_editor, query); g_object_unref (query); } } else { nemo_query_editor_set_location (slot->query_editor, slot->location); } nemo_directory_unref (directory); }
static void search_monitor_remove (NemoDirectory *directory, gconstpointer client) { NemoSearchDirectory *search; SearchMonitor *monitor; GList *list; search = NEMO_SEARCH_DIRECTORY (directory); for (list = search->details->monitor_list; list != NULL; list = list->next) { monitor = list->data; if (monitor->client == client) { search->details->monitor_list = g_list_delete_link (search->details->monitor_list, list); search_monitor_destroy (monitor, search); break; } } start_or_stop_search_engine (search, FALSE); }