Commit 3d6d26cdd90c0fbd5310fbffba851073bf26915e

Authored by perry.werneck@gmail.com
1 parent bf73e967

Incluindo suporte a macros na barra de botoes

src/pw3270/uiparser/button.c 0 → 100644
@@ -0,0 +1,136 @@ @@ -0,0 +1,136 @@
  1 +
  2 +/*
  3 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  4 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  5 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  6 + *
  7 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  8 + *
  9 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  10 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  11 + * Free Software Foundation.
  12 + *
  13 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  14 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  15 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  16 + * obter mais detalhes.
  17 + *
  18 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  19 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  20 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  21 + *
  22 + * Este programa está nomeado como button.c e possui - linhas de código.
  23 + *
  24 + * Contatos:
  25 + *
  26 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  27 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  28 + *
  29 + */
  30 +
  31 + #include "keypad.h"
  32 + #include <pw3270/v3270.h>
  33 +
  34 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  35 +
  36 +
  37 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  38 +
  39 + GtkReliefStyle ui_get_relief(const gchar **names, const gchar **values, GtkReliefStyle def)
  40 + {
  41 +
  42 + const gchar *name = ui_get_attribute("relief",names,values);
  43 + if(name)
  44 + {
  45 + static const struct _style
  46 + {
  47 + GtkReliefStyle val;
  48 + const gchar * name;
  49 + } style[] =
  50 + {
  51 + { GTK_RELIEF_NORMAL, "normal" },
  52 + { GTK_RELIEF_HALF, "half" },
  53 + { GTK_RELIEF_NONE, "none" }
  54 + };
  55 +
  56 + int f;
  57 +
  58 + for(f=0;f<G_N_ELEMENTS(style);f++)
  59 + {
  60 + if(!g_ascii_strcasecmp(style[f].name,name))
  61 + return style[f].val;
  62 + }
  63 + }
  64 +
  65 + return def;
  66 + }
  67 +
  68 + static void button_clicked(GtkButton *button, GtkAction *action)
  69 + {
  70 + gtk_action_activate(action);
  71 + }
  72 +
  73 + static void button_script(GtkButton *button, GtkWidget *widget)
  74 + {
  75 + v3270_run_script(widget,g_object_get_data(G_OBJECT(button),"script_text"));
  76 + }
  77 +
  78 + void keypad_button_start(GMarkupParseContext *context, const gchar **names,const gchar **values, GError **error, struct keypad *keypad)
  79 + {
  80 + const gchar * label = ui_get_attribute("label", names, values);
  81 + const gchar * icon = ui_get_attribute("icon", names, values);
  82 + const gchar * name = ui_get_attribute("action", names, values);
  83 + struct parser * info = keypad->parser;
  84 + GtkAction * action = NULL;
  85 + GtkWidget * widget = NULL;
  86 +
  87 + if(++keypad->col > keypad->num_cols)
  88 + keypad->num_cols = keypad->col;
  89 +
  90 + keypad->row->num_cols++;
  91 +
  92 + if(label)
  93 + {
  94 + widget = gtk_button_new_with_label(gettext(g_strcompress(label)));
  95 + }
  96 + else if(icon)
  97 + {
  98 + gchar *text = g_strconcat("gtk-",icon,NULL);
  99 + widget = gtk_button_new();
  100 + gtk_container_add(GTK_CONTAINER(widget),gtk_image_new_from_stock(text,GTK_ICON_SIZE_SMALL_TOOLBAR));
  101 + g_free(text);
  102 + }
  103 +
  104 + keypad->row->cols = g_list_append(keypad->row->cols,widget);
  105 +
  106 + if(!widget)
  107 + return;
  108 +
  109 +#if GTK_CHECK_VERSION(2,18,0)
  110 + gtk_widget_set_can_focus(widget,FALSE);
  111 + gtk_widget_set_can_default(widget,FALSE);
  112 +#else
  113 + GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_FOCUS);
  114 + GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_DEFAULT);
  115 +#endif // GTK(2,18)
  116 +
  117 + gtk_button_set_relief(GTK_BUTTON(widget),ui_get_relief(names, values, keypad->relief));
  118 + gtk_button_set_alignment(GTK_BUTTON(widget),0.5,0.5);
  119 + gtk_button_set_focus_on_click(GTK_BUTTON(widget),FALSE);
  120 +
  121 + if(name)
  122 + action = ui_get_action(info->center_widget,name,info->actions,names,values,error);
  123 +
  124 + if(action)
  125 + {
  126 + ui_action_set_options(action,info,names,values,error);
  127 + g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(button_clicked),action);
  128 + }
  129 + else
  130 + {
  131 + keypad->widget = widget;
  132 + gtk_widget_set_sensitive(widget,FALSE);
  133 + g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(button_script),info->center_widget);
  134 + }
  135 + }
  136 +
src/pw3270/uiparser/keypad.c
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin 18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19 * St, Fifth Floor, Boston, MA 02110-1301 USA 19 * St, Fifth Floor, Boston, MA 02110-1301 USA
20 * 20 *
21 - * Este programa está nomeado como accelerator.c e possui - linhas de código. 21 + * Este programa está nomeado como keypad.c e possui - linhas de código.
22 * 22 *
23 * Contatos: 23 * Contatos:
24 * 24 *
@@ -27,66 +27,11 @@ @@ -27,66 +27,11 @@
27 * 27 *
28 */ 28 */
29 29
30 - #include <gtk/gtk.h>  
31 - #include "private.h"  
32 -  
33 -/*--[ Globals ]--------------------------------------------------------------------------------------*/  
34 -  
35 - struct row  
36 - {  
37 - unsigned short pos;  
38 - unsigned short num_cols;  
39 - GList * cols;  
40 - };  
41 -  
42 - struct keypad  
43 - {  
44 - struct parser * parser;  
45 - unsigned short num_rows;  
46 - unsigned short num_cols;  
47 - unsigned short col;  
48 - unsigned short button_width;  
49 - struct row * row;  
50 - GtkWidget * box;  
51 - GtkWidget * handle;  
52 - GtkWidget * table;  
53 - GtkReliefStyle relief;  
54 - UI_ATTR_DIRECTION pos;  
55 - GList * rows;  
56 - }; 30 + #include "keypad.h"
57 31
58 /*--[ Implement ]------------------------------------------------------------------------------------*/ 32 /*--[ Implement ]------------------------------------------------------------------------------------*/
59 33
60 - static GtkReliefStyle get_relief(const gchar **names, const gchar **values, GtkReliefStyle def)  
61 - {  
62 -  
63 - const gchar *name = ui_get_attribute("relief",names,values);  
64 - if(name)  
65 - {  
66 - static const struct _style  
67 - {  
68 - GtkReliefStyle val;  
69 - const gchar * name;  
70 - } style[] =  
71 - {  
72 - { GTK_RELIEF_NORMAL, "normal" },  
73 - { GTK_RELIEF_HALF, "half" },  
74 - { GTK_RELIEF_NONE, "none" }  
75 - };  
76 -  
77 - int f;  
78 -  
79 - for(f=0;f<G_N_ELEMENTS(style);f++)  
80 - {  
81 - if(!g_strcasecmp(style[f].name,name))  
82 - return style[f].val;  
83 - }  
84 - }  
85 -  
86 - return def;  
87 - }  
88 -  
89 - static void row_start(struct keypad *keypad, const gchar **names,const gchar **values, GError **error) 34 + void keypad_row_start(GMarkupParseContext *context, const gchar **names,const gchar **values, GError **error, struct keypad *keypad)
90 { 35 {
91 keypad->row = g_malloc0(sizeof(struct row)); 36 keypad->row = g_malloc0(sizeof(struct row));
92 37
@@ -96,84 +41,16 @@ @@ -96,84 +41,16 @@
96 keypad->rows = g_list_append(keypad->rows,keypad->row); 41 keypad->rows = g_list_append(keypad->rows,keypad->row);
97 } 42 }
98 43
99 - static void button_clicked(GtkButton *button, GtkAction *action)  
100 - {  
101 - gtk_action_activate(action);  
102 - }  
103 -  
104 - static void button_start(struct keypad *keypad, const gchar **names,const gchar **values, GError **error)  
105 - {  
106 - const gchar * label = ui_get_attribute("label", names, values);  
107 - const gchar * icon = ui_get_attribute("icon", names, values);  
108 - const gchar * name = ui_get_attribute("action", names, values);  
109 - struct parser * info = keypad->parser;  
110 - GtkAction * action;  
111 - GtkWidget * widget = NULL;  
112 -  
113 - if(++keypad->col > keypad->num_cols)  
114 - keypad->num_cols = keypad->col;  
115 -  
116 - keypad->row->num_cols++;  
117 -  
118 - if(label)  
119 - {  
120 - widget = gtk_button_new_with_label(gettext(g_strcompress(label)));  
121 - }  
122 - else if(icon)  
123 - {  
124 - gchar *text = g_strconcat("gtk-",icon,NULL);  
125 - widget = gtk_button_new();  
126 - gtk_container_add(GTK_CONTAINER(widget),gtk_image_new_from_stock(text,GTK_ICON_SIZE_SMALL_TOOLBAR));  
127 - g_free(text);  
128 - }  
129 -  
130 - keypad->row->cols = g_list_append(keypad->row->cols,widget);  
131 -  
132 - if(!widget)  
133 - return;  
134 -  
135 -#if GTK_CHECK_VERSION(2,18,0)  
136 - gtk_widget_set_can_focus(widget,FALSE);  
137 - gtk_widget_set_can_default(widget,FALSE);  
138 -#else  
139 - GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_FOCUS);  
140 - GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_DEFAULT);  
141 -#endif // GTK(2,18)  
142 -  
143 - if(!name)  
144 - {  
145 - // Invalid unnamed element  
146 - *error = g_error_new(ERROR_DOMAIN,EINVAL,_( "Can't accept unnamed %s"),"button");  
147 - return;  
148 - }  
149 -  
150 - gtk_button_set_relief(GTK_BUTTON(widget),get_relief(names, values, keypad->relief));  
151 - gtk_button_set_alignment(GTK_BUTTON(widget),0.5,0.5);  
152 - gtk_button_set_focus_on_click(GTK_BUTTON(widget),FALSE);  
153 -  
154 - action = ui_get_action(info->center_widget,name,info->actions,names,values,error);  
155 -  
156 - if(action)  
157 - {  
158 - ui_action_set_options(action,info,names,values,error);  
159 - g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(button_clicked),action);  
160 - }  
161 - else  
162 - {  
163 - gtk_widget_set_sensitive(widget,FALSE);  
164 - }  
165 - }  
166 -  
167 static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct keypad *keypad, GError **error) 44 static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct keypad *keypad, GError **error)
168 { 45 {
169 static const struct _cmd 46 static const struct _cmd
170 { 47 {
171 const gchar *element_name; 48 const gchar *element_name;
172 - void (*start)(struct keypad *, const gchar **, const gchar **, GError **); 49 + void (*start)(GMarkupParseContext *, const gchar **,const gchar **, GError **, struct keypad *);
173 } cmd[] = 50 } cmd[] =
174 { 51 {
175 - { "row", row_start },  
176 - { "button", button_start }, 52 + { "row", keypad_row_start },
  53 + { "button", keypad_button_start },
177 }; 54 };
178 55
179 int f; 56 int f;
@@ -182,7 +59,7 @@ @@ -182,7 +59,7 @@
182 { 59 {
183 if(!g_strcasecmp(cmd[f].element_name,element_name)) 60 if(!g_strcasecmp(cmd[f].element_name,element_name))
184 { 61 {
185 - cmd[f].start(keypad,names,values,error); 62 + cmd[f].start(context,names,values,error,keypad);
186 return; 63 return;
187 } 64 }
188 } 65 }
@@ -191,7 +68,8 @@ @@ -191,7 +68,8 @@
191 } 68 }
192 69
193 static void element_end(GMarkupParseContext *context, const gchar *element_name, struct keypad *keypad, GError **error) 70 static void element_end(GMarkupParseContext *context, const gchar *element_name, struct keypad *keypad, GError **error)
194 - { 71 + {
  72 + keypad->widget = NULL;
195 // trace("%s: %s",__FUNCTION__,element_name); 73 // trace("%s: %s",__FUNCTION__,element_name);
196 } 74 }
197 75
@@ -227,6 +105,28 @@ @@ -227,6 +105,28 @@
227 105
228 return UI_ATTR_DIRECTION_NONE; 106 return UI_ATTR_DIRECTION_NONE;
229 } 107 }
  108 +
  109 + static void element_text(GMarkupParseContext *context, const gchar *text, gsize sz, struct keypad *keypad, GError **error)
  110 + {
  111 + if(keypad->widget)
  112 + {
  113 + gchar *base = g_strstrip(g_strdup(text));
  114 + gchar *text = g_strdup(base);
  115 + g_free(base);
  116 +
  117 + if(*text)
  118 + {
  119 + gtk_widget_set_sensitive(keypad->widget,TRUE);
  120 + g_object_set_data_full(G_OBJECT(keypad->widget),"script_text",text,g_free);
  121 + }
  122 + else
  123 + {
  124 + g_free(text);
  125 + }
  126 +
  127 + }
  128 +
  129 + }
230 130
231 GObject * ui_create_keypad(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error) 131 GObject * ui_create_keypad(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error)
232 { 132 {
@@ -237,7 +137,7 @@ @@ -237,7 +137,7 @@
237 (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) 137 (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **))
238 element_end, 138 element_end,
239 (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) 139 (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **))
240 - NULL, 140 + element_text,
241 141
242 // (void (*)(GMarkupParseContext *, GError *, gpointer)) 142 // (void (*)(GMarkupParseContext *, GError *, gpointer))
243 NULL 143 NULL
@@ -264,7 +164,7 @@ @@ -264,7 +164,7 @@
264 keypad->parser = info; 164 keypad->parser = info;
265 keypad->handle = gtk_handle_box_new(); 165 keypad->handle = gtk_handle_box_new();
266 keypad->pos = ui_get_position_attribute(names,values); 166 keypad->pos = ui_get_position_attribute(names,values);
267 - keypad->relief = get_relief(names, values, GTK_RELIEF_NORMAL); 167 + keypad->relief = ui_get_relief(names, values, GTK_RELIEF_NORMAL);
268 168
269 switch(keypad->pos) 169 switch(keypad->pos)
270 { 170 {
@@ -350,7 +250,7 @@ @@ -350,7 +250,7 @@
350 keypad->col = 0; 250 keypad->col = 0;
351 keypad->button_width = keypad->num_cols / info->num_cols; 251 keypad->button_width = keypad->num_cols / info->num_cols;
352 252
353 - trace("Max cols=%d row cols=%d width=%d",keypad->num_cols,info->num_cols,keypad->button_width); 253 +// trace("Max cols=%d row cols=%d width=%d",keypad->num_cols,info->num_cols,keypad->button_width);
354 254
355 g_list_foreach(info->cols,(GFunc) create_col,keypad); 255 g_list_foreach(info->cols,(GFunc) create_col,keypad);
356 g_list_free(info->cols); 256 g_list_free(info->cols);
src/pw3270/uiparser/keypad.h 0 → 100644
@@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como keypad.h e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 +
  31 + #include <gtk/gtk.h>
  32 + #include "private.h"
  33 +
  34 +/*--[ Globals ]--------------------------------------------------------------------------------------*/
  35 +
  36 + struct row
  37 + {
  38 + unsigned short pos;
  39 + unsigned short num_cols;
  40 + GList * cols;
  41 + };
  42 +
  43 + struct keypad
  44 + {
  45 + struct parser * parser;
  46 + unsigned short num_rows;
  47 + unsigned short num_cols;
  48 + unsigned short col;
  49 + unsigned short button_width;
  50 + struct row * row;
  51 + GtkWidget * box;
  52 + GtkWidget * handle;
  53 + GtkWidget * table;
  54 + GtkReliefStyle relief;
  55 + UI_ATTR_DIRECTION pos;
  56 + GList * rows;
  57 +
  58 + GtkWidget * widget;
  59 +
  60 + };
  61 +
  62 + G_GNUC_INTERNAL void keypad_button_start(GMarkupParseContext *context, const gchar **names,const gchar **values, GError **error, struct keypad *keypad);
src/pw3270/uiparser/private.h
@@ -93,6 +93,8 @@ @@ -93,6 +93,8 @@
93 93
94 int ui_parse_file(struct parser *info, const gchar *filename); 94 int ui_parse_file(struct parser *info, const gchar *filename);
95 void ui_action_set_options(GtkAction *action, struct parser *info, const gchar **names, const gchar **values, GError **error); 95 void ui_action_set_options(GtkAction *action, struct parser *info, const gchar **names, const gchar **values, GError **error);
  96 +
  97 + G_GNUC_INTERNAL GtkReliefStyle ui_get_relief(const gchar **names, const gchar **values, GtkReliefStyle def);
96 98
97 GObject * ui_get_element(struct parser *info, GtkAction *action, enum ui_element id, const gchar **names, const gchar **values, GError **error); 99 GObject * ui_get_element(struct parser *info, GtkAction *action, enum ui_element id, const gchar **names, const gchar **values, GError **error);
98 GObject * ui_insert_element(struct parser *info, GtkAction *action, enum ui_element id, const gchar **names, const gchar **values, GObject *widget, GError **error); 100 GObject * ui_insert_element(struct parser *info, GtkAction *action, enum ui_element id, const gchar **names, const gchar **values, GObject *widget, GError **error);
src/pw3270/uiparser/sources.mak
1 UI_PARSER_SRC=accelerator.c action.c menubar.c menu.c menuitem.c parser.c \ 1 UI_PARSER_SRC=accelerator.c action.c menubar.c menu.c menuitem.c parser.c \
2 parsefile.c separator.c toolbar.c toolitem.c popup.c script.c \ 2 parsefile.c separator.c toolbar.c toolitem.c popup.c script.c \
3 - scroll.c keypad.c 3 + scroll.c keypad.c button.c
4 4
5 5