[easytag/wip/application-window: 1/70] Move load filenames dialog to EtLoadFilesDialog
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [easytag/wip/application-window: 1/70] Move load filenames dialog to EtLoadFilesDialog
- Date: Fri, 1 Aug 2014 08:17:01 +0000 (UTC)
commit bfba9d4c3d6343538745391ccd261df76e97f53e
Author: David King <amigadave amigadave com>
Date: Fri Dec 27 23:54:21 2013 +0000
Move load filenames dialog to EtLoadFilesDialog
Makefile.am | 2 +
po/POTFILES.in | 1 +
src/application_window.c | 36 ++
src/application_window.h | 2 +
src/bar.c | 2 +-
src/load_files_dialog.c | 1159 ++++++++++++++++++++++++++++++++++++++++++++++
src/load_files_dialog.h | 54 +++
src/misc.c | 1059 ------------------------------------------
src/misc.h | 4 -
src/setting.c | 14 +-
src/setting.h | 5 -
11 files changed, 1259 insertions(+), 1079 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 4ae3e81..b2802c9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -58,6 +58,7 @@ easytag_SOURCES = \
src/gtk2_compat.c \
src/id3_tag.c \
src/id3v24_tag.c \
+ src/load_files_dialog.c \
src/log.c \
src/misc.c \
src/monkeyaudio_header.c \
@@ -102,6 +103,7 @@ easytag_headers = \
src/gio_wrapper.h \
src/gtk2_compat.h \
src/id3_tag.h \
+ src/load_files_dialog.h \
src/log.h \
src/misc.h \
src/monkeyaudio_header.h \
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 000d7cb..033666f 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -15,6 +15,7 @@ src/flac_header.c
src/flac_tag.c
src/id3_tag.c
src/id3v24_tag.c
+src/load_files_dialog.c
src/log.c
src/misc.c
src/monkeyaudio_header.c
diff --git a/src/application_window.c b/src/application_window.c
index fd49e9a..7e555ca 100644
--- a/src/application_window.c
+++ b/src/application_window.c
@@ -27,6 +27,7 @@
#include "browser.h"
#include "easytag.h"
#include "gtk2_compat.h"
+#include "load_files_dialog.h"
#include "log.h"
#include "misc.h"
#include "picture.h"
@@ -45,6 +46,7 @@ struct _EtApplicationWindowPrivate
GtkWidget *file_area;
GtkWidget *log_area;
GtkWidget *tag_area;
+ GtkWidget *load_files_dialog;
GtkWidget *playlist_dialog;
/* Tag area labels. */
@@ -1639,6 +1641,7 @@ et_application_window_finalize (GObject *object)
priv = et_application_window_get_instance_private (ET_APPLICATION_WINDOW (object));
+ g_clear_object (&priv->load_files_dialog);
g_clear_object (&priv->playlist_dialog);
G_OBJECT_CLASS (et_application_window_parent_class)->finalize (object);
@@ -1657,6 +1660,7 @@ et_application_window_init (EtApplicationWindow *self)
ET_TYPE_APPLICATION_WINDOW,
EtApplicationWindowPrivate);
+ priv->load_files_dialog = NULL;
priv->playlist_dialog = NULL;
window = GTK_WINDOW (self);
@@ -1819,6 +1823,38 @@ et_application_window_show_playlist_dialog (G_GNUC_UNUSED GtkAction *action,
}
}
+GtkWidget *
+et_application_window_get_load_files_dialog (EtApplicationWindow *self)
+{
+ EtApplicationWindowPrivate *priv;
+
+ g_return_val_if_fail (self != NULL, NULL);
+
+ priv = et_application_window_get_instance_private (self);
+
+ return priv->load_files_dialog;
+}
+
+void
+et_application_window_show_load_files_dialog (G_GNUC_UNUSED GtkAction *action,
+ gpointer user_data)
+{
+ EtApplicationWindowPrivate *priv;
+ EtApplicationWindow *self = ET_APPLICATION_WINDOW (user_data);
+
+ priv = et_application_window_get_instance_private (self);
+
+ if (priv->load_files_dialog)
+ {
+ gtk_widget_show (priv->load_files_dialog);
+ }
+ else
+ {
+ priv->load_files_dialog = GTK_WIDGET (et_load_files_dialog_new ());
+ gtk_widget_show_all (priv->load_files_dialog);
+ }
+}
+
/*
* Disable (FALSE) / Enable (TRUE) all user widgets in the tag area
*/
diff --git a/src/application_window.h b/src/application_window.h
index 9cc2636..8d80995 100644
--- a/src/application_window.h
+++ b/src/application_window.h
@@ -53,6 +53,8 @@ void et_application_window_tag_area_display_controls (EtApplicationWindow *self,
GtkWidget * et_application_window_get_log_area (EtApplicationWindow *self);
GtkWidget * et_application_window_get_playlist_dialog (EtApplicationWindow *self);
void et_application_window_show_playlist_dialog (GtkAction *action, gpointer user_data);
+GtkWidget * et_application_window_get_load_files_dialog (EtApplicationWindow *self);
+void et_application_window_show_load_files_dialog (GtkAction *action, gpointer user_data);
void et_application_window_hide_log_area (EtApplicationWindow *self);
void et_application_window_show_log_area (EtApplicationWindow *self);
diff --git a/src/bar.c b/src/bar.c
index 7722971..e380c12 100644
--- a/src/bar.c
+++ b/src/bar.c
@@ -292,7 +292,7 @@ Create_UI (GtkWindow *window, GtkWidget **ppmenubar, GtkWidget **pptoolbar)
{ AM_FILENAME_FROM_TXT, GTK_STOCK_OPEN,
_("Load Filenames From a Text File…"), "<Primary>T",
_("Load filenames from a text file"),
- G_CALLBACK (Open_Load_Filename_Window) },
+ G_CALLBACK (et_application_window_show_load_files_dialog) },
{ AM_WRITE_PLAYLIST, GTK_STOCK_SAVE_AS, _("Generate Playlist…"),
"<Primary>W", _("Generate a playlist"),
G_CALLBACK (et_application_window_show_playlist_dialog) },
diff --git a/src/load_files_dialog.c b/src/load_files_dialog.c
new file mode 100644
index 0000000..e42bf7f
--- /dev/null
+++ b/src/load_files_dialog.c
@@ -0,0 +1,1159 @@
+/* EasyTAG - tag editor for audio files
+ * Copyright (C) 2013 David King <amigadave amigadave com>
+ *
+ * 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 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., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include "load_files_dialog.h"
+
+#include <gdk/gdkkeysyms.h>
+#include <glib/gi18n.h>
+
+#include "bar.h"
+#include "browser.h"
+#include "charset.h"
+#include "easytag.h"
+#include "gtk2_compat.h"
+#include "log.h"
+#include "misc.h"
+#include "picture.h"
+#include "scan_dialog.h"
+#include "setting.h"
+
+/* TODO: Use G_DEFINE_TYPE_WITH_PRIVATE. */
+G_DEFINE_TYPE (EtLoadFilesDialog, et_load_files_dialog, GTK_TYPE_DIALOG)
+
+#define et_load_files_dialog_get_instance_private(dialog) (dialog->priv)
+
+static const guint BOX_SPACING = 6;
+
+enum
+{
+ LOAD_FILE_CONTENT_TEXT,
+ LOAD_FILE_CONTENT_COUNT
+};
+
+enum
+{
+ LOAD_FILE_NAME_TEXT,
+ LOAD_FILE_NAME_POINTER,
+ LOAD_FILE_NAME_COUNT
+};
+
+struct _EtLoadFilesDialogPrivate
+{
+ GtkWidget *file_to_load_combo;
+ GtkListStore *file_to_load_model;
+ GtkWidget *load_file_content_view;
+ GtkListStore *load_file_content_model;
+ GtkWidget *load_file_name_view;
+ GtkListStore *load_file_name_model;
+ GtkWidget *load_file_run_scanner;
+
+ GtkWidget *selected_line_entry;
+};
+
+
+/*
+ * Set the new filename of each file.
+ * Associate lines from priv->load_file_content_view with priv->load_file_name_view
+ */
+static void
+Load_Filename_Set_Filenames (EtLoadFilesDialog *self)
+{
+ EtLoadFilesDialogPrivate *priv;
+ gint row;
+ ET_File *ETFile = NULL;
+ File_Name *FileName;
+ gchar *list_text = NULL;
+ gint rowcount;
+ gboolean found;
+
+ GtkTreePath *currentPath = NULL;
+ GtkTreeIter iter_name;
+ GtkTreeIter iter_content;
+
+ priv = et_load_files_dialog_get_instance_private (self);
+
+ if ( !ETCore->ETFileList || !priv->load_file_content_view || !priv->load_file_name_view)
+ return;
+
+ /* Save current file */
+ ET_Save_File_Data_From_UI(ETCore->ETFileDisplayed);
+
+ rowcount = MIN(gtk_tree_model_iter_n_children(GTK_TREE_MODEL(priv->load_file_name_model), NULL),
+ gtk_tree_model_iter_n_children(GTK_TREE_MODEL(priv->load_file_content_model), NULL));
+
+ for (row=0; row < rowcount; row++)
+ {
+ if (row == 0)
+ currentPath = gtk_tree_path_new_first();
+ else
+ gtk_tree_path_next(currentPath);
+
+ found = gtk_tree_model_get_iter(GTK_TREE_MODEL(priv->load_file_name_model), &iter_name, currentPath);
+ if (found)
+ gtk_tree_model_get(GTK_TREE_MODEL(priv->load_file_name_model), &iter_name,
+ LOAD_FILE_NAME_POINTER, &ETFile, -1);
+
+ found = gtk_tree_model_get_iter(GTK_TREE_MODEL(priv->load_file_content_model), &iter_content,
currentPath);
+ if (found)
+ gtk_tree_model_get(GTK_TREE_MODEL(priv->load_file_content_model), &iter_content,
+ LOAD_FILE_CONTENT_TEXT, &list_text, -1);
+
+ if (ETFile && list_text && (g_utf8_strlen (list_text, -1) > 0))
+ {
+ gchar *list_text_tmp;
+ gchar *filename_new_utf8;
+
+ list_text_tmp = g_strdup(list_text);
+ ET_File_Name_Convert_Character(list_text_tmp); // Replace invalid characters
+
+ /* Build the filename with the path */
+ filename_new_utf8 = ET_File_Name_Generate(ETFile,list_text_tmp);
+ g_free(list_text_tmp);
+
+ /* Set the new filename */
+ // Create a new 'File_Name' item
+ FileName = ET_File_Name_Item_New();
+ // Save changes of the 'File_Name' item
+ ET_Set_Filename_File_Name_Item(FileName,filename_new_utf8,NULL);
+ ET_Manage_Changes_Of_File_Data(ETFile,FileName,NULL);
+
+ g_free(filename_new_utf8);
+
+ // Then run current scanner if asked...
+ if (ScannerWindow &&
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->load_file_run_scanner)) )
+ Scan_Select_Mode_And_Run_Scanner(ETFile);
+ }
+ g_free(list_text);
+ }
+
+ gtk_tree_path_free(currentPath);
+
+ Browser_List_Refresh_Whole_List();
+ ET_Display_File_Data_To_UI(ETCore->ETFileDisplayed);
+}
+
+/*
+ * on_response:
+ * @dialog: the dialog which emitted the response signal
+ * @response_id: the response ID
+ * @user_data: user data set when the signal was connected
+ *
+ * Signal handler for the load filenames from text file dialog.
+ */
+static void
+on_response (GtkDialog *dialog, gint response_id, gpointer user_data)
+{
+ switch (response_id)
+ {
+ case GTK_RESPONSE_APPLY:
+ Load_Filename_Set_Filenames (ET_LOAD_FILES_DIALOG (dialog));
+ break;
+ case GTK_RESPONSE_CANCEL:
+ et_load_files_dialog_apply_changes (ET_LOAD_FILES_DIALOG (dialog));
+ gtk_widget_hide (GTK_WIDGET (dialog));
+ break;
+ case GTK_RESPONSE_DELETE_EVENT:
+ et_load_files_dialog_apply_changes (ET_LOAD_FILES_DIALOG (dialog));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+/*
+ * To enable/disable sensitivity of the button 'Load'
+ */
+static void
+set_load_button_sensitivity (GtkWidget *button, GtkWidget *entry)
+{
+ gchar *path;
+ GFile *file;
+ GFileInfo *info;
+ GError *error = NULL;
+
+ if (!entry || !button)
+ return;
+
+ path = filename_from_display(gtk_entry_get_text(GTK_ENTRY(entry)));
+
+ if (!path)
+ {
+ gtk_widget_set_sensitive(GTK_WIDGET(button),FALSE);
+ return;
+ }
+
+ file = g_file_new_for_path (path);
+ info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE,
+ G_FILE_QUERY_INFO_NONE, NULL, &error);
+
+ if (info && G_FILE_TYPE_REGULAR == g_file_info_get_file_type (info))
+ gtk_widget_set_sensitive(GTK_WIDGET(button),TRUE);
+ else
+ {
+ gtk_widget_set_sensitive(GTK_WIDGET(button),FALSE);
+ if (!info)
+ {
+ Log_Print (LOG_ERROR, _("Cannot retrieve file info (%s)"),
+ error->message);
+ g_error_free (error);
+ g_object_unref (file);
+ g_free (path);
+ return;
+ }
+ }
+
+ g_object_unref (info);
+ g_object_unref (file);
+ g_free(path);
+}
+
+/*
+ * Load content of the file into the priv->load_file_content_view list
+ */
+static void
+Load_File_Content (G_GNUC_UNUSED GtkButton *button, gpointer user_data)
+{
+ EtLoadFilesDialogPrivate *priv;
+ GtkWidget *entry;
+ GFile *file;
+ GFileInputStream *istream;
+ GDataInputStream *data;
+ GError *error = NULL;
+ gsize size_read;
+ gchar *filename;
+ const gchar *filename_utf8;
+ gchar *line;
+ gchar *valid;
+
+ priv = et_load_files_dialog_get_instance_private (ET_LOAD_FILES_DIALOG (user_data));
+ entry = gtk_bin_get_child (GTK_BIN (priv->file_to_load_combo));
+
+ // The file to read
+ filename_utf8 = gtk_entry_get_text(GTK_ENTRY(entry)); // Don't free me!
+ Add_String_To_Combo_List(priv->file_to_load_model, filename_utf8);
+ filename = filename_from_display(filename_utf8);
+
+ file = g_file_new_for_path (filename);
+ istream = g_file_read (file, NULL, &error);
+ g_object_unref (file);
+
+ if (!istream)
+ {
+ Log_Print (LOG_ERROR, _("Can't open file '%s' (%s)"), filename_utf8,
+ error->message);
+ g_error_free (error);
+ g_object_unref (file);
+ g_free(filename);
+ return;
+ }
+
+ data = g_data_input_stream_new (G_INPUT_STREAM (istream));
+ /* TODO: Find a safer alternative to _ANY. */
+ g_data_input_stream_set_newline_type (data,
+ G_DATA_STREAM_NEWLINE_TYPE_ANY);
+ gtk_list_store_clear (priv->load_file_content_model);
+
+ while ((line = g_data_input_stream_read_line (data, &size_read, NULL,
+ &error)))
+ {
+ /* FIXME: This should use the GLib filename encoding, not UTF-8. */
+ valid = Try_To_Validate_Utf8_String (line);
+ g_free (line);
+
+ gtk_list_store_insert_with_values (priv->load_file_content_model, NULL,
+ G_MAXINT, LOAD_FILE_CONTENT_TEXT,
+ valid, -1);
+ g_free (valid);
+ }
+
+ if (error)
+ {
+ Log_Print (LOG_ERROR, _("Error reading file (%s)"), error->message);
+ g_error_free (error);
+ }
+
+ g_object_unref (data);
+ g_object_unref (istream);
+ g_free (filename);
+}
+
+/*
+ * Delete the selected line in the treeview passed as parameter
+ */
+static void
+Load_Filename_List_Delete_Line (GtkWidget *treeview)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter selectedIter, itercopy;
+ GtkTreeModel *model;
+ gboolean rowafter;
+
+ g_return_if_fail (treeview != NULL);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+
+ if (gtk_tree_selection_get_selected(selection, &model, &selectedIter) != TRUE)
+ {
+ return;
+ }
+
+ // If there is a line following the one about to be removed, select it for convenience
+ itercopy = selectedIter;
+ rowafter = gtk_tree_model_iter_next(model, &itercopy);
+
+ // Remove the line to be deleted
+ gtk_list_store_remove(GTK_LIST_STORE(model), &selectedIter);
+
+ if (rowafter)
+ gtk_tree_selection_select_iter(selection, &itercopy);
+}
+
+/*
+ * Insert a blank line before the selected line in the treeview passed as parameter
+ */
+static void
+Load_Filename_List_Insert_Blank_Line (GtkWidget *treeview)
+{
+ GtkTreeSelection *selection;
+ GtkTreeIter selectedIter;
+ GtkTreeIter *temp;
+ GtkTreeModel *model;
+
+ g_return_if_fail (treeview != NULL);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+
+ if (gtk_tree_selection_get_selected(selection, &model, &selectedIter) != TRUE)
+ return;
+
+ temp = &selectedIter; /* Not used here, but it must be non-NULL to keep GTK+ happy! */
+ gtk_list_store_insert_before(GTK_LIST_STORE(model), temp, &selectedIter);
+}
+
+static gboolean
+Load_Filename_List_Key_Press (GtkWidget *treeview, GdkEvent *event)
+{
+ if (event && event->type == GDK_KEY_PRESS)
+ {
+ GdkEventKey *kevent = (GdkEventKey *)event;
+
+ switch(kevent->keyval)
+ {
+ case GDK_KEY_Delete:
+ Load_Filename_List_Delete_Line(treeview);
+ return GDK_EVENT_STOP;
+ break;
+ case GDK_KEY_I:
+ case GDK_KEY_i:
+ Load_Filename_List_Insert_Blank_Line(treeview);
+ return GDK_EVENT_STOP;
+ break;
+ }
+ }
+
+ return GDK_EVENT_PROPAGATE;
+}
+
+/*
+ * Delete all blank lines in the treeview passed as parameter
+ */
+static void
+Load_Filename_List_Delete_All_Blank_Lines (GtkWidget *treeview)
+{
+ gchar *text = NULL;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+
+ if (!gtk_tree_model_get_iter_first(model, &iter))
+ return;
+
+ while (TRUE)
+ {
+ gtk_tree_model_get(model, &iter, LOAD_FILE_NAME_TEXT, &text, -1);
+
+ /* Check for blank entry */
+ if (!text || g_utf8_strlen(text, -1) == 0)
+ {
+ g_free(text);
+
+ if (!gtk_list_store_remove(GTK_LIST_STORE(model), &iter))
+ break;
+ else
+ continue;
+ }
+ g_free(text);
+
+ if (!gtk_tree_model_iter_next(model, &iter))
+ break;
+ }
+}
+
+/*
+ * Move up the selected line in the treeview passed as parameter
+ */
+static void
+Load_Filename_List_Move_Up (GtkWidget *treeview)
+{
+ GtkTreeSelection *selection;
+ GList *selectedRows;
+ GList *l;
+ GtkTreeIter currentFile;
+ GtkTreeIter nextFile;
+ GtkTreePath *currentPath;
+ GtkTreeModel *treemodel;
+
+ g_return_if_fail (treeview != NULL);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+ treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+ selectedRows = gtk_tree_selection_get_selected_rows(selection, NULL);
+
+ if (!selectedRows)
+ {
+ return;
+ }
+
+ for (l = selectedRows; l != NULL; l = g_list_next (l))
+ {
+ currentPath = (GtkTreePath *)l->data;
+
+ if (gtk_tree_model_get_iter (treemodel, ¤tFile, currentPath))
+ {
+ // Find the entry above the node...
+ if (gtk_tree_path_prev(currentPath))
+ {
+ // ...and if it exists, swap the two rows by iter
+ gtk_tree_model_get_iter(treemodel, &nextFile, currentPath);
+ gtk_list_store_swap(GTK_LIST_STORE(treemodel), ¤tFile, &nextFile);
+ }
+ }
+ }
+
+ g_list_free_full (selectedRows, (GDestroyNotify)gtk_tree_path_free);
+}
+
+/*
+ * Move down the selected line in the treeview passed as parameter
+ */
+static void
+Load_Filename_List_Move_Down (GtkWidget *treeview)
+{
+ GtkTreeSelection *selection;
+ GList *selectedRows;
+ GList *l;
+ GtkTreeIter currentFile;
+ GtkTreeIter nextFile;
+ GtkTreePath *currentPath;
+ GtkTreeModel *treemodel;
+
+ g_return_if_fail (treeview != NULL);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+ treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+ selectedRows = gtk_tree_selection_get_selected_rows(selection, NULL);
+
+ if (!selectedRows)
+ {
+ return;
+ }
+
+ for (l = selectedRows; l != NULL; l = g_list_next (l))
+ {
+ currentPath = (GtkTreePath *)l->data;
+
+ if (gtk_tree_model_get_iter (treemodel, ¤tFile, currentPath))
+ {
+ // Find the entry below the node and swap the two nodes by iter
+ gtk_tree_path_next(currentPath);
+ if (gtk_tree_model_get_iter(treemodel, &nextFile, currentPath))
+ gtk_list_store_swap(GTK_LIST_STORE(treemodel), ¤tFile, &nextFile);
+ }
+ }
+
+ g_list_free_full (selectedRows, (GDestroyNotify)gtk_tree_path_free);
+}
+
+/*
+ * Load the names of the current list of files
+ */
+static void
+Load_File_List (EtLoadFilesDialog *self)
+{
+ EtLoadFilesDialogPrivate *priv;
+ GList *l;
+ ET_File *etfile;
+ gchar *filename_utf8;
+ gchar *pos;
+
+ priv = et_load_files_dialog_get_instance_private (self);
+
+ gtk_list_store_clear(priv->load_file_name_model);
+
+ for (l = g_list_first (ETCore->ETFileList); l != NULL; l = g_list_next (l))
+ {
+ etfile = (ET_File *)l->data;
+ filename_utf8 = g_path_get_basename(((File_Name *)etfile->FileNameNew->data)->value_utf8);
+ // Remove the extension ('filename' must be allocated to don't affect the initial value)
+ if ((pos=strrchr(filename_utf8,'.'))!=NULL)
+ *pos = 0;
+ gtk_list_store_insert_with_values (priv->load_file_name_model, NULL,
+ G_MAXINT, LOAD_FILE_NAME_TEXT,
+ filename_utf8,
+ LOAD_FILE_NAME_POINTER, l->data,
+ -1);
+ g_free(filename_utf8);
+ }
+}
+
+static void
+on_load_file_name_view_reload_clicked (G_GNUC_UNUSED GtkButton *button,
+ gpointer user_data)
+{
+ Load_File_List (ET_LOAD_FILES_DIALOG (user_data));
+}
+
+static void
+on_load_file_content_view_reload_clicked (G_GNUC_UNUSED GtkButton *button,
+ gpointer user_data)
+{
+ Load_File_Content (NULL, ET_LOAD_FILES_DIALOG (user_data));
+}
+
+/*
+ * To select the corresponding row in the other list
+ */
+static void
+Load_Filename_Select_Row_In_Other_List (GtkWidget* treeview_target, gpointer origselection)
+{
+ GtkAdjustment *ct_adj, *ce_adj;
+ GtkTreeSelection *selection_orig;
+ GtkTreeSelection *selection_target;
+ GtkTreeView *treeview_orig;
+ GtkTreeModel *treemodel_orig;
+ GtkTreeModel *treemodel_target;
+ GtkTreeIter iter_orig;
+ GtkTreeIter iter_target;
+ GtkTreePath *path_orig;
+ gint *indices_orig;
+ gchar *stringiter;
+
+ if (!treeview_target || !origselection)
+ return;
+
+ selection_orig = GTK_TREE_SELECTION(origselection);
+ selection_target = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview_target));
+ treemodel_target = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview_target));
+
+ if (!gtk_tree_selection_get_selected(selection_orig, &treemodel_orig, &iter_orig))
+ return; /* Might be called with no selection */
+
+ treeview_orig = gtk_tree_selection_get_tree_view(selection_orig);
+ path_orig = gtk_tree_model_get_path(treemodel_orig, &iter_orig);
+ gtk_tree_selection_unselect_all(selection_target);
+
+ /* Synchronize the two lists. */
+ ce_adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (treeview_orig));
+ ct_adj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(treeview_target));
+
+ if (gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj)) >=
gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj))
+ && gtk_adjustment_get_upper(GTK_ADJUSTMENT(ce_adj)) >=
gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ce_adj)))
+ {
+ // Rules are displayed in the both clist
+ if (gtk_adjustment_get_value(GTK_ADJUSTMENT(ce_adj)) <=
gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj)) - gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj)))
+ {
+
gtk_adjustment_set_value(GTK_ADJUSTMENT(ct_adj),gtk_adjustment_get_value(GTK_ADJUSTMENT(ce_adj)));
+ } else
+ {
+ gtk_adjustment_set_value(GTK_ADJUSTMENT(ct_adj),gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj))
- gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj)));
+ indices_orig = gtk_tree_path_get_indices(path_orig);
+
+ if (indices_orig[0] <= (gtk_tree_model_iter_n_children(treemodel_target, NULL) - 1))
+
gtk_adjustment_set_value(GTK_ADJUSTMENT(ce_adj),gtk_adjustment_get_value(GTK_ADJUSTMENT(ct_adj)));
+
+ }
+ }else if (gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj)) <
gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj))) // Target Clist rule not visible
+ {
+ indices_orig = gtk_tree_path_get_indices(path_orig);
+
+ if (indices_orig[0] <= (gtk_tree_model_iter_n_children(treemodel_target, NULL) - 1))
+
gtk_adjustment_set_value(GTK_ADJUSTMENT(ce_adj),gtk_adjustment_get_value(GTK_ADJUSTMENT(ct_adj)));
+ }
+
+ // Must block the select signal of the target to avoid looping
+ g_signal_handlers_block_by_func(G_OBJECT(selection_target),
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(treeview_orig));
+
+ stringiter = gtk_tree_model_get_string_from_iter(treemodel_orig, &iter_orig);
+ if (gtk_tree_model_get_iter_from_string(treemodel_target, &iter_target, stringiter))
+ {
+ gtk_tree_selection_select_iter(selection_target, &iter_target);
+ }
+
+ g_free(stringiter);
+ g_signal_handlers_unblock_by_func(G_OBJECT(selection_target),
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(treeview_orig));
+}
+
+/*
+ * Create and attach a popup menu on the two clist of the LoadFileWindow
+ */
+static gboolean
+Load_Filename_Popup_Menu_Handler (GtkWidget *treeview, GdkEventButton *event,
+ GtkMenu *menu)
+{
+ if (event && (event->type==GDK_BUTTON_PRESS) && (event->button==3))
+ {
+ gtk_menu_popup(menu,NULL,NULL,NULL,NULL,event->button,event->time);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void
+create_load_file_content_view_popup (EtLoadFilesDialog *self, GtkWidget *list)
+{
+ GtkWidget *BrowserPopupMenu;
+ GtkWidget *Image;
+ GtkWidget *MenuItem;
+
+ BrowserPopupMenu = gtk_menu_new();
+ gtk_menu_attach_to_widget (GTK_MENU (BrowserPopupMenu), list, NULL);
+ g_signal_connect (G_OBJECT (list), "button-press-event",
+ G_CALLBACK (Load_Filename_Popup_Menu_Handler),
+ BrowserPopupMenu);
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Insert a blank line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu), MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Insert_Blank_Line), G_OBJECT(list));
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Delete this line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate", G_CALLBACK(Load_Filename_List_Delete_Line),
G_OBJECT(list));
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Delete all blank lines"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Delete_All_Blank_Lines),G_OBJECT(list));
+
+ MenuItem = gtk_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Move up this line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_GO_UP,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Move_Up),G_OBJECT(list));
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Move down this line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Move_Down),G_OBJECT(list));
+
+ MenuItem = gtk_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Reload"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect (MenuItem, "activate",
+ G_CALLBACK (on_load_file_content_view_reload_clicked),
+ self);
+
+ gtk_widget_show_all(BrowserPopupMenu);
+}
+
+static void
+create_load_file_name_view_popup (EtLoadFilesDialog *self, GtkWidget *list)
+{
+ GtkWidget *BrowserPopupMenu;
+ GtkWidget *Image;
+ GtkWidget *MenuItem;
+
+ BrowserPopupMenu = gtk_menu_new();
+ gtk_menu_attach_to_widget (GTK_MENU (BrowserPopupMenu), list, NULL);
+ g_signal_connect (G_OBJECT (list), "button-press-event",
+ G_CALLBACK (Load_Filename_Popup_Menu_Handler),
+ BrowserPopupMenu);
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Insert a blank line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu), MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Insert_Blank_Line), G_OBJECT(list));
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Delete this line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate", G_CALLBACK(Load_Filename_List_Delete_Line),
G_OBJECT(list));
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Delete all blank lines"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Delete_All_Blank_Lines),G_OBJECT(list));
+
+ MenuItem = gtk_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Move up this line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_GO_UP,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Move_Up),G_OBJECT(list));
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Move down this line"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Move_Down),G_OBJECT(list));
+
+ MenuItem = gtk_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+
+ MenuItem = gtk_image_menu_item_new_with_label(_("Reload"));
+ Image = gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
+ gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
+ g_signal_connect (MenuItem, "activate",
+ G_CALLBACK (on_load_file_name_view_reload_clicked),
+ self);
+
+ gtk_widget_show_all(BrowserPopupMenu);
+}
+
+/*
+ * Update the text of the selected line into the list, with the text entered into the entry
+ */
+static void
+Load_Filename_Update_Text_Line(GtkWidget *entry, GtkWidget *list)
+{
+ GtkTreeIter SelectedRow;
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ gboolean hasSelectedRows;
+
+ g_return_if_fail (entry != NULL || list != NULL);
+
+ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
+ hasSelectedRows = gtk_tree_selection_get_selected(selection, &model, &SelectedRow);
+ if (hasSelectedRows)
+ {
+ const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
+ gtk_list_store_set(GTK_LIST_STORE(model), &SelectedRow, LOAD_FILE_CONTENT_TEXT, text, -1);
+ }
+}
+
+/*
+ * Set the text of the selected line of the list into the entry
+ */
+static void
+Load_Filename_Edit_Text_Line (GtkTreeSelection *selection, gpointer user_data)
+{
+ EtLoadFilesDialogPrivate *priv;
+ gchar *text;
+ GtkTreeIter selectedIter;
+ GtkEntry *entry;
+ gulong handler;
+
+ priv = et_load_files_dialog_get_instance_private (ET_LOAD_FILES_DIALOG (user_data));
+
+ entry = GTK_ENTRY (priv->selected_line_entry);
+
+ if (gtk_tree_selection_get_selected(selection, NULL, &selectedIter) != TRUE)
+ return;
+
+ gtk_tree_model_get(GTK_TREE_MODEL(priv->load_file_content_model), &selectedIter, LOAD_FILE_NAME_TEXT,
&text, -1);
+
+ handler = g_signal_handler_find(entry, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, Load_Filename_Update_Text_Line,
NULL);
+ g_signal_handler_block(entry, handler);
+ if (text)
+ {
+ gtk_entry_set_text(entry, text);
+ g_free(text);
+ } else
+ gtk_entry_set_text(entry, "");
+
+ g_signal_handler_unblock(entry, handler);
+}
+
+/*
+ * The window to load the filenames from a txt.
+ */
+static void
+create_load_files_dialog (EtLoadFilesDialog *self)
+{
+ EtLoadFilesDialogPrivate *priv;
+ GtkWidget *content_area, *hbox;
+ GtkWidget *Label;
+ GtkWidget *Button;
+ GtkWidget *Icon;
+ GtkWidget *Entry;
+ GtkWidget *ButtonLoad;
+ GtkWidget *Separator;
+ GtkWidget *ScrollWindow;
+ GtkWidget *loadedvbox;
+ GtkWidget *filelistvbox;
+ GtkWidget *vboxpaned;
+ gchar *path;
+ GtkCellRenderer* renderer;
+ GtkTreeViewColumn* column;
+
+ priv = et_load_files_dialog_get_instance_private (self);
+
+ gtk_window_set_title (GTK_WINDOW (self),
+ _("Load Filenames From a Text File"));
+ gtk_window_set_transient_for (GTK_WINDOW (self), GTK_WINDOW (MainWindow));
+ gtk_window_set_destroy_with_parent (GTK_WINDOW (self), TRUE);
+ gtk_dialog_add_buttons (GTK_DIALOG (self), GTK_STOCK_CLOSE,
+ GTK_RESPONSE_CANCEL, GTK_STOCK_APPLY,
+ GTK_RESPONSE_ACCEPT, NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT);
+ g_signal_connect (self, "response", G_CALLBACK (on_response), NULL);
+ g_signal_connect (self, "delete-event",
+ G_CALLBACK (gtk_widget_hide_on_delete), NULL);
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (self));
+ gtk_container_set_border_width (GTK_CONTAINER (self), BOX_SPACING);
+ gtk_box_set_spacing (GTK_BOX (content_area), BOX_SPACING);
+
+ // Hbox for file entry and browser/load buttons
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
+ gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, TRUE, 0);
+
+ // File to load
+ priv->file_to_load_model = gtk_list_store_new (MISC_COMBO_COUNT,
+ G_TYPE_STRING);
+
+ Label = gtk_label_new(_("File:"));
+ gtk_misc_set_alignment(GTK_MISC(Label),1.0,0.5);
+ gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
+ priv->file_to_load_combo =
gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(priv->file_to_load_model));
+ g_object_unref (priv->file_to_load_model);
+ gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(priv->file_to_load_combo),MISC_COMBO_TEXT);
+ gtk_widget_set_size_request(GTK_WIDGET(priv->file_to_load_combo), 200, -1);
+ gtk_box_pack_start(GTK_BOX(hbox),priv->file_to_load_combo,TRUE,TRUE,0);
+ // History List
+ Load_File_To_Load_List(priv->file_to_load_model, MISC_COMBO_TEXT);
+ // Initial value
+ if ((path=Browser_Get_Current_Path())!=NULL)
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(priv->file_to_load_combo))),path);
+ // the 'changed' signal is attached below to enable/disable the button to load
+ // Button 'browse'
+ Button = gtk_button_new_from_stock(GTK_STOCK_OPEN);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_File),
G_OBJECT(gtk_bin_get_child(GTK_BIN(priv->file_to_load_combo))));
+ // Button 'load'
+ // the signal attached to this button, to load the file, is placed after the
priv->load_file_content_view definition
+ ButtonLoad = Create_Button_With_Icon_And_Label(GTK_STOCK_REVERT_TO_SAVED,_(" Load "));
+ //ButtonLoad = gtk_button_new_with_label(_(" Load "));
+ gtk_box_pack_start(GTK_BOX(hbox),ButtonLoad,FALSE,FALSE,0);
+ g_signal_connect_swapped(G_OBJECT(gtk_bin_get_child(GTK_BIN(priv->file_to_load_combo))),"changed",
G_CALLBACK(set_load_button_sensitivity), G_OBJECT(ButtonLoad));
+
+ // Vbox for loaded files
+ loadedvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, BOX_SPACING);
+
+ // Content of the loaded file
+ ScrollWindow = gtk_scrolled_window_new(NULL,NULL);
+
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ScrollWindow),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
+ gtk_widget_set_size_request(GTK_WIDGET(ScrollWindow), 250, 200);
+ gtk_box_pack_start(GTK_BOX(loadedvbox), ScrollWindow, TRUE, TRUE, 0);
+ priv->load_file_content_model = gtk_list_store_new(LOAD_FILE_CONTENT_COUNT, G_TYPE_STRING);
+ priv->load_file_content_view =
gtk_tree_view_new_with_model(GTK_TREE_MODEL(priv->load_file_content_model));
+ g_object_unref (priv->load_file_content_model);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes (_("Content of Text File"),
+ renderer, "text", LOAD_FILE_CONTENT_TEXT, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(priv->load_file_content_view), column);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(priv->load_file_content_view), TRUE);
+
//gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->load_file_content_view)),GTK_SELECTION_MULTIPLE);
+ gtk_tree_view_set_reorderable(GTK_TREE_VIEW(priv->load_file_content_view),TRUE);
+ gtk_container_add(GTK_CONTAINER(ScrollWindow),priv->load_file_content_view);
+
+ // Signal to automatically load the file
+ g_signal_connect (ButtonLoad, "clicked", G_CALLBACK(Load_File_Content),
+ self);
+ g_signal_connect(G_OBJECT(priv->load_file_content_view),"key-press-event",
G_CALLBACK(Load_Filename_List_Key_Press),NULL);
+
+ // Commands (like the popup menu)
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
+ gtk_box_pack_start(GTK_BOX(loadedvbox),hbox,FALSE,FALSE,0);
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Insert a blank line before the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Insert_Blank_Line),
G_OBJECT(priv->load_file_content_view));
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Delete the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Delete_Line),
G_OBJECT(priv->load_file_content_view));
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Delete all blank lines"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Delete_All_Blank_Lines),
G_OBJECT(priv->load_file_content_view));
+
+ Label = gtk_label_new(" ");
+ gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Move up the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Move_Up), G_OBJECT(priv->load_file_content_view));
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Move down the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Move_Down),
G_OBJECT(priv->load_file_content_view));
+
+ Label = gtk_label_new(" ");
+ gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Reload"));
+ g_signal_connect (Button, "clicked",
+ G_CALLBACK (on_load_file_content_view_reload_clicked),
+ self);
+
+ gtk_widget_show_all(loadedvbox);
+
+
+ //
+ // Vbox for file list files
+ //
+ filelistvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, BOX_SPACING);
+
+ // List of current filenames
+ ScrollWindow = gtk_scrolled_window_new(NULL,NULL);
+
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ScrollWindow),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
+ gtk_widget_set_size_request(GTK_WIDGET(ScrollWindow), 250, 200);
+ gtk_box_pack_start(GTK_BOX(filelistvbox), ScrollWindow, TRUE, TRUE, 0);
+ priv->load_file_name_model = gtk_list_store_new(LOAD_FILE_NAME_COUNT, G_TYPE_STRING,G_TYPE_POINTER);
+ priv->load_file_name_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(priv->load_file_name_model));
+ g_object_unref (priv->load_file_name_model);
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("List of Files"),
+ renderer, "text", LOAD_FILE_NAME_TEXT, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(priv->load_file_name_view), column);
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(priv->load_file_name_view), TRUE);
+
//gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->load_file_name_view)),GTK_SELECTION_MULTIPLE);
+ gtk_tree_view_set_reorderable(GTK_TREE_VIEW(priv->load_file_name_view),TRUE);
+ g_signal_connect(G_OBJECT(priv->load_file_name_view),"key-press-event",
G_CALLBACK(Load_Filename_List_Key_Press),NULL);
+ gtk_container_add(GTK_CONTAINER(ScrollWindow),priv->load_file_name_view);
+
+ // Signals to 'select' the same row into the other list (to show the corresponding filenames)
+
g_signal_connect_swapped(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->load_file_content_view))),"changed",
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(priv->load_file_name_view));
+
g_signal_connect_swapped(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->load_file_name_view))),"changed",
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(priv->load_file_content_view));
+
+ // Commands (like the popup menu)
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
+ gtk_box_pack_start(GTK_BOX(filelistvbox),hbox,FALSE,FALSE,0);
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Insert a blank line before the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Insert_Blank_Line),
G_OBJECT(priv->load_file_name_view));
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Delete the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Delete_Line),
G_OBJECT(priv->load_file_name_view));
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Delete all blank lines"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Delete_All_Blank_Lines),
G_OBJECT(priv->load_file_name_view));
+
+ Label = gtk_label_new(" ");
+ gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Move up the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Move_Up), G_OBJECT(priv->load_file_name_view));
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Move down the selected line"));
+ g_signal_connect_swapped(G_OBJECT(Button),"clicked",
+ G_CALLBACK(Load_Filename_List_Move_Down), G_OBJECT(priv->load_file_name_view));
+
+ Label = gtk_label_new(" ");
+ gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
+
+ Button = gtk_button_new();
+ Icon = gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_SMALL_TOOLBAR);
+ gtk_container_add(GTK_CONTAINER(Button),Icon);
+ gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
+ //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
+ gtk_widget_set_tooltip_text(Button,_("Reload"));
+ g_signal_connect (Button, "clicked",
+ G_CALLBACK (on_load_file_name_view_reload_clicked),
+ self);
+
+ gtk_widget_show_all(filelistvbox);
+
+
+ // Load the list of files in the list widget
+ Load_File_List (self);
+
+ vboxpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_paned_pack1(GTK_PANED(vboxpaned),loadedvbox, TRUE,FALSE);
+ gtk_paned_pack2(GTK_PANED(vboxpaned),filelistvbox,TRUE,FALSE);
+ gtk_box_pack_start(GTK_BOX(content_area),vboxpaned,TRUE,TRUE,0);
+
+ // Create popup menus
+ create_load_file_content_view_popup (self, priv->load_file_content_view);
+ create_load_file_name_view_popup (self, priv->load_file_name_view);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
+ gtk_box_pack_start(GTK_BOX(content_area),hbox,FALSE,TRUE,0);
+
+ Label = gtk_label_new(_("Selected line:"));
+ gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
+
+ // Entry to edit a line into the list
+ priv->selected_line_entry = Entry = gtk_entry_new();
+ gtk_box_pack_start(GTK_BOX(hbox),Entry,TRUE,TRUE,0);
+
g_signal_connect(G_OBJECT(Entry),"changed",G_CALLBACK(Load_Filename_Update_Text_Line),G_OBJECT(priv->load_file_content_view));
+
+ // Signal to load the line text in the editing entry
+ g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->load_file_content_view)),
+ "changed", G_CALLBACK(Load_Filename_Edit_Text_Line),
+ self);
+
+ // Separator line
+ Separator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+ gtk_box_pack_start(GTK_BOX(content_area),Separator,FALSE,FALSE,0);
+
+ priv->load_file_run_scanner = gtk_check_button_new_with_label(_("Run the current scanner for each
file"));
+ gtk_box_pack_start(GTK_BOX(content_area),priv->load_file_run_scanner,FALSE,TRUE,0);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->load_file_run_scanner),LOAD_FILE_RUN_SCANNER);
+ gtk_widget_set_tooltip_text(priv->load_file_run_scanner,_("When activating this option, after loading
the "
+ "filenames, the current selected scanner will be ran (the scanner window must be opened)."));
+
+ // To initialize 'ButtonLoad' sensivity
+ g_signal_emit_by_name(G_OBJECT(gtk_bin_get_child(GTK_BIN(priv->file_to_load_combo))),"changed");
+}
+
+/*
+ * For the configuration file...
+ */
+void
+et_load_files_dialog_apply_changes (EtLoadFilesDialog *self)
+{
+ EtLoadFilesDialogPrivate *priv;
+
+ g_return_if_fail (ET_LOAD_FILES_DIALOG (self));
+
+ priv = et_load_files_dialog_get_instance_private (self);
+
+ LOAD_FILE_RUN_SCANNER = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->load_file_run_scanner));
+}
+
+
+static void
+et_load_files_dialog_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (et_load_files_dialog_parent_class)->finalize (object);
+}
+
+static void
+et_load_files_dialog_init (EtLoadFilesDialog *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, ET_TYPE_LOAD_FILES_DIALOG,
+ EtLoadFilesDialogPrivate);
+
+ create_load_files_dialog (self);
+}
+
+static void
+et_load_files_dialog_class_init (EtLoadFilesDialogClass *klass)
+{
+ G_OBJECT_CLASS (klass)->finalize = et_load_files_dialog_finalize;
+
+ g_type_class_add_private (klass, sizeof (EtLoadFilesDialogPrivate));
+}
+
+/*
+ * et_load_files_dialog_new:
+ *
+ * Create a new EtLoadFilesDialog instance.
+ *
+ * Returns: a new #EtLoadFilesDialog
+ */
+EtLoadFilesDialog *
+et_load_files_dialog_new (void)
+{
+ return g_object_new (ET_TYPE_LOAD_FILES_DIALOG, NULL);
+}
diff --git a/src/load_files_dialog.h b/src/load_files_dialog.h
new file mode 100644
index 0000000..5db17e4
--- /dev/null
+++ b/src/load_files_dialog.h
@@ -0,0 +1,54 @@
+/* EasyTAG - tag editor for audio files
+ * Copyright (C) 2013 David King <amigadave amigadave com>
+ *
+ * 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 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., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef ET_LOAD_FILES_DIALOG_H_
+#define ET_LOAD_FILES_DIALOG_H_
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#include "et_core.h"
+
+#define ET_TYPE_LOAD_FILES_DIALOG (et_load_files_dialog_get_type ())
+#define ET_LOAD_FILES_DIALOG(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), ET_TYPE_LOAD_FILES_DIALOG,
EtLoadFilesDialog))
+
+typedef struct _EtLoadFilesDialog EtLoadFilesDialog;
+typedef struct _EtLoadFilesDialogClass EtLoadFilesDialogClass;
+typedef struct _EtLoadFilesDialogPrivate EtLoadFilesDialogPrivate;
+
+struct _EtLoadFilesDialog
+{
+ /*< private >*/
+ GtkDialog parent_instance;
+ EtLoadFilesDialogPrivate *priv;
+};
+
+struct _EtLoadFilesDialogClass
+{
+ /*< private >*/
+ GtkDialogClass parent_class;
+};
+
+GType et_load_files_dialog_get_type (void);
+EtLoadFilesDialog *et_load_files_dialog_new (void);
+void et_load_files_dialog_apply_changes (EtLoadFilesDialog *self);
+
+G_END_DECLS
+
+#endif /* !ET_LOAD_FILES_DIALOG_H_ */
diff --git a/src/misc.c b/src/misc.c
index f29a36e..f515233 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -65,16 +65,6 @@ static GtkListStore *SearchResultListModel;
static GtkWidget *SearchStatusBar;
static guint SearchStatusBarContext;
-/* Load filename window. */
-static GtkWidget *LoadFilenameWindow = NULL;
-static GtkWidget *FileToLoadCombo;
-static GtkListStore *FileToLoadModel = NULL;
-static GtkWidget *LoadFileContentList;
-static GtkListStore* LoadFileContentListModel;
-static GtkWidget *LoadFileNameList;
-static GtkListStore* LoadFileNameListModel;
-static GtkWidget *LoadFileRunScanner;
-
enum
{
// Columns for titles
@@ -132,19 +122,6 @@ enum
SEARCH_COLUMN_COUNT
};
-enum
-{
- LOAD_FILE_CONTENT_TEXT,
- LOAD_FILE_CONTENT_COUNT
-};
-
-enum
-{
- LOAD_FILE_NAME_TEXT,
- LOAD_FILE_NAME_POINTER,
- LOAD_FILE_NAME_COUNT
-};
-
/**************
* Prototypes *
**************/
@@ -156,26 +133,6 @@ static void Add_Row_To_Search_Result_List (ET_File *ETFile,
static void Search_Result_List_Row_Selected (GtkTreeSelection* selection,
gpointer data);
-void Open_Load_Filename_Window (void);
-static void Destroy_Load_Filename_Window (void);
-static void Load_Filename_List_Key_Press (GtkWidget *clist, GdkEvent *event);
-static void Load_File_Content (GtkWidget *file_entry);
-static void Load_File_List (void);
-static void Load_Filename_Select_Row_In_Other_List (GtkWidget *target,
- gpointer selection_emit);
-static void Load_Filename_Set_Filenames (void);
-static void Button_Load_Set_Sensivity (GtkWidget *button, GtkWidget *entry);
-static GtkWidget *Create_Load_Filename_Popup_Menu (GtkWidget *list);
-static void Load_Filename_List_Insert_Blank_Line (GtkWidget *list);
-static void Load_Filename_List_Delete_Line (GtkWidget *list);
-static void Load_Filename_List_Move_Up (GtkWidget *list);
-static void Load_Filename_List_Move_Down (GtkWidget *list);
-static void Load_Filename_List_Delete_All_Blank_Lines (GtkWidget *list);
-static void Load_Filename_List_Reload (GtkWidget *list);
-static void Load_Filename_Update_Text_Line (GtkWidget *entry, GtkWidget *list);
-static void Load_Filename_Edit_Text_Line (GtkTreeSelection *selection,
- gpointer data);
-
static void Create_Xpm_Icon_Factory (const char **xpm_data,
const char *name_in_factory);
@@ -184,8 +141,6 @@ static void Open_File_Selection_Window (GtkWidget *entry, gchar *title, GtkFileC
void File_Selection_Window_For_File (GtkWidget *entry);
void File_Selection_Window_For_Directory (GtkWidget *entry);
-static void et_load_text_file_on_response (GtkDialog *dialog, gint response_id,
- gpointer user_data);
/*************
* Functions *
@@ -1904,1020 +1859,6 @@ Search_Result_List_Row_Selected (GtkTreeSelection *selection, gpointer data)
g_list_free_full (selectedRows, (GDestroyNotify)gtk_tree_path_free);
}
-
-/********************************************
- * Load Filenames from a TXT file functions *
- ********************************************/
-/*
- * The window to load the filenames from a txt.
- */
-void Open_Load_Filename_Window (void)
-{
- GtkWidget *VBox, *hbox;
- GtkWidget *Label;
- GtkWidget *Button;
- GtkWidget *Icon;
- GtkWidget *Entry;
- GtkWidget *ButtonLoad;
- GtkWidget *Separator;
- GtkWidget *ScrollWindow;
- GtkWidget *loadedvbox;
- GtkWidget *filelistvbox;
- GtkWidget *vboxpaned;
- gchar *path;
- GtkCellRenderer* renderer;
- GtkTreeViewColumn* column;
-
- if (LoadFilenameWindow != NULL)
- {
- gtk_window_present(GTK_WINDOW(LoadFilenameWindow));
- return;
- }
-
- LoadFilenameWindow = gtk_dialog_new_with_buttons (_("Load Filenames From a Text File"),
- GTK_WINDOW (MainWindow),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_CLOSE,
- GTK_RESPONSE_CANCEL,
- GTK_STOCK_APPLY,
- GTK_RESPONSE_APPLY,
- NULL);
- gtk_dialog_set_default_response (GTK_DIALOG (LoadFilenameWindow),
- GTK_RESPONSE_ACCEPT);
- g_signal_connect (LoadFilenameWindow, "response",
- G_CALLBACK (et_load_text_file_on_response), NULL);
-
-
gtk_window_set_default_size(GTK_WINDOW(LoadFilenameWindow),LOAD_FILE_WINDOW_WIDTH,LOAD_FILE_WINDOW_HEIGHT);
-
- VBox = gtk_dialog_get_content_area (GTK_DIALOG (LoadFilenameWindow));
- gtk_container_set_border_width (GTK_CONTAINER (LoadFilenameWindow), BOX_SPACING);
- gtk_box_set_spacing (GTK_BOX (VBox), BOX_SPACING);
-
- // Hbox for file entry and browser/load buttons
- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
- gtk_box_pack_start(GTK_BOX(VBox),hbox,FALSE,TRUE,0);
-
- // File to load
- if (!FileToLoadModel)
- FileToLoadModel = gtk_list_store_new(MISC_COMBO_COUNT, G_TYPE_STRING);
- else
- gtk_list_store_clear(FileToLoadModel);
-
- Label = gtk_label_new(_("File:"));
- gtk_misc_set_alignment(GTK_MISC(Label),1.0,0.5);
- gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
- FileToLoadCombo = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(FileToLoadModel));
- gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(FileToLoadCombo),MISC_COMBO_TEXT);
- gtk_widget_set_size_request(GTK_WIDGET(FileToLoadCombo), 200, -1);
- gtk_box_pack_start(GTK_BOX(hbox),FileToLoadCombo,TRUE,TRUE,0);
- // History List
- Load_File_To_Load_List(FileToLoadModel, MISC_COMBO_TEXT);
- // Initial value
- if ((path=Browser_Get_Current_Path())!=NULL)
- gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(FileToLoadCombo))),path);
- // the 'changed' signal is attached below to enable/disable the button to load
- // Button 'browse'
- Button = gtk_button_new_from_stock(GTK_STOCK_OPEN);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_File),
G_OBJECT(gtk_bin_get_child(GTK_BIN(FileToLoadCombo))));
- // Button 'load'
- // the signal attached to this button, to load the file, is placed after the LoadFileContentList
definition
- ButtonLoad = Create_Button_With_Icon_And_Label(GTK_STOCK_REVERT_TO_SAVED,_(" Load "));
- //ButtonLoad = gtk_button_new_with_label(_(" Load "));
- gtk_box_pack_start(GTK_BOX(hbox),ButtonLoad,FALSE,FALSE,0);
- g_signal_connect_swapped(G_OBJECT(gtk_bin_get_child(GTK_BIN(FileToLoadCombo))),"changed",
G_CALLBACK(Button_Load_Set_Sensivity), G_OBJECT(ButtonLoad));
-
- // Vbox for loaded files
- loadedvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, BOX_SPACING);
-
- // Content of the loaded file
- ScrollWindow = gtk_scrolled_window_new(NULL,NULL);
-
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ScrollWindow),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(GTK_WIDGET(ScrollWindow), 250, 200);
- gtk_box_pack_start(GTK_BOX(loadedvbox), ScrollWindow, TRUE, TRUE, 0);
- LoadFileContentListModel = gtk_list_store_new(LOAD_FILE_CONTENT_COUNT, G_TYPE_STRING);
- LoadFileContentList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(LoadFileContentListModel));
- g_object_unref (LoadFileContentListModel);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes (_("Content of Text File"),
- renderer, "text", LOAD_FILE_CONTENT_TEXT, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(LoadFileContentList), column);
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(LoadFileContentList), TRUE);
-
//gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(LoadFileContentList)),GTK_SELECTION_MULTIPLE);
- gtk_tree_view_set_reorderable(GTK_TREE_VIEW(LoadFileContentList),TRUE);
- gtk_container_add(GTK_CONTAINER(ScrollWindow),LoadFileContentList);
-
- // Signal to automatically load the file
- g_signal_connect_swapped(G_OBJECT(ButtonLoad),"clicked", G_CALLBACK(Load_File_Content),
G_OBJECT(gtk_bin_get_child(GTK_BIN(FileToLoadCombo))));
- g_signal_connect(G_OBJECT(LoadFileContentList),"key-press-event",
G_CALLBACK(Load_Filename_List_Key_Press),NULL);
-
- // Commands (like the popup menu)
- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
- gtk_box_pack_start(GTK_BOX(loadedvbox),hbox,FALSE,FALSE,0);
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Insert a blank line before the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Insert_Blank_Line),
G_OBJECT(LoadFileContentList));
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Delete the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Delete_Line), G_OBJECT(LoadFileContentList));
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Delete all blank lines"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Delete_All_Blank_Lines),
G_OBJECT(LoadFileContentList));
-
- Label = gtk_label_new(" ");
- gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Move up the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Move_Up), G_OBJECT(LoadFileContentList));
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Move down the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Move_Down), G_OBJECT(LoadFileContentList));
-
- Label = gtk_label_new(" ");
- gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Reload"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Reload), G_OBJECT(LoadFileContentList));
-
- gtk_widget_show_all(loadedvbox);
-
-
- //
- // Vbox for file list files
- //
- filelistvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, BOX_SPACING);
-
- // List of current filenames
- ScrollWindow = gtk_scrolled_window_new(NULL,NULL);
-
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ScrollWindow),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request(GTK_WIDGET(ScrollWindow), 250, 200);
- gtk_box_pack_start(GTK_BOX(filelistvbox), ScrollWindow, TRUE, TRUE, 0);
- LoadFileNameListModel = gtk_list_store_new(LOAD_FILE_NAME_COUNT, G_TYPE_STRING,G_TYPE_POINTER);
- LoadFileNameList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(LoadFileNameListModel));
- g_object_unref (LoadFileNameListModel);
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(_("List of Files"),
- renderer, "text", LOAD_FILE_NAME_TEXT, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(LoadFileNameList), column);
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(LoadFileNameList), TRUE);
-
//gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(LoadFileNameList)),GTK_SELECTION_MULTIPLE);
- gtk_tree_view_set_reorderable(GTK_TREE_VIEW(LoadFileNameList),TRUE);
- g_signal_connect(G_OBJECT(LoadFileNameList),"key-press-event",
G_CALLBACK(Load_Filename_List_Key_Press),NULL);
- gtk_container_add(GTK_CONTAINER(ScrollWindow),LoadFileNameList);
-
- // Signals to 'select' the same row into the other list (to show the corresponding filenames)
-
g_signal_connect_swapped(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(LoadFileContentList))),"changed",
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(LoadFileNameList));
-
g_signal_connect_swapped(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(LoadFileNameList))),"changed",
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(LoadFileContentList));
-
- // Commands (like the popup menu)
- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
- gtk_box_pack_start(GTK_BOX(filelistvbox),hbox,FALSE,FALSE,0);
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Insert a blank line before the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Insert_Blank_Line), G_OBJECT(LoadFileNameList));
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Delete the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Delete_Line), G_OBJECT(LoadFileNameList));
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Delete all blank lines"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Delete_All_Blank_Lines),
G_OBJECT(LoadFileNameList));
-
- Label = gtk_label_new(" ");
- gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Move up the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Move_Up), G_OBJECT(LoadFileNameList));
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Move down the selected line"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Move_Down), G_OBJECT(LoadFileNameList));
-
- Label = gtk_label_new(" ");
- gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
-
- Button = gtk_button_new();
- Icon = gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_container_add(GTK_CONTAINER(Button),Icon);
- gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0);
- //gtk_button_set_relief(GTK_BUTTON(Button),GTK_RELIEF_NONE);
- gtk_widget_set_tooltip_text(Button,_("Reload"));
- g_signal_connect_swapped(G_OBJECT(Button),"clicked",
- G_CALLBACK(Load_Filename_List_Reload), G_OBJECT(LoadFileNameList));
-
- gtk_widget_show_all(filelistvbox);
-
-
- // Load the list of files in the list widget
- Load_File_List();
-
- vboxpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_paned_pack1(GTK_PANED(vboxpaned),loadedvbox, TRUE,FALSE);
- gtk_paned_pack2(GTK_PANED(vboxpaned),filelistvbox,TRUE,FALSE);
- gtk_box_pack_start(GTK_BOX(VBox),vboxpaned,TRUE,TRUE,0);
-
- // Create popup menus
- Create_Load_Filename_Popup_Menu(LoadFileContentList);
- Create_Load_Filename_Popup_Menu(LoadFileNameList);
-
- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, BOX_SPACING);
- gtk_box_pack_start(GTK_BOX(VBox),hbox,FALSE,TRUE,0);
-
- Label = gtk_label_new(_("Selected line:"));
- gtk_box_pack_start(GTK_BOX(hbox),Label,FALSE,FALSE,0);
-
- // Entry to edit a line into the list
- Entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(hbox),Entry,TRUE,TRUE,0);
-
g_signal_connect(G_OBJECT(Entry),"changed",G_CALLBACK(Load_Filename_Update_Text_Line),G_OBJECT(LoadFileContentList));
-
- // Signal to load the line text in the editing entry
- g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(LoadFileContentList))),"changed",
G_CALLBACK(Load_Filename_Edit_Text_Line), G_OBJECT(Entry));
-
- // Separator line
- Separator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
- gtk_box_pack_start(GTK_BOX(VBox),Separator,FALSE,FALSE,0);
-
- LoadFileRunScanner = gtk_check_button_new_with_label(_("Run the current scanner for each file"));
- gtk_box_pack_start(GTK_BOX(VBox),LoadFileRunScanner,FALSE,TRUE,0);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LoadFileRunScanner),LOAD_FILE_RUN_SCANNER);
- gtk_widget_set_tooltip_text(LoadFileRunScanner,_("When activating this option, after loading the "
- "filenames, the current selected scanner will be ran (the scanner window must be opened)."));
-
- // To initialize 'ButtonLoad' sensivity
- g_signal_emit_by_name(G_OBJECT(gtk_bin_get_child(GTK_BIN(FileToLoadCombo))),"changed");
-
- gtk_widget_show_all(LoadFilenameWindow);
- if (LOAD_FILE_WINDOW_X > 0 && LOAD_FILE_WINDOW_Y > 0)
- gtk_window_move(GTK_WINDOW(LoadFilenameWindow),LOAD_FILE_WINDOW_X,LOAD_FILE_WINDOW_Y);
-}
-
-static void
-Destroy_Load_Filename_Window (void)
-{
- if (LoadFilenameWindow)
- {
- /* Save combobox history lists before exit */
- Save_File_To_Load_List(FileToLoadModel, MISC_COMBO_TEXT);
-
- Load_Filename_Window_Apply_Changes();
-
- gtk_widget_destroy(LoadFilenameWindow);
- LoadFilenameWindow = NULL;
- }
-}
-
-/*
- * For the configuration file...
- */
-void Load_Filename_Window_Apply_Changes (void)
-{
- if (LoadFilenameWindow)
- {
- gint x, y, width, height;
- GdkWindow *window;
-
- window = gtk_widget_get_window (LoadFilenameWindow);
-
- if ( window && gdk_window_is_visible(window) &&
gdk_window_get_state(window)!=GDK_WINDOW_STATE_MAXIMIZED )
- {
- // Position and Origin of the window
- gdk_window_get_root_origin(window,&x,&y);
- LOAD_FILE_WINDOW_X = x;
- LOAD_FILE_WINDOW_Y = y;
- width = gdk_window_get_width(window);
- height = gdk_window_get_height(window);
- LOAD_FILE_WINDOW_WIDTH = width;
- LOAD_FILE_WINDOW_HEIGHT = height;
- }
-
- LOAD_FILE_RUN_SCANNER = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(LoadFileRunScanner));
- }
-}
-
-/*
- * To enable/disable sensivity of the button 'Load'
- */
-static void
-Button_Load_Set_Sensivity (GtkWidget *button, GtkWidget *entry)
-{
- gchar *path;
- GFile *file;
- GFileInfo *info;
- GError *error = NULL;
-
- if (!entry || !button)
- return;
-
- path = filename_from_display(gtk_entry_get_text(GTK_ENTRY(entry)));
-
- if (!path)
- {
- gtk_widget_set_sensitive(GTK_WIDGET(button),FALSE);
- return;
- }
-
- file = g_file_new_for_path (path);
- info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE,
- G_FILE_QUERY_INFO_NONE, NULL, &error);
-
- if (info && G_FILE_TYPE_REGULAR == g_file_info_get_file_type (info))
- gtk_widget_set_sensitive(GTK_WIDGET(button),TRUE);
- else
- {
- gtk_widget_set_sensitive(GTK_WIDGET(button),FALSE);
- if (!info)
- {
- Log_Print (LOG_ERROR, _("Cannot retrieve file info (%s)"),
- error->message);
- g_error_free (error);
- g_object_unref (file);
- g_free (path);
- return;
- }
- }
-
- g_object_unref (info);
- g_object_unref (file);
- g_free(path);
-}
-
-static void
-Load_Filename_List_Key_Press (GtkWidget *treeview, GdkEvent *event)
-{
- if (event && event->type == GDK_KEY_PRESS)
- {
- GdkEventKey *kevent = (GdkEventKey *)event;
-
- switch(kevent->keyval)
- {
- case GDK_KEY_Delete:
- Load_Filename_List_Delete_Line(treeview);
- break;
- case GDK_KEY_I:
- case GDK_KEY_i:
- Load_Filename_List_Insert_Blank_Line(treeview);
- break;
- }
- }
-}
-
-/*
- * Load content of the file into the LoadFileContentList list
- */
-static void
-Load_File_Content (GtkWidget *entry)
-{
- GFile *file;
- GFileInputStream *istream;
- GDataInputStream *data;
- GError *error = NULL;
- gsize size_read;
- gchar *filename;
- const gchar *filename_utf8;
- gchar *line;
- gchar *valid;
-
- g_return_if_fail (entry != NULL);
-
- // The file to read
- filename_utf8 = gtk_entry_get_text(GTK_ENTRY(entry)); // Don't free me!
- Add_String_To_Combo_List(FileToLoadModel, filename_utf8);
- filename = filename_from_display(filename_utf8);
-
- file = g_file_new_for_path (filename);
- istream = g_file_read (file, NULL, &error);
- g_object_unref (file);
-
- if (!istream)
- {
- Log_Print (LOG_ERROR, _("Can't open file '%s' (%s)"), filename_utf8,
- error->message);
- g_error_free (error);
- g_object_unref (file);
- g_free(filename);
- return;
- }
-
- data = g_data_input_stream_new (G_INPUT_STREAM (istream));
- /* TODO: Find a safer alternative to _ANY. */
- g_data_input_stream_set_newline_type (data,
- G_DATA_STREAM_NEWLINE_TYPE_ANY);
- gtk_list_store_clear (LoadFileContentListModel);
-
- while ((line = g_data_input_stream_read_line (data, &size_read, NULL,
- &error)))
- {
- /* FIXME: This should use the GLib filename encoding, not UTF-8. */
- valid = Try_To_Validate_Utf8_String (line);
- g_free (line);
-
- gtk_list_store_insert_with_values (LoadFileContentListModel, NULL,
- G_MAXINT, LOAD_FILE_CONTENT_TEXT,
- valid, -1);
- g_free (valid);
- }
-
- if (error)
- {
- Log_Print (LOG_ERROR, _("Error reading file (%s)"), error->message);
- g_error_free (error);
- }
-
- g_object_unref (data);
- g_object_unref (istream);
- g_free (filename);
-}
-
-/*
- * Load the names of the current list of files
- */
-static void
-Load_File_List (void)
-{
- GList *l;
- ET_File *etfile;
- gchar *filename_utf8;
- gchar *pos;
-
- gtk_list_store_clear(LoadFileNameListModel);
-
- for (l = g_list_first (ETCore->ETFileList); l != NULL; l = g_list_next (l))
- {
- etfile = (ET_File *)l->data;
- filename_utf8 = g_path_get_basename(((File_Name *)etfile->FileNameNew->data)->value_utf8);
- // Remove the extension ('filename' must be allocated to don't affect the initial value)
- if ((pos=strrchr(filename_utf8,'.'))!=NULL)
- *pos = 0;
- gtk_list_store_insert_with_values (LoadFileNameListModel, NULL,
- G_MAXINT, LOAD_FILE_NAME_TEXT,
- filename_utf8,
- LOAD_FILE_NAME_POINTER, l->data,
- -1);
- g_free(filename_utf8);
- }
-}
-/*
- * To select the corresponding row in the other list
- */
-static void
-Load_Filename_Select_Row_In_Other_List (GtkWidget* treeview_target, gpointer origselection)
-{
- GtkAdjustment *ct_adj, *ce_adj;
- GtkTreeSelection *selection_orig;
- GtkTreeSelection *selection_target;
- GtkTreeView *treeview_orig;
- GtkTreeModel *treemodel_orig;
- GtkTreeModel *treemodel_target;
- GtkTreeIter iter_orig;
- GtkTreeIter iter_target;
- GtkTreePath *path_orig;
- gint *indices_orig;
- gchar *stringiter;
-
- if (!treeview_target || !origselection)
- return;
-
- selection_orig = GTK_TREE_SELECTION(origselection);
- selection_target = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview_target));
- treemodel_target = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview_target));
-
- if (!gtk_tree_selection_get_selected(selection_orig, &treemodel_orig, &iter_orig))
- return; /* Might be called with no selection */
-
- treeview_orig = gtk_tree_selection_get_tree_view(selection_orig);
- path_orig = gtk_tree_model_get_path(treemodel_orig, &iter_orig);
- gtk_tree_selection_unselect_all(selection_target);
-
- /* Synchronize the two lists. */
- ce_adj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (treeview_orig));
- ct_adj = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(treeview_target));
-
- if (gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj)) >=
gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj))
- && gtk_adjustment_get_upper(GTK_ADJUSTMENT(ce_adj)) >=
gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ce_adj)))
- {
- // Rules are displayed in the both clist
- if (gtk_adjustment_get_value(GTK_ADJUSTMENT(ce_adj)) <=
gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj)) - gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj)))
- {
-
gtk_adjustment_set_value(GTK_ADJUSTMENT(ct_adj),gtk_adjustment_get_value(GTK_ADJUSTMENT(ce_adj)));
- } else
- {
- gtk_adjustment_set_value(GTK_ADJUSTMENT(ct_adj),gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj))
- gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj)));
- indices_orig = gtk_tree_path_get_indices(path_orig);
-
- if (indices_orig[0] <= (gtk_tree_model_iter_n_children(treemodel_target, NULL) - 1))
-
gtk_adjustment_set_value(GTK_ADJUSTMENT(ce_adj),gtk_adjustment_get_value(GTK_ADJUSTMENT(ct_adj)));
-
- }
- }else if (gtk_adjustment_get_upper(GTK_ADJUSTMENT(ct_adj)) <
gtk_adjustment_get_page_size(GTK_ADJUSTMENT(ct_adj))) // Target Clist rule not visible
- {
- indices_orig = gtk_tree_path_get_indices(path_orig);
-
- if (indices_orig[0] <= (gtk_tree_model_iter_n_children(treemodel_target, NULL) - 1))
-
gtk_adjustment_set_value(GTK_ADJUSTMENT(ce_adj),gtk_adjustment_get_value(GTK_ADJUSTMENT(ct_adj)));
- }
-
- // Must block the select signal of the target to avoid looping
- g_signal_handlers_block_by_func(G_OBJECT(selection_target),
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(treeview_orig));
-
- stringiter = gtk_tree_model_get_string_from_iter(treemodel_orig, &iter_orig);
- if (gtk_tree_model_get_iter_from_string(treemodel_target, &iter_target, stringiter))
- {
- gtk_tree_selection_select_iter(selection_target, &iter_target);
- }
-
- g_free(stringiter);
- g_signal_handlers_unblock_by_func(G_OBJECT(selection_target),
G_CALLBACK(Load_Filename_Select_Row_In_Other_List), G_OBJECT(treeview_orig));
-}
-
-/*
- * Set the new filename of each file.
- * Associate lines from LoadFileContentList with LoadFileNameList
- */
-static void
-Load_Filename_Set_Filenames (void)
-{
- gint row;
- ET_File *ETFile = NULL;
- File_Name *FileName;
- gchar *list_text = NULL;
- gint rowcount;
- gboolean found;
-
- GtkTreePath *currentPath = NULL;
- GtkTreeIter iter_name;
- GtkTreeIter iter_content;
-
- if ( !ETCore->ETFileList || !LoadFileContentList || !LoadFileNameList)
- return;
-
- /* Save current file */
- ET_Save_File_Data_From_UI(ETCore->ETFileDisplayed);
-
- rowcount = MIN(gtk_tree_model_iter_n_children(GTK_TREE_MODEL(LoadFileNameListModel), NULL),
- gtk_tree_model_iter_n_children(GTK_TREE_MODEL(LoadFileContentListModel), NULL));
-
- for (row=0; row < rowcount; row++)
- {
- if (row == 0)
- currentPath = gtk_tree_path_new_first();
- else
- gtk_tree_path_next(currentPath);
-
- found = gtk_tree_model_get_iter(GTK_TREE_MODEL(LoadFileNameListModel), &iter_name, currentPath);
- if (found)
- gtk_tree_model_get(GTK_TREE_MODEL(LoadFileNameListModel), &iter_name,
- LOAD_FILE_NAME_POINTER, &ETFile, -1);
-
- found = gtk_tree_model_get_iter(GTK_TREE_MODEL(LoadFileContentListModel), &iter_content,
currentPath);
- if (found)
- gtk_tree_model_get(GTK_TREE_MODEL(LoadFileContentListModel), &iter_content,
- LOAD_FILE_CONTENT_TEXT, &list_text, -1);
-
- if (ETFile && list_text && (g_utf8_strlen (list_text, -1) > 0))
- {
- gchar *list_text_tmp;
- gchar *filename_new_utf8;
-
- list_text_tmp = g_strdup(list_text);
- ET_File_Name_Convert_Character(list_text_tmp); // Replace invalid characters
-
- /* Build the filename with the path */
- filename_new_utf8 = ET_File_Name_Generate(ETFile,list_text_tmp);
- g_free(list_text_tmp);
-
- /* Set the new filename */
- // Create a new 'File_Name' item
- FileName = ET_File_Name_Item_New();
- // Save changes of the 'File_Name' item
- ET_Set_Filename_File_Name_Item(FileName,filename_new_utf8,NULL);
- ET_Manage_Changes_Of_File_Data(ETFile,FileName,NULL);
-
- g_free(filename_new_utf8);
-
- // Then run current scanner if asked...
- if (ScannerWindow && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(LoadFileRunScanner)) )
- Scan_Select_Mode_And_Run_Scanner(ETFile);
- }
- g_free(list_text);
- }
-
- gtk_tree_path_free(currentPath);
-
- Browser_List_Refresh_Whole_List();
- ET_Display_File_Data_To_UI(ETCore->ETFileDisplayed);
-}
-
-/*
- * Create and attach a popup menu on the two clist of the LoadFileWindow
- */
-static gboolean
-Load_Filename_Popup_Menu_Handler (GtkWidget *treeview, GdkEventButton *event,
- GtkMenu *menu)
-{
- if (event && (event->type==GDK_BUTTON_PRESS) && (event->button==3))
- {
- gtk_menu_popup(menu,NULL,NULL,NULL,NULL,event->button,event->time);
- return TRUE;
- }
- return FALSE;
-}
-
-static GtkWidget *
-Create_Load_Filename_Popup_Menu (GtkWidget *list)
-{
- GtkWidget *BrowserPopupMenu;
- GtkWidget *Image;
- GtkWidget *MenuItem;
-
-
- BrowserPopupMenu = gtk_menu_new();
- gtk_menu_attach_to_widget (GTK_MENU (BrowserPopupMenu), list, NULL);
- g_signal_connect (G_OBJECT (list), "button-press-event",
- G_CALLBACK (Load_Filename_Popup_Menu_Handler),
- BrowserPopupMenu);
-
- MenuItem = gtk_image_menu_item_new_with_label(_("Insert a blank line"));
- Image = gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu), MenuItem);
- g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Insert_Blank_Line), G_OBJECT(list));
-
- MenuItem = gtk_image_menu_item_new_with_label(_("Delete this line"));
- Image = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
- g_signal_connect_swapped(G_OBJECT(MenuItem),"activate", G_CALLBACK(Load_Filename_List_Delete_Line),
G_OBJECT(list));
-
- MenuItem = gtk_image_menu_item_new_with_label(_("Delete all blank lines"));
- Image = gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
- g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Delete_All_Blank_Lines),G_OBJECT(list));
-
- MenuItem = gtk_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
-
- MenuItem = gtk_image_menu_item_new_with_label(_("Move up this line"));
- Image = gtk_image_new_from_stock(GTK_STOCK_GO_UP,GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
- g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Move_Up),G_OBJECT(list));
-
- MenuItem = gtk_image_menu_item_new_with_label(_("Move down this line"));
- Image = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN,GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
- g_signal_connect_swapped(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Load_Filename_List_Move_Down),G_OBJECT(list));
-
- MenuItem = gtk_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
-
- MenuItem = gtk_image_menu_item_new_with_label(_("Reload"));
- Image = gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU);
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(MenuItem),Image);
- gtk_menu_shell_append(GTK_MENU_SHELL(BrowserPopupMenu),MenuItem);
- g_signal_connect_swapped(G_OBJECT(MenuItem),"activate", G_CALLBACK(Load_Filename_List_Reload),
G_OBJECT(list));
-
- gtk_widget_show_all(BrowserPopupMenu);
- return BrowserPopupMenu;
-}
-
-/*
- * Insert a blank line before the selected line in the treeview passed as parameter
- */
-static void
-Load_Filename_List_Insert_Blank_Line (GtkWidget *treeview)
-{
- GtkTreeSelection *selection;
- GtkTreeIter selectedIter;
- GtkTreeIter *temp;
- GtkTreeModel *model;
-
- g_return_if_fail (treeview != NULL);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
-
- if (gtk_tree_selection_get_selected(selection, &model, &selectedIter) != TRUE)
- return;
-
- temp = &selectedIter; /* Not used here, but it must be non-NULL to keep GTK+ happy! */
- gtk_list_store_insert_before(GTK_LIST_STORE(model), temp, &selectedIter);
-}
-
-/*
- * Delete all blank lines in the treeview passed as parameter
- */
-static void
-Load_Filename_List_Delete_All_Blank_Lines (GtkWidget *treeview)
-{
- gchar *text = NULL;
- GtkTreeIter iter;
- GtkTreeModel *model;
-
- model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
-
- if (!gtk_tree_model_get_iter_first(model, &iter))
- return;
-
- while (TRUE)
- {
- gtk_tree_model_get(model, &iter, LOAD_FILE_NAME_TEXT, &text, -1);
-
- /* Check for blank entry */
- if (!text || g_utf8_strlen(text, -1) == 0)
- {
- g_free(text);
-
- if (!gtk_list_store_remove(GTK_LIST_STORE(model), &iter))
- break;
- else
- continue;
- }
- g_free(text);
-
- if (!gtk_tree_model_iter_next(model, &iter))
- break;
- }
-}
-
-/*
- * Delete the selected line in the treeview passed as parameter
- */
-static void
-Load_Filename_List_Delete_Line (GtkWidget *treeview)
-{
- GtkTreeSelection *selection;
- GtkTreeIter selectedIter, itercopy;
- GtkTreeModel *model;
- gboolean rowafter;
-
- g_return_if_fail (treeview != NULL);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
-
- if (gtk_tree_selection_get_selected(selection, &model, &selectedIter) != TRUE)
- {
- return;
- }
-
- // If there is a line following the one about to be removed, select it for convenience
- itercopy = selectedIter;
- rowafter = gtk_tree_model_iter_next(model, &itercopy);
-
- // Remove the line to be deleted
- gtk_list_store_remove(GTK_LIST_STORE(model), &selectedIter);
-
- if (rowafter)
- gtk_tree_selection_select_iter(selection, &itercopy);
-}
-
-/*
- * Move up the selected line in the treeview passed as parameter
- */
-static void
-Load_Filename_List_Move_Up (GtkWidget *treeview)
-{
- GtkTreeSelection *selection;
- GList *selectedRows;
- GList *l;
- GtkTreeIter currentFile;
- GtkTreeIter nextFile;
- GtkTreePath *currentPath;
- GtkTreeModel *treemodel;
-
- g_return_if_fail (treeview != NULL);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
- treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
- selectedRows = gtk_tree_selection_get_selected_rows(selection, NULL);
-
- if (!selectedRows)
- {
- return;
- }
-
- for (l = selectedRows; l != NULL; l = g_list_next (l))
- {
- currentPath = (GtkTreePath *)l->data;
-
- if (gtk_tree_model_get_iter (treemodel, ¤tFile, currentPath))
- {
- // Find the entry above the node...
- if (gtk_tree_path_prev(currentPath))
- {
- // ...and if it exists, swap the two rows by iter
- gtk_tree_model_get_iter(treemodel, &nextFile, currentPath);
- gtk_list_store_swap(GTK_LIST_STORE(treemodel), ¤tFile, &nextFile);
- }
- }
- }
-
- g_list_free_full (selectedRows, (GDestroyNotify)gtk_tree_path_free);
-}
-
-/*
- * Move down the selected line in the treeview passed as parameter
- */
-static void
-Load_Filename_List_Move_Down (GtkWidget *treeview)
-{
- GtkTreeSelection *selection;
- GList *selectedRows;
- GList *l;
- GtkTreeIter currentFile;
- GtkTreeIter nextFile;
- GtkTreePath *currentPath;
- GtkTreeModel *treemodel;
-
- g_return_if_fail (treeview != NULL);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
- treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
- selectedRows = gtk_tree_selection_get_selected_rows(selection, NULL);
-
- if (!selectedRows)
- {
- return;
- }
-
- for (l = selectedRows; l != NULL; l = g_list_next (l))
- {
- currentPath = (GtkTreePath *)l->data;
-
- if (gtk_tree_model_get_iter (treemodel, ¤tFile, currentPath))
- {
- // Find the entry below the node and swap the two nodes by iter
- gtk_tree_path_next(currentPath);
- if (gtk_tree_model_get_iter(treemodel, &nextFile, currentPath))
- gtk_list_store_swap(GTK_LIST_STORE(treemodel), ¤tFile, &nextFile);
- }
- }
-
- g_list_free_full (selectedRows, (GDestroyNotify)gtk_tree_path_free);
-}
-
-/*
- * Reload a list of choice
- * The list parameter refers to a GtkTreeView (LoadFileNameList or LoadFileContentList)
- */
-static void
-Load_Filename_List_Reload (GtkWidget *treeview)
-{
- g_return_if_fail (treeview != NULL);
-
- if (GTK_TREE_VIEW(treeview) == GTK_TREE_VIEW(LoadFileContentList))
- {
- Load_File_Content(gtk_bin_get_child(GTK_BIN(FileToLoadCombo)));
-
- } else if (GTK_TREE_VIEW(treeview) == GTK_TREE_VIEW(LoadFileNameList))
- {
- Load_File_List();
- }
-}
-
-/*
- * Update the text of the selected line into the list, with the text entered into the entry
- */
-static void
-Load_Filename_Update_Text_Line(GtkWidget *entry, GtkWidget *list)
-{
- GtkTreeIter SelectedRow;
- GtkTreeSelection *selection;
- GtkTreeModel *model;
- gboolean hasSelectedRows;
-
- g_return_if_fail (entry != NULL || list != NULL);
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
- hasSelectedRows = gtk_tree_selection_get_selected(selection, &model, &SelectedRow);
- if (hasSelectedRows)
- {
- const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
- gtk_list_store_set(GTK_LIST_STORE(model), &SelectedRow, LOAD_FILE_CONTENT_TEXT, text, -1);
- }
-}
-
-/*
- * Set the text of the selected line of the list into the entry
- */
-static void
-Load_Filename_Edit_Text_Line(GtkTreeSelection *selection, gpointer data)
-{
- gchar *text;
- GtkTreeIter selectedIter;
- GtkEntry *entry = GTK_ENTRY(data);
- gulong handler;
-
- if (gtk_tree_selection_get_selected(selection, NULL, &selectedIter) != TRUE)
- return;
-
- gtk_tree_model_get(GTK_TREE_MODEL(LoadFileContentListModel), &selectedIter, LOAD_FILE_NAME_TEXT, &text,
-1);
-
- handler = g_signal_handler_find(entry, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, Load_Filename_Update_Text_Line,
NULL);
- g_signal_handler_block(entry, handler);
- if (text)
- {
- gtk_entry_set_text(entry, text);
- g_free(text);
- } else
- gtk_entry_set_text(entry, "");
-
- g_signal_handler_unblock(entry, handler);
-}
-
-/*
- * et_load_text_file_on_response:
- * @dialog: the dialog which emitted the response signal
- * @response_id: the response ID
- * @user_data: user data set when the signal was connected
- *
- * Signal handler for the load filenames from text file dialog.
- */
-static void
-et_load_text_file_on_response (GtkDialog *dialog, gint response_id,
- gpointer user_data)
-{
- switch (response_id)
- {
- case GTK_RESPONSE_APPLY:
- Load_Filename_Set_Filenames ();
- break;
- case GTK_RESPONSE_CANCEL:
- case GTK_RESPONSE_DELETE_EVENT:
- Destroy_Load_Filename_Window ();
- break;
- default:
- g_assert_not_reached ();
- }
-}
-
gchar *
et_disc_number_to_string (const guint disc_number)
{
diff --git a/src/misc.h b/src/misc.h
index fe0c414..c62674a 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -83,10 +83,6 @@ void File_Selection_Window_For_Directory (GtkWidget *entry);
void Open_Search_File_Window (void);
void Search_File_Window_Apply_Changes (void);
-// Load filenames window
-void Open_Load_Filename_Window (void);
-void Load_Filename_Window_Apply_Changes (void);
-
gchar * et_disc_number_to_string (const guint disc_number);
gchar * et_track_number_to_string (const guint track_number);
diff --git a/src/setting.c b/src/setting.c
index 9bcbf80..fd670fd 100644
--- a/src/setting.c
+++ b/src/setting.c
@@ -34,6 +34,7 @@
#include "setting.h"
#include "application_window.h"
+#include "load_files_dialog.h"
#include "playlist_dialog.h"
#include "prefs.h"
#include "bar.h"
@@ -243,10 +244,6 @@ static const tConfigVariable Config_Variables[] =
{"playlist_content_mask_value", CV_TYPE_STRING, &PLAYLIST_CONTENT_MASK_VALUE },
{"load_file_run_scanner", CV_TYPE_BOOL, &LOAD_FILE_RUN_SCANNER },
- {"load_file_window_x", CV_TYPE_INT, &LOAD_FILE_WINDOW_X },
- {"load_file_window_y", CV_TYPE_INT, &LOAD_FILE_WINDOW_Y },
- {"load_file_window_width", CV_TYPE_INT, &LOAD_FILE_WINDOW_WIDTH },
- {"load_file_window_height", CV_TYPE_INT, &LOAD_FILE_WINDOW_HEIGHT },
{"cddb_server_name_automatic_search", CV_TYPE_STRING, &CDDB_SERVER_NAME_AUTOMATIC_SEARCH },
{"cddb_server_port_automatic_search", CV_TYPE_INT, &CDDB_SERVER_PORT_AUTOMATIC_SEARCH },
@@ -513,10 +510,6 @@ void Init_Config_Variables (void)
* Load File window
*/
LOAD_FILE_RUN_SCANNER = 0;
- LOAD_FILE_WINDOW_X = -1;
- LOAD_FILE_WINDOW_Y = -1;
- LOAD_FILE_WINDOW_WIDTH = -1;
- LOAD_FILE_WINDOW_HEIGHT = -1;
/*
* CDDB window
@@ -868,8 +861,9 @@ Apply_Changes_Of_UI (void)
// Configuration of the search_file window (see misc.c) - Function also called when destroying the window
Search_File_Window_Apply_Changes();
- // Configuration of the load_filename window (see misc.c) - Function also called when destroying the
window
- Load_Filename_Window_Apply_Changes();
+ /* Configuration of the load_filename window (see load_files_dialog.c).
+ * Function also called when destroying the window. */
+ et_load_files_dialog_apply_changes (ET_LOAD_FILES_DIALOG (et_application_window_get_load_files_dialog
(ET_APPLICATION_WINDOW (MainWindow))));
}
diff --git a/src/setting.h b/src/setting.h
index 2a6500f..78ec633 100644
--- a/src/setting.h
+++ b/src/setting.h
@@ -195,11 +195,6 @@ gchar *PLAYLIST_CONTENT_MASK_VALUE;
/* "Load filenames from txt" window */
gint LOAD_FILE_RUN_SCANNER;
-gint LOAD_FILE_WINDOW_X;
-gint LOAD_FILE_WINDOW_Y;
-gint LOAD_FILE_WINDOW_WIDTH;
-gint LOAD_FILE_WINDOW_HEIGHT;
-
/* CDDB in preferences window */
gchar *CDDB_SERVER_NAME_AUTOMATIC_SEARCH;
gint CDDB_SERVER_PORT_AUTOMATIC_SEARCH;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]