Commit 6dc92b9870068f119a942592d5cb84db76c2818e

Authored by Perry Werneck
1 parent dfe42f3a

Implementing keypad model element.

src/include/pw3270/keypad.h
@@ -52,7 +52,7 @@ @@ -52,7 +52,7 @@
52 52
53 GType KeypadModel_get_type(void) G_GNUC_CONST; 53 GType KeypadModel_get_type(void) G_GNUC_CONST;
54 54
55 - GObject * pw3270_keypad_model_new_from_xml(const gchar *filename); 55 + GList * pw3270_keypad_model_load_from_xml(GList *keypads, const gchar *filename);
56 56
57 G_END_DECLS 57 G_END_DECLS
58 58
src/objects/keypad/element.c 0 → 100644
@@ -0,0 +1,265 @@ @@ -0,0 +1,265 @@
  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 - 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 + #include "private.h"
  31 +
  32 +/*---[ Globals & Object definition ]----------------------------------------------------------------*/
  33 +
  34 + enum {
  35 + PROP_NONE,
  36 + PROP_LABEL,
  37 + PROP_ACTION,
  38 + PROP_ICON_NAME,
  39 + PROP_ROW,
  40 + PROP_COL,
  41 + PROP_WIDTH,
  42 + PROP_HEIGHT,
  43 + };
  44 +
  45 + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
  46 + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
  47 +
  48 + G_DEFINE_TYPE(KeypadElement, KeypadElement, G_TYPE_OBJECT)
  49 +
  50 +/*---[ Implement ]----------------------------------------------------------------------------------*/
  51 +
  52 + static void finalize(GObject *object) {
  53 +
  54 + KeypadElement * element = PW_KEYPAD_ELEMENT(object);
  55 +
  56 + if(element->icon_name) {
  57 + g_free(element->icon_name);
  58 + element->icon_name = NULL;
  59 + }
  60 +
  61 + if(element->label) {
  62 + g_free(element->label);
  63 + element->label = NULL;
  64 + }
  65 +
  66 + if(element->action) {
  67 + g_free(element->action);
  68 + element->action = NULL;
  69 + }
  70 +
  71 + }
  72 +
  73 + static void KeypadElement_class_init(KeypadElementClass *klass) {
  74 +
  75 + GObjectClass *object_class = G_OBJECT_CLASS(klass);
  76 +
  77 + object_class->finalize = finalize;
  78 + object_class->get_property = get_property;
  79 + object_class->set_property = set_property;
  80 +
  81 + // Install properties
  82 + g_object_class_install_property(object_class, PROP_ICON_NAME,
  83 + g_param_spec_string (
  84 + I_("icon-name"),
  85 + I_("icon-name"),
  86 + N_("The name of the icon"),
  87 + NULL,
  88 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  89 + )
  90 + );
  91 +
  92 + g_object_class_install_property(object_class, PROP_LABEL,
  93 + g_param_spec_string (
  94 + I_("label"),
  95 + I_("label"),
  96 + N_("The Label of the keypad"),
  97 + NULL,
  98 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  99 + )
  100 + );
  101 +
  102 + g_object_class_install_property(object_class, PROP_WIDTH,
  103 + g_param_spec_uint(
  104 + I_("row"),
  105 + I_("width"),
  106 + _("Element row"),
  107 + 1,
  108 + 10,
  109 + 3,
  110 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  111 + )
  112 + );
  113 +
  114 + g_object_class_install_property(object_class, PROP_WIDTH,
  115 + g_param_spec_uint(
  116 + I_("col"),
  117 + I_("width"),
  118 + _("Element col"),
  119 + 1,
  120 + 10,
  121 + 3,
  122 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  123 + )
  124 + );
  125 +
  126 + g_object_class_install_property(object_class, PROP_WIDTH,
  127 + g_param_spec_uint(
  128 + I_("width"),
  129 + I_("width"),
  130 + _("Element width in columns"),
  131 + 1,
  132 + 10,
  133 + 3,
  134 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  135 + )
  136 + );
  137 +
  138 + g_object_class_install_property(object_class, PROP_HEIGHT,
  139 + g_param_spec_uint(
  140 + I_("height"),
  141 + I_("height"),
  142 + _("Element height in rows"),
  143 + 0,
  144 + 100,
  145 + 0,
  146 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  147 + )
  148 + );
  149 +
  150 + }
  151 +
  152 + static void KeypadElement_init(KeypadElement *object) {
  153 +
  154 +
  155 + }
  156 +
  157 + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) {
  158 +
  159 + KeypadElement * element = PW_KEYPAD_ELEMENT(object);
  160 +
  161 + switch (prop_id) {
  162 + case PROP_LABEL:
  163 + g_value_set_string(value, element->label);
  164 + break;
  165 +
  166 + case PROP_ICON_NAME:
  167 + g_value_set_string(value, element->icon_name);
  168 + break;
  169 +
  170 + case PROP_ACTION:
  171 + g_value_set_string(value, element->action);
  172 + break;
  173 +
  174 + case PROP_ROW:
  175 + g_value_set_uint(value, element->row);
  176 + break;
  177 +
  178 + case PROP_COL:
  179 + g_value_set_uint(value, element->col);
  180 + break;
  181 +
  182 + case PROP_HEIGHT:
  183 + g_value_set_uint(value, element->height);
  184 + break;
  185 +
  186 + case PROP_WIDTH:
  187 + g_value_set_uint(value, element->width);
  188 + break;
  189 +
  190 + default:
  191 + g_assert_not_reached ();
  192 + }
  193 +
  194 + }
  195 +
  196 + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) {
  197 +
  198 + KeypadElement * element = PW_KEYPAD_ELEMENT(object);
  199 +
  200 + switch (prop_id) {
  201 + case PROP_LABEL:
  202 +
  203 + if(element->label) {
  204 + g_free(element->label);
  205 + element->label = g_value_dup_string(value);
  206 + }
  207 + break;
  208 +
  209 + case PROP_ACTION:
  210 +
  211 + if(element->action) {
  212 + g_free(element->action);
  213 + element->action = g_value_dup_string(value);
  214 + }
  215 + break;
  216 +
  217 + case PROP_ROW:
  218 + element->row = (unsigned short) g_value_get_uint(value);
  219 + break;
  220 +
  221 + case PROP_COL:
  222 + element->col = (unsigned short) g_value_get_uint(value);
  223 + break;
  224 +
  225 + case PROP_HEIGHT:
  226 + element->height = (unsigned short) g_value_get_uint(value);
  227 + break;
  228 +
  229 + case PROP_WIDTH:
  230 + element->width = (unsigned short) g_value_get_uint(value);
  231 + break;
  232 +
  233 + default:
  234 + g_assert_not_reached();
  235 + }
  236 + }
  237 +
  238 + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, GList *keypads, GError **error) {
  239 +
  240 + debug("%s(%s)",__FUNCTION__,element_name);
  241 +
  242 + }
  243 +
  244 + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList *keypads, GError **error) {
  245 +
  246 + debug("%s(%s)",__FUNCTION__,element_name);
  247 +
  248 + }
  249 +
  250 + void keypad_model_element_parse_context(GObject *element, GMarkupParseContext *context) {
  251 +
  252 + static const GMarkupParser parser = {
  253 + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **))
  254 + element_start,
  255 +
  256 + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **))
  257 + element_end,
  258 + NULL,
  259 + NULL,
  260 + NULL
  261 + };
  262 +
  263 + g_markup_parse_context_push(context, &parser, element);
  264 +
  265 + }
src/objects/keypad/keypad.c 0 → 100644
@@ -0,0 +1,308 @@ @@ -0,0 +1,308 @@
  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 - 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 + #include "private.h"
  31 + #include <stdlib.h>
  32 +
  33 +/*---[ Globals & Object definition ]----------------------------------------------------------------*/
  34 +
  35 + enum {
  36 + PROP_NONE,
  37 + PROP_NAME,
  38 + PROP_LABEL,
  39 + PROP_POSITION,
  40 + PROP_WIDTH,
  41 + PROP_HEIGHT,
  42 + };
  43 +
  44 + static const char * positions[] = {
  45 + "up",
  46 + "down",
  47 + "left",
  48 + "right"
  49 + };
  50 +
  51 + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
  52 + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
  53 +
  54 + G_DEFINE_TYPE(KeypadModel, KeypadModel, G_TYPE_OBJECT)
  55 +
  56 +/*---[ Implement ]----------------------------------------------------------------------------------*/
  57 +
  58 + static void finalize(GObject *object) {
  59 +
  60 + KeypadModel * model = PW_KEYPAD_MODEL(object);
  61 +
  62 + if(model->name) {
  63 + g_free(model->name);
  64 + model->name = NULL;
  65 + }
  66 +
  67 + if(model->label) {
  68 + g_free(model->label);
  69 + model->label = NULL;
  70 + }
  71 +
  72 + }
  73 +
  74 + static void KeypadModel_class_init(KeypadModelClass *klass) {
  75 +
  76 + GObjectClass *object_class = G_OBJECT_CLASS(klass);
  77 +
  78 + klass->domain = g_quark_from_static_string("keypad");
  79 +
  80 + object_class->finalize = finalize;
  81 + object_class->get_property = get_property;
  82 + object_class->set_property = set_property;
  83 +
  84 + // Install properties
  85 + g_object_class_install_property(object_class, PROP_NAME,
  86 + g_param_spec_string (
  87 + I_("name"),
  88 + N_("Keypad Name"),
  89 + N_("The name used to identify the keypad"),
  90 + NULL,
  91 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  92 + )
  93 + );
  94 +
  95 + g_object_class_install_property(object_class, PROP_LABEL,
  96 + g_param_spec_string (
  97 + _("label"),
  98 + N_("Keypad Label"),
  99 + N_("The Label of the keypad"),
  100 + NULL,
  101 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  102 + )
  103 + );
  104 +
  105 + g_object_class_install_property(object_class, PROP_POSITION,
  106 + g_param_spec_string (
  107 + I_("position"),
  108 + I_("position"),
  109 + N_("The position of the keypad"),
  110 + NULL,
  111 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  112 + )
  113 + );
  114 +
  115 + g_object_class_install_property(object_class, PROP_WIDTH,
  116 + g_param_spec_uint(
  117 + I_("width"),
  118 + I_("width"),
  119 + _("Keypad width in columns"),
  120 + 1,
  121 + 10,
  122 + 3,
  123 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  124 + )
  125 + );
  126 +
  127 + g_object_class_install_property(object_class, PROP_WIDTH,
  128 + g_param_spec_uint(
  129 + I_("height"),
  130 + I_("height"),
  131 + _("Keypad height in rows"),
  132 + 0,
  133 + 100,
  134 + 0,
  135 + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE
  136 + )
  137 + );
  138 + }
  139 +
  140 + static void KeypadModel_init(KeypadModel *object) {
  141 +
  142 +
  143 + }
  144 +
  145 + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) {
  146 +
  147 + KeypadModel * model = PW_KEYPAD_MODEL(object);
  148 +
  149 + switch (prop_id) {
  150 + case PROP_NAME:
  151 + g_value_set_string(value, model->name);
  152 + break;
  153 +
  154 + case PROP_LABEL:
  155 + g_value_set_string(value, model->label);
  156 + break;
  157 +
  158 + case PROP_POSITION:
  159 + g_value_set_static_string(value,keypad_model_get_position(object));
  160 + break;
  161 +
  162 + case PROP_HEIGHT:
  163 + g_value_set_uint(value, model->height);
  164 + break;
  165 +
  166 + case PROP_WIDTH:
  167 + g_value_set_uint(value, model->width);
  168 + break;
  169 +
  170 + default:
  171 + g_assert_not_reached ();
  172 + }
  173 +
  174 + }
  175 +
  176 + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) {
  177 +
  178 + KeypadModel * model = PW_KEYPAD_MODEL(object);
  179 +
  180 + switch (prop_id) {
  181 + case PROP_NAME:
  182 +
  183 + if(model->name) {
  184 + g_free(model->name);
  185 + model->name = g_value_dup_string(value);
  186 + }
  187 + break;
  188 +
  189 + case PROP_LABEL:
  190 +
  191 + if(model->label) {
  192 + g_free(model->label);
  193 + model->label = g_value_dup_string(value);
  194 + }
  195 + break;
  196 +
  197 + case PROP_POSITION:
  198 + keypad_model_set_position(object,g_value_get_string(value));
  199 + break;
  200 +
  201 + case PROP_HEIGHT:
  202 + model->height = (unsigned short) g_value_get_uint(value);
  203 + break;
  204 +
  205 + case PROP_WIDTH:
  206 + model->width = (unsigned short) g_value_get_uint(value);
  207 + break;
  208 +
  209 + default:
  210 + g_assert_not_reached();
  211 + }
  212 + }
  213 +
  214 + void keypad_model_set_position(GObject *model, const gchar *position) {
  215 +
  216 + if(position) {
  217 + size_t ix;
  218 + for(ix = 0; ix < G_N_ELEMENTS(positions); ix++) {
  219 + if(!g_ascii_strcasecmp(positions[ix],position)) {
  220 + PW_KEYPAD_MODEL(model)->position = (unsigned short) ix;
  221 + break;
  222 + }
  223 + }
  224 + }
  225 +
  226 + }
  227 +
  228 + const gchar * keypad_model_get_position(GObject *model) {
  229 +
  230 + size_t ix = (size_t) PW_KEYPAD_MODEL(model)->position;
  231 +
  232 + if(ix < G_N_ELEMENTS(positions))
  233 + return positions[ix];
  234 +
  235 + return "undefined";
  236 + }
  237 +
  238 + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, KeypadModel *model, GError **error) {
  239 +
  240 + debug("%s(%s)",__FUNCTION__,element_name);
  241 +
  242 + if(!g_ascii_strcasecmp(element_name,"button")) {
  243 +
  244 + const gchar *row, *col, *width, *height;
  245 + GObject * element = g_object_new(PW_TYPE_KEYPAD_ELEMENT,NULL);
  246 +
  247 + if(!g_markup_collect_attributes(
  248 + element_name,names,values,error,
  249 + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "row", &row,
  250 + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "column", &col,
  251 + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "width", &width,
  252 + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "height", &height,
  253 + G_MARKUP_COLLECT_INVALID
  254 + )) {
  255 +
  256 + return;
  257 +
  258 + }
  259 +
  260 + if(row) {
  261 + PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(row);
  262 + }
  263 +
  264 + if(col) {
  265 + PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(col);
  266 + }
  267 +
  268 + if(width) {
  269 + PW_KEYPAD_ELEMENT(element)->width = (unsigned short) atoi(width);
  270 + }
  271 +
  272 + if(height) {
  273 + PW_KEYPAD_MODEL(element)->height = (unsigned short) atoi(height);
  274 + }
  275 +
  276 + keypad_model_element_parse_context(element,context);
  277 +
  278 + }
  279 +
  280 +
  281 + }
  282 +
  283 + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList *keypads, GError **error) {
  284 +
  285 + debug("%s(%s)",__FUNCTION__,element_name);
  286 +
  287 + if(!g_ascii_strcasecmp(element_name,"button")) {
  288 + g_markup_parse_context_pop(context);
  289 + }
  290 +
  291 + }
  292 +
  293 + void keypad_model_parse_context(GObject *model, GMarkupParseContext *context) {
  294 +
  295 + static const GMarkupParser parser = {
  296 + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **))
  297 + element_start,
  298 +
  299 + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **))
  300 + element_end,
  301 + NULL,
  302 + NULL,
  303 + NULL
  304 + };
  305 +
  306 + g_markup_parse_context_push(context, &parser, model);
  307 +
  308 + }
src/objects/keypad/keypad.cbp
@@ -39,10 +39,13 @@ @@ -39,10 +39,13 @@
39 <Add option="`pkg-config --libs libv3270 gtk+-3.0`" /> 39 <Add option="`pkg-config --libs libv3270 gtk+-3.0`" />
40 </Linker> 40 </Linker>
41 <Unit filename="../../include/pw3270/keypad.h" /> 41 <Unit filename="../../include/pw3270/keypad.h" />
42 - <Unit filename="load.c"> 42 + <Unit filename="element.c">
  43 + <Option compilerVar="CC" />
  44 + </Unit>
  45 + <Unit filename="keypad.c">
43 <Option compilerVar="CC" /> 46 <Option compilerVar="CC" />
44 </Unit> 47 </Unit>
45 - <Unit filename="model.c"> 48 + <Unit filename="load.c">
46 <Option compilerVar="CC" /> 49 <Option compilerVar="CC" />
47 </Unit> 50 </Unit>
48 <Unit filename="private.h" /> 51 <Unit filename="private.h" />
src/objects/keypad/load.c
@@ -28,12 +28,60 @@ @@ -28,12 +28,60 @@
28 */ 28 */
29 29
30 #include "private.h" 30 #include "private.h"
  31 + #include <stdlib.h>
31 32
32 /*---[ Implement ]----------------------------------------------------------------------------------*/ 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
33 34
34 - GObject * pw3270_keypad_model_new_from_xml(const gchar *filename) { 35 + static void element_start(GMarkupParseContext *context, const gchar *element_name, const gchar **names,const gchar **values, GList *keypads, GError **error) {
  36 +
  37 + if(!g_ascii_strcasecmp(element_name,"keypad")) {
  38 +
  39 + const gchar *name, *position, *width, *height;
  40 + GObject * keypad = g_object_new(PW_TYPE_KEYPAD_MODEL,NULL);
  41 +
  42 + if(!g_markup_collect_attributes(
  43 + element_name,names,values,error,
  44 + G_MARKUP_COLLECT_STRING, "name", &name,
  45 + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "position", &position,
  46 + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "width", &width,
  47 + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "height", &height,
  48 + G_MARKUP_COLLECT_INVALID
  49 + )) {
  50 +
  51 + return;
  52 +
  53 + }
  54 +
  55 + keypad_model_set_position(keypad,position);
  56 +
  57 + if(width) {
  58 + PW_KEYPAD_MODEL(keypad)->width = (unsigned short) atoi(width);
  59 + }
  60 +
  61 + if(height) {
  62 + PW_KEYPAD_MODEL(keypad)->height = (unsigned short) atoi(height);
  63 + }
  64 +
  65 + keypad_model_parse_context(keypad,context);
  66 +
  67 + }
  68 +
  69 + debug("%s(%s)",__FUNCTION__,element_name);
  70 +
  71 + }
  72 +
  73 + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList *keypads, GError **error) {
  74 +
  75 + debug("%s(%s)",__FUNCTION__,element_name);
  76 +
  77 + if(!g_ascii_strcasecmp(element_name,"keypad")) {
  78 + g_markup_parse_context_pop(context);
  79 + }
  80 +
  81 + }
  82 +
  83 + GList * pw3270_keypad_model_new_from_xml(GList *keypads, const gchar *filename) {
35 84
36 - GObject * object = g_object_new(PW_TYPE_KEYPAD_MODEL,NULL);  
37 GError * error = NULL; 85 GError * error = NULL;
38 g_autofree gchar *text = NULL; 86 g_autofree gchar *text = NULL;
39 87
@@ -41,19 +89,31 @@ @@ -41,19 +89,31 @@
41 89
42 g_message("Loading keypad from %s",filename); 90 g_message("Loading keypad from %s",filename);
43 91
  92 + static const GMarkupParser parser = {
  93 + (void (*)(GMarkupParseContext *, const gchar *, const gchar **, const gchar **, gpointer, GError **))
  94 + element_start,
  95 +
  96 + (void (*)(GMarkupParseContext *, const gchar *, gpointer, GError **))
  97 + element_end,
  98 + NULL,
  99 + NULL,
  100 + NULL
  101 + };
  102 +
  103 + GMarkupParseContext * context = g_markup_parse_context_new(&parser,G_MARKUP_TREAT_CDATA_AS_TEXT,keypads,NULL);
  104 + g_markup_parse_context_parse(context,text,strlen(text),&error);
  105 + g_markup_parse_context_free(context);
44 106
45 } 107 }
46 108
47 if(error) { 109 if(error) {
48 110
49 - // TODO: Popup with error message. 111 + // TODO: Popup error message.
  112 + g_message("%s",error->message);
50 g_error_free(error); 113 g_error_free(error);
51 error = NULL; 114 error = NULL;
52 - g_object_unref(object);  
53 - object = NULL;  
54 -  
55 } 115 }
56 116
57 - return object; 117 + return keypads;
58 118
59 } 119 }
src/objects/keypad/model.c
@@ -1,233 +0,0 @@ @@ -1,233 +0,0 @@
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 - 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 - #include "private.h"  
31 -  
32 -/*---[ Globals & Object definition ]----------------------------------------------------------------*/  
33 -  
34 - enum {  
35 - PROP_NONE,  
36 - PROP_NAME,  
37 - PROP_LABEL,  
38 - PROP_POSITION,  
39 - PROP_WIDTH,  
40 - PROP_HEIGHT,  
41 - };  
42 -  
43 - static const char * positions[] = {  
44 - "up",  
45 - "down",  
46 - "left",  
47 - "right"  
48 - };  
49 -  
50 - static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);  
51 - static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);  
52 -  
53 - G_DEFINE_TYPE(KeypadModel, KeypadModel, G_TYPE_OBJECT)  
54 -  
55 -/*---[ Implement ]----------------------------------------------------------------------------------*/  
56 -  
57 - static void finalize(GObject *object) {  
58 -  
59 - KeypadModel * model = PW_KEYPAD_MODEL(object);  
60 -  
61 - if(model->name) {  
62 - g_free(model->name);  
63 - model->name = NULL;  
64 - }  
65 -  
66 - if(model->label) {  
67 - g_free(model->label);  
68 - model->label = NULL;  
69 - }  
70 -  
71 - }  
72 -  
73 - static void KeypadModel_class_init(KeypadModelClass *klass) {  
74 -  
75 - GObjectClass *object_class = G_OBJECT_CLASS(klass);  
76 -  
77 - klass->domain = g_quark_from_static_string("keypad");  
78 -  
79 - object_class->finalize = finalize;  
80 - object_class->get_property = get_property;  
81 - object_class->set_property = set_property;  
82 -  
83 - // Install properties  
84 - g_object_class_install_property(object_class, PROP_NAME,  
85 - g_param_spec_string (  
86 - "name",  
87 - N_("Keypad Name"),  
88 - N_("The name used to identify the keypad"),  
89 - NULL,  
90 - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE  
91 - )  
92 - );  
93 -  
94 - g_object_class_install_property(object_class, PROP_LABEL,  
95 - g_param_spec_string (  
96 - "label",  
97 - N_("Keypad Label"),  
98 - N_("The Label of the keypad"),  
99 - NULL,  
100 - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE  
101 - )  
102 - );  
103 -  
104 - g_object_class_install_property(object_class, PROP_POSITION,  
105 - g_param_spec_string (  
106 - "position",  
107 - N_("Keypad position"),  
108 - N_("The position of the keypad"),  
109 - NULL,  
110 - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE  
111 - )  
112 - );  
113 -  
114 - g_object_class_install_property(object_class, PROP_WIDTH,  
115 - g_param_spec_uint(  
116 - "width",  
117 - "width",  
118 - _("Keypad width in columns"),  
119 - 1,  
120 - 10,  
121 - 3,  
122 - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE  
123 - )  
124 - );  
125 -  
126 - g_object_class_install_property(object_class, PROP_WIDTH,  
127 - g_param_spec_uint(  
128 - "height",  
129 - "height",  
130 - _("Keypad height in rows"),  
131 - 0,  
132 - 100,  
133 - 0,  
134 - G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE  
135 - )  
136 - );  
137 - }  
138 -  
139 - static void KeypadModel_init(KeypadModel *object) {  
140 -  
141 -  
142 - }  
143 -  
144 - static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) {  
145 -  
146 - KeypadModel * model = PW_KEYPAD_MODEL(object);  
147 -  
148 - switch (prop_id) {  
149 - case PROP_NAME:  
150 - g_value_set_string(value, model->name);  
151 - break;  
152 -  
153 - case PROP_LABEL:  
154 - g_value_set_string(value, model->label);  
155 - break;  
156 -  
157 - case PROP_POSITION:  
158 - g_value_set_static_string(value,keypad_model_get_position(object));  
159 - break;  
160 -  
161 - case PROP_HEIGHT:  
162 - g_value_set_uint(value, model->height);  
163 - break;  
164 -  
165 - case PROP_WIDTH:  
166 - g_value_set_uint(value, model->width);  
167 - break;  
168 -  
169 - default:  
170 - g_assert_not_reached ();  
171 - }  
172 -  
173 - }  
174 -  
175 - static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) {  
176 -  
177 - KeypadModel * model = PW_KEYPAD_MODEL(object);  
178 -  
179 - switch (prop_id) {  
180 - case PROP_NAME:  
181 -  
182 - if(model->name) {  
183 - g_free(model->name);  
184 - model->name = g_value_dup_string(value);  
185 - }  
186 - break;  
187 -  
188 - case PROP_LABEL:  
189 -  
190 - if(model->label) {  
191 - g_free(model->label);  
192 - model->label = g_value_dup_string(value);  
193 - }  
194 - break;  
195 -  
196 - case PROP_POSITION:  
197 - keypad_model_set_position(object,g_value_get_string(value));  
198 - break;  
199 -  
200 - case PROP_HEIGHT:  
201 - model->height = (unsigned short) g_value_get_uint(value);  
202 - break;  
203 -  
204 - case PROP_WIDTH:  
205 - model->width = (unsigned short) g_value_get_uint(value);  
206 - break;  
207 -  
208 - default:  
209 - g_assert_not_reached();  
210 - }  
211 - }  
212 -  
213 - void keypad_model_set_position(GObject *model, const gchar *position) {  
214 -  
215 - size_t ix;  
216 - for(ix = 0; ix < G_N_ELEMENTS(positions); ix++) {  
217 - if(!g_ascii_strcasecmp(positions[ix],position)) {  
218 - PW_KEYPAD_MODEL(model)->position = (unsigned short) ix;  
219 - break;  
220 - }  
221 - }  
222 -  
223 - }  
224 -  
225 - const gchar * keypad_model_get_position(GObject *model) {  
226 -  
227 - size_t ix = (size_t) PW_KEYPAD_MODEL(model)->position;  
228 -  
229 - if(ix < G_N_ELEMENTS(positions))  
230 - return positions[ix];  
231 -  
232 - return "undefined";  
233 - }  
src/objects/keypad/private.h
@@ -46,6 +46,38 @@ @@ -46,6 +46,38 @@
46 46
47 #include <pw3270/keypad.h> 47 #include <pw3270/keypad.h>
48 48
  49 + G_BEGIN_DECLS
  50 +
  51 + #define I_(string) g_intern_static_string (string)
  52 +
  53 + #define PW_TYPE_KEYPAD_ELEMENT (KeypadElement_get_type())
  54 + #define PW_KEYPAD_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PW_TYPE_KEYPAD_ELEMENT, KeypadElement))
  55 + #define PW_KEYPAD_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PW_TYPE_KEYPAD_ELEMENT, KeypadModelClass))
  56 + #define PW_IS_KEYPAD_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PW_TYPE_KEYPAD_ELEMENT))
  57 + #define PW_IS_KEYPAD_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PW_TYPE_KEYPAD_ELEMENT))
  58 + #define PW_KEYPAD_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PW_TYPE_KEYPAD_ELEMENT, KeypadElementClass))
  59 +
  60 + typedef struct _KeypadElement {
  61 + GObject parent;
  62 +
  63 + unsigned short row;
  64 + unsigned short col;
  65 + unsigned short width;
  66 + unsigned short height;
  67 +
  68 + gchar * icon_name;
  69 + gchar * label;
  70 + gchar * action;
  71 +
  72 + } KeypadElement;
  73 +
  74 + typedef struct _KeypadElementClass {
  75 + GObjectClass parent;
  76 +
  77 + } KeypadElementClass;
  78 +
  79 + GType KeypadElement_get_type(void) G_GNUC_CONST;
  80 +
49 struct _KeypadModel { 81 struct _KeypadModel {
50 GObject parent; 82 GObject parent;
51 83
@@ -66,6 +98,12 @@ @@ -66,6 +98,12 @@
66 }; 98 };
67 99
68 void keypad_model_set_position(GObject *model, const gchar *position); 100 void keypad_model_set_position(GObject *model, const gchar *position);
  101 + void keypad_model_parse_context(GObject *model, GMarkupParseContext *context);
  102 +
69 const gchar * keypad_model_get_position(GObject *mode); 103 const gchar * keypad_model_get_position(GObject *mode);
70 104
  105 + void keypad_model_element_parse_context(GObject *element, GMarkupParseContext *context);
  106 +
  107 + G_END_DECLS
  108 +
71 #endif // PRIVATE_H_INCLUDED 109 #endif // PRIVATE_H_INCLUDED
src/objects/keypad/testprogram/testprogram.c
@@ -66,7 +66,7 @@ @@ -66,7 +66,7 @@
66 } 66 }
67 67
68 // Load keypad 68 // Load keypad
69 - GObject *keypad = pw3270_keypad_model_new_from_xml("keypad.xml"); 69 + GList *keypads = pw3270_keypad_model_new_from_xml(NULL,"keypad.xml");
70 70
71 // Create trace window 71 // Create trace window
72 v3270_set_trace(terminal,TRUE); 72 v3270_set_trace(terminal,TRUE);