Commit 327d269c4fdbb6126a4b0b645ec43bdee91c93f4

Authored by perry.werneck@gmail.com
1 parent 932d75df

Iniciando reimplementacao dos "keypads"

@@ -155,6 +155,7 @@ Section /o "Software Development Kit" SecSDK @@ -155,6 +155,7 @@ Section /o "Software Development Kit" SecSDK
155 file "/oname=$INSTDIR\sdk\include\lib3270.h" "src\include\lib3270.h" 155 file "/oname=$INSTDIR\sdk\include\lib3270.h" "src\include\lib3270.h"
156 file "/oname=$INSTDIR\sdk\include\pw3270.h" "src\include\pw3270.h" 156 file "/oname=$INSTDIR\sdk\include\pw3270.h" "src\include\pw3270.h"
157 file "/oname=$INSTDIR\sdk\include\pw3270\v3270.h" "src\include\pw3270\v3270.h" 157 file "/oname=$INSTDIR\sdk\include\pw3270\v3270.h" "src\include\pw3270\v3270.h"
  158 + file "/oname=$INSTDIR\sdk\include\pw3270\hllapi.h" "src\include\pw3270\hllapi.h"
158 159
159 file "/oname=$INSTDIR\sdk\include\lib3270\config.h" "src\include\lib3270\config.h" 160 file "/oname=$INSTDIR\sdk\include\lib3270\config.h" "src\include\lib3270\config.h"
160 file "/oname=$INSTDIR\sdk\include\lib3270\rules.mak" "src\include\rules.mak" 161 file "/oname=$INSTDIR\sdk\include\lib3270\rules.mak" "src\include\rules.mak"
src/pw3270/uiparser/keypad.c
@@ -30,16 +30,96 @@ @@ -30,16 +30,96 @@
30 #include <gtk/gtk.h> 30 #include <gtk/gtk.h>
31 #include "private.h" 31 #include "private.h"
32 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 + struct row * row;
  49 + GtkWidget * box;
  50 + GtkWidget * handle;
  51 + GtkWidget * table;
  52 + UI_ATTR_DIRECTION pos;
  53 + GList * rows;
  54 + };
  55 +
33 /*--[ Implement ]------------------------------------------------------------------------------------*/ 56 /*--[ Implement ]------------------------------------------------------------------------------------*/
34 57
35 - static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct parser *info, GError **error) 58 + static void row_start(struct keypad *keypad, const gchar **names,const gchar **values, GError **error)
  59 + {
  60 + keypad->row = g_malloc0(sizeof(struct row));
  61 +
  62 + keypad->row->pos = ++keypad->num_rows;
  63 + keypad->col = 0;
  64 +
  65 + keypad->rows = g_list_append(keypad->rows,keypad->row);
  66 + }
  67 +
  68 + static void button_start(struct keypad *keypad, const gchar **names,const gchar **values, GError **error)
  69 + {
  70 + const gchar *label = ui_get_attribute("label", names, values);
  71 + const gchar *icon = ui_get_attribute("icon", names, values);
  72 + GtkWidget *widget = NULL;
  73 +
  74 + if(++keypad->col > keypad->num_cols)
  75 + keypad->num_cols = keypad->col;
  76 +
  77 + keypad->row->num_cols++;
  78 +
  79 + if(label)
  80 + {
  81 + widget = gtk_button_new_with_label(gettext(g_strcompress(label)));
  82 + }
  83 + else if(icon)
  84 + {
  85 + gchar *text = g_strconcat("gtk-",icon,NULL);
  86 + widget = gtk_button_new();
  87 + gtk_container_add(GTK_CONTAINER(widget),gtk_image_new_from_stock(text,GTK_ICON_SIZE_SMALL_TOOLBAR));
  88 + g_free(text);
  89 + }
  90 +
  91 + keypad->row->cols = g_list_append(keypad->row->cols,widget);
  92 + }
  93 +
  94 + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct keypad *keypad, GError **error)
36 { 95 {
37 - trace("%s: %s",__FUNCTION__,element_name); 96 + static const struct _cmd
  97 + {
  98 + const gchar *element_name;
  99 + void (*start)(struct keypad *, const gchar **, const gchar **, GError **);
  100 + } cmd[] =
  101 + {
  102 + { "row", row_start },
  103 + { "button", button_start },
  104 + };
  105 +
  106 + int f;
  107 +
  108 + for(f = 0; f < G_N_ELEMENTS(cmd); f++)
  109 + {
  110 + if(!g_strcasecmp(cmd[f].element_name,element_name))
  111 + {
  112 + cmd[f].start(keypad,names,values,error);
  113 + return;
  114 + }
  115 + }
  116 +
  117 + *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "Unexpected element <%s>"), element_name);
38 } 118 }
39 119
40 - static void element_end(GMarkupParseContext *context, const gchar *element_name, struct parser *info, GError **error) 120 + static void element_end(GMarkupParseContext *context, const gchar *element_name, struct keypad *keypad, GError **error)
41 { 121 {
42 - trace("%s: %s",__FUNCTION__,element_name); 122 +// trace("%s: %s",__FUNCTION__,element_name);
43 } 123 }
44 124
45 GObject * ui_create_keypad(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error) 125 GObject * ui_create_keypad(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error)
@@ -58,6 +138,11 @@ @@ -58,6 +138,11 @@
58 138
59 }; 139 };
60 140
  141 + const gchar *label = ui_get_attribute("label", names, values);
  142 + const gchar *name = ui_get_attribute("name", names, values);
  143 +
  144 + struct keypad *keypad;
  145 +
61 if(info->element) 146 if(info->element)
62 { 147 {
63 *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "<%s> should be on toplevel"), "keypad"); 148 *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "<%s> should be on toplevel"), "keypad");
@@ -70,13 +155,107 @@ @@ -70,13 +155,107 @@
70 return NULL; 155 return NULL;
71 } 156 }
72 157
73 - g_markup_parse_context_push(context,(GMarkupParser *) &parser,info); 158 + info->block_data = keypad = g_malloc0(sizeof(struct keypad));
  159 +
  160 + keypad->parser = info;
  161 + keypad->handle = gtk_handle_box_new();
  162 + keypad->pos = ui_get_dir_attribute(names,values);
74 163
75 - return NULL; 164 + switch(keypad->pos)
  165 + {
  166 + case UI_ATTR_UP:
  167 + keypad->box = gtk_vbox_new(FALSE,0);
  168 + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_BOTTOM);
  169 + break;
  170 +
  171 + case UI_ATTR_DOWN:
  172 + keypad->box = gtk_vbox_new(FALSE,0);
  173 + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_TOP);
  174 + break;
  175 +
  176 + case UI_ATTR_LEFT:
  177 + keypad->box = gtk_hbox_new(FALSE,0);
  178 + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_RIGHT);
  179 + break;
  180 +
  181 + default:
  182 + keypad->pos = UI_ATTR_RIGHT;
  183 + keypad->box = gtk_hbox_new(FALSE,0);
  184 + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_LEFT);
  185 +
  186 + }
  187 +
  188 + if(name)
  189 + gtk_widget_set_name(keypad->handle,name);
  190 +
  191 + if(label)
  192 + g_object_set_data_full(G_OBJECT(keypad->handle),"keypad_label",g_strdup(label),g_free);
  193 +
  194 + gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(keypad->handle),GTK_SHADOW_ETCHED_IN);
  195 + gtk_container_add(GTK_CONTAINER(keypad->handle),keypad->box);
  196 +
  197 + g_markup_parse_context_push(context,(GMarkupParser *) &parser,keypad);
  198 +
  199 + return G_OBJECT(ui_insert_element(info, action, UI_ELEMENT_KEYPAD, names, values, G_OBJECT(keypad->handle), error));
  200 + }
  201 +
  202 + static void create_col(GtkWidget *widget, struct keypad *keypad)
  203 + {
  204 + if(widget)
  205 + {
  206 + gtk_widget_show_all(widget);
  207 + gtk_table_attach( GTK_TABLE(keypad->table),
  208 + widget,
  209 + keypad->num_cols,keypad->num_cols+1,
  210 + keypad->num_rows,keypad->num_rows+1,
  211 + GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,0,0 );
  212 +
  213 + }
  214 + keypad->num_cols++;
  215 +
  216 + }
  217 +
  218 + static void create_row(struct row *info, struct keypad *keypad)
  219 + {
  220 + if(info->cols)
  221 + {
  222 + keypad->num_cols = 0;
  223 + g_list_foreach(info->cols,(GFunc) create_col,keypad);
  224 + g_list_free(info->cols);
  225 + }
  226 + keypad->num_rows++;
76 } 227 }
77 228
78 void ui_end_keypad(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error) 229 void ui_end_keypad(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error)
79 { 230 {
  231 + struct keypad *keypad = (struct keypad *) info->block_data;
  232 + info->block_data = NULL;
  233 +
  234 + keypad->num_cols *= 2;
  235 +
  236 + if(keypad->rows)
  237 + {
  238 + // Create Widgets & Release memory
  239 + keypad->table = gtk_table_new(keypad->num_rows,keypad->num_cols,FALSE);
  240 +
  241 +#if GTK_CHECK_VERSION(2,18,0)
  242 + gtk_widget_set_can_focus(keypad->table,FALSE);
  243 + gtk_widget_set_can_default(keypad->table,FALSE);
  244 +#else
  245 + GTK_WIDGET_UNSET_FLAGS(keypad->table,GTK_CAN_FOCUS);
  246 + GTK_WIDGET_UNSET_FLAGS(keypad->table,GTK_CAN_DEFAULT);
  247 +#endif // GTK(2,18)
  248 +
  249 + keypad->num_cols = keypad->num_rows = 0;
  250 + g_list_foreach(keypad->rows,(GFunc) create_row,keypad);
  251 + g_list_free_full(keypad->rows,g_free);
  252 + gtk_box_pack_start(GTK_BOX(keypad->box),keypad->table,FALSE,FALSE,0);
  253 +
  254 + gtk_widget_show_all(keypad->box);
  255 + gtk_widget_show_all(keypad->table);
  256 + gtk_widget_show_all(keypad->handle);
  257 + }
80 258
  259 + g_free(keypad);
81 g_markup_parse_context_pop(context); 260 g_markup_parse_context_pop(context);
82 } 261 }
src/pw3270/uiparser/parser.c
@@ -73,6 +73,22 @@ static void pack_start(gpointer key, GtkWidget *widget, struct parser *p) @@ -73,6 +73,22 @@ static void pack_start(gpointer key, GtkWidget *widget, struct parser *p)
73 gtk_box_pack_start(GTK_BOX(p->element),widget,FALSE,FALSE,0); 73 gtk_box_pack_start(GTK_BOX(p->element),widget,FALSE,FALSE,0);
74 } 74 }
75 75
  76 +struct keypad
  77 +{
  78 + GtkWidget * box;
  79 + GtkPositionType filter;
  80 + void (*pack)(GtkBox *,GtkWidget *, gboolean,gboolean,guint);
  81 +};
  82 +
  83 +static void pack_keypad(gpointer key, GtkWidget *widget, struct keypad *k)
  84 +{
  85 + if(gtk_handle_box_get_handle_position(GTK_HANDLE_BOX(widget)) != k->filter)
  86 + return;
  87 +
  88 + gtk_widget_show_all(widget);
  89 + k->pack(GTK_BOX(k->box),widget,FALSE,FALSE,0);
  90 +}
  91 +
76 static void pack_view(gpointer key, GtkWidget *widget, GtkWidget *parent) 92 static void pack_view(gpointer key, GtkWidget *widget, GtkWidget *parent)
77 { 93 {
78 GObject *obj = g_object_get_data(G_OBJECT(widget),"view_action"); 94 GObject *obj = g_object_get_data(G_OBJECT(widget),"view_action");
@@ -116,7 +132,6 @@ struct action_info @@ -116,7 +132,6 @@ struct action_info
116 GtkWidget * widget; 132 GtkWidget * widget;
117 }; 133 };
118 134
119 -  
120 static void action_group_setup(gpointer key, GtkAction *action, struct action_info *info) 135 static void action_group_setup(gpointer key, GtkAction *action, struct action_info *info)
121 { 136 {
122 int group_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action),"id_group")); 137 int group_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action),"id_group"));
@@ -175,11 +190,14 @@ void parser_build(struct parser *p, GtkWidget *widget) @@ -175,11 +190,14 @@ void parser_build(struct parser *p, GtkWidget *widget)
175 190
176 #if GTK_CHECK_VERSION(3,0,0) 191 #if GTK_CHECK_VERSION(3,0,0)
177 GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); 192 GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
  193 + GtkWidget * hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
178 #else 194 #else
179 GtkWidget * vbox = gtk_vbox_new(FALSE,0); 195 GtkWidget * vbox = gtk_vbox_new(FALSE,0);
  196 + GtkWidget * hbox = gtk_hbox_new(FALSE,0);
180 #endif // GTK(3,0,0) 197 #endif // GTK(3,0,0)
181 198
182 GtkWidget * parent; 199 GtkWidget * parent;
  200 + struct keypad keypad;
183 int f; 201 int f;
184 202
185 a_info.widget = widget; 203 a_info.widget = widget;
@@ -211,20 +229,42 @@ void parser_build(struct parser *p, GtkWidget *widget) @@ -211,20 +229,42 @@ void parser_build(struct parser *p, GtkWidget *widget)
211 // Pack top toolbars 229 // Pack top toolbars
212 g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p); 230 g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p);
213 231
  232 + // Pack top keypads
  233 + memset(&keypad,0,sizeof(keypad));
  234 + keypad.box = vbox;
  235 + keypad.filter = GTK_POS_BOTTOM;
  236 + keypad.pack = gtk_box_pack_start;
  237 + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad);
  238 +
  239 +
  240 + // Pack left keypads
  241 + keypad.box = hbox;
  242 + keypad.filter = GTK_POS_RIGHT;
  243 + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad);
  244 +
214 // Pack & configure center widget 245 // Pack & configure center widget
215 if(widget) 246 if(widget)
216 { 247 {
217 ui_set_scroll_actions(widget,p->scroll_action); 248 ui_set_scroll_actions(widget,p->scroll_action);
218 - gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); 249 + gtk_box_pack_start(GTK_BOX(hbox),widget,TRUE,TRUE,0);
219 gtk_widget_show(widget); 250 gtk_widget_show(widget);
220 } 251 }
221 252
  253 + // Pack right keypads
  254 + keypad.filter = GTK_POS_LEFT;
  255 + keypad.pack = gtk_box_pack_end;
  256 + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad);
222 257
223 -// gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); 258 + // Pack bottom keypads
  259 + keypad.box = vbox;
  260 + keypad.filter = GTK_POS_TOP;
  261 + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad);
224 262
  263 + // Finish building
  264 + gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0);
225 gtk_container_add(GTK_CONTAINER(p->toplevel),vbox); 265 gtk_container_add(GTK_CONTAINER(p->toplevel),vbox);
226 266
227 -// gtk_widget_show(hbox); 267 + gtk_widget_show(hbox);
228 gtk_widget_show(vbox); 268 gtk_widget_show(vbox);
229 269
230 gtk_window_add_accel_group(GTK_WINDOW(p->toplevel),a_info.accel_group); 270 gtk_window_add_accel_group(GTK_WINDOW(p->toplevel),a_info.accel_group);
src/pw3270/uiparser/private.h
@@ -85,6 +85,7 @@ @@ -85,6 +85,7 @@
85 #ifdef HAVE_GTKMAC 85 #ifdef HAVE_GTKMAC
86 GtkWidget * sysmenu[SYSMENU_ITEM_COUNT]; 86 GtkWidget * sysmenu[SYSMENU_ITEM_COUNT];
87 #endif // HAVE_GTKMAC 87 #endif // HAVE_GTKMAC
  88 + void * block_data;
88 }; 89 };
89 90
90 int ui_parse_file(struct parser *info, const gchar *filename); 91 int ui_parse_file(struct parser *info, const gchar *filename);
ui/00default.xml
@@ -188,7 +188,7 @@ @@ -188,7 +188,7 @@
188 <separator /> 188 <separator />
189 <menuitem action='previousfield' label='Previous field' /> 189 <menuitem action='previousfield' label='Previous field' />
190 <menuitem action='nextfield' label='Next field'/> 190 <menuitem action='nextfield' label='Next field'/>
191 - <menuitem name="return" action='activate' label='Return' key='Return' /> 191 + <menuitem name="return" action='activate' label='Return' />
192 192
193 <separator /> 193 <separator />
194 <menuitem action='Quit'/> 194 <menuitem action='Quit'/>
@@ -206,7 +206,7 @@ @@ -206,7 +206,7 @@
206 206
207 <accelerator action='firstfield' key='Home' group='online' /> 207 <accelerator action='firstfield' key='Home' group='online' />
208 <accelerator action='kybdreset' key='<Shift><Ctrl>r' group='online' /> 208 <accelerator action='kybdreset' key='<Shift><Ctrl>r' group='online' />
209 - <accelerator name="return" action='activate' key='return' /> 209 + <!-- accelerator name="return" action='activate' key='Enter' --->
210 <accelerator name="KP_enter" action='activate' key='KP_Enter' /> 210 <accelerator name="KP_enter" action='activate' key='KP_Enter' />
211 <accelerator action='Break' key='Escape' group='online' /> 211 <accelerator action='Break' key='Escape' group='online' />
212 <accelerator action='Attn' key='<shift>Escape' group='online' /> 212 <accelerator action='Attn' key='<shift>Escape' group='online' />
ui/10keypad.xml
@@ -54,17 +54,17 @@ @@ -54,17 +54,17 @@
54 </row> 54 </row>
55 <row> 55 <row>
56 <button /> 56 <button />
57 - <button action="CursorUp" icon="go-up" /> 57 + <button action='move' target='cursor' direction='up' icon="go-up" />
58 <button /> 58 <button />
59 </row> 59 </row>
60 <row> 60 <row>
61 - <button action="CursorLeft" icon="go-back" />  
62 - <button action="Home" icon="goto-top" />  
63 - <button action="CursorRight" icon="go-forward" /> 61 + <button action='move' target='cursor' direction='left' icon="go-back" />
  62 + <button action="firstfield" icon="goto-top" />
  63 + <button action='move' target='cursor' direction='right' icon="go-forward" />
64 </row> 64 </row>
65 <row> 65 <row>
66 <button /> 66 <button />
67 - <button action="CursorDown" icon="go-down"/> 67 + <button action='move' target='cursor' direction='down' icon="go-down"/>
68 <button /> 68 <button />
69 </row> 69 </row>
70 <row> 70 <row>