Diff of /trunk/src/notes.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 133 by harbaum, Mon Oct 12 20:27:55 2009 UTC revision 303 by harbaum, Tue Sep 14 09:28:57 2010 UTC
# Line 19  Line 19 
19    
20  #include <stdio.h>  #include <stdio.h>
21  #include <string.h>  #include <string.h>
22    #include <errno.h>
23    
24  #include <glib/gunicode.h>  #include <glib/gunicode.h>
25    
# Line 27  Line 28 
28    
29  #include <math.h>  #include <math.h>
30    
31    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR >= 5)
32    #include <hildon/hildon-note.h>
33    #include <hildon/hildon-entry.h>
34    #include <hildon/hildon-check-button.h>
35    #endif
36    
37  #if !defined(LIBXML_TREE_ENABLED) || !defined(LIBXML_OUTPUT_ENABLED)  #if !defined(LIBXML_TREE_ENABLED) || !defined(LIBXML_OUTPUT_ENABLED)
38  #error "libxml doesn't support required tree or output"  #error "libxml doesn't support required tree or output"
39  #endif  #endif
40    
41  #include "gpxview.h"  #include "gpxview.h"
42    
43    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR >= 5)
44    #include <hildon/hildon-note.h>
45    #endif
46    
47  void gtk_text_buffer_set_can_paste_rich_text(GtkTextBuffer *buffer, gboolean);  void gtk_text_buffer_set_can_paste_rich_text(GtkTextBuffer *buffer, gboolean);
48  void gtk_text_buffer_set_rich_text_format(GtkTextBuffer *buffer, const gchar *);  void gtk_text_buffer_set_rich_text_format(GtkTextBuffer *buffer, const gchar *);
49    
# Line 161  static int notes_write_file(cache_contex Line 172  static int notes_write_file(cache_contex
172                        char *text, pos_t pos,                        char *text, pos_t pos,
173                        gboolean override, gboolean found,                        gboolean override, gboolean found,
174                        time_t ftime, gboolean logged) {                        time_t ftime, gboolean logged) {
175    
176      g_assert(context);
177      g_assert(context->cache);
178    
179    /* build local path */    /* build local path */
180    int path_len = strlen(context->appdata->image_path) +    int path_len = strlen(context->appdata->image_path) +
181      2 * strlen(context->cache->id) + 6;      2 * strlen(context->cache->id) + 6;
182    
183    char *path = malloc(path_len);    char *path = malloc(path_len);
184    snprintf(path, path_len, "%s%s/%s.gpx",    snprintf(path, path_len, "%s%s/%s.gpx",
185             context->appdata->image_path,             context->appdata->image_path,
# Line 236  static void notes_save(cache_context_t * Line 252  static void notes_save(cache_context_t *
252    /* or has been changed */    /* or has been changed */
253    
254    if(context->notes.modified) {    if(context->notes.modified) {
255    #ifdef USE_STACKABLE_WINDOW
256        context->notes_have_been_changed = TRUE;
257    #endif
258    
259      printf("something has been modified, saving notes\n");      printf("something has been modified, saving notes\n");
260    
261      GtkTextIter start;      GtkTextIter start;
# Line 246  static void notes_save(cache_context_t * Line 266  static void notes_save(cache_context_t *
266                                            &start, &end, FALSE);                                            &start, &end, FALSE);
267    
268      pos_t pos;      pos_t pos;
269      pos.lat = lat_get(context->notes.latw);      pos.lat = lat_entry_get(context->notes.latw);
270      pos.lon = lon_get(context->notes.lonw);      pos.lon = lon_entry_get(context->notes.lonw);
271    
272      gboolean override =      gboolean override =
273        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(context->notes.overridew));        check_button_get_active(context->notes.overridew);
274      gboolean found =      gboolean found =
275        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(context->notes.foundw));        check_button_get_active(context->notes.foundw);
276      gboolean logged =      gboolean logged =
277        gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(context->notes.loggedw));        check_button_get_active(context->notes.loggedw);
278    
279      /* required accuracy is 1/60000 degree */      if(pos_differ(&pos, &context->cache->pos))
280      if(((int)(pos.lat * 60000 + .5) !=        printf("position is modified\n");
         (int)(context->cache->pos.lat * 60000 + .5)) ||  
        ((int)(pos.lon * 60000 + .5) !=  
         (int)(context->cache->pos.lon * 60000 + .5)))  
       printf("position is modified %f != %f / %f != %f\n",  
              pos.lat * 60000 + .5, context->cache->pos.lat * 60000 + .5,  
              pos.lon * 60000 + .5, context->cache->pos.lon * 60000 + .5);  
281      if(override || found)      if(override || found)
282        printf("flags are set\n");        printf("flags are set\n");
283      if(strlen(text))      if(strlen(text))
284        printf("text is present\n");        printf("text is present\n");
285    
286      /* check if the notes are empty */      /* check if the notes are empty */
287      if(((int)(pos.lat * 60000 + .5) ==      if(!pos_differ(&pos, &context->cache->pos) &&
         (int)(context->cache->pos.lat * 60000 + .5)) &&  
        ((int)(pos.lon * 60000 + .5) ==  
         (int)(context->cache->pos.lon * 60000 + .5)) &&  
288         !override && !found && !logged && (strlen(text) == 0)) {         !override && !found && !logged && (strlen(text) == 0)) {
289        printf("notes are in default state, removing them if present\n");        printf("notes are in default state, removing them if present\n");
290    
# Line 326  static void notes_save(cache_context_t * Line 337  static void notes_save(cache_context_t *
337        /* we have to do two things here: */        /* we have to do two things here: */
338        /* - update the notes.xml file on disk */        /* - update the notes.xml file on disk */
339        /* - update the notes entry in the loaded gpx tree */        /* - update the notes entry in the loaded gpx tree */
340    
341        /* update file on disk */        /* update file on disk */
342        notes_write_file(context, text, pos, override, found,        notes_write_file(context, text, pos, override, found,
343                         context->notes.ftime, logged);                         context->notes.ftime, logged);
344    
345        /* search for matching caches and replace note there */        /* search for matching caches and replace note there */
346        notes_t *note = NULL;        notes_t *note = NULL;
347        gpx_t *gpx = context->appdata->gpx;        gpx_t *gpx = context->appdata->gpx;
# Line 421  static void on_destroy_textview(GtkWidge Line 432  static void on_destroy_textview(GtkWidge
432  static void ftime_update(GtkWidget *widget, cache_context_t *context,  static void ftime_update(GtkWidget *widget, cache_context_t *context,
433                           gboolean update) {                           gboolean update) {
434    /* check if it has been selected */    /* check if it has been selected */
435    if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {    if(check_button_get_active(widget)) {
436      printf("set active\n");      printf("set active\n");
437    
438      if(update)      if(update)
# Line 453  static void callback_modified(GtkWidget Line 464  static void callback_modified(GtkWidget
464      printf("was foundw\n");      printf("was foundw\n");
465    
466      /* about to remove "found" flag -> ask for confirmation */      /* about to remove "found" flag -> ask for confirmation */
467      if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {      if(!check_button_get_active(widget)) {
468    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
469        GtkWidget *dialog = gtk_message_dialog_new(        GtkWidget *dialog = gtk_message_dialog_new(
470                   GTK_WINDOW(context->appdata->window),                   GTK_WINDOW(context->appdata->window),
471                   GTK_DIALOG_DESTROY_WITH_PARENT,                   GTK_DIALOG_DESTROY_WITH_PARENT,
# Line 467  static void callback_modified(GtkWidget Line 479  static void callback_modified(GtkWidget
479        if(GTK_RESPONSE_NO == gtk_dialog_run(GTK_DIALOG(dialog)))        if(GTK_RESPONSE_NO == gtk_dialog_run(GTK_DIALOG(dialog)))
480          gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);          gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
481    
482    #else
483          GtkWidget *dialog =
484            hildon_note_new_confirmation(GTK_WINDOW(context->appdata->window),
485                     _("Do you really want to remove the \"found\" flag? "
486                       "This will void the recorded date of your find!"));
487    
488          /* set the active flag again if the user answered "no" */
489          if(GTK_RESPONSE_OK != gtk_dialog_run(GTK_DIALOG(dialog)))
490            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
491    #endif
492    
493        gtk_widget_destroy(dialog);        gtk_widget_destroy(dialog);
494      }      }
495    
# Line 477  static void callback_modified(GtkWidget Line 500  static void callback_modified(GtkWidget
500      printf("was loggedw\n");      printf("was loggedw\n");
501    
502      /* about to remove "found" flag -> ask for confirmation */      /* about to remove "found" flag -> ask for confirmation */
503      if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {      if(!check_button_get_active(widget)) {
504    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
505        GtkWidget *dialog = gtk_message_dialog_new(        GtkWidget *dialog = gtk_message_dialog_new(
506                   GTK_WINDOW(context->appdata->window),                   GTK_WINDOW(context->appdata->window),
507                   GTK_DIALOG_DESTROY_WITH_PARENT,                   GTK_DIALOG_DESTROY_WITH_PARENT,
# Line 496  static void callback_modified(GtkWidget Line 520  static void callback_modified(GtkWidget
520          gtk_widget_set_sensitive(context->notes.foundw, TRUE);          gtk_widget_set_sensitive(context->notes.foundw, TRUE);
521        }        }
522    
523    #else
524          GtkWidget *dialog =
525            hildon_note_new_confirmation(GTK_WINDOW(context->appdata->window),
526                       _("Do you really want to remove the \"logged\" flag? "
527                       "This may cause problems on your next Garmin Field "
528                       "Notes upload!"));
529    
530          /* set the active flag again if the user answered "no" */
531          if(GTK_RESPONSE_OK != gtk_dialog_run(GTK_DIALOG(dialog)))
532            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
533          else {
534            gtk_widget_set_sensitive(widget, FALSE);
535            gtk_widget_set_sensitive(context->notes.foundw, TRUE);
536          }
537    
538    #endif
539    
540        gtk_widget_destroy(dialog);        gtk_widget_destroy(dialog);
541      }      }
542    }    }
# Line 522  static gboolean focus_in(GtkWidget *widg Line 563  static gboolean focus_in(GtkWidget *widg
563  }  }
564  #endif  #endif
565    
566    #ifndef FREMANTLE
567  static gboolean focus_out(GtkWidget *widget, GdkEventFocus *event,  static gboolean focus_out(GtkWidget *widget, GdkEventFocus *event,
568                           gpointer data) {                           gpointer data) {
569    cache_context_t *context = (cache_context_t*)data;    cache_context_t *context = (cache_context_t*)data;
# Line 533  static gboolean focus_out(GtkWidget *wid Line 575  static gboolean focus_out(GtkWidget *wid
575    
576    return FALSE;    return FALSE;
577  }  }
578    #else
579    static void coo_changed(GtkWidget *widget, gpointer data) {
580      notes_save((cache_context_t*)data);
581    }
582    #endif
583    
584  GtkWidget *cache_notes(cache_context_t *context) {  GtkWidget *cache_notes(cache_context_t *context) {
585    cache_t *cache = context->cache;    cache_t *cache = context->cache;
# Line 549  GtkWidget *cache_notes(cache_context_t * Line 596  GtkWidget *cache_notes(cache_context_t *
596    /* -------------- custom coordinate ---------------- */    /* -------------- custom coordinate ---------------- */
597    
598    GtkWidget *table = gtk_table_new(2, 4, FALSE);    GtkWidget *table = gtk_table_new(2, 4, FALSE);
599    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
600    gtk_table_set_col_spacing(GTK_TABLE(table), 0, 16);    gtk_table_set_col_spacing(GTK_TABLE(table), 0, 16);
601    #endif
602    
603    gtk_table_set_col_spacing(GTK_TABLE(table), 2, 16);    gtk_table_set_col_spacing(GTK_TABLE(table), 2, 16);
604    
605    gtk_table_attach_defaults(GTK_TABLE(table),    gtk_table_attach_defaults(GTK_TABLE(table),
606                      gtk_label_new(_("New coordinate:")), 0, 1, 0, 1);                      gtk_label_new(_("New coordinate:")), 0, 1, 0, 1);
607    context->notes.overridew = gtk_check_button_new_with_label(_("Override"));    context->notes.overridew = check_button_new_with_label(_("Override"));
608    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(context->notes.overridew),    check_button_set_active(context->notes.overridew,
609                                 cache->notes && cache->notes->override);                            cache->notes && cache->notes->override);
610    gtk_table_attach_defaults(GTK_TABLE(table),    gtk_table_attach_defaults(GTK_TABLE(table),
611                              context->notes.overridew, 0, 1, 1, 2);                              context->notes.overridew, 2, 3, 0, 1);
612    
613    GtkWidget *hbox = gtk_hbox_new(FALSE, 2);    GtkWidget *hbox = gtk_hbox_new(FALSE, 2);
614    
615    context->notes.foundw = gtk_check_button_new_with_label(_("Found"));    context->notes.foundw = check_button_new_with_label(_("Found"));
616    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(context->notes.foundw),    check_button_set_active(context->notes.foundw,
617                                 cache->notes && cache->notes->found);                            cache->notes && cache->notes->found);
618    gtk_box_pack_start_defaults(GTK_BOX(hbox), context->notes.foundw);    gtk_box_pack_start_defaults(GTK_BOX(hbox), context->notes.foundw);
619    
620    context->notes.loggedw = gtk_check_button_new_with_label(_("Logged"));    context->notes.loggedw = check_button_new_with_label(_("Logged"));
621    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(context->notes.loggedw),    check_button_set_active(context->notes.loggedw,
622                                 cache->notes && cache->notes->logged);                            cache->notes && cache->notes->logged);
623    gtk_box_pack_start_defaults(GTK_BOX(hbox), context->notes.loggedw);    gtk_box_pack_start_defaults(GTK_BOX(hbox), context->notes.loggedw);
624    
625    gtk_table_attach_defaults(GTK_TABLE(table), hbox, 3, 4, 0, 1);    gtk_table_attach_defaults(GTK_TABLE(table), hbox, 3, 4, 0, 1);
# Line 581  GtkWidget *cache_notes(cache_context_t * Line 631  GtkWidget *cache_notes(cache_context_t *
631      gtk_widget_set_sensitive(context->notes.foundw, FALSE);      gtk_widget_set_sensitive(context->notes.foundw, FALSE);
632    
633    context->notes.datew = gtk_label_new("");    context->notes.datew = gtk_label_new("");
634    gtk_misc_set_alignment(GTK_MISC(context->notes.datew), 0.0f, 0.5f);    gtk_misc_set_alignment(GTK_MISC(context->notes.datew), 0.5f, 0.5f);
635    gtk_table_attach_defaults(GTK_TABLE(table),    gtk_table_attach_defaults(GTK_TABLE(table),
636                              context->notes.datew, 3, 4, 1, 2);                              context->notes.datew, 3, 4, 1, 2);
637    ftime_update(context->notes.foundw, context, FALSE);    ftime_update(context->notes.foundw, context, FALSE);
# Line 589  GtkWidget *cache_notes(cache_context_t * Line 639  GtkWidget *cache_notes(cache_context_t *
639    pos_t pos = gpx_cache_pos(cache);    pos_t pos = gpx_cache_pos(cache);
640    if(cache->notes) pos = cache->notes->pos;    if(cache->notes) pos = cache->notes->pos;
641    
642    gtk_table_attach_defaults(GTK_TABLE(table),    context->notes.latw = lat_entry_new(pos.lat);
643                              context->notes.latw = lat_entry_new(pos.lat), 2, 3, 0, 1);    context->notes.lonw = lon_entry_new(pos.lon);
644      GtkWidget *picker =
645        preset_coordinate_picker(context->appdata,
646                                 context->notes.latw, context->notes.lonw);
647    
648      /* on fremantle we react on "changed" event instead since this */
649      /* means that editing is done */
650    #ifdef FREMANTLE
651      g_signal_connect(G_OBJECT(context->notes.latw), "changed",
652                       G_CALLBACK(coo_changed), context);
653      g_signal_connect(G_OBJECT(context->notes.lonw), "changed",
654                       G_CALLBACK(coo_changed), context);
655    #else
656    g_signal_connect(G_OBJECT(context->notes.latw), "focus-out-event",    g_signal_connect(G_OBJECT(context->notes.latw), "focus-out-event",
657                     G_CALLBACK(focus_out), context);                     G_CALLBACK(focus_out), context);
   
   gtk_table_attach_defaults(GTK_TABLE(table),  
                             context->notes.lonw = lon_entry_new(pos.lon), 2, 3, 1, 2);  
658    g_signal_connect(G_OBJECT(context->notes.lonw), "focus-out-event",    g_signal_connect(G_OBJECT(context->notes.lonw), "focus-out-event",
659                     G_CALLBACK(focus_out), context);                     G_CALLBACK(focus_out), context);
660    #endif
661    
662      GtkWidget *ihbox = gtk_hbox_new(FALSE, 0);
663    
664      gtk_box_pack_start_defaults(GTK_BOX(ihbox), context->notes.latw);
665      gtk_box_pack_start_defaults(GTK_BOX(ihbox), context->notes.lonw);
666      gtk_box_pack_start_defaults(GTK_BOX(ihbox), picker);
667    
668      gtk_table_attach_defaults(GTK_TABLE(table),
669                                ihbox, 0, 3, 1, 2);
670    
671    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
672    hbox = gtk_hbox_new(FALSE, 0);    hbox = gtk_hbox_new(FALSE, 0);
673    gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(hbox), table, FALSE, FALSE, 0);
674    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
675    #else
676      gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
677    #endif
678    
679  #ifndef USE_PANNABLE_AREA  #ifndef USE_PANNABLE_AREA
680    GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);    GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
# Line 623  GtkWidget *cache_notes(cache_context_t * Line 696  GtkWidget *cache_notes(cache_context_t *
696    hildon_text_view_set_buffer(HILDON_TEXT_VIEW(view), context->notes.buffer);    hildon_text_view_set_buffer(HILDON_TEXT_VIEW(view), context->notes.buffer);
697  #endif  #endif
698    
699      /* if the cache has been marked found in the logs already, there's */
700      /* no need/use to be able to change all this */
701      if(cache->found) {
702        check_button_set_active(context->notes.loggedw, TRUE);
703        check_button_set_active(context->notes.foundw, TRUE);
704        gtk_widget_set_sensitive(table, FALSE);
705    
706        gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
707        gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view), FALSE);
708      } else
709        gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE);
710    
711    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
   gtk_text_view_set_editable(GTK_TEXT_VIEW(view), TRUE);  
712    gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view), 2 );    gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view), 2 );
713    gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view), 2 );    gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view), 2 );
714    
# Line 672  GtkWidget *cache_notes(cache_context_t * Line 756  GtkWidget *cache_notes(cache_context_t *
756    return vbox;    return vbox;
757  }  }
758    
759    void notes_logged(cache_context_t *context) {
760    
761      /* if you log it, you sure also found it */
762      check_button_set_active(context->notes.foundw, TRUE);
763      check_button_set_active(context->notes.loggedw, TRUE);
764    
765      gtk_widget_set_sensitive(context->notes.foundw, FALSE);
766      gtk_widget_set_sensitive(context->notes.loggedw, TRUE);
767    
768      ftime_update(context->notes.foundw, context, TRUE);
769    }
770    
771  void notes_free(notes_t *notes) {  void notes_free(notes_t *notes) {
772    if(notes) {    if(notes) {
773      if(notes->text) xmlFree(notes->text);      if(notes->text) xmlFree(notes->text);
# Line 681  void notes_free(notes_t *notes) { Line 777  void notes_free(notes_t *notes) {
777    
778  pos_t notes_get_pos(cache_context_t *context) {  pos_t notes_get_pos(cache_context_t *context) {
779    pos_t pos = context->cache->pos;    pos_t pos = context->cache->pos;
780    if(gtk_toggle_button_get_active(    if(check_button_get_active(context->notes.overridew)) {
781                   GTK_TOGGLE_BUTTON(context->notes.overridew))) {      pos.lat = lat_entry_get(context->notes.latw);
782      pos.lat = lat_get(context->notes.latw);      pos.lon = lon_entry_get(context->notes.lonw);
     pos.lon = lon_get(context->notes.lonw);  
783    }    }
784    return pos;    return pos;
785  }  }
786    
787  gboolean notes_get_override(cache_context_t *context) {  gboolean notes_get_override(cache_context_t *context) {
788    /* get override value */    /* get override value */
789    return gtk_toggle_button_get_active(    return check_button_get_active(context->notes.overridew);
                       GTK_TOGGLE_BUTTON(context->notes.overridew));  
   
790  }  }
791    
792  typedef struct {  typedef struct {
793    GtkWidget *info_label;    GtkWidget *info_label;
794    GtkWidget *dialog;    GtkWidget *dialog;
795    appdata_t *appdata;    appdata_t *appdata;
   GtkWidget *path_label;  
796  } export_context_t;  } export_context_t;
797    
 static void on_browse(GtkWidget *widget, gpointer data) {  
   GtkWidget *dialog;  
   
   export_context_t *context = (export_context_t*)data;  
   
 #ifdef USE_MAEMO  
   dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(context->dialog),  
                                           GTK_FILE_CHOOSER_ACTION_SAVE);  
 #else  
   dialog = gtk_file_chooser_dialog_new(_("Save POI database"),  
                                        GTK_WINDOW(context->dialog),  
                                        GTK_FILE_CHOOSER_ACTION_SAVE,  
                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,  
                                        GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,  
                                        NULL);  
 #endif  
   
   printf("set filename <%s>\n", context->appdata->fieldnotes_path);  
   
   if(!g_file_test(context->appdata->fieldnotes_path, G_FILE_TEST_EXISTS)) {  
     char *last_sep = strrchr(context->appdata->fieldnotes_path, '/');  
     if(last_sep) {  
       *last_sep = 0;  // seperate path from file  
   
       /* the user just created a new document */  
       gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),  
                                           context->appdata->fieldnotes_path);  
       gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), last_sep+1);  
   
       /* restore full filename */  
       *last_sep = '/';  
     }  
   } else  
     gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),  
                                   context->appdata->fieldnotes_path);  
   
   if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) {  
     gchar *name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));  
     if(name) {  
       free(context->appdata->fieldnotes_path);  
       context->appdata->fieldnotes_path = strdup(name);  
       gtk_label_set_text(GTK_LABEL(context->path_label),  
                          context->appdata->fieldnotes_path);  
     }  
   }  
   
   gtk_widget_destroy (dialog);  
 }  
   
798  typedef struct log_chain_s {  typedef struct log_chain_s {
799    cache_t *cache;    cache_t *cache;
800    struct log_chain_s *next;    struct log_chain_s *next;
# Line 841  void notes_log_export(appdata_t *appdata Line 884  void notes_log_export(appdata_t *appdata
884    /* ------------------ path/file ------------------ */    /* ------------------ path/file ------------------ */
885    gtk_box_pack_start_defaults(GTK_BOX(vbox), gtk_hseparator_new());    gtk_box_pack_start_defaults(GTK_BOX(vbox), gtk_hseparator_new());
886    
887    GtkWidget *hbox = gtk_hbox_new(FALSE, 0);    gtk_box_pack_start_defaults(GTK_BOX(vbox),
888    GtkWidget *label = gtk_label_new(_("Export to:"));       export_file(_("Save POI database"), &appdata->fieldnotes_path));
   gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE,0);  
   gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);  
   GtkWidget *button = gtk_button_new_with_label(_("Browse"));  
   gtk_signal_connect(GTK_OBJECT(button), "clicked",  
                      GTK_SIGNAL_FUNC(on_browse), (gpointer)&context);  
   gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE,0);  
   gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox);  
   
   context.path_label = gtk_label_new(appdata->fieldnotes_path);  
   gtk_misc_set_alignment(GTK_MISC(context.path_label), 0.f, 0.5f);  
   gtk_label_set_ellipsize(GTK_LABEL(context.path_label),  
                           PANGO_ELLIPSIZE_MIDDLE);  
   gtk_box_pack_start_defaults(GTK_BOX(vbox), context.path_label);  
889    
890    label = gtk_label_new(_("(a %s in the filename will be replaced by the "    GtkWidget *label =
891                            "current date and time)"));      gtk_label_new(_("(a %s in the filename will be replaced by the "
892                        "current date and time)"));
893    gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD);    gtk_label_set_line_wrap_mode(GTK_LABEL(label), PANGO_WRAP_WORD);
894    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
895    gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);    gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
# Line 877  void notes_log_export(appdata_t *appdata Line 908  void notes_log_export(appdata_t *appdata
908      time_t now = time(NULL);      time_t now = time(NULL);
909      struct tm *tm_now = localtime(&now);      struct tm *tm_now = localtime(&now);
910      char now_str[32];      char now_str[32];
911      strftime(now_str, sizeof(now_str)-1, "%F_%H:%M", tm_now);      strftime(now_str, sizeof(now_str)-1, "%F_%H-%M", tm_now);
912      char *fname = g_strdup_printf(appdata->fieldnotes_path, now_str);      char *fname = g_strdup_printf(appdata->fieldnotes_path, now_str);
913    
914      printf("--- about to export logs to %s ---\n", fname);      printf("--- about to export logs to %s ---\n", fname);
915      FILE *file = fopen(fname, "w");      FILE *file = fopen(fname, "w");
916      g_free(fname);      g_free(fname);
917    
918      if(file) {      if(file) {
   
919        llog = log;        llog = log;
920        while(llog) {        while(llog) {
921          printf("Exporting %s\n", llog->cache->id);          printf("Exporting %s\n", llog->cache->id);
# Line 974  void notes_log_export(appdata_t *appdata Line 1005  void notes_log_export(appdata_t *appdata
1005        }        }
1006    
1007        fclose(file);        fclose(file);
1008      }      } else
1009          errorf(_("Can't open file:\n\n%s"), strerror(errno));
1010    
1011    } else {    } else {
1012      /* restore old path, in case it has been altered but not been used */      /* restore old path, in case it has been altered but not been used */
1013      free(appdata->fieldnotes_path);      free(appdata->fieldnotes_path);

Legend:
Removed from v.133  
changed lines
  Added in v.303