1
2 /*
3 * Ump - Unnamed Math Program
4 * Copyright (c) 2004-2006 by Mattias Hultgren <mattias_hultgren@tele2.se>
5 *
6 * See main.cpp
7 */
8
9 #include <gtk/gtk.h>
10 #include <gdk/gdkkeysyms.h>
11 #include "ump_simplewin.h"
12 #include "ump_editor.h"
13 #include "ump_aboutwin.h"
14 #include "ump_advancedwin.h"
15 #include "ump_graphwin.h"
16 #include "ump_prefwin.h"
17 #include "matrix_editor.h"
18 #include "math2.h"
19 #include "main.h"
20 #include <string.h>
21
22 extern "C"
23 {
24 #include "image_sqrt.c"
25 }
26
27 using math::Variable;
28
29
30 GtkWidget *simplewin = 0, *simplewin_vbox, *simplewin_menu;
31 GtkWidget *entry, *statusbar;
32
33 math::CodeLine simplebrain,simple_intern;
34 Complex mem;
35 bool showing_answer,empty_brain;
36 char count_func[2];
37
aboutwin_show_simple(void)38 void aboutwin_show_simple(void) { aboutwin_show(GTK_WINDOW(simplewin)); }
prefwin_show_simple(void)39 void prefwin_show_simple(void) { prefwin_show(GTK_WINDOW(simplewin)); }
40
41
button_CE(void)42 void button_CE(void)
43 {
44 gtk_entry_set_text(GTK_ENTRY(entry), "0");
45 showing_answer = false;
46 }
button_AC(void)47 void button_AC(void)
48 {
49 simplebrain.set_code_line(" ");
50 empty_brain = true;
51 count_func[0] = '\0';
52 button_CE();
53 }
button_comma(void)54 void button_comma(void)
55 {
56 const char *entrytext;
57 int i,c;
58
59 if(showing_answer)
60 button_CE();
61
62 entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
63
64 for(i=0,c=0;entrytext[i] != '\0';i++)
65 {
66 if(entrytext[i] == '.')
67 c++;
68 }
69 if(c != 0)
70 return;
71
72 gint pos = strlen(entrytext);
73 gtk_editable_insert_text(GTK_EDITABLE(entry), ".", 1, &pos);
74 }
button0_9(GtkButton * button,gpointer tmp)75 void button0_9(GtkButton *button, gpointer tmp)
76 {
77 char *buttontext = (char *) tmp;
78 const char *entrytext;
79
80 if(showing_answer)
81 button_CE();
82
83 entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
84
85 if(strcmp("0",entrytext) == 0)
86 gtk_entry_set_text(GTK_ENTRY(entry), buttontext);
87 else
88 {
89 gint pos = strlen(entrytext);
90 gtk_editable_insert_text(GTK_EDITABLE(entry), buttontext, 1, &pos);
91 }
92 }
button_count(GtkButton * button,gpointer tmp)93 void button_count(GtkButton *button, gpointer tmp)
94 {
95 char *buttontext = (char *) tmp;
96 const char *entrytext;
97 utf8_string tmp_str;
98
99
100 entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
101
102 try
103 {
104 if( !showing_answer )
105 {
106 simplebrain.get_code_line( &tmp_str );
107 if(count_func[0] != ' ')
108 tmp_str.append( count_func );
109 empty_brain = false;
110 tmp_str.append( "(" );
111 tmp_str.append( entrytext );
112 tmp_str.append( ")" );
113 simplebrain.set_code_line( tmp_str.c_str() );
114
115 showing_answer = true;
116
117 {
118 utf8_string str;
119 Variable ans;
120
121 simplebrain.calc( &ans );
122 ans.append_to_string( str, *math::intern_format );
123 gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
124 }
125 }
126 count_func[0] = buttontext[0];
127 if( empty_brain )
128 {
129 simplebrain.get_code_line( &tmp_str );
130 tmp_str.append( entrytext );
131 simplebrain.set_code_line( tmp_str.c_str() );
132 empty_brain = false;
133 }
134 }
135 catch(error_obj error)
136 {
137 GtkWidget *dialog;
138 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
139 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
140 gtk_dialog_run(GTK_DIALOG(dialog));
141 gtk_widget_destroy(dialog);
142 return;
143 }
144 catch(...)
145 {
146 try{ THROW_ERROR( ErrorType_Memory, _("Couldn't get memory.") ); }
147 catch(error_obj error)
148 {
149 GtkWidget *dialog;
150 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
151 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
152 gtk_dialog_run(GTK_DIALOG(dialog));
153 gtk_widget_destroy(dialog);
154 return;
155 }
156 }
157 }
button_percent(void)158 void button_percent(void)
159 {
160 bool should_do_percent = false;
161 char c[2];
162
163 if(count_func[0] == '/')
164 should_do_percent = true;
165
166 try
167 {
168 c[0] = ' ';
169 c[1] = '\0';
170 button_count( 0, gpointer (c) );
171
172 if(should_do_percent)
173 {
174 utf8_string str, tmp_str;
175 Variable ans;
176
177 simplebrain.get_code_line( &tmp_str );
178 tmp_str.append( "*100" );
179 simplebrain.set_code_line( tmp_str.c_str() );
180
181 showing_answer = true;
182
183 simplebrain.calc( &ans );
184 ans.append_to_string( str, *math::intern_format );
185 gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
186 }
187
188 simplebrain.set_code_line( " " );
189 empty_brain = true;
190 }
191 catch(error_obj error)
192 {
193 GtkWidget *dialog;
194 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
195 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
196 gtk_dialog_run(GTK_DIALOG(dialog));
197 gtk_widget_destroy(dialog);
198 }
199 }
button_equal(void)200 void button_equal(void)
201 {
202 char c[2];
203
204 c[0] = ' ';
205 c[1] = '\0';
206 button_count( 0, gpointer (c) );
207
208 simplebrain.set_code_line( " " );
209 showing_answer = true;
210 empty_brain = true;
211 }
button_toggle_sign(void)212 void button_toggle_sign(void)
213 {
214 const char *entrytext;
215 char *tmp = 0;
216
217 if(showing_answer)
218 {
219 if(!empty_brain)
220 return;
221
222 showing_answer = false;
223
224 simplebrain.set_code_line( " " );
225 }
226
227 entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
228
229 try
230 {
231 tmp = new char [ strlen(entrytext) + 3];
232
233 if(entrytext[0] == '-')
234 {
235 for(int i=1;;i++)
236 {
237 tmp[i-1] = entrytext[i];
238 if(entrytext[i] == '\0')
239 break;
240 }
241 }
242 else
243 {
244 tmp[0] = '-';
245 for(int i=0;;i++)
246 {
247 tmp[i+1] = entrytext[i];
248 if(entrytext[i] == '\0')
249 break;
250 }
251 }
252
253 gtk_entry_set_text(GTK_ENTRY(entry), tmp);
254 delete [] tmp;
255 }
256 catch(...)
257 {
258 delete [] tmp;
259 try{ THROW_ERROR( ErrorType_Memory, _("Couldn't get memory.") ); }
260 catch(error_obj error)
261 {
262 GtkWidget *dialog;
263 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
264 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
265 gtk_dialog_run(GTK_DIALOG(dialog));
266 gtk_widget_destroy(dialog);
267 return;
268 }
269 }
270 }
button_bracket_count_before(GtkButton * button,gpointer tmp)271 void button_bracket_count_before(GtkButton *button, gpointer tmp)
272 {
273 char *buttontext = (char *) tmp;
274 const char *entrytext;
275
276 entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
277
278 try
279 {
280 utf8_string str, tmp_str;
281 Variable ans;
282
283 tmp_str = buttontext;
284 tmp_str.append( "(" );
285 tmp_str.append( entrytext );
286 tmp_str.append( ")" );
287
288 simple_intern.set_code_line( tmp_str.c_str() );
289 simple_intern.calc( &ans );
290
291 ans.append_to_string( str, *math::intern_format );
292 gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
293 showing_answer = true;
294 empty_brain = true;
295 }
296 catch(error_obj error)
297 {
298 GtkWidget *dialog;
299 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
300 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
301 gtk_dialog_run(GTK_DIALOG(dialog));
302 gtk_widget_destroy(dialog);
303 }
304 }
button_bracket_count_after(GtkButton * button,gpointer tmp)305 void button_bracket_count_after(GtkButton *button, gpointer tmp)
306 {
307 char *buttontext = (char *) tmp;
308 const char *entrytext;
309
310 entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
311
312 try
313 {
314 utf8_string str, tmp_str;
315 Variable ans;
316
317 tmp_str = "(";
318 tmp_str.append( entrytext );
319 tmp_str.append( ")" );
320 tmp_str.append( buttontext );
321 simple_intern.set_code_line( tmp_str.c_str() );
322 simple_intern.calc( &ans );
323
324 ans.append_to_string( str, *math::intern_format );
325 gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
326 showing_answer = true;
327 empty_brain = true;
328 }
329 catch(error_obj error)
330 {
331 GtkWidget *dialog;
332 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
333 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
334 gtk_dialog_run( GTK_DIALOG(dialog) );
335 gtk_widget_destroy( dialog );
336 }
337 }
button_mem_clear(void)338 void button_mem_clear(void)
339 {
340 mem = Real(0);
341 }
button_mem_recall(void)342 void button_mem_recall(void)
343 {
344 utf8_string str;
345 if(showing_answer)
346 button_CE();
347
348 try
349 {
350 mem.append_to_string( str, *math::intern_format );
351 gtk_entry_set_text( GTK_ENTRY(entry), str.c_str() );
352 }
353 catch(error_obj error)
354 {
355 GtkWidget *dialog;
356 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
357 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
358 gtk_dialog_run( GTK_DIALOG(dialog) );
359 gtk_widget_destroy( dialog );
360 }
361 button_equal();
362 }
button_mem_calc(GtkButton * button,gpointer tmp)363 void button_mem_calc(GtkButton *button, gpointer tmp)
364 {
365 char *buttontext = (char *) tmp;
366 const char *entrytext;
367 utf8_string str;
368
369 button_equal();
370 entrytext = gtk_entry_get_text(GTK_ENTRY(entry));
371
372 try
373 {
374 Variable ans;
375
376 mem.append_to_string( str, *math::intern_format );
377 str.append( buttontext );
378 str.append( "(" );
379 str.append( entrytext );
380 str.append( ")" );
381
382 simple_intern.set_code_line( str.c_str() );
383 simple_intern.calc( &ans );
384 mem = *ans.get_complex();
385 }
386 catch(error_obj error)
387 {
388 GtkWidget *dialog;
389 dialog = gtk_message_dialog_new( GTK_WINDOW(simplewin), GTK_DIALOG_DESTROY_WITH_PARENT,
390 GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, error.msg );
391 gtk_dialog_run(GTK_DIALOG(dialog));
392 gtk_widget_destroy(dialog);
393 }
394 }
395
simplewin_keypress(GtkWidget * widget,GdkEventKey * event,gpointer user_data)396 gboolean simplewin_keypress( GtkWidget *widget, GdkEventKey *event, gpointer user_data)
397 {
398 if( event->type == GDK_KEY_PRESS )
399 {
400 switch( event->keyval )
401 {
402 case GDK_0: case GDK_KP_0:
403 button0_9( 0, gpointer("0") ); break;
404 case GDK_1: case GDK_KP_1:
405 button0_9( 0, gpointer("1") ); break;
406 case GDK_2: case GDK_KP_2:
407 button0_9( 0, gpointer("2") ); break;
408 case GDK_3: case GDK_KP_3:
409 button0_9( 0, gpointer("3") ); break;
410 case GDK_4: case GDK_KP_4:
411 button0_9( 0, gpointer("4") ); break;
412 case GDK_5: case GDK_KP_5:
413 button0_9( 0, gpointer("5") ); break;
414 case GDK_6: case GDK_KP_6:
415 button0_9( 0, gpointer("6") ); break;
416 case GDK_7: case GDK_KP_7:
417 button0_9( 0, gpointer("7") ); break;
418 case GDK_8: case GDK_KP_8:
419 button0_9( 0, gpointer("8") ); break;
420 case GDK_9: case GDK_KP_9:
421 button0_9( 0, gpointer("9") ); break;
422 case GDK_plus: case GDK_KP_Add:
423 button_count( 0, gpointer("+") ); break;
424 case GDK_minus: case GDK_KP_Subtract:
425 button_count( 0, gpointer("-") ); break;
426 case GDK_asterisk: case GDK_KP_Multiply:
427 button_count( 0, gpointer("*") ); break;
428 case GDK_slash: case GDK_KP_Divide:
429 button_count( 0, gpointer("/") ); break;
430 case GDK_percent:
431 button_percent(); break;
432 case GDK_comma: case GDK_period: case GDK_KP_Separator:
433 button_comma(); break;
434 case GDK_equal: case GDK_Return: case GDK_KP_Enter:
435 button_equal(); break;
436 default:
437 #ifdef DEVELOP
438 printf("0x%X\n", event->keyval);
439 #endif
440 break;
441 }
442 }
443 }
444
simplewin_build_menu(void)445 GtkWidget* simplewin_build_menu(void)
446 {
447 GtkActionGroup *actions;
448 GtkUIManager *ui_manager;
449 GError *error = NULL;
450 static const gchar *menu =
451 "<ui>"
452 " <menubar name='MenuBar'>"
453 " <menu action='FileMenu'>"
454 " <menuitem action='Preferences'/>"
455 " <separator/>"
456 " <menuitem action='Close'/>"
457 " <separator/>"
458 " <menuitem action='Quit'/>"
459 " </menu>"
460 " <menu action='ToolsMenu'>"
461 " <menuitem action='Advanced'/>"
462 " <menuitem action='Editor'/>"
463 " <menuitem action='Graphtool'/>"
464 " <menuitem action='MatrixEdit'/>"
465 " </menu>"
466 " <menuitem action='About'/>"
467 " </menubar>"
468 "</ui>";
469 GtkActionEntry entries[] = {
470 { "FileMenu", NULL, menu_file },
471 { "Preferences", GTK_STOCK_PREFERENCES, menu_pref, NULL, NULL, G_CALLBACK(prefwin_show_simple) },
472 { "Close", GTK_STOCK_CLOSE, menu_file_close, "<ctrl>W", NULL, G_CALLBACK(simplewin_close) },
473 { "Quit", GTK_STOCK_QUIT, menu_file_quit, "<ctrl>Q", NULL, G_CALLBACK(UMP_gtk_quit) },
474 { "ToolsMenu", NULL, menu_tools },
475 { "Advanced", NULL, menu_tools_advanced, NULL, NULL, G_CALLBACK(advancedwin_show) },
476 { "Editor", NULL, menu_tools_editor, NULL, NULL, G_CALLBACK(editor_showwin) },
477 { "Graphtool", NULL, menu_tools_graphtool, NULL, NULL, G_CALLBACK(graphwin_show) },
478 { "MatrixEdit", NULL, menu_tools_matrixedit,NULL, NULL, G_CALLBACK(matrix_editor_show) },
479 { "About", NULL, menu_about, NULL, NULL, G_CALLBACK(aboutwin_show_simple) }
480 };
481 guint n_entries = G_N_ELEMENTS(entries);
482
483 actions = gtk_action_group_new( "Actions" );
484 gtk_action_group_add_actions( actions, entries, n_entries, NULL );
485 ui_manager = gtk_ui_manager_new();
486 gtk_ui_manager_insert_action_group( ui_manager, actions, 0 );
487 gtk_window_add_accel_group( GTK_WINDOW(simplewin),
488 gtk_ui_manager_get_accel_group( ui_manager ) );
489 if (!gtk_ui_manager_add_ui_from_string( ui_manager, menu, -1, &error ))
490 {
491 g_message( "building menus failed: %s", error->message );
492 g_error_free( error );
493 return 0;
494 }
495 gtk_ui_manager_ensure_update( ui_manager );
496
497 return gtk_ui_manager_get_widget( ui_manager, "/MenuBar" );
498 }
499
simplewin_show(void)500 GtkWindow* simplewin_show(void)
501 {
502 if(simplewin == 0)
503 {
504 GtkWidget *tmp,*table;
505
506 simplebrain.set_code_line( " " );
507 mem = Real(0);
508 showing_answer = false;
509 empty_brain = true;
510 count_func[0] = ' ';
511 count_func[1] = '\0';
512
513 simplewin = gtk_window_new( GTK_WINDOW_TOPLEVEL );
514
515 gtk_window_set_title( GTK_WINDOW(simplewin), _("Ump - Simple calculator") );
516 g_signal_connect_swapped( G_OBJECT(simplewin), "delete-event", G_CALLBACK(simplewin_close),
517 NULL );
518
519 g_signal_connect_swapped( G_OBJECT(simplewin), "key-press-event", G_CALLBACK(simplewin_keypress),
520 NULL );
521
522 simplewin_vbox = gtk_vbox_new( FALSE, 0 );
523 gtk_container_add( GTK_CONTAINER(simplewin), simplewin_vbox);
524
525 if( (simplewin_menu = simplewin_build_menu()) == 0 )
526 {
527 gtk_widget_destroy( simplewin );
528 simplewin = 0;
529 return 0;
530 }
531 gtk_box_pack_start( GTK_BOX(simplewin_vbox), simplewin_menu, FALSE, FALSE, 0 );
532
533
534 entry = gtk_entry_new();
535 gtk_editable_set_editable( GTK_EDITABLE(entry), FALSE );
536 gtk_entry_set_text( GTK_ENTRY(entry), "0" );
537 gtk_entry_set_alignment( GTK_ENTRY(entry), 1.0f );
538 g_object_set( G_OBJECT(entry), "can-focus", FALSE, NULL );
539 gtk_box_pack_start( GTK_BOX(simplewin_vbox), entry, FALSE, FALSE, 0 );
540
541
542 table = gtk_table_new ( 5, 7, TRUE );
543 gtk_container_set_border_width( GTK_CONTAINER(table), 5 );
544 gtk_table_set_row_spacings( GTK_TABLE(table), 4 );
545 gtk_table_set_col_spacings( GTK_TABLE(table), 4 );
546 gtk_box_pack_start( GTK_BOX(simplewin_vbox), table, TRUE, TRUE, 0 );
547
548 tmp = gtk_button_new_with_label( "CE" );
549 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
550 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_CE), NULL );
551 gtk_table_attach( GTK_TABLE(table), tmp, 5, 6, 0, 1, GTK_FILL, GTK_FILL, 0, 0 );
552
553 tmp = gtk_button_new_with_label( "AC" );
554 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
555 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_AC), NULL );
556 gtk_table_attach( GTK_TABLE(table), tmp, 6, 7, 0, 1, GTK_FILL, GTK_FILL, 0, 0 );
557
558 tmp = gtk_button_new_with_label( "7" );
559 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
560 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("7") );
561 gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
562 gtk_widget_set_size_request(tmp, 45, 32);
563
564 tmp = gtk_button_new_with_label( "8" );
565 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
566 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("8") );
567 gtk_table_attach( GTK_TABLE(table), tmp, 1, 2, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
568
569 tmp = gtk_button_new_with_label( "9" );
570 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
571 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("9") );
572 gtk_table_attach( GTK_TABLE(table), tmp, 2, 3, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
573
574 tmp = gtk_button_new_with_label( "/" );
575 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
576 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("/") );
577 gtk_table_attach( GTK_TABLE (table), tmp, 3, 4, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
578
579 tmp = gtk_button_new_with_label( "%" );
580 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
581 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_percent), NULL );
582 gtk_table_attach( GTK_TABLE (table), tmp, 4, 5, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
583
584 tmp = gtk_button_new_with_label( "M-" );
585 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
586 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_calc), gpointer("-") );
587 gtk_table_attach( GTK_TABLE(table), tmp, 5, 6, 1, 2, GTK_FILL, GTK_FILL, 0, 0) ;
588
589 tmp = gtk_button_new_with_label( "MC" );
590 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
591 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_clear), NULL );
592 gtk_table_attach( GTK_TABLE(table), tmp, 6, 7, 1, 2, GTK_FILL, GTK_FILL, 0, 0 );
593
594 tmp = gtk_button_new_with_label("4");
595 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
596 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("4") );
597 gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
598
599 tmp = gtk_button_new_with_label("5");
600 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
601 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("5") );
602 gtk_table_attach( GTK_TABLE (table), tmp, 1, 2, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
603
604 tmp = gtk_button_new_with_label("6");
605 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
606 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("6") );
607 gtk_table_attach( GTK_TABLE (table), tmp, 2, 3, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
608
609 tmp = gtk_button_new_with_label("*");
610 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
611 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("*") );
612 gtk_table_attach( GTK_TABLE (table), tmp, 3, 4, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
613
614 {
615 GdkPixbuf *pixbuf;
616 GtkWidget *img;
617 pixbuf = gdk_pixbuf_new_from_inline (-1, image_sqrt, FALSE, NULL);
618
619 img = gtk_image_new_from_pixbuf( pixbuf );
620
621 tmp = gtk_button_new();
622 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
623 gtk_container_add( GTK_CONTAINER(tmp), img );
624 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
625 gpointer("sqrt") );
626 gtk_table_attach(GTK_TABLE (table), tmp, 4, 5, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
627 }
628
629 tmp = gtk_button_new_with_label("M+");
630 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
631 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_calc), gpointer("+") );
632 gtk_table_attach(GTK_TABLE (table), tmp, 5, 6, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
633
634 tmp = gtk_button_new_with_label("MR");
635 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
636 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_mem_recall), NULL );
637 gtk_table_attach( GTK_TABLE (table), tmp, 6, 7, 2, 3, GTK_FILL, GTK_FILL, 0, 0 );
638
639 tmp = gtk_button_new_with_label("1");
640 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
641 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("1") );
642 gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
643
644 tmp = gtk_button_new_with_label("2");
645 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
646 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("2") );
647 gtk_table_attach( GTK_TABLE(table), tmp, 1, 2, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
648
649 tmp = gtk_button_new_with_label("3");
650 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
651 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("3") );
652 gtk_table_attach( GTK_TABLE(table), tmp, 2, 3, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
653
654 tmp = gtk_button_new_with_label("-");
655 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
656 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("-") );
657 gtk_table_attach( GTK_TABLE(table), tmp, 3, 4, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
658
659 tmp = gtk_button_new_with_label("x\302\262");
660 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
661 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_after),
662 gpointer("^2") );
663 gtk_table_attach( GTK_TABLE(table), tmp, 4, 5, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
664
665 tmp = gtk_button_new_with_label("1/x");
666 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
667 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
668 gpointer("1/") );
669 gtk_table_attach( GTK_TABLE(table), tmp, 5, 6, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
670
671 tmp = gtk_button_new_with_label("x^y");
672 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
673 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("^") );
674 gtk_table_attach( GTK_TABLE(table), tmp, 6, 7, 3, 4, GTK_FILL, GTK_FILL, 0, 0 );
675
676 tmp = gtk_button_new_with_label("0");
677 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
678 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button0_9), gpointer("0") );
679 gtk_table_attach( GTK_TABLE(table), tmp, 0, 1, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
680
681 tmp = gtk_button_new_with_label(".");
682 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
683 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_comma), NULL );
684 gtk_table_attach( GTK_TABLE(table), tmp, 1, 2, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
685
686 tmp = gtk_button_new_with_label("=");
687 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
688 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_equal), NULL );
689 gtk_table_attach( GTK_TABLE(table), tmp, 2, 3, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
690
691 tmp = gtk_button_new_with_label("+");
692 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
693 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_count), gpointer("+") );
694 gtk_table_attach( GTK_TABLE(table), tmp, 3, 4, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
695
696 tmp = gtk_button_new_with_label("+/-");
697 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
698 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_toggle_sign), NULL );
699 gtk_table_attach( GTK_TABLE(table), tmp, 4, 5, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
700
701 tmp = gtk_button_new_with_label("Dec");
702 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
703 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
704 gpointer("dec") );
705 gtk_table_attach( GTK_TABLE (table), tmp, 5, 6, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
706
707 tmp = gtk_button_new_with_label("Frac");
708 g_object_set( G_OBJECT(tmp), "can-focus", FALSE, NULL );
709 g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(button_bracket_count_before),
710 gpointer("frac") );
711 gtk_table_attach( GTK_TABLE (table), tmp, 6, 7, 4, 5, GTK_FILL, GTK_FILL, 0, 0 );
712
713 statusbar = gtk_statusbar_new();
714 gtk_box_pack_start( GTK_BOX(simplewin_vbox), statusbar, FALSE, FALSE, 0 );
715
716
717 gtk_widget_show_all(simplewin);
718 open_windows |= SIMPLE_WIN;
719 }
720 else
721 gtk_window_present( GTK_WINDOW(simplewin) );
722
723 return GTK_WINDOW(simplewin);
724 }
725
726
simplewin_close(void)727 void simplewin_close(void)
728 {
729 if(simplewin != 0)
730 {
731 gtk_widget_destroy(simplewin);
732 simplewin = 0;
733
734 open_windows &= ~SIMPLE_WIN;
735 if(open_windows == 0)
736 UMP_gtk_quit();
737 }
738 }
739
simplewin_translate(void)740 void simplewin_translate(void)
741 {
742 if(simplewin != 0)
743 {
744 GtkWidget *new_menu;
745
746 if(( new_menu = simplewin_build_menu()) == 0 )
747 return;
748
749 gtk_widget_destroy( simplewin_menu );
750 simplewin_menu = new_menu;
751
752 gtk_box_pack_start(GTK_BOX(simplewin_vbox), simplewin_menu, FALSE, FALSE, 0);
753 gtk_box_reorder_child( GTK_BOX(simplewin_vbox), simplewin_menu, 0 );
754
755 gtk_window_set_title(GTK_WINDOW(simplewin), _("Ump - Simple calculator") );
756 }
757 }
758