📄 gvxdlg.c
字号:
/* Copyright (C) 1993-2000, Ghostgum Software Pty Ltd. All rights reserved.
This file is part of GSview.
This program is distributed with NO WARRANTY OF ANY KIND. No author
or distributor accepts any responsibility for the consequences of using it,
or for whether it serves any particular purpose or works at all, unless he
or she says so in writing. Refer to the GSview Free Public Licence
(the "Licence") for full details.
Every copy of GSview must include a copy of the Licence, normally in a
plain ASCII text file named LICENCE. The Licence grants you the right
to copy, modify and redistribute GSview, but only under certain conditions
described in the Licence. Among other things, the Licence requires that
the copyright notice and this notice be preserved on all copies.
*/
/* gvxdlg.cpp */
#include "gvx.h"
#include "en/gvclang.h"
gint modal_delete(GtkWidget *widget, GdkEvent *event, gpointer data);
void modal_ok(GtkWidget *w, gpointer data);
void modal_cancel(GtkWidget *w, gpointer data);
void modal_yes(GtkWidget *w, gpointer data);
void modal_no(GtkWidget *w, gpointer data);
void modal_ignore(GtkWidget *w, gpointer data);
int modal_dialog(GtkWidget *w, GtkWidget *okw, GtkWidget *cancelw);
void info_add(GtkWidget *table, const char *str1, const char *str2, int *y);
void add_about(GtkWidget *w, const char *str);
void setting_add(GtkWidget *table, const char *str1, GtkWidget *w, const char *str3, int *y);
void set_menu_sensitive(void);
int depth_to_index(int depth);
int alpha_to_index(int alpha);
int draw_to_index(int draw);
gint showmess_realize(GtkWidget *widget, gpointer user_data);
void cfg_defaults(GtkWidget *w, gpointer data);
void width_percent(GtkWidget *w, GtkRequisition *req, gpointer data)
{
req->width = req->width * ((int)data) / 100;
}
gint modal_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("modal_delete:\n");
*((int *)data) = IDCANCEL;
gtk_main_quit();
/* Do not emit "destroy" signal.
* We will destroy the window ourselves.
*/
return TRUE;
}
void modal_ok(GtkWidget *w, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("modal_ok:\n");
*((int *)data) = IDOK;
gtk_main_quit();
}
void modal_cancel(GtkWidget *w, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("modal_cancel:\n");
*((int *)data) = IDCANCEL;
gtk_main_quit();
}
void modal_yes(GtkWidget *w, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("modal_yes:\n");
*((int *)data) = IDYES;
gtk_main_quit();
}
void modal_no(GtkWidget *w, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("modal_no:\n");
*((int *)data) = IDNO;
gtk_main_quit();
}
void modal_ignore(GtkWidget *w, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("modal_ignore:\n");
*((int *)data) = DSC_IGNORE_ALL;
gtk_main_quit();
}
int modal_dialog(GtkWidget *w, GtkWidget *okw, GtkWidget *cancelw)
{
int rc = 0;
if (okw == NULL)
return 0;
gtk_widget_show(w);
gtk_window_set_focus(GTK_WINDOW(w), okw);
gtk_window_set_modal(GTK_WINDOW(w), TRUE);
gtk_signal_connect(GTK_OBJECT(okw), "clicked",
GTK_SIGNAL_FUNC(modal_ok), &rc);
if (cancelw)
gtk_signal_connect(GTK_OBJECT(cancelw), "clicked",
GTK_SIGNAL_FUNC(modal_cancel), &rc);
gtk_signal_connect(GTK_OBJECT(w), "delete-event",
GTK_SIGNAL_FUNC(modal_delete), &rc);
gtk_main();
if (debug & DEBUG_GENERAL)
gs_addmessf("modal_dialog: returns %d\n", rc);
return rc;
}
void modal_help(GtkWidget *w, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("modal_help:\n");
get_help();
}
BOOL get_filename(char *filename, BOOL save, int filter, int title, int help)
{
GtkWidget *filew;
char szTitle[MAXSTR];
int rc;
char *newfilename;
if (title)
load_string(title, szTitle, sizeof(szTitle));
else
strcpy(szTitle, save ? "Save As" : "Open");
filew = gtk_file_selection_new(szTitle);
if (filew == NULL)
return FALSE;
if (filename != NULL)
gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), filename);
rc = modal_dialog(filew, GTK_FILE_SELECTION(filew)->ok_button,
GTK_FILE_SELECTION(filew)->cancel_button);
if (rc == IDOK) {
newfilename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(filew));
strncpy(filename, newfilename, MAXSTR-1);
make_cwd(filename);
}
gtk_widget_destroy(filew);
return rc == IDOK;
}
/* display message */
int message_box(const char *str, int icon)
{
GtkWidget *window; /* main dialog window */
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *label;
GtkWidget *button_ok = NULL , *button_cancel = NULL;
GtkWidget *button_yes = NULL, *button_no = NULL;
int rc = 0;
int type = icon & MB_TYPEMASK;
window=gtk_window_new(GTK_WINDOW_DIALOG);
gtk_window_set_title(GTK_WINDOW(window), szAppName);
gtk_signal_connect(GTK_OBJECT(window), "delete-event",
GTK_SIGNAL_FUNC(modal_delete), &rc);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show(vbox);
/* Create a label */
label = gtk_label_new(str);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
gtk_widget_show(label);
/* Create and place the buttons across the bottom */
hbox = gtk_hbox_new(TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
gtk_widget_show(hbox);
if ((type == MB_OK) || (type == MB_OKCANCEL)) {
button_ok = gtk_button_new_with_label(get_string(IDS_AAOK));
gtk_box_pack_start(GTK_BOX(hbox), button_ok, TRUE, FALSE, 5);
gtk_signal_connect(GTK_OBJECT(button_ok), "clicked",
GTK_SIGNAL_FUNC(modal_ok), &rc);
gtk_widget_show(button_ok);
}
if (type == MB_OKCANCEL) {
button_cancel = gtk_button_new_with_label(get_string(IDS_AACANCEL));
gtk_box_pack_start(GTK_BOX(hbox), button_cancel, TRUE, FALSE, 5);
gtk_signal_connect(GTK_OBJECT(button_cancel), "clicked",
GTK_SIGNAL_FUNC(modal_cancel), &rc);
gtk_widget_show(button_cancel);
}
if (type == MB_YESNO) {
button_yes = gtk_button_new_with_label(get_string(IDS_AAYES));
gtk_box_pack_start(GTK_BOX(hbox), button_yes, TRUE, FALSE, 5);
gtk_signal_connect(GTK_OBJECT(button_yes), "clicked",
GTK_SIGNAL_FUNC(modal_yes), &rc);
gtk_widget_show(button_yes);
button_no = gtk_button_new_with_label(get_string(IDS_AANO));
gtk_box_pack_start(GTK_BOX(hbox), button_no, TRUE, FALSE, 5);
gtk_signal_connect(GTK_OBJECT(button_no), "clicked",
GTK_SIGNAL_FUNC(modal_no), &rc);
gtk_widget_show(button_no);
}
/* show dialog and wait for OK, Cancel, Yes, No, or close */
#ifdef NOTUSED
if (button_ok)
gtk_window_set_focus(GTK_WINDOW(window), button_ok);
#endif
gtk_window_set_modal(GTK_WINDOW(window), TRUE);
gtk_widget_show(window);
gtk_main();
gtk_widget_destroy(window);
return rc;
}
BOOL
query_string(const char *prompt, char *answer)
{
GtkWidget *window; /* main dialog window */
GtkWidget *hbox; /* hbox for buttons below */
GtkWidget *vbox;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *button_ok, *button_cancel, *button_help;
int rc = 0;
window=gtk_window_new(GTK_WINDOW_DIALOG);
gtk_window_set_title(GTK_WINDOW(window), get_string(IDS_AAINPUT));
gtk_signal_connect(GTK_OBJECT(window), "delete-event",
GTK_SIGNAL_FUNC(modal_delete), &rc);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show(vbox);
/* Create a label */
label = gtk_label_new(prompt);
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
gtk_widget_show(label);
/* Create entry */
entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(entry), 255);
gtk_entry_set_text(GTK_ENTRY(entry), answer);
gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 5);
gtk_widget_show(entry);
/* need to set a default size for entry */
/* Create and place the buttons across the bottom */
hbox = gtk_hbox_new(TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
gtk_widget_show(hbox);
button_ok = gtk_button_new_with_label(get_string(IDS_AAOK));
button_cancel = gtk_button_new_with_label(get_string(IDS_AACANCEL));
button_help = gtk_button_new_with_label(get_string(IDS_AAHELP));
gtk_box_pack_start(GTK_BOX(hbox), button_ok, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox), button_cancel, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox), button_help, TRUE, FALSE, 5);
/* Connect our callbacks to the three buttons */
gtk_signal_connect(GTK_OBJECT(button_ok), "clicked",
GTK_SIGNAL_FUNC(modal_ok), &rc);
gtk_signal_connect(GTK_OBJECT(button_cancel), "clicked",
GTK_SIGNAL_FUNC(modal_cancel), &rc);
gtk_signal_connect(GTK_OBJECT(button_help), "clicked",
GTK_SIGNAL_FUNC(modal_help), &rc);
gtk_widget_show(button_ok);
gtk_widget_show(button_cancel);
gtk_widget_show(button_help);
/* Hitting return in entry field is the same as OK */
gtk_signal_connect(GTK_OBJECT(entry), "activate",
GTK_SIGNAL_FUNC(modal_ok), &rc);
/* show dialog and wait for OK, Cancel or close */
gtk_window_set_focus(GTK_WINDOW(window), entry);
gtk_window_set_modal(GTK_WINDOW(window), TRUE);
gtk_widget_show(window);
gtk_main();
if (rc == IDOK)
strncpy(answer, gtk_entry_get_text(GTK_ENTRY(entry)), 255);
gtk_widget_destroy(window);
return (rc == IDOK);
}
/* User clicked the "All" button. */
void selpage_all(GtkButton *button, gpointer data)
{
if (debug & DEBUG_GENERAL)
gs_addmess("button All pressed\n");
gtk_clist_select_all(GTK_CLIST(data));
return;
}
/* User clicked the "Odd" button. */
void selpage_odd(GtkButton *button, gpointer data)
{
GtkCList *clist = GTK_CLIST(data);
int i;
if (debug & DEBUG_GENERAL)
gs_addmess("button Odd pressed\n");
for (i=0; i<clist->rows; i++) {
if (i & 1)
gtk_clist_unselect_row(clist, i, 0);
else
gtk_clist_select_row(clist, i, 0);
}
return;
}
/* User clicked the "Even" button. */
void selpage_even(GtkButton *button, gpointer data)
{
GtkCList *clist = GTK_CLIST(data);
int i;
if (debug & DEBUG_GENERAL)
gs_addmess("button Even pressed\n");
for (i=0; i<clist->rows; i++) {
if (i & 1)
gtk_clist_select_row(clist, i, 0);
else
gtk_clist_unselect_row(clist, i, 0);
}
return;
}
/* Get page number from dialog box and store in ppage */
/* multiple is TRUE if multiple pages may be selected */
/* allpages is TRUE if all pages should be initially selected */
BOOL
get_page(int *ppage, BOOL multiple, BOOL allpages)
{
GtkWidget *window; /* main dialog window */
GtkWidget *hbox; /* hbox for list on left, buttons on right */
GtkWidget *vbox; /* vbox on right for buttons */
GtkWidget *scrolled_window, *clist; /* page list */
GtkWidget *button_ok, *button_cancel;
GtkWidget *button_all=NULL, *button_odd=NULL, *button_even=NULL;
GtkWidget *button_reverse=NULL;
int rc = 0;
int i;
char buf[MAXSTR];
char *p;
if (psfile.dsc == (CDSC *)NULL)
return FALSE;
if (psfile.dsc->page_count == 0) {
gserror(IDS_NOPAGE, NULL, MB_ICONEXCLAMATION, SOUND_NONUMBER);
return FALSE;
}
/* Make psfile.page_list.reverse sticky */
/* psfile.page_list.reverse = FALSE; */
psfile.page_list.current = *ppage - 1;
psfile.page_list.multiple = multiple;
if (psfile.page_list.select == (BOOL *)NULL)
return FALSE;
memset(psfile.page_list.select, 0, psfile.dsc->page_count * sizeof(BOOL) );
if (multiple) {
for (i=0; i< (int)(psfile.dsc->page_count); i++)
psfile.page_list.select[i] = allpages;
}
psfile.page_list.select[psfile.page_list.current] = TRUE;
window=gtk_window_new(GTK_WINDOW_DIALOG);
gtk_widget_set_usize(GTK_WIDGET(window), 200, 300);
gtk_window_set_title(GTK_WINDOW(window),
multiple ? get_string(IDS_AASELECTPAGES) : get_string(IDS_AASELECTPAGE));
gtk_signal_connect(GTK_OBJECT(window),
"delete-event",
GTK_SIGNAL_FUNC(modal_delete),
&rc);
hbox = gtk_hbox_new(FALSE, 5);
gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show(hbox);
/* Create a scrolled window to pack the CList widget into */
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
gtk_box_pack_start(GTK_BOX(hbox), scrolled_window, TRUE, TRUE, 0);
gtk_widget_show (scrolled_window);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -