001: /*
002:  *  main-win.c
003:  *  dde
004:  *
005:  *  Created by ashley on 01/12/2009.
006:  *  Copyright 2009 __MyCompanyName__. All rights reserved.
007:  *
008:  */
009: 
010: #include <stdlib.h>
011: #include "main-win.h"
012: #include "dde-model.h"
013: 
014: void callback_handler(DDEMainWindow *plotwin, gchar *string, ...)
015: {
016:         if (g_strcmp0(string, "notifiy_plot_window_termination")) {
017:                 plotwin->plotwin = NULL;
018:         }
019: }
020: 
021: static void run_callback(GtkWidget *widget, gpointer data)
022: {
023:         DDEMainWindow *window = (DDEMainWindow *)data;
024:         usercontrol *out = window->out;
025:         
026:         g_print("Running model %s\n", out->initialtitle);
027:         
028:         int i;
029:         for(i=0; i<out->nparameters; i++) {
030:                 GtkWidget *entry = window->entries[i];
031:                 const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
032:                 double param;
033:                 sscanf(text, "%lg", &param);
034:                 g_printf("Entry 0 = %lg\n", param);
035:                 out->c[i] = param;
036:         }
037: 
038:         run_model(out);
039: }
040: 
041: static gboolean quit_callback(GtkWidget *widget, /*GdkEvent *event, */gpointer data)
042: {
043:         g_print("Delete event %08x.\n", (int)data); 
044: 
045:         DDEMainWindow *window = (DDEMainWindow *)data;
046:         usercontrol *out = window->out;
047: /*      int nvariables = out->nvariables;
048:         int nparameters = out->nparameters;
049:         int i; */
050: /*      Clean up allocated storage */
051:         free(out->fout);
052: /*      for(i=0; i<nvariables; i++) {
053:                 g_free(out->label[i]);
054:                 g_free(out->cname[i]);
055:                 g_free(out->wname[i]);
056:         } */
057:         g_free(out->lines);
058:         g_free(out->index);
059:         g_free(out->label);
060:         g_free(out->wname);
061:         
062: /*      for(i=0; i<nparameters; i++) {
063:                 g_free(out->cinfo[i]);
064:                 g_free(out->cname[i]); 
065:         } */
066:         g_free(out->cinfo);
067:         g_free(out->cname);
068:         g_free(out->range);
069:         g_free(out->c);
070: 
071:     gtk_main_quit();
072:         
073:     return FALSE;
074: }
075: 
076: static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
077: {
078:         return quit_callback(widget, data);
079: }
080: 
081: static void menuitem_response(gchar *string)
082: {
083:     printf("%s\n", string);
084: }
085: 
086: static void run_menuitem(DDEMainWindow *mainwin)
087: {
088:         run_callback(NULL, mainwin);
089: }
090: 
091: static void setup_menuitem(DDEMainWindow *mainwin)
092: {
093: }
094: 
095: DDEMainWindow *makeMainWindow()
096: {
097:         DDEMainWindow *mainwin = (DDEMainWindow *)malloc(sizeof(DDEMainWindow));
098:         
099:         GdkScreen* screen = NULL;
100:         
101:         usercontrol *out = makeUsercontrol();
102:         initialiseUsercontrol(out);
103:         
104:         gint winwidth = 600;
105:         gint winheight = 350;
106:         gint winxpos = 200;
107:         gint winypos = 200;
108: 
109:     GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
110:         mainwin->window = window;
111:         gtk_window_set_title(GTK_WINDOW(window), out->initialtitle);
112:         gtk_window_set_default_size(GTK_WINDOW(window), winwidth, winheight);
113:         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_NONE);
114:         
115:         screen = gtk_window_get_screen(GTK_WINDOW(window));
116:         gint width = gdk_screen_get_width(screen);
117:         gint height = gdk_screen_get_height(screen);
118:         printf("Screen resolution is (%d x %d)\n", width, height);
119:         
120:         if ((winwidth<width - winxpos) && (winheight<height - winypos)) {
121:                 gtk_window_move(GTK_WINDOW(window), winxpos, winypos);
122:         }
123: 
124:         int nrows = out->nparameters;
125:         mainwin->window = window;
126:         mainwin->entries = (GtkWidget **)g_malloc(nrows*sizeof(GtkWidget *));
127:         mainwin->out = out;
128:         mainwin->plotwin = NULL;
129: 
130:         GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
131:         gtk_container_add(GTK_CONTAINER(window), vbox); 
132:         
133:         GtkWidget *file_menu = gtk_menu_new();    
134:         GtkWidget *model_menu = gtk_menu_new();    
135: 
136: /* Create the menu items */
137:     GtkWidget *open_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL);
138:         GtkWidget *write_item = gtk_menu_item_new_with_label ("Write Parameters...");
139:         GtkWidget *read_item = gtk_menu_item_new_with_label ("Read Parameters...");
140:         GtkWidget *save_item = gtk_menu_item_new_with_label ("Save Results...");
141:     GtkWidget *quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
142: 
143:         GtkWidget *run_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_EXECUTE, NULL);
144:         GtkWidget *setup_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_DIALOG_INFO, NULL);
145: 
146: /* Add them to the menu */
147:     gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), open_item);
148:     gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), write_item);
149:     gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), read_item);
150:     gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), save_item);
151:     gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), quit_item);
152: 
153:     gtk_menu_shell_append(GTK_MENU_SHELL(model_menu), run_item);
154:     gtk_menu_shell_append(GTK_MENU_SHELL(model_menu), setup_item);
155: 
156: /*      Attach the callback functions to the activate signal */
157:     g_signal_connect_swapped(G_OBJECT(open_item), "activate", G_CALLBACK(menuitem_response), (gpointer)"file.open");
158:     g_signal_connect_swapped(G_OBJECT(write_item), "activate", G_CALLBACK(menuitem_response), (gpointer)"file.write");
159:     g_signal_connect_swapped(G_OBJECT(read_item), "activate", G_CALLBACK(menuitem_response), (gpointer)"file.read");
160:     g_signal_connect_swapped(G_OBJECT(save_item), "activate", G_CALLBACK(menuitem_response), (gpointer)"file.save");
161:     g_signal_connect_swapped(G_OBJECT(run_item), "activate", G_CALLBACK(run_menuitem), (gpointer)mainwin);
162:     g_signal_connect_swapped(G_OBJECT(setup_item), "activate", G_CALLBACK(setup_menuitem), (gpointer)mainwin);
163: 
164: /*      Show menu items */
165:     gtk_widget_show(open_item);
166:     gtk_widget_show(write_item);
167:     gtk_widget_show(read_item);
168:     gtk_widget_show(save_item);
169:     gtk_widget_show(quit_item);
170:                 
171:     gtk_widget_show(run_item);
172: 
173:         GtkWidget *menu_bar = gtk_menu_bar_new();
174: //    gtk_container_add(GTK_CONTAINER(vbox), menu_bar);
175:         gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 3); 
176:         
177:     gtk_widget_show(menu_bar);
178:         
179:     GtkWidget *file_item = gtk_menu_item_new_with_label("File");
180:     gtk_widget_show(file_item);
181:     GtkWidget *model_item = gtk_menu_item_new_with_label("Model");
182:     gtk_widget_show(model_item);
183: 
184:         gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_menu);
185:         gtk_menu_item_set_submenu(GTK_MENU_ITEM(model_item), model_menu);
186:         
187:         gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), file_item);
188:         gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), model_item);
189: 
190:         g_signal_connect(G_OBJECT(quit_item), "activate", G_CALLBACK(quit_callback), mainwin);
191: 
192: /*      ==========================================================  */  
193: 
194:         GtkWidget *toolbar = gtk_toolbar_new();
195:         gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
196:         
197:         gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);
198:         
199:         GtkToolItem *exec = gtk_tool_button_new_from_stock(GTK_STOCK_EXECUTE);
200:         gtk_tool_item_set_tooltip_text(exec, "Solve Model");
201:         gtk_toolbar_insert(GTK_TOOLBAR(toolbar), exec, -1);
202:         
203:         GtkToolItem *info = gtk_tool_button_new_from_stock(GTK_STOCK_DIALOG_INFO);
204:         gtk_tool_item_set_tooltip_text(info, "Model setup");
205:         gtk_toolbar_insert(GTK_TOOLBAR(toolbar), info, -1);
206:                 
207: //      gtk_toolbar_insert_space(GTK_TOOLBAR(toolbar), -1);
208:         
209:         GtkToolItem *help = gtk_tool_button_new_from_stock(GTK_STOCK_HELP);
210:         gtk_tool_item_set_tooltip_text(help, "Help");
211:         gtk_toolbar_insert(GTK_TOOLBAR(toolbar), help, -1);
212:                 
213:         gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 5);
214:         
215:         g_signal_connect(G_OBJECT(exec), "clicked", G_CALLBACK(run_callback), mainwin);
216:         
217: /*      ==========================================================  */  
218: 
219:         GtkWidget *table = gtk_table_new(nrows, 2, FALSE);
220:         gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, TRUE, 0);       
221:         
222:         int row;
223:         for(row=0; row<nrows; row++) {
224:                 GtkWidget *frame = gtk_frame_new(NULL);
225:                 GtkWidget *label = gtk_label_new(out->cinfo[row]);
226:                 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.9);
227:                 gtk_container_add(GTK_CONTAINER(frame), label);
228:                 gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, row, row+1);
229:                 
230:                 GtkWidget *entry = gtk_entry_new();
231:                 mainwin->entries[row] = entry;
232:                 gchar *chr;
233:                 asprintf(&chr, "%g", out->c[row]);
234:                 gtk_entry_set_text(GTK_ENTRY(entry), chr);
235:                 free(chr);
236:                 gtk_table_attach_defaults(GTK_TABLE(table), entry, 1, 2, row, row+1);
237:         }
238: 
239: /*      ==========================================================  */  
240: 
241:         GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
242: 
243:         GtkWidget *progress_bar = gtk_progress_bar_new();
244:         mainwin->progress_bar = progress_bar;
245:         gtk_box_pack_start(GTK_BOX(hbox), progress_bar, FALSE, FALSE, 0);
246:         
247: /*      ==========================================================  */  
248: 
249: /*      GtkWidget *button = gtk_button_new_with_label("Run");
250:         gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); */
251: /*      GtkWidget *runbutton = gtk_button_new_with_label("Quit");
252:         gtk_box_pack_end(GTK_BOX(hbox), runbutton, FALSE, FALSE, 0); */
253:         
254:         gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);  
255: 
256:     gtk_widget_show_all(mainwin->window);
257: 
258: /*      g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(run_callback), mainwin); */
259: /*      g_signal_connect(G_OBJECT(runbutton), "clicked", G_CALLBACK(delete_event), mainwin); */
260: //      g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), mainwin);
261: 
262:         g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), mainwin);
263:                 
264:         return mainwin;
265: }
266: