Commit 3d52cd0c26b2b80527318b89528ca9ae9cfaf21e
1 parent
6d5ebe31
Exists in
master
and in
5 other branches
Implementando opção para imprimir apenas o bloco selecionado
Showing
5 changed files
with
112 additions
and
39 deletions
Show diff stats
colors.conf
@@ -41,15 +41,6 @@ SelectedText=dimGrey,green,dimGrey | @@ -41,15 +41,6 @@ SelectedText=dimGrey,green,dimGrey | ||
41 | Cursor=green,green | 41 | Cursor=green,green |
42 | OIA=black,green,green,green,green | 42 | OIA=black,green,green,green,green |
43 | 43 | ||
44 | -[BW] | ||
45 | -Label=Black & White | ||
46 | -Label[pt_BR]=Branco e preto | ||
47 | -Terminal=black,white,white,white,white,white,white,white,white,white,white,white,white,white,white,white | ||
48 | -BaseAttributes=white,white,white,white | ||
49 | -SelectedText=dimGrey,white,dimGrey | ||
50 | -Cursor=white,white | ||
51 | -OIA=black,green,white,white | ||
52 | - | ||
53 | [WB] | 44 | [WB] |
54 | Label=White on Black | 45 | Label=White on Black |
55 | Label[pt_BR]=Branco com fundo preto | 46 | Label[pt_BR]=Branco com fundo preto |
src/gtk/print.c
@@ -37,6 +37,9 @@ | @@ -37,6 +37,9 @@ | ||
37 | typedef struct _print_info | 37 | typedef struct _print_info |
38 | { | 38 | { |
39 | GdkColor color[V3270_COLOR_COUNT]; | 39 | GdkColor color[V3270_COLOR_COUNT]; |
40 | + int show_selection : 1; | ||
41 | + int all : 1; | ||
42 | + | ||
40 | H3270 * session; | 43 | H3270 * session; |
41 | gchar * font; | 44 | gchar * font; |
42 | guint fontsize; | 45 | guint fontsize; |
@@ -77,9 +80,8 @@ | @@ -77,9 +80,8 @@ | ||
77 | 80 | ||
78 | } | 81 | } |
79 | 82 | ||
80 | - static void begin_print_all(GtkPrintOperation *prt, GtkPrintContext *context, PRINT_INFO *info) | 83 | + static void begin_print(GtkPrintOperation *prt, GtkPrintContext *context, PRINT_INFO *info) |
81 | { | 84 | { |
82 | - lib3270_get_screen_size(info->session,&info->rows,&info->cols); | ||
83 | setup_font(context,info); | 85 | setup_font(context,info); |
84 | gtk_print_operation_set_n_pages(prt,1); | 86 | gtk_print_operation_set_n_pages(prt,1); |
85 | } | 87 | } |
@@ -115,8 +117,12 @@ | @@ -115,8 +117,12 @@ | ||
115 | unsigned char c; | 117 | unsigned char c; |
116 | unsigned short attr; | 118 | unsigned short attr; |
117 | 119 | ||
118 | - if(!lib3270_get_element(info->session,baddr++,&c,&attr)) | 120 | + if(!lib3270_get_element(info->session,baddr++,&c,&attr) && (info->all || (attr & LIB3270_ATTR_SELECTED))) |
121 | + { | ||
122 | + if(!info->show_selection) | ||
123 | + attr &= ~LIB3270_ATTR_SELECTED; | ||
119 | v3270_draw_element(cr,c,attr,info->session,info->extents.height,&rect,info->color); | 124 | v3270_draw_element(cr,c,attr,info->session,info->extents.height,&rect,info->color); |
125 | + } | ||
120 | 126 | ||
121 | rect.x += (rect.width-1); | 127 | rect.x += (rect.width-1); |
122 | } | 128 | } |
@@ -205,6 +211,13 @@ | @@ -205,6 +211,13 @@ | ||
205 | 211 | ||
206 | } | 212 | } |
207 | 213 | ||
214 | + static void toggle_show_selection(GtkToggleButton *togglebutton,PRINT_INFO *info) | ||
215 | + { | ||
216 | + gboolean active = gtk_toggle_button_get_active(togglebutton); | ||
217 | + info->show_selection = active ? 1 : 0; | ||
218 | + set_boolean_to_config("print","selection",active); | ||
219 | + } | ||
220 | + | ||
208 | static GObject * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info) | 221 | static GObject * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info) |
209 | { | 222 | { |
210 | static const gchar *def_colors = "white," // V3270_COLOR_BACKGROUND | 223 | static const gchar *def_colors = "white," // V3270_COLOR_BACKGROUND |
@@ -239,7 +252,7 @@ | @@ -239,7 +252,7 @@ | ||
239 | "black"; // V3270_COLOR_OIA_STATUS_INVALID | 252 | "black"; // V3270_COLOR_OIA_STATUS_INVALID |
240 | 253 | ||
241 | static const gchar * label[] = { N_( "Font:" ), N_( "Color scheme:" ) }; | 254 | static const gchar * label[] = { N_( "Font:" ), N_( "Color scheme:" ) }; |
242 | - GtkWidget * container = gtk_table_new(2,2,FALSE); | 255 | + GtkWidget * container = gtk_table_new(3,2,FALSE); |
243 | GtkWidget * widget; | 256 | GtkWidget * widget; |
244 | int f; | 257 | int f; |
245 | 258 | ||
@@ -277,6 +290,22 @@ | @@ -277,6 +290,22 @@ | ||
277 | 290 | ||
278 | gtk_table_attach(GTK_TABLE(container),widget,1,2,1,2,GTK_EXPAND|GTK_FILL,GTK_FILL,5,0); | 291 | gtk_table_attach(GTK_TABLE(container),widget,1,2,1,2,GTK_EXPAND|GTK_FILL,GTK_FILL,5,0); |
279 | 292 | ||
293 | + // Selection checkbox | ||
294 | + widget = gtk_check_button_new_with_label(_("Print selection box")); | ||
295 | + | ||
296 | + if(info->all) | ||
297 | + { | ||
298 | + info->show_selection = get_boolean_from_config("print","selection",FALSE); | ||
299 | + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),info->show_selection); | ||
300 | + g_signal_connect(G_OBJECT(widget),"toggled",G_CALLBACK(toggle_show_selection),info); | ||
301 | + } | ||
302 | + else | ||
303 | + { | ||
304 | + gtk_widget_set_sensitive(widget,FALSE); | ||
305 | + } | ||
306 | + | ||
307 | + gtk_table_attach(GTK_TABLE(container),widget,1,2,2,3,GTK_EXPAND|GTK_FILL,GTK_FILL,5,0); | ||
308 | + | ||
280 | // Show and return | 309 | // Show and return |
281 | gtk_widget_show_all(container); | 310 | gtk_widget_show_all(container); |
282 | return G_OBJECT(container); | 311 | return G_OBJECT(container); |
@@ -315,9 +344,8 @@ | @@ -315,9 +344,8 @@ | ||
315 | g_free(ptr); | 344 | g_free(ptr); |
316 | } | 345 | } |
317 | 346 | ||
318 | - gtk_print_operation_set_custom_tab_label(print,_( "Style" )); | ||
319 | - | ||
320 | -// gtk_print_operation_set_show_progress(print,TRUE); | 347 | + gtk_print_operation_set_custom_tab_label(print,_( "Options" )); |
348 | + gtk_print_operation_set_show_progress(print,TRUE); | ||
321 | 349 | ||
322 | // Common signals | 350 | // Common signals |
323 | g_signal_connect(print,"done",G_CALLBACK(done),*info); | 351 | g_signal_connect(print,"done",G_CALLBACK(done),*info); |
@@ -338,7 +366,10 @@ | @@ -338,7 +366,10 @@ | ||
338 | 366 | ||
339 | trace("Action %s activated on widget %p print=%p",gtk_action_get_name(action),widget,print); | 367 | trace("Action %s activated on widget %p print=%p",gtk_action_get_name(action),widget,print); |
340 | 368 | ||
341 | - g_signal_connect(print,"begin_print",G_CALLBACK(begin_print_all),info); | 369 | + lib3270_get_screen_size(info->session,&info->rows,&info->cols); |
370 | + | ||
371 | + info->all = 1; | ||
372 | + g_signal_connect(print,"begin_print",G_CALLBACK(begin_print),info); | ||
342 | g_signal_connect(print,"draw_page",G_CALLBACK(draw_page),info); | 373 | g_signal_connect(print,"draw_page",G_CALLBACK(draw_page),info); |
343 | 374 | ||
344 | // Run Print dialog | 375 | // Run Print dialog |
@@ -350,8 +381,35 @@ | @@ -350,8 +381,35 @@ | ||
350 | 381 | ||
351 | void print_selected_action(GtkAction *action, GtkWidget *widget) | 382 | void print_selected_action(GtkAction *action, GtkWidget *widget) |
352 | { | 383 | { |
384 | + PRINT_INFO * info = NULL; | ||
385 | + int start, end, rows; | ||
386 | + GtkPrintOperation * print = begin_print_operation(action,widget,&info);; | ||
387 | + | ||
353 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); | 388 | trace("Action %s activated on widget %p",gtk_action_get_name(action),widget); |
354 | 389 | ||
390 | + if(lib3270_get_selected_addr(info->session,&start,&end)) | ||
391 | + { | ||
392 | + g_warning("Can't get selected addresses for action %s",gtk_action_get_name(action)); | ||
393 | + g_object_unref(print); | ||
394 | + return; | ||
395 | + } | ||
396 | + | ||
397 | + info->baddr = start; | ||
398 | + lib3270_get_screen_size(info->session,&rows,&info->cols); | ||
399 | + | ||
400 | + info->rows = ((end / info->cols) - (start / info->cols))+1; | ||
401 | + | ||
402 | + trace("First row: %d End row: %d Num rows: %d",(start / info->cols),(end / info->cols),info->rows); | ||
403 | + | ||
404 | + info->all = 0; | ||
405 | + g_signal_connect(print,"begin_print",G_CALLBACK(begin_print),info); | ||
406 | + g_signal_connect(print,"draw_page",G_CALLBACK(draw_page),info); | ||
407 | + | ||
408 | + // Run Print dialog | ||
409 | + gtk_print_operation_run(print,GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,GTK_WINDOW(gtk_widget_get_toplevel(widget)),NULL); | ||
410 | + | ||
411 | + | ||
412 | + g_object_unref(print); | ||
355 | } | 413 | } |
356 | 414 | ||
357 | void print_copy_action(GtkAction *action, GtkWidget *widget) | 415 | void print_copy_action(GtkAction *action, GtkWidget *widget) |
src/gtk/v3270/draw.c
@@ -93,26 +93,30 @@ gboolean v3270_expose(GtkWidget *widget, GdkEventExpose *event) | @@ -93,26 +93,30 @@ gboolean v3270_expose(GtkWidget *widget, GdkEventExpose *event) | ||
93 | #endif // GTk3 | 93 | #endif // GTk3 |
94 | 94 | ||
95 | 95 | ||
96 | -void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color) | 96 | +static void get_element_colors(unsigned short attr, GdkColor **fg, GdkColor **bg, GdkColor *color) |
97 | { | 97 | { |
98 | - GdkColor *fg; | ||
99 | - GdkColor *bg; | ||
100 | - | ||
101 | if(attr & LIB3270_ATTR_SELECTED) | 98 | if(attr & LIB3270_ATTR_SELECTED) |
102 | { | 99 | { |
103 | - fg = color+V3270_COLOR_SELECTED_FG; | ||
104 | - bg = color+V3270_COLOR_SELECTED_BG; | 100 | + *fg = color+V3270_COLOR_SELECTED_FG; |
101 | + *bg = color+V3270_COLOR_SELECTED_BG; | ||
105 | } | 102 | } |
106 | else | 103 | else |
107 | { | 104 | { |
108 | - bg = color+((attr & 0x00F0) >> 4); | 105 | + *bg = color+((attr & 0x00F0) >> 4); |
109 | 106 | ||
110 | if(attr & LIB3270_ATTR_FIELD) | 107 | if(attr & LIB3270_ATTR_FIELD) |
111 | - fg = color+(attr & 0x0003)+V3270_COLOR_FIELD; | 108 | + *fg = color+(attr & 0x0003)+V3270_COLOR_FIELD; |
112 | else | 109 | else |
113 | - fg = color+(attr & 0x000F); | 110 | + *fg = color+(attr & 0x000F); |
114 | } | 111 | } |
112 | +} | ||
115 | 113 | ||
114 | +void v3270_draw_element(cairo_t *cr, unsigned char chr, unsigned short attr, H3270 *session, guint height, GdkRectangle *rect, GdkColor *color) | ||
115 | +{ | ||
116 | + GdkColor *fg; | ||
117 | + GdkColor *bg; | ||
118 | + | ||
119 | + get_element_colors(attr,&fg,&bg,color); | ||
116 | v3270_draw_char(cr,chr,attr,session,height,rect,fg,bg); | 120 | v3270_draw_char(cr,chr,attr,session,height,rect,fg,bg); |
117 | } | 121 | } |
118 | 122 | ||
@@ -368,19 +372,7 @@ void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned short | @@ -368,19 +372,7 @@ void v3270_update_cursor_surface(v3270 *widget,unsigned char chr,unsigned short | ||
368 | GdkColor * fg; | 372 | GdkColor * fg; |
369 | GdkColor * bg; | 373 | GdkColor * bg; |
370 | 374 | ||
371 | - if(attr & LIB3270_ATTR_SELECTED) | ||
372 | - { | ||
373 | - fg = widget->color+V3270_COLOR_SELECTED_FG; | ||
374 | - bg = widget->color+V3270_COLOR_SELECTED_BG; | ||
375 | - } | ||
376 | - else | ||
377 | - { | ||
378 | - fg = widget->color+((attr & 0x00F0) >> 4); | ||
379 | - if(attr & LIB3270_ATTR_FIELD) | ||
380 | - bg = widget->color+(attr & 0x0003)+V3270_COLOR_FIELD; | ||
381 | - else | ||
382 | - bg = widget->color+(attr & 0x000F); | ||
383 | - } | 375 | + get_element_colors(attr,&fg,&bg,widget->color); |
384 | 376 | ||
385 | cairo_set_scaled_font(cr,widget->font_scaled); | 377 | cairo_set_scaled_font(cr,widget->font_scaled); |
386 | 378 |
src/include/lib3270/selection.h
@@ -73,5 +73,17 @@ | @@ -73,5 +73,17 @@ | ||
73 | */ | 73 | */ |
74 | LIB3270_EXPORT int lib3270_move_selection(H3270 *h, LIB3270_DIRECTION dir); | 74 | LIB3270_EXPORT int lib3270_move_selection(H3270 *h, LIB3270_DIRECTION dir); |
75 | 75 | ||
76 | + /** | ||
77 | + * Get addresses of selected area. | ||
78 | + * | ||
79 | + * @param h Session handle. | ||
80 | + * @param begin Pointer to the begin value. | ||
81 | + * @param end Pointer to the end value. | ||
82 | + * | ||
83 | + * @return 0 if the selected area was get, non zero if unselected or unavailable. | ||
84 | + * | ||
85 | + */ | ||
86 | + LIB3270_EXPORT int lib3270_get_selected_addr(H3270 *hSession, int *begin, int *end); | ||
87 | + | ||
76 | 88 | ||
77 | #endif // LIB3270_SELECTION_H_INCLUDED | 89 | #endif // LIB3270_SELECTION_H_INCLUDED |
src/lib3270/selection.c
@@ -360,6 +360,26 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | @@ -360,6 +360,26 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | ||
360 | return get_text(hSession,0); | 360 | return get_text(hSession,0); |
361 | } | 361 | } |
362 | 362 | ||
363 | +LIB3270_EXPORT int lib3270_get_selected_addr(H3270 *hSession, int *begin, int *end) | ||
364 | +{ | ||
365 | + if(!hSession->selected || hSession->select.begin == hSession->select.end) | ||
366 | + return -1; | ||
367 | + | ||
368 | + if(hSession->select.end > hSession->select.begin) | ||
369 | + { | ||
370 | + *begin = hSession->select.begin; | ||
371 | + *end = hSession->select.end; | ||
372 | + } | ||
373 | + else | ||
374 | + { | ||
375 | + *begin = hSession->select.end; | ||
376 | + *end = hSession->select.begin; | ||
377 | + } | ||
378 | + | ||
379 | + return 0; | ||
380 | +} | ||
381 | + | ||
382 | + | ||
363 | LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir) | 383 | LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir) |
364 | { | 384 | { |
365 | if(!hSession->selected || hSession->select.begin == hSession->select.end) | 385 | if(!hSession->selected || hSession->select.begin == hSession->select.end) |