Commit b0534ef40082259cf324a148937ad71efe8118c5
1 parent
9ad7fc96
Exists in
master
and in
3 other branches
Improving cut&paste methods.
Showing
6 changed files
with
189 additions
and
34 deletions
Show diff stats
lib3270.cbp
| ... | ... | @@ -220,6 +220,9 @@ |
| 220 | 220 | <Unit filename="src/lib3270/selection/actions.c"> |
| 221 | 221 | <Option compilerVar="CC" /> |
| 222 | 222 | </Unit> |
| 223 | + <Unit filename="src/lib3270/selection/get.c"> | |
| 224 | + <Option compilerVar="CC" /> | |
| 225 | + </Unit> | |
| 223 | 226 | <Unit filename="src/lib3270/selection/selection.c"> |
| 224 | 227 | <Option compilerVar="CC" /> |
| 225 | 228 | </Unit> | ... | ... |
src/include/lib3270.h
| ... | ... | @@ -1040,7 +1040,7 @@ |
| 1040 | 1040 | * @return selected text if available, or NULL. Release it with free() |
| 1041 | 1041 | * |
| 1042 | 1042 | */ |
| 1043 | - LIB3270_EXPORT char * lib3270_get_selected(H3270 *h); | |
| 1043 | + LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession); | |
| 1044 | 1044 | |
| 1045 | 1045 | LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession); |
| 1046 | 1046 | ... | ... |
src/include/lib3270/selection.h
| ... | ... | @@ -24,11 +24,16 @@ |
| 24 | 24 | * |
| 25 | 25 | * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) |
| 26 | 26 | * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) |
| 27 | - * licinio@bb.com.br (Licínio Luis Branco) | |
| 28 | - * kraucer@bb.com.br (Kraucer Fernandes Mazuco) | |
| 29 | 27 | * |
| 30 | 28 | */ |
| 31 | 29 | |
| 30 | + /** | |
| 31 | + * @brief LIB3270 calls for managing selected area. | |
| 32 | + * | |
| 33 | + * @author perry.werneck@gmail.com | |
| 34 | + * | |
| 35 | + */ | |
| 36 | + | |
| 32 | 37 | #ifndef LIB3270_SELECTION_H_INCLUDED |
| 33 | 38 | |
| 34 | 39 | #define LIB3270_SELECTION_H_INCLUDED 1 |
| ... | ... | @@ -41,7 +46,21 @@ |
| 41 | 46 | LIB3270_EXPORT int lib3270_select_all(H3270 *session); |
| 42 | 47 | |
| 43 | 48 | /** |
| 44 | - * "Paste" supplied string. | |
| 49 | + * @brief Get selection options. | |
| 50 | + * | |
| 51 | + * @see lib3270_get_selection | |
| 52 | + * | |
| 53 | + */ | |
| 54 | + typedef enum _LIB3270_SELECTION_OPTIONS { | |
| 55 | + | |
| 56 | + LIB3270_SELECTION_CUT = 0x0001, ///< @brief Cut selected data (if available). | |
| 57 | + LIB3270_SELECTION_ALL = 0x0002, ///< @brief Get all data (the default is get only selected data). | |
| 58 | + LIB3270_SELECTION_UNPROTECTED_ONLY = 0x0004, ///< @brief Get only unprotected contents. | |
| 59 | + | |
| 60 | + } LIB3270_SELECTION_OPTIONS; | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * @brief "Paste" supplied string. | |
| 45 | 64 | * |
| 46 | 65 | * @param h Session handle. |
| 47 | 66 | * @param str String to paste. |
| ... | ... | @@ -54,7 +73,7 @@ |
| 54 | 73 | LIB3270_EXPORT int lib3270_paste(H3270 *h, const unsigned char *str); |
| 55 | 74 | |
| 56 | 75 | /** |
| 57 | - * Paste remaining string. | |
| 76 | + * @brief Paste remaining string. | |
| 58 | 77 | * |
| 59 | 78 | * @param h Session handle. |
| 60 | 79 | * |
| ... | ... | @@ -66,7 +85,7 @@ |
| 66 | 85 | LIB3270_EXPORT int lib3270_pastenext(H3270 *h); |
| 67 | 86 | |
| 68 | 87 | /** |
| 69 | - * Move selected box 1 char in the selected direction. | |
| 88 | + * @brief Move selected box 1 char in the selected direction. | |
| 70 | 89 | * |
| 71 | 90 | * @param h Session handle. |
| 72 | 91 | * @param dir Direction to move |
| ... | ... | @@ -76,7 +95,7 @@ |
| 76 | 95 | LIB3270_EXPORT int lib3270_move_selection(H3270 *h, LIB3270_DIRECTION dir); |
| 77 | 96 | |
| 78 | 97 | /** |
| 79 | - * Move selected box. | |
| 98 | + * @brief Move selected box. | |
| 80 | 99 | * |
| 81 | 100 | * @param h Session handle. |
| 82 | 101 | * @param from Address of origin position inside the selected buffer. |
| ... | ... | @@ -88,7 +107,7 @@ |
| 88 | 107 | LIB3270_EXPORT int lib3270_move_selected_area(H3270 *h, int from, int to); |
| 89 | 108 | |
| 90 | 109 | /** |
| 91 | - * Drag selected region. | |
| 110 | + * @brief Drag selected region. | |
| 92 | 111 | * |
| 93 | 112 | * Move or resize selected box according to the selection flags. |
| 94 | 113 | * |
| ... | ... | @@ -103,7 +122,7 @@ |
| 103 | 122 | LIB3270_EXPORT int lib3270_drag_selection(H3270 *h, unsigned char flag, int origin, int baddr); |
| 104 | 123 | |
| 105 | 124 | /** |
| 106 | - * Gets the selected range of characters in the screen | |
| 125 | + * @brief Gets the selected range of characters in the screen | |
| 107 | 126 | * |
| 108 | 127 | * @param h Session handle. |
| 109 | 128 | * @param start return location for start of selection, as a character offset. |
| ... | ... | @@ -115,7 +134,7 @@ |
| 115 | 134 | LIB3270_EXPORT int lib3270_get_selection_bounds(H3270 *hSession, int *start, int *end); |
| 116 | 135 | |
| 117 | 136 | /** |
| 118 | - * Get bitmasked flag for the current selection. | |
| 137 | + * @brief Get bitmasked flag for the current selection. | |
| 119 | 138 | * |
| 120 | 139 | * Calculate flags to help drawing of the correct mouse pointer over a selection. |
| 121 | 140 | * |
| ... | ... | @@ -127,7 +146,7 @@ |
| 127 | 146 | LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *h, int baddr); |
| 128 | 147 | |
| 129 | 148 | /** |
| 130 | - * Get a string from required region. | |
| 149 | + * @brief Get a string from required region. | |
| 131 | 150 | * |
| 132 | 151 | * @param h Session handle. |
| 133 | 152 | * @param start_pos First char to get. |
| ... | ... | @@ -141,7 +160,7 @@ |
| 141 | 160 | |
| 142 | 161 | |
| 143 | 162 | /** |
| 144 | - * Selects a range of characters in the screen. | |
| 163 | + * @brief Selects a range of characters in the screen. | |
| 145 | 164 | * |
| 146 | 165 | * @param h Session handle. |
| 147 | 166 | * @param start_offset Start offset. | ... | ... |
src/lib3270/private.h
| ... | ... | @@ -670,7 +670,7 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession); |
| 670 | 670 | |
| 671 | 671 | LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block); |
| 672 | 672 | |
| 673 | -LIB3270_INTERNAL void do_select(H3270 *h, int start, int end, int rect); | |
| 673 | +LIB3270_INTERNAL void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect); | |
| 674 | 674 | |
| 675 | 675 | |
| 676 | 676 | /** | ... | ... |
| ... | ... | @@ -0,0 +1,144 @@ |
| 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 <lib3270.h> | |
| 32 | + #include <lib3270/session.h> | |
| 33 | + #include <lib3270/selection.h> | |
| 34 | + #include "3270ds.h" | |
| 35 | + | |
| 36 | + /*--[ Implement ]------------------------------------------------------------------------------------*/ | |
| 37 | + | |
| 38 | +static void clear_chr(H3270 *hSession, int baddr) | |
| 39 | +{ | |
| 40 | + hSession->text[baddr].chr = ' '; | |
| 41 | + | |
| 42 | + hSession->ea_buf[baddr].cc = EBC_null; | |
| 43 | + hSession->ea_buf[baddr].cs = 0; | |
| 44 | + | |
| 45 | + hSession->cbk.update( hSession, | |
| 46 | + baddr, | |
| 47 | + hSession->text[baddr].chr, | |
| 48 | + hSession->text[baddr].attr, | |
| 49 | + baddr == hSession->cursor_addr ); | |
| 50 | +} | |
| 51 | + | |
| 52 | +LIB3270_EXPORT char * lib3270_get_selection(H3270 *hSession, char tok, LIB3270_SELECTION_OPTIONS options) | |
| 53 | +{ | |
| 54 | + int row, col, baddr; | |
| 55 | + char * ret; | |
| 56 | + size_t buflen = (hSession->rows * (hSession->cols+1))+1; | |
| 57 | + size_t sz = 0; | |
| 58 | + unsigned short attr = 0xFFFF; | |
| 59 | + char cut = (options & LIB3270_SELECTION_CUT) != 0; | |
| 60 | + char all = (options & LIB3270_SELECTION_ALL) != 0; | |
| 61 | + | |
| 62 | + if(check_online_session(hSession)) | |
| 63 | + return NULL; | |
| 64 | + | |
| 65 | + if(!hSession->selected || hSession->select.start == hSession->select.end) | |
| 66 | + return NULL; | |
| 67 | + | |
| 68 | + ret = lib3270_malloc(buflen); | |
| 69 | + | |
| 70 | + baddr = 0; | |
| 71 | + unsigned char fa = 0; | |
| 72 | + | |
| 73 | + for(row=0;row < ((int) hSession->rows);row++) | |
| 74 | + { | |
| 75 | + int cr = 0; | |
| 76 | + | |
| 77 | + for(col = 0; col < ((int) hSession->cols);col++) | |
| 78 | + { | |
| 79 | + if(hSession->ea_buf[baddr].fa) { | |
| 80 | + fa = hSession->ea_buf[baddr].fa; | |
| 81 | + } | |
| 82 | + | |
| 83 | + if(all || hSession->text[baddr].attr & LIB3270_ATTR_SELECTED) | |
| 84 | + { | |
| 85 | + if(tok && attr != hSession->text[baddr].attr) | |
| 86 | + { | |
| 87 | + attr = hSession->text[baddr].attr; | |
| 88 | + ret[sz++] = tok; | |
| 89 | + ret[sz++] = (attr & 0x0F); | |
| 90 | + ret[sz++] = ((attr & 0xF0) >> 4); | |
| 91 | + | |
| 92 | + } | |
| 93 | + | |
| 94 | + cr++; | |
| 95 | + ret[sz++] = hSession->text[baddr].chr; | |
| 96 | + | |
| 97 | + if(cut && !FA_IS_PROTECTED(fa)) { | |
| 98 | + clear_chr(hSession,baddr); | |
| 99 | + } | |
| 100 | + | |
| 101 | + } | |
| 102 | + baddr++; | |
| 103 | + } | |
| 104 | + | |
| 105 | + if(cr) | |
| 106 | + ret[sz++] = '\n'; | |
| 107 | + | |
| 108 | + if((sz+10) > buflen) | |
| 109 | + { | |
| 110 | + buflen += 100; | |
| 111 | + ret = lib3270_realloc(ret,buflen); | |
| 112 | + } | |
| 113 | + } | |
| 114 | + | |
| 115 | + if(!sz) | |
| 116 | + { | |
| 117 | + lib3270_free(ret); | |
| 118 | + errno = ENOENT; | |
| 119 | + return NULL; | |
| 120 | + } | |
| 121 | + else if(sz > 1 && ret[sz-1] == '\n') // Remove ending \n | |
| 122 | + { | |
| 123 | + ret[sz-1] = 0; | |
| 124 | + } | |
| 125 | + | |
| 126 | + ret[sz++] = 0; | |
| 127 | + | |
| 128 | + if(sz != buflen) | |
| 129 | + ret = lib3270_realloc(ret,sz); | |
| 130 | + | |
| 131 | + return ret; | |
| 132 | +} | |
| 133 | + | |
| 134 | +LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | |
| 135 | +{ | |
| 136 | + return lib3270_get_selection(hSession,0,0); | |
| 137 | +} | |
| 138 | + | |
| 139 | +LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | |
| 140 | +{ | |
| 141 | + return lib3270_get_selection(hSession,0,LIB3270_SELECTION_CUT); | |
| 142 | +} | |
| 143 | + | |
| 144 | + | ... | ... |
src/lib3270/selection/selection.c
| ... | ... | @@ -84,9 +84,9 @@ static void update_selected_rectangle(H3270 *session) |
| 84 | 84 | |
| 85 | 85 | // First remove unselected areas |
| 86 | 86 | baddr = 0; |
| 87 | - for(row=0;row < session->rows;row++) | |
| 87 | + for(row=0;row < ((int) session->rows);row++) | |
| 88 | 88 | { |
| 89 | - for(col = 0; col < session->cols;col++) | |
| 89 | + for(col = 0; col < ((int) session->cols);col++) | |
| 90 | 90 | { |
| 91 | 91 | if(!(row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && (session->text[baddr].attr & LIB3270_ATTR_SELECTED)) |
| 92 | 92 | { |
| ... | ... | @@ -99,9 +99,9 @@ static void update_selected_rectangle(H3270 *session) |
| 99 | 99 | |
| 100 | 100 | // Then, draw selected ones |
| 101 | 101 | baddr = 0; |
| 102 | - for(row=0;row < session->rows;row++) | |
| 102 | + for(row=0;row < ((int) session->rows);row++) | |
| 103 | 103 | { |
| 104 | - for(col = 0; col < session->cols;col++) | |
| 104 | + for(col = 0; col < ((int) session->cols);col++) | |
| 105 | 105 | { |
| 106 | 106 | if((row >= p[0].row && row <= p[1].row && col >= p[0].col && col <= p[1].col) && !(session->text[baddr].attr & LIB3270_ATTR_SELECTED)) |
| 107 | 107 | { |
| ... | ... | @@ -163,9 +163,9 @@ void toggle_rectselect(H3270 *session, struct lib3270_toggle GNUC_UNUSED(*t), LI |
| 163 | 163 | update_selected_region(session); |
| 164 | 164 | } |
| 165 | 165 | |
| 166 | -void do_select(H3270 *h, int start, int end, int rect) | |
| 166 | +void do_select(H3270 *h, unsigned int start, unsigned int end, unsigned int rect) | |
| 167 | 167 | { |
| 168 | - if(start < 0 || end > (h->rows * h->cols)) | |
| 168 | + if(end > (h->rows * h->cols)) | |
| 169 | 169 | return; |
| 170 | 170 | |
| 171 | 171 | // Do we really need to change selection? |
| ... | ... | @@ -240,6 +240,7 @@ LIB3270_EXPORT unsigned char lib3270_get_selection_flags(H3270 *hSession, int ba |
| 240 | 240 | return rc; |
| 241 | 241 | } |
| 242 | 242 | |
| 243 | +/* | |
| 243 | 244 | static void clear_chr(H3270 *hSession, int baddr) |
| 244 | 245 | { |
| 245 | 246 | hSession->text[baddr].chr = ' '; |
| ... | ... | @@ -254,7 +255,7 @@ static void clear_chr(H3270 *hSession, int baddr) |
| 254 | 255 | baddr == hSession->cursor_addr ); |
| 255 | 256 | } |
| 256 | 257 | |
| 257 | -static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok, Boolean cut) | |
| 258 | +static char * get_text(H3270 *hSession, unsigned char all, char tok, unsigned char cut) | |
| 258 | 259 | { |
| 259 | 260 | int row, col, baddr; |
| 260 | 261 | char * ret; |
| ... | ... | @@ -333,6 +334,7 @@ static char * get_text(H3270 *hSession,unsigned char all, unsigned char tok, Boo |
| 333 | 334 | |
| 334 | 335 | return ret; |
| 335 | 336 | } |
| 337 | +*/ | |
| 336 | 338 | |
| 337 | 339 | LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, unsigned char all) |
| 338 | 340 | { |
| ... | ... | @@ -341,9 +343,7 @@ LIB3270_EXPORT char * lib3270_get_region(H3270 *h, int start_pos, int end_pos, u |
| 341 | 343 | int sz = 0; |
| 342 | 344 | int baddr; |
| 343 | 345 | |
| 344 | - CHECK_SESSION_HANDLE(h); | |
| 345 | - | |
| 346 | - if(!lib3270_connected(h)) | |
| 346 | + if(check_online_session(h)) | |
| 347 | 347 | return NULL; |
| 348 | 348 | |
| 349 | 349 | maxlen = h->rows * (h->cols+1); |
| ... | ... | @@ -470,14 +470,3 @@ LIB3270_EXPORT int lib3270_has_selection(H3270 *hSession) |
| 470 | 470 | |
| 471 | 471 | return hSession->selected != 0; |
| 472 | 472 | } |
| 473 | - | |
| 474 | -LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) | |
| 475 | -{ | |
| 476 | - return get_text(hSession,0,0,0); | |
| 477 | -} | |
| 478 | - | |
| 479 | -LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) | |
| 480 | -{ | |
| 481 | - return get_text(hSession,0,0,1); | |
| 482 | -} | |
| 483 | - | ... | ... |