gui_tools.c
来自「网络爬虫程序」· C语言 代码 · 共 949 行 · 第 1/2 页
C
949 行
/***************************************************************************//* This code is part of WWW grabber called pavuk *//* Copyright (c) 1997 - 2001 Stefan Ondrejicka *//* Distributed under GPL 2 or later *//***************************************************************************/#include "config.h"#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <unistd.h>#ifdef GTK_FACE#include "gui.h"#include "icons/append.xpm"#include "icons/ok.xpm"#include "icons/browse.xpm"#include "icons/clear.xpm"#include "icons/delete.xpm"#include "icons/modify.xpm"GtkWidget *guitl_timesel_new(GtkWidget ** calendar, GtkWidget ** hour_entry, GtkWidget ** min_entry, GtkWidget ** month_combo, GtkWidget ** year_entry){ GtkWidget *col, *frame, *brow, *label; GtkAdjustment *adj; col = gtk_vbox_new(0, 10); gtk_widget_show(col); frame = gtk_frame_new(NULL); gtk_widget_show(frame); gtk_box_pack_start(GTK_BOX(col), frame, FALSE, FALSE, 5); *calendar = gtk_calendar_new(); gtk_widget_show(*calendar); gtk_container_add(GTK_CONTAINER(frame), *calendar); gtk_calendar_display_options(GTK_CALENDAR(*calendar), GTK_CALENDAR_SHOW_HEADING | GTK_CALENDAR_SHOW_DAY_NAMES); *year_entry = NULL; *month_combo = NULL; brow = gtk_hbox_new(0, 5); gtk_widget_show(brow); gtk_box_pack_start(GTK_BOX(col), brow, FALSE, FALSE, 4); label = gtk_label_new(gettext("Time: ")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(brow), label, FALSE, FALSE, 0); adj = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 23.0, 1.0, 5.0, 0.0); *hour_entry = gtk_spin_button_new(adj, 0, 0); gtk_widget_show(*hour_entry); gtk_box_pack_start(GTK_BOX(brow), *hour_entry, FALSE, FALSE, 0); label = gtk_label_new(gettext(" : ")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(brow), label, FALSE, FALSE, 0); adj = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 59.0, 1.0, 5.0, 0.0); *min_entry = gtk_spin_button_new(adj, 0, 0); gtk_widget_show(*min_entry); gtk_box_pack_start(GTK_BOX(brow), *min_entry, FALSE, FALSE, 0); return col;}GtkWidget *guitl_tab_add_entry(GtkWidget * table, char *label, guint col, guint row, guint passw){ GtkWidget *entry, *labelw; labelw = gtk_label_new(label); gtk_misc_set_alignment(GTK_MISC(labelw), 0, 0.5); gtk_table_attach(GTK_TABLE(table), labelw, col, col + 1, row, row + 1, GTK_FILL | GTK_SHRINK, GTK_FILL, 2, 2); gtk_widget_show(labelw); entry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), entry, col + 1, col + 2, row, row + 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); if(passw) gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE); gtk_widget_show(entry); return entry;}GtkWidget *guitl_tab_add_numentry(GtkWidget * table, char *label, guint col, guint row, guint max_val){ GtkWidget *entry, *labelw; GtkAdjustment *adj; GdkFont *font; labelw = gtk_label_new(label); gtk_misc_set_alignment(GTK_MISC(labelw), 0, 0.5); gtk_table_attach(GTK_TABLE(table), labelw, col, col + 1, row, row + 1, GTK_FILL | GTK_SHRINK, GTK_FILL, 2, 2); gtk_widget_show(labelw); adj = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, (float) max_val, 1.0, 5.0, 0.0); entry = gtk_spin_button_new(adj, 0, 0); gtk_table_attach(GTK_TABLE(table), entry, col + 1, col + 2, row, row + 1, 0, GTK_FILL, 2, 2);#if GTK_FACE < 2 font = entry->style->font;#else font = gtk_style_get_font(entry->style);#endif gtk_widget_set_usize(entry, gdk_string_width(font, "000000000"), -1); gtk_widget_show(entry); return entry;}GtkWidget *guitl_tab_add_doubleentry(GtkWidget * table, char *label, guint col, guint row, guint max_val, guint decimals){ GtkWidget *entry, *labelw; GtkAdjustment *adj; GdkFont *font; labelw = gtk_label_new(label); gtk_misc_set_alignment(GTK_MISC(labelw), 0, 0.5); gtk_table_attach(GTK_TABLE(table), labelw, col, col + 1, row, row + 1, GTK_FILL | GTK_SHRINK, GTK_FILL, 2, 2); gtk_widget_show(labelw); adj = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, (float) max_val, 1.0, 5.0, 0.0); entry = gtk_spin_button_new(adj, 0, decimals); gtk_table_attach(GTK_TABLE(table), entry, col + 1, col + 2, row, row + 1, 0, GTK_FILL, 2, 2);#if GTK_FACE < 2 font = entry->style->font;#else font = gtk_style_get_font(entry->style);#endif gtk_widget_set_usize(entry, gdk_string_width(font, "000000000.000"), -1); gtk_widget_show(entry); return entry;}GtkWidget *guitl_tab_add_enum(GtkWidget * table, char *label, guint col, guint row, const char **vals, guint edit){ GtkWidget *entry, *labelw; GList *ptr; int i; labelw = gtk_label_new(label); gtk_misc_set_alignment(GTK_MISC(labelw), 0, 0.5); gtk_table_attach(GTK_TABLE(table), labelw, col, col + 1, row, row + 1, GTK_FILL | GTK_SHRINK, GTK_FILL, 2, 2); gtk_widget_show(labelw); entry = gtk_combo_new(); ptr = NULL; for(i = 0; vals[i]; i++) ptr = g_list_append(ptr, (char *) vals[i]); gtk_combo_set_popdown_strings(GTK_COMBO(entry), ptr); gtk_table_attach(GTK_TABLE(table), entry, col + 1, col + 2, row, row + 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); gtk_widget_show(entry); while(ptr) ptr = g_list_remove_link(ptr, ptr); return GTK_COMBO(entry)->entry;}static void DestroyW(GtkObject * object, gpointer func_data){ gtk_widget_destroy(GTK_WIDGET(func_data));}struct edit_entry_info{ GtkWidget *entry; GtkWidget *tl; GtkWidget *list; GtkWidget *list_entry; char *label; char *tlabel; guint quoted;};static void edit_entry_ok(GtkWidget * w, struct edit_entry_info *info){ char *p = NULL; char *pom; int i; for(i = 0; i < GTK_CLIST(info->list)->rows; i++) { gtk_clist_get_text(GTK_CLIST(info->list), i, 0, &pom); if(info->quoted) { char *p1; p1 = escape_str(pom, "\\\""); p = tl_str_concat(p, p ? " " : "", "\"", p1, "\"", NULL); _free(p1); } else p = tl_str_concat(p, p ? "," : "", pom, NULL); } gtk_entry_set_text(GTK_ENTRY(info->entry), p ? p : ""); _free(p); gtk_widget_destroy(info->tl);}static void edit_entry_start_edit(GtkWidget * w, struct edit_entry_info *info){ const char *p; if(!info->tl) { GtkWidget *brow, *col, *button, *frame; char pom[2048]; snprintf(pom, sizeof(pom), gettext("Pavuk: edit %s"), info->tlabel ? info->tlabel : gettext("entry")); info->tl = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_border_width(GTK_CONTAINER(info->tl), 5); gtk_window_set_title(GTK_WINDOW(info->tl), pom); gtk_signal_connect(GTK_OBJECT(info->tl), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &(info->tl)); col = gtk_vbox_new(FALSE, 2); gtk_container_add(GTK_CONTAINER(info->tl), col); gtk_widget_show(col); frame = gtk_frame_new(NULL); gtk_container_add(GTK_CONTAINER(col), frame); gtk_widget_show(frame); brow = guitl_new_edit_list(&info->list, &info->list_entry, info->label, NULL, NULL, NULL, NULL, TRUE, NULL); gtk_container_add(GTK_CONTAINER(frame), brow); gtk_widget_show(brow); brow = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(brow), GTK_BUTTONBOX_SPREAD); gtk_box_pack_end(GTK_BOX(col), brow, FALSE, FALSE, 1); gtk_widget_show(brow); button = guitl_pixmap_button(ok_xpm, NULL, gettext("OK")); gtk_container_add(GTK_CONTAINER(brow), button); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(edit_entry_ok), (gpointer) info); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_grab_default(button); gtk_widget_show(button); button = guitl_pixmap_button(ok_xpm, NULL, gettext("Cancel")); gtk_container_add(GTK_CONTAINER(brow), button); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(DestroyW), (gpointer) info->tl); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); gtk_widget_grab_default(button); gtk_widget_show(button); } p = gtk_entry_get_text(GTK_ENTRY(info->entry)); gtk_clist_clear(GTK_CLIST(info->list)); if(info->quoted) { if(*p == '\"') { for(p = get_1qstr(p); p; p = get_1qstr(NULL)) gtk_clist_append(GTK_CLIST(info->list), (gchar **) &p); } else if(*p) gtk_clist_append(GTK_CLIST(info->list), (gchar **) &p); } else { char **v; int i; v = tl_str_split(p, ","); for(i = 0; v && v[i]; i++) gtk_clist_append(GTK_CLIST(info->list), &(v[i])); tl_strv_free(v); } if(GTK_WIDGET_REALIZED(info->tl)) gdk_window_raise(info->tl->window); gtk_widget_show(info->tl);}static void edit_entry_info_destroy(GtkWidget * w, struct edit_entry_info *info){ if(info->tl) { gtk_signal_disconnect_by_func(GTK_OBJECT(info->tl), GTK_SIGNAL_FUNC(gtk_widget_destroyed), &(info->tl)); gtk_widget_destroy(info->tl); } _free(info->label); _free(info->tlabel); _free(info);}static void edit_entry_info_hide(GtkWidget * w, struct edit_entry_info *info){ if(info->tl) gtk_widget_destroy(info->tl);}GtkWidget *guitl_tab_add_edit_entry(GtkWidget * table, char *label, char *elabel, guint col, guint row, guint quoted){ GtkWidget *entry, *labelw, *pom, *button, *box; struct edit_entry_info *info; int ofs = 0; info = _malloc(sizeof(struct edit_entry_info)); memset(info, '\0', sizeof(struct edit_entry_info)); info->tlabel = elabel ? tl_strdup(elabel) : (label ? tl_strndup(label, strlen(label) - 2) : NULL); info->label = tl_strdup(label); info->quoted = quoted; box = gtk_hbox_new(0, 0); gtk_widget_show(box); gtk_table_attach(GTK_TABLE(table), box, col, col + 1, row, row + 1, GTK_FILL | GTK_SHRINK, GTK_FILL, 2, 2); if(label) { labelw = gtk_label_new(label); gtk_box_pack_start(GTK_BOX(box), labelw, FALSE, TRUE, 0); gtk_misc_set_alignment(GTK_MISC(labelw), 0.0, 0.5); gtk_widget_show(labelw); ofs = 1; } pom = gtk_hbox_new(FALSE, 0); gtk_widget_show(pom); gtk_table_attach(GTK_TABLE(table), pom, col + ofs, col + ofs + 1, row, row + 1, GTK_FILL | GTK_EXPAND, GTK_FILL, 2, 2); info->entry = entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(pom), entry, TRUE, TRUE, 0); gtk_widget_show(entry); gtk_signal_connect(GTK_OBJECT(entry), "destroy", GTK_SIGNAL_FUNC(edit_entry_info_destroy), (gpointer) info); gtk_signal_connect(GTK_OBJECT(gtk_widget_get_toplevel(GTK_WIDGET(entry))), "hide", GTK_SIGNAL_FUNC(edit_entry_info_hide), (gpointer) info); button = guitl_pixmap_button(browse_xpm, NULL, gettext("Edit ...")); gtk_box_pack_end(GTK_BOX(pom), button, FALSE, TRUE, 2); gtk_widget_show(button); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(edit_entry_start_edit), (gpointer) info); return entry;}struct path_entry_info{ GtkWidget *entry; GtkWidget *fs; char *label; char *fslabel; int isdir;};static void SetFileEntry(GtkObject * object, struct path_entry_info *info){ const gchar *p; gboolean ok = TRUE; p = gtk_file_selection_get_filename(GTK_FILE_SELECTION(info->fs)); if(!info->isdir) { struct stat estat; if(!stat(p, &estat) && !S_ISREG(estat.st_mode)) ok = FALSE; } if(ok) { gtk_entry_set_text(GTK_ENTRY(info->entry), p); gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(object))); } else { gdk_beep(); }}static void GetFile(GtkObject * object, struct path_entry_info *info){ if(!info->fs) { const gchar *p; char pom[2048]; snprintf(pom, sizeof(pom), gettext("Pavuk: select %s"), info->label ? info->label : gettext("file")); info->fs = gtk_file_selection_new(info->fslabel ? info->fslabel : pom); if(info->isdir) gtk_widget_set_sensitive(GTK_FILE_SELECTION(info->fs)->file_list, FALSE); gtk_signal_connect(GTK_OBJECT(info->fs), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &(info->fs)); p = gtk_entry_get_text(GTK_ENTRY(info->entry)); if(p && p[0]) gtk_file_selection_set_filename(GTK_FILE_SELECTION(info->fs), p); gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(info->fs)->ok_button), "clicked", GTK_SIGNAL_FUNC(SetFileEntry), (gpointer) info); gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(info->fs)-> cancel_button), "clicked", GTK_SIGNAL_FUNC(DestroyW), (gpointer) info->fs); } if(GTK_WIDGET_REALIZED(info->fs)) gdk_window_raise(info->fs->window); gtk_widget_show(info->fs);}static void path_entry_info_destroy(GtkWidget * w, struct path_entry_info *info){ if(info->fs) { gtk_signal_disconnect_by_func(GTK_OBJECT(info->fs), GTK_SIGNAL_FUNC(gtk_widget_destroyed), &(info->fs)); gtk_widget_destroy(info->fs); } _free(info->label); _free(info->fslabel); _free(info);}static void path_entry_info_hide(GtkWidget * w, struct path_entry_info *info){ if(info->fs) gtk_widget_destroy(info->fs);}GtkWidget *guitl_tab_add_path_entry_full(GtkWidget * table, char *label, guint col, guint row, int dir, char *fslabel){ GtkWidget *entry, *labelw, *pom, *button, *box; struct path_entry_info *info;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?