Commit e812d17c2a22568a0c6f96b39542a13d9deb84e6

Authored by perry.werneck@gmail.com
1 parent 5abb8018

Iniciando implementação da action que seleciona e executa um plugin rexx

src/include/pw3270.h
... ... @@ -71,6 +71,11 @@
71 71 LIB3270_EXPORT void pw3270_set_session_options(GtkWidget *widget, LIB3270_OPTION options);
72 72 LIB3270_EXPORT int pw3270_set_session_color_type(GtkWidget *widget, unsigned short color_type);
73 73  
  74 + LIB3270_EXPORT gchar * pw3270_get_filename(GtkWidget *widget, const gchar *group, const gchar *key, GtkFileFilter **filter, const gchar *title);
  75 +
  76 + LIB3270_EXPORT gchar * pw3270_get_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *def);
  77 + LIB3270_EXPORT void pw3270_set_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *val);
  78 +
74 79 LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint def);
75 80 LIB3270_EXPORT void pw3270_set_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint val);
76 81  
... ...
src/plugins/rx3270/pluginmain.cc
... ... @@ -27,8 +27,17 @@
27 27 *
28 28 */
29 29  
  30 + #define ENABLE_NLS
  31 + #define GETTEXT_PACKAGE PACKAGE_NAME
  32 +
30 33 #include "rx3270.h"
  34 +
  35 + #include <libintl.h>
  36 + #include <glib/gi18n.h>
  37 + #include <gtk/gtk.h>
  38 +
31 39 #include <string.h>
  40 + #include <pw3270.h>
32 41 #include <pw3270/plugin.h>
33 42 #include <pw3270/v3270.h>
34 43 #include <lib3270/actions.h>
... ... @@ -72,12 +81,16 @@
72 81  
73 82 };
74 83  
75   - static plugin * session = NULL;
  84 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  85 +
  86 + static plugin * session = NULL;
  87 + static GMutex mutex;
76 88  
77 89 /*--[ Implement ]------------------------------------------------------------------------------------*/
78 90  
79 91 LIB3270_EXPORT int pw3270_plugin_init(GtkWidget *window)
80 92 {
  93 + g_mutex_init(&mutex);
81 94 session = new plugin(lib3270_get_default_session_handle());
82 95 session->set_plugin();
83 96 trace("%s: Rexx object is %p",__FUNCTION__,session);
... ... @@ -91,6 +104,7 @@
91 104 delete session;
92 105 session = NULL;
93 106 }
  107 + g_mutex_clear(&mutex);
94 108 return 0;
95 109 }
96 110  
... ... @@ -203,12 +217,79 @@
203 217 extern "C"
204 218 {
205 219  
  220 + static void call_rexx_script(const gchar *filename)
  221 + {
  222 +
  223 + }
  224 +
206 225 LIB3270_EXPORT void pw3270_action_rexx_activated(GtkAction *action, GtkWidget *widget)
207 226 {
  227 + gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src");
  228 +
208 229 lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget);
209 230  
  231 + if(!g_mutex_trylock(&mutex))
  232 + {
  233 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  234 + GTK_DIALOG_DESTROY_WITH_PARENT,
  235 + GTK_MESSAGE_ERROR,
  236 + GTK_BUTTONS_CANCEL,
  237 + "%s", _( "Can't start script" ));
  238 +
  239 + gtk_window_set_title(GTK_WINDOW(dialog),_( "System busy" ));
  240 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",_( "Please, try again in a few moments" ));
  241 +
  242 + gtk_dialog_run(GTK_DIALOG (dialog));
  243 + gtk_widget_destroy(dialog);
  244 + return;
  245 + }
  246 +
  247 + gtk_action_set_sensitive(action,FALSE);
210 248  
  249 + if(filename)
  250 + {
  251 + // Has filename, call it directly
  252 + call_rexx_script(filename);
  253 + }
  254 + else
  255 + {
  256 + // No filename, ask user
  257 + static const struct _list
  258 + {
  259 + const gchar *name;
  260 + const gchar *pattern;
  261 + } list[] =
  262 + {
  263 + { N_( "Rexx script file" ), "*.rex" },
  264 + { N_( "Rexx class file" ), "*.cls" }
  265 + };
  266 +
  267 + GtkFileFilter * filter[G_N_ELEMENTS(list)+1];
  268 + unsigned int f;
  269 +
  270 + memset(filter,0,sizeof(filter));
  271 +
  272 + for(f=0;f<G_N_ELEMENTS(list);f++)
  273 + {
  274 + filter[f] = gtk_file_filter_new();
  275 + gtk_file_filter_set_name(filter[f],gettext(list[f].name));
  276 + gtk_file_filter_add_pattern(filter[f],list[f].pattern);
  277 + }
  278 +
  279 + filename = pw3270_get_filename(widget,"rexx","script",filter,_( "Select Rexx script to run" ));
  280 +
  281 + if(filename)
  282 + {
  283 + call_rexx_script(filename);
  284 + g_free(filename);
  285 + }
  286 +
  287 + }
  288 +
  289 + gtk_action_set_sensitive(action,TRUE);
  290 + g_mutex_unlock(&mutex);
211 291  
212 292 }
213 293  
214 294 }
  295 +
... ...
src/pw3270/tools.c
... ... @@ -105,11 +105,21 @@ LIB3270_EXPORT gint pw3270_get_integer(GtkWidget *widget, const gchar *group, co
105 105 return get_integer_from_config(group, key, def);
106 106 }
107 107  
  108 +LIB3270_EXPORT gchar * pw3270_get_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *def)
  109 +{
  110 + return get_string_from_config(group, key, def);
  111 +}
  112 +
108 113 LIB3270_EXPORT void pw3270_set_integer(GtkWidget *widget, const gchar *group, const gchar *key, gint val)
109 114 {
110 115 set_integer_to_config(group, key, val);
111 116 }
112 117  
  118 +LIB3270_EXPORT void pw3270_set_string(GtkWidget *widget, const gchar *group, const gchar *key, const gchar *val)
  119 +{
  120 + set_string_to_config(group, key, val);
  121 +}
  122 +
113 123 LIB3270_EXPORT gint pw3270_get_boolean(GtkWidget *widget, const gchar *group, const gchar *key, gint def)
114 124 {
115 125 return get_boolean_from_config(group, key, def);
... ... @@ -131,3 +141,47 @@ LIB3270_EXPORT gboolean pw3270_set_toggle_by_name(GtkWidget *widget, const gchar
131 141 lib3270_set_toggle(hSession,id,(int) flag);
132 142 return TRUE;
133 143 }
  144 +
  145 +LIB3270_EXPORT gchar * pw3270_get_filename(GtkWidget *widget, const gchar *group, const gchar *key, GtkFileFilter **filter, const gchar *title)
  146 +{
  147 + gchar * filename = NULL;
  148 + gchar * ptr;
  149 + GtkWidget * dialog = gtk_file_chooser_dialog_new( title,
  150 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  151 + GTK_FILE_CHOOSER_ACTION_OPEN,
  152 + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
  153 + GTK_STOCK_EXECUTE, GTK_RESPONSE_ACCEPT,
  154 + NULL );
  155 +
  156 + if(filter)
  157 + {
  158 + int f;
  159 +
  160 + for(f=0;filter[f];f++)
  161 + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter[f]);
  162 + }
  163 +
  164 + gtk_file_chooser_set_show_hidden(GTK_FILE_CHOOSER(dialog),FALSE);
  165 +
  166 + ptr = pw3270_get_string(widget,group,key,NULL);
  167 + if(ptr)
  168 + {
  169 + gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(dialog),ptr);
  170 + g_free(ptr);
  171 + }
  172 +
  173 + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
  174 + {
  175 + gchar *uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
  176 +
  177 + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
  178 +
  179 + pw3270_set_string(widget,group,key,uri);
  180 + g_free(uri);
  181 +
  182 + }
  183 +
  184 + gtk_widget_destroy(dialog);
  185 +
  186 + return filename;
  187 +}
... ...