/* NIGHTFALL Light Curve Synthesis Program */ /* Copyright (C) 1998 Rainer Wichmann */ /* */ /* This program is free software; you can redistribute it */ /* and/or modify */ /* it under the terms of the GNU General Public License as */ /* published by */ /* the Free Software Foundation; either version 2 of the License, or */ /* (at your option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ /* GNU General Public License for more details. */ /* */ /* You should have received a copy of the GNU General Public License */ /* along with this program; if not, write to the Free Software */ /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include "Light.h" #ifdef _WITH_GTK static GtkWidget *help_window; /* the help window */ static GtkWidget *help_text; /* the help text */ #ifdef USING_GTK2 static GtkTextBuffer *help_gbuffer; static GtkWidget *help_scroll; #endif static int HelpIsOn = OFF; /* flag help open */ static char my_full_helpfile[1024] = "\0";/* helpfile path */ static char my_helpfile[9][16] = { /* helpfile names */ "help0.txt", "help1.txt", "help2.txt", "help3.txt", "help4.txt", "help5.txt", "help6.txt", "help7.txt", "help8.txt" /* disk */ }; /****************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.0 @short Close help viewer @param (GtkWidget) *widget Discarded @param (gpointer) *fs The window to destroy @return (void) @heading Graphical User Interface *******************************************************************/ void close_help( GtkWidget *widget, gpointer fs ) { HelpIsOn = OFF; gtk_widget_destroy (GTK_WIDGET (fs)); return; } /****************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.0 @short Delete current text in viewer @param (void) @return (void) @heading Graphical User Interface *******************************************************************/ void delete_help( ) { #ifdef USING_GTK2 gtk_text_buffer_set_text (help_gbuffer, "\n", 1); #else /* Freeze the text widget, ready for multiple updates */ gtk_text_freeze (GTK_TEXT (help_text)); /* delete everything */ gtk_text_backward_delete(GTK_TEXT (help_text), gtk_text_get_length( GTK_TEXT (help_text))); /* Thaw the text widget, allowing the updates to become visible */ gtk_text_thaw (GTK_TEXT (help_text)); #endif return; } /****************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.1 @short Write the help text @tip Adds a random adage using the 'fortune' program @param (FILE) *inFile The help file @return (void) @heading Graphical User Interface *******************************************************************/ void WriteHelpText(FILE *inFile) { #ifdef HAVE_FORTUNE FILE *wits; /* the filehandler for fortune */ char witty[256]; /* the returned fortune */ register int i; /* loop variable */ #endif #ifdef USING_GTK2 GtkTextIter iter; gsize len; gchar * conv; #else GdkFont *fixed_font; /* the fixed font */ GdkFont *bold_font; /* the bold font */ GdkFont *normal_font; /* the normal font */ GdkFont *italic_font; /* the italic font */ #endif int italic = OFF; /* the italic flag */ int bold = OFF; /* the bold flag */ int fixed = OFF; /* the fixed flag */ char inStrg[2]; /* the string to put in viewer */ int c; /* for fgetc */ /* ------ Freeze the text widget, ready for multiple updates -- */ #ifdef USING_GTK2 gtk_text_buffer_get_iter_at_offset(help_gbuffer, &iter, 0); #else gtk_text_freeze (GTK_TEXT (help_text)); /* Load fonts */ fixed_font = gdk_font_load ("-misc-fixed-medium-r-*-*-*-120-*-*-*-*-*-*"); bold_font = gdk_font_load ("*-new century schoolbook-bold-r-normal--*-120-*-*-*-*-*-*"); italic_font = gdk_font_load ("*-new century schoolbook-bold-i-normal--*-120-*-*-*-*-*-*"); normal_font = gdk_font_load ("*-new century schoolbook-medium-r-normal--*-120-*-*-*-*-*-*"); #endif /* ---------------- parse help file --------------------------- */ inStrg[1] = '\0'; while (1) { c = fgetc (inFile); /* End of file, we are done */ if (c == EOF) break; inStrg[0] = (char) c; /* not special, print */ if (inStrg[0] != '<' && inStrg[0] != '[' && inStrg[0] != '{') { if (inStrg[0] == '#') inStrg[0] = ' '; #ifdef USING_GTK2 conv = g_convert (inStrg, 1, "UTF-8", "ISO-8859-1", NULL, &len, NULL); gtk_text_buffer_insert (help_gbuffer, &iter, conv, len); g_free(conv); #else gtk_text_insert (GTK_TEXT (help_text), normal_font, &help_text->style->black, NULL, inStrg, -1); #endif continue; } /* special, set flag */ if (inStrg[0] == '<') italic = ON; if (inStrg[0] == '{') fixed = ON; if (inStrg[0] == '[') bold = ON; /* tagged word - italic */ while (c != EOF && italic == ON) { c = fgetc (inFile); inStrg[0] = (char) c; if (inStrg[0] == '>') italic = OFF; if (inStrg[0] == '#') inStrg[0] = ' '; if (italic == ON) { #ifdef USING_GTK2 conv = g_convert (inStrg, 1, "UTF-8", "ISO-8859-1", NULL, &len, NULL); gtk_text_buffer_insert_with_tags_by_name (help_gbuffer, &iter, conv, len, "italic", NULL); g_free(conv); #else gtk_text_insert (GTK_TEXT (help_text), italic_font, &help_text->style->black, NULL, inStrg, -1); #endif } } /* tagged word - bold */ while (c != EOF && bold == ON) { c = fgetc (inFile); inStrg[0] = (char) c; if (inStrg[0] == ']') bold = OFF; if (inStrg[0] == '#') inStrg[0] = ' '; if (bold == ON) { #ifdef USING_GTK2 conv = g_convert (inStrg, 1, "UTF-8", "ISO-8859-1", NULL, &len, NULL); gtk_text_buffer_insert_with_tags_by_name (help_gbuffer, &iter, conv, len, "bold", NULL); g_free(conv); #else gtk_text_insert (GTK_TEXT (help_text), bold_font, &help_text->style->black, NULL, inStrg, -1); #endif } } /* tagged word - fixed */ while (c != EOF && fixed == ON) { c = fgetc (inFile); inStrg[0] = (char) c; if (inStrg[0] == '}') fixed = OFF; if (inStrg[0] == '#') inStrg[0] = ' '; if (fixed == ON) { #ifdef USING_GTK2 conv = g_convert (inStrg, 1, "UTF-8", "ISO-8859-1", NULL, &len, NULL); gtk_text_buffer_insert_with_tags_by_name (help_gbuffer, &iter, conv, len, "fixed", NULL); g_free(conv); #else gtk_text_insert (GTK_TEXT (help_text), fixed_font, &help_text->style->black, NULL, inStrg, -1); #endif } } } /* ---------------- end parse help file ----------------------- */ /* fclose(inFile); */ #ifdef HAVE_FORTUNE /* ---------------- add some wits ----------------------------- */ sprintf(witty, "( %s ) 2>&1", "fortune -s | fold -w 64 -s"); if ((wits = popen (witty, "r")) == NULL) { WARNING (_("No witty epigrams")); } else { inStrg[1] = '\0'; inStrg[0] = '-'; for (i = 1; i < 50; ++i) { #ifdef USING_GTK2 gtk_text_buffer_insert_with_tags_by_name (help_gbuffer, &iter, inStrg, -1, "italic", NULL); /* gtk_text_buffer_insert (help_gbuffer, &iter, inStrg, -1); */ #else gtk_text_insert (GTK_TEXT (help_text), italic_font, &help_text->style->black, NULL, inStrg, -1); #endif } inStrg[0] = '\n'; #ifdef USING_GTK2 gtk_text_buffer_insert_with_tags_by_name (help_gbuffer, &iter, inStrg, -1, "italic", NULL); /* gtk_text_buffer_insert (help_gbuffer, &iter, inStrg, -1); */ #else gtk_text_insert (GTK_TEXT (help_text), italic_font, &help_text->style->black, NULL, inStrg, -1); #endif while (1) { c = fgetc (inFile); /* End of file, we are done */ if (c == EOF) break; inStrg[0] = (char) c; #ifdef USING_GTK2 gtk_text_buffer_insert_with_tags_by_name (help_gbuffer, &iter, inStrg, -1, "italic", NULL); /* gtk_text_buffer_insert (help_gbuffer, &iter, inStrg, -1); */ #else gtk_text_insert (GTK_TEXT (help_text), italic_font, &help_text->style->black, NULL, inStrg, -1); #endif continue; } } pclose(wits); #endif /* Thaw the text widget, allowing the updates to become visible */ #ifndef USING_GTK2 gtk_text_thaw (GTK_TEXT (help_text)); #endif return; } /****************************************************************** @package nightfall @author Rainer Wichmann @version 1.0 @short Supply alias for locales @param (void) @return (static const char) *alias_locale @heading Graphical User Interface *******************************************************************/ const char *alias_locale (const char *str) { if (strncmp(str, "de", 2) == 0) return "de"; else if (strncmp(str, "german", 6) == 0) return "de"; else if (strncmp(str, "it", 2) == 0) return "it"; else return str; } /****************************************************************** @package nightfall @author Rainer Wichmann @version 1.0 @short Guess value of current locale from environment variables @param (void) @return (static const char) *guess_locale @heading Graphical User Interface *******************************************************************/ const char *guess_the_locale () { #ifdef ENABLE_NLS const char *the_locale; /* highest priority value is the `LANGUAGE' environment */ /* variable. This is a GNU extension. */ the_locale = getenv ("LANGUAGE"); if (the_locale != NULL && the_locale[0] != '\0') return alias_locale (the_locale); /* Setting of LC_ALL overwrites all other. */ the_locale = getenv ("LC_ALL"); if (the_locale != NULL && the_locale[0] != '\0') return alias_locale (the_locale); /* next comes LC_MESSAGES */ the_locale = getenv ("LC_MESSAGES"); if (the_locale != NULL && the_locale[0] != '\0') return alias_locale (the_locale); /* Last possibility is the LANG environment variable. */ the_locale = getenv ("LANG"); if (the_locale != NULL && the_locale[0] != '\0') return alias_locale (the_locale); #endif /* default is C */ return "C"; } /****************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.0 @short Replace current help text @param (GtkWidget) *widget Discarded @param (gpointer) *data Number of help file @return (void) @heading Graphical User Interface *******************************************************************/ void HelpNew (GtkWidget *widget, gpointer *data) { FILE *inFile; /* filehandle for help file */ int i; /* Number of help file */ /* --- search helpfile, first in DATAFLS, then in current dir */ sscanf ((char *) data, "%d", &i); /* 17 = helpxx.txt + '/doc//' + '\0' */ /* priority for DATAFLS directory */ strncpy(my_full_helpfile, data_doc_fls(), ( sizeof(my_full_helpfile) - (17 + strlen( guess_the_locale()) ) ) ); /* strcat(my_full_helpfile, "/doc/"); */ strcat(my_full_helpfile, "/"); strcat(my_full_helpfile, guess_the_locale() ); strcat(my_full_helpfile, "/"); strcat(my_full_helpfile, my_helpfile[i]); /* next try current directory/doc */ if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { my_full_helpfile[0] = '.'; my_full_helpfile[1] = '\0'; strcat(my_full_helpfile, "/doc/"); strcat(my_full_helpfile, guess_the_locale() ); strcat(my_full_helpfile, "/"); strcat(my_full_helpfile, my_helpfile[i]); /* not found -> error message */ if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { /* wrong language ? try default */ if (strcmp("C", guess_the_locale() ) != 0) { strncpy(my_full_helpfile, data_doc_fls(), ( sizeof(my_full_helpfile) - (17 + strlen( guess_the_locale()) ) ) ); strcat(my_full_helpfile, "/C/"); strcat(my_full_helpfile, my_helpfile[i]); } /* not found -> error message */ if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { strcpy(my_full_helpfile, "./doc/C/"); strcat(my_full_helpfile, my_helpfile[i]); if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { make_dialog (_(errmsg[11])); return; } } } } delete_help(); WriteHelpText(inFile); fclose(inFile); return; } /****************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.0 @short Callback function for Help/Context button @param (GtkWidget) *widget Discarded @param (gpointer) *data Number of help file @return (void) @heading Graphical User Interface *******************************************************************/ void help_event (GtkWidget *widget, gpointer *data) { GtkWidget *hbox; GtkWidget *vbox; GtkWidget *button; GtkWidget *table; #ifndef USING_GTK2 GtkWidget *vscrollbar; #endif FILE *inFile; /* filehandle for help file */ int page = 0; /* number of help file */ char topage[3]; /* the page */ /* ------- which helpfile to display ----------------------- */ if ( data == NULL) { page = gtk_notebook_get_current_page( GTK_NOTEBOOK(notebook) ); page = page + 1; if (page < 0) page = 0; if (page < 100) sprintf(topage, "%2d", page); else sprintf(topage, "%2d", 0); } else { sscanf((char *) data, "%d", &page); } /* ------- check whether already open ---------------------- */ if (HelpIsOn == ON) { if (data != NULL) HelpNew (NULL, (gpointer) data); else HelpNew (NULL, (gpointer) topage); return; } /* --- search helpfile, first in DATAFLS, then in current dir */ /* 19 = helpxx.txt + '/doc/nn/' + '\0' */ /* priority for DATAFLS directory */ strncpy(my_full_helpfile, data_doc_fls(), ( sizeof(my_full_helpfile) - (17 + strlen( guess_the_locale()) ) ) ); /* strcat(my_full_helpfile, "/doc/"); */ strcat(my_full_helpfile, "/"); strcat(my_full_helpfile, guess_the_locale() ); strcat(my_full_helpfile, "/"); strcat(my_full_helpfile, my_helpfile[page]); /* next try current directory/doc */ if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { my_full_helpfile[0] = '.'; my_full_helpfile[1] = '\0'; strcat(my_full_helpfile, "/doc/"); strcat(my_full_helpfile, guess_the_locale() ); strcat(my_full_helpfile, "/"); strcat(my_full_helpfile, my_helpfile[page]); /* not found */ if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { /* wrong language ? try default */ if (strcmp("C", guess_the_locale() ) != 0) { strncpy(my_full_helpfile, data_doc_fls(), ( sizeof(my_full_helpfile) - (17 + strlen( guess_the_locale()) ) ) ); strcat(my_full_helpfile, "/C/"); strcat(my_full_helpfile, my_helpfile[page]); } /* not found -> error message */ if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { strcpy(my_full_helpfile, "./doc/C/"); strcat(my_full_helpfile, my_helpfile[page]); if ((inFile = fopen (my_full_helpfile, "r")) == NULL) { make_dialog (_(errmsg[11])); return; } } } } /* ----------- open help viewer ----------------------------- */ help_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize (help_window, 580, 500); gtk_window_set_policy (GTK_WINDOW(help_window), TRUE, TRUE, FALSE); gtk_signal_connect (GTK_OBJECT (help_window), "destroy", (GtkSignalFunc) close_help, GTK_WIDGET (help_window)); gtk_window_set_title (GTK_WINDOW (help_window), _("Help")); gtk_container_set_border_width (GTK_CONTAINER (help_window), 0); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (help_window), vbox); gtk_widget_show (vbox); table = gtk_table_new (16, 5, TRUE); gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0); gtk_widget_show (table); hbox = gtk_hbox_new (FALSE, 0); gtk_table_attach (GTK_TABLE(table), hbox, 0, 4, 0, 16, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 2); gtk_widget_show (hbox); /* --------- Create the GtkText widget ---------------------- */ #ifdef USING_GTK2 help_gbuffer = gtk_text_buffer_new(NULL); help_text = gtk_text_view_new_with_buffer (help_gbuffer); /* Create tags associated with the buffer. */ /* Tag with weight bold and tag name "bold" . */ gtk_text_buffer_create_tag (help_gbuffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL); /* Tag with style italic and tag name "italic". */ gtk_text_buffer_create_tag (help_gbuffer, "italic", "style", PANGO_STYLE_ITALIC, NULL); /* Tag with font fixed and tag name "fixed". */ gtk_text_buffer_create_tag (help_gbuffer, "fixed", "font", "fixed", NULL); help_scroll = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER(help_scroll), GTK_WIDGET(help_text)); gtk_box_pack_start (GTK_BOX (hbox), help_scroll, TRUE, TRUE, 0); gtk_widget_show (help_scroll); gtk_widget_show (help_text); #else help_text = gtk_text_new (NULL, NULL); gtk_text_set_editable (GTK_TEXT (help_text), FALSE); gtk_box_pack_start (GTK_BOX (hbox), help_text, TRUE, TRUE, 0); gtk_widget_show (help_text); /* ------- Add a vertical scrollbar to the GtkText widget ----- */ vscrollbar = gtk_vscrollbar_new (GTK_TEXT (help_text)->vadj); gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0); gtk_widget_show (vscrollbar); #endif /* ----------- create buttons and add ------------------------- */ button = gtk_button_new_with_label (_("Menu Bar")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "0"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 0, 1, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Basic")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "1"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 1, 2, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Disk")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "8"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 2, 3, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Advanced")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "2"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 3, 4, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Plot Options")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "3"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 4, 5, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Data Fitting")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "4"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 5, 6, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Spots Primary")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "5"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 6, 7, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Spots Secondary")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "6"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 7, 8, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); button = gtk_button_new_with_label (_("Third Light")); gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (HelpNew), (gpointer) "7"); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 8, 9, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 2, 0); gtk_widget_show (button); #ifdef USING_GTK2 button = gtk_button_new_from_stock(GTK_STOCK_OK); #else button = gtk_button_new_with_label (_("Close")); #endif gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) close_help, GTK_WIDGET (help_window)); gtk_table_attach (GTK_TABLE(table), button, 4, 5, 10, 12, GTK_FILL|GTK_EXPAND, GTK_FILL|GTK_EXPAND, 8, 8); (GTK_WIDGET_FLAGS (button) |= (GTK_CAN_DEFAULT)); gtk_widget_grab_default (button); gtk_widget_show (button); /* -------- Realizing the widget to insert some text ---------- */ #ifndef USING_GTK2 gtk_widget_realize (help_text); #endif /* ------------------- set flag ----------------------------- */ HelpIsOn = ON; /* ------------------- insert text ---------------------------- */ WriteHelpText(inFile); fclose(inFile); /* ------------- and show it ---------------------------------- */ gtk_widget_show (help_window); return; } #endif