/* * dbMetrix Database Tool v0.1 * Copyright (c) 1998 David E. Storey * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "global.h" typedef struct { GtkWidget *textbox; char *title; char *filename; int modified_since_save; } node_query; int pageNum = 0; void query_modified_cb(GtkWidget *text, gpointer data); void query_open_cb(GtkWidget *file_selection, gpointer data); void query_save_as_cb(GtkWidget *widget, gpointer data); void query_set_names(node_query *queryInfo, char *filename); void query_close(GtkWidget *widget, gpointer data) { int curpage = gtk_notebook_current_page(GTK_NOTEBOOK(qbNotebook)); GtkWidget *nbPage; node_query *queryInfo = NULL; if (!GTK_NOTEBOOK(qbNotebook)->cur_page) return; nbPage = GTK_NOTEBOOK(qbNotebook)->cur_page->child; queryInfo = gtk_object_get_data(GTK_OBJECT(nbPage), "queryInfo"); if (queryInfo) { if (queryInfo->filename) g_free(queryInfo->filename); if (queryInfo->title) g_free(queryInfo->title); g_free(queryInfo); } gtk_notebook_remove_page(GTK_NOTEBOOK(qbNotebook), curpage); } void query_execute(GtkWidget *widget, gpointer data) { node_ds *nodeInfo = fetch_selected(); if (nodeInfo) { if (dsFuncs[nodeInfo->conn->class].exec_query) { node_query *queryInfo = gtk_object_get_data(GTK_OBJECT(GTK_NOTEBOOK(qbNotebook)->cur_page->child), "queryInfo"); char *query = gtk_editable_get_chars(GTK_EDITABLE(queryInfo->textbox), 0, -1); dsFuncs[nodeInfo->conn->class].exec_query(nodeInfo->conn, query); g_free(query); } else s_print("data source has no execution mechanism (yet?)"); } else s_print("nothing selected"); } void query_new(GtkWidget *widget, gpointer data) { GtkWidget *vscrollbar; GtkWidget *textbox; GtkWidget *hbox; GtkWidget *label; node_query *queryInfo = NULL; queryInfo = (node_query *)g_malloc(sizeof(node_query)); queryInfo->filename = NULL; queryInfo->title = NULL; queryInfo->modified_since_save = FALSE; query_set_names(queryInfo, (char *)data); hbox = gtk_hbox_new(FALSE, 0); gtk_object_set_data(GTK_OBJECT(hbox), "queryInfo", queryInfo); gtk_widget_show(hbox); textbox = gtk_text_new(NULL, NULL); gtk_text_set_editable(GTK_TEXT(textbox), TRUE); gtk_box_pack_start(GTK_BOX(hbox), textbox, TRUE, TRUE, 0); gtk_signal_connect(GTK_OBJECT(textbox), "changed", GTK_SIGNAL_FUNC(query_modified_cb), queryInfo); gtk_widget_show(textbox); queryInfo->textbox = textbox; vscrollbar = gtk_vscrollbar_new(GTK_TEXT(textbox)->vadj); gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, TRUE, 0); gtk_widget_show(vscrollbar); label = gtk_label_new(queryInfo->title); gtk_notebook_append_page(GTK_NOTEBOOK(qbNotebook), hbox, label); /* populate textbox */ if (data) { char *file = (char *)data; char str[256]; FILE *fd = fopen(file, "r"); if (!fd) { s_print("could not open file."); return; } gtk_widget_realize(textbox); gtk_text_freeze(GTK_TEXT(textbox)); do { if (fgets(str, 256, fd) == NULL) break; gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, str, strlen(str)); } while (!feof(fd)); gtk_text_thaw(GTK_TEXT(textbox)); fclose(fd); } gtk_notebook_set_page(GTK_NOTEBOOK(qbNotebook), g_list_length(GTK_NOTEBOOK(qbNotebook)->children) - 1); } void query_open(GtkWidget *widget, gpointer data) { GtkWidget *file_selection = gtk_file_selection_new("Open Query"); gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_selection)->ok_button), "clicked", GTK_SIGNAL_FUNC(query_open_cb), GTK_OBJECT(file_selection)); gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_selection)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(file_selection)); gtk_widget_show(file_selection); } void query_open_cb(GtkWidget *file_selection, gpointer data) { char *file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selection)); query_new(NULL, file); gtk_widget_destroy(file_selection); } void query_save(GtkWidget *widget, gpointer data) { node_query *queryInfo; if (!GTK_NOTEBOOK(qbNotebook)->cur_page) return; queryInfo = (node_query *) (data ? data : gtk_object_get_data(GTK_OBJECT(GTK_NOTEBOOK(qbNotebook)->cur_page->child), "queryInfo")); if (queryInfo->filename) { FILE *fd = fopen(queryInfo->filename, "w"); char *query = gtk_editable_get_chars(GTK_EDITABLE(queryInfo->textbox), 0, -1); if (!query) return; if (fd) { if (!fwrite(query, strlen(query), 1, fd)) s_print(strerror(errno)); else { char message[256]; g_snprintf(message, 256, "'%s' successfully saved", queryInfo->title); queryInfo->modified_since_save = FALSE; s_print(message); } fclose(fd); } else s_print(strerror(errno)); g_free(query); } else query_save_as(widget, (gpointer)queryInfo); } void query_save_as(GtkWidget *widget, gpointer data) { node_query *queryInfo; GtkWidget *file_selection; char message[256]; if (!GTK_NOTEBOOK(qbNotebook)->cur_page) return; queryInfo = (node_query *) (data ? data : gtk_object_get_data(GTK_OBJECT(GTK_NOTEBOOK(qbNotebook)->cur_page->child), "queryInfo")); g_snprintf(message, 256, "Save query '%s' as", queryInfo->title); file_selection = gtk_file_selection_new(message); gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_selection)->ok_button), "clicked", GTK_SIGNAL_FUNC(query_save_as_cb), GTK_OBJECT(file_selection)); gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(file_selection)->cancel_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(file_selection)); gtk_object_set_data(GTK_OBJECT(file_selection), "info", (gpointer)queryInfo); gtk_object_set_data(GTK_OBJECT(file_selection), "nbPage", (gpointer)GTK_NOTEBOOK(qbNotebook)->cur_page); gtk_widget_show(file_selection); } void query_save_as_cb(GtkWidget *file_selection, gpointer data) { char *file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selection)); GtkNotebookPage *nbPage = (GtkNotebookPage *)gtk_object_get_data(GTK_OBJECT(file_selection), "nbPage"); node_query *queryInfo = (node_query *)gtk_object_get_data(GTK_OBJECT(file_selection), "info"); if (!queryInfo || !file || !file[0]) return; query_set_names(queryInfo, file); query_save(NULL, queryInfo); if (queryInfo->modified_since_save) gtk_label_set(GTK_LABEL(nbPage->tab_label), queryInfo->title); gtk_widget_destroy(file_selection); } void query_modified_cb(GtkWidget *text, gpointer data) { node_query *queryInfo = (node_query *)data; if (queryInfo) queryInfo->modified_since_save = TRUE; } void query_set_names(node_query *queryInfo, char *filename) { char queryTitle[256]; if (!queryInfo) return; if (queryInfo->filename) g_free(queryInfo->filename); if (queryInfo->title) g_free(queryInfo->title); if (filename) { char *lpos = strrchr(filename, '/'); g_snprintf(queryTitle, 256, "%s", lpos ? ++lpos : filename); queryInfo->filename = g_strdup(filename); } else { g_snprintf(queryTitle, 256, "query%d", pageNum++); queryInfo->filename = NULL; } queryInfo->title = g_strdup(queryTitle); } void query_window(GtkWidget *clist) { GtkWidget *dWindow; GtkWidget *button; int width, height; if (!clist) return; width = (int)gtk_object_get_data(GTK_OBJECT(clist), "width"); height = (int)gtk_object_get_data(GTK_OBJECT(clist), "height"); dWindow = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dWindow), "Query Result"); gtk_widget_set_usize(GTK_DIALOG(dWindow)->action_area, -1, 32); gtk_container_border_width(GTK_CONTAINER(GTK_DIALOG(dWindow)->action_area), 4); gtk_container_border_width(GTK_CONTAINER(GTK_DIALOG(dWindow)->vbox), 4); gtk_widget_show(dWindow); /* action area buttons */ button = gtk_button_new_with_label("Ok"); gtk_signal_connect_object(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(dWindow)); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dWindow)->action_area), button, TRUE, TRUE, 0); gtk_widget_show(button); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_column_titles_show(GTK_CLIST(clist)); gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE); if (width && height) { width = (width > 500) ? 500 : width; height = (height > 25) ? 400 : height * 25; gtk_widget_set_usize(clist, width, height); } gtk_widget_show(clist); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dWindow)->vbox), clist, TRUE, TRUE, 0); gtk_widget_show(dWindow); }