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
glue.c
... ... @@ -169,9 +169,6 @@ static void lib3270_session_init(H3270 *hSession, const char *model)
169 169 hSession->cstate = NOT_CONNECTED;
170 170 hSession->oia_status = -1;
171 171  
172   - hSession->selected.begin = -1;
173   - hSession->selected.end = -1;
174   -
175 172 strncpy(hSession->full_model_name,"IBM-",LIB3270_FULL_MODEL_NAME_LENGTH);
176 173 hSession->model_name = &hSession->full_model_name[4];
177 174  
... ... @@ -294,7 +291,8 @@ static void initialize(void)
294 291 Trace("Initializing library (calls: %d)",init_calls);
295 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 296 initialize_toggles(&h3270,appres.toggle);
299 297  
300 298 #if defined(_WIN32)
... ...
selection.c
... ... @@ -44,8 +44,8 @@ static void update_selected_rectangle(H3270 *session)
44 44 int col;
45 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 49 int row, col, baddr;
50 50  
51 51 if(begin > end)
... ... @@ -96,8 +96,8 @@ static void update_selected_rectangle(H3270 *session)
96 96 static void update_selected_region(H3270 *session)
97 97 {
98 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 101 int len = session->rows*session->cols;
102 102  
103 103 if(begin > end)
... ... @@ -146,9 +146,18 @@ void update_selection(H3270 *session)
146 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 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 161 return;
153 162  
154 163 if(t->value)
... ... @@ -157,24 +166,25 @@ void toggle_rectselect(H3270 *session, struct toggle *t, LIB3270_TOGGLE_TYPE tt)
157 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 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 179 if(ea_buf[a].attr & LIB3270_ATTR_SELECTED)
170 180 {
171 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 195 if(!lib3270_connected(session))
186 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 206 update_selection(session);
... ... @@ -210,12 +220,13 @@ LIB3270_EXPORT void lib3270_select_word(H3270 *session, int baddr)
210 220 }
211 221  
212 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 225 len = session->rows * session->cols;
216 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 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 250 return -1;
240 251 }
241 252  
242   - session->selected.begin = (start+1);
  253 + session->select.begin = (start+1);
243 254  
244 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 262 update_selected_region(session);
251 263  
252 264 return 0;
... ... @@ -254,13 +266,16 @@ LIB3270_EXPORT int lib3270_select_field_at(H3270 *session, int baddr)
254 266  
255 267 LIB3270_ACTION( selectfield )
256 268 {
  269 + CHECK_SESSION_HANDLE(hSession);
257 270 lib3270_select_field_at(hSession,hSession->cursor_addr);
258 271 }
259 272  
260 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 280 // First remove unselected areas
266 281 for(baddr = 0; baddr < len; baddr++)
... ... @@ -271,21 +286,17 @@ LIB3270_ACTION( selectall )
271 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 +}
... ...