/* SciGraphica - Scientific graphics and data manipulation * Copyright (C) 2001 Adrian E. Feiguin * * 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 "sg_project.h" #include "sg.h" #include "sg_dialogs.h" #include "sg_misc_dialogs.h" #include "sg_menus.h" #include "sg_dataset.h" #include "sg_clipboard.h" #include "../pixmaps/sheet_icon2.xpm" #include "../pixmaps/plot_icon2.xpm" #include "../pixmaps/matrix_icon.xpm" gint num_worksheets; gint num_plots; gint num_functions; gint num_expressions; gint last_worksheet; gint last_matrix; gint last_plot; gint last_dataset; gint last_function; gint last_expression; gint arrange_rows; gint arrange_cols; gdouble arrange_vgap; gdouble arrange_hgap; gdouble arrange_top; gdouble arrange_bottom; gdouble arrange_left; gdouble arrange_right; GList *worksheets; GList *plots; GList *functions; GList *datasets; GList *expressions; static gboolean remove_worksheet (SGworksheet *worksheet); static gboolean remove_plot (SGplot *plot); static gboolean remove_dataset (SGdataset *dataset); static gboolean rename_worksheet (GtkIconList *iconlist, GtkIconListItem *item); static gboolean rename_plot (GtkIconList *iconlist, GtkIconListItem *item); static SGdataset *find_data_by_id (GList *list, gint id); static gboolean focus_in_event (GtkWidget *widget, GdkEventFocus *event); static gint delete_event (GtkWidget *window); void sg_project_new() { sg_project_init(); if(gui_iconlist){ gtk_signal_connect(GTK_OBJECT(iconlist2), "deactivate_icon", (GtkSignalFunc)rename_plot, iconlist2); gtk_signal_connect(GTK_OBJECT(iconlist1), "deactivate_icon", (GtkSignalFunc)rename_worksheet, iconlist1); } } void sg_project_init() { last_function = num_functions = 0; last_plot = num_plots = 0; last_worksheet = num_worksheets = 0; last_dataset = 0; last_expression = 0; last_matrix = 0; active_icon = NULL; active_worksheet = NULL; active_plot = NULL; active_layer = NULL; active_dataset = NULL; arrange_rows = 2; arrange_cols = 1; arrange_top = .15; arrange_bottom = .15; arrange_left = .15; arrange_right = .15; arrange_vgap = .15; arrange_hgap = .15; project_changed = FALSE; sg_clipboard_init(); sg_dialogs_init(); plots = NULL; worksheets = NULL; datasets = NULL; functions = NULL; expressions = NULL; if(last_project_filename){ g_free(last_project_filename); last_project_filename = g_strdup("untitled.sg"); } sg_project_set_title(); } void sg_project_set_title() { gchar title[1000]; gchar icon_title[1000]; if(project_changed){ g_snprintf(title, 1000, "SciGraphica: %s (changed)", last_project_filename); g_snprintf(icon_title, 1000, "%s (changed)", last_project_filename); } else { g_snprintf(title, 1000, "SciGraphica: %s", last_project_filename); g_snprintf(icon_title, 1000, "%s", last_project_filename); } if(!gui_iconlist) return; gtk_window_set_title(GTK_WINDOW(main_window), title); gdk_window_set_icon_name(GTK_WIDGET(main_window)->window, icon_title); } void sg_project_changed(gboolean changed) { if(project_changed != changed){ project_changed = changed; sg_project_set_title(); } project_changed_since_last_autosave = changed; } SGworksheet * sg_project_new_worksheet() { GtkIconList *iconlist; SGworksheet *worksheet; gchar *name; gchar label[20]; sg_project_changed(TRUE); num_worksheets++; last_worksheet++; sprintf(label,"Data%02d",last_worksheet); name = g_strdup(label); worksheet = sg_worksheet_new(name, 20, 5); worksheets = g_list_append(worksheets, worksheet); active_worksheet = worksheet; gtk_signal_connect(GTK_OBJECT(worksheet->sheet), "button_press_event", (GtkSignalFunc)sg_worksheet_menu_show, NULL); gtk_signal_connect(GTK_OBJECT(worksheet),"delete_event", (GtkSignalFunc) delete_event, NULL); gtk_signal_connect(GTK_OBJECT(worksheet),"focus_in_event", (GtkSignalFunc) focus_in_event, NULL); gtk_signal_connect(GTK_OBJECT(worksheet),"set_focus", (GtkSignalFunc) focus_in_event, (gpointer)worksheet); if(!gui_iconlist){ g_free(name); return worksheet; } iconlist = GTK_ICON_LIST(iconlist1); worksheet->iconlist = iconlist; worksheet->icon = gtk_icon_list_add_from_data(iconlist, sheet_icon2_xpm, name, worksheet); gtk_icon_list_set_active_icon(iconlist, worksheet->icon); gtk_entry_select_region(GTK_ENTRY(worksheet->icon->entry), 0, strlen(name)); sg_entry_cancel_space(GTK_ENTRY(worksheet->icon->entry)); gtk_notebook_set_page(GTK_NOTEBOOK(gui_notebook), 0); g_free(name); return worksheet; } SGworksheet * sg_project_new_matrix(void) { GtkIconList *iconlist; SGworksheet *worksheet; gchar *name; gchar label[20]; GdkColor color; sg_project_changed(TRUE); num_worksheets++; last_matrix++; sprintf(label,"Matrix%02d",last_matrix); name = g_strdup(label); worksheet = sg_worksheet_new(name, 10, 10); worksheets = g_list_append(worksheets, worksheet); worksheet->mode = SG_MODE_MATRIX; gdk_color_parse("light yellow", &color); gdk_color_alloc(gdk_colormap_get_system(), &color); gtk_sheet_set_background(GTK_SHEET(worksheet->sheet), &color); gdk_color_parse("light blue", &color); gdk_color_alloc(gdk_colormap_get_system(), &color); gtk_sheet_set_grid(GTK_SHEET(worksheet->sheet), &color); active_worksheet = worksheet; gtk_signal_connect(GTK_OBJECT(worksheet->sheet), "button_press_event", (GtkSignalFunc)sg_matrix_menu_show, NULL); gtk_signal_connect(GTK_OBJECT(worksheet),"delete_event", (GtkSignalFunc) delete_event, NULL); gtk_signal_connect(GTK_OBJECT(worksheet),"focus_in_event", (GtkSignalFunc) focus_in_event, NULL); gtk_signal_connect(GTK_OBJECT(worksheet),"set_focus", (GtkSignalFunc) focus_in_event, (gpointer)worksheet); if(!gui_iconlist){ g_free(name); return worksheet; } iconlist = GTK_ICON_LIST(iconlist1); worksheet->iconlist = iconlist; worksheet->icon = gtk_icon_list_add_from_data(iconlist, matrix_icon_xpm, name, worksheet); gtk_icon_list_set_active_icon(iconlist, worksheet->icon); gtk_entry_select_region(GTK_ENTRY(worksheet->icon->entry), 0, strlen(name)); sg_entry_cancel_space(GTK_ENTRY(worksheet->icon->entry)); gtk_notebook_set_page(GTK_NOTEBOOK(gui_notebook), 0); g_free(name); return worksheet; } SGplot * sg_project_new_plot() { GtkIconList *iconlist; SGplot *plot; gchar *name; gchar label[20]; sg_project_changed(TRUE); num_plots++; last_plot++; sprintf(label,"Plot%02d",last_plot); name = g_strdup(label); plot = sg_plot_new(name); plots = g_list_append(plots, plot); active_plot = plot; gtk_signal_connect(GTK_OBJECT(plot->real_canvas), "button_press_event", (GtkSignalFunc)sg_plot_menu_show, NULL); gtk_signal_connect(GTK_OBJECT(plot),"delete_event", (GtkSignalFunc) delete_event, NULL); gtk_signal_connect(GTK_OBJECT(plot),"focus_in_event", (GtkSignalFunc) focus_in_event, NULL); if(!gui_iconlist){ g_free(name); return plot; } iconlist = GTK_ICON_LIST(iconlist2); plot->iconlist = iconlist; plot->icon = gtk_icon_list_add_from_data(iconlist, plot_icon2_xpm, name, plot); gtk_icon_list_set_active_icon(iconlist, plot->icon); gtk_entry_select_region(GTK_ENTRY(plot->icon->entry), 0, strlen(name)); sg_entry_cancel_space(GTK_ENTRY(plot->icon->entry)); gtk_notebook_set_page(GTK_NOTEBOOK(gui_notebook), 1); sg_layer_control_refresh(label); g_free(name); return plot; } SGplot * sg_project_new_plot_with_layer(SGlayerType layer_type) { SGplot *plot; GtkIconList *iconlist; gchar *name; gchar label[20]; sg_project_changed(TRUE); num_plots++; last_plot++; sprintf(label,"Plot%02d",last_plot); name = g_strdup(label); plot = sg_plot_new_with_layer(layer_type, name); plots = g_list_append(plots, plot); active_plot = plot; gtk_signal_connect(GTK_OBJECT(plot),"delete_event", (GtkSignalFunc) delete_event, NULL); gtk_signal_connect(GTK_OBJECT(plot),"focus_in_event", (GtkSignalFunc) focus_in_event, NULL); gtk_signal_connect(GTK_OBJECT(plot->real_canvas), "button_press_event", (GtkSignalFunc)sg_plot_menu_show, NULL); if(!gui_iconlist){ g_free(name); return plot; } iconlist = GTK_ICON_LIST(iconlist2); plot->iconlist = iconlist; plot->icon = gtk_icon_list_add_from_data(iconlist, plot_icon2_xpm, name, plot); gtk_icon_list_set_active_icon(iconlist, plot->icon); gtk_entry_select_region(GTK_ENTRY(plot->icon->entry), 0, strlen(name)); sg_entry_cancel_space(GTK_ENTRY(plot->icon->entry)); gtk_notebook_set_page(GTK_NOTEBOOK(gui_notebook), 1); sg_layer_control_refresh(label); g_free(name); return plot; } SGdataset * sg_project_new_dataset(SGdataStyle style) { SGdataset *dataset; sg_project_changed(TRUE); dataset = sg_dataset_new(style); datasets = g_list_append(datasets, dataset); dataset->id = last_dataset; last_dataset++; return dataset; } SGdataset * sg_project_new_function(gchar *exp) { SGdataset *function; gchar text[20]; sg_project_changed(TRUE); function = sg_dataset_new_function(exp); functions = g_list_append(functions, function); num_functions++; last_function++; function->id = last_dataset; last_dataset++; snprintf(text, 20,"f%d(x)", last_function); sg_dataset_set_name(function, text); return function; } SGdataset * sg_project_new_expression(SGdataStyle style, gchar *exp[9]) { SGdataset *dataset; sg_project_changed(TRUE); dataset = sg_dataset_new_python(style, exp); expressions = g_list_append(expressions, dataset); num_expressions++; last_expression++; dataset->id = last_dataset; last_dataset++; return dataset; } gboolean sg_project_remove_worksheet(SGworksheet *worksheet) { gboolean veto; gboolean deleting = FALSE; GList *list; list = datasets; while(list) { SGdataset *dataset; dataset = SG_DATASET(list->data); if(dataset->worksheet && dataset->worksheet == worksheet){ if(!deleting){ gchar text[1000]; g_snprintf(text, 1000, "There are datasets linked to this worksheet.\n The datasets will also be deleted.\n Do you really want to remove\n%s ?", worksheet->name); veto = sg_accept_dialog(text, 1); if(!veto) return FALSE; deleting = TRUE; } if(deleting){ sg_project_remove_dataset(dataset, TRUE); list = datasets; } else { list = list->next; } } else { list = list->next; } } veto = remove_worksheet(worksheet); if(!veto) return FALSE; if(gui_worksheet && !worksheets) gui_worksheet = FALSE; if(!gui_iconlist && !gui_plot && !gui_worksheet){ main_quit(NULL); } return TRUE; } gboolean sg_project_remove_dataset(SGdataset *dataset, gboolean force) { SGplot *plot; GList *list; GList *aux_plots; GList *aux_layers; GList *aux_datasets; SGdataset *parent; gboolean deleting = force; gboolean veto = TRUE; parent = SG_DATASET(gtk_plot_data_get_link(dataset->real_data)); aux_plots = plots; while(aux_plots) { plot = SG_PLOT(aux_plots->data); aux_layers = plot->layers; while(aux_layers){ aux_datasets = SG_LAYER(aux_layers->data)->datasets; while(aux_datasets){ SGdataset *aux_data, *aux_parent; aux_data = SG_DATASET(aux_datasets->data); aux_parent = SG_DATASET(gtk_plot_data_get_link(aux_data->real_data)); if(aux_parent == parent && !deleting){ gchar text[1000]; g_snprintf(text, 1000, "This dataset is being used in plots.\n Do you really want to delete\n%s ?", parent->real_data->name); veto = sg_accept_dialog(text, 1); if(!veto) return FALSE; deleting = TRUE; } if(deleting && aux_parent == parent){ sg_layer_remove_dataset(SG_LAYER(aux_layers->data), aux_data); gtk_plot_canvas_paint(GTK_PLOT_CANVAS(plot->real_canvas)); gtk_plot_canvas_refresh(GTK_PLOT_CANVAS(plot->real_canvas)); aux_datasets = SG_LAYER(aux_layers->data)->datasets; }else{ aux_datasets = aux_datasets->next; } } aux_layers = aux_layers->next; } aux_plots = aux_plots->next; } veto = remove_dataset(parent); return veto; } static gboolean remove_dataset(SGdataset *dataset) { GList *list; if(dataset->type == SG_DATA_FUNCTION){ list = g_list_find(functions, dataset); if(!list) return FALSE; functions = g_list_remove_link(functions, list); num_functions--; } else if(dataset->exp){ list = g_list_find(expressions, dataset); if(!list) return FALSE; expressions = g_list_remove_link(expressions, list); num_expressions--; }else{ list = g_list_find(datasets, dataset); if(!list) return FALSE; datasets = g_list_remove_link(datasets, list); } sg_project_changed(TRUE); if(GTK_IS_OBJECT(dataset)) gtk_object_destroy(GTK_OBJECT(dataset)); g_list_free_1(list); return TRUE; } gboolean sg_project_remove_plot(SGplot *plot) { gboolean veto; veto = remove_plot(plot); if(!veto) return FALSE; if(gui_plot && !plots) gui_plot = FALSE; if(!gui_iconlist && !gui_plot && !gui_worksheet){ main_quit(NULL); } return TRUE; } void sg_project_close() { GList *list; if(gui_iconlist){ #ifndef WITH_GNOME gtk_signal_disconnect_by_data(GTK_OBJECT(iconlist1), iconlist1); gtk_signal_disconnect_by_data(GTK_OBJECT(iconlist2), iconlist2); #endif gtk_icon_list_set_active_icon(GTK_ICON_LIST(iconlist1), NULL); gtk_icon_list_set_active_icon(GTK_ICON_LIST(iconlist2), NULL); } list = plots; while(list){ remove_plot((SGplot *)list->data); list = plots; } list = worksheets; while(list){ remove_worksheet((SGworksheet *)list->data); list = worksheets; } list = datasets; while(list){ datasets = g_list_remove_link(datasets, list); g_list_free_1(list); list = datasets; } list = functions; while(list){ functions = g_list_remove_link(functions, list); g_list_free_1(list); list = functions; } list = expressions; while(list){ expressions = g_list_remove_link(expressions, list); g_list_free_1(list); list = functions; } sg_layer_control_destroy(); sg_clipboard_clear(); sg_dialogs_destroy(NULL); } static gboolean remove_worksheet(SGworksheet *worksheet) { GList *list; SGdataset *dataset = NULL; SGlayer *layer = NULL; SGplot *plot = NULL; gboolean found = FALSE; if(worksheet == NULL) return FALSE; list = plots; while(list){ GList *layers; GList *layer_data; plot = (SGplot *)list->data; layers = plot->layers; while(layers){ layer = (SGlayer *)layers->data; layer_data = layer->datasets; while(layer_data){ dataset = (SGdataset *)layer_data->data; if(dataset->worksheet == worksheet){ found = TRUE; } layer_data = layer_data->next; } layers = layers->next; } list = list->next; } if(found){ gchar message[255]; g_snprintf(message, 255,"The worksheet is connected to active datasets\nAre you sure you want to remove it?"); if( sg_accept_dialog(message, 1) != YES_CLICKED ) return FALSE; } list = g_list_find(worksheets, worksheet); if(!list) return FALSE; sg_project_changed(TRUE); if(gui_iconlist){ gtk_icon_list_remove(worksheet->iconlist, worksheet->icon); gtk_icon_list_update(worksheet->iconlist); } gtk_widget_destroy(GTK_WIDGET(worksheet)); worksheets = g_list_remove_link(worksheets, list); g_list_free_1(list); num_worksheets--; if(num_worksheets == 0) worksheets = NULL; return TRUE; } static gboolean remove_plot(SGplot *plot) { GList *list; if(plot == NULL) return FALSE; list = g_list_find(plots, plot); if(!list) return FALSE; sg_project_changed(TRUE); if(gui_iconlist){ gtk_icon_list_remove(plot->iconlist, plot->icon); gtk_icon_list_update(plot->iconlist); } gtk_widget_destroy(GTK_WIDGET(plot)); plots = g_list_remove_link(plots, list); g_list_free_1(list); num_plots--; if(num_plots == 0) plots = NULL; sg_layer_control_refresh(NULL); return TRUE; } static gboolean rename_worksheet(GtkIconList *iconlist, GtkIconListItem *item) { gchar *name; SGworksheet *worksheet; if(!gui_iconlist) return TRUE; worksheet = (SGworksheet *)gtk_icon_list_get_link(item); name = gtk_entry_get_text(GTK_ENTRY(item->entry)); return (sg_project_rename_worksheet(worksheet, name)); } gint sg_project_rename_worksheet(SGworksheet *worksheet, gchar *name) { GList *list; gint n; gint veto; gboolean accept = FALSE; gboolean free_name = FALSE; while(!name || strlen(name) == 0){ if(free_name) g_free(name); free_name = FALSE; name = sg_text_dialog("The worksheet must have a name.\nPlease enter a name:", 1); free_name = TRUE; } list = worksheets; while(!accept){ gboolean new_name = FALSE; while(list){ SGworksheet *data; data = (SGworksheet *)list->data; if(data != worksheet && strcmp(data->name, name) == 0){ if(free_name) g_free(name); name = NULL; free_name = FALSE; while(!name || strlen(name) == 0){ name = sg_text_dialog("Another worksheet has the same name.\nPlease enter a new name for this worksheet:", 1); } free_name = TRUE; new_name = TRUE; break; } new_name = FALSE; list = list->next; } if(!new_name) accept = TRUE; } for(n = 0; n < strlen(name); n++){ if(name[n] < 'a' || name[n] > 'z') if(name[n] < 'A' || name[n] > 'Z') if(name[n] < '0' || name[n] > '9') if(name[n] != '.' && name[n] != '_' && name[n] != '-' && name[n] != '+' && name[n] != '='){ name[n] = '_'; /* sg_message_dialog("The name contains invalid characters", 0); return FALSE; */ } } veto = sg_worksheet_rename(worksheet, name); if(veto){ sg_project_refresh_datasets(); sg_project_changed(TRUE); } if(free_name) g_free(name); return TRUE; } static gboolean rename_plot(GtkIconList *iconlist, GtkIconListItem *item) { gchar *name; SGplot *plot; if(!gui_iconlist) return TRUE; plot = (SGplot *)gtk_icon_list_get_link(item); name = gtk_entry_get_text(GTK_ENTRY(item->entry)); return(sg_project_rename_plot(plot, name)); } gint sg_project_rename_plot(SGplot *plot, gchar *name) { GList *list; gint n; gint veto; gboolean accept = FALSE; gboolean free_name = FALSE; while(!name || strlen(name) == 0){ if(free_name) g_free(name); free_name = FALSE; name = sg_text_dialog("The plot must have a name.\nPlease enter a name for this plot:", 1); free_name = TRUE; } list = plots; while(!accept){ gboolean new_name = FALSE; while(list){ SGplot *data; data = (SGplot *)list->data; if(data != plot && strcmp(data->name, name) == 0){ if(free_name) g_free(name); name = NULL; free_name = FALSE; while(!name || strlen(name) == 0){ name = sg_text_dialog("Another plot has the same name.\nPlease enter a new name for this plot:", 1); } free_name = TRUE; new_name = TRUE; break; } new_name = FALSE; list = list->next; } if(!new_name) accept = TRUE; } for(n = 0; n < strlen(name); n++){ if(name[n] < 'a' || name[n] > 'z') if(name[n] < 'A' || name[n] > 'Z') if(name[n] < '0' || name[n] > '9') if(name[n] != '.' && name[n] != '_' && name[n] != '-' && name[n] != '+' && name[n] != '='){ name[n] = '_'; /* sg_message_dialog("The name contains invalid characters", 0); return FALSE; */ } } veto = sg_plot_rename(plot, name); if(veto) sg_project_changed(TRUE); if(free_name) g_free(name); return TRUE; } void sg_project_open_worksheet(GtkWidget *widget, GtkIconListItem *item, GdkEvent *event, gpointer data) { GtkIconList *iconlist; SGworksheet *worksheet; GdkModifierType mods; iconlist = GTK_ICON_LIST(widget); /* sg_layer_control_destroy(); */ gdk_window_get_pointer(widget->window, NULL, NULL, &mods); worksheet = (SGworksheet *)gtk_icon_list_get_link(item); if(!event) return; if((mods & GDK_BUTTON1_MASK) && event->type == GDK_2BUTTON_PRESS) { gtk_widget_show(GTK_WIDGET(worksheet)); gdk_window_raise(GTK_WIDGET(worksheet)->window); } if(mods & GDK_BUTTON3_MASK) sg_worksheet_popup_show(item,(GdkEventButton *)event); active_worksheet = worksheet; return; } void sg_project_open_plot(GtkWidget *widget, GtkIconListItem *item, GdkEvent *event, gpointer data) { GtkIconList *iconlist; SGplot *plot; GdkModifierType mods; iconlist = GTK_ICON_LIST(widget); gdk_window_get_pointer(widget->window, NULL, NULL, &mods); plot = (SGplot *)gtk_icon_list_get_link(item); if(!event) return; if((mods & GDK_BUTTON1_MASK) && event->type == GDK_2BUTTON_PRESS){ gtk_widget_show(GTK_WIDGET(plot)); gdk_window_raise(GTK_WIDGET(plot)->window); } if(mods & GDK_BUTTON3_MASK) sg_plot_popup_show(item,(GdkEventButton *)event); active_plot = plot; return; } SGworksheet * sg_project_get_worksheet (gchar *name) { SGworksheet *worksheet; GList *list; if(!name || !strcmp(name,"current")) return active_worksheet; list = worksheets; while(list){ worksheet = (SGworksheet *) list->data; if(strcmp(worksheet->name, name) == 0) return worksheet; list = list->next; } return NULL; } SGplot * sg_project_get_plot (gchar *name) { SGplot *plot; GList *list; if(!name) return active_plot; list = plots; while(list){ plot = (SGplot *) list->data; if(strcmp(plot->name, name) == 0) return plot; list = list->next; } return NULL; } void sg_project_refresh_datasets() { GList *list; list = plots; while(list){ SGplot *plot; plot = (SGplot *)list->data; sg_plot_refresh_datasets(plot); list = list->next; } } static SGdataset * find_data_by_id(GList *list, gint id) { GList *aux = list; SGdataset *dataset = NULL; while(aux){ SGdataset *aux_data; aux_data = (SGdataset *)aux->data; if(aux_data && aux_data->id == id){ dataset = aux_data; break; } aux = aux->next; } return dataset; } SGdataset * sg_project_dataset_get_by_id(gint id) { return(find_data_by_id(datasets, id)); } SGdataset * sg_project_function_get_by_id(gint id) { return(find_data_by_id(functions, id)); } SGdataset * sg_project_expression_get_by_id(gint id) { return(find_data_by_id(expressions, id)); } static gint delete_event(GtkWidget *widget) { if(GTK_IS_SG_PLOT(widget)){ SGplot *plot = SG_PLOT(widget); sg_layer_control_destroy(); gdk_window_get_position(widget->window, &plot->x, &plot->y); gdk_window_get_size(widget->window, &plot->width, &plot->height); } else if(GTK_IS_SG_WORKSHEET(widget)){ SGworksheet *worksheet = SG_WORKSHEET(widget); gdk_window_get_position(widget->window, &worksheet->x, &worksheet->y); gdk_window_get_size(widget->window, &worksheet->width, &worksheet->height); } gtk_widget_hide(widget); return TRUE; } static gboolean focus_in_event(GtkWidget *widget, GdkEventFocus *event) { GList *list = NULL; gchar msg[80]; if(GTK_IS_SG_PLOT(widget)){ list = plots; while(list) { SGplot *plot; plot = SG_PLOT(list->data); if(GTK_WIDGET(plot) == widget){ active_plot = plot; break; } list = list->next; } #ifdef WITH_GNOME g_snprintf(msg,80,"Active plot is %s", active_plot->name); if(gui_iconlist) gnome_app_flash(GNOME_APP(main_window), msg); #else /* Do something equivalent for gtk!*/ #endif gtk_plot_canvas_refresh(GTK_PLOT_CANVAS(active_plot->real_canvas)); } else if(GTK_IS_SG_WORKSHEET(widget)){ list = worksheets; while(list) { SGworksheet *worksheet; worksheet = SG_WORKSHEET(list->data); if(GTK_WIDGET(worksheet) == widget){ active_worksheet = worksheet; break; } list = list->next; } #ifdef WITH_GNOME g_snprintf(msg,80,"Active sheet is %s", active_worksheet->name); if(gui_iconlist) gnome_app_flash(GNOME_APP(main_window), msg); #else /* Do something equivalent for gtk!*/ #endif } return FALSE; }