anjuta r4059 - in trunk: . libanjuta plugins/language-support-cpp-java plugins/symbol-db plugins/symbol-db/test plugins/valgrind



Author: jhs
Date: Sat Jul  5 18:15:33 2008
New Revision: 4059
URL: http://svn.gnome.org/viewvc/anjuta?rev=4059&view=rev

Log:
2008-07-05  Massimo Cora\'  <maxcvs email it>

	* libanjuta/anjuta-utils.c (anjuta_util_parse_args_from_string):
	fixed a little mem-leak.

	* plugins/symbol-db/Makefile.am:
	* plugins/symbol-db/anjuta-symbol-db.glade:
	* plugins/symbol-db/plugin.c (on_editor_update_ui),
	(on_char_added), (on_project_element_added),
	(on_project_element_removed), (on_system_scan_package_start),
	(on_system_scan_package_end), (on_system_single_file_scan_end),
	(on_project_single_file_scan_end), (on_importing_project_end),
	(do_import_sources_after_abort), (do_import_sources),
	(on_project_root_added), (on_project_root_removed),
	(symbol_db_activate), (symbol_db_deactivate),
	(symbol_db_instance_init), (isymbol_manager_search):
	* plugins/symbol-db/plugin.h:
	* plugins/symbol-db/symbol-db-engine.c
	(sdb_engine_disconnect_from_db), (sdb_engine_populate_db_by_tags),
	(sdb_engine_ctags_output_thread), (sdb_engine_scan_files_1),
	(symbol_db_engine_new), (sdb_engine_create_db_tables),
	(symbol_db_engine_db_exists), (symbol_db_engine_file_exists),
	(symbol_db_engine_project_exists),
	(symbol_db_engine_add_new_project), (sdb_engine_add_new_file),
	(symbol_db_engine_add_new_files), (sdb_engine_add_new_sym_type),
	(sdb_engine_add_new_sym_kind), (sdb_engine_add_new_sym_access),
	(sdb_engine_add_new_sym_implementation),
	(sdb_engine_add_new_scope_definition),
	(sdb_engine_add_new_tmp_heritage_scope),
	(sdb_engine_add_new_symbol),
	(symbol_db_engine_update_project_symbols),
	(on_scan_update_buffer_end),
	(symbol_db_engine_update_buffer_symbols),
	(symbol_db_engine_get_full_local_path),
	(symbol_db_engine_get_file_db_path),
	(symbol_db_engine_get_files_with_zero_symbols),
	(symbol_db_engine_get_file_symbols),
	(symbol_db_engine_find_symbol_by_name_pattern_filtered):
	* plugins/symbol-db/symbol-db-engine.h:
	* plugins/symbol-db/symbol-db-prefs.c (destroy_parseable_data),
	(on_listall_output), (on_listall_exit),
	(on_tag_load_toggled_parseable_cb), (on_tag_load_toggled),
	(symbol_db_prefs_init), (symbol_db_prefs_finalize):
	* plugins/symbol-db/symbol-db-prefs.h:
	* plugins/symbol-db/symbol-db-system.c (destroy_single_scan_data),
	(destroy_engine_scan_data), (sdb_system_init),
	(sdb_system_finalize), (sdb_system_class_init),
	(sdb_system_get_normalized_cflags),
	(on_engine_package_single_file_scan_end), (symbol_db_system_new),
	(symbol_db_system_is_package_parsed), (on_pkg_config_output),
	(sdb_system_files_visit_dir), (prepare_files_to_be_scanned),
	(on_engine_package_scan_end), (sdb_system_do_scan_package_1),
	(sdb_system_do_scan_next_package),
	(sdb_system_do_scan_new_package), (on_pkg_config_exit),
	(symbol_db_system_scan_package),
	(symbol_db_system_is_package_parseable):
	* plugins/symbol-db/symbol-db-system.h:
	* plugins/symbol-db/symbol-db-view.h:
	* plugins/symbol-db/test/Makefile.am:
	* plugins/symbol-db/test/benchmark.c (on_scan_end), (main):
	* plugins/symbol-db/test/main.c (add_new_files):
	brand-new system tags population system. It\'s still not completed. It crashes
	with libgda svn 3174: probably there\'s some thread bug on this library and
	must be fixed. The crash happens when system tags and project tags are scanned
	concurrently. It\'s a random crash, so it\'s not possible to find a point.
	Preferences page now support check-box toggle population. Anyway it\'s still
	missing a save-on-session method... to be implemented soon.

	* plugins/valgrind/preferences.c (build_general_prefs):
	be sure to set the correct executable path.

Modified:
   trunk/ChangeLog
   trunk/libanjuta/anjuta-utils.c
   trunk/plugins/language-support-cpp-java/cpp-java-assist.c
   trunk/plugins/symbol-db/Makefile.am
   trunk/plugins/symbol-db/anjuta-symbol-db.glade
   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-prefs.c
   trunk/plugins/symbol-db/symbol-db-prefs.h
   trunk/plugins/symbol-db/symbol-db-view.h
   trunk/plugins/symbol-db/test/Makefile.am
   trunk/plugins/symbol-db/test/benchmark.c
   trunk/plugins/symbol-db/test/main.c
   trunk/plugins/valgrind/preferences.c

Modified: trunk/libanjuta/anjuta-utils.c
==============================================================================
--- trunk/libanjuta/anjuta-utils.c	(original)
+++ trunk/libanjuta/anjuta-utils.c	Sat Jul  5 18:15:33 2008
@@ -995,6 +995,7 @@
 	if (is_quote) {
 		g_warning ("Unclosed quotation encountered at the end of parsing");
 	}
+	g_free (buffer);
 	return args;
 }
 

Modified: trunk/plugins/language-support-cpp-java/cpp-java-assist.c
==============================================================================
--- trunk/plugins/language-support-cpp-java/cpp-java-assist.c	(original)
+++ trunk/plugins/language-support-cpp-java/cpp-java-assist.c	Sat Jul  5 18:15:33 2008
@@ -300,7 +300,7 @@
 	{
 		g_free (assist->priv->scope_context_cache);
 		assist->priv->scope_context_cache = NULL;
-	}
+	} 
 	if (assist->priv->completion_cache)
 	{
 		GList* items = assist->priv->completion_cache->items;

Modified: trunk/plugins/symbol-db/Makefile.am
==============================================================================
--- trunk/plugins/symbol-db/Makefile.am	(original)
+++ trunk/plugins/symbol-db/Makefile.am	Sat Jul  5 18:15:33 2008
@@ -1,6 +1,6 @@
 if HAVE_PLUGIN_SYMBOL_DB
 
-SUBDIRS = test
+#SUBDIRS = test
 
 symbol_db_datadir = $(anjuta_data_dir)
 symbol_db_data_DATA = tables.sql
@@ -54,10 +54,11 @@
 	symbol-db-view-locals.h \
 	symbol-db-view-search.h \
 	symbol-db-view-search.c \
-    symbol-db-engine-iterator-node.h \
+    	symbol-db-engine-iterator-node.h \
 	symbol-db-engine-iterator-node.c \
 	symbol-db-prefs.c \
-	symbol-db-prefs.h
+	symbol-db-prefs.h  symbol-db-system.h \
+	symbol-db-system.c
 
 libanjuta_symbol_db_la_LDFLAGS = $(ANJUTA_PLUGIN_LDFLAGS)
 

Modified: trunk/plugins/symbol-db/anjuta-symbol-db.glade
==============================================================================
--- trunk/plugins/symbol-db/anjuta-symbol-db.glade	(original)
+++ trunk/plugins/symbol-db/anjuta-symbol-db.glade	Sat Jul  5 18:15:33 2008
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.2.2 on Tue Feb 19 21:47:46 2008 by pescio darkslack-->
+<!--Generated with glade3 3.4.4 on Tue Jul  1 00:29:01 2008 -->
 <glade-interface>
   <widget class="GtkWindow" id="symbol_db_pref_window">
     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -12,6 +12,7 @@
           <widget class="GtkFrame" id="frame1">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="label_xalign">0</property>
             <property name="shadow_type">GTK_SHADOW_NONE</property>
             <child>
               <widget class="GtkAlignment" id="alignment1">
@@ -38,8 +39,8 @@
                       <widget class="GtkFileChooserButton" id="preferences_folder:text:/:0:symboldb.root">
                         <property name="visible">True</property>
                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="preview_widget_active">False</property>
                         <property name="use_preview_label">False</property>
+                        <property name="preview_widget_active">False</property>
                         <property name="title" translatable="yes">Choose Ctags executable</property>
                       </widget>
                       <packing>
@@ -73,6 +74,7 @@
           <widget class="GtkFrame" id="frame2">
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="label_xalign">0</property>
             <property name="shadow_type">GTK_SHADOW_NONE</property>
             <child>
               <widget class="GtkAlignment" id="alignment2">
@@ -165,6 +167,44 @@
             <property name="position">1</property>
           </packing>
         </child>
+        <child>
+          <widget class="GtkFrame" id="frame3">
+            <property name="visible">True</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">GTK_SHADOW_NONE</property>
+            <child>
+              <widget class="GtkAlignment" id="alignment3">
+                <property name="visible">True</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <widget class="GtkHBox" id="hbox3">
+                    <property name="visible">True</property>
+                    <property name="homogeneous">True</property>
+                    <child>
+                      <widget class="GtkProgressBar" id="prefs_progressbar">
+                        <property name="visible">True</property>
+                        <property name="sensitive">False</property>
+                        <property name="show_text">True</property>
+                        <property name="text" translatable="yes">Checking if package is parseable...</property>
+                        <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <placeholder/>
+              <packing>
+                <property name="type">label_item</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="fill">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
       </widget>
     </child>
   </widget>

Modified: trunk/plugins/symbol-db/plugin.c
==============================================================================
--- trunk/plugins/symbol-db/plugin.c	(original)
+++ trunk/plugins/symbol-db/plugin.c	Sat Jul  5 18:15:33 2008
@@ -57,6 +57,7 @@
 #define CHOOSER_WIDGET		"preferences_folder:text:/:0:symboldb.root"
 
 #define LOCAL_ANJUTA_GLOBAL_DB_DIRECTORY 	"/.anjuta"
+#define PROJECT_GLOBALS		"/"
 
 
 static gpointer parent_class;
@@ -199,42 +200,12 @@
 	{
 		g_timer_reset (timer);
 	}
-	
-#if 0	
-	gint lineno = ianjuta_editor_get_lineno (editor, NULL);
-	
-	GtkTreeModel* model = anjuta_symbol_view_get_file_symbol_model
-							(ANJUTA_SYMBOL_VIEW(sv_plugin->sv_tree));
-	GtkTreeIter iter;
-	gboolean found = FALSE;
-	
-	if (sv_plugin->locals_line_number == lineno)
-		return;
-	sv_plugin->locals_line_number = lineno;
-	
-	if (!gtk_tree_model_get_iter_first (model, &iter))
-		return;
-	while (!found && lineno >= 0)
-	{
-		gtk_tree_model_get_iter_first (model, &iter);
-		do
-		{
-			found = iter_matches (sv_plugin, &iter, model, lineno);
-			if (found)
-				break;
-		}
-		while (gtk_tree_model_iter_next (model, &iter));
-		lineno--;
-	}
-#endif	
 }
 
 static void
 on_char_added (IAnjutaEditor *editor, IAnjutaIterable *position, gchar ch,
 			   SymbolDBPlugin *sdb_plugin)
 {
-	DEBUG_PRINT ("char added: %c [int %d]", ch, ch);
-	
 	if (timer == NULL)
 	{
 		/* creates and start a new timer. */
@@ -663,10 +634,6 @@
 		g_ptr_array_add (files_array, filename);
 		g_ptr_array_add (languages_array, g_strdup (lang));
 		
-		DEBUG_PRINT ("gonna opening %s", 
-					 filename + strlen(sdb_plugin->project_root_dir) );
-		DEBUG_PRINT ("project_root_dir %s", sdb_plugin->project_root_dir );
-		
 		symbol_db_engine_add_new_files (sdb_plugin->sdbe_project, 
 			sdb_plugin->project_opened, files_array, languages_array, TRUE);
 		
@@ -675,17 +642,16 @@
 		
 		g_ptr_array_foreach (languages_array, (GFunc)g_free, NULL);
 		g_ptr_array_free (languages_array, TRUE);
-
 	}
 }
 
 static void
 on_project_element_removed (IAnjutaProjectManager *pm, const gchar *uri,
-							SymbolDBPlugin *sv_plugin)
+							SymbolDBPlugin *sdb_plugin)
 {
 	gchar *filename;
 	
-	if (!sv_plugin->project_root_uri)
+	if (!sdb_plugin->project_root_uri)
 		return;
 	
 	filename = gnome_vfs_get_local_path_from_uri (uri);
@@ -693,10 +659,10 @@
 	{
 		DEBUG_PRINT ("on_project_element_removed");
 		DEBUG_PRINT ("gonna removing %s", 
-					 filename + strlen(sv_plugin->project_root_dir));
-		DEBUG_PRINT ("project_root_dir %s", sv_plugin->project_root_dir );
-		symbol_db_engine_remove_file (sv_plugin->sdbe_project, 
-			sv_plugin->project_root_dir, filename);
+					 filename + strlen(sdb_plugin->project_root_dir));
+		DEBUG_PRINT ("project_root_dir %s", sdb_plugin->project_root_dir );
+		symbol_db_engine_remove_file (sdb_plugin->sdbe_project, 
+			sdb_plugin->project_root_dir, filename);
 		
 		g_free (filename);
 	}
@@ -710,8 +676,80 @@
 	g_ptr_array_free (sources, TRUE);
 }
 
+
+static void
+on_system_scan_package_start (SymbolDBEngine *dbe, guint num_files, 
+							  const gchar *package, gpointer user_data)
+{
+	SymbolDBPlugin *sdb_plugin;
+	sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (user_data);
+
+	sdb_plugin->files_count_system_done = 0;
+	sdb_plugin->files_count_system = num_files;	
+	
+	DEBUG_PRINT ("on_system_scan_package_start  () [%s]", package);
+	
+	/* show the global bar */
+	gtk_widget_show (sdb_plugin->progress_bar_system);
+	
+	if (sdb_plugin->current_scanned_package != NULL)
+		g_free (sdb_plugin->current_scanned_package);
+	sdb_plugin->current_scanned_package = g_strdup (package);
+}
+
+static void
+on_system_scan_package_end (SymbolDBEngine *dbe, const gchar *package, 
+							  gpointer user_data)
+{
+	SymbolDBPlugin *sdb_plugin;
+	sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (user_data);
+	
+	DEBUG_PRINT ("on_system_scan_package_end () [%s]", package);
+	
+	/* hide the progress bar */
+	gtk_widget_hide (sdb_plugin->progress_bar_system);
+	
+	sdb_plugin->files_count_system_done = 0;
+	sdb_plugin->files_count_system = 0;
+}
+
+static void
+on_system_single_file_scan_end (SymbolDBEngine *dbe, gpointer data)
+{
+	AnjutaPlugin *plugin;
+	SymbolDBPlugin *sdb_plugin;
+	gchar *message;
+	gdouble fraction = 0;
+	
+	plugin = ANJUTA_PLUGIN (data);
+	sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (plugin);
+
+	DEBUG_PRINT ("on_system_single_file_scan_end ()");
+	
+	sdb_plugin->files_count_system_done++;	
+	if (sdb_plugin->files_count_system_done >= sdb_plugin->files_count_system)
+		message = g_strdup_printf (_("%s: Generating inheritances..."), 
+								   sdb_plugin->current_scanned_package);
+	else
+		message = g_strdup_printf (_("%s: %d files scanned out of %d"), 
+							sdb_plugin->current_scanned_package,
+							sdb_plugin->files_count_system_done, 
+							sdb_plugin->files_count_system);
+
+	if (sdb_plugin->files_count_system > 0)
+	{
+		fraction =  (gdouble) sdb_plugin->files_count_system_done / 
+			(gdouble) sdb_plugin->files_count_system;
+	}
+	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (sdb_plugin->progress_bar_system),
+								   fraction);
+	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (sdb_plugin->progress_bar_system), message);
+	gtk_widget_show (sdb_plugin->progress_bar_system);
+	g_free (message);	
+}
+
 static void
-on_single_file_scan_end (SymbolDBEngine *dbe, gpointer data)
+on_project_single_file_scan_end (SymbolDBEngine *dbe, gpointer data)
 {	
 	AnjutaPlugin *plugin;
 	SymbolDBPlugin *sdb_plugin;
@@ -721,24 +759,22 @@
 	plugin = ANJUTA_PLUGIN (data);
 	sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (plugin);
 	
-	sdb_plugin->files_count_done++;	
-	if (sdb_plugin->files_count_done >= sdb_plugin->files_count)
+	sdb_plugin->files_count_project_done++;	
+	if (sdb_plugin->files_count_project_done >= sdb_plugin->files_count_project)
 		message = g_strdup_printf (_("Generating inheritances..."));
 	else
 		message = g_strdup_printf (_("%d files scanned out of %d"), 
-							   sdb_plugin->files_count_done, sdb_plugin->files_count);
+							   sdb_plugin->files_count_project_done, sdb_plugin->files_count_project);
 	
-	DEBUG_PRINT ("on_single_file_scan_end (): %d out of %d", sdb_plugin->files_count_done, 
-				 sdb_plugin->files_count);
-	if (sdb_plugin->files_count > 0)
+	if (sdb_plugin->files_count_project > 0)
 	{
-		fraction =  (gdouble) sdb_plugin->files_count_done / 
-			(gdouble) sdb_plugin->files_count;
+		fraction =  (gdouble) sdb_plugin->files_count_project_done / 
+			(gdouble) sdb_plugin->files_count_project;
 	}
-	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (sdb_plugin->progress_bar),
+	gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (sdb_plugin->progress_bar_project),
 								   fraction);
-	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (sdb_plugin->progress_bar), message);
-	gtk_widget_show (sdb_plugin->progress_bar);
+	gtk_progress_bar_set_text (GTK_PROGRESS_BAR (sdb_plugin->progress_bar_project), message);
+	gtk_widget_show (sdb_plugin->progress_bar_project);
 	g_free (message);
 }
 
@@ -753,7 +789,8 @@
 	
 	DEBUG_PRINT ("on_importing_project_end ()");
 
-	gtk_widget_hide (sdb_plugin->progress_bar);
+	/* 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 (
@@ -768,13 +805,13 @@
 	symbol_db_view_open (SYMBOL_DB_VIEW (sdb_plugin->dbv_view_tree), sdb_plugin->sdbe_project);
 	
 	/* disconnect this coz it's not important after the process of importing */
-	g_signal_handlers_disconnect_by_func (dbe, on_single_file_scan_end, data);																 
+	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_done = 0;
-	sdb_plugin->files_count = 0;
+	sdb_plugin->files_count_project_done = 0;
+	sdb_plugin->files_count_project = 0;	
 }
 
 /* we assume that sources_array has already unique elements */
@@ -846,7 +883,7 @@
 			continue;
 		}
 					
-		sdb_plugin->files_count++;
+		sdb_plugin->files_count_project++;
 		g_ptr_array_add (languages_array, g_strdup (lang));					
 		g_ptr_array_add (to_scan_array, g_strdup (local_filename));
 	}
@@ -855,7 +892,7 @@
 	 * 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_single_file_scan_end), plugin);
+		  G_CALLBACK (on_project_single_file_scan_end), plugin);
 	
 	symbol_db_engine_add_new_files (sdb_plugin->sdbe_project, sdb_plugin->project_opened,
 					sources_array, languages_array, TRUE);
@@ -973,7 +1010,7 @@
 		if (!languages_array)
 			languages_array = g_ptr_array_new ();
 
-		sdb_plugin->files_count++;
+		sdb_plugin->files_count_project++;
 		g_ptr_array_add (sources_array, local_filename);
 		g_ptr_array_add (languages_array, g_strdup (lang));					
 	}
@@ -985,7 +1022,7 @@
 	 * 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_single_file_scan_end), plugin);
+		  G_CALLBACK (on_project_single_file_scan_end), plugin);
 	
 	symbol_db_engine_add_new_files (sdb_plugin->sdbe_project, sdb_plugin->project_opened,
 					sources_array, languages_array, TRUE);
@@ -1001,7 +1038,7 @@
 
 /* add a new project */
 static void
-project_root_added (AnjutaPlugin *plugin, const gchar *name,
+on_project_root_added (AnjutaPlugin *plugin, const gchar *name,
 					const GValue *value, gpointer user_data)
 {
 	IAnjutaProjectManager *pm;
@@ -1011,8 +1048,7 @@
 	sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (plugin);
 
 	pm = anjuta_shell_get_interface (ANJUTA_PLUGIN (sdb_plugin)->shell,
-									 IAnjutaProjectManager, NULL);
-	
+									 IAnjutaProjectManager, NULL);	
 		
 	g_free (sdb_plugin->project_root_uri);
 	sdb_plugin->project_root_uri = NULL;
@@ -1090,15 +1126,16 @@
 				/* Update the symbols */
 				symbol_db_engine_update_project_symbols (sdb_plugin->sdbe_project, root_dir);				
 			}
-			gtk_progress_bar_set_text (GTK_PROGRESS_BAR (sdb_plugin->progress_bar), 
+			gtk_progress_bar_set_text (GTK_PROGRESS_BAR (sdb_plugin->progress_bar_project), 
 									   _("Populating symbols' db..."));
-			id = g_idle_add ((GSourceFunc) gtk_progress_bar_pulse, sdb_plugin->progress_bar);
-			gtk_widget_show (sdb_plugin->progress_bar);
+			id = g_idle_add ((GSourceFunc) gtk_progress_bar_pulse, 
+							 sdb_plugin->progress_bar_project);
+			gtk_widget_show (sdb_plugin->progress_bar_project);
 			
 			symbol_db_view_open (SYMBOL_DB_VIEW (sdb_plugin->dbv_view_tree),
 								 sdb_plugin->sdbe_project);
 			g_source_remove (id);
-			gtk_widget_hide (sdb_plugin->progress_bar);
+			gtk_widget_hide (sdb_plugin->progress_bar_project);
 
 			/* root dir */
 			sdb_plugin->project_root_dir = root_dir;
@@ -1113,10 +1150,29 @@
 					  G_CALLBACK (on_project_element_added), sdb_plugin);
 	g_signal_connect (G_OBJECT (pm), "element_removed",
 					  G_CALLBACK (on_project_element_removed), sdb_plugin);
+	
+	gtk_widget_hide (sdb_plugin->progress_bar_system);
+#if 0
+//FIXME libgda thread bug.	
+	/* system's packages management */
+	GList* packages = ianjuta_project_manager_get_packages (pm, NULL);
+	GList *item = packages; 
+	while (item != NULL)
+	{
+		/* the function will take care of checking if the package is already 
+		 * scanned and present on db 
+		 */
+		DEBUG_PRINT ("ianjuta_project_manager_get_packages: package required: %s", 
+					 (gchar*)item->data);
+		symbol_db_system_scan_package (sdb_plugin->sdbs, item->data);
+				
+		item = item->next;
+	}
+#endif	
 }
 
 static void
-project_root_removed (AnjutaPlugin *plugin, const gchar *name,
+on_project_root_removed (AnjutaPlugin *plugin, const gchar *name,
 					  gpointer user_data)
 {
 	IAnjutaProjectManager *pm;
@@ -1175,6 +1231,9 @@
 	symbol_db->prefs_list_store = NULL;
 	symbol_db->pkg_config_launcher = NULL;
 	symbol_db->project_opened = NULL;
+
+	/* create mutex. Without this libgda'll crash on multithread environment */
+/*	symbol_db->engine_mutex = g_mutex_new ();*/
 	
 	/* create SymbolDBEngine(s) */
 	symbol_db->sdbe_project = symbol_db_engine_new ();
@@ -1185,20 +1244,37 @@
 	home_anjuta_dir = g_strdup_printf ("%s%s", g_get_home_dir(),
 									   LOCAL_ANJUTA_GLOBAL_DB_DIRECTORY);
 	symbol_db_engine_open_db (symbol_db->sdbe_globals, 
-							  home_anjuta_dir, "/");
+							  home_anjuta_dir, 
+							  PROJECT_GLOBALS);
 	g_free (home_anjuta_dir);
 	
+	/* create the object that'll manage the globals population */
+	symbol_db->sdbs = symbol_db_system_new (symbol_db, symbol_db->sdbe_globals);
+
+	g_signal_connect (G_OBJECT (symbol_db->sdbs), "scan-package-start",
+					  G_CALLBACK (on_system_scan_package_start), plugin);	
+	
+	g_signal_connect (G_OBJECT (symbol_db->sdbs), "scan-package-end",
+					  G_CALLBACK (on_system_scan_package_end), plugin);	
+	
+	g_signal_connect (G_OBJECT (symbol_db->sdbs), "single-file-scan-end",
+					  G_CALLBACK (on_system_single_file_scan_end), plugin);	
 	
 	/* Create widgets */
 	symbol_db->dbv_main = gtk_vbox_new(FALSE, 5);
 	symbol_db->dbv_notebook = gtk_notebook_new();
-	symbol_db->progress_bar = gtk_progress_bar_new();
-	g_object_ref (symbol_db->progress_bar);
+	symbol_db->progress_bar_project = gtk_progress_bar_new();	
+	g_object_ref (symbol_db->progress_bar_project);
 	
+	symbol_db->progress_bar_system = gtk_progress_bar_new();
+	g_object_ref (symbol_db->progress_bar_system);
+		
 	gtk_box_pack_start (GTK_BOX (symbol_db->dbv_main), symbol_db->dbv_notebook,
 						TRUE, TRUE, 0);
-	gtk_box_pack_start (GTK_BOX (symbol_db->dbv_main), symbol_db->progress_bar,
+	gtk_box_pack_start (GTK_BOX (symbol_db->dbv_main), symbol_db->progress_bar_project,
 						FALSE, FALSE, 0);
+	gtk_box_pack_start (GTK_BOX (symbol_db->dbv_main), symbol_db->progress_bar_system,
+						FALSE, FALSE, 0);	
 	gtk_widget_show_all (symbol_db->dbv_main);
 	
 	/* Local symbols */
@@ -1298,8 +1374,8 @@
 	/* set up project directory watch */
 	symbol_db->root_watch_id = anjuta_plugin_add_watch (plugin,
 									IANJUTA_PROJECT_MANAGER_PROJECT_ROOT_URI,
-									project_root_added,
-									project_root_removed, NULL);
+									on_project_root_added,
+									on_project_root_removed, NULL);
 
 	
 	/* Determine session state */
@@ -1323,6 +1399,11 @@
 	DEBUG_PRINT ("SymbolDBPlugin: destroying engine ...");
 	g_object_unref (sdb_plugin->sdbe_project);
 	sdb_plugin->sdbe_project = NULL;
+
+	/* this must be done *bedore* destroying sdbe_globals */
+	g_object_unref (sdb_plugin->sdbs);
+	sdb_plugin->sdbs = NULL;
+	g_free (sdb_plugin->current_scanned_package);
 	
 	g_object_unref (sdb_plugin->sdbe_globals);
 	sdb_plugin->sdbe_globals = NULL;
@@ -1352,8 +1433,8 @@
 	{
 		g_object_unref (sdb_plugin->pkg_config_launcher);
 		sdb_plugin->pkg_config_launcher = NULL;
-	}
-		
+	}	
+	
 	if (sdb_plugin->prefs_list_store)
 	{
 		g_object_unref (sdb_plugin->prefs_list_store);
@@ -1365,9 +1446,13 @@
 	anjuta_plugin_remove_watch (plugin, sdb_plugin->editor_watch_id, TRUE);
 	
 	/* Remove widgets: Widgets will be destroyed when dbv_main is removed */
-	g_object_unref (sdb_plugin->progress_bar);
+	g_object_unref (sdb_plugin->progress_bar_project);
+	g_object_unref (sdb_plugin->progress_bar_system);
 	anjuta_shell_remove_widget (plugin->shell, sdb_plugin->dbv_main, NULL);
 
+	/* delete mutexes */
+/*	g_mutex_free (sdb_plugin->engine_mutex);*/
+	
 	sdb_plugin->root_watch_id = 0;
 	sdb_plugin->editor_watch_id = 0;
 	sdb_plugin->dbv_notebook = NULL;
@@ -1379,7 +1464,8 @@
 	sdb_plugin->dbv_view_locals_tab_label = NULL;
 	sdb_plugin->dbv_view_tree_search = NULL;
 	sdb_plugin->dbv_view_search_tab_label = NULL;
-	sdb_plugin->progress_bar = NULL;
+	sdb_plugin->progress_bar_project = NULL;
+	sdb_plugin->progress_bar_system = NULL;
 	return TRUE;
 }
 
@@ -1403,8 +1489,12 @@
 {
 	SymbolDBPlugin *plugin = (SymbolDBPlugin*)obj;
 
-	plugin->files_count_done = 0;
-	plugin->files_count = 0;
+	plugin->files_count_project_done = 0;
+	plugin->files_count_project = 0;
+	
+	plugin->files_count_system_done = 0;
+	plugin->files_count_system = 0;	
+	plugin->current_scanned_package = NULL;
 }
 
 static void
@@ -1475,13 +1565,6 @@
 		/* global_tags scan */
 		/* the only parameters to change is the engine, dbe_globals */
 		DEBUG_PRINT ("global_tags scan ");
-		gint i;
-		
-		/* FIXME REMOVE ME */
-		for (i = 0; i < filter_array->len; i++)
-		{
-			DEBUG_PRINT ("filter%d = %s", i, g_ptr_array_index (filter_array, i));
-		}
 		
 		iterator = 
 			symbol_db_engine_find_symbol_by_name_pattern_filtered (dbe_globals,

Modified: trunk/plugins/symbol-db/plugin.h
==============================================================================
--- trunk/plugins/symbol-db/plugin.h	(original)
+++ trunk/plugins/symbol-db/plugin.h	Sat Jul  5 18:15:33 2008
@@ -30,6 +30,7 @@
 #include "symbol-db-engine.h"
 #include "symbol-db-engine-iterator.h"
 
+
 G_BEGIN_DECLS
 
 extern GType symbol_db_get_type (GTypeModule *module);
@@ -44,6 +45,9 @@
 typedef struct _SymbolDBPlugin SymbolDBPlugin;
 typedef struct _SymbolDBPluginClass SymbolDBPluginClass;
 
+
+#include "symbol-db-system.h"
+
 struct _SymbolDBPlugin{
 	AnjutaPlugin parent;
 	AnjutaUI *ui;
@@ -67,6 +71,7 @@
 	
 	/* global's one */
 	SymbolDBEngine *sdbe_globals;
+	SymbolDBSystem *sdbs;
 	
 	GtkWidget *dbv_main;				/* symbol main window [gtk_box] */
 	GtkWidget *dbv_notebook;          	/* main notebook */	
@@ -74,7 +79,8 @@
 										   symbols */
 	GtkWidget *scrolled_locals;
 	GtkWidget *scrolled_search;
-	GtkWidget *progress_bar;			/* symbol db progress bar */
+	GtkWidget *progress_bar_project;			/* symbol db progress bar - project */
+	GtkWidget *progress_bar_system;				/* symbol db progress bar - system (globals) */
 	
 	GtkWidget *dbv_view_tree;        	/* symbol_db_view */
 	GtkWidget *dbv_view_tab_label;
@@ -94,8 +100,14 @@
 	/* In session loading? */
 	gboolean session_loading;
 	
-	gint files_count;
-	gint files_count_done;
+	gint files_count_project;
+	gint files_count_project_done;
+	
+	gint files_count_system;
+	gint files_count_system_done;
+	gchar *current_scanned_package;
+	
+/*	GMutex* engine_mutex;*/
 };
 
 struct _SymbolDBPluginClass{
@@ -103,6 +115,7 @@
 };
 
 
+
 G_END_DECLS
 
 #endif

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	Sat Jul  5 18:15:33 2008
@@ -742,7 +742,7 @@
 static void 
 sdb_engine_second_pass_do (SymbolDBEngine * dbe);
 static gint
-sdb_engine_add_new_symbol (SymbolDBEngine * dbe, tagEntry * tag_entry,
+sdb_engine_add_new_symbol (SymbolDBEngine * dbe, const tagEntry * tag_entry,
 						   int file_defined_id,
 						   gboolean sym_update);
 
@@ -1173,7 +1173,6 @@
 	}
 }
 
-
 static gboolean
 sdb_engine_disconnect_from_db (SymbolDBEngine * dbe)
 {
@@ -1182,7 +1181,8 @@
 	g_return_val_if_fail (dbe != NULL, FALSE);
 	priv = dbe->priv;
 
-	gda_connection_close (priv->db_connection);
+	if (priv->db_connection != NULL)
+		gda_connection_close (priv->db_connection);
 	priv->db_connection = NULL;
 
 	if (priv->sql_parser != NULL)
@@ -1528,7 +1528,6 @@
 	DEBUG_PRINT ("elapsed: %f for (%d) [%f per symbol]", elapsed_DEBUG,
 				 tags_total_DEBUG, elapsed_DEBUG / tags_total_DEBUG);
 
-	DEBUG_PRINT ("EMITTING single-file-scan-end");
 	/* notify listeners that another file has been scanned */
 	g_async_queue_push (priv->signals_queue, (gpointer)(SINGLE_FILE_SCAN_END +1));
 }
@@ -1574,7 +1573,6 @@
 			{
 				gint scan_flag;
 				gchar *real_file;
-				DEBUG_PRINT ("found marker!");
 		
 				/* set the length of the string parsed */
 				tmp_str_length = marker_ptr - chars_ptr;
@@ -1954,8 +1952,25 @@
 	if (priv->shared_mem_file == 0)
 	{
 		gchar *temp_file;
-		temp_file = g_strdup_printf ("/anjuta-%d_%ld.tags", getpid (),
-							 time (NULL));
+		while (TRUE)
+		{
+			temp_file = g_strdup_printf ("/anjuta-%d_%ld.tags", getpid (),
+								 time (NULL));
+			gchar *test;
+			test = g_strconcat (SHARED_MEMORY_PREFIX, temp_file, NULL);
+			if (g_file_test (test, G_FILE_TEST_EXISTS) == TRUE)
+			{
+				DEBUG_PRINT ("file %s already exists... retrying", test);
+				g_free (test);
+				g_free (temp_file);
+				continue;
+			}
+			else
+			{
+				g_free (test);
+				break;
+			}
+		}
 
 		priv->shared_mem_str = temp_file;
 		
@@ -1974,8 +1989,6 @@
 	
 	priv->scanning_status = TRUE;	
 
-	DEBUG_PRINT ("sdb_engine_scan_files_1 (): PUSHING files_list->len %d to scan", 
-				 files_list->len);
 	for (i = 0; i < files_list->len; i++)
 	{
 		gchar *node = (gchar *) g_ptr_array_index (files_list, i);
@@ -2314,11 +2327,15 @@
 }
 
 SymbolDBEngine *
-symbol_db_engine_new (void)
+symbol_db_engine_new ()
 {
 	SymbolDBEngine *sdbe;
+	SymbolDBEnginePriv *priv;
 
 	sdbe = g_object_new (SYMBOL_TYPE_DB_ENGINE, NULL);
+	
+	priv = sdbe->priv;
+	priv->mutex = g_mutex_new ();
 	return sdbe;
 }
 
@@ -2418,13 +2435,6 @@
 
 	sdb_engine_execute_non_select_sql (dbe, contents);
 	
-	/*
-	command = gda_command_new (contents, GDA_COMMAND_TYPE_SQL,
-							   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
-	gda_connection_execute_non_select_command (priv->db_connection, command,
-											   NULL, NULL);
-	gda_command_free (command);
-*/
 	g_free (contents);
 	return TRUE;
 }
@@ -2451,13 +2461,61 @@
 		g_free (tmp_file);
 		return FALSE;
 	}
-	
-	DEBUG_PRINT ("db %s does exist", tmp_file);	
-	g_free (tmp_file);
 
+	g_free (tmp_file);
 	return TRUE;
 }
 
+/**
+ * Check if a file is already present [and scanned] in db.
+ */
+gboolean
+symbol_db_engine_file_exists (SymbolDBEngine * dbe, const gchar * abs_file_path)
+{
+	SymbolDBEnginePriv *priv;
+	gchar *relative;
+	gint file_defined_id;
+	GValue *value;
+
+	g_return_val_if_fail (dbe != NULL, FALSE);
+	g_return_val_if_fail (abs_file_path != NULL, FALSE);
+	
+	priv = dbe->priv;
+
+	if (priv->mutex)
+	{
+		g_mutex_lock (priv->mutex);
+	}
+	
+	relative = symbol_db_engine_get_file_db_path (dbe, abs_file_path);
+	if (relative == NULL)
+	{
+		if (priv->mutex)
+			g_mutex_unlock (priv->mutex);
+		return FALSE;
+	}	
+	value = gda_value_new (G_TYPE_STRING);
+	g_value_set_string (value, relative);	
+
+	if ((file_defined_id = sdb_engine_get_tuple_id_by_unique_name (dbe,
+													PREP_QUERY_GET_FILE_ID_BY_UNIQUE_NAME,
+													"filepath",
+													value)) < 0)
+	{	
+		g_free (relative);
+		gda_value_free (value);
+		if (priv->mutex)
+			g_mutex_unlock (priv->mutex);
+		return FALSE;	
+	}
+	
+	g_free (relative);
+	gda_value_free (value);
+	if (priv->mutex)
+		g_mutex_unlock (priv->mutex);
+	return TRUE;	
+}
+
 gboolean 
 symbol_db_engine_close_db (SymbolDBEngine *dbe)
 {
@@ -2598,7 +2656,8 @@
 				"prjname",
 				 value)) <= 0)
 	{
-		DEBUG_PRINT ("symbol_db_engine_open_project (): no project name found");
+		DEBUG_PRINT ("symbol_db_engine_project_exists (): no project named %s found",
+					 project_name);
 		gda_value_free (value);
 		return FALSE;
 	}
@@ -2649,7 +2708,7 @@
 				 PREP_QUERY_GET_WORKSPACE_ID_BY_UNIQUE_NAME,
 				 "wsname",
 				 value)) <= 0)
-		{
+		{ 
 			if (symbol_db_engine_add_new_workspace (dbe, workspace_name) == FALSE)
 			{
 				gda_value_free (value);
@@ -2708,12 +2767,10 @@
 	gda_holder_set_value (param, value);
 		
 	/* execute the query with parametes just set */
-	GError *err = NULL;
 	if (gda_connection_statement_execute_non_select (priv->db_connection, 
 														  (GdaStatement*)stmt, 
-														  (GdaSet*)plist, NULL, &err) == -1)
+														  (GdaSet*)plist, NULL, NULL) == -1)
 	{		
-		DEBUG_PRINT ("Error: %s", err->message);
 		gda_value_free (value);
 		return FALSE;
 	}
@@ -2825,8 +2882,8 @@
 	if (strstr (local_filepath, priv->project_directory) == NULL)
 		return FALSE;
 	
-	DEBUG_PRINT ("sdb_engine_add_new_file project_name %s local_filepath %s language %s",
-				 project_name, local_filepath, language);
+/*	DEBUG_PRINT ("sdb_engine_add_new_file project_name %s local_filepath %s language %s",
+				 project_name, local_filepath, language);*/
 	
 	value = gda_value_new (G_TYPE_STRING);
 	g_value_set_string (value, project_name);
@@ -2846,9 +2903,14 @@
 	value = gda_value_new (G_TYPE_STRING);
 	/* we're gonna set the file relative to the project folder, not the full one.
 	 * e.g.: we have a file on disk: "/tmp/foo/src/file.c" and a db_directory located on
-	 * "/tmp/foo/". The entry on db will be "/src/file.c" 
+	 * "/tmp/foo/". The entry on db will be "src/file.c" 
 	 */
-	g_value_set_string (value, local_filepath + strlen (priv->project_directory));
+	gchar *relative_path = symbol_db_engine_get_file_db_path (dbe, local_filepath);
+	if (relative_path == NULL)
+	{
+		return FALSE;
+	}	
+	g_value_set_string (value, relative_path);	
 
 	if ((file_id = sdb_engine_get_tuple_id_by_unique_name (dbe,
 								   PREP_QUERY_GET_FILE_ID_BY_UNIQUE_NAME,
@@ -2867,6 +2929,7 @@
 			== NULL)
 		{
 			g_warning ("query is null");
+			g_free (relative_path);
 			return FALSE;
 		}
 
@@ -2876,15 +2939,17 @@
 		if ((param = gda_set_get_holder ((GdaSet*)plist, "filepath")) == NULL)
 		{
 			g_warning ("param langname is NULL from pquery!");
+			g_free (relative_path);			
 			return FALSE;
 		}
-		gda_holder_set_value_str (param, NULL, local_filepath + 
-								  strlen(priv->project_directory));
+		
+		gda_holder_set_value_str (param, NULL, relative_path);
 
 		/* project id parameter */
 		if ((param = gda_set_get_holder ((GdaSet*)plist, "prjid")) == NULL)
 		{
 			g_warning ("param prjid is NULL from pquery!");
+			g_free (relative_path);
 			return FALSE;
 		}
 		value = gda_value_new (G_TYPE_INT);
@@ -2895,6 +2960,7 @@
 		if ((param = gda_set_get_holder ((GdaSet*)plist, "langid")) == NULL)
 		{
 			g_warning ("param langid is NULL from pquery!");
+			g_free (relative_path);
 			return FALSE;
 		}
 
@@ -2904,17 +2970,17 @@
 		gda_value_free (value);
 
 		/* execute the query with parametes just set */
-		GError *err = NULL;
 		if (gda_connection_statement_execute_non_select (priv->db_connection, 
 														 (GdaStatement*)stmt, 
 														 (GdaSet*)plist, NULL,
-														 &err) == -1)
+														 NULL) == -1)
 		{		
-			DEBUG_PRINT ("Error: %s", err->message);
+			g_free (relative_path);
 			return FALSE;
 		}	
 	}
 	gda_value_free (value);
+	g_free (relative_path);
 	
 	return TRUE;
 } 
@@ -2924,11 +2990,13 @@
 								const gchar * project_name,
 								const GPtrArray * files_path, 
 								const GPtrArray * languages,
-								gboolean scan_symbols)
+								gboolean force_scan)
 {
 	gint i;
 	SymbolDBEnginePriv *priv;
-
+	GPtrArray * filtered_files_path;
+	GPtrArray * filtered_languages;
+	gboolean ret_code;
 	g_return_val_if_fail (dbe != NULL, FALSE);
 	priv = dbe->priv;
 
@@ -2937,42 +3005,57 @@
 	g_return_val_if_fail (files_path->len > 0, FALSE);
 	g_return_val_if_fail (languages->len > 0, FALSE);
 
+	filtered_files_path = g_ptr_array_new ();
+	filtered_languages = g_ptr_array_new ();
+	
 	for (i = 0; i < files_path->len; i++)
 	{
-		gchar *node = (gchar *) g_ptr_array_index (files_path, i);
+		gchar *node_file = (gchar *) g_ptr_array_index (files_path, i);
 		gchar *node_lang = (gchar *) g_ptr_array_index (languages, i);
 		
 		/* test the existance of node file */
-		if (g_file_test (node, G_FILE_TEST_EXISTS) == FALSE)
+		if (g_file_test (node_file, G_FILE_TEST_EXISTS) == FALSE)
 		{
-			g_warning ("File %s does NOT exist", node);
+			g_warning ("File %s does NOT exist", node_file);
 			continue;
 		}
-			
-		if (sdb_engine_add_new_file (dbe, project_name, node, 
+		
+		if (force_scan == FALSE)
+		{
+			if (symbol_db_engine_file_exists (dbe, node_file) == TRUE)
+				/* we don't want to touch the already present file... within 
+				 * its symbols
+				 */
+				continue;
+		}
+		
+		if (sdb_engine_add_new_file (dbe, project_name, node_file, 
 									 node_lang) == FALSE)
 		{
 			g_warning ("Error processing file %s, db_directory %s, project_name %s, "
-					   "project_directory %s", node, 
+					   "project_directory %s", node_file, 
 					   priv->db_directory, project_name, priv->project_directory);
 			return FALSE;
 		}
+		
+		/* note: we don't use g_strdup () here because we'll free the filtered_files_path
+		 * before returning from this function.
+		 */
+		g_ptr_array_add (filtered_files_path, node_file);
 	}
 
 	/* perform the scan of files. It will spawn a fork() process with 
 	 * AnjutaLauncher and ctags in server mode. After the ctags cmd has been 
 	 * executed, the populating process'll take place.
 	 */
-
-	if (scan_symbols)
-		return sdb_engine_scan_files_1 (dbe, files_path, NULL, FALSE);
-	
-	return TRUE;
+	ret_code = sdb_engine_scan_files_1 (dbe, filtered_files_path, NULL, FALSE);
+	g_ptr_array_free (filtered_files_path, TRUE);
+	return ret_code;
 }
 
 
 static gint
-sdb_engine_add_new_sym_type (SymbolDBEngine * dbe, tagEntry * tag_entry)
+sdb_engine_add_new_sym_type (SymbolDBEngine * dbe, const tagEntry * tag_entry)
 {
 /*
 	CREATE TABLE sym_type (type_id integer PRIMARY KEY AUTOINCREMENT,
@@ -3058,7 +3141,7 @@
 }
 
 static gint
-sdb_engine_add_new_sym_kind (SymbolDBEngine * dbe, tagEntry * tag_entry)
+sdb_engine_add_new_sym_kind (SymbolDBEngine * dbe, const tagEntry * tag_entry)
 {
 /* 
 	CREATE TABLE sym_kind (sym_kind_id integer PRIMARY KEY AUTOINCREMENT,
@@ -3141,7 +3224,7 @@
 }
 
 static gint
-sdb_engine_add_new_sym_access (SymbolDBEngine * dbe, tagEntry * tag_entry)
+sdb_engine_add_new_sym_access (SymbolDBEngine * dbe, const tagEntry * tag_entry)
 {
 /* 
 	CREATE TABLE sym_access (access_kind_id integer PRIMARY KEY AUTOINCREMENT,
@@ -3227,7 +3310,7 @@
 
 static gint
 sdb_engine_add_new_sym_implementation (SymbolDBEngine * dbe,
-									   tagEntry * tag_entry)
+									   const tagEntry * tag_entry)
 {
 /*	
 	CREATE TABLE sym_implementation (sym_impl_id integer PRIMARY KEY AUTOINCREMENT,
@@ -3372,7 +3455,7 @@
 
 
 static gint
-sdb_engine_add_new_scope_definition (SymbolDBEngine * dbe, tagEntry * tag_entry,
+sdb_engine_add_new_scope_definition (SymbolDBEngine * dbe, const tagEntry * tag_entry,
 									 gint type_table_id)
 {
 /*
@@ -3483,7 +3566,7 @@
  */
 static gint
 sdb_engine_add_new_tmp_heritage_scope (SymbolDBEngine * dbe,
-									   tagEntry * tag_entry,
+									   const tagEntry * tag_entry,
 									   gint symbol_referer_id)
 {
 /*
@@ -4213,7 +4296,7 @@
  * fake_file is real_path of file on disk
  */
 static gint
-sdb_engine_add_new_symbol (SymbolDBEngine * dbe, tagEntry * tag_entry,
+sdb_engine_add_new_symbol (SymbolDBEngine * dbe, const tagEntry * tag_entry,
 						   gint file_defined_id,
 						   gboolean sym_update)
 {
@@ -5098,7 +5181,7 @@
 
 		/* build abs path. */
 		file_name = g_value_get_string (value);
-		if (priv->db_directory != NULL)
+		if (priv->project_directory != NULL)
 		{
 			/* FIXME */
 			abs_vfs_path = g_strdup_printf ("file://%s%s", priv->project_directory,
@@ -5252,17 +5335,23 @@
 	for (i = 0; i < files_to_scan->len; i++)
 	{
 		gchar *node = (gchar *) g_ptr_array_index (files_to_scan, i);
-		
+
+		 /* FIXME remove DEBUG_PRINT */
 		DEBUG_PRINT ("processing updating for file [on disk] %s, "
 					 "passed to on_scan_update_buffer_end (): %s", 
 					 node, node + strlen (priv->db_directory));
 
-		/* will be emitted removed signals */
-		if (sdb_engine_update_file (dbe, node+ 
-									strlen (priv->db_directory)) == FALSE)
+		gchar *relative_path = symbol_db_engine_get_file_db_path (dbe, node);
+		if (relative_path != NULL)
 		{
-			g_warning ("Error processing file %s", node);
-			return;
+			/* will be emitted removed signals */
+			if (sdb_engine_update_file (dbe, relative_path) == FALSE)
+			{
+				g_warning ("Error processing file %s", node);
+				g_free (relative_path);
+				return;
+			}
+			g_free (relative_path);
 		}
 		g_free (node);
 	}
@@ -5271,10 +5360,8 @@
 										  files_to_scan);
 
 	/* free the GPtrArray. */
-	DEBUG_PRINT ("free the files_to_scan");
 	g_ptr_array_free (files_to_scan, TRUE);
 	data = files_to_scan = NULL;
-	DEBUG_PRINT ("done");
 }
 
 /* Update symbols of a file by a memory-buffer to perform a real-time updating 
@@ -5311,10 +5398,15 @@
 	/* obtain a GPtrArray with real_files on database */
 	for (i=0; i < real_files_list->len; i++) 
 	{
-		gchar *new_node = (gchar*)g_ptr_array_index (real_files_list, i) 
-								   + strlen (priv->db_directory);
-
-		g_ptr_array_add (real_files_on_db, g_strdup (new_node));
+		gchar *relative_path = symbol_db_engine_get_file_db_path (dbe, 
+									g_ptr_array_index (real_files_list, i));
+		if (relative_path == NULL)
+		{
+			g_warning ("symbol_db_engine_update_buffer_symbols  (): "
+					   "relative_path is NULL");
+			return FALSE;
+		}
+		g_ptr_array_add (real_files_on_db, relative_path);
 	}	
 	
 	/* create a temporary file for each buffer */
@@ -5361,8 +5453,7 @@
 		
 		/* check if we already have an entry stored in the hash table, else
 		 * insert it 
-		 */
-		
+		 */		
 		if (g_hash_table_lookup (priv->garbage_shared_mem_files, shared_temp_file) 
 			== NULL)
 		{
@@ -5399,8 +5490,6 @@
 		g_free (g_ptr_array_index (real_files_on_db, i));
 	
 	g_ptr_array_free (real_files_on_db, TRUE);
-	
-	
 	return TRUE;
 }
 
@@ -5425,7 +5514,7 @@
 	g_return_val_if_fail (dbe != NULL, NULL);
 	
 	priv = dbe->priv;
-	full_path = g_strdup_printf ("%s%s", priv->db_directory, file);
+	full_path = g_strdup_printf ("%s%s", priv->project_directory, file);
 	return full_path;	
 }
 
@@ -5442,12 +5531,12 @@
 	if (priv->db_directory == NULL)
 		return NULL;
 
-	if (strlen (priv->db_directory) >= strlen (full_local_file_path)) 
+	if (strlen (priv->project_directory) >= strlen (full_local_file_path)) 
 	{
 		return NULL;
 	}
 
-	tmp = full_local_file_path + strlen (priv->db_directory);
+	tmp = full_local_file_path + strlen (priv->project_directory);
 	relative_path = strdup (tmp);
 
 	return relative_path;
@@ -5617,7 +5706,7 @@
 		file_name = g_value_get_string (value);
 		if (priv->db_directory != NULL)
 		{
-			file_abs_path = g_strdup_printf ("%s%s", priv->db_directory,
+			file_abs_path = g_strdup_printf ("%s%s", priv->project_directory,
 										file_name);
 		}
 		g_ptr_array_add (files_to_scan, file_abs_path);
@@ -7035,16 +7124,17 @@
 		return NULL;
 	}
 		
-	if (strlen (file_path) < strlen(priv->db_directory))
+	gchar *relative_path = symbol_db_engine_get_file_db_path (dbe, file_path);
+	if (relative_path == NULL)
 	{
-		DEBUG_PRINT ("strlen (file_path) < strlen(priv->db_directory)");
 		if (priv->mutex)
-			g_mutex_unlock (priv->mutex);
+			g_mutex_unlock (priv->mutex);		
 		return NULL;
 	}
-
-	gda_holder_set_value_str (param, NULL, file_path + strlen(priv->db_directory));
-		
+	
+	gda_holder_set_value_str (param, NULL, relative_path);
+	g_free (relative_path);
+	
 	/* execute the query with parametes just set */
 	data = gda_connection_statement_execute_select (priv->db_connection, 
 												  (GdaStatement*)dyn_node->stmt, 
@@ -7844,9 +7934,8 @@
 	
 	gda_holder_set_value_str (param, NULL, pattern);
 	
-
-	DEBUG_PRINT ("symbol_db_engine_find_symbol_by_name_pattern_filtered query: %s",
-				 dyn_node->query_str);
+/*	DEBUG_PRINT ("symbol_db_engine_find_symbol_by_name_pattern_filtered query: %s",
+				 dyn_node->query_str);*/
 		
 	/* execute the query with parametes just set */
 	data = gda_connection_statement_execute_select (priv->db_connection, 

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	Sat Jul  5 18:15:33 2008
@@ -48,8 +48,8 @@
 	GObjectClass parent_class;
 	
 	/* signals */
-	void (* single_file_scan_end) ();
-	void (* scan_end) ();
+	void (* single_file_scan_end) 	();
+	void (* scan_end) 				();
 	void (* symbol_inserted) 		(gint symbol_id);
 	void (* symbol_updated)  		(gint symbol_id);
 	void (* symbol_scope_updated)  	(gint symbol_id);	/* never emitted. */
@@ -82,7 +82,7 @@
 GType sdb_engine_get_type (void) G_GNUC_CONST;
 
 
-SymbolDBEngine* symbol_db_engine_new (void);
+SymbolDBEngine* symbol_db_engine_new ();
 
 
 /**
@@ -115,13 +115,18 @@
 gboolean 
 symbol_db_engine_close_db (SymbolDBEngine *dbe);
 
-
 /**
  * Check if the database already exists into the db_directory
  */
 gboolean
 symbol_db_engine_db_exists (SymbolDBEngine * dbe, const gchar * db_directory);
 
+/**
+ * Check if a file is already present [and scanned] in db.
+ */
+gboolean
+symbol_db_engine_file_exists (SymbolDBEngine * dbe, const gchar * abs_file_path);
+
 /** Add a new workspace to an opened database. */
 gboolean 
 symbol_db_engine_add_new_workspace (SymbolDBEngine *dbe, const gchar* workspace);
@@ -161,6 +166,8 @@
  *		  elments that files_path has. It should be populated like this: "C", "C++",
  *		  "Java"
  * 		  This is done to be uniform to the language-manager plugin.
+ * @param force_scan If FALSE a check on db will be done to see
+ *		  whether the file is already present or not.
  * @return true is insertion is successful.
  */
 gboolean 
@@ -168,7 +175,7 @@
 								const gchar * project_name,
 							    const GPtrArray *files_path,
 								const GPtrArray *languages,
-								gboolean scan_symbols);
+								gboolean force_scan);
 
 /**
  * Update symbols of the whole project. It scans all file symbols etc. 
@@ -397,4 +404,3 @@
 
 #endif /* _SYMBOL_DB_ENGINE_H_ */
 
-

Modified: trunk/plugins/symbol-db/symbol-db-prefs.c
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-prefs.c	(original)
+++ trunk/plugins/symbol-db/symbol-db-prefs.c	Sat Jul  5 18:15:33 2008
@@ -22,6 +22,7 @@
  * 	Boston, MA  02110-1301, USA.
  */
 
+#include <glib.h>
 #include <config.h>
 #include <ctype.h>
 #include <sys/types.h>
@@ -30,7 +31,6 @@
 #include <string.h>
 #include <gtk/gtktreeview.h>
 #include <gtk/gtkliststore.h>
-#include <libgnomevfs/gnome-vfs.h>
 #include <libanjuta/anjuta-debug.h>
 #include <libanjuta/anjuta-launcher.h>
 #include <libanjuta/interfaces/ianjuta-language.h>
@@ -49,18 +49,29 @@
 static GList *pkg_list = NULL;
 static gboolean initialized = FALSE;
 
+/* FIXME move away */
+static GladeXML *gxml;
+
 enum
 {
 	COLUMN_LOAD,
 	COLUMN_NAME,
-	COLUMN_FLAGS_LIST,
 	COLUMN_MAX
 };
 
-typedef struct _CflagsData {
+typedef struct _ParseableData {
 	SymbolDBPlugin *sdb_plugin;
-	GList *item;
-} CflagsData;
+	gchar *path_str;
+	
+} ParseableData;
+
+
+static void
+destroy_parseable_data (ParseableData *pdata)
+{
+	g_free (pdata->path_str);
+	g_free (pdata);
+}
 
 static void 
 on_prefs_executable_changed (GtkFileChooser *chooser,
@@ -90,140 +101,24 @@
 	return strcmp ((const gchar*)a, (const gchar*)b);
 }
 
+
 static void
-on_cflags_output (AnjutaLauncher * launcher,
+on_listall_output (AnjutaLauncher * launcher,
 					AnjutaLauncherOutputType output_type,
 					const gchar * chars, gpointer user_data)
 {
+	gchar **lines;
+	const gchar *curr_line;
+	gint i = 0;
 	SymbolDBPlugin *sdb_plugin;
 	GtkListStore *store;
-	GList *item;
-	CflagsData *cdata;
-	gchar **flags;
-	const gchar *curr_flag;
-	gint i;
-	GList *good_flags;
-	
-	cdata = (CflagsData*)user_data;
-	item = cdata->item;		
-	sdb_plugin = cdata->sdb_plugin;
-	store = sdb_plugin->prefs_list_store;
-	
-/*	DEBUG_PRINT ("on_cflags_output for item %s ->%s<-", item->data, chars);*/
-	
+
 	if (output_type == ANJUTA_LAUNCHER_OUTPUT_STDERR)
 	{
 		/* no way. We don't like errors on stderr... */
 		return;
 	}
 	
-	/* We should receive here something like 
-	* '-I/usr/include/gimp-2.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include'.
-	* Split up the chars and take a decision if we like it or not.
-	*/
-	flags = g_strsplit (chars, " ", -1);
-
-	i = 0;
-	/* if, after the while loop, good_flags is != NULL that means that we found
-	 * some good flags to include for a future scan 
-	 */
-	good_flags = NULL;
-	while ((curr_flag = flags[i++]) != NULL)
-	{
-		/* '-I/usr/include/gimp-2.0' would be good, but '/usr/include/' wouldn't. */
-		if (g_regex_match_simple ("\\.*/usr/include/\\w+", curr_flag, 0, 0) == TRUE)
-		{
-			/* FIXME the +2. It's to skip the -I */
-			DEBUG_PRINT ("adding %s to good_flags", curr_flag +2);
-			/* FIXME the +2. It's to skip the -I */
-			good_flags = g_list_prepend (good_flags, g_strdup (curr_flag + 2));
-		}
-	}	
-
-	g_strfreev (flags);
-
-	if (good_flags != NULL)
-	{
-		GtkTreeIter iter;
-		/* that's good. We can add the package to the GtkListStore */
-		gtk_list_store_append (store, &iter);
-		gtk_list_store_set (store, &iter, COLUMN_LOAD, FALSE,
-										COLUMN_NAME, g_strdup (item->data), 
-										COLUMN_FLAGS_LIST, good_flags, -1);
-	}
-}
-
-static void
-on_cflags_exit (AnjutaLauncher * launcher, int child_pid,
-				   int exit_status, gulong time_taken_in_seconds,
-				   gpointer user_data)
-{
-	CflagsData *cdata;
-	GList *item;	
-	gchar *exe_string;	
-	SymbolDBPlugin *sdb_plugin;
-	
-	cdata = (CflagsData*)user_data;
-	item = cdata->item;
-	sdb_plugin = cdata->sdb_plugin;
-	
-	/* select next item in the list. If it's null then free everything */
-	item = item->next;
-	if (item == NULL)
-	{
-		g_object_unref (cflags_launcher);
-		cflags_launcher = NULL;
-		g_free (cdata);
-		DEBUG_PRINT ("reached end of packages list");
-		return;
-	}
-
-	if (cflags_launcher)
-	{
-		/* recreate anjuta_launcher because.. well.. it closes stdout pipe
-		 * and stderr. There's no way to reactivate them 
-		 */
-		g_object_unref (cflags_launcher);
-		cflags_launcher = anjuta_launcher_new ();
-	}
-
-	
-	DEBUG_PRINT ("package for CFLAGS %s", (gchar*)item->data);
-
-
-	/* reuse CflagsData object to store the new glist pointer */
-	cdata->item = item;
-	/* sdb_plugin remains the same */
-	
-	g_signal_connect (G_OBJECT (cflags_launcher), "child-exited",
-				  G_CALLBACK (on_cflags_exit), cdata);	
-	
-	exe_string = g_strdup_printf ("pkg-config --cflags %s", (gchar*)item->data);
-	DEBUG_PRINT ("launching exe_string  %s", exe_string );
-	
-	anjuta_launcher_execute (cflags_launcher,
-						 exe_string, on_cflags_output, 
-						 cdata);
-		
-	g_free (exe_string);
-}
-
-static void
-on_listall_output (AnjutaLauncher * launcher,
-					AnjutaLauncherOutputType output_type,
-					const gchar * chars, gpointer user_data)
-{
-	if (output_type == ANJUTA_LAUNCHER_OUTPUT_STDERR)
-		return;
-	
-	/* there's no way to avoid getting stderr here. */
-	DEBUG_PRINT ("chars %s", chars);
-	gchar **lines;
-	const gchar *curr_line;
-	gint i = 0;
-	SymbolDBPlugin *sdb_plugin;
-	GtkListStore *store;
-		
 	sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (user_data);
 	
 	store = sdb_plugin->prefs_list_store;
@@ -236,7 +131,7 @@
 		
 		pkgs = g_strsplit (curr_line, " ", -1);
 		
-		/* just take the first one as it's the package-name */
+		/* just take the first token as it's the package-name */
 		if (pkgs == NULL)
 			return;		
 		
@@ -244,13 +139,6 @@
 			g_strfreev (pkgs);
 			continue;
 		}
-		DEBUG_PRINT ("pkg inserted into pkg_list is %s", pkgs[0]);		
-/*		
-		gtk_list_store_append (store, &iter);
-		gtk_list_store_set (store, &iter, COLUMN_LOAD, FALSE,
-									COLUMN_NAME, pkgs[0], 
-									COLUMN_FLAGS_LIST, NULL, -1);
-*/		
 		pkg_list = g_list_prepend (pkg_list, g_strdup (pkgs[0]));
 		g_strfreev (pkgs);
 	}
@@ -264,19 +152,20 @@
 				   gpointer user_data)
 {	
 	SymbolDBPlugin *sdb_plugin;
-	CflagsData *cdata;
-	gchar *exe_string;
+	GtkListStore *store;
+	GList *item;
 	
 	sdb_plugin = ANJUTA_PLUGIN_SYMBOL_DB (user_data);
+	store = sdb_plugin->prefs_list_store;
 	
-
-	DEBUG_PRINT ("launcher ended");
 	/* we should have pkg_list filled with packages names 
-	 * It's not enough anyway: we have to 1. sort alphabetically the list first
-	 * then 2. check for Iflags [pkg-config --cflags] if the regex returns void 
-	 * then kill the package from the list
-	 */
-		
+	 * It's not enough anyway: we have to sort alphabetically the list.
+	 * The implementation done before required the single scan of every package,
+	 * for instance 'pkg-config --cflags pkg_name', but this was really
+	 * unefficent when a lot of packages were found on /usr/lib/pkg-config.
+	 * Let then the user click on the toggle checkbox. We'll notify her whether
+	 * there are no good cflags for that package.
+	 */		
 	if (pkg_list == NULL)
 	{
 		g_warning ("No packages found");
@@ -285,260 +174,128 @@
 
 	pkg_list = g_list_sort (pkg_list, pkg_list_compare);
 
-	if (cflags_launcher == NULL)
-		cflags_launcher = anjuta_launcher_new ();
-	
-	cdata = g_new0 (CflagsData, 1);
-	
-	cdata->sdb_plugin = sdb_plugin;
-	cdata->item = pkg_list;
-	
-	DEBUG_PRINT ("package for CFLAGS %s", (gchar*)pkg_list->data);
-
-	g_signal_connect (G_OBJECT (cflags_launcher), "child-exited",
-				  G_CALLBACK (on_cflags_exit), cdata);	
 	
-	exe_string = g_strdup_printf ("pkg-config --cflags %s", (gchar*)pkg_list->data);
+	item = pkg_list;
 	
-	anjuta_launcher_execute (cflags_launcher,
-						 exe_string, on_cflags_output, 
-						 cdata);
+	while (item != NULL)
+	{
+		GtkTreeIter iter;
+		/* that's good. We can add the package to the GtkListStore */
+		gtk_list_store_append (GTK_LIST_STORE (store), &iter);
+		gtk_list_store_set (store, &iter, COLUMN_LOAD, FALSE,
+									COLUMN_NAME, g_strdup (item->data), -1);
 		
-	g_free (exe_string);
+		item = item->next;
+	}	
 }
 
-static GList **
-files_visit_dir (GList **files_list, const gchar* uri)
+static void 
+on_tag_load_toggled_parseable_cb (SymbolDBSystem *sdbs, 
+									gboolean is_parseable,
+									gpointer user_data)
 {
+	GtkWidget *treeview, *prefs_progressbar;
+	GtkWindow *prefs_window;
+	ParseableData *pdata;
+	SymbolDBPlugin *sdb_plugin;
+	const gchar *path_str;
+	
+	pdata = (ParseableData *)user_data;
+	path_str = pdata->path_str;
+	sdb_plugin = pdata->sdb_plugin;
 	
-	GList *files_in_curr_dir = NULL;
+	DEBUG_PRINT ("on_tag_load_toggled_parseable_cb %d", is_parseable);
+	prefs_window = GTK_WINDOW (glade_xml_get_widget (gxml, "symbol_db_pref_window"));
+	treeview = glade_xml_get_widget (gxml, "tags_treeview");
+	prefs_progressbar = glade_xml_get_widget (gxml, "prefs_progressbar");
 	
-	if (gnome_vfs_directory_list_load (&files_in_curr_dir, uri,
-								   GNOME_VFS_FILE_INFO_GET_MIME_TYPE) == GNOME_VFS_OK) 
+	if (is_parseable == FALSE)
 	{
-		GList *node;
-		node = files_in_curr_dir;
-		do {
-			GnomeVFSFileInfo* info;
-						
-			info = node->data;
-			
-			if (info->type == GNOME_VFS_FILE_TYPE_DIRECTORY) {
-				
-				if (strcmp (info->name, ".") == 0 ||
-					strcmp (info->name, "..") == 0)
-					continue;
-
-				g_message ("node [DIRECTORY]: %s", info->name);				
-				gchar *tmp = g_strdup_printf ("%s/%s", uri, info->name);
-				
-				g_message ("recursing for: %s", tmp);
-				/* recurse */
-				files_list = files_visit_dir (files_list, tmp);
-				
-				g_free (tmp);
-			}
-			else {
-				gchar *local_path;
-				gchar *tmp = g_strdup_printf ("%s/%s", 
-									uri, info->name);
-			
-				g_message ("prepending %s", tmp);
-				local_path = gnome_vfs_get_local_path_from_uri (tmp);
-				*files_list = g_list_prepend (*files_list, local_path);
-				g_free (tmp);
-			}
-		} while ((node = node->next) != NULL);		
-	}	 
+		GtkWidget *wid = gtk_message_dialog_new (prefs_window, GTK_DIALOG_MODAL, 
+												 GTK_MESSAGE_WARNING,
+								GTK_BUTTONS_OK, _("Package is not parseable"));
+		gtk_dialog_run (GTK_DIALOG (wid));
+ 		gtk_widget_destroy (wid);
+	}
+	else
+	{
+		GtkTreeIter iter;
+		GtkTreePath *path;		
+		GtkListStore *store;
+		gboolean enabled;
+		gchar *curr_package_name;
+
+		/* we have a good parseable package. Let's mark the check enabled/disabled */		
+		
+		store = sdb_plugin->prefs_list_store;
+		path = gtk_tree_path_new_from_string (path_str);
+		gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path);
+		gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+						COLUMN_LOAD, &enabled,
+						COLUMN_NAME, &curr_package_name,
+						-1);
+		enabled = !enabled;
+		gtk_list_store_set (store, &iter, COLUMN_LOAD, enabled, -1);
+		gtk_tree_path_free (path);
+		
+		/* good, should we scan the packages? */
+		if (enabled == TRUE)
+		{
+			symbol_db_system_scan_package (sdb_plugin->sdbs, curr_package_name);
+		}
+	}
+	
+	gtk_widget_set_sensitive (treeview, TRUE);
+	gtk_widget_hide (prefs_progressbar);	
 	
-	return files_list;
+	destroy_parseable_data (pdata);
 }
 
+				  
 static void
 on_tag_load_toggled (GtkCellRendererToggle *cell, char *path_str,
 					 SymbolDBPlugin *sdb_plugin)
 {
 	GtkTreeIter iter;
 	GtkTreePath *path;
-	gboolean enabled;
-	GList *enabled_packages;
 	gchar *curr_package_name;
 	GtkListStore *store;
-	AnjutaStatus *status;
-	GList * node;
-	GPtrArray *files_to_scan_array;
-	GPtrArray *languages_array;
-	IAnjutaLanguage* lang_manager;
+	GtkWidget *prefs_progressbar;
+	GtkWidget *	treeview;
+	ParseableData *pdata;
 	
 	DEBUG_PRINT ("on_tag_load_toggled ()");
-	lang_manager = anjuta_shell_get_interface (ANJUTA_PLUGIN(sdb_plugin)->shell, 
-													IAnjutaLanguage, NULL);
 	
-	
-	status = anjuta_shell_get_status (ANJUTA_PLUGIN (sdb_plugin)->shell, NULL);
 	store = sdb_plugin->prefs_list_store;
-	
-	anjuta_status_busy_push (status);
-	
 	path = gtk_tree_path_new_from_string (path_str);
 	gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path);
 	gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
-						COLUMN_LOAD, &enabled,
 						COLUMN_NAME, &curr_package_name,
-						COLUMN_FLAGS_LIST, &enabled_packages,
 						-1);
-	enabled = !enabled;
-	gtk_list_store_set (store, &iter, COLUMN_LOAD, enabled, -1);
 	gtk_tree_path_free (path);
-		
-	node = enabled_packages;	
 	
-	/* if we have some packages then initialize the array that will be passed to
-	 * the engine */
-	if (node != NULL)
-	{
-		files_to_scan_array = g_ptr_array_new ();
-		languages_array = g_ptr_array_new();
-	}
-	else
-		return;
-	
-	do {
-		GList *files_tmp_list = NULL;
-		gchar *uri;
-/*		g_message ("package %s has node : %s", curr_package_name, node->data);*/
-		
-		uri = gnome_vfs_get_uri_from_local_path (node->data);
-		
-		/* files_tmp_list needs to be freed */
-		files_visit_dir (&files_tmp_list, uri);
-		g_free (uri);
-		
-		if (files_tmp_list != NULL) 
-		{			
-			/* last loop here. With files_visit_dir we'll retrieve all files nodes
-			 * under the passed directory 
-			 */
-			GList *tmp_node;
-			tmp_node = files_tmp_list;
-			do {
-				const gchar* file_mime;
-				IAnjutaLanguageId lang_id;
-				const gchar* lang;
-				file_mime = gnome_vfs_get_mime_type_for_name (tmp_node->data);
-		
-				lang_id = ianjuta_language_get_from_mime_type (lang_manager, file_mime, 
-													   NULL);
-		
-				/* No supported language... */
-				if (!lang_id)
-				{
-					continue;
-				}
-			
-				lang = ianjuta_language_get_name (lang_manager, lang_id, NULL);				
-		
-				g_ptr_array_add (languages_array, g_strdup (lang));				
-				g_ptr_array_add (files_to_scan_array, g_strdup (tmp_node->data));
-			} while ((tmp_node = tmp_node->next) != NULL);		
-			
-			/* free the tmp files list */
-			g_list_foreach (files_tmp_list, (GFunc)g_free, NULL);
-			g_list_free (files_tmp_list);
-		}
-		
-		/* great. Launch the population, if we had something on files_to_scan_array */
-		if (files_to_scan_array != NULL) 
-		{
-			DEBUG_PRINT ("adding new project to db_plugin->sdbe_globals %s ", 
-						 curr_package_name);
-			symbol_db_engine_add_new_project (sdb_plugin->sdbe_globals,
-											  NULL,
-											  curr_package_name);
-			
-			symbol_db_engine_add_new_files (sdb_plugin->sdbe_globals,
-											curr_package_name, 
-											files_to_scan_array,
-											languages_array,
-											TRUE);
-		}
-		
-	} while ((node = node->next) != NULL);		
+	prefs_progressbar = glade_xml_get_widget (gxml, "prefs_progressbar");
+	gtk_widget_show_all (prefs_progressbar);	
 	
+	gtk_progress_bar_set_pulse_step (GTK_PROGRESS_BAR (prefs_progressbar), 1.0);
+	gtk_progress_bar_pulse (GTK_PROGRESS_BAR (prefs_progressbar));
 	
-#if 0		
-	enabled_paths = NULL;
-	if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter))
-	{
-		do
-		{
-			gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
-								COLUMN_LOAD, &enabled,
-								COLUMN_PATH, &tag_path,
-								-1);
-			if (enabled)
-				enabled_paths = g_list_prepend (enabled_paths, tag_path);
-			
-		}
-		while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
-	}
+	treeview = glade_xml_get_widget (gxml, "tags_treeview");
+	gtk_widget_set_sensitive (treeview, FALSE);
 	
-	if (enabled_paths)
-	{
-		GList *node;
-		GString *str;
-		gboolean first;
-		gchar *final_str;
-		
-		enabled_paths = g_list_sort (enabled_paths, (GCompareFunc)strcmp);
-		node = enabled_paths;
-		str = g_string_new ("");
-		first = TRUE;
-		while (node)
-		{
-			if (first)
-			{
-				first = FALSE;
-				str = g_string_append (str, (const gchar*) node->data);
-			}
-			else
-			{
-				str = g_string_append (str, ":");
-				str = g_string_append (str, (const gchar*) node->data);
-			}
-			node = g_list_next (node);
-		}
-		
-		/* Update preferences */
-		final_str = g_string_free (str, FALSE);
-		anjuta_preferences_set (prefs, SYMBOL_BROWSER_TAGS, final_str);
-		
-		/* Update system tags cache */
-		if (enabled)
-		{
-			update_system_tags_only_add (tag_path);
-		}
-		else
-		{
-			update_system_tags (enabled_paths);
-			g_free (final_str);
-		}
-	}
-	else
-	{
-		/* Unset key and clear all tags */
-		anjuta_preferences_set (prefs, SYMBOL_BROWSER_TAGS, "");
-	}
-	g_list_foreach (enabled_paths, (GFunc)g_free, NULL);
-	g_list_free (enabled_paths);
-	anjuta_status_busy_pop (status);
-#endif	
+	pdata = g_new0 (ParseableData, 1);
+	pdata->sdb_plugin = sdb_plugin;
+	pdata->path_str = g_strdup (path_str);
+	
+	symbol_db_system_is_package_parseable (sdb_plugin->sdbs, curr_package_name, 
+										   on_tag_load_toggled_parseable_cb,
+										   pdata);
 }
 
 void 
 symbol_db_prefs_init (SymbolDBPlugin *sdb_plugin, AnjutaPreferences *prefs)
 {
-	GladeXML *gxml;
+
 	GtkWidget *fchooser, *treeview;
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
@@ -561,15 +318,17 @@
 								 ICON_FILE);
 	ctags_value = anjuta_preferences_get (prefs, CTAGS_PREFS_KEY);
 	
-	if (ctags_value == NULL) 
+	if (ctags_value == NULL || strlen (ctags_value) <= 0) 
 	{
 		ctags_value = g_strdup (CTAGS_PATH);
 	}
 	
-	if (gtk_file_chooser_select_filename (GTK_FILE_CHOOSER (fchooser), ctags_value) 
+	DEBUG_PRINT ("trying to set ->%s<-", ctags_value);
+	if (gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (fchooser), ctags_value) 
 						== FALSE )
 	{
 		DEBUG_PRINT ("error: could not select file uri with gtk_file_chooser_select_filename ()");
+		return;
 	}
 	
 	g_signal_connect (G_OBJECT (fchooser), "selection-changed",
@@ -583,12 +342,12 @@
 	if (sdb_plugin->prefs_list_store == NULL) 
 	{
 		sdb_plugin->prefs_list_store = gtk_list_store_new (COLUMN_MAX, G_TYPE_BOOLEAN, 
-													   G_TYPE_STRING, G_TYPE_POINTER);
+													   G_TYPE_STRING);
 		require_scan = TRUE;
 	}
 	treeview = glade_xml_get_widget (gxml, "tags_treeview");
 	gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
-							 GTK_TREE_MODEL (sdb_plugin->prefs_list_store));
+							 GTK_TREE_MODEL (sdb_plugin->prefs_list_store));	
 
 	/* Add the column for stock treeview */
 	renderer = gtk_cell_renderer_toggle_new ();
@@ -611,12 +370,24 @@
 	gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
 									 COLUMN_NAME);
 	
+	/* frame3 show all */
+	GtkWidget *frame3;
+	frame3 = glade_xml_get_widget (gxml, "frame3");
+	gtk_widget_show_all (frame3);
+	GtkWidget *prefs_progressbar = glade_xml_get_widget (gxml, "prefs_progressbar");
+	gtk_widget_hide (prefs_progressbar);	
+	
+	
 	/* listall launcher thing */
 	if (require_scan == TRUE) 
 	{
 		sdb_plugin->pkg_config_launcher = anjuta_launcher_new ();
 
-		anjuta_launcher_set_check_passwd_prompt (sdb_plugin->pkg_config_launcher, FALSE);
+		anjuta_launcher_set_check_passwd_prompt (sdb_plugin->pkg_config_launcher, 
+												 FALSE);
+		/* the on_listall_exit callback will continue calling the launcher to process
+		 * every entry received
+		 */
 		g_signal_connect (G_OBJECT (sdb_plugin->pkg_config_launcher), "child-exited",
 					  	G_CALLBACK (on_listall_exit), sdb_plugin);	
 	
@@ -627,13 +398,12 @@
 							 	sdb_plugin);
 	}
 	
+		
 	/* unrefs unused memory objects */
-	g_object_unref (gxml);
 	g_free (ctags_value);
 	g_free (exe_string);
 	
-	/* pkg_tmp_file will be released on launcher_exit */
-	
+	/* pkg_tmp_file will be released on launcher_exit */	
 	initialized = TRUE;
 }
 
@@ -644,7 +414,8 @@
 	anjuta_preferences_notify_remove(prefs, sdb_plugin->prefs_notify_id);
 	anjuta_preferences_remove_page(prefs, _("Symbol Database"));
 
-	g_object_unref (cflags_launcher);
+	if (cflags_launcher != NULL)
+		g_object_unref (cflags_launcher);
 	cflags_launcher = NULL;
 	
 	/* free pkg_list */
@@ -652,5 +423,10 @@
 	g_list_free (pkg_list);
 	pkg_list = NULL;
 	
+	if (gxml != NULL)
+		g_object_unref (gxml);
+	
+	/* FIXME: disconnect signals */
+		
 	initialized = FALSE;
 }

Modified: trunk/plugins/symbol-db/symbol-db-prefs.h
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-prefs.h	(original)
+++ trunk/plugins/symbol-db/symbol-db-prefs.h	Sat Jul  5 18:15:33 2008
@@ -29,6 +29,7 @@
 
 void symbol_db_prefs_init (SymbolDBPlugin *plugin, AnjutaPreferences *prefs);
 void symbol_db_prefs_finalize (SymbolDBPlugin *plugin, AnjutaPreferences *prefs);
+
 /*
 void symbol_db_load_global_tags (gpointer plugin);
 */

Modified: trunk/plugins/symbol-db/symbol-db-view.h
==============================================================================
--- trunk/plugins/symbol-db/symbol-db-view.h	(original)
+++ trunk/plugins/symbol-db/symbol-db-view.h	Sat Jul  5 18:15:33 2008
@@ -28,7 +28,7 @@
 #include <glib-object.h>
 #include <gtk/gtk.h>
 #include "symbol-db-engine.h"
-#include "plugin.h"
+
 
 G_BEGIN_DECLS
 

Modified: trunk/plugins/symbol-db/test/Makefile.am
==============================================================================
--- trunk/plugins/symbol-db/test/Makefile.am	(original)
+++ trunk/plugins/symbol-db/test/Makefile.am	Sat Jul  5 18:15:33 2008
@@ -1,7 +1,7 @@
 
 bin_PROGRAMS = \
-	benchmark \
-	test_symbol_db
+	benchmark 
+	
 
 AM_CPPFLAGS = \
 	-DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \

Modified: trunk/plugins/symbol-db/test/benchmark.c
==============================================================================
--- trunk/plugins/symbol-db/test/benchmark.c	(original)
+++ trunk/plugins/symbol-db/test/benchmark.c	Sat Jul  5 18:15:33 2008
@@ -45,7 +45,9 @@
 static void 
 on_scan_end (SymbolDBEngine* engine, gpointer user_data)
 {
-  exit(0);
+	g_message ("on_scan_end  ()");
+	g_object_unref (engine);
+  	exit(0);
 }
 
 int main (int argc, char** argv)
@@ -67,8 +69,9 @@
 	}
 	root_dir = argv[1];
 	
-  engine = symbol_db_engine_new ();
-  g_signal_connect (engine, "scan-end", G_CALLBACK (on_scan_end), NULL);
+	GMutex *mutex = g_mutex_new ();
+    engine = symbol_db_engine_new (mutex);
+    
   
 	if (!symbol_db_engine_open_db (engine, root_dir, root_dir))
 	{
@@ -82,6 +85,7 @@
 	for (i = 0; i < files->len; i++)
 		g_ptr_array_add (languages, "C");
 	
+	g_signal_connect (engine, "scan-end", G_CALLBACK (on_scan_end), NULL);
 	g_signal_connect (G_OBJECT (engine), "single-file-scan-end",
 		  G_CALLBACK (on_single_file_scan_end), files);
 	

Modified: trunk/plugins/symbol-db/test/main.c
==============================================================================
--- trunk/plugins/symbol-db/test/main.c	(original)
+++ trunk/plugins/symbol-db/test/main.c	Sat Jul  5 18:15:33 2008
@@ -94,7 +94,7 @@
 	
 	files_array = g_ptr_array_new();	
 	g_ptr_array_add (files_array, g_strdup("/home/pescio/svnroot/libgda/providers/sqlite/sqlite-src/sqlite3.c"));	
-	symbol_db_engine_add_new_files (dbe, "foo_project", files_array, "C", TRUE);
+//	symbol_db_engine_add_new_files (dbe, "foo_project", files_array, "C", TRUE);
 }
 
 static void

Modified: trunk/plugins/valgrind/preferences.c
==============================================================================
--- trunk/plugins/valgrind/preferences.c	(original)
+++ trunk/plugins/valgrind/preferences.c	Sat Jul  5 18:15:33 2008
@@ -132,7 +132,7 @@
 
 	str_file = gconf_client_get_string (gconf, EXE_PATH, &err);
 
-	if (str_file == NULL || err != NULL) {
+	if (str_file == NULL || err != NULL || strlen (str_file) <= 0) {
 		str_file = g_strdup (VALGRIND_DEFAULT_BIN);
 	}
 	



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]