/* GnoSamba 0.3.3 * copyright 1998-9 Perry Piplani * redistributable under the terms of the GPL: * http://www.gnu.org/copyleft/gpl.html */ #include #include #include #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; }