PIPS
gtk_log.c
Go to the documentation of this file.
1 /*
2 
3  $Id: gtk_log.c 23065 2016-03-02 09:05:50Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <stdarg.h>
31 #include <errno.h>
32 
33 #include <sys/time.h>
34 #include <sys/resource.h>
35 
36 /* xview/newgen interaction
37  */
38 #if (defined(TEXT))
39 #undef TEXT
40 #endif
41 
42 #if (defined(TEXT_TYPE))
43 #undef TEXT_TYPE
44 #endif
45 
46 #include "genC.h"
47 #include "misc.h"
48 #include "linear.h"
49 #include "ri.h"
50 #include "ri-util.h"
51 #include "database.h"
52 #include "pipsdbm.h"
53 #include "top-level.h"
54 
55 #include "properties.h"
56 
57 #undef test_undefined // also defined in glib included from gtk
58 #include <gtk/gtk.h>
59 
60 #include "gpips.h"
61 
62 static GtkWidget *log_text_view;
64 static GtkWidget *scrolled_window_vadjustment;
65 
66 void prompt_user(string a_printf_format, ...) {
67  va_list some_arguments;
68  static char message_buffer[SMALL_BUFFER_LENGTH];
69 
70  va_start(some_arguments, a_printf_format);
71 
72  (void) vsprintf(message_buffer, a_printf_format, some_arguments);
73 
74  GtkWidget * dialog = gtk_message_dialog_new(GTK_WINDOW(log_window),
75  GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
76  "%s", message_buffer);
77  gtk_dialog_run(GTK_DIALOG(dialog));
78  gtk_widget_destroy(dialog);
79 }
80 
81 static void insert_something_in_the_gpips_log_window(char * a_message) {
82  GtkTextIter iter;
83  GtkTextBuffer * buffer;
84 
85  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(log_text_view));
86 
87  //int new_length;
88  int message_length = strlen(a_message);
89 
90  /* insert at the end: */
91  gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(buffer), &iter);
92  gtk_text_buffer_insert(GTK_TEXT_BUFFER(buffer), &iter, a_message,
93  message_length);
94 
95  gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(log_text_view), &iter, 0.0,
96  FALSE, 0.0, 0.0);
97  gtk_adjustment_set_value(GTK_ADJUSTMENT(scrolled_window_vadjustment),
98  gpips_gtk_adjustment_get_upper(GTK_ADJUSTMENT(
100 
101  gtk_widget_set_sensitive(clear_menu_item, TRUE);
102 }
103 
104 void gpips_user_error_message(char error_buffer[]) {
105  log_on_file(error_buffer);
106 
108 
109  show_message(error_buffer);
110  gtk_widget_show(log_window);
111 
112  /* prompt_user("Something went wrong. Check the log window"); */
113 
114  /* terminate PIPS request */
115  if (get_bool_property("ABORT_ON_USER_ERROR"))
116  abort();
117 
119 
120  (void) exit(1);
121 }
122 
123 void gpips_user_warning_message(char warning_buffer[]) {
124  log_on_file(warning_buffer);
125 
127  /* François said a warning is not important enough...
128  gtk_widget_show(log_window);
129  */
130 
131  show_message(warning_buffer);
132 }
133 
134 #define MAXARGS 100
135 
136 void gpips_user_log(const char* fmt, va_list *args)
137 {
138  static char log_buffer[SMALL_BUFFER_LENGTH];
139 
140  va_list acpy;
141  va_copy(acpy, *args);
142  vsprintf(log_buffer, fmt, acpy);
143  va_end(acpy);
144 
145  log_on_file(log_buffer);
146 
147  if (get_bool_property("USER_LOG_P") == FALSE)
148  return;
149 
151  /* Display the "Message:" line in the main window */
152  show_message(log_buffer);
153 }
154 
155 void open_log_subwindow(GtkWidget * widget, gpointer data) {
157  gtk_widget_set_sensitive(close_menu_item, TRUE);
158  gtk_widget_show(log_window);
159 }
160 
161 void clear_log_subwindow(GtkWidget * widget, gpointer data) {
162  GtkTextIter start, end;
163  GtkTextBuffer * buffer;
164  buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(log_text_view));
165  gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER(buffer), &start);
166  gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(buffer), &end);
167  gtk_text_buffer_delete(GTK_TEXT_BUFFER(buffer), &start, &end);
168 
169  gtk_widget_set_sensitive(clear_menu_item, FALSE);
170 }
171 
172 void close_log_subwindow(GtkWidget * widget, gpointer data) {
174  gtk_widget_set_sensitive(close_menu_item, FALSE);
175  hide_window(log_window, NULL, NULL);
176 }
177 
179  GtkWidget * log_menu;
180  GtkWidget * log_menu_item;
181 
182  log_menu = gtk_menu_new();
183  log_menu_item = gtk_menu_item_new_with_label("Log");
184  gtk_menu_item_set_submenu(GTK_MENU_ITEM(log_menu_item), log_menu);
185 
186  open_or_front_menu_item = gtk_menu_item_new_with_label("Open");
187  g_signal_connect(G_OBJECT(open_or_front_menu_item), "activate", G_CALLBACK(
188  open_log_subwindow), NULL);
189  gtk_menu_append(GTK_MENU(log_menu), open_or_front_menu_item);
190 
191  clear_menu_item = gtk_menu_item_new_with_label("Clear");
192  g_signal_connect(G_OBJECT(clear_menu_item), "activate", G_CALLBACK(
193  clear_log_subwindow), NULL);
194  gtk_menu_append(GTK_MENU(log_menu), clear_menu_item);
195 
196  close_menu_item = gtk_menu_item_new_with_label("Close");
197  g_signal_connect(G_OBJECT(close_menu_item), "activate", G_CALLBACK(
198  close_log_subwindow), NULL);
199  gtk_menu_append(GTK_MENU(log_menu), close_menu_item);
200 
201  gtk_widget_show(log_menu_item);
202  gtk_widget_show_all(log_menu);
203  gtk_menu_bar_append(GTK_MENU_BAR(main_window_menu_bar), log_menu_item);
204 }
205 
206 /* This works but it is cleaner to use textsw_reset() instead...
207  void
208  recreate_log_window()
209  {
210  xv_destroy(log_textsw);
211  log_textsw = (Xv_Window) xv_create(log_frame, TEXTSW, 0);
212  }
213  */
214 
216  /* Xv_Window window; */
217 
218  GtkWidget * frame = gtk_frame_new("Log");
219 
220  GtkWidget * scrolled_window;
221 
222  scrolled_window = gtk_scrolled_window_new(NULL, NULL);
223  scrolled_window_vadjustment = GTK_WIDGET(gtk_scrolled_window_get_vadjustment(
224  GTK_SCROLLED_WINDOW(scrolled_window)));
225  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
226  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
227 
228  log_text_view = gtk_text_view_new();
229 
230  gtk_container_add(GTK_CONTAINER(log_window), frame);
231  gtk_container_add(GTK_CONTAINER(frame), scrolled_window);
232  gtk_container_add(GTK_CONTAINER(scrolled_window), log_text_view);
233 
234  gtk_widget_show_all(frame);
235 }
void log_on_file(const char *desc)
Definition: message.c:190
@ user_exception_error
#define THROW(what)
void show_message(char *fmt,...)
ARARGS0.
Definition: dialogue.c:46
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
static char start[1024]
The name of the variable from which to start counting domain numbers.
Definition: genLisp.c:55
#define SMALL_BUFFER_LENGTH
Definition: gpips-local.h:24
GtkWidget * log_window
Definition: gpips-local.h:36
GtkWidget * main_window_menu_bar
Definition: gpips.c:62
void clear_log_subwindow(GtkWidget *widget, gpointer data)
Definition: gtk_log.c:161
static void insert_something_in_the_gpips_log_window(char *a_message)
Definition: gtk_log.c:81
static GtkWidget * close_menu_item
Definition: gtk_log.c:63
void open_log_subwindow(GtkWidget *widget, gpointer data)
Definition: gtk_log.c:155
void gpips_user_error_message(char error_buffer[])
Definition: gtk_log.c:104
void close_log_subwindow(GtkWidget *widget, gpointer data)
Definition: gtk_log.c:172
void prompt_user(string a_printf_format,...)
Definition: gtk_log.c:66
static GtkWidget * clear_menu_item
Definition: gtk_log.c:63
static GtkWidget * open_or_front_menu_item
Definition: gtk_log.c:63
static GtkWidget * scrolled_window_vadjustment
Definition: gtk_log.c:64
void gpips_user_log(const char *fmt, va_list *args)
Definition: gtk_log.c:136
static GtkWidget * log_text_view
xview/newgen interaction
Definition: gtk_log.c:62
void create_log_menu()
Definition: gtk_log.c:178
void gpips_user_warning_message(char warning_buffer[])
Definition: gtk_log.c:123
void create_log_window()
This works but it is cleaner to use textsw_reset() instead...
Definition: gtk_log.c:215
char end
Definition: gtk_status.c:82
gint hide_window(GtkWidget *window, GdkEvent *ev __attribute__((unused)), gpointer data __attribute__((unused)))
Definition: gtk_utils.c:89
void gpips_gtk_menu_item_set_label(GtkWidget *w, gchar *text)
Definition: gtk_utils.c:64
gdouble gpips_gtk_adjustment_get_upper(GtkAdjustment *adjustment)
Definition: gtk_utils.c:84
#define exit(code)
Definition: misc-local.h:54
#define abort()
Definition: misc-local.h:53
static string buffer
Definition: string.c:113