From 327d269c4fdbb6126a4b0b645ec43bdee91c93f4 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Wed, 19 Sep 2012 20:14:28 +0000 Subject: [PATCH] Iniciando reimplementacao dos "keypads" --- pw3270.nsi.in | 1 + src/pw3270/uiparser/keypad.c | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ src/pw3270/uiparser/parser.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- src/pw3270/uiparser/private.h | 1 + ui/00default.xml | 4 ++-- ui/10keypad.xml | 10 +++++----- 6 files changed, 238 insertions(+), 17 deletions(-) diff --git a/pw3270.nsi.in b/pw3270.nsi.in index 3d4385b..2ba51a1 100644 --- a/pw3270.nsi.in +++ b/pw3270.nsi.in @@ -155,6 +155,7 @@ Section /o "Software Development Kit" SecSDK file "/oname=$INSTDIR\sdk\include\lib3270.h" "src\include\lib3270.h" file "/oname=$INSTDIR\sdk\include\pw3270.h" "src\include\pw3270.h" file "/oname=$INSTDIR\sdk\include\pw3270\v3270.h" "src\include\pw3270\v3270.h" + file "/oname=$INSTDIR\sdk\include\pw3270\hllapi.h" "src\include\pw3270\hllapi.h" file "/oname=$INSTDIR\sdk\include\lib3270\config.h" "src\include\lib3270\config.h" file "/oname=$INSTDIR\sdk\include\lib3270\rules.mak" "src\include\rules.mak" diff --git a/src/pw3270/uiparser/keypad.c b/src/pw3270/uiparser/keypad.c index 71c7cf5..f9c2ea3 100644 --- a/src/pw3270/uiparser/keypad.c +++ b/src/pw3270/uiparser/keypad.c @@ -30,16 +30,96 @@ #include #include "private.h" +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + struct row + { + unsigned short pos; + unsigned short num_cols; + GList * cols; + }; + + struct keypad + { + struct parser * parser; + unsigned short num_rows; + unsigned short num_cols; + unsigned short col; + struct row * row; + GtkWidget * box; + GtkWidget * handle; + GtkWidget * table; + UI_ATTR_DIRECTION pos; + GList * rows; + }; + /*--[ Implement ]------------------------------------------------------------------------------------*/ - static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct parser *info, GError **error) + static void row_start(struct keypad *keypad, const gchar **names,const gchar **values, GError **error) + { + keypad->row = g_malloc0(sizeof(struct row)); + + keypad->row->pos = ++keypad->num_rows; + keypad->col = 0; + + keypad->rows = g_list_append(keypad->rows,keypad->row); + } + + static void button_start(struct keypad *keypad, const gchar **names,const gchar **values, GError **error) + { + const gchar *label = ui_get_attribute("label", names, values); + const gchar *icon = ui_get_attribute("icon", names, values); + GtkWidget *widget = NULL; + + if(++keypad->col > keypad->num_cols) + keypad->num_cols = keypad->col; + + keypad->row->num_cols++; + + if(label) + { + widget = gtk_button_new_with_label(gettext(g_strcompress(label))); + } + else if(icon) + { + gchar *text = g_strconcat("gtk-",icon,NULL); + widget = gtk_button_new(); + gtk_container_add(GTK_CONTAINER(widget),gtk_image_new_from_stock(text,GTK_ICON_SIZE_SMALL_TOOLBAR)); + g_free(text); + } + + keypad->row->cols = g_list_append(keypad->row->cols,widget); + } + + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct keypad *keypad, GError **error) { - trace("%s: %s",__FUNCTION__,element_name); + static const struct _cmd + { + const gchar *element_name; + void (*start)(struct keypad *, const gchar **, const gchar **, GError **); + } cmd[] = + { + { "row", row_start }, + { "button", button_start }, + }; + + int f; + + for(f = 0; f < G_N_ELEMENTS(cmd); f++) + { + if(!g_strcasecmp(cmd[f].element_name,element_name)) + { + cmd[f].start(keypad,names,values,error); + return; + } + } + + *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "Unexpected element <%s>"), element_name); } - static void element_end(GMarkupParseContext *context, const gchar *element_name, struct parser *info, GError **error) + static void element_end(GMarkupParseContext *context, const gchar *element_name, struct keypad *keypad, GError **error) { - trace("%s: %s",__FUNCTION__,element_name); +// trace("%s: %s",__FUNCTION__,element_name); } GObject * ui_create_keypad(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error) @@ -58,6 +138,11 @@ }; + const gchar *label = ui_get_attribute("label", names, values); + const gchar *name = ui_get_attribute("name", names, values); + + struct keypad *keypad; + if(info->element) { *error = g_error_new(ERROR_DOMAIN,EINVAL, _( "<%s> should be on toplevel"), "keypad"); @@ -70,13 +155,107 @@ return NULL; } - g_markup_parse_context_push(context,(GMarkupParser *) &parser,info); + info->block_data = keypad = g_malloc0(sizeof(struct keypad)); + + keypad->parser = info; + keypad->handle = gtk_handle_box_new(); + keypad->pos = ui_get_dir_attribute(names,values); - return NULL; + switch(keypad->pos) + { + case UI_ATTR_UP: + keypad->box = gtk_vbox_new(FALSE,0); + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_BOTTOM); + break; + + case UI_ATTR_DOWN: + keypad->box = gtk_vbox_new(FALSE,0); + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_TOP); + break; + + case UI_ATTR_LEFT: + keypad->box = gtk_hbox_new(FALSE,0); + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_RIGHT); + break; + + default: + keypad->pos = UI_ATTR_RIGHT; + keypad->box = gtk_hbox_new(FALSE,0); + gtk_handle_box_set_handle_position(GTK_HANDLE_BOX(keypad->handle),GTK_POS_LEFT); + + } + + if(name) + gtk_widget_set_name(keypad->handle,name); + + if(label) + g_object_set_data_full(G_OBJECT(keypad->handle),"keypad_label",g_strdup(label),g_free); + + gtk_handle_box_set_shadow_type(GTK_HANDLE_BOX(keypad->handle),GTK_SHADOW_ETCHED_IN); + gtk_container_add(GTK_CONTAINER(keypad->handle),keypad->box); + + g_markup_parse_context_push(context,(GMarkupParser *) &parser,keypad); + + return G_OBJECT(ui_insert_element(info, action, UI_ELEMENT_KEYPAD, names, values, G_OBJECT(keypad->handle), error)); + } + + static void create_col(GtkWidget *widget, struct keypad *keypad) + { + if(widget) + { + gtk_widget_show_all(widget); + gtk_table_attach( GTK_TABLE(keypad->table), + widget, + keypad->num_cols,keypad->num_cols+1, + keypad->num_rows,keypad->num_rows+1, + GTK_EXPAND|GTK_FILL,GTK_EXPAND|GTK_FILL,0,0 ); + + } + keypad->num_cols++; + + } + + static void create_row(struct row *info, struct keypad *keypad) + { + if(info->cols) + { + keypad->num_cols = 0; + g_list_foreach(info->cols,(GFunc) create_col,keypad); + g_list_free(info->cols); + } + keypad->num_rows++; } void ui_end_keypad(GMarkupParseContext *context,GObject *widget,struct parser *info,GError **error) { + struct keypad *keypad = (struct keypad *) info->block_data; + info->block_data = NULL; + + keypad->num_cols *= 2; + + if(keypad->rows) + { + // Create Widgets & Release memory + keypad->table = gtk_table_new(keypad->num_rows,keypad->num_cols,FALSE); + +#if GTK_CHECK_VERSION(2,18,0) + gtk_widget_set_can_focus(keypad->table,FALSE); + gtk_widget_set_can_default(keypad->table,FALSE); +#else + GTK_WIDGET_UNSET_FLAGS(keypad->table,GTK_CAN_FOCUS); + GTK_WIDGET_UNSET_FLAGS(keypad->table,GTK_CAN_DEFAULT); +#endif // GTK(2,18) + + keypad->num_cols = keypad->num_rows = 0; + g_list_foreach(keypad->rows,(GFunc) create_row,keypad); + g_list_free_full(keypad->rows,g_free); + gtk_box_pack_start(GTK_BOX(keypad->box),keypad->table,FALSE,FALSE,0); + + gtk_widget_show_all(keypad->box); + gtk_widget_show_all(keypad->table); + gtk_widget_show_all(keypad->handle); + } + g_free(keypad); g_markup_parse_context_pop(context); } diff --git a/src/pw3270/uiparser/parser.c b/src/pw3270/uiparser/parser.c index a75689e..f4816fe 100644 --- a/src/pw3270/uiparser/parser.c +++ b/src/pw3270/uiparser/parser.c @@ -73,6 +73,22 @@ static void pack_start(gpointer key, GtkWidget *widget, struct parser *p) gtk_box_pack_start(GTK_BOX(p->element),widget,FALSE,FALSE,0); } +struct keypad +{ + GtkWidget * box; + GtkPositionType filter; + void (*pack)(GtkBox *,GtkWidget *, gboolean,gboolean,guint); +}; + +static void pack_keypad(gpointer key, GtkWidget *widget, struct keypad *k) +{ + if(gtk_handle_box_get_handle_position(GTK_HANDLE_BOX(widget)) != k->filter) + return; + + gtk_widget_show_all(widget); + k->pack(GTK_BOX(k->box),widget,FALSE,FALSE,0); +} + static void pack_view(gpointer key, GtkWidget *widget, GtkWidget *parent) { GObject *obj = g_object_get_data(G_OBJECT(widget),"view_action"); @@ -116,7 +132,6 @@ struct action_info GtkWidget * widget; }; - static void action_group_setup(gpointer key, GtkAction *action, struct action_info *info) { 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) #if GTK_CHECK_VERSION(3,0,0) GtkWidget * vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); + GtkWidget * hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); #else GtkWidget * vbox = gtk_vbox_new(FALSE,0); + GtkWidget * hbox = gtk_hbox_new(FALSE,0); #endif // GTK(3,0,0) GtkWidget * parent; + struct keypad keypad; int f; a_info.widget = widget; @@ -211,20 +229,42 @@ void parser_build(struct parser *p, GtkWidget *widget) // Pack top toolbars g_hash_table_foreach(p->element_list[UI_ELEMENT_TOOLBAR],(GHFunc) pack_start, p); + // Pack top keypads + memset(&keypad,0,sizeof(keypad)); + keypad.box = vbox; + keypad.filter = GTK_POS_BOTTOM; + keypad.pack = gtk_box_pack_start; + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); + + + // Pack left keypads + keypad.box = hbox; + keypad.filter = GTK_POS_RIGHT; + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); + // Pack & configure center widget if(widget) { ui_set_scroll_actions(widget,p->scroll_action); - gtk_box_pack_start(GTK_BOX(vbox),widget,TRUE,TRUE,0); + gtk_box_pack_start(GTK_BOX(hbox),widget,TRUE,TRUE,0); gtk_widget_show(widget); } + // Pack right keypads + keypad.filter = GTK_POS_LEFT; + keypad.pack = gtk_box_pack_end; + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); -// gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); + // Pack bottom keypads + keypad.box = vbox; + keypad.filter = GTK_POS_TOP; + g_hash_table_foreach(p->element_list[UI_ELEMENT_KEYPAD],(GHFunc) pack_keypad, &keypad); + // Finish building + gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,0); gtk_container_add(GTK_CONTAINER(p->toplevel),vbox); -// gtk_widget_show(hbox); + gtk_widget_show(hbox); gtk_widget_show(vbox); gtk_window_add_accel_group(GTK_WINDOW(p->toplevel),a_info.accel_group); diff --git a/src/pw3270/uiparser/private.h b/src/pw3270/uiparser/private.h index e752771..da880c8 100644 --- a/src/pw3270/uiparser/private.h +++ b/src/pw3270/uiparser/private.h @@ -85,6 +85,7 @@ #ifdef HAVE_GTKMAC GtkWidget * sysmenu[SYSMENU_ITEM_COUNT]; #endif // HAVE_GTKMAC + void * block_data; }; int ui_parse_file(struct parser *info, const gchar *filename); diff --git a/ui/00default.xml b/ui/00default.xml index 9989311..a743989 100644 --- a/ui/00default.xml +++ b/ui/00default.xml @@ -188,7 +188,7 @@ - + @@ -206,7 +206,7 @@ - + diff --git a/ui/10keypad.xml b/ui/10keypad.xml index 464d963..7706dd4 100644 --- a/ui/10keypad.xml +++ b/ui/10keypad.xml @@ -54,17 +54,17 @@