Commit 9f575fd338d8ca6590870a911a6a084956282f85

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

Working on FT dialog components.

src/v3270ft/activitylist.c
... ... @@ -347,7 +347,7 @@
347 347 _("Save queue to file"),
348 348 _("Save"),
349 349 GTK_FILE_CHOOSER_ACTION_SAVE,
350   - "",
  350 + list->filename,
351 351 N_("XML file"), "*.xml",
352 352 NULL );
353 353  
... ...
src/v3270ft/dialog.c
... ... @@ -180,9 +180,10 @@ static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTDialog *widg
180 180 v3270_ft_settings_set_activity(widget->settings,NULL);
181 181 }
182 182  
183   -static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, GtkWidget *button)
  183 +static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, V3270FTDialog *widget)
184 184 {
185   - gtk_widget_set_sensitive(button,enabled);
  185 + debug("%s: %s",__FUNCTION__,(enabled ? "Enable" : "Disable"));
  186 + gtk_widget_set_sensitive(widget->queue.save,enabled);
186 187 }
187 188  
188 189 static void V3270FTDialog_init(V3270FTDialog *widget)
... ... @@ -251,7 +252,6 @@ static void V3270FTDialog_init(V3270FTDialog *widget)
251 252 gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue"));
252 253 g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget);
253 254 gtk_widget_set_sensitive(widget->queue.save,FALSE);
254   - g_signal_connect(widget->queue.view,"has-file",G_CALLBACK(enable_queue_save),widget->queue.save);
255 255  
256 256 widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
257 257 gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file"));
... ... @@ -264,6 +264,7 @@ static void V3270FTDialog_init(V3270FTDialog *widget)
264 264 widget->queue.view = v3270_activity_list_new();
265 265 gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer"));
266 266 g_signal_connect(G_OBJECT(widget->queue.view),"row-activated",G_CALLBACK(activity_selected),widget);
  267 + g_signal_connect(G_OBJECT(widget->queue.view),"has-file",G_CALLBACK(enable_queue_save),widget);
267 268  
268 269 // Put the view inside a scrolled window.
269 270 GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL);
... ...
src/v3270ft/select.c
... ... @@ -37,43 +37,7 @@
37 37  
38 38 /*--[ Implement ]------------------------------------------------------------------------------------*/
39 39  
40   -/*
41   -#if defined(_WIN32)
42   -
43   -struct file {
44   - OPENFILENAME ofn;
45   - gboolean enabled;
46   - char szName[260]; // buffer for file name
47   - GtkFileChooserAction action;
48   - BOOL ok;
49   -};
50   -
51   -static gpointer select_file(struct file *fl) {
52   -
53   -
54   - switch(fl->action) {
55   - case GTK_FILE_CHOOSER_ACTION_SAVE: // Receber arquivo
56   - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx
57   - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#open_file
58   - fl->ofn.Flags = OFN_OVERWRITEPROMPT | OFN_CREATEPROMPT | OFN_HIDEREADONLY;
59   - fl->ok = GetSaveFileName(&fl->ofn);
60   - break;
61   -
62   - case GTK_FILE_CHOOSER_ACTION_OPEN: // Enviar arquivo
63   - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646928(v=vs.85).aspx
64   - fl->ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
65   - fl->ok = GetOpenFileName(&fl->ofn);
66   - break;
67   - }
68   -
69   - fl->enabled = FALSE;
70   -
71   - return 0;
72   -}
73   -#endif // _WIN32
74   -*/
75   -
76   -gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, G_GNUC_UNUSED const gchar *filename, G_GNUC_UNUSED const gchar *filter, ...) {
  40 +gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, G_GNUC_UNUSED const gchar *filter, ...) {
77 41  
78 42 gchar *rc = NULL;
79 43  
... ... @@ -91,84 +55,37 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *
91 55 );
92 56  
93 57  
94   - if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) {
95   - rc = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native)));
96   - }
97   -
98   - g_object_unref(native);
99   -
100   -#elif defined(_WIN32)
101   -
102   - GThread * thd;
103   - struct file fl;
104   - GdkWindow * win = gtk_widget_get_window(GTK_WIDGET(dialog));
105   -
106   - gtk_widget_set_sensitive(GTK_WIDGET(dialog),FALSE);
107   -
108   - memset(&fl,0,sizeof(fl));
109   - fl.ofn.lStructSize = sizeof(fl.ofn);
110   - fl.ofn.hwndOwner = GDK_WINDOW_HWND(win);
111   - fl.ofn.lpstrFile = fl.szName;
112   -
113   - fl.ofn.lpstrTitle = title;
114   -
115   - // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
116   - // use the contents of szFile to initialize itself.
117   - fl.ofn.lpstrFile[0] = '\0';
118   -
119   - fl.ofn.nMaxFile = sizeof(fl.szName);
120   -
121   - // Monta lista de arquivos.
122   - va_list args;
123   - size_t ix = 0;
124   -
125   - fl.ofn.lpstrFilter = (char *) g_malloc0(4096);
  58 + // Setup filename
  59 + if(filename && *filename)
  60 + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(native),filename);
126 61  
  62 + // Setup filters
  63 + va_list args;
127 64 va_start (args, filter);
128   - while(filter) {
129   -
130   - filter = gettext(filter);
131   - size_t sz = strlen(filter)+1;
132   -
133   - if(ix+sz > 4095)
  65 + while(filter)
  66 + {
  67 + const gchar * name = va_arg(args, const gchar *);
  68 + if(!name)
134 69 break;
135 70  
136   - debug("%s",filter);
137   -
138   - memcpy(((char *) fl.ofn.lpstrFilter)+ix,filter,sz);
139   - ix += sz;
140   - filter = va_arg(args, const char *);
141   - }
142   - va_end (args);
143   -
144   - debug("%s",fl.ofn.lpstrFilter);
145   -
146   - fl.ofn.nFilterIndex = 1;
147   - fl.ofn.lpstrInitialDir = NULL;
148   - fl.ofn.nMaxFileTitle = 0;
149   -
150   - // Guarda o valor atual
151   - if(filename)
152   - strncpy(fl.szName,filename,fl.ofn.nMaxFile);
153   -
154   - fl.action = action;
  71 + const gchar * pattern = va_arg(args, const gchar *);
  72 + if(!pattern)
  73 + break;
155 74  
156   - thd = g_thread_new("GetFileName",(GThreadFunc) select_file, &fl);
  75 + GtkFileFilter *filter = gtk_file_filter_new();
  76 + gtk_file_filter_set_name(filter,name);
  77 + gtk_file_filter_add_pattern(filter, pattern);
  78 + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter);
157 79  
158   - fl.enabled = TRUE;
159   - while(fl.enabled) {
160   - g_main_context_iteration(NULL,TRUE);
161 80 }
  81 + va_end(args);
162 82  
163   - g_thread_unref(thd);
164   -
165   - if(fl.ok) {
166   - rc = g_strdup(fl.szName);
  83 + // Run dialog
  84 + if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) {
  85 + rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native));
167 86 }
168 87  
169   - g_free( ((char *) fl.ofn.lpstrFilter) );
170   - gtk_widget_set_sensitive(GTK_WIDGET(dialog),TRUE);
171   -
  88 + g_object_unref(native);
172 89  
173 90 #else
174 91  
... ... @@ -185,6 +102,27 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *
185 102 if(filename && *filename)
186 103 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser),filename);
187 104  
  105 + // Setup filters
  106 + va_list args;
  107 + va_start (args, filter);
  108 + while(filter)
  109 + {
  110 + const gchar * name = va_arg(args, const gchar *);
  111 + if(!name)
  112 + break;
  113 +
  114 + const gchar * pattern = va_arg(args, const gchar *);
  115 + if(!pattern)
  116 + break;
  117 +
  118 + GtkFileFilter *filter = gtk_file_filter_new();
  119 + gtk_file_filter_set_name(filter,name);
  120 + gtk_file_filter_add_pattern(filter, pattern);
  121 + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter);
  122 +
  123 + }
  124 + va_end(args);
  125 +
188 126 if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) {
189 127 rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
190 128 }
... ... @@ -192,9 +130,9 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *
192 130 gtk_widget_destroy(chooser);
193 131  
194 132  
195   -#endif // WIN32
  133 +#endif // GTK 3.20
196 134  
197   - debug("%s=%p",__FUNCTION__,rc);
  135 + debug("%s=%s",__FUNCTION__,rc);
198 136  
199 137 return rc;
200 138  
... ...