anjuta r4438 - in trunk: . plugins/symbol-db
- From: mcora svn gnome org
- To: svn-commits-list gnome org
- Subject: anjuta r4438 - in trunk: . plugins/symbol-db
- Date: Wed, 10 Dec 2008 23:40:53 +0000 (UTC)
Author: mcora
Date: Wed Dec 10 23:40:53 2008
New Revision: 4438
URL: http://svn.gnome.org/viewvc/anjuta?rev=4438&view=rev
Log:
* plugins/symbol-db/plugin.c (gtree_compare_func),
(on_editor_buffer_symbol_update_scan_end),
(on_editor_buffer_symbols_update_timeout), (on_editor_saved),
(value_added_current_editor), (do_add_new_files),
(on_project_element_added), (project_import_scan_end),
(do_import_project_sources_after_abort),
(do_import_project_sources), (do_import_system_sources),
(do_update_project_symbols), (do_check_offline_files_changed),
(on_project_root_added), (on_scan_end_manager),
(symbol_db_activate), (symbol_db_deactivate),
(isymbol_manager_search):
* plugins/symbol-db/plugin.h:
* plugins/symbol-db/symbol-db-engine.c
(sdb_engine_insert_dyn_query_node_by_id),
(sdb_engine_timeout_trigger_signals), (sdb_engine_thread_monitor),
(symbol_db_engine_update_files_symbols),
(symbol_db_engine_update_project_symbols):
* plugins/symbol-db/symbol-db-engine.h:
* plugins/symbol-db/symbol-db-view-locals.c (add_new_waiting_for),
(symbol_db_view_locals_recv_signals_from_engine),
(symbol_db_view_locals_update_list):
* plugins/symbol-db/symbol-db-view-locals.h:
* plugins/symbol-db/symbol-db-view.c
(symbol_db_view_recv_signals_from_engine):
code cleaning, mostly on the locals symbols and in the plugin scan-end
management.
Fixed bug #562808.
Modified:
trunk/ChangeLog
trunk/plugins/symbol-db/plugin.c
trunk/plugins/symbol-db/plugin.h
trunk/plugins/symbol-db/symbol-db-engine.c
trunk/plugins/symbol-db/symbol-db-engine.h
trunk/plugins/symbol-db/symbol-db-view-locals.c
trunk/plugins/symbol-db/symbol-db-view-locals.h
trunk/plugins/symbol-db/symbol-db-view.c
Modified: trunk/plugins/symbol-db/plugin.c
==============================================================================
--- trunk/plugins/symbol-db/plugin.c (original)
+++ trunk/plugins/symbol-db/plugin.c Wed Dec 10 23:40:53 2008
@@ -67,6 +67,16 @@
LAST_SIGNAL
};
+typedef enum
+{
+ TASK_IMPORT_PROJECT = 1,
+ TASK_IMPORT_PROJECT_AFTER_ABORT,
+ TASK_BUFFER_UPDATE,
+ TASK_ELEMENT_ADDED,
+ TASK_OFFLINE_CHANGES,
+ TASK_PROJECT_UPDATE
+} ProcTask;
+
static unsigned int signals[LAST_SIGNAL] = { 0 };
static gint
@@ -75,6 +85,12 @@
return strcmp ((const gchar*)a, (const gchar*)b);
}
+static gint
+gtree_compare_func (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+ return (gint)a - (gint)b;
+}
+
static void
register_stock_icons (AnjutaPlugin *plugin)
{
@@ -112,13 +128,7 @@
str = (gchar*)g_ptr_array_remove_index (sdb_plugin->buffer_update_files,
i);
/* we can now free it */
- g_free (str);
-
- /* last but not least, remove the signal */
- if (sdb_plugin->buffer_update_files->len <= 0)
- g_signal_handlers_disconnect_by_func (G_OBJECT(dbe),
- G_CALLBACK (on_editor_buffer_symbol_update_scan_end ),
- data);
+ g_free (str);
}
}
}
@@ -163,9 +173,6 @@
if (sdb_plugin->need_symbols_update == FALSE)
return TRUE;
-
- DEBUG_PRINT ("%s", "on_editor_buffer_symbols_update_timeout()");
-
if (sdb_plugin->current_editor)
{
ed = IANJUTA_EDITOR (sdb_plugin->current_editor);
@@ -194,7 +201,7 @@
{
/* hey we found it */
/* something is already scanning this buffer file. Drop the procedure now. */
- DEBUG_PRINT ("%s", "something is already scanning the file");
+ DEBUG_PRINT ("something is already scanning the file %s", local_path);
return FALSE;
}
}
@@ -216,19 +223,16 @@
buffer_sizes);
if (proc_id > 0)
- {
- /* if the size of the array is 0 then we probably want to connect it to some
- * signals
- */
- if (sdb_plugin->buffer_update_files->len > 0)
- g_signal_connect (G_OBJECT (sdb_plugin->sdbe_project), "scan-end",
- G_CALLBACK (on_editor_buffer_symbol_update_scan_end), sdb_plugin);
-
+ {
/* good. All is ready for a buffer scan. Add the file_scan into the arrays */
gchar * local_path_dup = g_strdup (local_path);
g_ptr_array_add (sdb_plugin->buffer_update_files, local_path_dup);
/* add the id too */
- g_ptr_array_add (sdb_plugin->buffer_update_ids, (gpointer)proc_id);
+ g_ptr_array_add (sdb_plugin->buffer_update_ids, GINT_TO_POINTER (proc_id));
+
+ /* add a task so that scan_end_manager can manage this */
+ g_tree_insert (sdb_plugin->proc_id_tree, GINT_TO_POINTER (proc_id),
+ GINT_TO_POINTER (TASK_BUFFER_UPDATE));
}
g_free (current_buffer);
@@ -304,12 +308,11 @@
if (strcmp (g_ptr_array_index (sdb_plugin->buffer_update_files, i),
local_filename) == 0)
{
- DEBUG_PRINT ("%s", "already scanning");
+ DEBUG_PRINT ("already scanning");
/* something is already scanning this buffer file. Drop the procedure now. */
return;
}
- }
-
+ }
files_array = g_ptr_array_new();
g_ptr_array_add (files_array, local_filename);
@@ -389,7 +392,7 @@
symbol_db_view_locals_update_list (
SYMBOL_DB_VIEW_LOCALS (sdb_plugin->dbv_view_tree_locals),
- sdb_plugin->sdbe_project, local_path);
+ sdb_plugin->sdbe_project, local_path, FALSE);
if (g_hash_table_lookup (sdb_plugin->editor_connected, editor) == NULL)
{
@@ -717,9 +720,11 @@
/**
* Perform the real add to the db and also checks that no dups are inserted.
+ * Return the real number of files added.
*/
static gint
-do_add_new_files (SymbolDBPlugin *sdb_plugin, const GPtrArray *sources_array)
+do_add_new_files (SymbolDBPlugin *sdb_plugin, const GPtrArray *sources_array,
+ ProcTask task)
{
GPtrArray* languages_array = NULL;
GPtrArray* to_scan_array = NULL;
@@ -830,8 +835,13 @@
*/
if (to_scan_array->len > 0)
{
- symbol_db_engine_add_new_files (sdb_plugin->sdbe_project, sdb_plugin->project_opened,
- to_scan_array, languages_array, TRUE);
+ gint proc_id = symbol_db_engine_add_new_files (sdb_plugin->sdbe_project,
+ sdb_plugin->project_opened, to_scan_array, languages_array,
+ TRUE);
+
+ /* insert the proc id associated within the task */
+ g_tree_insert (sdb_plugin->proc_id_tree, GINT_TO_POINTER (proc_id),
+ GINT_TO_POINTER (task));
}
g_ptr_array_foreach (languages_array, (GFunc)g_free, NULL);
@@ -865,8 +875,9 @@
files_array = g_ptr_array_new ();
g_ptr_array_add (files_array, filename);
+ /* TODO: manage signals freezing */
/* use a custom function to add the files to db */
- do_add_new_files (sdb_plugin, files_array);
+ do_add_new_files (sdb_plugin, files_array, TASK_ELEMENT_ADDED);
g_ptr_array_foreach (files_array, (GFunc)g_free, NULL);
g_ptr_array_free (files_array, TRUE);
@@ -1011,26 +1022,22 @@
}
static void
-on_importing_project_end (SymbolDBEngine *dbe, gint process_id, gpointer data)
+project_import_scan_end (SymbolDBEngine *dbe, gint process_id, gpointer data)
{
SymbolDBPlugin *sdb_plugin;
GFile* file;
gchar *local_path;
- g_return_if_fail (data != NULL);
+ g_return_if_fail (data != NULL);
sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (data);
- DEBUG_PRINT ("%s", "on_importing_project_end ()");
-
/* hide the progress bar */
gtk_widget_hide (sdb_plugin->progress_bar_project);
/* re-enable signals receiving on local-view */
- symbol_db_view_locals_recv_signals_from_engine (
- SYMBOL_DB_VIEW_LOCALS (sdb_plugin->dbv_view_tree_locals),
- sdb_plugin->sdbe_project, TRUE);
-
+ sdb_plugin->is_project_importing = FALSE;
+
/* and on global view */
symbol_db_view_recv_signals_from_engine (SYMBOL_DB_VIEW (sdb_plugin->dbv_view_tree),
sdb_plugin->sdbe_project, TRUE);
@@ -1041,36 +1048,34 @@
/* disconnect this coz it's not important after the process of importing */
g_signal_handlers_disconnect_by_func (dbe, on_project_single_file_scan_end,
- data);
-
- /* disconnect it as we don't need it anymore. */
- g_signal_handlers_disconnect_by_func (dbe, on_importing_project_end, data);
-
- sdb_plugin->files_count_project_done = 0;
- sdb_plugin->files_count_project = 0;
+ data);
- DEBUG_PRINT ("%s", "emitting signals[PROJECT_IMPORT_END]");
- /* emit signal. */
- g_signal_emit (sdb_plugin, signals[PROJECT_IMPORT_END], 0);
+ sdb_plugin->files_count_project_done = 0;
+ sdb_plugin->files_count_project = 0;
/* ok, enable local symbols view */
if (!IANJUTA_IS_EDITOR (sdb_plugin->current_editor))
+ {
+ DEBUG_PRINT ("!IANJUTA_IS_EDITOR (sdb_plugin->current_editor))");
return;
+ }
- file = ianjuta_file_get_file (IANJUTA_FILE (sdb_plugin->current_editor),
- NULL);
-
- if (file == NULL)
+ if ((file = ianjuta_file_get_file (IANJUTA_FILE (sdb_plugin->current_editor),
+ NULL)) == NULL)
+ {
+ DEBUG_PRINT ("file is NULL");
return;
+ }
- local_path = g_file_get_path (file);
+ local_path = g_file_get_path (file);
symbol_db_view_locals_update_list (
SYMBOL_DB_VIEW_LOCALS (sdb_plugin->dbv_view_tree_locals),
- sdb_plugin->sdbe_project, local_path);
+ sdb_plugin->sdbe_project, local_path, TRUE);
g_free (local_path);
}
+/* note the *system* word in the function */
static void
do_import_system_src_after_abort (SymbolDBPlugin *sdb_plugin,
const GPtrArray *sources_array)
@@ -1165,8 +1170,9 @@
}
/* we assume that sources_array has already unique elements */
+/* note the *project* word in the function */
static void
-do_import_project_src_after_abort (AnjutaPlugin *plugin,
+do_import_project_sources_after_abort (AnjutaPlugin *plugin,
const GPtrArray *sources_array)
{
SymbolDBPlugin *sdb_plugin;
@@ -1174,17 +1180,29 @@
sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (plugin);
+ /*
+ * if we're importing first shut off the signal receiving.
+ * We'll re-enable that on scan-end
+ */
+ symbol_db_view_locals_recv_signals_from_engine (
+ SYMBOL_DB_VIEW_LOCALS (sdb_plugin->dbv_view_tree_locals),
+ sdb_plugin->sdbe_project, FALSE);
+ sdb_plugin->is_project_importing = TRUE;
+
+ /* disable signals receiving from engine */
+ symbol_db_view_recv_signals_from_engine (
+ SYMBOL_DB_VIEW (sdb_plugin->dbv_view_tree),
+ sdb_plugin->sdbe_project, FALSE);
+
/* connect to receive signals on single file scan complete. We'll
* update a status bar notifying the user about the status
*/
g_signal_connect (G_OBJECT (sdb_plugin->sdbe_project), "single-file-scan-end",
G_CALLBACK (on_project_single_file_scan_end), plugin);
- real_added = do_add_new_files (sdb_plugin, sources_array);
- sdb_plugin->files_count_project += real_added;
-
- /* signal */
- g_signal_emit (sdb_plugin, signals[PROJECT_IMPORT_END], 0);
+ real_added = do_add_new_files (sdb_plugin, sources_array,
+ TASK_IMPORT_PROJECT_AFTER_ABORT);
+ sdb_plugin->files_count_project += real_added;
}
static void
@@ -1215,14 +1233,11 @@
symbol_db_view_locals_recv_signals_from_engine (
SYMBOL_DB_VIEW_LOCALS (sdb_plugin->dbv_view_tree_locals),
sdb_plugin->sdbe_project, FALSE);
-
+ sdb_plugin->is_project_importing = TRUE;
+
symbol_db_view_recv_signals_from_engine (
SYMBOL_DB_VIEW (sdb_plugin->dbv_view_tree),
sdb_plugin->sdbe_project, FALSE);
-
- g_signal_connect (G_OBJECT (sdb_plugin->sdbe_project), "scan-end",
- G_CALLBACK (on_importing_project_end), plugin);
-
DEBUG_PRINT ("%s", "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
DEBUG_PRINT ("Retrieving %d gbf sources of the project...",
@@ -1253,7 +1268,7 @@
g_object_unref (gfile);
}
- real_added = do_add_new_files (sdb_plugin, sources_array);
+ real_added = do_add_new_files (sdb_plugin, sources_array, TASK_IMPORT_PROJECT);
sdb_plugin->files_count_project += real_added;
/* connect to receive signals on single file scan complete. We'll
@@ -1271,10 +1286,10 @@
g_list_free (prj_elements_list);
}
-static void
-on_received_project_import_end (SymbolDBPlugin *sdb_plugin, gpointer data)
+static void
+do_import_system_sources (SymbolDBPlugin *sdb_plugin)
{
- DEBUG_PRINT ("%s", "on_received_project_import_end ()");
+ DEBUG_PRINT ("%s", "do_import_system_sources ()");
/* system's packages management */
GList *item = sdb_plugin->session_packages;
while (item != NULL)
@@ -1304,6 +1319,24 @@
}
static void
+do_update_project_symbols (SymbolDBPlugin *sdb_plugin, const gchar *root_dir)
+{
+ gint proc_id;
+ /* Update the symbols */
+ proc_id = symbol_db_engine_update_project_symbols (sdb_plugin->sdbe_project,
+ root_dir);
+ if (proc_id > 0)
+ {
+ sdb_plugin->is_project_updating = TRUE;
+
+ /* insert the proc id associated within the task */
+ g_tree_insert (sdb_plugin->proc_id_tree, GINT_TO_POINTER (proc_id),
+ GINT_TO_POINTER (TASK_PROJECT_UPDATE));
+ }
+}
+
+
+static void
do_check_offline_files_changed (SymbolDBPlugin *sdb_plugin)
{
GList * prj_elements_list;
@@ -1335,8 +1368,7 @@
{
DEBUG_PRINT ("%s", "hey, gfile is NULL");
continue;
- }
-
+ }
if ((filename = g_file_get_path (gfile)) == NULL ||
g_strcmp0 (filename, "") == 0)
@@ -1352,11 +1384,8 @@
DEBUG_PRINT ("hey, filename %s (uri %s) does NOT exist", filename, uri);
g_object_unref (gfile);
continue;
- }
-
-
- /* DEBUG_PRINT ("inserting into hash uri is ->%s<- filename ->%s<-",
- uri, filename);*/
+ }
+
g_hash_table_insert (prj_elements_hash, filename, (gpointer)1);
g_object_unref (gfile);
}
@@ -1423,7 +1452,20 @@
/* good. Let's go on with add of new files. */
if (to_add_files->len > 0)
{
- do_add_new_files (sdb_plugin, to_add_files);
+ /* block the signals spreading from engine to local-view tab */
+ symbol_db_view_locals_recv_signals_from_engine (
+ SYMBOL_DB_VIEW_LOCALS (sdb_plugin->dbv_view_tree_locals),
+ sdb_plugin->sdbe_project, FALSE);
+ sdb_plugin->is_offline_scanning = TRUE;
+
+ gint real_added = do_add_new_files (sdb_plugin, to_add_files,
+ TASK_OFFLINE_CHANGES);
+
+ DEBUG_PRINT ("going to do add %d files with TASK_OFFLINE_CHANGES",
+ real_added);
+
+ if (real_added <= 0)
+ sdb_plugin->is_offline_scanning = FALSE;
}
g_object_unref (it);
@@ -1458,14 +1500,7 @@
if (parallel_scan == TRUE)
{
/* we simulate a project-import-end signal received */
- on_received_project_import_end (sdb_plugin, sdb_plugin);
- }
- else
- {
- g_signal_connect (G_OBJECT (sdb_plugin),
- "project-import-end",
- G_CALLBACK (on_received_project_import_end),
- sdb_plugin);
+ do_import_system_sources (sdb_plugin);
}
/*
@@ -1491,9 +1526,8 @@
g_object_unref (gfile);
/* FIXME: where's the project name itself? */
- DEBUG_PRINT ("%s", "FIXME: where's the project name itself? ");
+ DEBUG_PRINT ("FIXME: where's the project name itself? ");
sdb_plugin->project_opened = g_strdup (root_dir);
- DEBUG_PRINT ("FIXME: setting project opened to %s", root_dir);
if (root_dir)
{
@@ -1548,44 +1582,27 @@
else
{
/*
- * no import needed. But we may have aborted the scan of sources ..
+ * no import needed. But we may have aborted the scan of sources in
+ * a previous session..
*/
- GPtrArray *sources_array = NULL;
+ GPtrArray *sources_array = NULL;
sources_array =
symbol_db_engine_get_files_with_zero_symbols (sdb_plugin->sdbe_project);
if (sources_array != NULL && sources_array->len > 0)
- {
- /*
- * if we're importing first shut off the signal receiving.
- * We'll re-enable that on scan-end
- */
- symbol_db_view_locals_recv_signals_from_engine (
- SYMBOL_DB_VIEW_LOCALS (sdb_plugin->dbv_view_tree_locals),
- sdb_plugin->sdbe_project, FALSE);
-
- symbol_db_view_recv_signals_from_engine (
- SYMBOL_DB_VIEW (sdb_plugin->dbv_view_tree),
- sdb_plugin->sdbe_project, FALSE);
-
- g_signal_connect (G_OBJECT (sdb_plugin->sdbe_project),
- "scan-end", G_CALLBACK (on_importing_project_end), plugin);
-
- do_import_project_src_after_abort (plugin, sources_array);
+ {
+ do_import_project_sources_after_abort (plugin, sources_array);
g_ptr_array_foreach (sources_array, (GFunc)g_free, NULL);
g_ptr_array_free (sources_array, TRUE);
}
-
/* check for offline changes */
- do_check_offline_files_changed (sdb_plugin);
+ do_check_offline_files_changed (sdb_plugin);
-
- /* Update the symbols */
- symbol_db_engine_update_project_symbols (sdb_plugin->sdbe_project,
- root_dir);
+ /* update any files of the project which isn't up-to-date */
+ do_update_project_symbols (sdb_plugin, root_dir);
}
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (sdb_plugin->progress_bar_project),
_("Populating symbols' db..."));
@@ -1593,6 +1610,7 @@
sdb_plugin->progress_bar_project);
gtk_widget_show (sdb_plugin->progress_bar_project);
+ /* open symbol view, the global symbols gtktree */
symbol_db_view_open (SYMBOL_DB_VIEW (sdb_plugin->dbv_view_tree),
sdb_plugin->sdbe_project);
g_source_remove (id);
@@ -1657,6 +1675,94 @@
sdb_plugin->project_opened = NULL;
}
+static void
+on_scan_end_manager (SymbolDBEngine *dbe, gint process_id,
+ gpointer data)
+{
+ SymbolDBPlugin *symbol_db;
+ symbol_db = ANJUTA_PLUGIN_SYMBOL_DB (data);
+ gint task_registered;
+
+ task_registered = GPOINTER_TO_INT (g_tree_lookup (symbol_db->proc_id_tree,
+ GINT_TO_POINTER (process_id)
+ ));
+ /* hey, we haven't find anything */
+ if (task_registered <= 0)
+ {
+ DEBUG_PRINT ("No task found, proc id was %d", process_id);
+ return;
+ }
+
+ switch (task_registered)
+ {
+ case TASK_IMPORT_PROJECT:
+ case TASK_IMPORT_PROJECT_AFTER_ABORT:
+ {
+ DEBUG_PRINT ("received TASK_IMPORT_PROJECT (AFTER_ABORT)");
+ project_import_scan_end (dbe, process_id, symbol_db);
+
+ /* get preferences about the parallel scan */
+ gboolean parallel_scan = anjuta_preferences_get_int (symbol_db->prefs,
+ PARALLEL_SCAN);
+
+ /* check the system population has a parallel fashion or not. */
+ if (parallel_scan == FALSE)
+ do_import_system_sources (symbol_db);
+ }
+ break;
+
+ case TASK_BUFFER_UPDATE:
+ DEBUG_PRINT ("received TASK_BUFFER_UPDATE");
+ on_editor_buffer_symbol_update_scan_end (dbe, process_id, symbol_db);
+ break;
+
+ case TASK_ELEMENT_ADDED:
+ DEBUG_PRINT ("TODO: TASK_ELEMENT_ADDED");
+ break;
+
+ case TASK_OFFLINE_CHANGES:
+ {
+ DEBUG_PRINT ("received TASK_OFFLINE_CHANGES");
+ symbol_db->is_offline_scanning = FALSE;
+ }
+ break;
+
+ case TASK_PROJECT_UPDATE:
+ {
+ DEBUG_PRINT ("received TASK_PROJECT_UPDATE");
+ symbol_db->is_project_updating = FALSE;
+ }
+
+ default:
+ DEBUG_PRINT ("Don't know what to to with task_registered %d",
+ task_registered);
+ }
+
+ /* ok, we're done. Remove the proc_id from the GTree coz we won't use it anymore */
+ if (g_tree_remove (symbol_db->proc_id_tree, GINT_TO_POINTER (process_id)) == FALSE)
+ g_warning ("Cannot remove proc_id from GTree");
+
+ DEBUG_PRINT ("symbol_db->is_offline_scanning == %d && "
+ "symbol_db->is_project_importing == %d && "
+ "symbol_db->is_project_updating == %d",
+ symbol_db->is_offline_scanning,
+ symbol_db->is_project_importing,
+ symbol_db->is_project_updating);
+
+ /**
+ * perform some checks on some booleans. If they're all successfully passed
+ * then activate the display of local view
+ */
+ if (symbol_db->is_offline_scanning == FALSE &&
+ symbol_db->is_project_importing == FALSE &&
+ symbol_db->is_project_updating == FALSE)
+ {
+ symbol_db_view_locals_recv_signals_from_engine (
+ SYMBOL_DB_VIEW_LOCALS (symbol_db->dbv_view_tree_locals),
+ symbol_db->sdbe_project, TRUE);
+ }
+}
+
static gboolean
symbol_db_activate (AnjutaPlugin *plugin)
{
@@ -1664,7 +1770,7 @@
gchar *anjuta_cache_path;
gchar *ctags_path;
- DEBUG_PRINT ("%s", "SymbolDBPlugin: Activating SymbolDBPlugin plugin ...");
+ DEBUG_PRINT ("SymbolDBPlugin: Activating SymbolDBPlugin plugin ...");
/* Initialize gda library. */
gda_init ();
@@ -1703,6 +1809,10 @@
symbol_db->buffer_update_files = g_ptr_array_new ();
symbol_db->buffer_update_ids = g_ptr_array_new ();
+ symbol_db->is_offline_scanning = FALSE;
+ symbol_db->is_project_importing = FALSE;
+ symbol_db->is_project_updating = FALSE;
+
DEBUG_PRINT ("SymbolDBPlugin: Initializing engines with %s", ctags_path);
/* create SymbolDBEngine(s) */
symbol_db->sdbe_project = symbol_db_engine_new (ctags_path);
@@ -1742,6 +1852,17 @@
g_signal_connect (G_OBJECT (symbol_db->sdbs), "single-file-scan-end",
G_CALLBACK (on_system_single_file_scan_end), plugin);
+ /* beign necessary to listen to many scan-end signals, we'll build up a method
+ * to manage them with just one signal connection
+ */
+ symbol_db->proc_id_tree = g_tree_new_full ((GCompareDataFunc)>ree_compare_func,
+ NULL,
+ NULL,
+ NULL);
+
+ g_signal_connect (G_OBJECT (symbol_db->sdbe_project), "scan-end",
+ G_CALLBACK (on_scan_end_manager), symbol_db);
+
/* sets preferences to NULL, it'll be instantiated when required.\ */
symbol_db->sdbp = NULL;
@@ -1777,6 +1898,7 @@
symbol_db->dbv_view_locals_tab_label = gtk_label_new (_("Local" ));
symbol_db->dbv_view_tree_locals = symbol_db_view_locals_new ();
+
/* activate signals receiving by default */
symbol_db_view_locals_recv_signals_from_engine (
SYMBOL_DB_VIEW_LOCALS (symbol_db->dbv_view_tree_locals),
@@ -1927,10 +2049,13 @@
on_system_scan_package_end,
plugin);
- g_signal_handlers_disconnect_by_func (G_OBJECT (sdb_plugin->sdbs),
+ g_signal_handlers_disconnect_by_func (G_OBJECT (sdb_plugin->sdbs),
on_system_single_file_scan_end,
plugin);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (sdb_plugin->sdbs),
+ on_scan_end_manager,
+ plugin);
if (sdb_plugin->update_timer)
{
g_timer_destroy (sdb_plugin->update_timer);
@@ -1984,6 +2109,9 @@
sdb_plugin->editor_connected = NULL;
}
+ // FIXME
+ g_tree_destroy (sdb_plugin->proc_id_tree);
+
/* Remove watches */
anjuta_plugin_remove_watch (plugin, sdb_plugin->root_watch_id, FALSE);
anjuta_plugin_remove_watch (plugin, sdb_plugin->editor_watch_id, TRUE);
@@ -2095,12 +2223,12 @@
if (match_types & IANJUTA_SYMBOL_TYPE_UNDEF)
{
filter_array = NULL;
- DEBUG_PRINT ("%s", "filter_array is NULL");
+ /*DEBUG_PRINT ("%s", "filter_array is NULL");*/
}
else
{
filter_array = symbol_db_engine_fill_type_array (match_types);
- DEBUG_PRINT ("filter_array filled with %d kinds", filter_array->len);
+ /*DEBUG_PRINT ("filter_array filled with %d kinds", filter_array->len);*/
}
if (exact_match == FALSE)
@@ -2114,20 +2242,6 @@
}
/* should we lookup for project of system tags? */
- //*/
- DEBUG_PRINT ("tags scan [%s] [exact_match %d] [global %d]", pattern,
- exact_match, global_symbols_search);
- {
- gint i;
- if (filter_array)
- for (i = 0; i < filter_array->len; i++)
- {
- DEBUG_PRINT ("filter_array for type [%d] %s", i,
- (gchar*)g_ptr_array_index (filter_array,
- i));
- }
- }
- //*/
iterator =
symbol_db_engine_find_symbol_by_name_pattern_filtered (
global_tags_search == FALSE ? dbe_project : dbe_globals,
Modified: trunk/plugins/symbol-db/plugin.h
==============================================================================
--- trunk/plugins/symbol-db/plugin.h (original)
+++ trunk/plugins/symbol-db/plugin.h Wed Dec 10 23:40:53 2008
@@ -52,7 +52,7 @@
/* a sort of 'default' value for ctags executable. User must have it installed */
#define CTAGS_PATH "/usr/bin/ctags"
-struct _SymbolDBPlugin{
+struct _SymbolDBPlugin {
AnjutaPlugin parent;
AnjutaUI *ui;
AnjutaPreferences *prefs;
@@ -117,9 +117,15 @@
gint files_count_system_done;
gchar *current_scanned_package;
GList *session_packages;
+
+ GTree *proc_id_tree;
+
+ gboolean is_project_importing; /* refreshes or resumes after abort */
+ gboolean is_project_updating; /* makes up to date symbols of the project's files */
+ gboolean is_offline_scanning; /* detects offline changes to makefile.am */
};
-struct _SymbolDBPluginClass{
+struct _SymbolDBPluginClass {
AnjutaPluginClass parent_class;
/* signals */
Modified: trunk/plugins/symbol-db/symbol-db-engine.c
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-engine.c (original)
+++ trunk/plugins/symbol-db/symbol-db-engine.c Wed Dec 10 23:40:53 2008
@@ -539,6 +539,7 @@
}
}
+#if 0
static GdaDataModel *
sdb_engine_execute_select_sql (SymbolDBEngine * dbe, const gchar *sql)
{
@@ -569,6 +570,7 @@
return res;
}
+#endif
static gint
sdb_engine_execute_non_select_sql (SymbolDBEngine * dbe, const gchar *sql)
@@ -761,8 +763,7 @@
}
dyn_node->query_str = g_strdup (sql);
-
- DEBUG_PRINT ("%s", "inserting direct child into main_gtree");
+
/* insert it into gtree, thanks */
g_tree_insert (node->sym_extra_info_gtree, (gpointer)sym_info, dyn_node);
@@ -1650,7 +1651,7 @@
g_queue_get_length (priv->thread_list_data) <= 0 &&
priv->thread_monitor_handler <= 0)
{
- DEBUG_PRINT ("%s", "removing signals trigger");
+ /*DEBUG_PRINT ("%s", "removing signals trigger");*/
/* remove the trigger coz we don't need it anymore... */
g_source_remove (priv->timeout_trigger_handler);
priv->timeout_trigger_handler = 0;
@@ -1676,7 +1677,7 @@
if (priv->shutting_down == TRUE)
{
- DEBUG_PRINT ("%s", "SymbolDBEngine is shutting down: removing thread monitor");
+ /*DEBUG_PRINT ("%s", "SymbolDBEngine is shutting down: removing thread monitor");*/
/* remove the thread monitor */
g_source_remove (priv->thread_monitor_handler);
priv->thread_monitor_handler = 0;
@@ -1708,7 +1709,7 @@
if (priv->thread_closure_retries > THREAD_MAX_CLOSURE_RETRIES &&
g_queue_get_length (priv->thread_list_data) <= 0)
{
- DEBUG_PRINT ("%s", "removing thread monitor");
+ /*DEBUG_PRINT ("%s", "removing thread monitor");*/
/* remove the thread monitor */
g_source_remove (priv->thread_monitor_handler);
priv->thread_monitor_handler = 0;
@@ -5561,7 +5562,6 @@
priv = dbe->priv;
- DEBUG_PRINT ("%s", "symbol_db_engine_update_files_symbols ()");
g_return_val_if_fail (priv->db_connection != NULL, FALSE);
g_return_val_if_fail (project != NULL, FALSE);
@@ -5591,7 +5591,7 @@
* PREP_QUERY_GET_ALL_FROM_FILE_BY_PROJECT_NAME. When it will do please
* remember to update this function.
*/
-gboolean
+gint
symbol_db_engine_update_project_symbols (SymbolDBEngine *dbe, const gchar *project)
{
const GdaSet *plist;
@@ -5657,7 +5657,7 @@
if (!GDA_IS_DATA_MODEL (data_model) ||
(num_rows = gda_data_model_get_n_rows (GDA_DATA_MODEL (data_model))) <= 0)
{
- g_message ("no rows");
+ DEBUG_PRINT ("no rows");
if (data_model != NULL)
g_object_unref (data_model);
data_model = NULL;
@@ -5775,7 +5775,7 @@
return symbol_db_engine_update_files_symbols (dbe, project,
files_to_scan, TRUE);
}
- return TRUE;
+ return -1;
}
gboolean
@@ -5869,7 +5869,7 @@
data = files_to_scan = NULL;
}
-gboolean
+gint
symbol_db_engine_update_buffer_symbols (SymbolDBEngine * dbe, const gchar *project,
GPtrArray * real_files_list,
const GPtrArray * text_buffers,
Modified: trunk/plugins/symbol-db/symbol-db-engine.h
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-engine.h (original)
+++ trunk/plugins/symbol-db/symbol-db-engine.h Wed Dec 10 23:40:53 2008
@@ -218,7 +218,7 @@
* Update symbols of saved files.
* @note WARNING: files_path and it's contents will be freed on
* on_scan_update_files_symbols_end () callback.
- * @return scan process id if insertion is successful, -1 on error.
+ * @return scan process id if insertion is successful, -1 on 'no files scanned'.
*/
gint
symbol_db_engine_update_files_symbols (SymbolDBEngine *dbe, const gchar *project,
Modified: trunk/plugins/symbol-db/symbol-db-view-locals.c
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-view-locals.c (original)
+++ trunk/plugins/symbol-db/symbol-db-view-locals.c Wed Dec 10 23:40:53 2008
@@ -641,8 +641,7 @@
/* we don't want a negative parent_symbol_id */
if (parent_symbol_id < 0)
- return;
-
+ return;
/* check if we already have some children waiting for a
* specific father to be inserted, then add this symbol_id to the list
@@ -1206,7 +1205,7 @@
SymbolDBViewLocalsPriv *priv;
g_return_if_fail (dbvl != NULL);
- priv = dbvl->priv;
+ priv = dbvl->priv;
if (enable_status == TRUE)
{
@@ -1243,25 +1242,25 @@
gtk_widget_set_sensitive (GTK_WIDGET (dbvl), FALSE);
priv->recv_signals = FALSE;
- if (priv->insert_handler >= 0)
+ if (priv->insert_handler > 0)
{
g_signal_handler_disconnect (G_OBJECT (dbe), priv->insert_handler);
priv->insert_handler = 0;
}
- if (priv->remove_handler >= 0)
+ if (priv->remove_handler > 0)
{
g_signal_handler_disconnect (G_OBJECT (dbe), priv->remove_handler);
priv->remove_handler = 0;
}
- if (priv->scan_end_handler >= 0)
+ if (priv->scan_end_handler > 0)
{
g_signal_handler_disconnect (G_OBJECT (dbe), priv->scan_end_handler);
priv->scan_end_handler = 0;
}
- if (priv->scope_update_handler >= 0)
+ if (priv->scope_update_handler > 0)
{
g_signal_handler_disconnect (G_OBJECT (dbe), priv->scope_update_handler);
priv->scope_update_handler = 0;
@@ -1293,10 +1292,9 @@
void
symbol_db_view_locals_update_list (SymbolDBViewLocals *dbvl, SymbolDBEngine *dbe,
- const gchar* filepath)
+ const gchar* filepath, gboolean force_update)
{
SymbolDBViewLocalsPriv *priv;
-
SymbolDBEngineIterator *iterator;
GtkTreeStore *store;
FileSymbolsStatus *fsstatus;
@@ -1307,17 +1305,21 @@
priv = dbvl->priv;
- DEBUG_PRINT ("symbol_db_view_locals_update_list () %s", filepath);
+ DEBUG_PRINT ("filepath %s", filepath);
/* we're not interested in giving user an updated gtktreestore if recv signals
* is false. In that case we can have a project importing...
+ * We should pass on this test if the force option is activated (i.e. is TRUE)
*/
- if (priv->recv_signals == FALSE)
+ if (priv->recv_signals == FALSE && force_update == FALSE)
{
gtk_tree_view_set_model (GTK_TREE_VIEW (dbvl), NULL);
return;
}
+ /* it's a good thing to enable the gtktreewidget */
+ gtk_widget_set_sensitive (GTK_WIDGET (dbvl), TRUE);
+
/* ok, we can have a case where we're revisiting an old file with an already
* populated GtkTreeStore. We're gonna set that gtktreestore along with the
* GTree(s) for nodes_displayed and waiting_for.
Modified: trunk/plugins/symbol-db/symbol-db-view-locals.h
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-view-locals.h (original)
+++ trunk/plugins/symbol-db/symbol-db-view-locals.h Wed Dec 10 23:40:53 2008
@@ -29,7 +29,7 @@
#include <gtk/gtk.h>
#include "symbol-db-engine.h"
-G_BEGIN_DECLS
+G_BEGIN_DECLS
#define SYMBOL_TYPE_DB_VIEW_LOCALS (symbol_db_view_locals_get_type ())
#define SYMBOL_DB_VIEW_LOCALS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SYMBOL_TYPE_DB_VIEW_LOCALS, SymbolDBViewLocals))
@@ -63,7 +63,11 @@
*/
void
symbol_db_view_locals_update_list (SymbolDBViewLocals *dbvl, SymbolDBEngine *dbe,
- const gchar* db_filepath);
+ const gchar* db_filepath, gboolean force_update);
+
+/**
+ * Get the line of the corresponding symbol/GtkTreeItem clicked in the opened file.
+ */
gint
symbol_db_view_locals_get_line (SymbolDBViewLocals *dbvl,
SymbolDBEngine *dbe,
Modified: trunk/plugins/symbol-db/symbol-db-view.c
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-view.c (original)
+++ trunk/plugins/symbol-db/symbol-db-view.c Wed Dec 10 23:40:53 2008
@@ -1816,19 +1816,19 @@
{
gtk_widget_set_sensitive (GTK_WIDGET (dbv), FALSE);
- if (priv->insert_handler >= 0)
+ if (priv->insert_handler > 0)
{
g_signal_handler_disconnect (G_OBJECT (dbe), priv->insert_handler);
priv->insert_handler = 0;
}
- if (priv->remove_handler >= 0)
+ if (priv->remove_handler > 0)
{
g_signal_handler_disconnect (G_OBJECT (dbe), priv->remove_handler);
priv->remove_handler = 0;
}
- if (priv->scan_end_handler >= 0)
+ if (priv->scan_end_handler > 0)
{
g_signal_handler_disconnect (G_OBJECT (dbe), priv->scan_end_handler);
priv->scan_end_handler = 0;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]