00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <config.h>
00029 #include <gtk/gtk.h>
00030 #include <gnome.h>
00031 #include <libgnome/libgnome.h>
00032
00033 #include <gdk/gdk.h>
00034
00035 #include "tips_dialog.h"
00036 #include "wilber-stm.h"
00037 #include "wilber-afm.h"
00038 #include "wilber-spa.h"
00039
00040 #include "glbvars.h"
00041
00042 static int tips_dialog_hide (GtkWidget *widget, gpointer data);
00043 static int tips_show_next (GtkWidget *widget, gpointer data);
00044 static void tips_toggle_update (GtkWidget *widget, gpointer data);
00045 static void read_tips_file(char *filename);
00046
00047 static GtkWidget *tips_dialog = NULL;
00048 static GtkWidget *tips_label;
00049 static char ** tips_text = NULL;
00050 static int tips_count = 0;
00051 static int old_show_tips;
00052
00053 static int last_tip = 0;
00054 static int show_tips = -1;
00055
00056 static gint twc_id = 0;
00057
00058 gchar *gxsm_data_directory (){
00059 static gchar dd[] = PACKAGE_TIPS_DIR;
00060 return dd;
00061 }
00062
00063 gint draw_wilber(void *pv){
00064 GtkWidget *preview = (GtkWidget*)pv;
00065 static int i=0;
00066 static gint w[] = { wilberstm_width, wilberafm_width, wilberspa_width, 0 };
00067 static gint h[] = { wilberstm_height, wilberafm_height, wilberspa_height, 0 };
00068 static gchar* d[] = { wilberstm_data, wilberafm_data, wilberspa_data, NULL };
00069 guchar *utemp, *src, *dest;
00070 gint x,y;
00071
00072 if(!w[i]) i=0;
00073 gtk_preview_size (GTK_PREVIEW (preview), w[i], h[i]);
00074 utemp = g_new (guchar, w[i] * 3);
00075 src = (guchar *)d[i];
00076 for (y = 0; y < h[i]; y++)
00077 {
00078 dest = utemp;
00079 for (x = 0; x < w[i]; x++)
00080 {
00081 HEADER_PIXEL(src, dest);
00082 dest += 3;
00083 }
00084 gtk_preview_draw_row (GTK_PREVIEW (preview), utemp,
00085 0, y, w[i]);
00086 }
00087 g_free(utemp);
00088 ++i;
00089 gtk_widget_hide (preview);
00090 gtk_widget_show (preview);
00091 return TRUE;
00092 }
00093
00094 void
00095 tips_dialog_create ()
00096 {
00097 GtkWidget *vbox;
00098 GtkWidget *hbox1;
00099 GtkWidget *hbox2;
00100 GtkWidget *bbox;
00101 GtkWidget *vbox_bbox2;
00102 GtkWidget *bbox2;
00103 GtkWidget *frame;
00104 static GtkWidget *preview;
00105 GtkWidget *button_close;
00106 GtkWidget *button_next;
00107 GtkWidget *button_prev;
00108 GtkWidget *vbox_check;
00109 GtkWidget *button_check;
00110 gchar * temp;
00111
00112 XsmRescourceManager xrm("GUI-global","Tips");
00113 show_tips = xrm.GetBool("ShowTips", TRUE);
00114 xrm.Get("LastTip", &last_tip, "0");
00115 ++last_tip;
00116
00117 if (tips_count == 0)
00118 {
00119 temp = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s",
00120 gxsm_data_directory (),
00121 _("gxsm_tips.txt"));
00122 read_tips_file (temp);
00123 g_free (temp);
00124 }
00125
00126 if (last_tip >= tips_count || last_tip < 0)
00127 last_tip = 0;
00128
00129 if (!tips_dialog)
00130 {
00131 tips_dialog = gtk_dialog_new ();
00132 gtk_window_set_wmclass (GTK_WINDOW (tips_dialog), "tip_of_the_day", "Gxsm");
00133 gtk_window_set_title (GTK_WINDOW (tips_dialog), _("GXSM Tip of the Day"));
00134 gtk_window_set_position (GTK_WINDOW (tips_dialog), GTK_WIN_POS_CENTER);
00135 gtk_signal_connect (GTK_OBJECT (tips_dialog), "delete_event",
00136 GTK_SIGNAL_FUNC (tips_dialog_hide), NULL);
00137
00138 gtk_quit_add_destroy (1, GTK_OBJECT (tips_dialog));
00139
00140 vbox = GTK_DIALOG(tips_dialog)->vbox;
00141
00142 hbox1 = gtk_hbox_new (FALSE, 5);
00143 gtk_container_set_border_width (GTK_CONTAINER (hbox1), 10);
00144 gtk_box_pack_start (GTK_BOX (vbox), hbox1, FALSE, TRUE, 0);
00145 gtk_widget_show (hbox1);
00146
00147 hbox2 = gtk_hbox_new (FALSE, 5);
00148 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 10);
00149 gtk_box_pack_end (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
00150 gtk_widget_show (hbox2);
00151
00152 bbox = gtk_hbutton_box_new ();
00153 gtk_box_pack_end (GTK_BOX (hbox2), bbox, FALSE, FALSE, 0);
00154 gtk_widget_show (bbox);
00155
00156 vbox_bbox2 = gtk_vbox_new (FALSE, 0);
00157 gtk_box_pack_end (GTK_BOX (hbox2), vbox_bbox2, FALSE, FALSE, 15);
00158 gtk_widget_show (vbox_bbox2);
00159
00160 bbox2 = gtk_hbox_new (TRUE, 5);
00161 gtk_box_pack_end (GTK_BOX (vbox_bbox2), bbox2, TRUE, FALSE, 0);
00162 gtk_widget_show(bbox2);
00163
00164 preview = gtk_preview_new (GTK_PREVIEW_COLOR);
00165
00166 draw_wilber(preview);
00167
00168 frame = gtk_frame_new (NULL);
00169 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
00170 gtk_box_pack_end (GTK_BOX (hbox1), frame, FALSE, TRUE, 3);
00171 gtk_container_add (GTK_CONTAINER (frame), preview);
00172 gtk_widget_show (preview);
00173 gtk_widget_show (frame);
00174
00175 tips_label = gtk_label_new (tips_text[last_tip]);
00176 gtk_label_set_justify (GTK_LABEL (tips_label), GTK_JUSTIFY_LEFT);
00177 gtk_box_pack_start (GTK_BOX (hbox1), tips_label, TRUE, TRUE, 3);
00178 gtk_widget_show (tips_label);
00179
00180 button_prev = gtk_button_new_with_label (_("Previous Tip"));
00181
00182 GTK_WIDGET_UNSET_FLAGS (button_prev, GTK_RECEIVES_DEFAULT);
00183 gtk_signal_connect (GTK_OBJECT (button_prev), "clicked",
00184 GTK_SIGNAL_FUNC (tips_show_next),
00185 (gpointer) "prev");
00186
00187 gtk_widget_show (button_prev);
00188
00189 button_next = gtk_button_new_with_label (_("Next Tip"));
00190
00191 GTK_WIDGET_UNSET_FLAGS (button_next, GTK_RECEIVES_DEFAULT);
00192 gtk_signal_connect (GTK_OBJECT (button_next), "clicked",
00193 GTK_SIGNAL_FUNC (tips_show_next),
00194 (gpointer) "next");
00195 gtk_widget_show (button_next);
00196
00197
00198 button_close = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
00199 GTK_WIDGET_SET_FLAGS (button_close, GTK_CAN_DEFAULT);
00200 gtk_window_set_default (GTK_WINDOW (tips_dialog), button_close);
00201 gtk_signal_connect (GTK_OBJECT (button_close), "clicked",
00202 GTK_SIGNAL_FUNC (tips_dialog_hide), NULL);
00203 gtk_widget_show (button_close);
00204
00205 vbox_check = gtk_vbox_new (FALSE, 0);
00206 gtk_box_pack_start (GTK_BOX (hbox2), vbox_check, FALSE, TRUE, 0);
00207 gtk_widget_show (vbox_check);
00208
00209 button_check = gtk_check_button_new_with_label (_("Show next time"));
00210 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button_check),
00211 show_tips);
00212 gtk_signal_connect (GTK_OBJECT (button_check), "toggled",
00213 GTK_SIGNAL_FUNC (tips_toggle_update),
00214 (gpointer) &show_tips);
00215
00216 gtk_widget_show (button_check);
00217
00218 gtk_dialog_add_action_widget (GTK_DIALOG(tips_dialog), button_check, 3);
00219 gtk_dialog_add_action_widget (GTK_DIALOG(tips_dialog), button_next, 1);
00220 gtk_dialog_add_action_widget (GTK_DIALOG(tips_dialog), button_prev, 0);
00221 gtk_dialog_add_action_widget (GTK_DIALOG(tips_dialog), button_close, 2);
00222
00223 old_show_tips = show_tips;
00224
00225
00226
00227
00228
00229 }
00230
00231 if (!GTK_WIDGET_VISIBLE (tips_dialog))
00232 {
00233 gtk_widget_show (tips_dialog);
00234 }
00235 else
00236 {
00237 gdk_window_raise (tips_dialog->window);
00238 }
00239
00240 twc_id = gtk_timeout_add(3000, draw_wilber, preview);
00241
00242 }
00243
00244 static int
00245 tips_dialog_hide (GtkWidget *widget,
00246 gpointer data)
00247 {
00248 gtk_timeout_remove(twc_id);
00249 gtk_widget_hide (tips_dialog);
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267 XsmRescourceManager xrm("GUI-global","Tips");
00268 xrm.Put("LastTip", last_tip);
00269 xrm.PutBool("ShowTips", show_tips);
00270
00271 return TRUE;
00272 }
00273
00274 static int
00275 tips_show_next (GtkWidget *widget,
00276 gpointer data)
00277 {
00278 if (!strcmp ((char *)data, "prev"))
00279 {
00280 last_tip--;
00281 if (last_tip < 0)
00282 last_tip = tips_count - 1;
00283 }
00284 else
00285 {
00286 last_tip++;
00287 if (last_tip >= tips_count)
00288 last_tip = 0;
00289 }
00290 gtk_label_set (GTK_LABEL (tips_label), tips_text[last_tip]);
00291 return FALSE;
00292 }
00293
00294 static void
00295 tips_toggle_update (GtkWidget *widget,
00296 gpointer data)
00297 {
00298 int *toggle_val;
00299
00300 toggle_val = (int *) data;
00301
00302 if (GTK_TOGGLE_BUTTON (widget)->active)
00303 *toggle_val = TRUE;
00304 else
00305 *toggle_val = FALSE;
00306 }
00307
00308 static void
00309 store_tip (char *str)
00310 {
00311 tips_count++;
00312 tips_text = (gchar**)g_realloc(tips_text, sizeof(char *) * tips_count);
00313 tips_text[tips_count - 1] = str;
00314 }
00315
00316 static void
00317 read_tips_file (char *filename)
00318 {
00319 FILE *fp;
00320 char *tip = NULL;
00321 char *str = NULL;
00322
00323 fp = fopen (filename, "rt");
00324 if (!fp)
00325 {
00326 store_tip (_("Your GXSM tips file appears to be missing!\n"
00327 "There should be a file called gxsm_tips.txt in the\n"
00328 "GXSM data directory. Please check your installation."));
00329 return;
00330 }
00331
00332 str = g_new (char, 1024);
00333 while (!feof (fp))
00334 {
00335 if (!fgets (str, 1024, fp))
00336 continue;
00337
00338 if (str[0] == '#' || str[0] == '\n')
00339 {
00340 if (tip != NULL)
00341 {
00342 tip[strlen (tip) - 1] = '\000';
00343 store_tip (tip);
00344 tip = NULL;
00345 }
00346 }
00347 else
00348 {
00349 if (tip == NULL)
00350 {
00351 tip = (gchar*)g_malloc (strlen (str) + 1);
00352 strcpy (tip, str);
00353 }
00354 else
00355 {
00356 tip = (gchar*)g_realloc (tip, strlen (tip) + strlen (str) + 1);
00357 strcat (tip, str);
00358 }
00359 }
00360 }
00361 if (tip != NULL)
00362 store_tip (tip);
00363 g_free (str);
00364 fclose (fp);
00365 }