📄 mywidget.cc
字号:
/* WebDownloader for X-Window * Copyright (C) 1999-2002 Koshelev Maxim * This Program is free but not GPL!!! You can't modify it * without agreement with author. You can't distribute modified * program but you can distribute unmodified program. * * 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. */#include "mywidget.h"#include "edit.h"#include "misc.h"#include "../ntlocale.h"#include "../filter.h"static GtkWidgetClass *parent_class = (GtkWidgetClass *)NULL;static GtkWidgetClass *color_parent_class = (GtkWidgetClass *)NULL;static GtkWidgetClass *rule_parent_class = (GtkWidgetClass *)NULL;static GtkWidgetClass *filter_parent_class = (GtkWidgetClass *)NULL;static GtkWidgetClass *filtersel_parent_class = (GtkWidgetClass *)NULL;static GtkWidgetClass *linkssel_parent_class = (GtkWidgetClass *)NULL;static GtkWidgetClass *stringedit_parent_class = (GtkWidgetClass *)NULL;static void my_gtk_filesel_destroy_browser(MyGtkFilesel *filesel){ if (filesel->browser){ gtk_widget_destroy(filesel->browser); filesel->browser=(GtkWidget *)NULL; };};static gint my_gtk_filesel_ok(GtkButton *button,MyGtkFilesel *filesel){ g_return_val_if_fail(filesel!=NULL,FALSE); if (filesel->browser){ text_to_combo(filesel->combo, gtk_file_selection_get_filename(GTK_FILE_SELECTION(filesel->browser))); my_gtk_filesel_destroy_browser(filesel); }; return TRUE;};static gint my_gtk_filesel_cancel(GtkButton *button,MyGtkFilesel *filesel){ g_return_val_if_fail(filesel!=NULL,FALSE); my_gtk_filesel_destroy_browser(filesel); return TRUE;};static gint my_gtk_filesel_delete(GtkWidget *window,GdkEvent *event, MyGtkFilesel *filesel) { my_gtk_filesel_cancel((GtkButton *)NULL,filesel); return TRUE;};static gint my_gtk_filesel_init_browser(GtkButton *button, MyGtkFilesel *filesel){ g_return_val_if_fail(filesel!=NULL,FALSE); if (filesel->browser){ gdk_window_show(filesel->browser->window); }else{ if (filesel->only_dirs){ filesel->browser=gtk_file_selection_new((gchar*)_("Select directory")); gtk_widget_set_sensitive(GTK_FILE_SELECTION(filesel->browser)->file_list,FALSE); }else filesel->browser=gtk_file_selection_new((gchar*)_("Select file")); gtk_window_set_wmclass(GTK_WINDOW(filesel->browser), "D4X_FileSel","D4X"); char *tmp=text_from_combo(filesel->combo); if (tmp && *tmp) gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel->browser),tmp); g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel->browser)->ok_button), "clicked",G_CALLBACK(my_gtk_filesel_ok),filesel); g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel->browser)->cancel_button), "clicked",G_CALLBACK(my_gtk_filesel_cancel),filesel); g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(filesel->browser)), "delete_event",G_CALLBACK(my_gtk_filesel_delete),filesel); gtk_widget_show(filesel->browser); d4x_eschandler_init(filesel->browser,filesel); if (filesel->modal){ gtk_window_set_modal (GTK_WINDOW(filesel->browser),TRUE); gtk_window_set_transient_for (GTK_WINDOW (filesel->browser), filesel->modal); }; }; return TRUE;};static void my_gtk_filsel_destroy(GtkObject *widget){ g_return_if_fail(widget!=NULL); MyGtkFilesel *filesel=(MyGtkFilesel *)widget; my_gtk_filesel_destroy_browser(filesel); if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (widget);};static void my_gtk_filesel_class_init(MyGtkFileselClass *klass){ GtkObjectClass *object_class=(GtkObjectClass *)klass; object_class->destroy=my_gtk_filsel_destroy; parent_class=(GtkWidgetClass *)gtk_type_class(gtk_box_get_type());};static void my_gtk_filesel_init(MyGtkFilesel *filesel){ filesel->browser=(GtkWidget *)NULL; filesel->combo=gtk_combo_new(); filesel->only_dirs=0; filesel->modal=(GtkWindow *)NULL; GtkWidget *button=gtk_button_new_with_label(_("Browse")); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(my_gtk_filesel_init_browser),filesel); gtk_combo_set_case_sensitive(GTK_COMBO(filesel->combo),TRUE); gtk_box_set_spacing(GTK_BOX(filesel),5); gtk_box_pack_start(GTK_BOX(filesel),filesel->combo,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(filesel),button,FALSE,FALSE,0);};guint my_gtk_filesel_get_type(){ static guint my_filesel_type=0; if (!my_filesel_type){ GTypeInfo my_filesel_info={ sizeof(MyGtkFileselClass), NULL,NULL, (GClassInitFunc)my_gtk_filesel_class_init, NULL,NULL, sizeof(MyGtkFilesel), 0, (GInstanceInitFunc)my_gtk_filesel_init }; my_filesel_type = g_type_register_static (GTK_TYPE_HBOX,"MyGtkFilesel",&my_filesel_info,(GTypeFlags)0); }; return my_filesel_type;};GtkWidget *my_gtk_filesel_new(tHistory *history){ MyGtkFilesel *filesel=(MyGtkFilesel *)g_object_new(my_gtk_filesel_get_type(),NULL); GList *list=make_glist_from_mylist(history); if (list){ gtk_combo_set_popdown_strings (GTK_COMBO (filesel->combo), list); g_list_free(list); }; return GTK_WIDGET(filesel);};/* ------------------ Color selection widget --------------------*/static void my_gtk_colorsel_destroy_browser(MyGtkColorsel *colsel){ if (colsel->browser){ gtk_widget_destroy(colsel->browser); colsel->browser=(GtkWidget *)NULL; };};static void my_gtk_colorsel_expose(GtkWidget *widget,GdkEventExpose *event,MyGtkColorsel *colsel){ gint w=widget->allocation.width,h=widget->allocation.height; guchar *buf=g_new(guchar,3*w*h); gint i=0; for (int y=0;y<h;y++){ for (int x=0;x<w;x++){ buf[i]=0; buf[i++]=colsel->color.red/0xff; buf[i++]=colsel->color.green/0xff; buf[i++]=colsel->color.blue/0xff; }; }; gdk_draw_rgb_image(widget->window,widget->style->black_gc, 0,0,w,h, GDK_RGB_DITHER_NORMAL, buf,3*w); g_free(buf);};static gint my_gtk_colorsel_ok(GtkButton *button,MyGtkColorsel *colsel){ g_return_val_if_fail(colsel!=NULL,FALSE); if (colsel->browser){ gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(colsel->browser)->colorsel), &(colsel->color)); gtk_widget_queue_draw (colsel->preview); my_gtk_colorsel_destroy_browser(colsel); }; return TRUE;};static gint my_gtk_colorsel_cancel(GtkButton *button,MyGtkColorsel *colsel){ g_return_val_if_fail(colsel!=NULL,FALSE); my_gtk_colorsel_destroy_browser(colsel); return TRUE;};static gint my_gtk_colorsel_delete(GtkWidget *window,GdkEvent *event, MyGtkColorsel *colsel) { my_gtk_colorsel_cancel((GtkButton *)NULL,colsel); return TRUE;};static gint my_gtk_colorsel_init_browser(GtkButton *button, MyGtkColorsel *colsel){ g_return_val_if_fail(colsel!=NULL,FALSE); if (colsel->browser){ gdk_window_show(colsel->browser->window); }else{ colsel->browser=gtk_color_selection_dialog_new(_("Select color")); gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(colsel->browser)->colorsel), &(colsel->color)); g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(colsel->browser)->ok_button), "clicked",G_CALLBACK(my_gtk_colorsel_ok),colsel); g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(colsel->browser)->cancel_button), "clicked",G_CALLBACK(my_gtk_colorsel_cancel),colsel); g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(colsel->browser)), "delete_event",G_CALLBACK(my_gtk_colorsel_delete),colsel); d4x_eschandler_init(GTK_WIDGET(GTK_COLOR_SELECTION_DIALOG(colsel->browser)),colsel); gtk_widget_destroy(GTK_COLOR_SELECTION_DIALOG(colsel->browser)->help_button); gtk_widget_show(colsel->browser); if (colsel->modal){ gtk_window_set_modal (GTK_WINDOW(colsel->browser),TRUE); gtk_window_set_transient_for (GTK_WINDOW (colsel->browser), colsel->modal); }; }; return TRUE;};static void my_gtk_colorsel_destroy(GtkObject *widget){ g_return_if_fail(widget!=NULL); MyGtkColorsel *colsel=(MyGtkColorsel *)widget; my_gtk_colorsel_destroy_browser(colsel); if (GTK_OBJECT_CLASS (color_parent_class)->destroy) (* GTK_OBJECT_CLASS (color_parent_class)->destroy) (widget);};static void my_gtk_colorsel_class_init(MyGtkColorselClass *klass){ GtkObjectClass *object_class=(GtkObjectClass *)klass; object_class->destroy=my_gtk_colorsel_destroy; color_parent_class=(GtkWidgetClass *)gtk_type_class(gtk_box_get_type());};static void my_gtk_colorsel_init(MyGtkColorsel *colsel){ colsel->browser=(GtkWidget *)NULL; colsel->modal=(GtkWindow *)NULL; colsel->preview=gtk_drawing_area_new(); g_signal_connect(G_OBJECT(colsel->preview),"expose_event",G_CALLBACK(my_gtk_colorsel_expose),colsel); GtkWidget *button=gtk_button_new_with_label(_("Select")); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(my_gtk_colorsel_init_browser),colsel); gtk_box_set_spacing(GTK_BOX(colsel),5); gtk_widget_set_size_request(colsel->preview,50,50); gtk_box_pack_start(GTK_BOX(colsel),colsel->preview,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(colsel),button,FALSE,FALSE,0);};guint my_gtk_colorsel_get_type(){ static guint my_filesel_type=0; if (!my_filesel_type){ GTypeInfo my_filesel_info={ sizeof(MyGtkColorselClass), NULL,NULL, (GClassInitFunc) my_gtk_colorsel_class_init, NULL,NULL, sizeof(MyGtkColorsel), 0, (GInstanceInitFunc)my_gtk_colorsel_init }; my_filesel_type = g_type_register_static (GTK_TYPE_HBOX,"MyGtkColorsel",&my_filesel_info,(GTypeFlags)0); }; return my_filesel_type;};gint my_gtk_colorsel_get_color(MyGtkColorsel *colsel){ gint color=0; color=((gint(colsel->color.blue/0xff))&0xff)+ (((gint(colsel->color.green/0xff))&0xff)<<8)+ (((gint(colsel->color.red/0xff))&0xff)<<16); return color;};void my_gtk_colorsel_set_color(MyGtkColorsel *colsel, gint color){ g_return_if_fail(colsel!=NULL); colsel->color.blue=(color&0xff)*0xff; colsel->color.green=((color>>8)&0xff)*0xff; colsel->color.red=((color>>16)&0xff)*0xff; if (GTK_WIDGET_VISIBLE(colsel)) gtk_widget_queue_draw (colsel->preview); };GtkWidget *my_gtk_colorsel_new(gint color,gchar *title){ MyGtkColorsel *colsel=(MyGtkColorsel *)g_object_new(my_gtk_colorsel_get_type(),NULL); if (title){ GtkWidget *label=gtk_label_new(title); gtk_box_pack_start(GTK_BOX(colsel),label,FALSE,FALSE,0); }; my_gtk_colorsel_set_color(colsel,color); return GTK_WIDGET(colsel);};/***********************************************************************/static void d4x_rule_edit_destroy(GtkObject *widget){ g_return_if_fail(widget!=NULL); if (GTK_OBJECT_CLASS (rule_parent_class)->destroy) (* GTK_OBJECT_CLASS (rule_parent_class)->destroy) (widget);};static void d4x_rule_edit_class_init(d4xRuleEditClass *klass){ GtkObjectClass *object_class=(GtkObjectClass *)klass; object_class->destroy=d4x_rule_edit_destroy; rule_parent_class=(GtkWidgetClass *)gtk_type_class(gtk_window_get_type());};void d4x_rule_edit_apply(d4xRuleEdit *edit){ if (edit && edit->rule){ if (*(text_from_combo(edit->host))){ edit->rule->host.set(text_from_combo(edit->host)); }else edit->rule->host.set((char*)NULL); if (*(text_from_combo(edit->path))){ edit->rule->path.set(text_from_combo(edit->path)); }else edit->rule->path.set((char*)NULL); if (*(text_from_combo(edit->file))){ edit->rule->file.set(text_from_combo(edit->file)); }else edit->rule->file.set((char*)NULL); if (*(text_from_combo(edit->params))){ edit->rule->params.set(text_from_combo(edit->params)); }else edit->rule->params.set((char*)NULL); if (*(text_from_combo(edit->tag))){ edit->rule->tag.set(text_from_combo(edit->tag)); }else edit->rule->tag.set((char*)NULL); edit->rule->proto=get_proto_by_name(text_from_combo(edit->proto)); edit->rule->include=GTK_TOGGLE_BUTTON(edit->include)->active; };};static void d4x_rule_edit_ok(GtkWidget *widget,d4xRuleEdit *edit) { g_return_if_fail(edit!=NULL); d4x_rule_edit_apply(edit); gtk_widget_destroy(GTK_WIDGET(edit));};static void d4x_rule_edit_cancel(GtkWidget *widget,d4xRuleEdit *edit) { gtk_widget_destroy(GTK_WIDGET(edit));};static void d4x_rule_edit_init(d4xRuleEdit *edit){ gtk_window_set_title(GTK_WINDOW (edit),_("Edit properties of Rule")); gtk_window_set_resizable(GTK_WINDOW(edit), FALSE); GtkWidget *label=gtk_label_new(_("protocol")); GtkWidget *hbox=gtk_hbox_new(FALSE,0); edit->vbox=gtk_vbox_new(FALSE,0); edit->proto=gtk_combo_new(); GList *list=(GList*)NULL; list = g_list_append (list, get_name_by_proto(D_PROTO_FTP)); list = g_list_append (list, get_name_by_proto(D_PROTO_HTTP)); list = g_list_append (list, (void*)""); gtk_combo_set_popdown_strings (GTK_COMBO (edit->proto), list); g_list_free(list); gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(edit->proto)->entry),FALSE); text_to_combo(edit->proto,""); gtk_box_pack_start(GTK_BOX(hbox),edit->proto,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); hbox=gtk_hbox_new(FALSE,0); label=gtk_label_new(_("host")); edit->host=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox),edit->host,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); hbox=gtk_hbox_new(FALSE,0); label=gtk_label_new(_("path")); edit->path=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox),edit->path,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); hbox=gtk_hbox_new(FALSE,0); label=gtk_label_new(_("file")); edit->file=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox),edit->file,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); hbox=gtk_hbox_new(FALSE,0); label=gtk_label_new(_("?")); edit->params=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox),edit->params,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(edit->vbox),hbox,FALSE,FALSE,0); hbox=gtk_hbox_new(FALSE,0); label=gtk_label_new(_("tag")); edit->tag=gtk_combo_new(); list=(GList*)NULL; char *tags[]={"", "a", "applet", "area", "bgsound", "blockqute", "body", "col", "del", "div", "embed", "fig", "frame",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -