Commit 1bd9a779350335c5a1983d860c1e6a3364caeb13

Authored by Perry Werneck
1 parent b4e98e07
Exists in master and in 1 other branch develop

Working on the new FT dialog components.

src/dialogs/commondialog.c
... ... @@ -62,7 +62,6 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(const gchar *title, GtkWindow *paren
62 62 NULL
63 63 ));
64 64  
65   - gtk_window_set_title(GTK_WINDOW(dialog), title);
66 65 gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
67 66  
68 67 // https://developer.gnome.org/hig/stable/visual-layout.html.en
... ... @@ -79,11 +78,14 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(const gchar *title, GtkWindow *paren
79 78  
80 79 if(header)
81 80 {
  81 + gtk_header_bar_set_title(GTK_HEADER_BAR(header),title);
82 82 gtk_header_bar_pack_start(GTK_HEADER_BAR(header),create_button(dialog,_("_Cancel"),G_CALLBACK(cancel_clicked)));
83 83 gtk_header_bar_pack_end(GTK_HEADER_BAR(header),create_button(dialog,apply,G_CALLBACK(apply_clicked)));
84 84 }
85 85 else
86 86 {
  87 + gtk_window_set_title(GTK_WINDOW(dialog), title);
  88 +
87 89 gtk_dialog_add_buttons(
88 90 GTK_DIALOG (dialog),
89 91 _("_Cancel"), GTK_RESPONSE_CANCEL,
... ...
src/include/internals.h
... ... @@ -69,8 +69,20 @@
69 69 G_GNUC_INTERNAL GtkWidget * v3270_dialog_create_grid(GtkAlign align);
70 70 G_GNUC_INTERNAL GtkWidget * v3270_dialog_create_frame(GtkWidget * child, const gchar *title);
71 71  
  72 + // Activity list widget.
  73 + #define GTK_TYPE_V3270_FT_ACTIVITY_LIST (V3270FTActivityList_get_type ())
  74 + #define GTK_V3270_FT_ACTIVITY_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_V3270_FT_ACTIVITY_LIST, V3270FTActivityList))
  75 + #define GTK_V3270_FT_ACTIVITY_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_V3270_FT_ACTIVITY_LIST, V3270FTActivityListClass))
  76 + #define GTK_IS_V3270_FT_ACTIVITY_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_V3270_FT_ACTIVITY_LIST))
  77 + #define GTK_IS_V3270_FT_ACTIVITY_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_V3270_FT_ACTIVITY_LIST))
  78 + #define GTK_V3270_FT_ACTIVITY_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_V3270_FT_ACTIVITY_LIST, V3270FTActivityListClass))
  79 +
  80 + typedef struct _V3270FTActivityList V3270FTActivityList;
  81 + typedef struct _V3270FTActivityListClass V3270FTActivityListClass;
  82 +
72 83 G_GNUC_INTERNAL GtkWidget * v3270_activity_list_new();
73 84 G_GNUC_INTERNAL void v3270_activity_list_append(GtkWidget *widget, GObject *activity);
  85 + G_GNUC_INTERNAL void v3270_activity_list_load(GtkWidget *widget);
74 86  
75 87 G_END_DECLS
76 88  
... ...
src/v3270ft/activity.c
... ... @@ -182,64 +182,13 @@
182 182 return G_V3270_FT_ACTIVITY(object)->options;
183 183 }
184 184  
185   - static void render_local(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
  185 + guint v3270_ft_activity_get_value(GObject * object, LIB3270_FT_VALUE id)
186 186 {
187   - V3270FTActivity * activity;
188   - gtk_tree_model_get(tree_model, iter, 0, &activity, -1);
189   - g_object_set(G_OBJECT(cell),"text",activity->file.local,NULL);
190   - }
191   -
192   - static void render_remote(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
193   - {
194   - V3270FTActivity * activity;
195   - gtk_tree_model_get(tree_model, iter, 0, &activity, -1);
196   - g_object_set(G_OBJECT(cell),"text",activity->file.remote,NULL);
197   - }
198   -
199   - GtkWidget * v3270_activity_list_new()
200   - {
201   - GtkTreeModel * model = GTK_TREE_MODEL(gtk_list_store_new(1,G_TYPE_OBJECT));
202   - GtkWidget * widget = gtk_tree_view_new_with_model(model);
203   -
204   - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(widget),TRUE);
205   - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(widget),TRUE);
206   -
207   - gtk_tree_view_insert_column_with_data_func(
208   - GTK_TREE_VIEW(widget),
209   - -1,
210   - _( "Local file" ),
211   - gtk_cell_renderer_text_new(),
212   - render_local,
213   - 0, NULL
214   - );
215   -
216   - gtk_tree_view_insert_column_with_data_func(
217   - GTK_TREE_VIEW(widget),
218   - -1,
219   - _( "Remote file" ),
220   - gtk_cell_renderer_text_new(),
221   - render_remote,
222   - 0, NULL
223   - );
224   -
225   - return widget;
  187 + return G_V3270_FT_ACTIVITY(object)->values[id];
226 188 }
227 189  
228   - void v3270_activity_list_append(GtkWidget *widget, GObject *activity)
  190 + void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value)
229 191 {
230   - GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
231   - GtkTreeIter iter;
232   - gtk_list_store_append((GtkListStore *) model,&iter);
233   - gtk_list_store_set((GtkListStore *) model, &iter, 0, activity, -1);
234   - }
235   -
236   -guint v3270_ft_activity_get_value(GObject * object, LIB3270_FT_VALUE id)
237   -{
238   - return G_V3270_FT_ACTIVITY(object)->values[id];
239   -}
240   -
241   -void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value)
242   -{
243 192 G_V3270_FT_ACTIVITY(object)->values[id] = value;
244   -}
  193 + }
245 194  
... ...
src/v3270ft/activitylist.c 0 → 100644
... ... @@ -0,0 +1,163 @@
  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 <internals.h>
  31 + #include "private.h"
  32 + #include "marshal.h"
  33 +
  34 +/*--[ Widget definition ]----------------------------------------------------------------------------*/
  35 +
  36 + enum _SIGNALS
  37 + {
  38 + V3270_ACTIVITY_LIST_HAS_FILE_SIGNAL, ///< @brief Indicates if the list has a file name set.
  39 +
  40 + V3270_ACTIVITY_LIST_LAST_SIGNAL
  41 + };
  42 +
  43 + struct _V3270FTActivityListClass
  44 + {
  45 + GtkTreeViewClass parent_class;
  46 +
  47 + struct
  48 + {
  49 + void (*has_file)(GtkWidget *, gboolean);
  50 + } signal;
  51 +
  52 + };
  53 +
  54 + struct _V3270FTActivityList
  55 + {
  56 + GtkTreeView parent;
  57 + gchar * filename;
  58 +
  59 + };
  60 +
  61 + G_DEFINE_TYPE(V3270FTActivityList, V3270FTActivityList, GTK_TYPE_TREE_VIEW);
  62 +
  63 + static guint v3270_activity_list_signals[V3270_ACTIVITY_LIST_LAST_SIGNAL] = { 0 };
  64 +
  65 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  66 +
  67 + static void dispose(GObject *object)
  68 + {
  69 + debug("%s",__FUNCTION__);
  70 +
  71 + V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(object);
  72 +
  73 + g_free(list->filename);
  74 +
  75 + }
  76 +
  77 + static void V3270FTActivityList_has_file(GtkWidget G_GNUC_UNUSED(*widget), gboolean G_GNUC_UNUSED(has_file))
  78 + {
  79 + debug("%s",__FUNCTION__);
  80 + }
  81 +
  82 + static void V3270FTActivityList_class_init(V3270FTActivityListClass *klass)
  83 + {
  84 + GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
  85 +
  86 + gobject_class->dispose = dispose;
  87 +
  88 + klass->signal.has_file = V3270FTActivityList_has_file;
  89 +
  90 + v3270_activity_list_signals[V3270_ACTIVITY_LIST_HAS_FILE_SIGNAL] =
  91 + g_signal_new( "has-file",
  92 + G_OBJECT_CLASS_TYPE (gobject_class),
  93 + G_SIGNAL_RUN_FIRST,
  94 + G_STRUCT_OFFSET (V3270FTActivityListClass, signal.has_file),
  95 + NULL, NULL,
  96 + v3270ft_VOID__VOID_BOOLEAN,
  97 + G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
  98 +
  99 +
  100 + }
  101 +
  102 + static void render_local(GtkTreeViewColumn G_GNUC_UNUSED(*tree_column), GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer G_GNUC_UNUSED(data))
  103 + {
  104 + GObject * activity;
  105 + gtk_tree_model_get(tree_model, iter, 0, &activity, -1);
  106 + g_object_set(G_OBJECT(cell),"text",v3270_ft_activity_get_local_filename(activity),NULL);
  107 + }
  108 +
  109 + static void render_remote(GtkTreeViewColumn G_GNUC_UNUSED(*tree_column), GtkCellRenderer *cell, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer G_GNUC_UNUSED(data))
  110 + {
  111 + GObject * activity;
  112 + gtk_tree_model_get(tree_model, iter, 0, &activity, -1);
  113 + g_object_set(G_OBJECT(cell),"text",v3270_ft_activity_get_remote_filename(activity),NULL);
  114 + }
  115 +
  116 + static void V3270FTActivityList_init(V3270FTActivityList *widget)
  117 + {
  118 + GtkTreeModel * model = GTK_TREE_MODEL(gtk_list_store_new(1,G_TYPE_OBJECT));
  119 +
  120 + widget->filename = NULL;
  121 +
  122 + gtk_tree_view_set_model(GTK_TREE_VIEW(widget),model);
  123 + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(widget),TRUE);
  124 + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(widget),TRUE);
  125 +
  126 + gtk_tree_view_insert_column_with_data_func(
  127 + GTK_TREE_VIEW(widget),
  128 + -1,
  129 + _( "Local file" ),
  130 + gtk_cell_renderer_text_new(),
  131 + render_local,
  132 + 0, NULL
  133 + );
  134 +
  135 + gtk_tree_view_insert_column_with_data_func(
  136 + GTK_TREE_VIEW(widget),
  137 + -1,
  138 + _( "Remote file" ),
  139 + gtk_cell_renderer_text_new(),
  140 + render_remote,
  141 + 0, NULL
  142 + );
  143 +
  144 + }
  145 +
  146 + GtkWidget * v3270_activity_list_new()
  147 + {
  148 + return g_object_new(GTK_TYPE_V3270_FT_ACTIVITY_LIST, NULL);
  149 + }
  150 +
  151 + void v3270_activity_list_load(GtkWidget *widget)
  152 + {
  153 +
  154 + }
  155 +
  156 + void v3270_activity_list_append(GtkWidget *widget, GObject *activity)
  157 + {
  158 + GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
  159 + GtkTreeIter iter;
  160 + gtk_list_store_append((GtkListStore *) model,&iter);
  161 + gtk_list_store_set((GtkListStore *) model, &iter, 0, activity, -1);
  162 + }
  163 +
... ...
src/v3270ft/dialog.c
... ... @@ -38,7 +38,6 @@
38 38 GtkDialog parent;
39 39  
40 40 GtkWidget * settings;
41   - GtkWidget * queue;
42 41  
43 42 struct {
44 43 GtkWidget * valid;
... ... @@ -47,6 +46,13 @@
47 46 GtkWidget * reset;
48 47 } button;
49 48  
  49 + struct {
  50 + GtkWidget * view;
  51 + GtkWidget * load;
  52 + GtkWidget * save;
  53 + GtkWidget * saveAs;
  54 + } queue;
  55 +
50 56 };
51 57  
52 58 struct _V3270FTDialogClass
... ... @@ -118,14 +124,13 @@ static void reset_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widge
118 124 static void update_clicked(GtkButton G_GNUC_UNUSED(*button), V3270FTDialog *widget)
119 125 {
120 126 v3270_ft_settings_update(widget->settings);
121   - gtk_tree_view_columns_autosize(GTK_TREE_VIEW(widget->queue));
122   - //gtk_widget_queue_draw(widget->queue);
  127 + gtk_tree_view_columns_autosize(GTK_TREE_VIEW(widget->queue.view));
123 128 }
124 129  
125 130 static void insert_clicked(GtkWidget *button, V3270FTDialog *widget)
126 131 {
127 132 GtkTreeIter iter;
128   - GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget->queue));
  133 + GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(widget->queue.view));
129 134  
130 135 if(gtk_tree_model_get_iter_first(model,&iter))
131 136 {
... ... @@ -164,7 +169,7 @@ static void insert_clicked(GtkWidget *button, V3270FTDialog *widget)
164 169 }
165 170  
166 171 // Not found, insert it.
167   - v3270_activity_list_append(widget->queue,v3270_ft_settings_create_activity(widget->settings));
  172 + v3270_activity_list_append(widget->queue.view,v3270_ft_settings_create_activity(widget->settings));
168 173  
169 174 }
170 175  
... ... @@ -173,7 +178,13 @@ static void V3270FTDialog_init(V3270FTDialog *widget)
173 178 widget->settings = v3270_ft_settings_new();
174 179 g_signal_connect(G_OBJECT(widget->settings),"validity",G_CALLBACK(validity_changed),widget);
175 180  
176   - gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
  181 + // Does the dialog have header bar?
  182 + GtkHeaderBar * header = GTK_HEADER_BAR(gtk_dialog_get_header_bar(GTK_DIALOG(widget)));
  183 +
  184 + if(header)
  185 + gtk_header_bar_set_title(header,_( "3270 File transfer"));
  186 + else
  187 + gtk_window_set_title(GTK_WINDOW(widget),_( "3270 File transfer"));
177 188  
178 189 // https://developer.gnome.org/hig/stable/visual-layout.html.en
179 190 gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(widget))),18);
... ... @@ -213,14 +224,14 @@ static void V3270FTDialog_init(V3270FTDialog *widget)
213 224  
214 225 // Create file list view
215 226 {
216   - widget->queue = v3270_activity_list_new();
217   - gtk_widget_set_tooltip_markup(widget->queue,_("Files to transfer"));
218   - g_signal_connect(G_OBJECT(widget->queue),"row-activated",G_CALLBACK(activity_selected),widget);
  227 + widget->queue.view = v3270_activity_list_new();
  228 + gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer"));
  229 + g_signal_connect(G_OBJECT(widget->queue.view),"row-activated",G_CALLBACK(activity_selected),widget);
219 230  
220 231 // Put the view inside a scrolled window.
221 232 GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL);
222 233 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
223   - gtk_container_add(GTK_CONTAINER(scrolled),widget->queue);
  234 + gtk_container_add(GTK_CONTAINER(scrolled),widget->queue.view);
224 235  
225 236 gtk_widget_set_vexpand(scrolled,TRUE);
226 237 gtk_widget_set_hexpand(scrolled,TRUE);
... ... @@ -236,11 +247,47 @@ static void V3270FTDialog_init(V3270FTDialog *widget)
236 247 v3270_ft_activity_set_remote_filename(activity,"remote---");
237 248 v3270_ft_activity_set_options(activity,LIB3270_FT_OPTION_SEND|LIB3270_FT_OPTION_ASCII|LIB3270_FT_OPTION_CRLF|LIB3270_FT_OPTION_REMAP|LIB3270_FT_OPTION_APPEND|LIB3270_FT_RECORD_FORMAT_VARIABLE);
238 249  
239   - v3270_activity_list_append(widget->queue,activity);
  250 + v3270_activity_list_append(widget->queue.view,activity);
240 251 #endif // DEBUG
241 252  
  253 + // Create Transfer queue buttons
  254 + // https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
  255 + widget->queue.load = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_SMALL_TOOLBAR);
  256 + gtk_widget_set_tooltip_markup(widget->queue.load,_("Get transfer queue from file"));
  257 +
  258 + widget->queue.save = gtk_button_new_from_icon_name("document-save",GTK_ICON_SIZE_SMALL_TOOLBAR);
  259 + gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue"));
  260 + gtk_widget_set_sensitive(widget->queue.save,FALSE);
  261 +
  262 + widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
  263 + gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file"));
  264 +
  265 + if(header)
  266 + {
  267 +
  268 + debug("Dialog %s header bar","have");
  269 + gtk_header_bar_pack_start(header,widget->queue.load);
  270 + gtk_header_bar_pack_start(header,widget->queue.save);
  271 + gtk_header_bar_pack_start(header,widget->queue.saveAs);
  272 +
  273 + gtk_widget_show_all(widget->queue.load);
  274 + }
  275 + else
  276 + {
  277 + debug("Dialog %s header bar","don't have");
  278 +
  279 + GtkBox * box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL,6));
  280 + gtk_box_pack_start(GTK_BOX(container),GTK_WIDGET(box),FALSE,FALSE,0);
  281 +
  282 + gtk_box_pack_end(box,widget->queue.load,FALSE,FALSE,0);
  283 + gtk_box_pack_end(box,widget->queue.save,FALSE,FALSE,0);
  284 + gtk_box_pack_end(box,widget->queue.saveAs,FALSE,FALSE,0);
  285 +
  286 + }
  287 +
242 288 }
243 289  
  290 +
244 291 }
245 292  
246 293 LIB3270_EXPORT GtkWidget * v3270_ft_dialog_new(GtkWidget *parent)
... ... @@ -251,7 +298,7 @@ LIB3270_EXPORT GtkWidget * v3270_ft_dialog_new(GtkWidget *parent)
251 298 GtkWidget * dialog =
252 299 GTK_WIDGET(g_object_new(
253 300 GTK_TYPE_V3270_FT_DIALOG,
254   - "use-header-bar", 0, // (use_header ? 1 : 0),
  301 + "use-header-bar", (use_header ? 1 : 0),
255 302 NULL
256 303 ));
257 304  
... ...
src/v3270ft/settings.c
... ... @@ -102,7 +102,6 @@
102 102 debug("%s",__FUNCTION__);
103 103 }
104 104  
105   -
106 105 static void V3270FTSettings_class_init(G_GNUC_UNUSED V3270FTSettingsClass *klass)
107 106 {
108 107 GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
... ...
v3270.cbp
... ... @@ -148,6 +148,9 @@
148 148 <Unit filename="src/v3270ft/activity.c">
149 149 <Option compilerVar="CC" />
150 150 </Unit>
  151 + <Unit filename="src/v3270ft/activitylist.c">
  152 + <Option compilerVar="CC" />
  153 + </Unit>
151 154 <Unit filename="src/v3270ft/dialog.c">
152 155 <Option compilerVar="CC" />
153 156 </Unit>
... ...