SF.net SVN: geany-plugins:[1693] trunk/geanylatex

frlan at users.sourceforge.net frlan at xxxxx
Sat Oct 30 20:12:07 UTC 2010


Revision: 1693
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1693&view=rev
Author:   frlan
Date:     2010-10-30 20:12:07 +0000 (Sat, 30 Oct 2010)

Log Message:
-----------
GeanyLaTeX: Try to fetch a list of BibTeX entries offered to the user through dialog by checking files inside current working directory.

Modified Paths:
--------------
    trunk/geanylatex/ChangeLog
    trunk/geanylatex/src/bibtex.c
    trunk/geanylatex/src/bibtex.h
    trunk/geanylatex/src/datatypes.h
    trunk/geanylatex/src/geanylatex.c
    trunk/geanylatex/src/latexutils.c
    trunk/geanylatex/src/reftex.h

Modified: trunk/geanylatex/ChangeLog
===================================================================
--- trunk/geanylatex/ChangeLog	2010-10-30 14:04:49 UTC (rev 1692)
+++ trunk/geanylatex/ChangeLog	2010-10-30 20:12:07 UTC (rev 1693)
@@ -1,3 +1,8 @@
+2010-10-30  Frank Lanitz  <frank(at)frank(dot)uvena(dot)de>
+
+ * Try to fetch BibTeX entries from files inside working dir of file.
+
+
 2010-10-29  Frank Lanitz  <frank(at)frank(dot)uvena(dot)de>
 
  * Added a first version of a dialog supporting inserting a bibtex entry.

Modified: trunk/geanylatex/src/bibtex.c
===================================================================
--- trunk/geanylatex/src/bibtex.c	2010-10-30 14:04:49 UTC (rev 1692)
+++ trunk/geanylatex/src/bibtex.c	2010-10-30 20:12:07 UTC (rev 1693)
@@ -190,3 +190,66 @@
 	g_free(tmp);
 }
 
+/* Parses a given bib file and inserting found references into a given comboboy */
+void glatex_parse_bib_file(const gchar* file, gpointer combobox)
+{
+	gchar **bib_entries = NULL;
+	int i = 0;
+	LaTeXLabel *tmp;
+	gchar *tmp_label_name = NULL;
+	
+	if (file != NULL)
+	{
+		/*  Return if its not an bib file */
+		if (!g_str_has_suffix(file, ".bib"))
+		{
+			return;
+		}
+
+		bib_entries = glatex_read_file_in_array(file);
+
+		if (bib_entries != NULL)
+		{
+			for (i = 0; bib_entries[i] != NULL ; i++)
+			{
+				if  (g_str_has_prefix(bib_entries[i], "@"))
+				{
+					tmp = glatex_parseLine_bib(bib_entries[i]);
+					tmp_label_name = g_strdup(tmp->label_name);
+					gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), tmp_label_name);
+					g_free(tmp);
+					g_free(tmp_label_name);
+				}
+			}
+			g_free(bib_entries);
+		}
+	}
+}
+
+
+LaTeXLabel* glatex_parseLine_bib(const gchar *line)
+{
+	LaTeXLabel *label;
+	const gchar *tmp_string = NULL;
+	const gchar *x = NULL;
+	gint l = 0;
+
+	label = g_new0(LaTeXLabel, 1);
+	
+	x = line;
+	
+	while (*x != '\0' && 
+		   *x != '{')
+	{
+		x++;
+	}
+	tmp_string = x + 1;
+	g_warning("%s", tmp_string);
+	while (*x != '\0' && *x != ',')
+	{
+		l++;
+		x++;
+	}
+	label->label_name = g_strndup(tmp_string, l - 1);
+	return label;
+}

Modified: trunk/geanylatex/src/bibtex.h
===================================================================
--- trunk/geanylatex/src/bibtex.h	2010-10-30 14:04:49 UTC (rev 1692)
+++ trunk/geanylatex/src/bibtex.h	2010-10-30 20:12:07 UTC (rev 1693)
@@ -84,5 +84,8 @@
 void glatex_bibtex_write_entry(GPtrArray *entry, gint doctype);
 GPtrArray *glatex_bibtex_init_empty_entry(void);
 void glatex_bibtex_insert_cite(gchar *reference_name, gchar *option);
+void glatex_parse_bib_file(const gchar* file, gpointer combobox);
+LaTeXLabel* glatex_parseLine_bib(const gchar *line);
 
+
 #endif

Modified: trunk/geanylatex/src/datatypes.h
===================================================================
--- trunk/geanylatex/src/datatypes.h	2010-10-30 14:04:49 UTC (rev 1692)
+++ trunk/geanylatex/src/datatypes.h	2010-10-30 20:12:07 UTC (rev 1693)
@@ -69,4 +69,11 @@
 	gchar *label;
 } BibTeXType;
 
+typedef struct
+{
+	gchar *label_name;
+	gint page;
+	gchar *chapter;
+} LaTeXLabel;
+
 #endif

Modified: trunk/geanylatex/src/geanylatex.c
===================================================================
--- trunk/geanylatex/src/geanylatex.c	2010-10-30 14:04:49 UTC (rev 1692)
+++ trunk/geanylatex/src/geanylatex.c	2010-10-30 20:12:07 UTC (rev 1693)
@@ -1272,13 +1272,18 @@
 on_insert_bibtex_dialog_activate(G_GNUC_UNUSED GtkMenuItem *menuitem,
 								 G_GNUC_UNUSED gpointer gdata)
 {
-	GtkWidget *dialog = NULL;
+	GtkWidget *dialog;
 	GtkWidget *vbox = NULL;
-	GtkWidget *label = NULL;
+	GtkWidget *label= NULL;
 	GtkWidget *textbox = NULL;
 	GtkWidget *table = NULL;
+	GtkWidget *tmp_entry = NULL;
+	GtkTreeModel *model = NULL;
+	GeanyDocument *doc = NULL;
 
-	dialog = gtk_dialog_new_with_buttons(_("Insert Reference"),
+	doc = document_get_current();
+
+	dialog = gtk_dialog_new_with_buttons(_("Insert BibTeX Reference"),
 						 GTK_WINDOW(geany->main_widgets->window),
 						 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL,
 						 GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
@@ -1291,29 +1296,69 @@
 	gtk_table_set_col_spacings(GTK_TABLE(table), 6);
 	gtk_table_set_row_spacings(GTK_TABLE(table), 6);
 
-	label = gtk_label_new(_("BibTeX reference:"));
-	textbox = gtk_entry_new();
+	label = gtk_label_new(_("BiBTeX reference name:"));
+	textbox = gtk_combo_box_entry_new_text();
 
+	if (doc->real_path != NULL)
+	{
+		GDir *dir;
+		gchar *tmp_dir;
+		const gchar *filename;
+		
+		tmp_dir = g_path_get_dirname(doc->real_path);
+		dir = g_dir_open(tmp_dir, 0, NULL);
+
+		g_return_if_fail(dir != NULL);
+
+		foreach_dir(filename, dir)
+		{
+			gchar *fullpath = NULL;
+			fullpath = g_build_path(G_DIR_SEPARATOR_S, tmp_dir, filename, NULL);
+		
+			glatex_parse_bib_file(fullpath, textbox);
+			g_free(fullpath);
+		}
+		g_dir_close(dir);
+		model = gtk_combo_box_get_model(GTK_COMBO_BOX(textbox));
+		gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),
+			0, GTK_SORT_ASCENDING);
+	}
+
+
 	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
 
 	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 0, 1);
 	gtk_table_attach_defaults(GTK_TABLE(table), textbox, 1, 2, 0, 1);
 	gtk_container_add(GTK_CONTAINER(vbox), table);
 
-	g_signal_connect(G_OBJECT(textbox), "activate",
+	tmp_entry = gtk_bin_get_child(GTK_BIN(textbox));
+	g_signal_connect(G_OBJECT(tmp_entry), "activate",
 		G_CALLBACK(glatex_enter_key_pressed_in_entry), dialog);
 
 	gtk_widget_show_all(vbox);
 
 	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
 	{
-		gchar *str = NULL;
-		str = g_strdup(gtk_entry_get_text(GTK_ENTRY(textbox)));
-		glatex_bibtex_insert_cite(str, NULL);
+		gchar *ref_string = NULL;
+		GString *template_string = NULL;
 
-		g_free(str);
+		ref_string = g_strdup(gtk_combo_box_get_active_text(
+			GTK_COMBO_BOX(textbox)));
+
+		if (ref_string != NULL)
+		{
+			glatex_bibtex_insert_cite(ref_string, NULL);
+			g_free(ref_string);
+		}
+		else
+		{
+			if (ref_string != NULL)
+				g_free(ref_string);
+			if (template_string != NULL)
+				g_free(template_string);
+		}
 	}
-	
+
 	gtk_widget_destroy(dialog);
 }
 

Modified: trunk/geanylatex/src/latexutils.c
===================================================================
--- trunk/geanylatex/src/latexutils.c	2010-10-30 14:04:49 UTC (rev 1692)
+++ trunk/geanylatex/src/latexutils.c	2010-10-30 20:12:07 UTC (rev 1693)
@@ -26,19 +26,19 @@
 {
 	gchar **result = NULL;
 	gchar *data;
-
-	if (filename == NULL) return NULL;
-
-	g_file_get_contents(filename, &data, NULL, NULL);
-
+	GError *error = NULL;
+	
+	g_return_val_if_fail((filename != NULL), NULL);	
+	g_return_val_if_fail(g_file_get_contents(filename, &data, NULL, NULL), NULL);
+	
 	if (data != NULL)
 	{
+		g_warning("Content eingelesen: \n %s", data);
 		result = g_strsplit_set(data, "\r\n", -1);
+		g_free(data);
+		return result;
 	}
-
-	g_free(data);
-
-	return result;
+	return NULL;
 }
 
 void glatex_usepackage(const gchar *pkg, const gchar *options)

Modified: trunk/geanylatex/src/reftex.h
===================================================================
--- trunk/geanylatex/src/reftex.h	2010-10-30 14:04:49 UTC (rev 1692)
+++ trunk/geanylatex/src/reftex.h	2010-10-30 20:12:07 UTC (rev 1693)
@@ -24,12 +24,6 @@
 
 #include "geanylatex.h"
 
-typedef struct
-{
-	gchar *label_name;
-	gint page;
-	gchar *chapter;
-} LaTeXLabel;
 
 void glatex_add_Labels(GtkWidget *combobox, GSList *dir);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list