diff --git a/src/filetransfer/private.h b/src/filetransfer/private.h index 776b105..4924fb5 100644 --- a/src/filetransfer/private.h +++ b/src/filetransfer/private.h @@ -104,10 +104,30 @@ const gchar * value; }; - G_GNUC_INTERNAL extern const struct v3270ft_option ft_option[]; - G_GNUC_INTERNAL extern const struct v3270ft_type ft_type[]; - G_GNUC_INTERNAL extern const struct v3270ft_value ft_value[]; - G_GNUC_INTERNAL extern const struct v3270_activity_list_option v3270_activity_list_options[]; + struct v3270_ft_worker_field + { + const gchar *label; + const gchar *tooltip; + }; + + typedef enum progress_field { + + PROGRESS_FIELD_LOCAL, + PROGRESS_FIELD_REMOTE, + PROGRESS_FIELD_TOTAL, + PROGRESS_FIELD_CURRENT, + PROGRESS_FIELD_SPEED, + PROGRESS_FIELD_ETA, + + PROGRESS_FIELD_COUNT + + } PROGRESS_FIELD; + + G_GNUC_INTERNAL extern const struct v3270ft_option ft_option[]; + G_GNUC_INTERNAL extern const struct v3270ft_type ft_type[]; + G_GNUC_INTERNAL extern const struct v3270ft_value ft_value[]; + G_GNUC_INTERNAL extern const struct v3270_activity_list_option v3270_activity_list_options[]; + G_GNUC_INTERNAL extern const struct v3270_ft_worker_field v3270_ft_worker_fields[PROGRESS_FIELD_COUNT]; #define ENTRY_FILENAME_LENGTH FILENAME_MAX struct v3270ft_entry { @@ -136,19 +156,6 @@ }; - typedef enum progress_field { - - PROGRESS_FIELD_LOCAL, - PROGRESS_FIELD_REMOTE, - PROGRESS_FIELD_TOTAL, - PROGRESS_FIELD_CURRENT, - PROGRESS_FIELD_SPEED, - PROGRESS_FIELD_ETA, - - PROGRESS_FIELD_COUNT - - } PROGRESS_FIELD; - enum V3270FTPROGRESS_SIGNAL { V3270FTPROGRESS_SIGNAL_SUCCESS, diff --git a/src/filetransfer/settings.c b/src/filetransfer/settings.c index acd203b..0cb9254 100644 --- a/src/filetransfer/settings.c +++ b/src/filetransfer/settings.c @@ -64,7 +64,6 @@ GtkEntry * remote; } file; - struct { LIB3270_FT_OPTION options; diff --git a/src/filetransfer/tables.c b/src/filetransfer/tables.c index fa7ca26..c502d79 100644 --- a/src/filetransfer/tables.c +++ b/src/filetransfer/tables.c @@ -214,3 +214,12 @@ const struct v3270_activity_list_option v3270_activity_list_options[] = { 0, NULL, NULL } }; +const struct v3270_ft_worker_field v3270_ft_worker_fields[PROGRESS_FIELD_COUNT] = +{ + { N_("Local:"), N_("Path and name of the local file") }, + { N_("Remote:"), N_("The name of the file in the host") }, + { N_("Total:"), N_("Total bytes to transfer") }, + { N_("Current:"), N_("Current transfer position") }, + { N_("Speed:"), N_("Transfer speed") }, + { N_("ETA:"), N_("Estimated transfer arrival") } +}; diff --git a/src/filetransfer/v3270ftprogress.c b/src/filetransfer/v3270ftprogress.c index 0ae9d79..f507b8e 100644 --- a/src/filetransfer/v3270ftprogress.c +++ b/src/filetransfer/v3270ftprogress.c @@ -48,45 +48,6 @@ guint v3270ftprogress_signal[V3270FTPROGRESS_SIGNAL_COUNT] = { 0 }; -static const struct _field { - - const gchar *label; - const gchar *tooltip; - -} field[PROGRESS_FIELD_COUNT] = { - - { - N_("Local:"), - N_("Path and name of the local file") - }, - - { - N_("Remote:"), - N_("The name of the file in the host") - }, - - { - N_("Total:"), - N_("Total bytes to transfer") - }, - - { - N_("Current:"), - N_("Current transfer position") - }, - - { - N_("Speed:"), - N_("Transfer speed") - }, - - { - N_("ETA:"), - N_("Estimated transfer arrival") - }, - -}; - // http://www3.rocketsoftware.com/bluezone/help/v42/en/bz/DISPLAY/IND$FILE/IND$FILE_Technical_Reference.htm static const struct _ftmsg { @@ -390,10 +351,10 @@ static GtkWidget * create_text(guint width) { static GtkWidget * create_label(int id, GtkWidget *entry) { - GtkWidget * widget = gtk_label_new(gettext(field[id].label)); + GtkWidget * widget = gtk_label_new(gettext(v3270_ft_worker_fields[id].label)); - gtk_widget_set_tooltip_markup(widget,field[id].tooltip); - gtk_widget_set_tooltip_markup(entry,field[id].tooltip); + gtk_widget_set_tooltip_markup(widget,v3270_ft_worker_fields[id].tooltip); + gtk_widget_set_tooltip_markup(entry,v3270_ft_worker_fields[id].tooltip); gtk_widget_set_halign(widget,GTK_ALIGN_START); gtk_widget_set_valign(widget,GTK_ALIGN_CENTER); diff --git a/src/filetransfer/worker.c b/src/filetransfer/worker.c new file mode 100644 index 0000000..fe68f7f --- /dev/null +++ b/src/filetransfer/worker.c @@ -0,0 +1,170 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include + #include + #include "private.h" + #include "marshal.h" + #include + +/*--[ Widget definition ]----------------------------------------------------------------------------*/ + + struct _V3270FTWorkerClass + { + GtkGridClass parent_class; + + }; + + struct _V3270FTWorker + { + GtkGrid parent; + + GtkProgressBar * pbar; ///< @brief Progress bar. + + GtkEntry * field[PROGRESS_FIELD_COUNT]; ///< @brief Transfer information widgets. + + + }; + + G_DEFINE_TYPE(V3270FTWorker, V3270FTWorker, GTK_TYPE_GRID); + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + static void finalize(GObject *object) + { + debug("%s",__FUNCTION__); + + // V3270FTWorker * worker = GTK_V3270_FT_WORKER(object); + + + G_OBJECT_CLASS(V3270FTWorker_parent_class)->finalize(object); + + } + + static void V3270FTWorker_class_init(G_GNUC_UNUSED V3270FTWorkerClass *klass) + { + G_OBJECT_CLASS(klass)->finalize = finalize; + } + + static GtkWidget * create_label(V3270FTWorker *widget, const gchar *text, gint left, gint top) + { + GtkWidget * label = gtk_label_new(text); + gtk_widget_set_halign(GTK_WIDGET(label),GTK_ALIGN_END); + gtk_grid_attach(GTK_GRID(widget),label,left,top,1,1); + return label; + } + + static GtkWidget * create_entry(V3270FTWorker *widget, const gchar *text, GtkWidget *entry, gint left, gint top, gint width) + { + GtkWidget * label = create_label(widget,text,left,top); + gtk_grid_attach(GTK_GRID(widget),entry,left+1,top,width,1); + gtk_label_set_mnemonic_widget(GTK_LABEL(label),entry); + gtk_widget_set_hexpand(entry,TRUE); + return entry; + } + + static void create_field(V3270FTWorker *widget, PROGRESS_FIELD id, GtkWidget *grid, gint top) + { + GtkWidget * label = gtk_label_new(gettext(v3270_ft_worker_fields[id].label)); + gtk_widget_set_halign(GTK_WIDGET(label),GTK_ALIGN_END); + gtk_grid_attach(GTK_GRID(grid),label,0,top,1,1); + + widget->field[id] = GTK_ENTRY(gtk_entry_new()); + + gtk_grid_attach(GTK_GRID(grid),GTK_WIDGET(widget->field[id]),1,top,1,1); + + } + + static void V3270FTWorker_init(V3270FTWorker *widget) + { + // https://developer.gnome.org/hig/stable/visual-layout.html.en + gtk_grid_set_row_spacing(GTK_GRID(widget),6); + gtk_grid_set_column_spacing(GTK_GRID(widget),12); + + widget->field[PROGRESS_FIELD_LOCAL] = GTK_ENTRY(create_entry(widget,gettext(v3270_ft_worker_fields[PROGRESS_FIELD_LOCAL].label),gtk_entry_new(),0,0,9)); + widget->field[PROGRESS_FIELD_REMOTE] = GTK_ENTRY(create_entry(widget,gettext(v3270_ft_worker_fields[PROGRESS_FIELD_REMOTE].label),gtk_entry_new(),0,1,9)); + + // Create status elements + GtkWidget * views = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6); + gtk_box_set_homogeneous(GTK_BOX(views),TRUE); + gtk_grid_attach(GTK_GRID(widget),views,0,2,10,1); + g_object_set(G_OBJECT(views),"margin-top",8,NULL); + g_object_set(G_OBJECT(views),"margin-botton",8,NULL); + + { + // Left options + GtkWidget * grid = v3270_box_pack_start(views,v3270_dialog_create_grid(GTK_ALIGN_START),TRUE,TRUE,0); + + create_field(widget, PROGRESS_FIELD_TOTAL, grid,0); + create_field(widget, PROGRESS_FIELD_SPEED, grid,1); + } + + { + // Right options + GtkWidget * grid = v3270_box_pack_start(views,v3270_dialog_create_grid(GTK_ALIGN_END),TRUE,TRUE,0); + + create_field(widget, PROGRESS_FIELD_CURRENT, grid,0); + create_field(widget, PROGRESS_FIELD_ETA, grid,1); + + } + + { + // Setup fields tooltips + size_t id; + + for(id = 0; id < PROGRESS_FIELD_COUNT; id++) + { + gtk_widget_set_tooltip_markup(GTK_WIDGET(widget->field[id]),v3270_ft_worker_fields[id].tooltip); + gtk_widget_set_can_focus(GTK_WIDGET(widget->field[id]),FALSE); + gtk_editable_set_editable(GTK_EDITABLE(widget->field[id]),FALSE); + } + + for(id = PROGRESS_FIELD_TOTAL; id < PROGRESS_FIELD_COUNT; id++) + { + gtk_entry_set_width_chars(widget->field[id],15); + } + + } + + // Create progress bar + widget->pbar = GTK_PROGRESS_BAR(gtk_progress_bar_new()); + gtk_progress_bar_set_show_text(widget->pbar,TRUE); + gtk_progress_bar_set_text(widget->pbar,_("No transfer")); + + g_object_set(G_OBJECT(widget->pbar),"margin-top",8,NULL); + + gtk_grid_attach(GTK_GRID(widget),GTK_WIDGET(widget->pbar),0,3,10,1); + + } + + LIB3270_EXPORT GtkWidget * v3270_ft_worker_new() + { + return GTK_WIDGET(g_object_new(GTK_TYPE_V3270_FT_WORKER, NULL)); + } + diff --git a/src/include/v3270/filetransfer.h b/src/include/v3270/filetransfer.h index c9365e9..b127402 100644 --- a/src/include/v3270/filetransfer.h +++ b/src/include/v3270/filetransfer.h @@ -146,4 +146,17 @@ G_END_DECLS + // File transfer widget + #define GTK_TYPE_V3270_FT_WORKER (V3270FTWorker_get_type ()) + #define GTK_V3270_FT_WORKER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_WORKER, V3270FTWorker)) + #define GTK_V3270_FT_WORKER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_FT_WORKER, V3270FTWorkerClass)) + #define GTK_IS_V3270_FT_WORKER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_FT_WORKER)) + #define GTK_IS_V3270_FT_WORKER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_WORKER)) + #define GTK_V3270_FT_WORKER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_FT_WORKER, V3270FTWorkerClass)) + + typedef struct _V3270FTWorker V3270FTWorker; + typedef struct _V3270FTWorkerClass V3270FTWorkerClass; + + LIB3270_EXPORT GtkWidget * v3270_ft_worker_new(); + #endif // V3270FT_H_INCLUDED diff --git a/src/testprogram/testprogram.c b/src/testprogram/testprogram.c index 6e6d586..f81ebca 100644 --- a/src/testprogram/testprogram.c +++ b/src/testprogram/testprogram.c @@ -149,7 +149,12 @@ static void disconnect_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *term static void ft_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) { - GtkWidget * dialog = v3270_ft_dialog_new(terminal); + GtkWidget * dialog = v3270_dialog_new(terminal, _("test"), _("test")); + GtkWidget * worker = v3270_ft_worker_new(); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),worker,TRUE,TRUE,2); + + // GtkWidget * dialog = v3270ftprogress_new(); + // GtkWidget * dialog = v3270_ft_dialog_new(terminal); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); -- libgit2 0.21.2