Commit be833d0a7cb29e9639739b843b443e5d95620d95

Authored by Perry Werneck
1 parent 437a1c76
Exists in master and in 1 other branch develop

Working on the new File transfer components.

src/v3270ft/dialog.c
... ... @@ -40,6 +40,7 @@
40 40 GtkWidget * settings;
41 41  
42 42 struct {
  43 + GtkWidget * valid;
43 44 GtkWidget * insert;
44 45 GtkWidget * update;
45 46 GtkWidget * reset;
... ... @@ -102,9 +103,16 @@ void activity_selected(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn G
102 103  
103 104 }
104 105  
  106 +static void validity_changed(GtkWidget G_GNUC_UNUSED(*settings), gboolean valid, V3270FTDialog *widget)
  107 +{
  108 + debug("The file transfer settings are now %s",valid ? "valid" : "invalid");
  109 + gtk_widget_set_sensitive(widget->button.valid,valid);
  110 +}
  111 +
105 112 static void V3270FTDialog_init(V3270FTDialog *widget)
106 113 {
107 114 widget->settings = v3270_ft_settings_new();
  115 + g_signal_connect(G_OBJECT(widget->settings),"validity",G_CALLBACK(validity_changed),widget);
108 116  
109 117 gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
110 118  
... ... @@ -123,18 +131,19 @@ static void V3270FTDialog_init(V3270FTDialog *widget)
123 131  
124 132 // Create action buttons
125 133 {
126   - GtkWidget * buttons = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
  134 + widget->button.valid = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6);
127 135  
128   - g_object_set(G_OBJECT(buttons),"margin-top",6,NULL);
  136 + g_object_set(G_OBJECT(widget->button.valid),"margin-top",6,NULL);
129 137  
130   - widget->button.reset = v3270_box_pack_end(buttons,gtk_button_new_with_mnemonic("_Reset"),FALSE,FALSE,0);
131   - widget->button.update = v3270_box_pack_end(buttons,gtk_button_new_with_mnemonic("_Update"),FALSE,FALSE,0);
132   - widget->button.insert = v3270_box_pack_end(buttons,gtk_button_new_with_mnemonic("_Insert"),FALSE,FALSE,0);
  138 + widget->button.reset = v3270_box_pack_end(widget->button.valid,gtk_button_new_with_mnemonic("_Reset"),FALSE,FALSE,0);
  139 + widget->button.update = v3270_box_pack_end(widget->button.valid,gtk_button_new_with_mnemonic("_Update"),FALSE,FALSE,0);
  140 + widget->button.insert = v3270_box_pack_end(widget->button.valid,gtk_button_new_with_mnemonic("_Insert"),FALSE,FALSE,0);
133 141  
134 142 gtk_widget_set_sensitive(widget->button.update,FALSE);
135 143 gtk_widget_set_sensitive(widget->button.reset,FALSE);
136 144  
137   - gtk_box_pack_start(GTK_BOX(container),buttons,FALSE,FALSE,0);
  145 + gtk_box_pack_start(GTK_BOX(container),widget->button.valid,FALSE,FALSE,0);
  146 + gtk_widget_set_sensitive(widget->button.valid,FALSE);
138 147  
139 148 }
140 149  
... ...
src/v3270ft/marshal
1 1 VOID:POINTER,POINTER
  2 +VOID:VOID,BOOLEAN
  3 +
... ...
src/v3270ft/settings.c
... ... @@ -30,6 +30,7 @@
30 30 #include <string.h>
31 31 #include <internals.h>
32 32 #include "private.h"
  33 + #include "marshal.h"
33 34 #include <v3270/filetransfer.h>
34 35  
35 36 /*--[ Widget definition ]----------------------------------------------------------------------------*/
... ... @@ -38,31 +39,82 @@
38 39 {
39 40 GtkGridClass parent_class;
40 41  
  42 + struct
  43 + {
  44 + void (*validity)(GtkWidget *, gboolean);
  45 + } signal;
  46 +
41 47 };
42 48  
  49 + typedef enum _invalid
  50 + {
  51 + VALIDITY_TRANSFER_TYPE = 0x0001,
  52 + VALIDITY_LOCAL_FILENAME = 0x0002,
  53 + VALIDITY_REMOTE_FILENAME = 0x0004,
  54 + } VALIDITY_TYPE;
  55 +
43 56 struct _V3270FTSettings
44 57 {
45 58 GtkGrid parent;
46 59  
47   - struct {
  60 + struct
  61 + {
48 62 GtkEntry * local;
49 63 GtkEntry * remote;
50 64 } file;
51 65  
52   - GtkComboBox * type;
53   - GtkWidget * recordFormatBox;
54   - GtkWidget * spaceAllocationBox;
55 66  
56   - GtkWidget * options[NUM_OPTIONS_WIDGETS];
57   - GtkWidget * spins[LIB3270_FT_VALUE_COUNT];
  67 + struct
  68 + {
  69 + LIB3270_FT_OPTION options;
  70 + gboolean is_valid;
  71 + VALIDITY_TYPE invalid;
  72 + } transfer;
  73 +
  74 + GtkComboBox * type;
  75 + GtkWidget * recordFormatBox;
  76 + GtkWidget * spaceAllocationBox;
  77 +
  78 + GtkWidget * options[NUM_OPTIONS_WIDGETS];
  79 + GtkWidget * spins[LIB3270_FT_VALUE_COUNT];
  80 +
58 81 };
59 82  
60 83 G_DEFINE_TYPE(V3270FTSettings, V3270FTSettings, GTK_TYPE_GRID);
61 84  
  85 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  86 +
  87 + enum _SIGNALS
  88 + {
  89 + V3270_FT_SETTINGS_VALIDITY_SIGNAL, ///< @brief Indicates if the dialog contents is valid.
  90 +
  91 + V3270_FT_SETTINGS_LAST_SIGNAL
  92 + };
  93 +
  94 + static guint v3270_ft_settings_signals[V3270_FT_SETTINGS_LAST_SIGNAL] = { 0 };
  95 +
62 96 /*--[ Implement ]------------------------------------------------------------------------------------*/
63 97  
  98 + static void V3270FTSettings_validity(GtkWidget G_GNUC_UNUSED(*widget), gboolean G_GNUC_UNUSED(is_valid))
  99 + {
  100 + debug("%s",__FUNCTION__);
  101 + }
  102 +
  103 +
64 104 static void V3270FTSettings_class_init(G_GNUC_UNUSED V3270FTSettingsClass *klass)
65 105 {
  106 + GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
  107 +
  108 + klass->signal.validity = V3270FTSettings_validity;
  109 +
  110 + v3270_ft_settings_signals[V3270_FT_SETTINGS_VALIDITY_SIGNAL] =
  111 + g_signal_new( "validity",
  112 + G_OBJECT_CLASS_TYPE (gobject_class),
  113 + G_SIGNAL_RUN_FIRST,
  114 + G_STRUCT_OFFSET (V3270FTSettingsClass, signal.validity),
  115 + NULL, NULL,
  116 + v3270ft_VOID__VOID_BOOLEAN,
  117 + G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
66 118  
67 119  
68 120 }
... ... @@ -152,6 +204,8 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP
152 204 {
153 205 size_t ix;
154 206  
  207 + widget->transfer.options = options;
  208 +
155 209 if(options & LIB3270_FT_OPTION_RECEIVE)
156 210 {
157 211 debug("%s option selected","LIB3270_FT_OPTION_RECEIVE");
... ... @@ -191,6 +245,34 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP
191 245  
192 246 }
193 247  
  248 + static void check_for_validity_signal(V3270FTSettings *widget)
  249 + {
  250 + gboolean is_valid = (widget->transfer.invalid == 0) ? TRUE : FALSE;
  251 +
  252 + if(is_valid == widget->transfer.is_valid)
  253 + return;
  254 +
  255 + widget->transfer.is_valid = is_valid;
  256 +
  257 + debug("Transfer is now \"%s\"", is_valid ? "valid" : "invalid");
  258 + g_signal_emit(widget, v3270_ft_settings_signals[V3270_FT_SETTINGS_VALIDITY_SIGNAL], 0, widget->transfer.is_valid);
  259 +
  260 + }
  261 +
  262 + static void set_invalid(V3270FTSettings *widget, VALIDITY_TYPE option)
  263 + {
  264 + widget->transfer.invalid |= option;
  265 + debug("Invalid: %08lx", (unsigned int) widget->transfer.invalid);
  266 + check_for_validity_signal(widget);
  267 + }
  268 +
  269 + static void set_valid(V3270FTSettings *widget, VALIDITY_TYPE option)
  270 + {
  271 + widget->transfer.invalid &= ~option;
  272 + debug("Invalid: %08lx", (unsigned int) widget->transfer.invalid);
  273 + check_for_validity_signal(widget);
  274 + }
  275 +
194 276 static void transfer_type_changed(GtkComboBox *widget, V3270FTSettings *dialog)
195 277 {
196 278 gint selected = gtk_combo_box_get_active(widget);
... ... @@ -199,20 +281,78 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP
199 281  
200 282 if(selected >= 0)
201 283 {
  284 + set_valid(dialog, VALIDITY_TRANSFER_TYPE);
202 285 set_options(dialog,ft_type[selected].opt);
203 286 }
204 287 else
205 288 {
  289 + set_invalid(dialog, VALIDITY_TRANSFER_TYPE);
206 290 gtk_widget_set_sensitive(GTK_WIDGET(dialog->file.local),FALSE);
207 291 gtk_widget_set_sensitive(GTK_WIDGET(dialog->file.remote),FALSE);
208 292 }
209 293  
210 294 }
211 295  
  296 +
  297 + static void local_file_changed(GtkEntry *entry, V3270FTSettings *widget) {
  298 +
  299 + const gchar * text = gtk_entry_get_text(entry);
  300 +
  301 + if(!text)
  302 + {
  303 + set_invalid(widget, VALIDITY_LOCAL_FILENAME);
  304 + return;
  305 + }
  306 +
  307 + if(widget->transfer.options & LIB3270_FT_OPTION_RECEIVE)
  308 + {
  309 + // Check for file receive options.
  310 + g_autofree gchar * dir = g_path_get_dirname(text);
  311 +
  312 + if(*dir && !g_file_test(dir,G_FILE_TEST_IS_DIR))
  313 + {
  314 + debug("Folder \"%s\" is invalid",dir);
  315 + set_invalid(widget, VALIDITY_LOCAL_FILENAME);
  316 + return;
  317 + }
  318 +
  319 + }
  320 + else
  321 + {
  322 + // Check for file send options.
  323 + if(!g_file_test(text,G_FILE_TEST_IS_REGULAR))
  324 + {
  325 + debug("File \"%s\" is invalid",text);
  326 + set_valid(widget, VALIDITY_LOCAL_FILENAME);
  327 + return;
  328 + }
  329 +
  330 + }
  331 +
  332 + set_valid(widget, VALIDITY_LOCAL_FILENAME);
  333 + }
  334 +
  335 + static void remote_file_changed(GtkEntry *entry, V3270FTSettings *widget) {
  336 +
  337 + const gchar * text = gtk_entry_get_text(entry);
  338 +
  339 + if(!*text)
  340 + {
  341 + set_invalid(widget, VALIDITY_REMOTE_FILENAME);
  342 + return;
  343 + }
  344 +
  345 + set_valid(widget, VALIDITY_REMOTE_FILENAME);
  346 +
  347 + }
  348 +
212 349 static void V3270FTSettings_init(V3270FTSettings *widget)
213 350 {
214 351 size_t ix;
215 352  
  353 + // Begin with all invalid options set.
  354 + widget->transfer.invalid = VALIDITY_TRANSFER_TYPE|VALIDITY_LOCAL_FILENAME|VALIDITY_REMOTE_FILENAME;
  355 +
216 356 // https://developer.gnome.org/hig/stable/visual-layout.html.en
217 357 gtk_grid_set_row_spacing(GTK_GRID(widget),6);
218 358 gtk_grid_set_column_spacing(GTK_GRID(widget),12);
... ... @@ -248,10 +388,12 @@ static void open_select_file_dialog(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconP
248 388 gtk_entry_set_icon_tooltip_text(widget->file.local,GTK_ENTRY_ICON_SECONDARY,_("Select file"));
249 389  
250 390 g_signal_connect(G_OBJECT(widget->file.local),"icon-press",G_CALLBACK(open_select_file_dialog),widget);
  391 + g_signal_connect(G_OBJECT(widget->file.local),"changed",G_CALLBACK(local_file_changed),widget);
251 392  
252 393 // Remote file name
253 394 widget->file.remote = GTK_ENTRY(create_entry(widget,"_Remote file",gtk_entry_new(),0,2,9));
254 395 gtk_entry_set_max_length(widget->file.remote,PATH_MAX);
  396 + g_signal_connect(G_OBJECT(widget->file.remote),"changed",G_CALLBACK(remote_file_changed),widget);
255 397  
256 398 }
257 399  
... ...