From 21efd2da3d95d5b25990e96ae250784b530fa5b6 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 11 Feb 2019 13:29:40 -0200 Subject: [PATCH] Working on new FT dialog. --- src/include/internals.h | 2 ++ src/v3270ft/activitylist.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ src/v3270ft/dialog.c | 42 ++++++++++++++++++------------------------ src/v3270ft/select.c | 8 ++++++-- 4 files changed, 160 insertions(+), 32 deletions(-) diff --git a/src/include/internals.h b/src/include/internals.h index 8439586..6b23119 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -83,6 +83,8 @@ G_GNUC_INTERNAL GtkWidget * v3270_activity_list_new(); G_GNUC_INTERNAL void v3270_activity_list_append(GtkWidget *widget, GObject *activity); G_GNUC_INTERNAL void v3270_activity_list_load(GtkWidget *widget); + G_GNUC_INTERNAL void v3270_activity_list_save(GtkWidget *widget); + G_GNUC_INTERNAL void v3270_activity_list_save_as(GtkWidget *widget); G_END_DECLS diff --git a/src/v3270ft/activitylist.c b/src/v3270ft/activitylist.c index 979465f..ca3fd36 100644 --- a/src/v3270ft/activitylist.c +++ b/src/v3270ft/activitylist.c @@ -55,7 +55,6 @@ { GtkTreeView parent; gchar * filename; - }; G_DEFINE_TYPE(V3270FTActivityList, V3270FTActivityList, GTK_TYPE_TREE_VIEW); @@ -64,13 +63,41 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ + static const struct _option_list + { + LIB3270_FT_OPTION option; + const gchar * name; + const gchar * value; + } + option_list[] = + { + + { LIB3270_FT_OPTION_SEND, "type", "send", }, + { LIB3270_FT_OPTION_RECEIVE, "type", "receive", }, + { LIB3270_FT_OPTION_ASCII, "format", "ascii", }, + { LIB3270_FT_OPTION_CRLF, "format", "crlf", }, + { LIB3270_FT_OPTION_APPEND, "format", "append", }, + { LIB3270_FT_OPTION_REMAP, "format", "remap", }, + { LIB3270_FT_OPTION_UNIX, "file-format", "unix", }, + { LIB3270_FT_RECORD_FORMAT_DEFAULT, "record-format", "default", }, + { LIB3270_FT_RECORD_FORMAT_FIXED, "record-format", "fixed", }, + { LIB3270_FT_RECORD_FORMAT_VARIABLE, "record-format", "variable", }, + { LIB3270_FT_RECORD_FORMAT_UNDEFINED, "record-format", "undefined", }, + { LIB3270_FT_ALLOCATION_UNITS_DEFAULT, "units", "default", }, + { LIB3270_FT_ALLOCATION_UNITS_TRACKS, "units", "tracks", }, + { LIB3270_FT_ALLOCATION_UNITS_CYLINDERS, "units", "cylinders", }, + { LIB3270_FT_ALLOCATION_UNITS_AVBLOCK, "units", "avblock", }, + }; + static void dispose(GObject *object) { debug("%s",__FUNCTION__); V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(object); + debug("Freeing %s",list->filename); g_free(list->filename); + list->filename = NULL; } @@ -148,11 +175,6 @@ return g_object_new(GTK_TYPE_V3270_FT_ACTIVITY_LIST, NULL); } - void v3270_activity_list_load(GtkWidget *widget) - { - - } - void v3270_activity_list_append(GtkWidget *widget, GObject *activity) { GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); @@ -161,3 +183,109 @@ gtk_list_store_set((GtkListStore *) model, &iter, 0, activity, -1); } + void v3270_activity_list_load(GtkWidget *widget) + { + V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget); + + gchar * filename = v3270ft_select_file( + widget, + _("Load queue from file"), + _("Load"), GTK_FILE_CHOOSER_ACTION_OPEN, + "", + N_("XML file"), "*.xml", + NULL ); + + if(filename) { + g_free(list->filename); + list->filename = filename; + } + + } + + void v3270_activity_list_save(GtkWidget *widget) + { + V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget); + GString * str = g_string_new("\n\n"); + GError * error = NULL; + size_t ix; + + // Serialize activities. + GtkTreeIter iter; + GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); + + if(gtk_tree_model_get_iter_first(model,&iter)) + { + do + { + GObject * activity = NULL; + gtk_tree_model_get(model, &iter, 0, &activity, -1); + + if(activity) + { + g_string_append(str,"\t\n"); + + g_string_append_printf(str,"\t\t\n",v3270_ft_activity_get_local_filename(activity)); + g_string_append_printf(str,"\t\t\n",v3270_ft_activity_get_remote_filename(activity)); + + LIB3270_FT_OPTION options = v3270_ft_activity_get_options(activity); + for(ix = 0; ix < G_N_ELEMENTS(option_list);ix++) + { + if(options & option_list[ix].option) + g_string_append_printf(str,"\t\t\n"); + } + + } + while(gtk_tree_model_iter_next(model,&iter)); + } + + g_string_append(str,"\n"); + + + // Save activity list + g_autofree gchar * text = g_string_free(str,FALSE); + + if(!g_file_set_contents(list->filename,text,-1,&error)) { + + GtkWidget *popup = gtk_message_dialog_new_with_markup( + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, + _("Can't save %s"),list->filename + ); + + gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); + + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); + g_error_free(error); + + gtk_dialog_run(GTK_DIALOG(popup)); + gtk_widget_destroy(popup); + + } + + + } + + void v3270_activity_list_save_as(GtkWidget *widget) + { + V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget); + + gchar * filename = v3270ft_select_file( + widget, + _("Save queue to file"), + _("Save"), + GTK_FILE_CHOOSER_ACTION_SAVE, + "", + N_("XML file"), "*.xml", + NULL ); + + if(filename) { + g_free(list->filename); + list->filename = filename; + v3270_activity_list_save(widget); + } + } + diff --git a/src/v3270ft/dialog.c b/src/v3270ft/dialog.c index 72b65ae..547f6ad 100644 --- a/src/v3270ft/dialog.c +++ b/src/v3270ft/dialog.c @@ -68,30 +68,6 @@ static void V3270FTDialog_class_init(G_GNUC_UNUSED V3270FTDialogClass *klass) { } -/* -static void apply_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) -{ - gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY); -} - -static void cancel_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) -{ - gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_CANCEL); -} -*/ - -/* -static GtkWidget * create_button(V3270FTDialog *widget, FT_BUTTON id, const gchar *icon, const gchar *tooltip, GCallback callback) -{ - widget->buttons[id] = gtk_button_new_from_icon_name(icon,GTK_ICON_SIZE_BUTTON); - gtk_widget_set_tooltip_markup(widget->buttons[id],tooltip); - - // g_signal_connect(widget->buttons[id],"clicked",callback,widget); - - return widget->buttons[id]; -} -*/ - void activity_selected(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn G_GNUC_UNUSED(*column), V3270FTDialog *widget) { GtkTreeIter iter; @@ -127,6 +103,21 @@ static void update_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widg gtk_tree_view_columns_autosize(GTK_TREE_VIEW(widget->queue.view)); } +static void load_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget) +{ + v3270_activity_list_load(widget->queue.view); +} + +static void save_queue_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget) +{ + v3270_activity_list_save(widget->queue.view); +} + +static void save_queue_as_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget) +{ + v3270_activity_list_save_as(widget->queue.view); +} + static void insert_clicked(GtkWidget *button, V3270FTDialog *widget) { GtkTreeIter iter; @@ -254,13 +245,16 @@ static void V3270FTDialog_init(V3270FTDialog *widget) // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html widget->queue.load = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_markup(widget->queue.load,_("Get transfer queue from file")); + g_signal_connect(widget->queue.load,"clicked",G_CALLBACK(load_queue_clicked),widget); widget->queue.save = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue")); + g_signal_connect(widget->queue.load,"clicked",G_CALLBACK(save_queue_clicked),widget); gtk_widget_set_sensitive(widget->queue.save,FALSE); widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file")); + g_signal_connect(widget->queue.saveAs,"clicked",G_CALLBACK(save_queue_as_clicked),widget); if(header) { diff --git a/src/v3270ft/select.c b/src/v3270ft/select.c index f2210d4..2b43daf 100644 --- a/src/v3270ft/select.c +++ b/src/v3270ft/select.c @@ -77,12 +77,14 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * gchar *rc = NULL; + debug("%s",__FUNCTION__); + #if GTK_CHECK_VERSION(3,20,0) GtkFileChooserNative *native = gtk_file_chooser_native_new ( title, - GTK_WINDOW(dialog), + GTK_WINDOW(gtk_widget_get_toplevel(dialog)), action, button, _( "_Cancel" ) @@ -173,7 +175,7 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * GtkWidget * chooser = gtk_file_chooser_dialog_new ( title, - GTK_WINDOW(dialog), + GTK_WINDOW(gtk_widget_get_toplevel(dialog)), action, _("_Cancel" ), GTK_RESPONSE_CANCEL, button, GTK_RESPONSE_ACCEPT, @@ -192,6 +194,8 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * #endif // WIN32 + debug("%s=%p",__FUNCTION__,rc); + return rc; } -- libgit2 0.21.2