diff --git a/src/dialogs/save/private.h b/src/dialogs/save/private.h index 052bdd0..e2687e2 100644 --- a/src/dialogs/save/private.h +++ b/src/dialogs/save/private.h @@ -28,54 +28,31 @@ */ #include + #include #include #include #include /*--[ Widget definition ]----------------------------------------------------------------------------*/ - struct _V3270PrintOperationClass + struct _V3270SaveDialog { - GtkPrintOperationClass parent_class; + GtkDialog parent; - }; + GtkWidget * terminal; + GtkWidget * filename; + LIB3270_CONTENT_OPTION mode; - typedef struct _column - { - unsigned char c; - unsigned short attr; - } column; + }; - struct _V3270PrintOperation + struct _V3270SaveDialogClass { - GtkPrintOperation parent; - GdkRGBA colors[V3270_COLOR_COUNT]; - LIB3270_CONTENT_OPTION mode; - v3270 * widget; - H3270 * session; - - size_t lpp; ///< @brief Lines per page (in rows). - size_t pages; ///< @brief Number of pages. - gboolean show_selection; ///< @brief Print selection box? - - struct - { - size_t width; ///< @brief Width of the contents (in columns); - size_t height; ///< @brief Height of the contents (in rows); - column **text; ///< @brief Report contents. - } contents; - - struct - { - gchar * name; - v3270FontInfo info; - } font; + GtkDialogClass parent_class; + int dummy; }; /*--[ Prototypes ]-----------------------------------------------------------------------------------*/ - G_GNUC_INTERNAL void V3270PrintOperation_begin_print(GtkPrintOperation *prt, GtkPrintContext *context); - G_GNUC_INTERNAL void V3270PrintOperation_draw_page(GtkPrintOperation *prt, GtkPrintContext *context, gint page); diff --git a/src/dialogs/save/save.c b/src/dialogs/save/save.c index 102773c..e143cff 100644 --- a/src/dialogs/save/save.c +++ b/src/dialogs/save/save.c @@ -28,8 +28,95 @@ */ #include "private.h" + #include + +/*--[ GTK Requires ]---------------------------------------------------------------------------------*/ + + G_DEFINE_TYPE(V3270SaveDialog, V3270SaveDialog, GTK_TYPE_DIALOG); /*--[ Implement ]------------------------------------------------------------------------------------*/ + static void V3270SaveDialog_finalize(V3270SaveDialog *object) + { + V3270SaveDialog *dialog = V3270_SAVE_DIALOG(object); + } + + static void V3270SaveDialog_class_init(V3270SaveDialogClass *klass) + { + + debug("%s",__FUNCTION__); + G_OBJECT_CLASS(klass)->finalize = V3270SaveDialog_finalize; + + } + + static void V3270SaveDialog_init(V3270SaveDialog *dialog) + { + dialog->mode = LIB3270_CONTENT_ALL; + + // Setup visual elements + // https://developer.gnome.org/hig/stable/visual-layout.html.en + GtkWidget *widget; + + GtkBox * box = GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); + gtk_window_set_resizable(GTK_WINDOW(dialog),FALSE); + gtk_container_set_border_width(GTK_CONTAINER(box),18); + + GtkGrid * grid = GTK_GRID(gtk_grid_new()); + gtk_grid_set_row_spacing(GTK_GRID(grid),6); + gtk_grid_set_column_spacing(GTK_GRID(grid),12); + gtk_box_pack_start(box,GTK_WIDGET(grid),TRUE,TRUE,2); + + dialog->filename = GTK_ENTRY(gtk_entry_new()); + gtk_widget_set_hexpand(GTK_WIDGET(dialog->filename),TRUE); + + widget = gtk_label_new_with_mnemonic("_Filename:"); + gtk_widget_set_halign(widget,GTK_ALIGN_END); + gtk_widget_set_valign(widget,GTK_ALIGN_CENTER); + gtk_grid_attach(grid,GTK_WIDGET(widget),0,0,1,1); + gtk_label_set_mnemonic_widget(GTK_LABEL(widget),dialog->filename); + +#ifdef WIN32 + widget = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_BUTTON); + //g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(select_local_file),dialog); + gtk_grid_attach(grid,widget,2,0,1,1); +#else + gtk_entry_set_icon_from_icon_name(dialog->filename,GTK_ENTRY_ICON_SECONDARY,"document-open"); + gtk_entry_set_icon_activatable(dialog->filename,GTK_ENTRY_ICON_SECONDARY,TRUE); + gtk_entry_set_icon_tooltip_text(dialog->filename,GTK_ENTRY_ICON_SECONDARY,_("Select file")); + // g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog); +#endif // WIN32 + + gtk_entry_set_width_chars(dialog->filename,60); + gtk_entry_set_max_length(dialog->filename,PATH_MAX); + gtk_grid_attach(grid,GTK_WIDGET(dialog->filename),1,0,1,1); + + + } + + GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename) + { + V3270SaveDialog * dialog = V3270_SAVE_DIALOG(g_object_new(GTK_TYPE_V3270SaveDialog, NULL)); + dialog->mode = mode; + + if(filename) + gtk_entry_set_text(GTK_ENTRY(dialog->filename),filename); + + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget))); + gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); + gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); + + // https://developer.gnome.org/hig/stable/visual-layout.html.en + GtkGrid * grid = GTK_GRID(gtk_grid_new()); + gtk_grid_set_row_spacing(GTK_GRID(grid),6); + gtk_grid_set_column_spacing(GTK_GRID(grid),12); + + + return GTK_WIDGET(dialog); + } + + void v3270_save_dialog_run(GtkWidget *widget) + { + gtk_dialog_run(GTK_DIALOG(widget)); + } diff --git a/src/include/hostselect.h b/src/include/hostselect.h index 64bbf55..18901a3 100644 --- a/src/include/hostselect.h +++ b/src/include/hostselect.h @@ -18,7 +18,7 @@ * 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 hostdialog.h e possui - linhas de código. + * Este programa está nomeado como - e possui - linhas de código. * * Contatos: * @@ -29,6 +29,8 @@ #ifndef V3270HOST_H_INCLUDED + #define V3270HOST_H_INCLUDED 1 + #include #define ENABLE_NLS @@ -41,8 +43,6 @@ #include #include - #define V3270FT_H_INCLUDED 1 - G_BEGIN_DECLS /*--[ Progress widget ]------------------------------------------------------------------------------*/ diff --git a/src/include/save.h b/src/include/save.h new file mode 100644 index 0000000..cce319d --- /dev/null +++ b/src/include/save.h @@ -0,0 +1,67 @@ +/* + * "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) + * + */ + +#ifndef V3270SAVE_H_INCLUDED + + #define V3270SAVE_H_INCLUDED 1 + + #include + #define ENABLE_NLS + + #ifndef GETTEXT_PACKAGE + #define GETTEXT_PACKAGE PACKAGE_NAME + #endif + + #include + #include + #include + #include + + G_BEGIN_DECLS + +/*--[ Progress widget ]------------------------------------------------------------------------------*/ + + #define GTK_TYPE_V3270SaveDialog (V3270SaveDialog_get_type ()) + #define V3270_SAVE_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270SaveDialog, V3270SaveDialog)) + #define V3270SaveDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270SaveDialog, V3270SaveDialogClass)) + #define IS_V3270SaveDialog(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270SaveDialog)) + #define IS_V3270SaveDialog_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270SaveDialog)) + #define V3270SaveDialog_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270SaveDialog, V3270SaveDialogClass)) + + typedef struct _V3270SaveDialog V3270SaveDialog; + typedef struct _V3270SaveDialogClass V3270SaveDialogClass; + +/*--[ Prototipes ]-----------------------------------------------------------------------------------*/ + + GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename); + void v3270_save_dialog_run(GtkWidget *widget); + + G_END_DECLS + +#endif // V3270SAVE_H_INCLUDED diff --git a/src/terminal/callbacks.c b/src/terminal/callbacks.c index 3984514..f5986fe 100644 --- a/src/terminal/callbacks.c +++ b/src/terminal/callbacks.c @@ -35,6 +35,7 @@ #include #include + #include #include #include @@ -356,6 +357,21 @@ static int print(H3270 *session, LIB3270_CONTENT_OPTION mode) return 0; } +static int save(H3270 *session, LIB3270_CONTENT_OPTION mode, const char *filename) +{ + GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); + + if(!GTK_IS_V3270(widget)) + return EINVAL; + + GtkWidget *dialog = v3270_save_dialog_new(widget,mode,filename); + gtk_widget_show_all(dialog); + v3270_save_dialog_run(dialog); + gtk_widget_destroy(dialog); + + return 0; +} + static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args) { GtkWidget *terminal = (GtkWidget *) lib3270_get_user_data(session); @@ -501,6 +517,7 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title cbk->message = message; cbk->update_ssl = update_ssl; cbk->print = print; + cbk->save = save; cbk->popup_ssl_error = popup_ssl_error; } diff --git a/v3270.cbp b/v3270.cbp index be9b89d..d9c79f4 100644 --- a/v3270.cbp +++ b/v3270.cbp @@ -142,6 +142,7 @@ + -- libgit2 0.21.2