"Fossies" - the Fresh Open Source Software Archive

Member "jpilot-2_0_1/import_gui.c" (3 Apr 2021, 14802 Bytes) of package /linux/privat/jpilot-2_0_1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*******************************************************************************
    2  * import_gui.c
    3  * A module of J-Pilot http://jpilot.org
    4  *
    5  * Copyright (C) 1999-2014 by Judd Montgomery
    6  *
    7  * This program is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; version 2 of the License.
   10  *
   11  * This program is distributed in the hope that it will be useful,
   12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   14  * GNU General Public License for more details.
   15  *
   16  * You should have received a copy of the GNU General Public License
   17  * along with this program; if not, write to the Free Software
   18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   19  ******************************************************************************/
   20 
   21 /********************************* Includes ***********************************/
   22 #include "config.h"
   23 #include <gtk/gtk.h>
   24 #include <string.h>
   25 #include <stdlib.h>
   26 #include <sys/types.h>
   27 #include <sys/stat.h>
   28 #include <unistd.h>
   29 
   30 #include "i18n.h"
   31 #include "utils.h"
   32 #include "prefs.h"
   33 #include "log.h"
   34 #include "export.h"
   35 
   36 /******************************* Global vars **********************************/
   37 static GtkWidget *radio_types[MAX_IMPORT_TYPES+1];
   38 static int radio_file_types[MAX_IMPORT_TYPES+1];
   39 static int line_selected;
   40 static GtkWidget *import_record_ask_window=NULL;
   41 static int glob_import_record_ask_button_pressed;
   42 static int glob_type_selected;
   43 
   44 /****************************** Prototypes ************************************/
   45 static int (*glob_import_callback)(GtkWidget *parent_window, const char *file_path, int type);
   46 
   47 /****************************** Main Code *************************************/
   48 
   49 /*
   50  * This function reads a CSV entry until it finds the next seperator(',').
   51  * Spaces, commas, newlines, etc. are allowed inside quotes.
   52  * Escaped quotes (double quotes) are converted to single occurrences.
   53  * Return value is size of text including null terminator.
   54  */
   55 int read_csv_field(FILE *in, char *text, int size)
   56 {
   57    int n, c;
   58    char sep[]=",\t \r\n";
   59    char whitespace[]="\t \r\n";
   60    int quoted;
   61 
   62    n=0;
   63    quoted=FALSE;
   64    text[0]='\0';
   65 
   66    /* Read the field */
   67    while (1) {
   68       c=fgetc(in);
   69 
   70       /* Look for EOF */
   71       if (feof(in)) 
   72          break;
   73       /* Look for quote */
   74       if (c=='"') {
   75          if (quoted) {
   76             c=fgetc(in);
   77             if (c=='"') {
   78                /* Found double quotes, convert to single */
   79             } else {
   80                quoted=(quoted&1)^1;
   81                ungetc(c, in);
   82                continue;
   83             }
   84          } else {
   85             quoted=TRUE;
   86             continue;
   87          }
   88       }
   89       /* Look for separators */
   90       if (strchr(sep, c)) {
   91          if (!quoted) {
   92             if (c != ',') {
   93                /* skip whitespace  */
   94                while (1) {
   95                   c=getc(in);
   96                   if (feof(in)) {
   97                      text[n++]='\0';
   98                      return n;
   99                   }
  100                   if (strchr(whitespace, c)) {
  101                      continue;
  102                   } else {
  103                      ungetc(c, in);
  104                      break;
  105                   }
  106                }
  107             }
  108             /* after sep processing, break out of reading field */
  109             break;   
  110          } /* end if !quoted */
  111       } /* end if separator */
  112 
  113       /* Ordinary character, add to field */
  114       text[n++]=c;
  115       if (n+1>=size)
  116       {
  117          text[n++]='\0';
  118          return n;
  119       }
  120    }   /* end while(1) reading field */
  121 
  122    /* Terminate string and return */
  123    text[n++]='\0';
  124    return n;
  125 }
  126 
  127 /*
  128 static int guess_file_type(const char *path)
  129 {
  130    FILE *in;
  131    char text[256];
  132 
  133    if (!path) return IMPORT_TYPE_UNKNOWN;
  134    in=fopen(path, "r");
  135    if (!in) return IMPORT_TYPE_UNKNOWN;
  136    if (dat_check_if_dat_file(in)) {
  137       fclose(in);
  138       return IMPORT_TYPE_DAT;
  139    }
  140    fseek(in, 0, SEEK_SET);
  141    if (fread(text, 1, 15, in) < 1) {
  142       jp_logf(JP_LOG_WARN, "fread failed %s %d\n", __FILE__, __LINE__);
  143    }
  144    if (!strncmp(text, "CSV ", 4)) {
  145       fclose(in);
  146       return IMPORT_TYPE_CSV;
  147    }
  148    fclose(in);
  149    return IMPORT_TYPE_TEXT;
  150 }*/
  151 
  152 /* Main import file selection window */
  153 static gboolean cb_destroy(GtkWidget *widget)
  154 {
  155     widget = NULL;
  156     return FALSE;
  157 }
  158 
  159 static void cb_quit(GtkWidget *widget, gpointer data)
  160 {
  161    const char *sel;
  162    char dir[MAX_PREF_LEN+2];
  163    int i;
  164 
  165    jp_logf(JP_LOG_DEBUG, "Quit\n");
  166 
  167    sel = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
  168    strncpy(dir, sel, MAX_PREF_LEN);
  169    dir[MAX_PREF_LEN]='\0';
  170    i=strlen(dir)-1;
  171    if (i<0) i=0;
  172    if (dir[i]!='/') {
  173       for (i=strlen(dir); i>=0; i--) {
  174          if (dir[i]=='/') {
  175             dir[i+1]='\0';
  176             break;
  177          }
  178       }
  179    }
  180 
  181    set_pref(PREF_MEMO_IMPORT_PATH, 0, dir, TRUE);
  182 
  183    gtk_widget_destroy(widget);
  184 }
  185 
  186 static void cb_type(GtkWidget *widget, gpointer data)
  187 {
  188    glob_type_selected=GPOINTER_TO_INT(data);
  189 }
  190 
  191 static void cb_import(GtkWidget *widget, gpointer filesel)
  192 {
  193    char *sel;
  194    struct stat statb;
  195 
  196    jp_logf(JP_LOG_DEBUG, "cb_import\n");
  197    sel = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
  198    jp_logf(JP_LOG_DEBUG, "file selected [%s]\n", sel);
  199 
  200    /* Check to see if its a regular file */
  201    if (stat(sel, &statb)) {
  202       jp_logf(JP_LOG_DEBUG, "File selected was not stat-able\n");
  203       g_free(sel);
  204       return;
  205    }
  206    if (!S_ISREG(statb.st_mode)) {
  207       jp_logf(JP_LOG_DEBUG, "File selected was not a regular file\n");
  208       g_free(sel);
  209       return;
  210    }
  211    glob_import_callback(widget, sel, glob_type_selected);
  212    g_free(sel);
  213 
  214    cb_quit(widget, widget);
  215 }
  216 
  217 static gboolean cb_import_record_ask_destroy(GtkWidget *widget)
  218 {
  219    import_record_ask_window = NULL;
  220    gtk_main_quit();
  221    return FALSE;
  222 }
  223 
  224 static void
  225 cb_import_record_ask_quit(GtkWidget *widget,
  226                           gpointer   data)
  227 {
  228    glob_import_record_ask_button_pressed=GPOINTER_TO_INT(data);
  229    gtk_widget_destroy(import_record_ask_window);
  230 }
  231 
  232 /*
  233  * Import record display and choice.
  234  * Put up the record for viewing and ask if it should be imported.
  235  */
  236 int import_record_ask(GtkWidget *main_window, GtkWidget *pane,
  237                       char *text, struct CategoryAppInfo *cai,
  238                       char *old_cat_name,
  239                       int priv, int suggested_cat_num, int *new_cat_num)
  240 {
  241    GtkWidget *button;
  242    GtkWidget *vbox;
  243    GtkWidget *temp_hbox;
  244    GtkWidget *textw;
  245    GObject   *textw_buffer;
  246    GtkWidget *label;
  247    GtkWidget *scrolled_window;
  248    int pw, ph;
  249    gint px, py;
  250    char str[100];
  251    char *l;
  252    long char_set;
  253 
  254    /* There is no support yet for changing the suggested category */
  255    /* A menu for selecting cat to be imported into is desirable */
  256    *new_cat_num = suggested_cat_num;
  257 
  258    glob_import_record_ask_button_pressed = DIALOG_SAID_IMPORT_QUIT;
  259 
  260     pw = gdk_window_get_width(gtk_widget_get_window(main_window));
  261     ph = gdk_window_get_height(gtk_widget_get_window(main_window));
  262    gdk_window_get_root_origin(gtk_widget_get_window(main_window), &px, &py);
  263    pw = gtk_paned_get_position(GTK_PANED(pane));
  264    px+=40;
  265 
  266    import_record_ask_window = gtk_widget_new(GTK_TYPE_WINDOW,
  267                                              "type", GTK_WINDOW_TOPLEVEL,
  268                                              "title", _("Import"),
  269                                              NULL);
  270    gtk_window_set_default_size(GTK_WINDOW(import_record_ask_window), pw, ph);
  271    //gtk_widget_set_uposition(GTK_WIDGET(import_record_ask_window), px, py);
  272    gtk_container_set_border_width(GTK_CONTAINER(import_record_ask_window), 5);
  273    gtk_window_set_modal(GTK_WINDOW(import_record_ask_window), TRUE);
  274    gtk_window_set_transient_for(GTK_WINDOW(import_record_ask_window), GTK_WINDOW(main_window));
  275 
  276    g_signal_connect(G_OBJECT(import_record_ask_window), "destroy",
  277                       G_CALLBACK(cb_import_record_ask_destroy),
  278                       import_record_ask_window);
  279 
  280    vbox=gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  281    gtk_container_add(GTK_CONTAINER(import_record_ask_window), vbox);
  282 
  283    /* Private */
  284    if (priv) {
  285       g_snprintf(str, sizeof(str), _("Record was marked as private"));
  286    } else {
  287       g_snprintf(str, sizeof(str), _("Record was not marked as private"));
  288    }
  289    label = gtk_label_new(str);
  290    gtk_widget_set_halign(GTK_WIDGET(label), GTK_ALIGN_START);
  291    gtk_widget_set_valign(GTK_WIDGET(label), GTK_ALIGN_START);
  292    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  293 
  294    /* Category */
  295    get_pref(PREF_CHAR_SET, &char_set, NULL);
  296    l = charset_p2newj(old_cat_name, 16, char_set);
  297    g_snprintf(str, sizeof(str), _("Category before import was: [%s]"), l);
  298    g_free(l);
  299    label = gtk_label_new(str);
  300    gtk_widget_set_halign(GTK_WIDGET(label), GTK_ALIGN_START);
  301    gtk_widget_set_valign(GTK_WIDGET(label), GTK_ALIGN_START);
  302    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  303 
  304 
  305    l = charset_p2newj(cai->name[suggested_cat_num], 16, char_set);
  306    g_snprintf(str, sizeof(str), _("Record will be put in category [%s]"), l);
  307    g_free(l);
  308    label = gtk_label_new(str);
  309    gtk_widget_set_halign(GTK_WIDGET(label), GTK_ALIGN_START);
  310    gtk_widget_set_valign(GTK_WIDGET(label), GTK_ALIGN_START);
  311    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
  312 
  313    /* Text window with scrollbar to display record */
  314    temp_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
  315    gtk_box_pack_start(GTK_BOX(vbox), temp_hbox, TRUE, TRUE, 0);
  316 
  317    textw = gtk_text_view_new();
  318    textw_buffer = G_OBJECT(gtk_text_view_get_buffer(GTK_TEXT_VIEW(textw)));
  319    gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(textw), FALSE);
  320    gtk_text_view_set_editable(GTK_TEXT_VIEW(textw), FALSE);
  321    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textw), GTK_WRAP_WORD);
  322 
  323    scrolled_window = gtk_scrolled_window_new(NULL, NULL);
  324    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
  325                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
  326    gtk_container_set_border_width(GTK_CONTAINER(scrolled_window), 1);
  327    gtk_container_add(GTK_CONTAINER(scrolled_window), textw);
  328    gtk_box_pack_start(GTK_BOX(temp_hbox), scrolled_window,TRUE,TRUE,0);
  329 
  330    if (text) {
  331       gtk_text_buffer_set_text(GTK_TEXT_BUFFER(textw_buffer), text, -1);
  332    }
  333 
  334    temp_hbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
  335     gtk_box_set_spacing(GTK_BOX(temp_hbox), 6);
  336    gtk_container_set_border_width(GTK_CONTAINER(temp_hbox), 6);
  337    gtk_box_pack_start(GTK_BOX(vbox), temp_hbox, FALSE, FALSE, 0);
  338 
  339    /* Import button */
  340    button = gtk_button_new_with_label(_("Import"));
  341    gtk_box_pack_start(GTK_BOX(temp_hbox), button, TRUE, TRUE, 0);
  342    g_signal_connect(G_OBJECT(button), "clicked",
  343                       G_CALLBACK(cb_import_record_ask_quit),
  344                       GINT_TO_POINTER(DIALOG_SAID_IMPORT_YES));
  345 
  346    /* Import All button */
  347    button = gtk_button_new_with_label(_("Import All"));
  348    gtk_box_pack_start(GTK_BOX(temp_hbox), button, TRUE, TRUE, 0);
  349    g_signal_connect(G_OBJECT(button), "clicked",
  350                       G_CALLBACK(cb_import_record_ask_quit),
  351                       GINT_TO_POINTER(DIALOG_SAID_IMPORT_ALL));
  352 
  353    /* Skip button */
  354    button = gtk_button_new_with_label(_("Skip"));
  355    gtk_box_pack_start(GTK_BOX(temp_hbox), button, TRUE, TRUE, 0);
  356    g_signal_connect(G_OBJECT(button), "clicked",
  357                       G_CALLBACK(cb_import_record_ask_quit),
  358                       GINT_TO_POINTER(DIALOG_SAID_IMPORT_SKIP));
  359 
  360    /* Quit button */
  361    button = gtk_button_new_with_label("Close");
  362    gtk_box_pack_start(GTK_BOX(temp_hbox), button, TRUE, TRUE, 0);
  363    g_signal_connect(G_OBJECT(button), "clicked",
  364                       G_CALLBACK(cb_import_record_ask_quit),
  365                       GINT_TO_POINTER(DIALOG_SAID_IMPORT_QUIT));
  366 
  367    gtk_widget_show_all(import_record_ask_window);
  368 
  369    gtk_main();
  370 
  371    return glob_import_record_ask_button_pressed;
  372 }
  373 
  374 void import_gui(GtkWidget *main_window, GtkWidget *main_pane,
  375                 char *type_desc[], int type_int[],
  376                 int (*import_callback)(GtkWidget *parent_window,
  377                 const char *file_path, int type)) {
  378     GtkWidget *vbox, *hbox;
  379     GtkWidget *label;
  380     char title[256];
  381     const char *svalue;
  382     GSList *group;
  383     int res, i;
  384     GtkWidget *fileChooserWidget;
  385 
  386 
  387     line_selected = -1;
  388 
  389 
  390     g_snprintf(title, sizeof(title), "%s %s", PN, _("Import"));
  391     fileChooserWidget = gtk_file_chooser_dialog_new(_("Import"), GTK_WINDOW(main_window), GTK_FILE_CHOOSER_ACTION_OPEN,
  392                                                     "Close", GTK_RESPONSE_CANCEL, "Import", GTK_RESPONSE_ACCEPT,
  393                                                     NULL);
  394     gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(fileChooserWidget), TRUE);
  395     get_pref(PREF_MEMO_IMPORT_PATH, NULL, &svalue);
  396     if (svalue && svalue[0]) {
  397        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(fileChooserWidget), svalue);
  398     }
  399     GtkBox *extraWidget = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0));
  400 
  401     /* File Type radio buttons */
  402     vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  403     hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
  404     gtk_box_pack_start(extraWidget,
  405                        vbox, TRUE, TRUE, 0);
  406     gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
  407     label = gtk_label_new(_("Import File Type"));
  408     gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
  409     group = NULL;
  410     for (i = 0; i < MAX_IMPORT_TYPES; i++) {
  411         if (type_desc[i] == NULL) break;
  412         radio_types[i] = gtk_radio_button_new_with_label(group, _(type_desc[i]));
  413         radio_file_types[i] = type_int[i];
  414         group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_types[i]));
  415         gtk_box_pack_start(GTK_BOX(vbox), radio_types[i], TRUE, TRUE, 0);
  416         g_signal_connect(G_OBJECT(radio_types[i]), "clicked",
  417                            G_CALLBACK(cb_type), GINT_TO_POINTER(type_int[i]));
  418     }
  419     radio_types[i] = NULL;
  420     radio_file_types[i] = 0;
  421     gtk_widget_show_all(vbox);
  422     glob_import_callback = import_callback;
  423 
  424     /* Set the type to match the first button, which will be set */
  425     glob_type_selected = type_int[0];
  426     gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(fileChooserWidget), GTK_WIDGET(extraWidget));
  427     g_signal_connect(G_OBJECT(fileChooserWidget), "destroy",
  428                        G_CALLBACK(cb_destroy), fileChooserWidget);
  429 
  430     res = gtk_dialog_run(GTK_DIALOG(fileChooserWidget));
  431     if (res == GTK_RESPONSE_ACCEPT) {
  432         cb_import(fileChooserWidget, NULL);
  433     } else {
  434         cb_quit(fileChooserWidget, fileChooserWidget);
  435     }
  436 }