/* * xlog - GTK+ logging program for amateur radio operators * Copyright (C) 2001 - 2005 Joop Stakenborg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* gui_importlogdialog.c - creation and destruction of the importlog dialog * * This dialog shows 2 entries where log names should be filled in, clicking * on OK will open them in one page. After that, the user can decide to sort * the log or not. */ #include #include #include "gui_mergedialog.h" #include "support.h" #include "types.h" #include "log.h" #include "utils.h" #include "gui_utils.h" extern GtkWidget *mainwindow; extern preferencestype preferences; extern statetype state; extern GList *logwindowlist; extern GtkWidget *mainnotebook; GtkWidget *importlogdialog; static GtkWidget *previewscrolledwindow; /* * in case we open a non-xlog file, we have to know the xlog filename */ static gchar *find_logname (const gchar *selected) { gchar *basen, *dirn, **split, *l; basen = g_path_get_basename (selected); dirn = g_path_get_dirname (selected); if (g_strrstr(basen, ".")) { split = g_strsplit (basen, ".", 0); l = g_strconcat (dirn, G_DIR_SEPARATOR_S, split[0], ".xlog", 0); g_strfreev (split); } else { l = g_strconcat (dirn, G_DIR_SEPARATOR_S, basen, ".xlog", 0); } g_free (basen); g_free (dirn); return l; } /* callback for the preview widget, read the first 10 lines */ static void preview_update (GtkFileChooser *chooser, gpointer data) { GtkWidget *preview; gchar *filename, buf[80]; gboolean have_preview = FALSE; gint i; FILE *in; GtkTextBuffer *buffer; GtkTextIter start, end; preview = GTK_WIDGET (data); filename = gtk_file_chooser_get_preview_filename (chooser); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(preview)); gtk_text_buffer_get_bounds (buffer, &start, &end); gtk_text_buffer_delete (buffer, &start, &end); in = fopen (filename, "r"); if (in) { have_preview = TRUE; for (i = 0; i < 10; i++) { if (fgets (buf, 80, in) == NULL) break; else if (g_utf8_validate (buf, -1, NULL)) gtk_text_buffer_insert_with_tags_by_name (buffer, &start, buf, -1, "tiny", NULL); } } gtk_widget_set_size_request (previewscrolledwindow, 200, -1); gtk_file_chooser_set_preview_widget_active (chooser, have_preview); } static void on_importlogbutton_clicked (GtkButton * button, gpointer user_data) { GtkWidget *fileselection, *logentry, *preview; GtkTextBuffer *buffer; gchar *sellog; gint response; fileselection = gtk_file_chooser_dialog_new (_("xlog - select a log for import"), GTK_WINDOW(mainwindow), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fileselection), preferences.savedir); /* preview widget */ previewscrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (previewscrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); preview = gtk_text_view_new (); gtk_text_view_set_editable (GTK_TEXT_VIEW(preview), FALSE); gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW(preview), FALSE); gtk_container_add (GTK_CONTAINER (previewscrolledwindow), preview); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(preview)); gtk_text_buffer_create_tag (buffer, "tiny", "size", 8 * PANGO_SCALE, NULL); gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (fileselection), previewscrolledwindow); gtk_widget_set_size_request (previewscrolledwindow, 0, -1); gtk_widget_show_all (previewscrolledwindow); g_signal_connect (fileselection, "update-preview", G_CALLBACK (preview_update), preview); gtk_widget_show_all (fileselection); response = gtk_dialog_run (GTK_DIALOG(fileselection)); if (response == GTK_RESPONSE_ACCEPT) { sellog = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fileselection)); logentry = lookup_widget (importlogdialog, "logentry"); gtk_entry_set_text (GTK_ENTRY(logentry), sellog); g_free (sellog); } gtk_widget_destroy (fileselection); } void on_menu_import_activate (GtkMenuItem * menuitem, gpointer user_data) { GtkWidget *vbox, *label1, *logentry, *loghbox, *logbutton, *combobox; gint response, filetype; gchar *log, *logn, *temp; LOGDB *lp; logtype *logw; importlogdialog = gtk_dialog_new_with_buttons (_("xlog - import"), GTK_WINDOW(mainwindow), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_APPLY, GTK_RESPONSE_OK, NULL); gtk_window_set_default_size (GTK_WINDOW (importlogdialog), 400, 120); vbox = gtk_vbox_new (TRUE, 0); gtk_container_add (GTK_CONTAINER (GTK_DIALOG (importlogdialog)->vbox), vbox); label1 = gtk_label_new (_("Select log and logtype for import")); gtk_box_pack_start (GTK_BOX (vbox), label1, FALSE, FALSE, 0); loghbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), loghbox, FALSE, FALSE, 0); logentry = gtk_entry_new (); gtk_box_pack_start (GTK_BOX (loghbox), logentry, TRUE, TRUE, 0); gtk_editable_set_editable (GTK_EDITABLE (logentry), FALSE); GTK_WIDGET_UNSET_FLAGS (logentry, GTK_CAN_FOCUS); logbutton = gtk_button_new_from_stock (GTK_STOCK_OPEN); gtk_box_pack_start (GTK_BOX (loghbox), logbutton, FALSE, FALSE, 0); combobox = gtk_combo_box_new_text (); gtk_box_pack_start (GTK_BOX (loghbox), combobox, FALSE, FALSE, 0); /* Keep entries in same order as enum log_file_type in logfile/logfile.h */ gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), "twlog"); gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), "adif"); gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), "cabrillo"); gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), "editest"); gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), "trlog"); gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), "EDI"); gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), "oh1aa"); gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 1); g_signal_connect ((gpointer) logbutton, "clicked", G_CALLBACK (on_importlogbutton_clicked), NULL); GLADE_HOOKUP_OBJECT (importlogdialog, logentry, "logentry"); gtk_widget_show_all (importlogdialog); response = gtk_dialog_run (GTK_DIALOG (importlogdialog)); if (response == GTK_RESPONSE_OK) { log = gtk_editable_get_chars (GTK_EDITABLE (logentry), 0, -1); filetype = gtk_combo_box_get_active (GTK_COMBO_BOX (combobox)); if (strlen(log) > 0) { state.qsos = 0; lp = log_file_open (log, filetype + 1); if (lp) { logn = logname (g_path_get_basename (log)); logw = openlog (lp, logn, state.logwindows++); g_free (logn); log_file_qso_foreach (lp, fillin_list, logw); log_file_close (lp); logw->filename = g_strconcat (preferences.savedir, G_DIR_SEPARATOR_S, logn, ".xlog", NULL); g_free (logn); lp->type = filetype + 1; logwindowlist = g_list_append (logwindowlist, logw); gtk_notebook_set_current_page (GTK_NOTEBOOK(mainnotebook), state.logwindows - 1); set_qsoframe (logw); set_tabs_menu (); temp = g_strdup_printf (_("%d QSO's imported"), state.qsos); update_statusbar (temp); g_free (temp); } } g_free (log); } gtk_widget_destroy (importlogdialog); }