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 | 41 | Cursor=green,green |
| 42 | 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 | 44 | [WB] |
| 54 | 45 | Label=White on Black |
| 55 | 46 | Label[pt_BR]=Branco com fundo preto | ... | ... |
src/gtk/print.c
| ... | ... | @@ -37,6 +37,9 @@ |
| 37 | 37 | typedef struct _print_info |
| 38 | 38 | { |
| 39 | 39 | GdkColor color[V3270_COLOR_COUNT]; |
| 40 | + int show_selection : 1; | |
| 41 | + int all : 1; | |
| 42 | + | |
| 40 | 43 | H3270 * session; |
| 41 | 44 | gchar * font; |
| 42 | 45 | guint fontsize; |
| ... | ... | @@ -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 | 85 | setup_font(context,info); |
| 84 | 86 | gtk_print_operation_set_n_pages(prt,1); |
| 85 | 87 | } |
| ... | ... | @@ -115,8 +117,12 @@ |
| 115 | 117 | unsigned char c; |
| 116 | 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 | 124 | v3270_draw_element(cr,c,attr,info->session,info->extents.height,&rect,info->color); |
| 125 | + } | |
| 120 | 126 | |
| 121 | 127 | rect.x += (rect.width-1); |
| 122 | 128 | } |
| ... | ... | @@ -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 | 221 | static GObject * create_custom_widget(GtkPrintOperation *prt, PRINT_INFO *info) |
| 209 | 222 | { |
| 210 | 223 | static const gchar *def_colors = "white," // V3270_COLOR_BACKGROUND |
| ... | ... | @@ -239,7 +252,7 @@ |
| 239 | 252 | "black"; // V3270_COLOR_OIA_STATUS_INVALID |
| 240 | 253 | |
| 241 | 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 | 256 | GtkWidget * widget; |
| 244 | 257 | int f; |
| 245 | 258 | |
| ... | ... | @@ -277,6 +290,22 @@ |
| 277 | 290 | |
| 278 | 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 | 309 | // Show and return |
| 281 | 310 | gtk_widget_show_all(container); |
| 282 | 311 | return G_OBJECT(container); |
| ... | ... | @@ -315,9 +344,8 @@ |
| 315 | 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 | 350 | // Common signals |
| 323 | 351 | g_signal_connect(print,"done",G_CALLBACK(done),*info); |
| ... | ... | @@ -338,7 +366,10 @@ |
| 338 | 366 | |
| 339 | 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 | 373 | g_signal_connect(print,"draw_page",G_CALLBACK(draw_page),info); |
| 343 | 374 | |
| 344 | 375 | // Run Print dialog |
| ... | ... | @@ -350,8 +381,35 @@ |
| 350 | 381 | |
| 351 | 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 | 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 | 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 | 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 | 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 | 103 | else |
| 107 | 104 | { |
| 108 | - bg = color+((attr & 0x00F0) >> 4); | |
| 105 | + *bg = color+((attr & 0x00F0) >> 4); | |
| 109 | 106 | |
| 110 | 107 | if(attr & LIB3270_ATTR_FIELD) |
| 111 | - fg = color+(attr & 0x0003)+V3270_COLOR_FIELD; | |
| 108 | + *fg = color+(attr & 0x0003)+V3270_COLOR_FIELD; | |
| 112 | 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 | 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 | 372 | GdkColor * fg; |
| 369 | 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 | 377 | cairo_set_scaled_font(cr,widget->font_scaled); |
| 386 | 378 | ... | ... |
src/include/lib3270/selection.h
| ... | ... | @@ -73,5 +73,17 @@ |
| 73 | 73 | */ |
| 74 | 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 | 89 | #endif // LIB3270_SELECTION_H_INCLUDED | ... | ... |
src/lib3270/selection.c
| ... | ... | @@ -360,6 +360,26 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) |
| 360 | 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 | 383 | LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir) |
| 364 | 384 | { |
| 365 | 385 | if(!hSession->selected || hSession->select.begin == hSession->select.end) | ... | ... |