Commit a19024d309470ea2c4fe4b935cd1f51a151bf393

Authored by perry.werneck@gmail.com
1 parent f638ef95

Melhorando mecanismo de seleção

src/gtk/v3270/mouse.c
@@ -60,7 +60,7 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr) @@ -60,7 +60,7 @@ static void button_1_press(GtkWidget *widget, GdkEventType type, int baddr)
60 { 60 {
61 case GDK_BUTTON_PRESS: // Single click - Just move cursor 61 case GDK_BUTTON_PRESS: // Single click - Just move cursor
62 lib3270_set_cursor_address(GTK_V3270(widget)->host,baddr); 62 lib3270_set_cursor_address(GTK_V3270(widget)->host,baddr);
63 - lib3270_clear_selection(GTK_V3270(widget)->host); 63 + lib3270_unselect(GTK_V3270(widget)->host);
64 break; 64 break;
65 65
66 case GDK_2BUTTON_PRESS: // Double click - Select word 66 case GDK_2BUTTON_PRESS: // Double click - Select word
src/include/lib3270/action_table.h
@@ -62,6 +62,7 @@ @@ -62,6 +62,7 @@
62 DECLARE_LIB3270_ACTION( selectfield ) 62 DECLARE_LIB3270_ACTION( selectfield )
63 DECLARE_LIB3270_ACTION( selectall ) 63 DECLARE_LIB3270_ACTION( selectall )
64 DECLARE_LIB3270_ACTION( unselect ) 64 DECLARE_LIB3270_ACTION( unselect )
  65 + DECLARE_LIB3270_ACTION( reselect )
65 66
66 DECLARE_LIB3270_ACTION( firstfield ) 67 DECLARE_LIB3270_ACTION( firstfield )
67 DECLARE_LIB3270_ACTION( eraseeof ) 68 DECLARE_LIB3270_ACTION( eraseeof )
src/include/lib3270/session.h
@@ -38,7 +38,7 @@ @@ -38,7 +38,7 @@
38 38
39 struct _h3270 39 struct _h3270
40 { 40 {
41 - unsigned short sz; /**< Struct size */ 41 + unsigned short sz; /**< Struct size */
42 42
43 // Connection info 43 // Connection info
44 int secure_connection; 44 int secure_connection;
@@ -50,6 +50,10 @@ @@ -50,6 +50,10 @@
50 HANDLE sock_handle; 50 HANDLE sock_handle;
51 #endif /*]*/ 51 #endif /*]*/
52 52
  53 + // flags
  54 + int selected : 1;
  55 +
  56 + // Network & Termtype
53 char * hostname; 57 char * hostname;
54 char * connected_type; 58 char * connected_type;
55 char * connected_lu; 59 char * connected_lu;
@@ -104,7 +108,7 @@ @@ -104,7 +108,7 @@
104 { 108 {
105 int begin; 109 int begin;
106 int end; 110 int end;
107 - } selected; 111 + } select;
108 112
109 // xio 113 // xio
110 unsigned long ns_read_id; 114 unsigned long ns_read_id;
src/lib3270/glue.c
@@ -169,9 +169,6 @@ static void lib3270_session_init(H3270 *hSession, const char *model) @@ -169,9 +169,6 @@ static void lib3270_session_init(H3270 *hSession, const char *model)
169 hSession->cstate = NOT_CONNECTED; 169 hSession->cstate = NOT_CONNECTED;
170 hSession->oia_status = -1; 170 hSession->oia_status = -1;
171 171
172 - hSession->selected.begin = -1;  
173 - hSession->selected.end = -1;  
174 -  
175 strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH); 172 strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH);
176 hSession->model_name = &hSession->full_model_name[4]; 173 hSession->model_name = &hSession->full_model_name[4];
177 174
@@ -294,7 +291,8 @@ static void initialize(void) @@ -294,7 +291,8 @@ static void initialize(void)
294 Trace("Initializing library (calls: %d)",init_calls); 291 Trace("Initializing library (calls: %d)",init_calls);
295 #endif 292 #endif
296 293
297 - h3270.selected.begin = h3270.selected.end = -1; 294 + h3270.selected = 0;
  295 + h3270.select.begin = h3270.select.end = 0;
298 initialize_toggles(&h3270,appres.toggle); 296 initialize_toggles(&h3270,appres.toggle);
299 297
300 #if defined(_WIN32) 298 #if defined(_WIN32)
src/lib3270/selection.c
@@ -44,8 +44,8 @@ static void update_selected_rectangle(H3270 *session) @@ -44,8 +44,8 @@ static void update_selected_rectangle(H3270 *session)
44 int col; 44 int col;
45 } p[2]; 45 } p[2];
46 46
47 - int begin = session->selected.begin;  
48 - int end = session->selected.end; 47 + int begin = session->select.begin;
  48 + int end = session->select.end;
49 int row, col, baddr; 49 int row, col, baddr;
50 50
51 if(begin > end) 51 if(begin > end)
@@ -96,8 +96,8 @@ static void update_selected_rectangle(H3270 *session) @@ -96,8 +96,8 @@ static void update_selected_rectangle(H3270 *session)
96 static void update_selected_region(H3270 *session) 96 static void update_selected_region(H3270 *session)
97 { 97 {
98 int baddr; 98 int baddr;
99 - int begin = session->selected.begin;  
100 - int end = session->selected.end; 99 + int begin = session->select.begin;
  100 + int end = session->select.end;
101 int len = session->rows*session->cols; 101 int len = session->rows*session->cols;
102 102
103 if(begin > end) 103 if(begin > end)
@@ -146,9 +146,18 @@ void update_selection(H3270 *session) @@ -146,9 +146,18 @@ void update_selection(H3270 *session)
146 update_selected_region(session); 146 update_selected_region(session);
147 } 147 }
148 148
  149 +static void set_selected(H3270 *session)
  150 +{
  151 + if(session->selected)
  152 + return;
  153 +
  154 + session->selected = 1;
  155 + session->set_selection(session,1);
  156 +}
  157 +
149 void toggle_rectselect(H3270 *session, struct toggle *t, LIB3270_TOGGLE_TYPE tt) 158 void toggle_rectselect(H3270 *session, struct toggle *t, LIB3270_TOGGLE_TYPE tt)
150 { 159 {
151 - if(session->selected.begin < 0) 160 + if(!session->selected)
152 return; 161 return;
153 162
154 if(t->value) 163 if(t->value)
@@ -157,24 +166,25 @@ void toggle_rectselect(H3270 *session, struct toggle *t, LIB3270_TOGGLE_TYPE tt) @@ -157,24 +166,25 @@ void toggle_rectselect(H3270 *session, struct toggle *t, LIB3270_TOGGLE_TYPE tt)
157 update_selected_region(session); 166 update_selected_region(session);
158 } 167 }
159 168
160 -LIB3270_EXPORT void lib3270_clear_selection(H3270 *session) 169 +LIB3270_ACTION(unselect)
161 { 170 {
162 int a; 171 int a;
163 172
164 - session->selected.begin = -1;  
165 - session->selected.end = -1; 173 + CHECK_SESSION_HANDLE(hSession);
  174 +
  175 + hSession->selected = 0;
166 176
167 - for(a = 0; a < session->rows*session->cols; a++) 177 + for(a = 0; a < hSession->rows*hSession->cols; a++)
168 { 178 {
169 if(ea_buf[a].attr & LIB3270_ATTR_SELECTED) 179 if(ea_buf[a].attr & LIB3270_ATTR_SELECTED)
170 { 180 {
171 ea_buf[a].attr &= ~LIB3270_ATTR_SELECTED; 181 ea_buf[a].attr &= ~LIB3270_ATTR_SELECTED;
172 - if(session->update)  
173 - session->update(session,a,ea_buf[a].chr,ea_buf[a].attr,a == session->cursor_addr); 182 + if(hSession->update)
  183 + hSession->update(hSession,a,ea_buf[a].chr,ea_buf[a].attr,a == hSession->cursor_addr);
174 } 184 }
175 } 185 }
176 186
177 - session->set_selection(session,0); 187 + hSession->set_selection(hSession,0);
178 188
179 } 189 }
180 190
@@ -185,12 +195,12 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr) @@ -185,12 +195,12 @@ LIB3270_EXPORT void lib3270_select_to(H3270 *session, int baddr)
185 if(!lib3270_connected(session)) 195 if(!lib3270_connected(session))
186 return; 196 return;
187 197
188 - lib3270_set_cursor_address(session,session->selected.end = baddr); 198 + lib3270_set_cursor_address(session,session->select.end = baddr);
189 199
190 - if(session->selected.begin < 0) 200 + if(!session->selected)
191 { 201 {
192 - session->selected.begin = session->cursor_addr;  
193 - session->set_selection(session,1); 202 + session->select.begin = session->cursor_addr;
  203 + set_selected(session);
194 } 204 }
195 205
196 update_selection(session); 206 update_selection(session);
@@ -210,12 +220,13 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr) @@ -210,12 +220,13 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr)
210 } 220 }
211 221
212 for(pos = baddr; pos > 0 && !isspace(ea_buf[pos].chr);pos--); 222 for(pos = baddr; pos > 0 && !isspace(ea_buf[pos].chr);pos--);
213 - session->selected.begin = pos > 0 ? pos+1 : 0; 223 + session->select.begin = pos > 0 ? pos+1 : 0;
214 224
215 len = session->rows * session->cols; 225 len = session->rows * session->cols;
216 for(pos = baddr; pos < len && !isspace(ea_buf[pos].chr);pos++); 226 for(pos = baddr; pos < len && !isspace(ea_buf[pos].chr);pos++);
217 - session->selected.end = pos < len ? pos-1 : len; 227 + session->select.end = pos < len ? pos-1 : len;
218 228
  229 + set_selected(session);
219 update_selected_region(session); 230 update_selected_region(session);
220 } 231 }
221 232
@@ -239,14 +250,15 @@ LIB3270_EXPORT int lib3270_select_field_at(H3270 *session, int baddr) @@ -239,14 +250,15 @@ LIB3270_EXPORT int lib3270_select_field_at(H3270 *session, int baddr)
239 return -1; 250 return -1;
240 } 251 }
241 252
242 - session->selected.begin = (start+1); 253 + session->select.begin = (start+1);
243 254
244 len = (session->rows * session->cols)-1; 255 len = (session->rows * session->cols)-1;
245 256
246 - session->selected.end = start + lib3270_field_length(session,start);  
247 - if(session->selected.end > len)  
248 - session->selected.end = len; 257 + session->select.end = start + lib3270_field_length(session,start);
  258 + if(session->select.end > len)
  259 + session->select.end = len;
249 260
  261 + set_selected(session);
250 update_selected_region(session); 262 update_selected_region(session);
251 263
252 return 0; 264 return 0;
@@ -254,13 +266,16 @@ LIB3270_EXPORT int lib3270_select_field_at(H3270 *session, int baddr) @@ -254,13 +266,16 @@ LIB3270_EXPORT int lib3270_select_field_at(H3270 *session, int baddr)
254 266
255 LIB3270_ACTION( selectfield ) 267 LIB3270_ACTION( selectfield )
256 { 268 {
  269 + CHECK_SESSION_HANDLE(hSession);
257 lib3270_select_field_at(hSession,hSession->cursor_addr); 270 lib3270_select_field_at(hSession,hSession->cursor_addr);
258 } 271 }
259 272
260 LIB3270_ACTION( selectall ) 273 LIB3270_ACTION( selectall )
261 { 274 {
262 - int len = hSession->rows*hSession->cols;  
263 - int baddr; 275 + int len, baddr;
  276 +
  277 + CHECK_SESSION_HANDLE(hSession);
  278 + len = hSession->rows*hSession->cols;
264 279
265 // First remove unselected areas 280 // First remove unselected areas
266 for(baddr = 0; baddr < len; baddr++) 281 for(baddr = 0; baddr < len; baddr++)
@@ -271,21 +286,17 @@ LIB3270_ACTION( selectall ) @@ -271,21 +286,17 @@ LIB3270_ACTION( selectall )
271 hSession->update(hSession,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == hSession->cursor_addr); 286 hSession->update(hSession,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == hSession->cursor_addr);
272 } 287 }
273 } 288 }
  289 +
  290 + set_selected(hSession);
274 } 291 }
275 292
276 -LIB3270_ACTION( unselect ) 293 +LIB3270_ACTION( reselect )
277 { 294 {
278 - int len = hSession->rows*hSession->cols;  
279 - int baddr; 295 + CHECK_SESSION_HANDLE(hSession);
280 296
281 - // First remove unselected areas  
282 - for(baddr = 0; baddr < len; baddr++)  
283 - {  
284 - if(ea_buf[baddr].attr & LIB3270_ATTR_SELECTED)  
285 - {  
286 - ea_buf[baddr].attr &= ~LIB3270_ATTR_SELECTED;  
287 - hSession->update(hSession,baddr,ea_buf[baddr].chr,ea_buf[baddr].attr,baddr == hSession->cursor_addr);  
288 - }  
289 - }  
290 -} 297 + if(hSession->selected || hSession->select.begin == hSession->select.end)
  298 + return;
291 299
  300 + update_selection(hSession);
  301 + set_selected(hSession);
  302 +}
ui/default.xml
@@ -62,11 +62,11 @@ @@ -62,11 +62,11 @@
62 62
63 <menuitem action='selectfield' key='<Ctrl>f' group='online' label='Select Field' /> 63 <menuitem action='selectfield' key='<Ctrl>f' group='online' label='Select Field' />
64 <menuitem action='unselect' group='selection' label='unselect' /> 64 <menuitem action='unselect' group='selection' label='unselect' />
65 - <!--- menuitem action='Reselect' key='<Ctrl>r' group='online' label='Reselect' /---> 65 + <menuitem action='reselect' key='<Ctrl>r' group='online' label='Reselect' />
66 66
67 <separator/> 67 <separator/>
68 - <menuitem action='Clear' group='online' key='Pause' label='Clear' />  
69 - <menuitem action='EraseInput' icon='clear' group='online' label='Erase input' /> 68 + <menuitem action='clear' group='online' key='Pause' label='Clear' />
  69 + <menuitem action='eraseinput' icon='clear' group='online' label='Erase input' />
70 <!--- <menuitem action='EraseField' key='<Ctrl>u' group='online' /> --> 70 <!--- <menuitem action='EraseField' key='<Ctrl>u' group='online' /> -->
71 <menuitem action='EraseEOF' group='online' label='Erase to end of field' /> 71 <menuitem action='EraseEOF' group='online' label='Erase to end of field' />
72 <menuitem action='EraseEOL' group='online' label='Erase to end of line' /> 72 <menuitem action='EraseEOL' group='online' label='Erase to end of line' />