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 60 {
61 61 case GDK_BUTTON_PRESS: // Single click - Just move cursor
62 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 64 break;
65 65  
66 66 case GDK_2BUTTON_PRESS: // Double click - Select word
... ...
src/include/lib3270/action_table.h
... ... @@ -62,6 +62,7 @@
62 62 DECLARE_LIB3270_ACTION( selectfield )
63 63 DECLARE_LIB3270_ACTION( selectall )
64 64 DECLARE_LIB3270_ACTION( unselect )
  65 + DECLARE_LIB3270_ACTION( reselect )
65 66  
66 67 DECLARE_LIB3270_ACTION( firstfield )
67 68 DECLARE_LIB3270_ACTION( eraseeof )
... ...
src/include/lib3270/session.h
... ... @@ -38,7 +38,7 @@
38 38  
39 39 struct _h3270
40 40 {
41   - unsigned short sz; /**< Struct size */
  41 + unsigned short sz; /**< Struct size */
42 42  
43 43 // Connection info
44 44 int secure_connection;
... ... @@ -50,6 +50,10 @@
50 50 HANDLE sock_handle;
51 51 #endif /*]*/
52 52  
  53 + // flags
  54 + int selected : 1;
  55 +
  56 + // Network & Termtype
53 57 char * hostname;
54 58 char * connected_type;
55 59 char * connected_lu;
... ... @@ -104,7 +108,7 @@
104 108 {
105 109 int begin;
106 110 int end;
107   - } selected;
  111 + } select;
108 112  
109 113 // xio
110 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 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)
... ...
src/lib3270/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 +}
... ...
ui/default.xml
... ... @@ -62,11 +62,11 @@
62 62  
63 63 <menuitem action='selectfield' key='<Ctrl>f' group='online' label='Select Field' />
64 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 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 70 <!--- <menuitem action='EraseField' key='<Ctrl>u' group='online' /> -->
71 71 <menuitem action='EraseEOF' group='online' label='Erase to end of field' />
72 72 <menuitem action='EraseEOL' group='online' label='Erase to end of line' />
... ...