diff options
Diffstat (limited to 'biblio/bibtex/utils/xbibfile/listword.c')
-rw-r--r-- | biblio/bibtex/utils/xbibfile/listword.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/biblio/bibtex/utils/xbibfile/listword.c b/biblio/bibtex/utils/xbibfile/listword.c new file mode 100644 index 0000000000..e5fb87583a --- /dev/null +++ b/biblio/bibtex/utils/xbibfile/listword.c @@ -0,0 +1,239 @@ +/* This file is a part of XBibFile - a system for handling BibTeX references + * + * Author: Ross Maloney + * Date: January 2002 + * + */ + +#include <stdio.h> +#include <string.h> +#include <gtk/gtk.h> + + +GtkWidget *searchlabel, *searchword; +GtkWidget *text, *textblock, *scrollblock; +GtkWidget *summary; +GtkTextBuffer *textpad; +GtkTextIter iter; + +char holder[200], temp[200], report[30], seek[100]; +char type[20], tag[30], title[100]; + +void word(GtkWidget *widget) +{ + GtkTooltips *tooltips; + GtkWidget *window, *panel, *description, *selector, *controls; + GtkWidget *key0, *key1, *key3; + + extern void close_window(GtkWidget *); /* defined in file cleanup.c */ + void put_text_inplace(); + + tooltips = gtk_tooltips_new(); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), "XBibFile inspect"); + gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE); + gtk_window_set_default_size(GTK_WINDOW(window), 500, 510); + panel = gtk_vbox_new(FALSE, 0); + gtk_container_add(GTK_CONTAINER(window), panel); + description = gtk_label_new("References found in the database containing search word"); + gtk_box_pack_start(GTK_BOX(panel), description, FALSE, TRUE, 10); + selector = gtk_hbox_new(FALSE, 0); + searchlabel = gtk_label_new("Word to find:"); + gtk_box_pack_start(GTK_BOX(selector), searchlabel, FALSE, TRUE, 10); + searchword = gtk_entry_new_with_max_length(100); + gtk_box_pack_start(GTK_BOX(selector), searchword, FALSE, TRUE, 10); + g_signal_connect(GTK_OBJECT(searchword), "activate", + G_CALLBACK(put_text_inplace), NULL); + key3 = gtk_button_new_with_label("Execute"); + gtk_widget_set_usize(GTK_WIDGET(key3), 90, -1); + g_signal_connect(GTK_OBJECT(key3), "clicked", + G_CALLBACK(put_text_inplace), NULL); + gtk_tooltips_set_tip(tooltips, key3, + "Execute search with this new word", NULL); + gtk_box_pack_end(GTK_BOX(selector), key3, FALSE, FALSE, 10); + gtk_box_pack_start(GTK_BOX(panel), selector, FALSE, TRUE, 10); + + /* create the text display part of the window */ + textblock = gtk_scrolled_window_new(NULL, NULL); + textpad = gtk_text_buffer_new(NULL); + text = gtk_text_view_new_with_buffer(textpad); + gtk_container_add(GTK_CONTAINER(textblock), text); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(textblock), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_box_pack_start_defaults(GTK_BOX(panel), textblock); + + /* put the window control buttons in place */ + controls = gtk_hbox_new(FALSE, 0); + key0 = gtk_button_new_with_label("CANCEL"); + gtk_widget_set_usize(GTK_WIDGET(key0), 90, -1); + g_signal_connect(GTK_OBJECT(key0), "clicked", + G_CALLBACK(close_window), NULL); + gtk_tooltips_set_tip(tooltips, key0, + "Finish this reference probe", NULL); + gtk_box_pack_end(GTK_BOX(controls), key0, FALSE, FALSE, 10); + /* and put the summary line in place */ + summary = gtk_entry_new(); + gtk_editable_set_editable(GTK_EDITABLE(summary), FALSE); + gtk_widget_set_usize(GTK_WIDGET(summary), 150, 20); + gtk_box_pack_start(GTK_BOX(controls), summary, FALSE, FALSE, 10); + gtk_box_pack_end(GTK_BOX(panel), controls, FALSE, TRUE, 10); + + /* now put the 'style' for the text output */ + gtk_text_buffer_create_tag(textpad, "blackface", + "foreground", "black", NULL); + gtk_text_buffer_create_tag(textpad, "emphasis", + "foreground", "red", NULL); + gtk_text_buffer_create_tag(textpad, "target", + "foreground", "green", NULL); + gtk_text_buffer_create_tag(textpad, "point", + "size", 11 * PANGO_SCALE, NULL); + gtk_text_buffer_create_tag(textpad, "font", + "style", PANGO_STYLE_NORMAL, NULL); + + /* put the composite window on the screen */ + gtk_widget_show_all(window); +} + + + +/* This procedure performs the searching of the BibTeX database and returns + * its results to the text window created in the procedure word() above + */ + +void put_text_inplace(GtkWidget *widget) +{ + int i, count, start_flag, print_flag, length; + char *start, *end; + + extern void error(); /* defined in file error.c */ + extern FILE *refFile; /* defined in xbibfile.c */ + + strcpy(seek, gtk_entry_get_text(GTK_ENTRY(searchword))); + + i = 0; + count = 0; + rewind(refFile); + gtk_text_buffer_get_iter_at_offset(textpad, &iter, 0); + while ( ( holder[i] = getc(refFile) ) != EOF ) { + if ( holder[i] == '\n' ) { + holder[i+1] = '\0'; + i = 0; + if ( holder[0] == '@' ) { + start_flag = 0; + print_flag = 0; + if ( strstr( holder, "ARTICLE") ) + strcpy(temp, "Article "); + if ( strstr( holder, "BOOK") ) + strcpy(temp, "Book "); + if ( strstr( holder, "BOOKLET") ) + strcpy(temp, "Booklet "); + if ( strstr( holder, "CONFERENCE") ) + strcpy(temp, "Conference "); + if ( strstr( holder, "INBOOK") ) + strcpy(temp, "inBook "); + if ( strstr( holder, "INCOLLECTION") ) + strcpy(temp, "Incollection "); + if ( strstr( holder, "INPROCEEDINGS") ) + strcpy(temp, "inProceedings "); + if ( strstr( holder, "MANUAL") ) + strcpy(temp, "Manual "); + if ( strstr( holder, "MASTERSTHESIS") ) + strcpy(temp, "Masters "); + if ( strstr( holder, "MISC") ) + strcpy(temp, "Misc "); + if ( strstr( holder, "PHDTHESIS") ) + strcpy(temp, "PhD Thesis "); + if ( strstr( holder, "PROCEEDINGS") ) + strcpy(temp, "Proceedings "); + if ( strstr( holder, "TECHREPORT") ) + strcpy(temp, "Tech Rerort "); + if ( strstr( holder, "UNPUBLISHED") ) + strcpy(temp, "Unpublished "); + strcpy(type, temp); + if ( start = strstr( holder, "{" ) ) + if ( end = strstr( holder, "," ) ) { + *end = ' '; + end++; + *end = ' '; + end++; + *end = '\0'; + strcpy(tag, start+1); + } + else { + error(widget, GINT_TO_POINTER(9)); + g_print("Format error in this BibTeX file - no ending ,"); + } + else { + error(widget, GINT_TO_POINTER(9)); + g_print("Format error in this BibTeX file - no {"); + } + } + /* if the line starts with 'title = {' */ + if ( start = strstr( holder, " title = {" ) ) + if ( end = strstr( holder, "}," ) ) { + if ( (end - start) > 60 ) + end = start + 60; + *end = '\n'; + end++; + *end = '\0'; + start += 11; + strcpy(title, start); + } + else { + error(widget, GINT_TO_POINTER(9)); + g_print("Format error in this BibTeX file - no ending ,}"); + } + /* if the line starts with 'annote = {' */ + strcpy(temp, holder); + if ( start = strstr(temp, " annote = {") ) { + start_flag = 1; + strcpy(temp, start+12); + } + /* if the line contains the terminator '} }' */ + if ( start_flag ) { + if ( start = strstr(temp, seek) ) { + if ( !print_flag ) { + gtk_text_buffer_insert_with_tags_by_name(textpad, &iter, + type, -1, + "blackface", "point", "font", NULL); + gtk_text_buffer_insert_with_tags_by_name(textpad, &iter, + tag, -1, + "emphasis", "point", "font", NULL); + gtk_text_buffer_insert_with_tags_by_name(textpad, &iter, + title, -1, + "blackface", "point", "font", NULL); + print_flag = 1; + count++; + } + *start = '\0'; + gtk_text_buffer_insert_with_tags_by_name(textpad, &iter, + " ", -1, + "blackface", "point", "font", NULL); + gtk_text_buffer_insert_with_tags_by_name(textpad, &iter, + temp, -1, + "blackface", "point", "font", NULL); + gtk_text_buffer_insert_with_tags_by_name(textpad, &iter, + seek, -1, + "target", "point", "font", NULL); + length = strlen(seek); + start += length; + if ( end = strstr(start, "} }") ) { + *end = '\0'; + end++; + *end = '\n'; + start_flag = 0; + } + gtk_text_buffer_insert_with_tags_by_name(textpad, &iter, + start, -1, + "blackface", "point", "font", NULL); + } + } + } + else + i++; + } + sprintf(report, "%d references displayed", count); + gtk_entry_set_text(GTK_ENTRY(summary), report); +} |