/* 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 HAVE_UNISTD_H #include #endif #ifdef _WITH_GTK /**************************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.0 @short Destroy data sheet @param (GtkWidget) *widget Discarded @param (gpointer) *fs Widget to destroy @return (void) @heading Data display ****************************************************************************/ void close_data( GtkWidget *widget, gpointer *fs ) { gtk_widget_destroy (GTK_WIDGET (fs)); } /**************************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.0 @short Hardcopy data sheet @param (GtkWidget) *widget Discarded @param (gpointer) *fs Discarded @return (void) @heading Data display ****************************************************************************/ void hard_data( GtkWidget *widget, gpointer *fs ) { #ifdef HAVE_A2PS FILE *pipe_out; char command[512]; char title[32]; strncpy(title, Orbit.Name, sizeof(title)-1); command[0] = '\0'; sprintf(command, "cat - | sed -e 's@<@ @g' | sed -e 's@>@ @g' | sed -e 's@#@ @g' | a2ps --output=- -1 --portrait --quiet --center-title=%c%s%c > NightfallData.ps", 34, title, 34); /* sprintf(command, "cat - > NightfallData.ps"); */ if ( (pipe_out = popen(command, "w")) != NULL) { OutfileHeader(pipe_out); if (-1 == pclose(pipe_out)) perror("pclose"); } else { perror(_("popen")); } #else WARNING(_("no postscript driver (a2ps)")); #endif return; } /**************************************************************************** @package nightfall @author Rainer Wichmann (rwichman@lsw.uni-heidelberg.de) @version 1.0 @short Show data for present binary system configuration @param (GtkWidget) *widget Discarded @param (GtkEvent) *event Discarded @param (gpointer) *data Discarded @return (void) @heading Data display ****************************************************************************/ void showdata_event (GtkWidget *widget, gpointer *data) { FILE *inFile; /* filehandler for input file */ char tmpfile[1024]; /* temporary file on disk */ char inStrg[8]; /* read from file, put in widget */ int ErrCode; /* exit status */ int c; /* for fgetc */ GtkWidget *showdata_window; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *separator; GtkWidget *button; GtkWidget *text; #ifdef USING_GTK2 GtkTextBuffer *tgbuffer; GtkWidget *scroll; GtkTextIter iter; #else GtkWidget *vscrollbar; GdkColormap *cmap; GdkColor colour; GdkFont *fixed_font; #endif if (getenv("TEMPDIR") != NULL) strncpy(tmpfile, getenv("TEMPDIR"), 960); else if (getenv("TMPDIR") != NULL) strncpy(tmpfile, getenv("TMPDIR"), 960); else strcpy(tmpfile, "/tmp"); sprintf(tmpfile + strlen(tmpfile), "/nightfall.data"); /* >>>>>>>>>>>>>>>>> define geometry <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ /* -------- validate input data --------------------- */ check_data(); /* elliptic orbit */ if (Flags.elliptic == ON) { FindPeriastron(); Orbit.Dist = 1.0; } if (Flags.fill == OFF) { /* THE PRIMARY */ ErrCode = DefineParam(Primary); /* THE SECONDARY */ DefineParam(Secondary); } else { /* Overcontact system */ ErrCode = DefineParamOver(); } if (ErrCode > 0) { make_dialog (_(errmsg[12])); return; } LightSetupTests(); /* >>>>>>>>>>>>>>>>>>>>>>>>>> open tmp file <<<<<<<<<<<<<<<<<<<<<<<<<< */ #ifdef HAVE_UNISTD_H sprintf(tmpfile + strlen(tmpfile), ".%d", getpid() ); #endif if ((inFile = fopen (tmpfile, "w+")) == NULL) { make_dialog (_(errmsg[13])); return; } OutfileHeader(inFile); /* >>>>>>>>>>>>>>>>>>> read tmp file <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ /* rewind file */ (void) fseek(inFile, 0L, SEEK_SET); showdata_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize (showdata_window, 640, 500); gtk_window_set_policy (GTK_WINDOW(showdata_window), TRUE, TRUE, FALSE); gtk_signal_connect (GTK_OBJECT (showdata_window), "destroy", (GtkSignalFunc) close_data, GTK_WIDGET (showdata_window)); gtk_window_set_title (GTK_WINDOW (showdata_window), _("Data Sheet") ); gtk_container_set_border_width (GTK_CONTAINER (showdata_window), 0); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (showdata_window), vbox); gtk_widget_show (vbox); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); gtk_widget_show (hbox); /* Create the GtkText widget */ #ifdef USING_GTK2 tgbuffer = gtk_text_buffer_new(NULL); text = gtk_text_view_new_with_buffer (tgbuffer); /* Create tags associated with the buffer. */ /* Tag with font fixed and tag name "fixed". */ gtk_text_buffer_create_tag (tgbuffer, "fixed", "font", "fixed", NULL); /* Tag with font fixed and tag name "fixed". */ gtk_text_buffer_create_tag (tgbuffer, "red", "foreground", "red", NULL); scroll = gtk_scrolled_window_new (NULL, NULL); gtk_container_add (GTK_CONTAINER(scroll), GTK_WIDGET(text)); gtk_box_pack_start (GTK_BOX (hbox), scroll, TRUE, TRUE, 0); gtk_widget_show (scroll); gtk_widget_show (text); gtk_text_buffer_get_iter_at_offset(tgbuffer, &iter, 0); #else text = gtk_text_new (NULL, NULL); gtk_text_set_editable (GTK_TEXT (text), FALSE); gtk_box_pack_start (GTK_BOX (hbox), text, TRUE, TRUE, 0); gtk_widget_show (text); /* Add a vertical scrollbar to the GtkText widget */ vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj); gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, FALSE, 0); gtk_widget_show (vscrollbar); /* Realizing a widget creates a window for it, ready to insert some text */ gtk_widget_realize (text); /* Freeze the text widget, ready for multiple updates */ gtk_text_freeze (GTK_TEXT (text)); /* Load a fixed font */ fixed_font = gdk_font_load ("-*-fixed-*-r-*-*-*-140-*-*-*-*-iso8859-1"); if (!fixed_font) { WARNING (_("Could not load font -*-fixed-*-r-*-*-*-140-*-*-*-*-iso8859-1")); } /* Get the system colour map and allocate the colour red */ cmap = gdk_colormap_get_system(); colour.red = 0xffff; colour.green = 0; colour.blue = 0; if (!gdk_color_alloc(cmap, &colour)) { WARNING (_("Could not allocate colour")); } #endif /* >>>>>>>>>>>>>>>>>>> parse tmp file <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ inStrg[1] = '\0'; inStrg[2] = '\0'; inStrg[3] = '\0'; inStrg[4] = '\0'; while (1) { c = fgetc (inFile); /* End of file, we are done */ if (c == EOF) break; inStrg[1] = '\0'; inStrg[2] = '\0'; inStrg[3] = '\0'; inStrg[0] = (char) c; #ifdef USING_GTK2 if (!g_ascii_isgraph(c) && !g_ascii_isspace(c)) { c = fgetc (inFile); if (c == EOF) break; inStrg[1] = (char) c; if (!g_ascii_isgraph(c) && !g_ascii_isspace(c)) { c = fgetc (inFile); if (c == EOF) break; inStrg[2] = (char) c; if (!g_ascii_isgraph(c) && !g_ascii_isspace(c)) { c = fgetc (inFile); if (c == EOF) break; inStrg[3] = (char) c; } } } #endif /* not special, print */ if (inStrg[0] != '<') { if (inStrg[0] == '#') inStrg[0] = ' '; #ifdef USING_GTK2 gtk_text_buffer_insert_with_tags_by_name (tgbuffer, &iter, inStrg, -1, "fixed", NULL); #else gtk_text_insert (GTK_TEXT (text), fixed_font, &text->style->black, NULL, inStrg, 1); #endif continue; } /* tagged word */ while (c != EOF) { c = fgetc (inFile); inStrg[1] = '\0'; inStrg[2] = '\0'; inStrg[3] = '\0'; inStrg[0] = (char) c; if (inStrg[0] == '>') break; if (inStrg[0] == '#') inStrg[0] = ' '; #ifdef USING_GTK2 if (!g_ascii_isgraph(c) && !g_ascii_isspace(c)) { c = fgetc (inFile); if (c == EOF) break; inStrg[1] = (char) c; if (!g_ascii_isgraph(c) && !g_ascii_isspace(c)) { c = fgetc (inFile); if (c == EOF) break; inStrg[2] = (char) c; if (!g_ascii_isgraph(c) && !g_ascii_isspace(c)) { c = fgetc (inFile); if (c == EOF) break; inStrg[3] = (char) c; } } } gtk_text_buffer_insert_with_tags_by_name (tgbuffer, &iter, inStrg, -1, "fixed", "red", NULL); #else gtk_text_insert (GTK_TEXT (text), fixed_font, &colour, NULL, inStrg, 1); #endif } } /* >>>>>>>>>>>>>>>>>>> end parse file <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ fclose(inFile); remove(tmpfile); /* Thaw the text widget, allowing the updates to become visible */ #ifndef USING_GTK2 gtk_text_thaw (GTK_TEXT (text)); #endif separator = gtk_hseparator_new (); gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0); gtk_widget_show (separator); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0); gtk_widget_show (hbox); #ifdef HAVE_A2PS #ifdef USING_GTK2 button = gtk_button_new_with_label (_("Postscript") ); gtk_button_set_image (GTK_BUTTON(button), gtk_image_new_from_stock (GTK_STOCK_PRINT, GTK_ICON_SIZE_SMALL_TOOLBAR) ); #else button = gtk_button_new_with_label (_("Postscript")); #endif gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) hard_data, GTK_WIDGET (showdata_window)); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5); (GTK_WIDGET_FLAGS (button) |= (GTK_CAN_DEFAULT)); gtk_widget_grab_default (button); gtk_widget_show (button); #endif #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_data, GTK_WIDGET (showdata_window)); gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0); (GTK_WIDGET_FLAGS (button) |= (GTK_CAN_DEFAULT)); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show (showdata_window); } #endif