gnome-res.c

Go to the documentation of this file.
00001 /* Gxsm - Gnome X Scanning Microscopy
00002  * universal STM/AFM/SARLS/SPALEED/... controlling and
00003  * data analysis software
00004  *
00005  * Gnome resource helper
00006  * file: gnome-res.c
00007  * 
00008  * Copyright (C) 2001,2002,2003 Percy Zahl
00009  * WWW Home: http://garm.sf.net
00010  * 
00011  * This program is free software; you can redistribute it and/or modify
00012  * it under the terms of the GNU General Public License as published by
00013  * the Free Software Foundation; either version 2 of the License, or
00014  * (at your option) any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00024  */
00025 
00026 #ifdef __cplusplus
00027 extern "C" {
00028 #endif /* __cplusplus */
00029 
00030 #include <gnome.h>
00031 #include <libgnome/libgnome.h>
00032 #include <gconf/gconf-client.h>
00033 #include <gdk/gdk.h>
00034 
00035 #include "config.h"
00036 #include "gnome-res.h"
00037 
00038 /* here debugging is handled special, becasue of the universality of this "add on" gnome code */
00039 extern int debug_level;
00040 #define BE_VERBOSE (debug_level > 3)
00041 
00042 #ifdef BE_VERBOSE
00043 # define DEBUG_VERBOSE(format, args...) do { if (BE_VERBOSE) g_print ("** (" __FILE__ ": %s) Gnome-Res-DEBUG **: \n - " format, __FUNCTION__, ##args); } while(0)
00044 #else
00045 # define DEBUG_VERBOSE(format, args...) ;
00046 #endif
00047 
00048 /* restore all GXSM buildin gconf defaults */
00049 extern int force_gconf_defaults;
00050 
00051 #define PREF_CONFDLG_XSIZE   500
00052 #define PREF_CONFDLG_YSIZE   400
00053 #define PREF_VAR_PADDING     4
00054 #define PREF_VAR_USIZE       150
00055 #define PREF_OPT_USIZE       150
00056 #define PREF_IN_VBOX_PACK_MODE        FALSE, TRUE, 1
00057 #define PREF_IN_HBOX_PACK_MODE        TRUE, TRUE, PREF_VAR_PADDING
00058 
00059 
00060 /* private functions, callbacks */
00061 static void gnome_res_show_info_callback  (GtkWidget *widget, gpointer message);
00062 static void gnome_res_apply_info_callback (GtkDialog* dialog, 
00063                                            gint button_number,
00064                                            gpointer gnome_res_pref
00065         );
00066 static void gnome_res_get_option_callback     (GtkWidget *menuitem, gpointer res);
00067 #if 0
00068 static void gnome_res_new_user_druid_prepare  (GtkWidget *w, gpointer druid, gpointer gp_self);
00069 #endif
00070 static void gnome_res_new_user_druid_next     (GtkWidget *w, gpointer druid, gpointer gp_self);
00071 static void gnome_res_new_user_druid_back     (GtkWidget *w, gpointer druid, gpointer gp_self);
00072 static void gnome_res_new_user_druid_finished (GtkWidget *w, gpointer druid, gpointer gp_self);
00073 static void gnome_res_new_user_druid_cancel   (GtkWidget *w, gpointer druid, gpointer gp_self);
00074 
00075 /* helper functions */
00076 /* g_free result!!! */
00077 gchar *gnome_res_get_resource_string_from_variable (GnomeResEntryInfoType *res);
00078 void gnome_res_make_resource_variable_edit_field   (GnomeResEntryInfoType *res, GtkWidget *hbox);
00079 
00080 /* private functions */
00081 void gnome_res_new_user_druid_construct            (GnomeResNewUserDruid *self);
00082 gint gnome_res_new_user_druid_construct_page       (GnomeResNewUserDruid *self);
00083 void gnome_res_new_user_druid_destroy_druidpages   (GnomeResNewUserDruid *self);
00084 
00085 #define GCONF_APP_PREFIX "/apps/gxsm2/preferences/default"
00086 
00087 GnomeResPreferences *gnome_res_preferences_new (GnomeResEntryInfoType *res_def){
00088         GnomeResPreferences *self = g_new (GnomeResPreferences, 1);
00089         self->res_def = res_def;
00090         DEBUG_VERBOSE ("gnome_res_preferences_new\n");
00091         self->pref_ok_message = NULL;
00092         self->pref_apply_message = NULL;
00093         self->dialog = NULL;
00094         self->running = FALSE;
00095         self->destroy_on_close = TRUE;
00096         self->pref_apply_callback = NULL;
00097         self->pref_apply_callback_data = NULL;
00098         return self;
00099 }
00100 
00101 void gnome_res_destroy (GnomeResPreferences *self){
00102         DEBUG_VERBOSE ("gnome_res_destroy\n");
00103         if (self->running)
00104                 gtk_widget_destroy (GTK_WIDGET (self->dialog));
00105         if (self->pref_ok_message) 
00106                 g_free (self->pref_ok_message);
00107         if (self->pref_apply_message) 
00108                 g_free (self->pref_apply_message);
00109         g_free (self);
00110         DEBUG_VERBOSE ("gnome_res_destroy done.\n");
00111 }
00112 
00113 void gnome_res_set_ok_message (GnomeResPreferences *self, const gchar *ok_msg){
00114         if (self->pref_ok_message) 
00115                 g_free (self->pref_ok_message);
00116         self->pref_ok_message = g_strdup (ok_msg);
00117 }
00118 
00119 void gnome_res_set_apply_message (GnomeResPreferences *self, const gchar *apply_msg){
00120         if (self->pref_apply_message) 
00121                 g_free (self->pref_apply_message);
00122         self->pref_apply_message = g_strdup (apply_msg);
00123 }
00124 
00125 void gnome_res_set_apply_callback (GnomeResPreferences *self, void (*cb)(gpointer), gpointer data){
00126         self->pref_apply_callback = cb;
00127         self->pref_apply_callback_data = data;
00128 }
00129 
00130 void gnome_res_set_destroy_on_close (GnomeResPreferences *self, int flg){
00131         self->destroy_on_close = flg;
00132 }
00133         
00134 gchar *gnome_res_keytranslate (const gchar *name){
00135         gchar *name_key = g_strdelimit (g_strdup (name), ".", '/'); 
00136         gchar *key = g_strconcat (GCONF_APP_PREFIX, "/", name_key, NULL);
00137         g_free (name_key);
00138         return key;
00139 }
00140 
00141 /*
00142  * Read data from resource file or use defaults 
00143  * if entry is not present and set variable to proper value
00144  */
00145 
00146 void gnome_res_read_user_config (GnomeResPreferences *self){
00147         GnomeResEntryInfoType *res;
00148         gchar *respath, *p;
00149         gchar *vec[3], *tmp;
00150         GConfClient *client = gconf_client_get_default ();
00151 
00152         DEBUG_VERBOSE ("gnome_res_read_user_config\n");
00153         if (self->res_def->path)
00154                 respath = gnome_res_keytranslate (self->res_def->path); // first entry holds the validation key
00155         else
00156                 respath = gnome_res_keytranslate ("Unknown/ResSetHasNoValidationKey"); // dummy
00157         // Check if we were configured already, else force buildin defaults
00158         if (!gconf_client_get_string (client, GCONF_APP_PREFIX "/GXSM_Version/oldest", NULL) 
00159             || !gconf_client_get_string (client, respath, NULL)
00160             || force_gconf_defaults){
00161                 GtkWidget *idlg = gtk_message_dialog_new (NULL,
00162                                                           GTK_DIALOG_DESTROY_WITH_PARENT,
00163                                                           GTK_MESSAGE_INFO,
00164                                                           GTK_BUTTONS_CLOSE,
00165                                                           "Config data too old or not yet set,\n"
00166                                                           "creating GXSM G-Configuration section:\n"
00167                                                           "'%s'\n"
00168                                                           "new from build-in defaults. Please review!",
00169                                                           respath);
00170                 
00171                 g_signal_connect_swapped (GTK_OBJECT (idlg), "response",
00172                                           G_CALLBACK (gtk_widget_destroy),
00173                                           GTK_OBJECT (idlg));
00174                 gtk_widget_show (idlg);
00175 
00176                 DEBUG_VERBOSE ("Applying GXSM gconf defaults\n");
00177                 gconf_client_set_string (client, GCONF_APP_PREFIX "/GXSM_Version/oldest", VERSION, NULL);
00178                 gconf_client_set_string (client, respath, "OK - remove this key to reset this section to defaults!", NULL);
00179                 if (force_gconf_defaults)
00180                         force_gconf_defaults = 2;
00181                 else
00182                         force_gconf_defaults = 1;
00183         }
00184         g_free (respath);
00185         gconf_client_set_string (client, GCONF_APP_PREFIX "/GXSM_Version/current", VERSION, NULL);
00186 
00187         for (res = self->res_def; res->type != GNOME_RES_LAST; ++res){
00188                 if (res->type == GNOME_RES_FIRST) ++res;
00189                 if (res->type == GNOME_RES_IGNORE_INFO) continue;
00190                 if (res->type == GNOME_RES_IGNORE_INFO) continue;
00191                 if (!res->path) continue;
00192 
00193                 if (BE_VERBOSE) g_print ("Res->Path=%s\n", res->path);
00194 
00195                 respath = gnome_res_keytranslate (res->path);
00196 
00197                 if (BE_VERBOSE) g_print ("ResPath=%s = %s\n", respath, res->vdefault);
00198                 switch (res->type){
00199                 case GNOME_RES_BOOL: 
00200                         if (BE_VERBOSE) g_print ("-BOOL-\n");
00201                         if (force_gconf_defaults)
00202                                 gconf_client_set_bool (client, respath, !strcasecmp (res->vdefault, "true") || !strcasecmp (res->vdefault, "yes"), NULL);
00203 
00204                         * ((int*) (res->var)) = gconf_client_get_bool (client, respath, NULL);
00205                         break;
00206                 case GNOME_RES_STRING: 
00207                         if (BE_VERBOSE) g_print ("-STRING-\n");
00208                         if (force_gconf_defaults)
00209                                 gconf_client_set_string (client, respath, res->vdefault, NULL);
00210 
00211                         p = gconf_client_get_string (client, respath, NULL);
00212                         if (p)
00213                                 strcpy ((gchar*)res->var, p);
00214                         else{
00215                                 strcpy ((gchar*)res->var, res->vdefault);
00216                                 gconf_client_set_string (client, respath, (gchar*)res->vdefault, NULL);
00217                         }
00218                         break;
00219                 case GNOME_RES_INT: 
00220                         if (BE_VERBOSE) g_print ("-INT-\n");
00221                         if (force_gconf_defaults)
00222                                 gconf_client_set_int (client, respath, atoi (res->vdefault), NULL);
00223 
00224                         * ((int*) (res->var)) = gconf_client_get_int (client, respath, NULL);
00225                         break;
00226                 case GNOME_RES_FLOAT: 
00227                 case GNOME_RES_FLOAT_W_UNIT: 
00228                         if (BE_VERBOSE) g_print ("-FLOAT/_W_UNIT-\n");
00229                         if (force_gconf_defaults)
00230                                 gconf_client_set_float (client, respath, atof (res->vdefault), NULL);
00231 
00232                         * ((float*) (res->var)) = gconf_client_get_float (client, respath, NULL);
00233                         break;
00234                 case GNOME_RES_FLOAT_VEC3:
00235                 case GNOME_RES_FLOAT_VEC4:
00236                         if (BE_VERBOSE) g_print ("-FLOAT_VEC3/4-\n");
00237                         if (force_gconf_defaults)
00238                                 gconf_client_set_string (client, respath, res->vdefault, NULL);
00239 
00240                         p = gconf_client_get_string (client, respath, NULL);
00241                         if (!p){
00242                                 strcpy ((gchar*)res->var, res->vdefault);
00243                                 gconf_client_set_string (client, respath, (gchar*)res->vdefault, NULL);
00244                         }
00245 
00246                         ((float*) (res->var))[0] = atof( strtok_r(p, ", ", vec));       
00247                         tmp = strtok_r(NULL, ", ", vec);
00248                         if (tmp){
00249                                 ((float*) (res->var))[1] = atof(tmp);
00250                                 tmp = strtok_r(NULL, ", ", vec);
00251                                 if (tmp){
00252                                         ((float*) (res->var))[2] = atof(tmp);
00253 
00254                                         if (res->type == GNOME_RES_FLOAT_VEC4){
00255                                                 tmp = strtok_r(NULL, ", ", vec);
00256                                                 if (tmp)
00257                                                         ((float*) (res->var))[3] = atof(tmp);
00258                                         }
00259                                 }
00260                         }
00261                         break;
00262                 default: 
00263                         if (BE_VERBOSE) g_print ("-non-\n");
00264                         break;
00265                 }
00266                 g_free (respath);
00267         }
00268 
00269         if (BE_VERBOSE) g_print ("Read User Config done.\n");
00270         // reset now
00271         if (force_gconf_defaults == 2)
00272                 force_gconf_defaults = 1;
00273         else
00274                 force_gconf_defaults = 0;
00275 }
00276 
00277 /*
00278  * Write data back to resource file
00279  * note: do not call yourself, proper settings of entry and tmp is required!
00280  */
00281 
00282 void gnome_res_write_user_config (GnomeResPreferences *self){
00283         GnomeResEntryInfoType *res;
00284         gchar *respath;
00285         gchar *vecstr=NULL;
00286         gchar *vec[3], *tmp;
00287         GConfClient *client = gconf_client_get_default ();
00288 
00289         DEBUG_VERBOSE ("gnome_res_write_user_config\n");
00290         
00291         for (res = self->res_def; res->type != GNOME_RES_LAST; ++res){
00292                 if (res->type == GNOME_RES_FIRST) ++res;
00293                 if (res->type == GNOME_RES_IGNORE_INFO) continue;
00294                 respath = gnome_res_keytranslate (res->path);
00295 
00296                 if (BE_VERBOSE) g_print ("ResPath=%s = %s\n", respath, res->vdefault);
00297 
00298                 switch (res->type){
00299                 case GNOME_RES_BOOL: 
00300                         if (res->entry)
00301                                 * ((int*) (res->var)) = strcasecmp (gtk_entry_get_text (GTK_ENTRY (res->entry)), "true") == 0;
00302                         if (res->tmp)
00303                                 * ((int*) (res->var)) = strcasecmp (res->tmp, "true") == 0;
00304                         gconf_client_set_bool (client, respath, (* ((int*) (res->var)))?TRUE:FALSE, NULL);
00305                         break;
00306                 case GNOME_RES_STRING: 
00307                         if (res->entry)
00308                                 strcpy ((gchar*)res->var, gtk_entry_get_text (GTK_ENTRY (res->entry)));
00309                         if (res->tmp)
00310                                 strcpy ((gchar*)res->var, res->tmp);
00311                         gconf_client_set_string (client, respath, (gchar*)res->var, NULL);
00312                         break;
00313                 case GNOME_RES_INT: 
00314                         if (res->entry)
00315                                 * ((int*) (res->var)) =  atoi (gtk_entry_get_text (GTK_ENTRY (res->entry)));
00316                         if (res->tmp)
00317                                 * ((int*) (res->var)) =  atoi (res->tmp);
00318                         gconf_client_set_int (client, respath, * ((int*) (res->var)), NULL);
00319                         break;
00320                 case GNOME_RES_FLOAT: 
00321                 case GNOME_RES_FLOAT_W_UNIT: 
00322                         if (res->entry)
00323                                 * ((float*) (res->var)) = atof (gtk_entry_get_text (GTK_ENTRY (res->entry)));
00324                         if (res->tmp)
00325                                 * ((float*) (res->var)) = atof (res->tmp);
00326                         gconf_client_set_float (client, respath, * ((float*) (res->var)), NULL);
00327                         break;
00328                 case GNOME_RES_FLOAT_VEC3:
00329                 case GNOME_RES_FLOAT_VEC4:
00330                         vecstr=NULL;
00331                         if (res->entry)
00332                                 vecstr = g_strdup (gtk_entry_get_text (GTK_ENTRY (res->entry)));
00333                         if (res->tmp){
00334                                 if (vecstr) g_free (vecstr);
00335                                 vecstr = g_strdup (res->tmp);
00336                         }
00337                         if (vecstr){
00338                                 gconf_client_set_string (client, respath, vecstr, NULL);
00339 
00340                                 ((float*) (res->var))[0] = atof( strtok_r(vecstr,  ", ", vec));
00341                                 tmp = strtok_r(NULL, ", ", vec);
00342                                 if (tmp){
00343                                         ((float*) (res->var))[1] = atof(tmp);
00344                                         tmp = strtok_r(NULL, ", ", vec);
00345                                         if (tmp){
00346                                                 ((float*) (res->var))[2] = atof(tmp);
00347 
00348                                                 if (res->type == GNOME_RES_FLOAT_VEC4){
00349                                                         tmp = strtok_r(NULL, ", ", vec);
00350                                                         if (tmp)
00351                                                                 ((float*) (res->var))[3] = atof(tmp);
00352                                                 }
00353                                         }
00354                                 }
00355                                 g_free (vecstr);
00356                         }
00357                         break;
00358                 default: 
00359                         break;
00360                 }
00361                 g_free (respath);
00362         }
00363 }        
00364 
00365 static void gnome_res_show_info_callback (GtkWidget *widget, gpointer message){
00366         GtkWidget *dialog = gtk_message_dialog_new (NULL,
00367                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
00368                                                     GTK_MESSAGE_INFO,
00369                                                     GTK_BUTTONS_CLOSE,
00370                                                     message);
00371         g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
00372                                   G_CALLBACK (gtk_widget_destroy),
00373                                   GTK_OBJECT (dialog));
00374         gtk_widget_show (dialog);
00375 }
00376 
00377 static void gnome_res_apply_info_callback (GtkDialog *dialog, 
00378                                            gint response, 
00379                                            gpointer gp_self){
00380         GnomeResPreferences *self = (GnomeResPreferences *) gp_self;
00381         switch (response){
00382         case GTK_RESPONSE_ACCEPT: 
00383                 gnome_res_write_user_config (self);
00384                 gtk_widget_destroy (GTK_WIDGET (dialog));
00385                 if (self->pref_ok_message){
00386                         GtkWidget *dialog = gtk_message_dialog_new (NULL,
00387                                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
00388                                                                     GTK_MESSAGE_INFO,
00389                                                                     GTK_BUTTONS_OK,
00390                                                                     self->pref_ok_message);
00391                         gtk_dialog_run (GTK_DIALOG (dialog));
00392                         gtk_widget_destroy (dialog);
00393                 }
00394                 self->running = FALSE;
00395                 if (self->destroy_on_close)
00396                         gnome_res_destroy (self);
00397                 if (self->pref_apply_callback)
00398                         (*self->pref_apply_callback)(self->pref_apply_callback_data);
00399                 break;
00400         case GTK_RESPONSE_APPLY: 
00401                 gnome_res_write_user_config (self);
00402                 if (self->pref_apply_message){
00403                         GtkWidget *dialog = gtk_message_dialog_new (NULL,
00404                                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
00405                                                                     GTK_MESSAGE_INFO,
00406                                                                     GTK_BUTTONS_OK,
00407                                                                     self->pref_apply_message);
00408                         gtk_dialog_run (GTK_DIALOG (dialog));
00409                         gtk_widget_destroy (dialog);
00410                 }
00411                 if (self->pref_apply_callback)
00412                         (*self->pref_apply_callback)(self->pref_apply_callback_data);
00413                 break;
00414         case GTK_RESPONSE_CANCEL: 
00415                 gtk_widget_destroy (GTK_WIDGET (dialog));
00416                 self->running = FALSE;
00417                 if (self->destroy_on_close)
00418                         gnome_res_destroy (self);
00419                 break;
00420         }
00421 }
00422 
00423 gchar *gnome_res_get_resource_string_from_variable (GnomeResEntryInfoType *res){
00424         
00425         switch (res->type){
00426         case GNOME_RES_BOOL: 
00427                 return g_strdup_printf ("%s", * ((int*) (res->var)) ? "true":"false");
00428         case GNOME_RES_STRING: 
00429                 return g_strdup_printf ("%s", ((gchar*) (res->var)));
00430         case GNOME_RES_INT: 
00431                 return g_strdup_printf ("%d", * ((int*) (res->var)));
00432         case GNOME_RES_FLOAT: 
00433                 return g_strdup_printf ("%g", * ((float*) (res->var)));
00434         case GNOME_RES_FLOAT_W_UNIT: 
00435                 return g_strdup_printf ("%g %s", * ((float*) (res->var)), *res->options);
00436         case GNOME_RES_FLOAT_VEC3: 
00437                 return g_strdup_printf ("%g, %g, %g", 
00438                                         ((float*) (res->var))[0], 
00439                                         ((float*) (res->var))[1], 
00440                                         ((float*) (res->var))[2]);
00441         case GNOME_RES_FLOAT_VEC4: 
00442                 return g_strdup_printf ("%g, %g, %g, %g", 
00443                                         ((float*) (res->var))[0], 
00444                                         ((float*) (res->var))[1], 
00445                                         ((float*) (res->var))[2], 
00446                                         ((float*) (res->var))[3]);
00447         default: 
00448                 break;
00449         }
00450         return g_strdup ("Illegal Ressource Type");
00451 }
00452 
00453 void gnome_res_adjustment_callback(GtkAdjustment *adj, GnomeResEntryInfoType *res){
00454         * ((float*) res->var) = (float) adj->value;
00455 
00456         if (((GnomeResEntryInfoType *) res)->tmp) 
00457                 g_free (((GnomeResEntryInfoType *) res)->tmp);
00458 
00459         ((GnomeResEntryInfoType *) res)->tmp = g_strdup_printf ("%g", adj->value);
00460 
00461         if (res->changed_callback)
00462                 (*res->changed_callback)(res->moreinfo);
00463 }
00464 
00465 void gnome_res_colorchange_callback(GnomeColorPicker *colorsel, 
00466                                     guint r, guint g, guint b, guint a, 
00467                                     GnomeResEntryInfoType *res){
00468         gdouble color[4];
00469         gnome_color_picker_get_d (colorsel,  &color[0], &color[1], &color[2], &color[3]);
00470 
00471         ((float *)(res->var))[0] = (float) color[0];
00472         ((float *)(res->var))[1] = (float) color[1];
00473         ((float *)(res->var))[2] = (float) color[2];
00474         ((float *)(res->var))[3] = (float) color[3];
00475 
00476         if (((GnomeResEntryInfoType *) res)->tmp) 
00477                 g_free (((GnomeResEntryInfoType *) res)->tmp);
00478 
00479         ((GnomeResEntryInfoType *) res)->tmp = g_strdup_printf ("%g, %g, %g, %g", 
00480                                                                 color[0], color[1], color[2], color[3]);
00481         if (res->changed_callback)
00482                 (*res->changed_callback)(res->moreinfo);
00483 }
00484 
00485 
00486 void gnome_res_fontchange_callback(GnomeFontPicker *gfp, gchar *arg1, GnomeResEntryInfoType *res){
00487 
00488         if (((GnomeResEntryInfoType *) res)->tmp) 
00489                 g_free (((GnomeResEntryInfoType *) res)->tmp);
00490 
00491         ((GnomeResEntryInfoType *) res)->tmp = g_strdup (gnome_font_picker_get_font_name (gfp));
00492 
00493         if (res->changed_callback)
00494                 (*res->changed_callback)(res->moreinfo);
00495 }
00496 
00497 
00498 void gnome_res_make_resource_variable_edit_field (GnomeResEntryInfoType *res, 
00499                                                   GtkWidget *hbox){
00500         GtkWidget *VarName;
00501         GtkWidget *variable=NULL;
00502         int defaultidx;
00503         int i;
00504         gchar **option;
00505         
00506         // Variable Name
00507         VarName = gtk_label_new (res->path);
00508         gtk_widget_set_usize (VarName, PREF_VAR_USIZE, -1);
00509         gtk_widget_show (VarName);
00510         gtk_label_set_justify (GTK_LABEL (VarName), GTK_JUSTIFY_LEFT);
00511         gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00512         gtk_misc_set_padding (GTK_MISC (VarName), PREF_VAR_PADDING, 0);
00513         
00514         gtk_box_pack_start (GTK_BOX (hbox), VarName, PREF_IN_HBOX_PACK_MODE);
00515         
00516         res->entry = NULL;
00517         res->tmp   = NULL;
00518 
00519         switch (res->edit_type){
00520         case GNOME_RES_EDIT_NO: break;
00521         case GNOME_RES_EDIT_OPTIONS:
00522                 // Variable Edit: choice (if options) else text entry
00523                 if (res->options && res->type != GNOME_RES_FLOAT_W_UNIT){
00524                         GtkWidget *wid, *menu, *menuitem;
00525                         
00526                         wid = gtk_option_menu_new ();
00527                         gtk_widget_set_usize (wid, PREF_OPT_USIZE, -1);
00528                         gtk_container_add (GTK_CONTAINER (hbox), wid);
00529                         
00530                         menu = gtk_menu_new ();
00531                         
00532                         /* Init Choicelist */
00533                         defaultidx=0;
00534                         for (i=0, option = res->options; *option; ++option, ++i){
00535                                 if (res->option_text_format){
00536                                         gchar *menuitemtext = g_strdup_printf (res->option_text_format, *option, res->option_data[i]);
00537                                         menuitem = gtk_menu_item_new_with_label (menuitemtext);
00538                                         g_free (menuitemtext);
00539                                 }
00540                                 else
00541                                         menuitem = gtk_menu_item_new_with_label (*option);
00542                                 
00543                                 gtk_menu_append (GTK_MENU (menu), menuitem);
00544                                 /* connect with signal-handler if selected */
00545                                 gtk_object_set_data (GTK_OBJECT (menuitem), "entrydata", (gpointer)*option);
00546                                 gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
00547                                                     GTK_SIGNAL_FUNC (gnome_res_get_option_callback),
00548                                                     (gpointer) res);
00549                                 {
00550                                         gchar *s;
00551                                         if (strcmp (*option, s=gnome_res_get_resource_string_from_variable (res)) == 0)
00552                                                 defaultidx=i;
00553                                         g_free (s);
00554                                 }
00555                                 
00556                         }
00557                         gtk_option_menu_set_menu (GTK_OPTION_MENU (wid), menu);
00558                         gtk_option_menu_set_history (GTK_OPTION_MENU (wid), defaultidx);
00559                 }
00560                 break;
00561         case GNOME_RES_EDIT_ENTRY:
00562                 {
00563                         gchar *resdata;
00564                         variable = gtk_entry_new ();
00565                         res->entry = variable;
00566                         
00567                         resdata = gnome_res_get_resource_string_from_variable (res);
00568                         
00569                         gtk_entry_set_text (GTK_ENTRY (variable), resdata);
00570                         g_free (resdata);
00571                 }
00572                 break;
00573         case GNOME_RES_EDIT_VALSLIDER:
00574                 {
00575                         GtkObject *adj = gtk_adjustment_new ( (gfloat) *((float*) (res->var)),
00576                                                               (gfloat) atof (res->options[0]), // lower
00577                                                               (gfloat) atof (res->options[1]), // upper
00578                                                               (gfloat) atof (res->options[2]), // step
00579                                                               (gfloat) atof (res->options[3]), // page inc
00580                                                               (gfloat) 0);                     // page size
00581                         variable = gtk_hscale_new (GTK_ADJUSTMENT (adj));
00582                         gtk_scale_set_value_pos (GTK_SCALE (variable), GTK_POS_LEFT);
00583                         gtk_scale_set_digits (GTK_SCALE (variable), (gint) atoi (res->options[4]));
00584                         gtk_range_set_update_policy (GTK_RANGE (variable), GTK_UPDATE_DELAYED);
00585                         
00586                         gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
00587                                             GTK_SIGNAL_FUNC (gnome_res_adjustment_callback), (gpointer) res);
00588                 }
00589                 break;
00590         case GNOME_RES_EDIT_COLORSEL:
00591                 {
00592                         variable = gnome_color_picker_new ();
00593                         if (res->name)
00594                                 gnome_color_picker_set_title (GNOME_COLOR_PICKER (variable), res->name);
00595                         gnome_color_picker_set_use_alpha (GNOME_COLOR_PICKER (variable), TRUE);
00596                         gnome_color_picker_set_d (GNOME_COLOR_PICKER (variable),
00597                                                   (gdouble)((float *)(res->var))[0],
00598                                                   (gdouble)((float *)(res->var))[1],
00599                                                   (gdouble)((float *)(res->var))[2],
00600                                                   (gdouble)((float *)(res->var))[3]);
00601                         gtk_signal_connect (GTK_OBJECT (variable), "color_set",
00602                                             GTK_SIGNAL_FUNC (gnome_res_colorchange_callback), 
00603                                             (gpointer) res);
00604                 }
00605                 break;
00606         case GNOME_RES_EDIT_FONTSEL:
00607                 {
00608                         variable = gnome_font_picker_new ();
00609                         if (res->name)
00610                                 gnome_font_picker_set_title (GNOME_FONT_PICKER (variable), res->name);
00611                         gnome_font_picker_set_mode (GNOME_FONT_PICKER (variable), GNOME_FONT_PICKER_MODE_FONT_INFO);
00612                         gnome_font_picker_set_preview_text (GNOME_FONT_PICKER (variable), "ABCabc123");
00613                         gnome_font_picker_set_font_name (GNOME_FONT_PICKER (variable), res->var);
00614                         gtk_signal_connect (GTK_OBJECT (variable), "font_set",
00615                                             GTK_SIGNAL_FUNC (gnome_res_fontchange_callback), 
00616                                             (gpointer) res);
00617                 }
00618                 break;
00619         }
00620         if (variable)
00621                 gtk_box_pack_start (GTK_BOX (hbox), variable, PREF_IN_HBOX_PACK_MODE);
00622 }
00623 
00624 
00625 static void gnome_res_get_option_callback (GtkWidget *menuitem, gpointer res){
00626         if (((GnomeResEntryInfoType *) res)->tmp) 
00627                 g_free (((GnomeResEntryInfoType *) res)->tmp);
00628 
00629         ((GnomeResEntryInfoType *) res)->tmp = g_strdup (
00630                 (gchar*)gtk_object_get_data (GTK_OBJECT (menuitem), "entrydata")
00631                 );
00632 }
00633 
00634 /*
00635  * Automaticalls pareses resources to tabbed folder dlg
00636  */
00637 void gnome_res_run_change_user_config (GnomeResPreferences *self, const gchar *dialog_title){
00638         GtkWidget *notebook;
00639         GtkWidget *scrolled_contents;
00640         GtkWidget *vbox;
00641         GtkWidget *hbox;
00642         GtkWidget *help;
00643         int pageno;
00644         
00645         GnomeResEntryInfoType *res;
00646         const gchar *pagename;
00647 
00648         if (self->running) return;
00649         self->running = TRUE;
00650         
00651         DEBUG_VERBOSE ("gnome_res_run_change_user_config\n");
00652         
00653         self->dialog = gtk_dialog_new_with_buttons (_(dialog_title),
00654                                                     NULL,
00655                                                     (GtkDialogFlags)(GTK_DIALOG_DESTROY_WITH_PARENT),
00656                                                     GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
00657                                                     GTK_STOCK_APPLY, GTK_RESPONSE_APPLY,
00658                                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
00659                                                     NULL);
00660         
00661         gtk_window_get_resizable (GTK_WINDOW (self->dialog));
00662         
00663         gtk_widget_set_size_request  (self->dialog, PREF_CONFDLG_XSIZE, PREF_CONFDLG_YSIZE);
00664         
00665         notebook = gtk_notebook_new ();
00666         gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE);
00667 
00668         gtk_box_pack_start (GTK_BOX (GTK_DIALOG (self->dialog)->vbox),
00669                            notebook, TRUE, TRUE, GNOME_PAD);
00670         
00671         for (res = self->res_def, pageno=0; res->type != GNOME_RES_LAST; ++pageno){
00672                 if (res->type == GNOME_RES_FIRST) ++res;
00673                 DEBUG_VERBOSE ("ResEdit page=%d\n", pageno);
00674                 pagename = res->group;
00675                 scrolled_contents = gtk_scrolled_window_new (NULL, NULL);
00676                 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_contents), 
00677                                                 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
00678                 vbox = gtk_vbox_new (FALSE, 0);
00679                 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_contents), vbox);
00680                 
00681                 for (; res->type != GNOME_RES_LAST && strcmp (res->group, pagename)==0; ++res){
00682                         DEBUG_VERBOSE ("ResEdit res=%s\n", res->path);
00683                         res->entry = NULL;
00684                         if (res->type == GNOME_RES_SEPARATOR){
00685                           gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new(), PREF_IN_VBOX_PACK_MODE);
00686                           if (res->comment){
00687                                 help = gtk_label_new (res->comment);
00688                                 gtk_label_set_justify (GTK_LABEL (help), GTK_JUSTIFY_LEFT);
00689                                 gtk_box_pack_start (GTK_BOX (vbox), help, PREF_IN_HBOX_PACK_MODE);
00690                                 gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new(), PREF_IN_VBOX_PACK_MODE);
00691                           }
00692                           continue;
00693                         }
00694                         if (res->type == GNOME_RES_IGNORE_INFO) continue;
00695                         
00696                         hbox = gtk_hbox_new (FALSE, 0);
00697                         
00698                         gnome_res_make_resource_variable_edit_field (res, hbox);
00699                         
00700                         help = gtk_button_new_with_label (_("Help"));
00701                         gtk_box_pack_start (GTK_BOX (hbox), help, PREF_IN_HBOX_PACK_MODE);
00702                         gtk_signal_connect (GTK_OBJECT (help), "clicked",
00703                                             GTK_SIGNAL_FUNC (gnome_res_show_info_callback),
00704                                             (void*)res->comment);
00705                         
00706                         gtk_box_pack_start (GTK_BOX (vbox), hbox, PREF_IN_VBOX_PACK_MODE);
00707                         
00708                 }
00709                 gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
00710                                           scrolled_contents,
00711                                           gtk_label_new (pagename));
00712         }
00713         
00714         gtk_signal_connect (GTK_OBJECT (self->dialog), "response",
00715                             GTK_SIGNAL_FUNC (gnome_res_apply_info_callback),
00716                             (gpointer*) self);
00717 
00718         gtk_object_set_data (GTK_OBJECT (self->dialog), "self", (gpointer) self);
00719         gtk_widget_show_all (self->dialog);
00720 }
00721 
00722 
00723 
00724 /* New user wellcome and initial 
00725  * res data setup guide
00726  * ========================================
00727  */
00728 GnomeResNewUserDruid *gnome_res_new_user_druid_new (GnomeResEntryInfoType *res_def, const gchar *title){
00729         return gnome_res_new_user_druid_new_with_vals (res_def, title, NULL, NULL, 
00730                                                        "Welcome", "Setup", "Done", "Have fun!");
00731 }
00732 
00733 GnomeResNewUserDruid *gnome_res_new_user_druid_new_with_vals (GnomeResEntryInfoType *res_def, 
00734                                                               const gchar *title,
00735                                                               GdkPixbuf *logo,
00736                                                               GdkPixbuf *watermark,
00737                                                               const gchar *welcome, 
00738                                                               const gchar *intro_text, 
00739                                                               const gchar *finish, 
00740                                                               const gchar *final_text
00741         ){
00742         GnomeResNewUserDruid *self = g_new (GnomeResNewUserDruid, 1);
00743         DEBUG_VERBOSE ("gnome_res_new_user_druid_new_with_vals: 1 \n");
00744 
00745         self->res_pref = gnome_res_preferences_new (res_def);
00746         self->title      = g_strdup (title);
00747         self->logo       = logo;
00748         self->watermark  = watermark;
00749         self->welcome    = g_strdup (welcome);
00750         self->intro_text = g_strdup (intro_text);
00751         self->finish     = g_strdup (finish);
00752         self->final_text = g_strdup (final_text);
00753         self->startpage  = NULL;
00754         self->page       = NULL;
00755         self->finishpage = NULL;
00756         self->pageindex  = 0;
00757         self->pagescreated = 0;
00758         
00759         gnome_res_read_user_config (self->res_pref);
00760         
00761         self->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00762         gtk_window_set_title (GTK_WINDOW (self->window), self->title);
00763         
00764         gnome_res_new_user_druid_construct (self);
00765         
00766         gtk_container_add (GTK_CONTAINER (self->window), self->druid);
00767         
00768         return self;
00769 }
00770 
00771 void gnome_res_new_user_druid_destroy (GnomeResNewUserDruid *self){
00772         DEBUG_VERBOSE ("gnome_res_new_user_druid_destroy: Druid destroy, free\n");
00773         g_free (self->title);
00774         g_free (self->welcome);
00775         g_free (self->intro_text);
00776         g_free (self->finish);
00777         g_free (self->final_text);
00778         gnome_res_destroy (self->res_pref);
00779         g_free (self);
00780 }
00781 
00782 
00783 // for some strange reason the "select" mechanish via depend_func
00784 // works not in Gxsm, but in my druid test Prog :-( 
00785 // Disabled by this define:
00786 #define NO_SELECT_PAGES
00787 void gnome_res_new_user_druid_construct (GnomeResNewUserDruid *self){
00788         DEBUG_VERBOSE ("gnome_res_new_user_druid_construct: ..1\n");
00789         self->druid = gnome_druid_new ();
00790 
00791         self->startpage = gnome_druid_page_edge_new_with_vals (
00792                 GNOME_EDGE_START, TRUE,
00793                 self->welcome,  self->intro_text,  self->logo,  self->watermark, NULL);
00794         gnome_druid_append_page (
00795                 GNOME_DRUID (self->druid), GNOME_DRUID_PAGE (self->startpage));
00796         gtk_object_set_data (GTK_OBJECT (self->startpage), "self", (gpointer) self);
00797 
00798         gtk_signal_connect (GTK_OBJECT (self->startpage), "cancel",
00799                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_cancel),
00800                             (gpointer) self);
00801 #ifndef NO_SELECT_PAGES
00802         gtk_signal_connect (GTK_OBJECT (self->startpage), "next",
00803                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_next),
00804                             (gpointer) self);
00805 #endif
00806         
00807 #ifdef NO_SELECT_PAGES
00808         do{
00809                 gnome_res_new_user_druid_construct_page (self);
00810 
00811                 if (self->page){
00812                         ++self->pagescreated;
00813                         DEBUG_VERBOSE ("NEXT: adding page\n");
00814                         gnome_druid_append_page (GNOME_DRUID (self->druid), 
00815                                                  GNOME_DRUID_PAGE (self->page));
00816                         gtk_object_set_data (GTK_OBJECT (self->page), "self", (gpointer) self);
00817                 }
00818         }while (self->page);
00819 #endif
00820 
00821 
00822         self->finishpage = gnome_druid_page_edge_new_with_vals (
00823                 GNOME_EDGE_FINISH, TRUE,
00824                 self->finish, self->final_text, self->logo, self->watermark, NULL);
00825 
00826         gnome_druid_append_page 
00827                  (GNOME_DRUID (self->druid), GNOME_DRUID_PAGE (self->finishpage));
00828         gtk_object_set_data (GTK_OBJECT (self->finishpage), "self", (gpointer) self);
00829         gtk_object_set_data (GTK_OBJECT (self->finishpage), "beforeself", (gpointer) self->startpage);
00830         gtk_object_set_data (GTK_OBJECT (self->startpage), "behindeself", (gpointer) self->finishpage);
00831 
00832         gtk_signal_connect (GTK_OBJECT (self->finishpage), "finish",
00833                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_finished),
00834                             (gpointer) self);
00835         gtk_signal_connect (GTK_OBJECT (self->finishpage), "cancel",
00836                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_cancel),
00837                             (gpointer) self);
00838 #ifndef NO_SELECT_PAGES
00839         gtk_signal_connect (GTK_OBJECT (self->startpage), "back",
00840                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_back),
00841                             (gpointer) self);
00842 #endif  
00843 }
00844 
00845 gint gnome_res_new_user_druid_construct_page (GnomeResNewUserDruid *self){
00846         static GnomeResEntryInfoType *res=NULL;
00847         GtkWidget *scrolled_window = NULL;
00848         GtkWidget *vbox;
00849         GtkWidget *hbox;
00850         GtkWidget *help;
00851         int num;
00852         const gchar *pagename;
00853         /*    GdkFont *helptxtfont = gdk_font_load ("-adobe-helvetica-medium-r-normal-*-*-100-*-*-p-*-iso8859-1"); */
00854         
00855         DEBUG_VERBOSE ("gnome_res_new_user_druid_construct_page\n");
00856         
00857         self->page = NULL;
00858         if (!res) res = self->res_pref->res_def;
00859         if (res->type == GNOME_RES_LAST) return FALSE;
00860         
00861         for (; res->type != GNOME_RES_LAST; ){
00862                 if (res->type == GNOME_RES_FIRST) ++res;
00863                 DEBUG_VERBOSE ("DruidPageConstruct: path=%s group=%s\n", res->path, res->group);
00864 #ifndef NO_SELECT_PAGES
00865                 if (res->depend_func)
00866                         if (! (*res->depend_func)()){
00867                                 DEBUG_VERBOSE ("skipping, depfkt does not match!\n");
00868                                 ++res;
00869                                 continue;
00870                         }
00871 #endif
00872                 pagename = res->group;
00873                 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
00874                 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), 
00875                                                 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
00876                 vbox = gtk_vbox_new (FALSE, 0);
00877                 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), vbox);
00878                 
00879                 for (num=0; res->type != GNOME_RES_LAST && strcmp (res->group, pagename)==0; ++res){
00880                         DEBUG_VERBOSE ("in group, path=%s\n", res->path);
00881                         res->entry = NULL;
00882                         if (res->level == GNOME_RES_LEVEL_AUTO) continue;
00883 #ifndef NO_SELECT_PAGES
00884                         if (res->depend_func)
00885                                 if (! (*res->depend_func)()){
00886                                         DEBUG_VERBOSE ("skipping, depfkt does not match!\n");
00887                                         continue;
00888                                 }
00889 #endif
00890                         ++num;
00891                         
00892                         if (res->type == GNOME_RES_IGNORE_INFO){
00893                                 gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), PREF_IN_VBOX_PACK_MODE);
00894                                 // --------------
00895                                 hbox = gtk_hbox_new (FALSE, 0);
00896                                 // Add Comments and Section Info
00897                                 help = gtk_label_new (res->comment);
00898                                 gtk_label_set_justify (GTK_LABEL (help), GTK_JUSTIFY_LEFT);
00899                                 //gtk_label_set_line_wrap (GTK_LABEL (help), TRUE);
00900                                 
00901                                 //help = gtk_text_new (NULL, NULL);
00902                                 //gtk_text_set_word_wrap (GTK_TEXT (help), TRUE);
00903                                 //gtk_text_insert (GTK_TEXT (help), helptxtfont, NULL, NULL, res->comment, -1);
00904                                 
00905                                 gtk_box_pack_start (GTK_BOX (hbox), help, PREF_IN_HBOX_PACK_MODE);
00906                                 gtk_box_pack_start (GTK_BOX (vbox), hbox, PREF_IN_VBOX_PACK_MODE);
00907                                 
00908                         }else{
00909 
00910                                 gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), PREF_IN_VBOX_PACK_MODE);
00911                                 // --------------
00912                                 hbox = gtk_hbox_new (FALSE, 0);
00913                                 // Help Text/Choices
00914                                 help = gtk_label_new (res->comment);
00915                                 gtk_label_set_justify (GTK_LABEL (help), GTK_JUSTIFY_LEFT);
00916                                 gtk_misc_set_alignment (GTK_MISC (help), 0.0, 0.5);
00917                                 gtk_box_pack_start (GTK_BOX (hbox), help, PREF_IN_HBOX_PACK_MODE);
00918                                 gtk_box_pack_start (GTK_BOX (vbox), hbox, PREF_IN_VBOX_PACK_MODE);
00919                                 // --------------
00920                                 hbox = gtk_hbox_new (FALSE, 0);
00921                                 
00922                                 gnome_res_make_resource_variable_edit_field (res, hbox);
00923 
00924                                 gtk_box_pack_start (GTK_BOX (vbox), hbox, PREF_IN_VBOX_PACK_MODE);
00925                         }
00926                 }
00927                 if (num){
00928                         self->page = gnome_druid_page_standard_new_with_vals (pagename, self->logo, self->watermark);
00929                         gtk_box_pack_start (GTK_BOX ((GNOME_DRUID_PAGE_STANDARD (self->page))->vbox),
00930                                             GTK_WIDGET (scrolled_window), TRUE, TRUE, 0);
00931                         break;
00932                 }
00933         }
00934         return self->page ? TRUE:FALSE;
00935 }
00936 
00937 GnomeResDruidFinishType gnome_res_new_user_druid_run_druids (GnomeResNewUserDruid *self){
00938         DEBUG_VERBOSE ("gnome_res_new_user_druid_run_druids\n");
00939         
00940         self->finishmode = GNOME_RES_DRUID_RUNNING;
00941         gtk_widget_show_all (GTK_WIDGET (self->window));
00942         
00943         gtk_main ();
00944         
00945         return self->finishmode;
00946 }
00947 
00948 void gnome_res_new_user_druid_destroy_druidpages (GnomeResNewUserDruid *self) {
00949         DEBUG_VERBOSE ("gnome_res_new_user_druid_destroy_druidpages: Druid destroy druids\n");
00950         gtk_object_destroy (GTK_OBJECT (self->druid));
00951         DEBUG_VERBOSE ("Druid destroy window\n");
00952         gtk_widget_destroy (self->window);
00953 //      DEBUG_VERBOSE ("Druid destroy startpage\n");
00954 //      gtk_object_destroy (GTK_OBJECT (self->startpage));
00955         // gslist...
00956 //      DEBUG_VERBOSE ("Druid destroy finishpage\n");
00957         //    gtk_object_destroy (GTK_OBJECT (self->finishpage));
00958         DEBUG_VERBOSE ("Druid destroy done.\n");
00959 }
00960 
00961 #if 0
00962 static void gnome_res_new_user_druid_prepare (GtkWidget *w, gpointer druid, gpointer gp_self) {
00963         GnomeResNewUserDruid *self =  (GnomeResNewUserDruid *) gp_self;
00964         DEBUG_VERBOSE ("PREPARE: %d (%d)\n", self->pageindex, self->pagescreated);
00965 }
00966 #endif
00967 
00968 static void gnome_res_new_user_druid_next (GtkWidget *w, gpointer druid, gpointer gp_self) {
00969         GnomeResNewUserDruid *self =  (GnomeResNewUserDruid *) gp_self;
00970         DEBUG_VERBOSE ("NEXTv: %d (%d)\n", self->pageindex, self->pagescreated);
00971 
00972         gnome_res_write_user_config (self->res_pref);
00973 
00974         if (++self->pageindex > self->pagescreated){
00975                 GtkWidget *BackPage = self->page ? self->page : self->startpage;
00976                 DEBUG_VERBOSE ("NEXT: checking/creating new page\n");
00977 
00978                 gnome_res_new_user_druid_construct_page (self);
00979 
00980                 if (self->page){
00981                         ++self->pagescreated;
00982                         DEBUG_VERBOSE ("NEXT: adding page\n");
00983                         gnome_druid_insert_page (GNOME_DRUID (self->druid), 
00984                                                  GNOME_DRUID_PAGE (BackPage), 
00985                                                  GNOME_DRUID_PAGE (self->page));
00986                         /* insert into double linked list */
00987                         gtk_object_set_data (GTK_OBJECT (self->page), "self", (gpointer) self);
00988                         gtk_object_set_data (GTK_OBJECT (self->page), "before_self", (gpointer) BackPage);
00989                         gtk_object_set_data (GTK_OBJECT (self->page), "behind_self", (gpointer) self->finishpage);
00990                         gtk_object_set_data (GTK_OBJECT (BackPage), "behind_self", (gpointer) self->page);
00991 
00992                         gtk_signal_connect (GTK_OBJECT (self->page), "cancel",
00993                                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_cancel),
00994                                             (gpointer) self);
00995                         gtk_signal_connect (GTK_OBJECT (self->page), "next",
00996                                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_next),
00997                                             (gpointer) self);
00998                         gtk_signal_connect (GTK_OBJECT (self->page), "back",
00999                                             GTK_SIGNAL_FUNC (gnome_res_new_user_druid_back),
01000                                             (gpointer) self);
01001                         gtk_widget_show_all (GTK_WIDGET (self->page));
01002 
01003                         DEBUG_VERBOSE ("NEXT: setting new page\n");
01004                         gnome_druid_set_page (GNOME_DRUID (self->druid), GNOME_DRUID_PAGE (self->page));
01005                 }else{ 
01006                         DEBUG_VERBOSE ("NEXT: no more pages, going to finishpage\n");
01007                         --self->pageindex;
01008                         self->page = BackPage;
01009                         gnome_druid_set_page (GNOME_DRUID (self->druid), GNOME_DRUID_PAGE (self->finishpage));
01010                 }
01011         }else{
01012                 DEBUG_VERBOSE ("NEXT: pages already created, going to this page\n");
01013                 self->page = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (self->page), "behind_self");
01014                 gnome_druid_set_page (GNOME_DRUID (self->druid), GNOME_DRUID_PAGE (self->page));
01015         }
01016         DEBUG_VERBOSE ("NEXTn: %d (%d)\n", self->pageindex, self->pagescreated);
01017 }
01018 
01019 static void gnome_res_new_user_druid_back (GtkWidget *w, gpointer druid, gpointer gp_self) {
01020         GnomeResNewUserDruid *self =  (GnomeResNewUserDruid *) gp_self;
01021         DEBUG_VERBOSE ("BACKv: %d (%d)\n", self->pageindex--, self->pagescreated);
01022         self->page = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (self->page), "before_self");
01023         gnome_druid_set_page (GNOME_DRUID (self->druid), GNOME_DRUID_PAGE (self->page));
01024         DEBUG_VERBOSE ("BACKn: %d (%d)\n", self->pageindex, self->pagescreated);
01025 }
01026 
01027 static void gnome_res_new_user_druid_finished (GtkWidget *w, gpointer druid, gpointer gp_self) {
01028         GnomeResNewUserDruid *self =  (GnomeResNewUserDruid *) gp_self;
01029         DEBUG_VERBOSE ("gnome_res_new_user_druid_finished\n");
01030         self->finishmode = GNOME_RES_DRUID_FINISH;
01031         gnome_res_write_user_config (self->res_pref);
01032         gnome_res_new_user_druid_destroy_druidpages (self);
01033         gtk_main_quit ();
01034 }
01035 
01036 void gnome_res_new_user_druid_cancel (GtkWidget *w, gpointer druid, gpointer gp_self) {
01037         GnomeResNewUserDruid *self =  (GnomeResNewUserDruid *) gp_self;
01038         DEBUG_VERBOSE ("gnome_res_new_user_druid_cancel\n");
01039 //    if (gapp->question (("Really cancel/quit?"), TRUE)){
01040         self->finishmode = GNOME_RES_DRUID_CANCEL;
01041         gnome_res_new_user_druid_destroy_druidpages (self);
01042         gtk_main_quit ();
01043 //    }
01044 }
01045 
01046 
01047 #ifdef __cplusplus
01048 }
01049 #endif /* __cplusplus */

Generated on Sat Apr 1 09:03:55 2006 for GXSM by  doxygen 1.4.6