/* GnoSamba 0.3.3
* copyright 1998-9 Perry Piplani
* redistributable under the terms of the GPL:
* http://www.gnu.org/copyleft/gpl.html
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "gtksamba.h"
#define MAX_ENUM 10
/*** from smb.h *** defs for parm structure */
typedef enum
{
P_BOOL,P_BOOLREV,P_CHAR,P_INTEGER,P_OCTAL,
P_STRING,P_USTRING,P_GSTRING,P_UGSTRING,P_ENUM,P_SEP
} parm_type;
typedef enum
{
P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE
} parm_class;
struct enum_list {
int value;
char *name;
};
/* four members snipped */
struct parm_struct
{
char *label;
parm_type type;
parm_class class;
struct enum_list *enum_list;
};
/* value enums for emum list */
/* protocol types. It assumes that higher protocols include lower protocols
as subsets */
enum protocol_types {PROTOCOL_NONE,PROTOCOL_CORE,PROTOCOL_COREPLUS,PROTOCOL_LANMAN1,PROTOCOL_LANMAN2,PROTOCOL_NT1};
/* security levels */
enum security_types {SEC_SHARE,SEC_USER,SEC_SERVER,SEC_DOMAIN};
/* printing types */
enum printing_types {PRINT_BSD,PRINT_SYSV,PRINT_AIX,PRINT_HPUX,
PRINT_QNX,PRINT_PLP,PRINT_LPRNG,PRINT_SOFTQ};
/* case handling */
enum case_handling {CASE_LOWER,CASE_UPPER};
/* Types of machine we can announce as. */
#define ANNOUNCE_AS_NT 1
#define ANNOUNCE_AS_WIN95 2
#define ANNOUNCE_AS_WFW 3
#define NEVER_MAP_TO_GUEST 0
#define MAP_TO_GUEST_ON_BAD_USER 1
#define MAP_TO_GUEST_ON_BAD_PASSWORD 2
#ifdef WITH_SSL
/* SSL version options */
enum ssl_version_enum {SMB_SSL_V2,SMB_SSL_V3,SMB_SSL_V23,SMB_SSL_TLS1};
#endif /* WITH_SSL */
static struct enum_list enum_protocol[] = {{PROTOCOL_NT1, "NT1"}, {PROTOCOL_LANMAN2, "LANMAN2"},
{PROTOCOL_LANMAN1, "LANMAN1"}, {PROTOCOL_CORE,"CORE"},
{PROTOCOL_COREPLUS, "COREPLUS"},
{PROTOCOL_COREPLUS, "CORE+"}, {-1, NULL}};
static struct enum_list enum_security[] = {{SEC_SHARE, "SHARE"}, {SEC_USER, "USER"},
{SEC_SERVER, "SERVER"}, {SEC_DOMAIN, "DOMAIN"},
{-1, NULL}};
static struct enum_list enum_printing[] = {{PRINT_SYSV, "sysv"}, {PRINT_AIX, "aix"},
{PRINT_HPUX, "hpux"}, {PRINT_BSD, "bsd"},
{PRINT_QNX, "qnx"}, {PRINT_PLP, "plp"},
{PRINT_LPRNG, "lprng"}, {PRINT_SOFTQ, "softq"},
{-1, NULL}};
static struct enum_list enum_announce_as[] = {{ANNOUNCE_AS_NT, "NT"}, {ANNOUNCE_AS_WIN95, "win95"},
{ANNOUNCE_AS_WFW, "WfW"}, {-1, NULL}};
static struct enum_list enum_case[] = {{CASE_LOWER, "lower"}, {CASE_UPPER, "upper"}, {-1, NULL}};
static struct enum_list enum_lm_announce[] = {{0, "False"}, {1, "True"}, {2, "Auto"}, {-1, NULL}};
static struct enum_list enum_map_to_guest[] = {{NEVER_MAP_TO_GUEST, "Never"}, {MAP_TO_GUEST_ON_BAD_USER, "Bad User"}, {MAP_TO_GUEST_ON_BAD_PASSWORD, "Bad Password"}, {-1, NULL}};
#ifdef WITH_SSL
static struct enum_list enum_ssl_version[] = {{SMB_SSL_V2, "ssl2"}, {SMB_SSL_V3, "ssl3"},
{SMB_SSL_V23, "ssl2or3"}, {SMB_SSL_TLS1, "tls1"}, {-1, NULL}};
#endif
/* param table modified with awk and some hand editing */
static struct parm_struct parm_table[] =
{
{"Base Options", P_SEP, P_SEPARATOR},
{"comment", P_STRING, P_LOCAL, NULL},
{"path", P_STRING, P_LOCAL, NULL},
{"directory", P_STRING, P_LOCAL, NULL},
{"workgroup", P_USTRING, P_GLOBAL, NULL},
{"netbios name", P_UGSTRING,P_GLOBAL, NULL},
{"netbios aliases", P_STRING, P_GLOBAL, NULL},
{"server string", P_STRING, P_GLOBAL, NULL},
{"interfaces", P_STRING, P_GLOBAL, NULL},
{"bind interfaces only", P_BOOL,P_GLOBAL, NULL},
{"Security Options", P_SEP, P_SEPARATOR},
{"security", P_ENUM, P_GLOBAL, enum_security},
{"encrypt passwords",P_BOOL, P_GLOBAL, NULL},
{"update encrypted", P_BOOL, P_GLOBAL, NULL},
{"use rhosts", P_BOOL, P_GLOBAL, NULL},
{"map to guest", P_ENUM, P_GLOBAL, enum_map_to_guest},
{"null passwords", P_BOOL, P_GLOBAL, NULL},
{"password server", P_STRING, P_GLOBAL, NULL},
{"smb passwd file", P_STRING, P_GLOBAL, NULL},
{"hosts equiv", P_STRING, P_GLOBAL, NULL},
{"root directory", P_STRING, P_GLOBAL, NULL},
{"root dir", P_STRING, P_GLOBAL, NULL},
{"root", P_STRING, P_GLOBAL, NULL},
{"passwd program", P_STRING, P_GLOBAL, NULL},
{"passwd chat", P_STRING, P_GLOBAL, NULL},
{"passwd chat debug",P_BOOL, P_GLOBAL, NULL},
{"username map", P_STRING, P_GLOBAL, NULL},
{"password level", P_INTEGER, P_GLOBAL, NULL},
{"username level", P_INTEGER, P_GLOBAL, NULL},
{"unix password sync", P_BOOL, P_GLOBAL, NULL},
{"alternate permissions",P_BOOL,P_LOCAL, NULL},
{"revalidate", P_BOOL, P_LOCAL, NULL},
{"username", P_STRING, P_LOCAL, NULL},
{"user", P_STRING, P_LOCAL, NULL},
{"users", P_STRING, P_LOCAL, NULL},
{"guest account", P_STRING, P_LOCAL, NULL},
{"invalid users", P_STRING, P_LOCAL, NULL},
{"valid users", P_STRING, P_LOCAL, NULL},
{"admin users", P_STRING, P_LOCAL, NULL},
{"read list", P_STRING, P_LOCAL, NULL},
{"write list", P_STRING, P_LOCAL, NULL},
{"force user", P_STRING, P_LOCAL, NULL},
{"force group", P_STRING, P_LOCAL, NULL},
{"group", P_STRING, P_LOCAL, NULL},
{"read only", P_BOOL, P_LOCAL, NULL},
{"write ok", P_BOOLREV, P_LOCAL, NULL},
{"writeable", P_BOOLREV, P_LOCAL, NULL},
{"writable", P_BOOLREV, P_LOCAL, NULL},
{"create mask", P_OCTAL, P_LOCAL, NULL},
{"create mode", P_OCTAL, P_LOCAL, NULL},
{"force create mode",P_OCTAL, P_LOCAL, NULL},
{"directory mask", P_OCTAL, P_LOCAL, NULL},
{"directory mode", P_OCTAL, P_LOCAL, NULL},
{"force directory mode", P_OCTAL, P_LOCAL, NULL},
{"guest only", P_BOOL, P_LOCAL, NULL},
{"only guest", P_BOOL, P_LOCAL, NULL},
{"guest ok", P_BOOL, P_LOCAL, NULL},
{"public", P_BOOL, P_LOCAL, NULL},
{"only user", P_BOOL, P_LOCAL, NULL},
{"hosts allow", P_STRING, P_LOCAL, NULL},
{"allow hosts", P_STRING, P_LOCAL, NULL},
{"hosts deny", P_STRING, P_LOCAL, NULL},
{"deny hosts", P_STRING, P_LOCAL, NULL},
#ifdef WITH_SSL
{"Secure Socket Layer Options", P_SEP, P_SEPARATOR},
{"ssl", P_BOOL, P_GLOBAL, NULL},
{"ssl hosts", P_STRING, P_GLOBAL, NULL},
{"ssl hosts resign", P_STRING, P_GLOBAL, NULL},
{"ssl CA certDir", P_STRING, P_GLOBAL, NULL},
{"ssl CA certFile", P_STRING, P_GLOBAL, NULL},
{"ssl server cert", P_STRING, P_GLOBAL, NULL},
{"ssl server key", P_STRING, P_GLOBAL, NULL},
{"ssl client cert", P_STRING, P_GLOBAL, NULL},
{"ssl client key", P_STRING, P_GLOBAL, NULL},
{"ssl require clientcert", P_BOOL, P_GLOBAL, NULL },
{"ssl require servercert", P_BOOL, P_GLOBAL, NULL },
{"ssl ciphers", P_STRING, P_GLOBAL, NULL},
{"ssl version", P_ENUM, P_GLOBAL, enum_ssl_version},
{"ssl compatibility", P_BOOL, P_GLOBAL, NULL},
#endif
{"Logging Options", P_SEP, P_SEPARATOR},
{"log level", P_INTEGER, P_GLOBAL, NULL},
{"debuglevel", P_INTEGER, P_GLOBAL, NULL},
{"syslog", P_INTEGER, P_GLOBAL, NULL},
{"syslog only", P_BOOL, P_GLOBAL, NULL},
{"log file", P_STRING, P_GLOBAL, NULL},
{"max log size", P_INTEGER, P_GLOBAL, NULL},
{"timestamp logs", P_BOOL, P_GLOBAL, NULL},
{"debug timestamp", P_BOOL, P_GLOBAL, NULL},
{"status", P_BOOL, P_LOCAL, NULL},
{"Protocol Options", P_SEP, P_SEPARATOR},
{"protocol", P_ENUM, P_GLOBAL, enum_protocol},
{"read bmpx", P_BOOL, P_GLOBAL, NULL},
{"read raw", P_BOOL, P_GLOBAL, NULL},
{"write raw", P_BOOL, P_GLOBAL, NULL},
{"nt smb support", P_BOOL, P_GLOBAL, NULL},
{"nt pipe support", P_BOOL, P_GLOBAL, NULL},
{"announce version", P_STRING, P_GLOBAL, NULL},
{"announce as", P_ENUM, P_GLOBAL, enum_announce_as},
{"max mux", P_INTEGER, P_GLOBAL, NULL},
{"max xmit", P_INTEGER, P_GLOBAL, NULL},
{"name resolve order", P_STRING, P_GLOBAL, NULL},
{"max packet", P_INTEGER, P_GLOBAL, NULL},
{"packet size", P_INTEGER, P_GLOBAL, NULL},
{"max ttl", P_INTEGER, P_GLOBAL, NULL},
{"max wins ttl", P_INTEGER, P_GLOBAL, NULL},
{"min wins ttl", P_INTEGER, P_GLOBAL, NULL},
{"time server", P_BOOL, P_GLOBAL, NULL},
{"Tuning Options", P_SEP, P_SEPARATOR},
{"change notify timeout", P_INTEGER, P_GLOBAL, NULL},
{"deadtime", P_INTEGER, P_GLOBAL, NULL},
{"getwd cache", P_BOOL, P_GLOBAL, NULL},
{"keepalive", P_INTEGER, P_GLOBAL, NULL},
{"lpq cache time", P_INTEGER, P_GLOBAL, NULL},
{"max connections", P_INTEGER, P_LOCAL, NULL},
{"max disk size", P_INTEGER, P_GLOBAL, NULL},
{"max open files", P_INTEGER, P_GLOBAL, NULL},
{"min print space", P_INTEGER, P_LOCAL, NULL},
{"read prediction", P_BOOL, P_GLOBAL, NULL},
{"read size", P_INTEGER, P_GLOBAL, NULL},
{"shared mem size", P_INTEGER, P_GLOBAL, NULL},
{"socket options", P_GSTRING, P_GLOBAL, NULL},
{"stat cache size", P_INTEGER, P_GLOBAL, NULL},
{"strict sync", P_BOOL, P_LOCAL, NULL},
{"sync always", P_BOOL, P_LOCAL, NULL},
{"Printing Options", P_SEP, P_SEPARATOR},
{"load printers", P_BOOL, P_GLOBAL, NULL},
{"printcap name", P_STRING, P_GLOBAL, NULL},
{"printcap", P_STRING, P_GLOBAL, NULL},
{"printer driver file", P_STRING, P_GLOBAL, NULL},
{"print ok", P_BOOL, P_LOCAL, NULL},
{"printable", P_BOOL, P_LOCAL, NULL},
{"postscript", P_BOOL, P_LOCAL, NULL},
{"printing", P_ENUM, P_LOCAL, enum_printing},
{"print command", P_STRING, P_LOCAL, NULL},
{"lpq command", P_STRING, P_LOCAL, NULL},
{"lprm command", P_STRING, P_LOCAL, NULL},
{"lppause command", P_STRING, P_LOCAL, NULL},
{"lpresume command", P_STRING, P_LOCAL, NULL},
{"queuepause command", P_STRING, P_LOCAL, NULL},
{"queueresume command", P_STRING, P_LOCAL, NULL},
{"printer name", P_STRING, P_LOCAL, NULL},
{"printer", P_STRING, P_LOCAL, NULL},
{"printer driver", P_STRING, P_LOCAL, NULL},
{"printer driver location", P_STRING, P_LOCAL, NULL},
{"Filename Handling", P_SEP, P_SEPARATOR},
{"strip dot", P_BOOL, P_GLOBAL, NULL},
{"character set", P_STRING, P_GLOBAL, NULL},
{"mangled stack", P_INTEGER, P_GLOBAL, NULL},
{"coding system", P_STRING, P_GLOBAL, NULL},
{"client code page", P_INTEGER, P_GLOBAL, NULL},
{"default case", P_ENUM, P_LOCAL, enum_case},
{"case sensitive", P_BOOL, P_LOCAL, NULL},
{"casesignames", P_BOOL, P_LOCAL, NULL},
{"preserve case", P_BOOL, P_LOCAL, NULL},
{"short preserve case",P_BOOL, P_LOCAL, NULL},
{"mangle case", P_BOOL, P_LOCAL, NULL},
{"mangling char", P_CHAR, P_LOCAL, NULL},
{"hide dot files", P_BOOL, P_LOCAL, NULL},
{"delete veto files",P_BOOL, P_LOCAL, NULL},
{"veto files", P_STRING, P_LOCAL, NULL},
{"hide files", P_STRING, P_LOCAL, NULL},
{"veto oplock files",P_STRING, P_LOCAL, NULL},
{"map system", P_BOOL, P_LOCAL, NULL},
{"map hidden", P_BOOL, P_LOCAL, NULL},
{"map archive", P_BOOL, P_LOCAL, NULL},
{"mangled names", P_BOOL, P_LOCAL, NULL},
{"mangled map", P_STRING, P_LOCAL, NULL},
{"stat cache", P_BOOL, P_GLOBAL, NULL},
{"Domain Options", P_SEP, P_SEPARATOR},
{"domain groups", P_STRING, P_GLOBAL, NULL},
{"domain admin group",P_STRING, P_GLOBAL, NULL},
{"domain guest group",P_STRING, P_GLOBAL, NULL},
{"domain admin users",P_STRING, P_GLOBAL, NULL},
{"domain guest users",P_STRING, P_GLOBAL, NULL},
#ifdef USING_GROUPNAME_MAP
{"groupname map", P_STRING, P_GLOBAL, NULL},
#endif
{"machine password timeout", P_INTEGER, P_GLOBAL, NULL},
{"Logon Options", P_SEP, P_SEPARATOR},
{"logon script", P_STRING, P_GLOBAL, NULL},
{"logon path", P_STRING, P_GLOBAL, NULL},
{"logon drive", P_STRING, P_GLOBAL, NULL},
{"logon home", P_STRING, P_GLOBAL, NULL},
{"domain logons", P_BOOL, P_GLOBAL, NULL},
{"Browse Options", P_SEP, P_SEPARATOR},
{"os level", P_INTEGER, P_GLOBAL, NULL},
{"lm announce", P_ENUM, P_GLOBAL, enum_lm_announce},
{"lm interval", P_INTEGER, P_GLOBAL, NULL},
{"preferred master", P_BOOL, P_GLOBAL, NULL},
{"prefered master", P_BOOL, P_GLOBAL, NULL},
{"local master", P_BOOL, P_GLOBAL, NULL},
{"domain master", P_BOOL, P_GLOBAL, NULL},
{"browse list", P_BOOL, P_GLOBAL, NULL},
{"browseable", P_BOOL, P_LOCAL, NULL},
{"browsable", P_BOOL, P_LOCAL, NULL},
{"WINS Options", P_SEP, P_SEPARATOR},
{"dns proxy", P_BOOL, P_GLOBAL, NULL},
{"wins proxy", P_BOOL, P_GLOBAL, NULL},
{"wins server", P_STRING, P_GLOBAL, NULL},
{"wins support", P_BOOL, P_GLOBAL, NULL},
{"Locking Options", P_SEP, P_SEPARATOR},
{"blocking locks", P_BOOL, P_LOCAL, NULL},
{"fake oplocks", P_BOOL, P_LOCAL, NULL},
{"kernel oplocks", P_BOOL, P_GLOBAL, NULL},
{"locking", P_BOOL, P_LOCAL, NULL},
{"ole locking compatibility", P_BOOL, P_GLOBAL, NULL},
{"oplocks", P_BOOL, P_LOCAL, NULL},
{"strict locking", P_BOOL, P_LOCAL, NULL},
{"share modes", P_BOOL, P_LOCAL, NULL},
#ifdef WITH_LDAP
{"Ldap Options", P_SEP, P_SEPARATOR},
{"ldap server", P_STRING, P_GLOBAL, NULL},
{"ldap port", P_INTEGER, P_GLOBAL, NULL},
{"ldap suffix", P_STRING, P_GLOBAL, NULL},
{"ldap filter", P_STRING, P_GLOBAL, NULL},
{"ldap root", P_STRING, P_GLOBAL, NULL},
{"ldap root passwd", P_STRING, P_GLOBAL, NULL},
#endif
{"Miscellaneous Options", P_SEP, P_SEPARATOR},
{"smbrun", P_STRING, P_GLOBAL, NULL},
{"config file", P_STRING, P_GLOBAL, NULL},
{"preload", P_STRING, P_GLOBAL, NULL},
{"auto services", P_STRING, P_GLOBAL, NULL},
{"lock dir", P_STRING, P_GLOBAL, NULL},
{"lock directory", P_STRING, P_GLOBAL, NULL},
{"default service", P_STRING, P_GLOBAL, NULL},
{"default", P_STRING, P_GLOBAL, NULL},
{"message command", P_STRING, P_GLOBAL, NULL},
{"dfree command", P_STRING, P_GLOBAL, NULL},
{"valid chars", P_STRING, P_GLOBAL, NULL},
{"remote announce", P_STRING, P_GLOBAL, NULL},
{"remote browse sync",P_STRING, P_GLOBAL, NULL},
{"socket address", P_STRING, P_GLOBAL, NULL},
{"homedir map", P_STRING, P_GLOBAL, NULL},
{"time offset", P_INTEGER, P_GLOBAL, NULL},
{"unix realname", P_BOOL, P_GLOBAL, NULL},
{"NIS homedir", P_BOOL, P_GLOBAL, NULL},
{"-valid", P_BOOL, P_LOCAL, NULL},
{"copy", P_STRING, P_LOCAL, NULL},
{"include", P_STRING, P_LOCAL, NULL},
{"exec", P_STRING, P_LOCAL, NULL},
{"preexec", P_STRING, P_LOCAL, NULL},
{"postexec", P_STRING, P_LOCAL, NULL},
{"root preexec", P_STRING, P_LOCAL, NULL},
{"root postexec", P_STRING, P_LOCAL, NULL},
{"available", P_BOOL, P_LOCAL, NULL},
{"volume", P_STRING, P_LOCAL, NULL},
{"fstype", P_STRING, P_LOCAL, NULL},
{"set directory", P_BOOLREV, P_LOCAL, NULL},
{"wide links", P_BOOL, P_LOCAL, NULL},
{"follow symlinks", P_BOOL, P_LOCAL, NULL},
{"dont descend", P_STRING, P_LOCAL, NULL},
{"magic script", P_STRING, P_LOCAL, NULL},
{"magic output", P_STRING, P_LOCAL, NULL},
{"delete readonly", P_BOOL, P_LOCAL, NULL},
{"dos filetimes", P_BOOL, P_LOCAL, NULL},
{"dos filetime resolution",P_BOOL,P_LOCAL, NULL},
{"fake directory create times", P_BOOL,P_LOCAL, NULL},
{"panic action", P_STRING, P_GLOBAL, NULL},
{NULL, P_BOOL, P_NONE, NULL}
};
int is_oct(int c){
if(c >= '0' && c <= '7')
return 1;
else
return 0;
}
void c_edit_to_delete(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
if(diagwin){
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
}
make_del_dialog(GTK_WIDGET(window));
return;
}
void c_entry_diag_ok(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
GtkWidget *entry;
int row;
int pindex;
char *text, *p;
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
entry=gtk_object_get_data(GTK_OBJECT(diagwin),"entry");
text = gtk_entry_get_text(GTK_ENTRY(entry));
text = gtk_entry_get_text(GTK_ENTRY(entry));
for(; *text && isspace(*text); text++);
if(!strlen(text)){
make_user_mesg("Field is empty","Warning");
return;
}
switch(parm_table[pindex].type){
case P_INTEGER:
for(p = text; *p && isdigit(*p); p++);
if(*p){
make_user_mesg("Integer value required","Warning");
return;
}
break;
case P_OCTAL:
for(p = text; *p && is_oct(*p); p++);
if(*p){
make_user_mesg("Octal value required\ne.g. 0755","Warning");
return;
}
break;
default:
break;
}
row = (int)(GTK_CLIST(sublist)->selection->data);
gtk_clist_set_text(GTK_CLIST(sublist),row,1,text);
resensitize_sw(GTK_WIDGET(window));
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
return;
}
void make_entry_dialog(GtkWidget *window){
GtkWidget *diagwin;
GtkWidget *entry;
GtkWidget *label;
GtkWidget *entrybox;
GtkWidget *vbox;
int pindex;
char *text;
int row;
GtkRequisition requisition;
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
row = (int)(GTK_CLIST(sublist)->selection->data);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,0,&text);
diagwin = gnome_dialog_new (text,NULL);
gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox),
vbox, TRUE, TRUE, 10);
gtk_container_border_width (GTK_CONTAINER (vbox), 0);
gtk_widget_show (vbox);
gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
GTK_SIGNAL_FUNC(c_param_diag_delete),
window);
gtk_window_position (GTK_WINDOW (diagwin),GTK_WIN_POS_CENTER);
label = gtk_label_new(text);
gtk_box_pack_start (GTK_BOX (vbox),
label, TRUE, TRUE, 10);
gtk_widget_show (label);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_OK);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_HELP);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_CANCEL);
gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
"Delete",
GNOME_STOCK_MENU_CUT);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
GTK_SIGNAL_FUNC(c_entry_diag_ok),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
GTK_SIGNAL_FUNC(c_help_sel_param),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 2,
GTK_SIGNAL_FUNC(c_param_diag_cancel),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 3,
GTK_SIGNAL_FUNC(c_edit_to_delete),
window);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,1,&text);
entrybox = gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX (vbox),
entrybox, TRUE, TRUE, 5);
gtk_widget_show(entrybox);
if(parm_table[pindex].type == P_OCTAL)
label = gtk_label_new("Octal Value e.g. 0755:");
else if(parm_table[pindex].type == P_CHAR)
label = gtk_label_new("Enter Character:");
else if(parm_table[pindex].type == P_INTEGER)
label = gtk_label_new("Integer Value:");
else
label = gtk_label_new("Value:");
gtk_box_pack_start (GTK_BOX (entrybox),
label, FALSE, FALSE, 10);
gtk_widget_show (label);
if(parm_table[pindex].type == P_CHAR){
entry = gtk_entry_new_with_max_length(1);
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,20,requisition.height);
}
else if(parm_table[pindex].type == P_OCTAL){
entry = gtk_entry_new_with_max_length(4);
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,40,requisition.height);
}
else if(parm_table[pindex].type == P_INTEGER){
entry = gtk_entry_new_with_max_length(5);
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,20,requisition.height);
}
else{
entry = gtk_entry_new();
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,100,requisition.height);
}
gtk_object_set_data(GTK_OBJECT(diagwin),"entry",entry);
gtk_entry_set_text(GTK_ENTRY(entry),text);
gtk_entry_select_region (GTK_ENTRY (entry),
0, GTK_ENTRY(entry)->text_length);
gtk_box_pack_start(GTK_BOX (entrybox),
entry, TRUE, TRUE, 10);
gtk_signal_connect(GTK_OBJECT(entry), "activate",
GTK_SIGNAL_FUNC(c_entry_diag_ok),
window);
gtk_widget_show(entry);
gtk_widget_grab_focus(entry);
gtk_widget_show(diagwin);
return;
}
void c_enum_diag_ok(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
GtkWidget *choicebox;
int row;
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
row = (int)(GTK_CLIST(sublist)->selection->data);
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
choicebox=gtk_object_get_data(GTK_OBJECT(diagwin),"choicebox");
gtk_clist_set_text(GTK_CLIST(sublist),row,1,
gnome_choice_box_get_choice(GNOME_CHOICE_BOX(choicebox)));
resensitize_sw(GTK_WIDGET(window));
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
return;
}
void make_enum_dialog(GtkWidget *window){
GtkWidget *diagwin;
GtkWidget *choicebox;
gchar *choices[MAX_ENUM+1];
GtkWidget *label;
GtkWidget *vbox;
char *text;
int pindex;
int row;
struct enum_list *elist;
int i,j=0;
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
row = (int)(GTK_CLIST(sublist)->selection->data);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,0,&text);
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
diagwin = gnome_dialog_new (text,NULL);
gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox),
vbox, TRUE, TRUE, 10);
gtk_container_border_width (GTK_CONTAINER (vbox), 0);
gtk_widget_show (vbox);
gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
GTK_SIGNAL_FUNC(c_param_diag_delete),
window);
gtk_window_position (GTK_WINDOW (diagwin),GTK_WIN_POS_CENTER);
label = gtk_label_new(text);
gtk_box_pack_start (GTK_BOX (vbox),
label, TRUE, TRUE, 0);
gtk_widget_show (label);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_OK);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_HELP);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_CANCEL);
gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
"Delete",
GNOME_STOCK_MENU_CUT);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
GTK_SIGNAL_FUNC(c_enum_diag_ok),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
GTK_SIGNAL_FUNC(c_help_sel_param),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 2,
GTK_SIGNAL_FUNC(c_param_diag_cancel),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 3,
GTK_SIGNAL_FUNC(c_edit_to_delete),
window);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,1,&text);
elist = parm_table[pindex].enum_list;
for(i=0; elist[i].value != -1; i++){
choices[i]= elist[i].name;
if(!strcasecmp(text,elist[i].name))
j=i;
}
choices[i]=NULL;
choicebox=gnome_choice_box_newv(CHOICE_BOX_VV,
NULL,choices);
gtk_object_set_data(GTK_OBJECT(diagwin),"choicebox",choicebox);
gtk_box_pack_start (GTK_BOX(vbox),
choicebox, TRUE, TRUE, 0);
gnome_choice_box_set_index(GNOME_CHOICE_BOX(choicebox),j);
gtk_widget_show(choicebox);
gtk_widget_show(diagwin);
}
int is_true(char *s){
if(!strcasecmp(s,"true") ||
!strcasecmp(s,"yes") ||
!strcasecmp(s,"1"))
return 1;
else
return 0;
}
void c_bool_diag_toggle(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
int row;
char *text;
GtkWidget *sublist;
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
row = (int)(GTK_CLIST(sublist)->selection->data);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,1,&text);
if(is_true(text))
gtk_clist_set_text(GTK_CLIST(sublist),row,1,"False");
else
gtk_clist_set_text(GTK_CLIST(sublist),row,1,"True");
resensitize_sw(GTK_WIDGET(window));
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
return;
}
void make_bool_dialog(GtkWidget *window){
GtkWidget *diagwin;
GtkWidget *label;
GtkWidget *vbox;
char *text;
int row;
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
row = (int)(GTK_CLIST(sublist)->selection->data);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,0,&text);
diagwin = gnome_dialog_new (text,NULL);
gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox),
vbox, TRUE, TRUE, 10);
gtk_container_border_width (GTK_CONTAINER (vbox), 0);
gtk_widget_show (vbox);
gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
GTK_SIGNAL_FUNC(c_param_diag_delete),
window);
gtk_window_position (GTK_WINDOW (diagwin),GTK_WIN_POS_CENTER);
label = gtk_label_new(text);
gtk_box_pack_start (GTK_BOX (vbox),
label, TRUE, TRUE, 10);
gtk_widget_show (label);
gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
"Toggle",
GNOME_STOCK_MENU_REFRESH);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_HELP);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_CANCEL);
gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
"Delete",
GNOME_STOCK_MENU_CUT);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
GTK_SIGNAL_FUNC(c_bool_diag_toggle),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
GTK_SIGNAL_FUNC(c_help_sel_param),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 2,
GTK_SIGNAL_FUNC(c_param_diag_cancel),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 3,
GTK_SIGNAL_FUNC(c_edit_to_delete),
window);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,1,&text);
if(is_true(text))
label = gtk_label_new("Current value: True");
else
label = gtk_label_new("Current value: False");
gtk_box_pack_start (GTK_BOX (vbox),
label, TRUE, TRUE, 10);
gtk_widget_show (label);
gtk_widget_show(diagwin);
}
void make_edit_dialog(GtkWidget *window){
int i;
char *text;
int row;
GtkWidget *sublist;
desensitize_sw(window);
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
row = (int)(GTK_CLIST(sublist)->selection->data);
gtk_clist_get_text(GTK_CLIST(sublist),
row ,0,&text);
for(i=0;
parm_table[i].label && strcasecmp(text,parm_table[i].label) ;
i++);
if(!parm_table[i].label){
make_entry_dialog(window);
return;
}
gtk_object_set_data(GTK_OBJECT(window),
"pindex",
GINT_TO_POINTER(i));
switch (parm_table[i].type)
{
case P_BOOL:
case P_BOOLREV:
make_bool_dialog(window);
return;
case P_CHAR:
make_entry_dialog(window);
return;
case P_INTEGER:
make_entry_dialog(window);
return;
case P_OCTAL:
make_entry_dialog(window);
return;
case P_STRING:
case P_USTRING:
case P_GSTRING:
case P_UGSTRING:
make_entry_dialog(window);
return;
case P_ENUM:
make_enum_dialog(window);
return;;
default:
make_entry_dialog(window);
return;
}
return;
}
/************************************************************/
/************************************************************/
/************************************************************/
/************************************************************/
void c_entry_insert_help(GtkWidget *button, gpointer data){
make_param_help((char *)data);
return;
}
void c_enum_insert_ok(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
GtkWidget *choicebox;
int pindex;
int row;
char *text[2];
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
choicebox=gtk_object_get_data(GTK_OBJECT(diagwin),"choicebox");
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
text[0] = parm_table[pindex].label;
if(GTK_CLIST(sublist)->selection)
row = (int)(GTK_CLIST(sublist)->selection->data);
else
row=GTK_CLIST(sublist)->rows;
text[1] = gnome_choice_box_get_choice(GNOME_CHOICE_BOX(choicebox));
gtk_clist_insert(GTK_CLIST(sublist),row,text);
resensitize_sw(GTK_WIDGET(window));
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
return;
}
void make_enum_insert(GtkWidget *window){
GtkWidget *diagwin;
GtkWidget *choicebox;
gchar *choices[MAX_ENUM+1];
GtkWidget *label;
GtkWidget *vbox;
int pindex;
struct enum_list *elist;
int i;
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
diagwin = gnome_dialog_new (parm_table[pindex].label,NULL);
gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox),
vbox, TRUE, TRUE, 10);
gtk_container_border_width (GTK_CONTAINER (vbox), 10);
gtk_widget_show (vbox);
gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
GTK_SIGNAL_FUNC(c_param_diag_delete),
window);
gtk_window_position (GTK_WINDOW (diagwin),GTK_WIN_POS_CENTER);
label = gtk_label_new(parm_table[pindex].label);
gtk_box_pack_start (GTK_BOX(vbox),
label, TRUE, TRUE, 0);
gtk_widget_show (label);
gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
"Insert",
GNOME_STOCK_MENU_NEW);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_HELP);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_CANCEL);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
GTK_SIGNAL_FUNC(c_enum_insert_ok),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
GTK_SIGNAL_FUNC(c_entry_insert_help),
parm_table[pindex].label);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 2,
GTK_SIGNAL_FUNC(c_param_diag_cancel),
window);
elist = parm_table[pindex].enum_list;
for(i=0; elist[i].value != -1; i++)
choices[i]= elist[i].name;
choices[i]=NULL;
choicebox=gnome_choice_box_newv(CHOICE_BOX_VV,
NULL,choices);
gtk_object_set_data(GTK_OBJECT(diagwin),"choicebox",choicebox);
gtk_box_pack_start (GTK_BOX(vbox),
choicebox, TRUE, TRUE, 0);
gtk_widget_show(choicebox);
gtk_widget_show(diagwin);
}
void c_entry_insert_ok(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
GtkWidget *entry;
int pindex;
int row;
char *text[2], *p;
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
entry=gtk_object_get_data(GTK_OBJECT(diagwin),"entry");
text[1] = gtk_entry_get_text(GTK_ENTRY(entry));
for(; *text[1] && isspace(*text[1]); text[1]++);
if(!strlen(text[1])){
make_user_mesg("Field is empty","Warning");
return;
}
switch(parm_table[pindex].type){
case P_INTEGER:
for(p = text[1]; *p && isdigit(*p); p++);
if(*p){
make_user_mesg("Integer value required","Warning");
return;
}
break;
case P_OCTAL:
for(p = text[1]; *p && is_oct(*p); p++);
if(*p){
make_user_mesg("Octal value required\ne.g. 0755","Warning");
return;
}
break;
default:
break;
}
text[0] = parm_table[pindex].label;
if(GTK_CLIST(sublist)->selection)
row = (int)(GTK_CLIST(sublist)->selection->data);
else
row=GTK_CLIST(sublist)->rows;
gtk_clist_insert(GTK_CLIST(sublist),row,text);
resensitize_sw(GTK_WIDGET(window));
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
return;
}
void make_entry_insert(GtkWidget *window){
GtkWidget *diagwin;
GtkWidget *entry;
GtkWidget *label;
GtkWidget *entrybox;
GtkWidget *vbox;
int pindex;
GtkRequisition requisition;
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
diagwin = gnome_dialog_new (parm_table[pindex].label,NULL);
gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox),
vbox, TRUE, TRUE, 10);
gtk_container_border_width (GTK_CONTAINER (vbox), 10);
gtk_widget_show (vbox);
gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
GTK_SIGNAL_FUNC(c_param_diag_delete),
window);
gtk_window_position (GTK_WINDOW (diagwin),GTK_WIN_POS_CENTER);
label = gtk_label_new(parm_table[pindex].label);
gtk_box_pack_start (GTK_BOX (vbox),
label, TRUE, TRUE, 10);
gtk_widget_show (label);
gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(diagwin),
"Insert",
GNOME_STOCK_MENU_NEW);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_HELP);
gnome_dialog_append_button(GNOME_DIALOG(diagwin),
GNOME_STOCK_BUTTON_CANCEL);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
GTK_SIGNAL_FUNC(c_entry_insert_ok),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
GTK_SIGNAL_FUNC(c_entry_insert_help),
parm_table[pindex].label);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 2,
GTK_SIGNAL_FUNC(c_param_diag_cancel),
window);
entrybox = gtk_hbox_new(FALSE,0);
gtk_box_pack_start(GTK_BOX (vbox),
entrybox, TRUE, TRUE, 5);
gtk_widget_show(entrybox);
if(parm_table[pindex].type == P_OCTAL)
label = gtk_label_new("Octal Value e.g. 0755:");
else if(parm_table[pindex].type == P_CHAR)
label = gtk_label_new("Enter Character:");
else if(parm_table[pindex].type == P_INTEGER)
label = gtk_label_new("Integer Value:");
else
label = gtk_label_new("Value:");
gtk_box_pack_start (GTK_BOX (entrybox),
label, FALSE, FALSE, 10);
gtk_widget_show (label);
if(parm_table[pindex].type == P_CHAR){
entry = gtk_entry_new_with_max_length(1);
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,20,requisition.height);
}
else if(parm_table[pindex].type == P_OCTAL){
entry = gtk_entry_new_with_max_length(4);
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,40,requisition.height);
}
else if(parm_table[pindex].type == P_INTEGER){
entry = gtk_entry_new_with_max_length(5);
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,50,requisition.height);
}
else{
entry = gtk_entry_new();
gtk_widget_size_request(entry,&requisition);
gtk_widget_set_usize(entry,150,requisition.height);
}
gtk_object_set_data(GTK_OBJECT(diagwin),"entry",entry);
gtk_box_pack_start(GTK_BOX (entrybox),
entry, TRUE, TRUE, 10);
gtk_signal_connect(GTK_OBJECT(entry), "activate",
GTK_SIGNAL_FUNC(c_entry_insert_ok),
window);
gtk_widget_show(entry);
gtk_widget_grab_focus(entry);
gtk_widget_show(diagwin);
return;
}
void c_bool_insert_yes(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
int row;
int pindex;
char *text[2];
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
text[0] = parm_table[pindex].label;
text[1] = "yes";
if(GTK_CLIST(sublist)->selection)
row = (int)(GTK_CLIST(sublist)->selection->data);
else
row=GTK_CLIST(sublist)->rows;
gtk_clist_insert(GTK_CLIST(sublist),row,text);
resensitize_sw(GTK_WIDGET(window));
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
return;
}
void c_bool_insert_no(GtkWidget *button, gpointer window){
GtkWidget *diagwin;
int row;
int pindex;
char *text[2];
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
diagwin=gtk_object_get_data(GTK_OBJECT(window),"dialog");
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
text[0] = parm_table[pindex].label;
text[1] = "no";
if(GTK_CLIST(sublist)->selection)
row = (int)(GTK_CLIST(sublist)->selection->data);
else
row=GTK_CLIST(sublist)->rows;
gtk_clist_insert(GTK_CLIST(sublist),row,text);
resensitize_sw(GTK_WIDGET(window));
gtk_widget_destroy(diagwin);
gtk_object_set_data(GTK_OBJECT(window),"dialog",NULL);
return;
}
void make_bool_insert(GtkWidget *window){
GtkWidget *diagwin;
GtkWidget *label;
GtkWidget *vbox;
int pindex;
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
diagwin = gnome_dialog_new (parm_table[pindex].label,
GNOME_STOCK_BUTTON_YES,
GNOME_STOCK_BUTTON_NO,
GNOME_STOCK_BUTTON_HELP,
GNOME_STOCK_BUTTON_CANCEL,
NULL);
gtk_object_set_data(GTK_OBJECT(window),"dialog",diagwin);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (diagwin)->vbox),
vbox, TRUE, TRUE, 10);
gtk_container_border_width (GTK_CONTAINER (vbox), 10);
gtk_widget_show (vbox);
gtk_signal_connect(GTK_OBJECT(diagwin), "delete_event",
GTK_SIGNAL_FUNC(c_param_diag_delete),
window);
gtk_window_position (GTK_WINDOW (diagwin),GTK_WIN_POS_CENTER);
label = gtk_label_new(parm_table[pindex].label);
gtk_box_pack_start (GTK_BOX (vbox),
label, TRUE, TRUE, 10);
gtk_widget_show (label);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 0,
GTK_SIGNAL_FUNC(c_bool_insert_yes),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 1,
GTK_SIGNAL_FUNC(c_bool_insert_no),
window);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 2,
GTK_SIGNAL_FUNC(c_entry_insert_help),
parm_table[pindex].label);
gnome_dialog_button_connect(GNOME_DIALOG(diagwin), 3,
GTK_SIGNAL_FUNC(c_param_diag_cancel),
window);
gtk_widget_show(diagwin);
}
void inserter_action(GtkWidget *window){
int j, row;
char *text;
int pindex;
GtkWidget *servicelist;
GtkWidget *sublist;
sublist=gtk_object_get_data(GTK_OBJECT(window),"sublist");
servicelist=gtk_object_get_data(GTK_OBJECT(window),"servicelist");
pindex=GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(window),
"pindex"));
if(!sublist){
make_user_mesg("Select or create a service\nto insert into","Message");
return;
}
if(parm_table[pindex].class == P_GLOBAL){
row = (int)(GTK_CLIST(servicelist)->selection->data);
gtk_clist_get_text(GTK_CLIST(servicelist),
row ,0,&text);
if(strcasecmp(text,"global")){
make_user_mesg("This parameter is global in scope only\nswitch service to 'global' to use it",
"Warning");
return;
}
}
desensitize_sw(window);
for(j=0; j < GTK_CLIST(sublist)->rows; j++){
gtk_clist_get_text(GTK_CLIST(sublist),
j,0,&text);
if(!strcasecmp(text,parm_table[pindex].label)){
gtk_clist_select_row(GTK_CLIST(sublist),j,0);
make_edit_dialog(window);
return;
}
}
switch (parm_table[pindex].type)
{
case P_BOOL:
case P_BOOLREV:
make_bool_insert(window);
return;
case P_CHAR:
make_entry_insert(window);
return;
case P_INTEGER:
make_entry_insert(window);
return;
case P_OCTAL:
make_entry_insert(window);
return;
case P_STRING:
case P_USTRING:
case P_GSTRING:
case P_UGSTRING:
make_entry_insert(window);
return;
case P_ENUM:
make_enum_insert(window);
return;;
default:
make_entry_insert(window);
return;
}
make_entry_insert(window);
return;
}
void c_insertmenu_insert(GtkWidget *widget, GtkWidget *window){
int i, row;
GtkWidget *innerbook;
GtkWidget *clist;
GtkWidget *page;
GList *inslists;
GtkWidget *outbook;
outbook=gtk_object_get_data(GTK_OBJECT(window),
"outbook");
inslists=gtk_object_get_data(GTK_OBJECT(window),
"inslists");
i = gtk_notebook_current_page(GTK_NOTEBOOK(outbook));
if(!(innerbook = g_list_nth_data(inslists,i) )){
make_user_mesg("Cannot get active page1",
"Error");
return;
}
i = gtk_notebook_current_page(GTK_NOTEBOOK(innerbook));
if(!(page = g_list_nth_data(GTK_NOTEBOOK(innerbook)->children,i))){
make_user_mesg("Cannot get active page2",
"Error");
return;
}
if(!(clist = ((GtkNotebookPage *)page)->child)){
make_user_mesg("Cannot get active list",
"Error");
return;
}
/*** if gtk version !< 1.1.5 clist in scrolled *****/
if(!(clist = gtk_container_children(GTK_CONTAINER(clist))->data)){
make_user_mesg("Cannot get active list",
"Error");
return;
}
if(!GTK_CLIST(clist)->selection){
make_user_mesg("Select the parmater\nyou wish to enter","Message");
return;
}
row = (int)(GTK_CLIST(clist)->selection->data);
i = (int)gtk_clist_get_row_data(GTK_CLIST(clist),row);
gtk_object_set_data(GTK_OBJECT(window),
"pindex",
GINT_TO_POINTER(i));
inserter_action(window);
return;
}
void c_insertmenu_help(GtkWidget *widget, GtkWidget *window){
int i, row;
GtkWidget *innerbook;
GtkWidget *clist;
GtkWidget *page;
GList *inslists;
GtkWidget *outbook;
outbook=gtk_object_get_data(GTK_OBJECT(window),
"outbook");
inslists=gtk_object_get_data(GTK_OBJECT(window),
"inslists");
i = gtk_notebook_current_page(GTK_NOTEBOOK(outbook));
if(!(innerbook = g_list_nth_data(inslists,i) )){
make_user_mesg("Cannot get active page",
"Error");
return;
}
i = gtk_notebook_current_page(GTK_NOTEBOOK(innerbook));
if(!(page = g_list_nth_data(GTK_NOTEBOOK(innerbook)->children,i))){
make_user_mesg("Cannot get active page",
"Error");
return;
}
if(!(clist = ((GtkNotebookPage *)page)->child)){
make_user_mesg("Cannot get active list",
"Error");
return;
}
/*** if gtk version !< 1.1.5 clist in scrolled *****/
if(!(clist = gtk_container_children(GTK_CONTAINER(clist))->data)){
make_user_mesg("Cannot get active list",
"Error");
return;
}
if(!GTK_CLIST(clist)->selection){
make_user_mesg("Select the parmater\nyou wish to enter","Message");
return;
}
row = (int)(GTK_CLIST(clist)->selection->data);
i = (int)gtk_clist_get_row_data(GTK_CLIST(clist),row);
make_param_help(parm_table[i].label);
return;
}
void c_insertmenu_click(GtkWidget *clist,
gint row,
gint column,
GdkEventButton *event,
gpointer window){
int i;
if(event && event->type==GDK_2BUTTON_PRESS){
i = (int)gtk_clist_get_row_data(GTK_CLIST(clist),row);
gtk_object_set_data(GTK_OBJECT(window),
"pindex",
GINT_TO_POINTER(i));
inserter_action(window);
}
return;
}
void c_make_inserter(GtkWidget *widget, gpointer window){
GtkWidget *inserter;
GtkWidget *outbook;
GList *inslists;
GtkWidget *button;
GtkWidget *clist1, *clist2, *clist3;
GtkWidget *vbox;
GtkWidget *innervbox;
GtkWidget *innerbook;
GtkWidget *scrolled1, *scrolled2, *scrolled3;
GtkWidget *label;
int i;
int row;
inserter=gtk_object_get_data(GTK_OBJECT(window),
"inserter");
if(!inserter){
inslists = NULL;
clist1 = clist2 = clist3 = NULL;
inserter = gtk_dialog_new ();
gtk_object_set_data(GTK_OBJECT(window),
"inserter",inserter);
gtk_window_set_title(GTK_WINDOW(inserter),"Insert Parameters");
gtk_signal_connect_object (GTK_OBJECT (inserter),
"delete_event",
GTK_SIGNAL_FUNC(gtk_widget_hide),
GTK_OBJECT (inserter));
gtk_widget_set_usize(inserter, 420, 300);
button=gnome_stock_pixmap_widget(inserter,
GNOME_STOCK_MENU_NEW);
button=gnome_pixmap_button(button,"Insert");
gtk_box_pack_start(GTK_BOX (GTK_DIALOG (inserter)->action_area),
button, TRUE, TRUE, 10);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(c_insertmenu_insert), window);
gtk_widget_show(button);
button = gnome_stock_button(GNOME_STOCK_BUTTON_HELP);
gtk_box_pack_start(GTK_BOX (GTK_DIALOG (inserter)->action_area),
button, TRUE, TRUE, 10);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(c_insertmenu_help), window);
gtk_widget_show(button);
button=gnome_stock_pixmap_widget(inserter,
GNOME_STOCK_MENU_CLOSE);
button=gnome_pixmap_button(button,"Done");
gtk_box_pack_start(GTK_BOX (GTK_DIALOG (inserter)->action_area),
button, TRUE, TRUE, 10);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(gtk_widget_hide),
GTK_OBJECT(inserter));
gtk_widget_show(button);
vbox=gtk_vbox_new(FALSE,0);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (inserter)->vbox),
vbox, TRUE, TRUE, 0);
gtk_container_border_width (GTK_CONTAINER (vbox), 5);
gtk_widget_show (vbox);
outbook = gtk_notebook_new ();
gtk_object_set_data(GTK_OBJECT(window),
"outbook",outbook);
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (outbook), GTK_POS_LEFT);
gtk_notebook_set_show_border(GTK_NOTEBOOK (outbook),FALSE);
gtk_notebook_set_scrollable(GTK_NOTEBOOK (outbook),TRUE);
gtk_box_pack_start (GTK_BOX (vbox),
outbook, TRUE, TRUE, 0);
gtk_widget_show(outbook);
for(i=0; parm_table[i].label; i++){
if(parm_table[i].type == P_SEP){
innervbox=gtk_vbox_new(FALSE,0);
gtk_widget_show (innervbox);
label = gtk_label_new(parm_table[i].label);
gtk_widget_show (label);
gtk_notebook_append_page (GTK_NOTEBOOK (outbook), innervbox, label);
label = gtk_label_new(" Available Parameters ");
gtk_box_pack_start (GTK_BOX (innervbox),
label, FALSE, TRUE, 0);
gtk_widget_show (label);
innerbook = gtk_notebook_new ();
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (innerbook), GTK_POS_TOP);
gtk_notebook_set_show_border(GTK_NOTEBOOK (innerbook),FALSE);
gtk_box_pack_start (GTK_BOX (innervbox),
innerbook, TRUE, TRUE, 0);
gtk_widget_show (innerbook);
clist1 = gtk_clist_new(1);
gtk_clist_set_selection_mode(GTK_CLIST(clist1),
GTK_SELECTION_BROWSE);
clist2 = gtk_clist_new(1);
gtk_clist_set_selection_mode(GTK_CLIST(clist2),
GTK_SELECTION_BROWSE);
clist3 = gtk_clist_new(1);
gtk_clist_set_selection_mode(GTK_CLIST(clist3),
GTK_SELECTION_BROWSE);
gtk_signal_connect(GTK_OBJECT(clist1),
"select_row",
GTK_SIGNAL_FUNC(c_insertmenu_click),
window);
gtk_signal_connect(GTK_OBJECT(clist2),
"select_row",
GTK_SIGNAL_FUNC(c_insertmenu_click),
window);
gtk_signal_connect(GTK_OBJECT(clist3),
"select_row",
GTK_SIGNAL_FUNC(c_insertmenu_click),
window);
scrolled1 = gtk_scrolled_window_new(NULL, NULL);
scrolled2 = gtk_scrolled_window_new(NULL, NULL);
scrolled3 = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled1),
GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled2),
GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled3),
GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scrolled1), clist1);
gtk_container_add (GTK_CONTAINER (scrolled2), clist2);
gtk_container_add (GTK_CONTAINER (scrolled3), clist3);
gtk_widget_show (clist1);
gtk_widget_show (clist2);
gtk_widget_show (clist3);
gtk_widget_show (scrolled1);
gtk_widget_show (scrolled2);
gtk_widget_show (scrolled3);
label = gtk_label_new(" Global ");
gtk_widget_show (label);
gtk_notebook_append_page (GTK_NOTEBOOK (innerbook), scrolled1, label);
label = gtk_label_new(" Local ");
gtk_widget_show (label);
gtk_notebook_append_page (GTK_NOTEBOOK (innerbook), scrolled2, label);
label = gtk_label_new(" All ");
gtk_widget_show (label);
gtk_notebook_append_page (GTK_NOTEBOOK (innerbook), scrolled3, label);
inslists = g_list_append(inslists,innerbook);
}
else {
if(parm_table[i].class == P_GLOBAL){
row = gtk_clist_append(GTK_CLIST(clist1), &(parm_table[i].label) );
gtk_clist_set_row_data(GTK_CLIST(clist1), row, (gpointer)i);
}
else {
row = gtk_clist_append(GTK_CLIST(clist2), &(parm_table[i].label) );
gtk_clist_set_row_data(GTK_CLIST(clist2), row, (gpointer)i);
}
row = gtk_clist_append(GTK_CLIST(clist3), &(parm_table[i].label) );
gtk_clist_set_row_data(GTK_CLIST(clist3), row, (gpointer)i);
}
}
gtk_notebook_set_page(GTK_NOTEBOOK (outbook),0);
gtk_object_set_data(GTK_OBJECT(window),
"inslists",inslists);
}
gtk_widget_show(inserter);
return;
}
syntax highlighted by Code2HTML, v. 0.9.1