Commit b35da6da877cbd59c6bf4861a5d5e95d21fcf519

Authored by Perry Werneck
1 parent 42d789e9
Exists in master and in 1 other branch develop

Working on the new "save" dialog.

src/dialogs/linux/select.c
... ... @@ -43,7 +43,7 @@ gchar * v3270_select_file(GtkWidget *widget, const gchar *title, const gchar *bu
43 43 gtk_file_chooser_native_new
44 44 (
45 45 title,
46   - GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  46 + GTK_WINDOW(widget),
47 47 action,
48 48 button,
49 49 _( "_Cancel" )
... ... @@ -88,7 +88,7 @@ gchar * v3270_select_file(GtkWidget *widget, const gchar *title, const gchar *bu
88 88 gtk_file_chooser_dialog_new
89 89 (
90 90 title,
91   - GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  91 + GTK_WINDOW(widget),
92 92 action,
93 93 _("_Cancel" ), GTK_RESPONSE_CANCEL,
94 94 button, GTK_RESPONSE_ACCEPT,
... ...
src/dialogs/save/save.c
... ... @@ -29,6 +29,10 @@
29 29  
30 30  
31 31 #include "private.h"
  32 + #include <internals.h>
  33 + #include <lib3270.h>
  34 + #include <lib3270/selection.h>
  35 + #include <clipboard.h>
32 36 #include <limits.h>
33 37  
34 38 /*--[ GTK Requires ]---------------------------------------------------------------------------------*/
... ... @@ -57,6 +61,18 @@
57 61 }
58 62 };
59 63  
  64 + static const struct _charsets
  65 + {
  66 + const gchar *name;
  67 + const gchar *description;
  68 + } charsets[] =
  69 + {
  70 + // http://en.wikipedia.org/wiki/Character_encoding
  71 + { "UTF-8", N_( "UTF-8" ) },
  72 + { "ISO-8859-1", N_( "Western Europe (ISO 8859-1)" ) },
  73 + { "CP1252", N_( "Windows Western languages (CP1252)" ) },
  74 + };
  75 +
60 76 /*--[ Implement ]------------------------------------------------------------------------------------*/
61 77  
62 78 /*
... ... @@ -84,6 +100,31 @@
84 100 gtk_dialog_response(dialog,GTK_RESPONSE_APPLY);
85 101 }
86 102  
  103 +#ifdef WIN32
  104 +static void select_local_file(GtkButton G_GNUC_UNUSED(*button), v3270ft *dialog) {
  105 +#else
  106 +static void icon_press(G_GNUC_UNUSED GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270SaveDialog *dialog) {
  107 +#endif // WIN32
  108 +
  109 + gint format = gtk_combo_box_get_active(GTK_COMBO_BOX(dialog->format));
  110 + g_autofree gchar * extension = g_strconcat("*",formats[format].extension,NULL);
  111 +
  112 + g_autofree gchar *filename =
  113 + v3270_select_file(
  114 + GTK_WIDGET(dialog),
  115 + _("Select file to save"),
  116 + _("Select"),
  117 + GTK_FILE_CHOOSER_ACTION_SAVE,
  118 + gtk_entry_get_text(GTK_ENTRY(dialog->filename)),
  119 + gettext(formats[format].name), extension,
  120 + NULL
  121 + );
  122 +
  123 + if(filename)
  124 + gtk_entry_set_text(GTK_ENTRY(dialog->filename),filename);
  125 +
  126 + }
  127 +
87 128 static void V3270SaveDialog_init(V3270SaveDialog *dialog)
88 129 {
89 130 // 0--------1---------------------2-------3------------------
... ... @@ -122,13 +163,13 @@
122 163  
123 164 #ifdef WIN32
124 165 widget = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_BUTTON);
125   - //g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(select_local_file),dialog);
  166 + g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(select_local_file),dialog);
126 167 gtk_grid_attach(grid,widget,6,0,1,1);
127 168 #else
128 169 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,"document-open");
129 170 gtk_entry_set_icon_activatable(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,TRUE);
130 171 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,_("Select file"));
131   - // g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog);
  172 + g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog);
132 173 #endif // WIN32
133 174  
134 175 gtk_entry_set_width_chars(GTK_ENTRY(dialog->filename),60);
... ... @@ -138,18 +179,6 @@
138 179  
139 180 // Charset drop-down
140 181 {
141   - static const struct _charsets
142   - {
143   - const gchar *name;
144   - const gchar *description;
145   - } charsets[] =
146   - {
147   - // http://en.wikipedia.org/wiki/Character_encoding
148   - { "UTF-8", N_( "UTF-8" ) },
149   - { "ISO-8859-1", N_( "Western Europe (ISO 8859-1)" ) },
150   - { "CP1252", N_( "Windows Western languages (CP1252)" ) },
151   - };
152   -
153 182 size_t ix;
154 183 const gchar * scharset = NULL;
155 184  
... ... @@ -251,6 +280,8 @@
251 280  
252 281 GtkWidget * v3270_save_dialog_new(GtkWidget *widget, LIB3270_CONTENT_OPTION mode, const gchar *filename)
253 282 {
  283 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  284 +
254 285 static const gchar * titles[] =
255 286 {
256 287 N_("Save terminal contents"),
... ... @@ -269,7 +300,8 @@
269 300 NULL)
270 301 );
271 302  
272   - dialog->mode = mode;
  303 + dialog->mode = mode;
  304 + dialog->terminal = widget;
273 305  
274 306 if( (size_t) mode < G_N_ELEMENTS(titles))
275 307 {
... ... @@ -286,9 +318,117 @@
286 318 return GTK_WIDGET(dialog);
287 319 }
288 320  
  321 + void v3270_save_dialog_apply(GtkWidget *widget, GError **error)
  322 + {
  323 + V3270SaveDialog * dialog = V3270_SAVE_DIALOG(widget);
  324 +
  325 + if(!v3270_is_connected(dialog->terminal))
  326 + {
  327 + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,"%s",strerror(ENOTCONN));
  328 + return;
  329 + }
  330 +
  331 + // Get selection
  332 + GList * dynamic = NULL;
  333 + const GList * selection = NULL;
  334 +
  335 + switch(dialog->mode)
  336 + {
  337 + case LIB3270_CONTENT_ALL:
  338 + break;
  339 +
  340 + case LIB3270_CONTENT_COPY:
  341 + selection = v3270_get_selection_blocks(dialog->terminal);
  342 + break;
  343 +
  344 + case LIB3270_CONTENT_SELECTED:
  345 + dynamic = g_new0(GList,1);
  346 + dynamic->data = (gpointer) lib3270_get_selection(v3270_get_session(dialog->terminal),0);
  347 + selection = dynamic;
  348 + break;
  349 +
  350 + default:
  351 + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,_( "Unexpected mode %d" ),(int) dialog->mode);
  352 + return;
  353 + }
  354 +
  355 + if(!selection)
  356 + {
  357 + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,"%s",strerror(ENODATA));
  358 + }
  359 + else
  360 + {
  361 + const gchar * encoding = gtk_combo_box_get_active_id(GTK_COMBO_BOX(dialog->charset));
  362 + g_autofree gchar * text = NULL;
  363 +
  364 + debug("Encoding: %s",encoding);
  365 +
  366 + switch(gtk_combo_box_get_active(GTK_COMBO_BOX(dialog->format)))
  367 + {
  368 + case 0: // "Plain text"
  369 + text = v3270_get_selection_as_text(GTK_V3270(dialog->terminal), selection, encoding);
  370 + break;
  371 +
  372 + case 1: // "Comma-separated values (CSV)"
  373 + text = v3270_get_selection_as_table(GTK_V3270(dialog->terminal),selection,";",encoding);
  374 + break;
  375 +
  376 + case 2: // "HyperText Markup Language (HTML)"
  377 + text = v3270_get_selection_as_html_div(GTK_V3270(dialog->terminal),selection,encoding);
  378 + break;
  379 +
  380 + default:
  381 + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,_( "Unexpected format %d" ),(int) gtk_combo_box_get_active(GTK_COMBO_BOX(dialog->format)));
  382 + }
  383 +
  384 + if(text)
  385 + {
  386 + debug("%s",text);
  387 +
  388 + g_file_set_contents(
  389 + gtk_entry_get_text(GTK_ENTRY(dialog->filename)),
  390 + text,
  391 + -1,
  392 + error
  393 + );
  394 +
  395 + }
  396 +
  397 + }
  398 +
  399 + if(dynamic)
  400 + g_list_free_full(dynamic,(GDestroyNotify) lib3270_free);
  401 +
  402 + }
  403 +
289 404 void v3270_save_dialog_run(GtkWidget *widget)
290 405 {
291   - gtk_dialog_run(GTK_DIALOG(widget));
  406 + if(gtk_dialog_run(GTK_DIALOG(widget)) == GTK_RESPONSE_APPLY)
  407 + {
  408 + GError * error = NULL;
  409 + v3270_save_dialog_apply(widget,&error);
  410 +
  411 + if(error)
  412 + {
  413 + GtkWidget *popup = gtk_message_dialog_new_with_markup(
  414 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  415 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  416 + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
  417 + _("Can't save %s"),gtk_entry_get_text(GTK_ENTRY(V3270_SAVE_DIALOG(widget)->filename))
  418 + );
  419 +
  420 + gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed"));
  421 +
  422 + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message);
  423 + g_error_free(error);
  424 +
  425 + gtk_dialog_run(GTK_DIALOG(popup));
  426 + gtk_widget_destroy(popup);
  427 +
  428 + }
  429 +
  430 + }
  431 +
292 432 }
293 433  
294 434  
... ...
src/filetransfer/activitylist.c
... ... @@ -455,7 +455,7 @@
455 455 V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget);
456 456  
457 457 gchar * filename = v3270_select_file(
458   - widget,
  458 + gtk_widget_get_toplevel(widget),
459 459 _("Save queue to file"),
460 460 _("Save"),
461 461 GTK_FILE_CHOOSER_ACTION_SAVE,
... ...
src/include/clipboard.h
... ... @@ -92,8 +92,10 @@
92 92 /// @brief Get contents.
93 93 G_GNUC_INTERNAL gchar * v3270_get_selection_as_text(v3270 * terminal, const GList *selection, const gchar *encoding);
94 94 G_GNUC_INTERNAL gchar * v3270_get_selection_as_table(v3270 * terminal, const GList *selection, const gchar *delimiter, const gchar *encoding);
  95 + G_GNUC_INTERNAL gchar * v3270_get_selection_as_html_div(v3270 * terminal, const GList *selection, const gchar *encoding);
  96 + G_GNUC_INTERNAL gchar * v3270_get_selection_as_html_table(v3270 * terminal, const GList *selection, const gchar *encoding);
95 97  
96   -
  98 + G_GNUC_INTERNAL const GList * v3270_get_selection_blocks(GtkWidget *widget);
97 99  
98 100 G_GNUC_INTERNAL gchar * v3270_get_copy_as_text(v3270 * terminal, const gchar *encoding);
99 101 G_GNUC_INTERNAL gchar * v3270_get_copy_as_html(v3270 * terminal, const gchar *encoding);
... ...
src/selection/html.c
... ... @@ -214,14 +214,24 @@ static gchar * get_as_table(v3270 * terminal, const GList *selection)
214 214  
215 215 }
216 216  
  217 +gchar * v3270_get_selection_as_html_div(v3270 * terminal, const GList *selection, const gchar *encoding)
  218 +{
  219 + g_autofree char * text = get_as_div(terminal, selection);
  220 + return g_convert(text, -1, (encoding ? encoding : "UTF-8"), lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
  221 +}
  222 +
  223 +gchar * v3270_get_selection_as_html_table(v3270 * terminal, const GList *selection, const gchar *encoding)
  224 +{
  225 + g_autofree char * text = get_as_table(terminal, selection);
  226 + return g_convert(text, -1, (encoding ? encoding : "UTF-8"), lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
  227 +}
  228 +
217 229 gchar * v3270_get_copy_as_html(v3270 * terminal, const gchar *encoding)
218 230 {
219   - g_autofree char * text = NULL;
220 231  
221 232 if(terminal->selection.format == V3270_SELECT_TABLE)
222   - text = get_as_table(terminal, terminal->selection.blocks);
223   - else
224   - text = get_as_div(terminal, terminal->selection.blocks);
  233 + return v3270_get_selection_as_html_table(terminal, terminal->selection.blocks, encoding);
  234 +
  235 + return v3270_get_selection_as_html_div(terminal, terminal->selection.blocks, encoding);
225 236  
226   - return g_convert(text, -1, (encoding ? encoding : "UTF-8"), lib3270_get_display_charset(terminal->host), NULL, NULL, NULL);
227 237 }
... ...
src/selection/selection.c
... ... @@ -47,6 +47,13 @@ void v3270_clear_selection(v3270 *terminal)
47 47 }
48 48 }
49 49  
  50 +const GList * v3270_get_selection_blocks(GtkWidget *widget)
  51 +{
  52 + g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
  53 + return GTK_V3270(widget)->selection.blocks;
  54 +}
  55 +
  56 +
50 57 /**
51 58 * Get lib3270 selection as a g_malloc buffer.
52 59 *
... ...
src/testprogram/toolbar.c
... ... @@ -129,12 +129,12 @@ static void save_all_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *termin
129 129  
130 130 }
131 131  
132   - static void paste_clicked(GtkButton *button, GtkWidget *terminal)
  132 + static void paste_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
133 133 {
134 134 v3270_paste(terminal);
135 135 }
136 136  
137   - static void copy_clicked(GtkButton *button, GtkWidget *terminal)
  137 + static void copy_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
138 138 {
139 139 v3270_copy_selection(terminal,V3270_SELECT_TEXT,FALSE);
140 140 }
... ...