Commit f6a2a93ade7cec5cabcc5260ec24608f13905e5a

Authored by perry.werneck@gmail.com
1 parent 88d39587

Melhorando mecanismo de seleção

Showing 2 changed files with 50 additions and 41 deletions   Show diff stats
@@ -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)
@@ -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 +}