From 3d6d26cdd90c0fbd5310fbffba851073bf26915e Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Fri, 15 Feb 2013 02:56:59 +0000 Subject: [PATCH] Incluindo suporte a macros na barra de botoes --- src/pw3270/uiparser/button.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pw3270/uiparser/keypad.c | 168 ++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------- src/pw3270/uiparser/keypad.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pw3270/uiparser/private.h | 2 ++ src/pw3270/uiparser/sources.mak | 2 +- 5 files changed, 235 insertions(+), 135 deletions(-) create mode 100644 src/pw3270/uiparser/button.c create mode 100644 src/pw3270/uiparser/keypad.h diff --git a/src/pw3270/uiparser/button.c b/src/pw3270/uiparser/button.c new file mode 100644 index 0000000..1bde9b7 --- /dev/null +++ b/src/pw3270/uiparser/button.c @@ -0,0 +1,136 @@ + +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como button.c e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "keypad.h" + #include + +/*--[ Globals ]--------------------------------------------------------------------------------------*/ + + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + + GtkReliefStyle ui_get_relief(const gchar **names, const gchar **values, GtkReliefStyle def) + { + + const gchar *name = ui_get_attribute("relief",names,values); + if(name) + { + static const struct _style + { + GtkReliefStyle val; + const gchar * name; + } style[] = + { + { GTK_RELIEF_NORMAL, "normal" }, + { GTK_RELIEF_HALF, "half" }, + { GTK_RELIEF_NONE, "none" } + }; + + int f; + + for(f=0;fparser; + GtkAction * action = NULL; + 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); + + if(!widget) + return; + +#if GTK_CHECK_VERSION(2,18,0) + gtk_widget_set_can_focus(widget,FALSE); + gtk_widget_set_can_default(widget,FALSE); +#else + GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_FOCUS); + GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_DEFAULT); +#endif // GTK(2,18) + + gtk_button_set_relief(GTK_BUTTON(widget),ui_get_relief(names, values, keypad->relief)); + gtk_button_set_alignment(GTK_BUTTON(widget),0.5,0.5); + gtk_button_set_focus_on_click(GTK_BUTTON(widget),FALSE); + + if(name) + action = ui_get_action(info->center_widget,name,info->actions,names,values,error); + + if(action) + { + ui_action_set_options(action,info,names,values,error); + g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(button_clicked),action); + } + else + { + keypad->widget = widget; + gtk_widget_set_sensitive(widget,FALSE); + g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(button_script),info->center_widget); + } + } + diff --git a/src/pw3270/uiparser/keypad.c b/src/pw3270/uiparser/keypad.c index 1204da8..473905c 100644 --- a/src/pw3270/uiparser/keypad.c +++ b/src/pw3270/uiparser/keypad.c @@ -18,7 +18,7 @@ * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin * St, Fifth Floor, Boston, MA 02110-1301 USA * - * Este programa está nomeado como accelerator.c e possui - linhas de código. + * Este programa está nomeado como keypad.c e possui - linhas de código. * * Contatos: * @@ -27,66 +27,11 @@ * */ - #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; - unsigned short button_width; - struct row * row; - GtkWidget * box; - GtkWidget * handle; - GtkWidget * table; - GtkReliefStyle relief; - UI_ATTR_DIRECTION pos; - GList * rows; - }; + #include "keypad.h" /*--[ Implement ]------------------------------------------------------------------------------------*/ - static GtkReliefStyle get_relief(const gchar **names, const gchar **values, GtkReliefStyle def) - { - - const gchar *name = ui_get_attribute("relief",names,values); - if(name) - { - static const struct _style - { - GtkReliefStyle val; - const gchar * name; - } style[] = - { - { GTK_RELIEF_NORMAL, "normal" }, - { GTK_RELIEF_HALF, "half" }, - { GTK_RELIEF_NONE, "none" } - }; - - int f; - - for(f=0;frow = g_malloc0(sizeof(struct row)); @@ -96,84 +41,16 @@ keypad->rows = g_list_append(keypad->rows,keypad->row); } - static void button_clicked(GtkButton *button, GtkAction *action) - { - gtk_action_activate(action); - } - - 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); - const gchar * name = ui_get_attribute("action", names, values); - struct parser * info = keypad->parser; - GtkAction * action; - 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); - - if(!widget) - return; - -#if GTK_CHECK_VERSION(2,18,0) - gtk_widget_set_can_focus(widget,FALSE); - gtk_widget_set_can_default(widget,FALSE); -#else - GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_FOCUS); - GTK_WIDGET_UNSET_FLAGS(widget,GTK_CAN_DEFAULT); -#endif // GTK(2,18) - - if(!name) - { - // Invalid unnamed element - *error = g_error_new(ERROR_DOMAIN,EINVAL,_( "Can't accept unnamed %s"),"button"); - return; - } - - gtk_button_set_relief(GTK_BUTTON(widget),get_relief(names, values, keypad->relief)); - gtk_button_set_alignment(GTK_BUTTON(widget),0.5,0.5); - gtk_button_set_focus_on_click(GTK_BUTTON(widget),FALSE); - - action = ui_get_action(info->center_widget,name,info->actions,names,values,error); - - if(action) - { - ui_action_set_options(action,info,names,values,error); - g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(button_clicked),action); - } - else - { - gtk_widget_set_sensitive(widget,FALSE); - } - } - static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, struct keypad *keypad, GError **error) { static const struct _cmd { const gchar *element_name; - void (*start)(struct keypad *, const gchar **, const gchar **, GError **); + void (*start)(GMarkupParseContext *, const gchar **,const gchar **, GError **, struct keypad *); } cmd[] = { - { "row", row_start }, - { "button", button_start }, + { "row", keypad_row_start }, + { "button", keypad_button_start }, }; int f; @@ -182,7 +59,7 @@ { if(!g_strcasecmp(cmd[f].element_name,element_name)) { - cmd[f].start(keypad,names,values,error); + cmd[f].start(context,names,values,error,keypad); return; } } @@ -191,7 +68,8 @@ } static void element_end(GMarkupParseContext *context, const gchar *element_name, struct keypad *keypad, GError **error) - { + { + keypad->widget = NULL; // trace("%s: %s",__FUNCTION__,element_name); } @@ -227,6 +105,28 @@ return UI_ATTR_DIRECTION_NONE; } + + static void element_text(GMarkupParseContext *context, const gchar *text, gsize sz, struct keypad *keypad, GError **error) + { + if(keypad->widget) + { + gchar *base = g_strstrip(g_strdup(text)); + gchar *text = g_strdup(base); + g_free(base); + + if(*text) + { + gtk_widget_set_sensitive(keypad->widget,TRUE); + g_object_set_data_full(G_OBJECT(keypad->widget),"script_text",text,g_free); + } + else + { + g_free(text); + } + + } + + } GObject * ui_create_keypad(GMarkupParseContext *context,GtkAction *action,struct parser *info,const gchar **names, const gchar **values, GError **error) { @@ -237,7 +137,7 @@ (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **)) element_end, (void (*)(GMarkupParseContext *, const gchar *, gsize, gpointer, GError **)) - NULL, + element_text, // (void (*)(GMarkupParseContext *, GError *, gpointer)) NULL @@ -264,7 +164,7 @@ keypad->parser = info; keypad->handle = gtk_handle_box_new(); keypad->pos = ui_get_position_attribute(names,values); - keypad->relief = get_relief(names, values, GTK_RELIEF_NORMAL); + keypad->relief = ui_get_relief(names, values, GTK_RELIEF_NORMAL); switch(keypad->pos) { @@ -350,7 +250,7 @@ keypad->col = 0; keypad->button_width = keypad->num_cols / info->num_cols; - trace("Max cols=%d row cols=%d width=%d",keypad->num_cols,info->num_cols,keypad->button_width); +// trace("Max cols=%d row cols=%d width=%d",keypad->num_cols,info->num_cols,keypad->button_width); g_list_foreach(info->cols,(GFunc) create_col,keypad); g_list_free(info->cols); diff --git a/src/pw3270/uiparser/keypad.h b/src/pw3270/uiparser/keypad.h new file mode 100644 index 0000000..e79b67c --- /dev/null +++ b/src/pw3270/uiparser/keypad.h @@ -0,0 +1,62 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como keypad.h e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + + #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; + unsigned short button_width; + struct row * row; + GtkWidget * box; + GtkWidget * handle; + GtkWidget * table; + GtkReliefStyle relief; + UI_ATTR_DIRECTION pos; + GList * rows; + + GtkWidget * widget; + + }; + + G_GNUC_INTERNAL void keypad_button_start(GMarkupParseContext *context, const gchar **names,const gchar **values, GError **error, struct keypad *keypad); diff --git a/src/pw3270/uiparser/private.h b/src/pw3270/uiparser/private.h index dfb055c..a4f43a5 100644 --- a/src/pw3270/uiparser/private.h +++ b/src/pw3270/uiparser/private.h @@ -93,6 +93,8 @@ int ui_parse_file(struct parser *info, const gchar *filename); void ui_action_set_options(GtkAction *action, struct parser *info, const gchar **names, const gchar **values, GError **error); + + G_GNUC_INTERNAL GtkReliefStyle ui_get_relief(const gchar **names, const gchar **values, GtkReliefStyle def); GObject * ui_get_element(struct parser *info, GtkAction *action, enum ui_element id, const gchar **names, const gchar **values, GError **error); GObject * ui_insert_element(struct parser *info, GtkAction *action, enum ui_element id, const gchar **names, const gchar **values, GObject *widget, GError **error); diff --git a/src/pw3270/uiparser/sources.mak b/src/pw3270/uiparser/sources.mak index d7ed738..de53f4a 100644 --- a/src/pw3270/uiparser/sources.mak +++ b/src/pw3270/uiparser/sources.mak @@ -1,5 +1,5 @@ UI_PARSER_SRC=accelerator.c action.c menubar.c menu.c menuitem.c parser.c \ parsefile.c separator.c toolbar.c toolitem.c popup.c script.c \ - scroll.c keypad.c + scroll.c keypad.c button.c -- libgit2 0.21.2