Commit 6dc92b9870068f119a942592d5cb84db76c2818e

Authored by Perry Werneck
1 parent dfe42f3a

Implementing keypad model element.

src/include/pw3270/keypad.h
... ... @@ -52,7 +52,7 @@
52 52  
53 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 57 G_END_DECLS
58 58  
... ...
src/objects/keypad/element.c 0 → 100644
... ... @@ -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 @@
  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 39 <Add option="`pkg-config --libs libv3270 gtk+-3.0`" />
40 40 </Linker>
41 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 46 <Option compilerVar="CC" />
44 47 </Unit>
45   - <Unit filename="model.c">
  48 + <Unit filename="load.c">
46 49 <Option compilerVar="CC" />
47 50 </Unit>
48 51 <Unit filename="private.h" />
... ...
src/objects/keypad/load.c
... ... @@ -28,12 +28,60 @@
28 28 */
29 29  
30 30 #include "private.h"
  31 + #include <stdlib.h>
31 32  
32 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 85 GError * error = NULL;
38 86 g_autofree gchar *text = NULL;
39 87  
... ... @@ -41,19 +89,31 @@
41 89  
42 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 109 if(error) {
48 110  
49   - // TODO: Popup with error message.
  111 + // TODO: Popup error message.
  112 + g_message("%s",error->message);
50 113 g_error_free(error);
51 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   -/*
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 46  
47 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 81 struct _KeypadModel {
50 82 GObject parent;
51 83  
... ... @@ -66,6 +98,12 @@
66 98 };
67 99  
68 100 void keypad_model_set_position(GObject *model, const gchar *position);
  101 + void keypad_model_parse_context(GObject *model, GMarkupParseContext *context);
  102 +
69 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 109 #endif // PRIVATE_H_INCLUDED
... ...
src/objects/keypad/testprogram/testprogram.c
... ... @@ -66,7 +66,7 @@
66 66 }
67 67  
68 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 71 // Create trace window
72 72 v3270_set_trace(terminal,TRUE);
... ...