Commit ba467025363a5c749beb307fc5d1beb564dc9dd3

Authored by Perry Werneck
1 parent c6d5dc0d

Implementing action object.

src/actions/abstract.c
... ... @@ -34,11 +34,15 @@
34 34 static void pw3270Action_init(pw3270Action *action);
35 35 static void pw3270_action_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
36 36 static void pw3270_action_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
  37 + static void pw3270_action_set_state(GAction *action, GVariant *value);
  38 +
  39 + static void finalize(GObject *object);
37 40  
38 41 static const GVariantType * pw3270_action_get_state_type(GAction *action);
39 42 static GVariant * pw3270_action_get_state_property(GAction *action);
40   - static GVariantType * pw3270_action_get_parameter_type(GAction *action);
41   -
  43 + static const GVariantType * pw3270_action_get_parameter_type(GAction *action);
  44 + static GVariant * pw3270_action_get_state_hint(GAction *action);
  45 + static void pw3270_action_change_state(GAction *action, GVariant *value);
42 46  
43 47 enum {
44 48 PROP_NONE,
... ... @@ -53,12 +57,12 @@
53 57  
54 58 void pw3270_action_iface_init(GActionInterface *iface) {
55 59 iface->get_name = pw3270_action_get_name;
56   -// iface->get_parameter_type = pw3270_action_get_parameter_type;
  60 + iface->get_parameter_type = pw3270_action_get_parameter_type;
57 61 iface->get_state_type = pw3270_action_get_state_type;
58   -// iface->get_state_hint = pw3270_action_get_state_hint;
  62 + iface->get_state_hint = pw3270_action_get_state_hint;
59 63 iface->get_enabled = pw3270_action_get_enabled;
60 64 iface->get_state = pw3270_action_get_state_property;
61   -// iface->change_state = pw3270_action_change_state;
  65 + iface->change_state = pw3270_action_change_state;
62 66 iface->activate = pw3270_action_activate;
63 67 }
64 68  
... ... @@ -70,8 +74,9 @@
70 74  
71 75 GObjectClass *object_class = G_OBJECT_CLASS(klass);
72 76  
73   - object_class->set_property = pw3270_action_set_property;
74   - object_class->get_property = pw3270_action_get_property;
  77 + object_class->finalize = finalize;
  78 + object_class->set_property = pw3270_action_set_property;
  79 + object_class->get_property = pw3270_action_get_property;
75 80  
76 81 klass->get_enabled = return_false;
77 82  
... ... @@ -124,15 +129,38 @@
124 129  
125 130 void pw3270Action_init(pw3270Action *action) {
126 131  
127   - action->name = "unnamed";
  132 + action->name = NULL;
128 133 action->window = NULL;
  134 + action->state = NULL;
  135 +
  136 + }
  137 +
  138 + void finalize(GObject *object) {
  139 +
  140 + pw3270Action * action = PW3270_ACTION(object);
  141 +
  142 + if(action->name) {
  143 +
  144 + debug("Finalizing action \"%s\"",action->name);
  145 + g_free(action->name);
  146 + action->name = NULL;
  147 +
  148 + }
  149 +
  150 + if(action->parameter_type)
  151 + g_variant_type_free(action->parameter_type);
  152 +
  153 + G_OBJECT_CLASS(pw3270Action_parent_class)->finalize(object);
129 154  
130 155 }
131 156  
  157 +
132 158 void pw3270_action_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) {
133 159  
134 160 GAction *action = G_ACTION(object);
135 161  
  162 + debug("%s(%d)",__FUNCTION__,prop_id);
  163 +
136 164 switch (prop_id) {
137 165 case PROP_NAME:
138 166 g_value_set_string(value, pw3270_action_get_name(action));
... ... @@ -161,22 +189,57 @@
161 189 }
162 190  
163 191 void pw3270_action_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) {
  192 +
  193 + debug("%s(%d)",__FUNCTION__,prop_id);
  194 +
  195 + GAction *action = G_ACTION(object);
  196 +
  197 + switch (prop_id)
  198 + {
  199 + case PROP_NAME:
  200 + pw3270_action_set_name(action, g_value_get_string(value));
  201 + break;
  202 +
  203 + case PROP_PARAMETER_TYPE:
  204 +// action->parameter_type = g_value_dup_boxed (value);
  205 + break;
  206 +
  207 + case PROP_ENABLED:
  208 +// action->enabled = g_value_get_boolean (value);
  209 + break;
  210 +
  211 + case PROP_STATE:
  212 + pw3270_action_set_state(action, g_value_get_variant(value));
  213 + break;
  214 +
  215 + default:
  216 + g_assert_not_reached ();
  217 + }
  218 +
164 219 }
165 220  
166 221 const gchar * pw3270_action_get_name(GAction *action) {
167 222 return PW3270_ACTION(action)->name;
168 223 }
169 224  
170   - const GVariantType * pw3270_action_get_state_type(GAction *action) {
171   - return NULL;
172   - }
  225 + void pw3270_action_set_name(GAction *object, const gchar *name) {
  226 +
  227 + pw3270Action * action = PW3270_ACTION(object);
  228 +
  229 + debug("%s %s -> %s", __FUNCTION__, action->name, name);
  230 +
  231 + if(action->name)
  232 + g_free(action->name);
  233 +
  234 + if(name)
  235 + action->name = g_strdup(name);
  236 + else
  237 + action->name = NULL;
173 238  
174   - GVariant * pw3270_action_get_state_property(GAction *action) {
175   - return g_variant_new_int16(0);
176 239 }
177 240  
178   - GVariantType * pw3270_action_get_parameter_type(GAction *action) {
179   - return NULL;
  241 + GVariant * pw3270_action_get_state_property(GAction *action) {
  242 + return PW3270_ACTION(action)->state;
180 243 }
181 244  
182 245 gboolean pw3270_action_get_enabled(GAction *action) {
... ... @@ -195,3 +258,33 @@
195 258 PW3270_ACTION_GET_CLASS(action)->activate(action,window);
196 259  
197 260 }
  261 +
  262 + const GVariantType * pw3270_action_get_parameter_type(GAction *action) {
  263 + debug("%s",__FUNCTION__);
  264 + return NULL;
  265 + }
  266 +
  267 + const GVariantType * pw3270_action_get_state_type(GAction *object) {
  268 +
  269 + pw3270Action * action = PW3270_ACTION(object);
  270 +
  271 + if(action->state != NULL)
  272 + return g_variant_get_type(action->state);
  273 + else
  274 + return NULL;
  275 +
  276 + }
  277 +
  278 + GVariant * pw3270_action_get_state_hint(GAction *action) {
  279 + debug("%s",__FUNCTION__);
  280 + return NULL;
  281 + }
  282 +
  283 + void pw3270_action_change_state(GAction *action, GVariant *value) {
  284 + debug("%s",__FUNCTION__);
  285 + pw3270_action_set_state (action, value);
  286 + }
  287 +
  288 + void pw3270_action_set_state(GAction *action, GVariant *value) {
  289 + debug("%s",__FUNCTION__);
  290 + }
... ...
src/actions/actions.cbp
... ... @@ -50,6 +50,9 @@
50 50 <Unit filename="testprogram/testprogram.c">
51 51 <Option compilerVar="CC" />
52 52 </Unit>
  53 + <Unit filename="window.c">
  54 + <Option compilerVar="CC" />
  55 + </Unit>
53 56 <Extensions>
54 57 <code_completion />
55 58 <envvars />
... ...
src/actions/lib3270.c
... ... @@ -47,15 +47,13 @@
47 47 typedef struct _Lib3270Action {
48 48 pw3270Action parent;
49 49  
50   - const LIB3270_ACTION * definition;
51   -
  50 + const LIB3270_ACTION * definition;
52 51  
53 52 } Lib3270Action;
54 53  
55 54 static void Lib3270Action_class_init(Lib3270ActionClass *klass);
56 55 static void Lib3270Action_init(Lib3270Action *action);
57 56  
58   -
59 57 G_DEFINE_TYPE(Lib3270Action, Lib3270Action, PW3270_TYPE_ACTION);
60 58  
61 59 static gboolean action_enabled(GAction *action, GtkWidget *window) {
... ... @@ -84,23 +82,23 @@
84 82 action->get_enabled = action_enabled;
85 83 action->activate = action_activate;
86 84  
87   -
88 85 }
89 86  
90 87 void Lib3270Action_init(Lib3270Action *action) {
91 88 }
92 89  
93   - GAction * pw3270_action_get_from_lib3270(const LIB3270_ACTION * definition) {
  90 + GAction * pw3270_action_new_from_lib3270(const LIB3270_ACTION * definition, GtkWidget *window) {
94 91  
95   - Lib3270Action * action = (Lib3270Action *) g_object_new(PW3270_TYPE_LIB3270_ACTION, NULL);
96   - action->definition = definition;
  92 + Lib3270Action * action = (Lib3270Action *) g_object_new(PW3270_TYPE_LIB3270_ACTION, NULL);
  93 + pw3270Action * abstract = PW3270_ACTION(action);
97 94  
98   - {
99   - pw3270Action * abstract = PW3270_ACTION(action);
  95 + action->definition = definition;
  96 + abstract->window = window;
100 97  
101   - abstract->name = definition->name;
  98 + if(abstract->name)
  99 + g_free(abstract->name);
102 100  
103   - }
  101 + abstract->name = g_strconcat("win.",definition->name,NULL);
104 102  
105 103 return G_ACTION(action);
106 104 }
... ...
src/actions/private.h
... ... @@ -47,8 +47,10 @@
47 47 struct _pw3270Action {
48 48 GObject parent;
49 49  
50   - GtkWidget * window;
51   - const gchar * name;
  50 + GVariantType * parameter_type;
  51 + GVariant * state;
  52 + GtkWidget * window;
  53 + gchar * name;
52 54  
53 55 };
54 56  
... ...
src/actions/testprogram/testprogram.c
... ... @@ -29,10 +29,10 @@
29 29 */
30 30  
31 31 #include <config.h>
32   - #include <pw3270/actions.h>
33   - #include <pw3270/window.h>
34   - #include <lib3270.h>
  32 + #include <v3270.h>
  33 + #include <v3270/trace.h>
35 34 #include <lib3270/log.h>
  35 + #include <pw3270/actions.h>
36 36  
37 37 /*---[ Implement ]----------------------------------------------------------------------------------*/
38 38  
... ... @@ -44,17 +44,60 @@
44 44 return NULL;
45 45 }
46 46  
47   - int main (int argc, char **argv) {
  47 + static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
48 48  
49   - GAction * action = pw3270_action_get_from_lib3270(lib3270_action_get_by_name("testpattern"));
  49 + GtkWidget * window = gtk_application_window_new(app);
  50 + GtkWidget * terminal = v3270_new();
  51 + GtkWidget * vBox = gtk_box_new(GTK_ORIENTATION_VERTICAL,2);
  52 + GtkWidget * notebook = gtk_notebook_new();
  53 + GtkWidget * toolbar = gtk_toolbar_new();
50 54  
51   - g_message("Action name is \"%s\"",g_action_get_name(action));
52   - g_message("Action is %s",g_action_get_enabled(action) ? "enabled" : "disabled");
  55 + pw3270_window_add_actions(window);
53 56  
54   - g_object_unref(action);
55   - return 0;
  57 + gtk_box_pack_start(GTK_BOX(vBox),toolbar,FALSE,TRUE,0);
  58 + gtk_box_pack_start(GTK_BOX(vBox),notebook,TRUE,TRUE,0);
56 59  
57   - }
  60 + // Create Terminal window
  61 + {
  62 + gtk_widget_set_can_default(terminal,TRUE);
  63 +
  64 + gtk_notebook_append_page(GTK_NOTEBOOK(notebook),terminal,gtk_label_new("Terminal"));
  65 +
  66 +#ifdef _WIN32
  67 + v3270_set_font_family(terminal,"Droid Sans Mono");
  68 +#endif // _WIN32
  69 +
  70 + }
  71 +
  72 + // Create trace window
  73 + gtk_notebook_append_page(GTK_NOTEBOOK(notebook),v3270_trace_new(terminal),gtk_label_new("Trace"));
  74 +
  75 + // Setup and show main window
  76 + gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
  77 + gtk_window_set_default_size (GTK_WINDOW (window), 800, 500);
  78 + gtk_container_add(GTK_CONTAINER(window),vBox);
  79 + gtk_widget_show_all(window);
  80 +
  81 + gtk_widget_grab_focus(terminal);
  82 +
  83 +}
  84 +
  85 +int main (int argc, char **argv) {
  86 +
  87 + GtkApplication *app;
  88 + int status;
  89 +
  90 + app = gtk_application_new ("br.com.bb.pw3270",G_APPLICATION_FLAGS_NONE);
  91 +
  92 + g_signal_connect (app, "activate", G_CALLBACK(activate), NULL);
  93 +
  94 + status = g_application_run (G_APPLICATION (app), argc, argv);
  95 + g_object_unref (app);
  96 +
  97 + g_message("rc=%d",status);
  98 +
  99 + return 0;
58 100  
  101 +}
59 102  
60 103  
... ...
src/actions/window.c 0 → 100644
... ... @@ -0,0 +1,69 @@
  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 + /**
  31 + * @brief Integrate pw3270 actions with the application window.
  32 + *
  33 + */
  34 +
  35 + #include "private.h"
  36 + #include <lib3270/actions.h>
  37 +
  38 + void pw3270_window_add_actions(GtkWidget * appwindow) {
  39 +
  40 + GActionMap *map = G_ACTION_MAP(appwindow);
  41 +
  42 + // g_action_map_add_action(map,pw3270_action_new_from_lib3270(lib3270_action_get_by_name("testpattern"), appwindow));
  43 +
  44 + GAction *action = pw3270_action_new_from_lib3270(lib3270_action_get_by_name("testpattern"), appwindow);
  45 +
  46 + debug("--> \"%s\"",pw3270_action_get_name(action));
  47 +
  48 + g_action_map_add_action(map,action);
  49 +
  50 + debug("--> \"%s\"",pw3270_action_get_name(action));
  51 +
  52 + /*
  53 + size_t ix;
  54 +
  55 + // Map lib3270 actions
  56 + const LIB3270_ACTION * actions = lib3270_get_actions();
  57 +
  58 + for(ix = 0; actions[ix].name; ix++) {
  59 +
  60 + // g_autofree gchar * name = g_strconcat("win.", actions[ix].name, NULL);
  61 + debug("Creating action %s", actions[ix].name);
  62 + g_action_map_add_action(map,pw3270_action_new_from_lib3270(&actions[ix],appwindow));
  63 +
  64 + }
  65 + */
  66 +
  67 +
  68 + debug("%s ends",__FUNCTION__);
  69 + }
... ...
src/include/pw3270/actions.h
... ... @@ -54,11 +54,17 @@
54 54  
55 55 GType pw3270Action_get_type(void) G_GNUC_CONST;
56 56  
57   - GAction * pw3270_action_get_from_lib3270(const LIB3270_ACTION * definition);
  57 + GAction * pw3270_action_new_from_lib3270(const LIB3270_ACTION * definition, GtkWidget *window);
  58 +
58 59 const gchar * pw3270_action_get_name(GAction *action);
  60 + void pw3270_action_set_name(GAction *action, const gchar *name);
  61 +
59 62 gboolean pw3270_action_get_enabled(GAction *action);
60 63 void pw3270_action_activate(GAction *action, GVariant *parameter);
61 64  
  65 + /// @brief Add lib3270 actions to an application window.
  66 + void pw3270_window_add_actions(GtkWidget * appwindow);
  67 +
62 68 G_END_DECLS
63 69  
64 70 #endif // PW3270_ACTIONS_H_INCLUDED
... ...