Commit 1ae4cd71e10761e19c7e35b66f7d808815a4bad2

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

Implementando movimentação da caixa de seleção

src/gtk/actions.c
@@ -177,9 +177,56 @@ void ui_connect_toggle(GtkAction *action, GtkWidget *widget, const gchar *name, @@ -177,9 +177,56 @@ void ui_connect_toggle(GtkAction *action, GtkWidget *widget, const gchar *name,
177 gtk_action_set_sensitive(action,FALSE); 177 gtk_action_set_sensitive(action,FALSE);
178 } 178 }
179 179
  180 +static void selection_move_action(GtkAction *action, GtkWidget *widget)
  181 +{
  182 + trace("Action %s activated on widget %p dir=%d",gtk_action_get_name(action),widget,g_object_get_data(G_OBJECT(action),"direction"));
  183 + lib3270_move_selection(GTK_V3270(widget)->host,(LIB3270_DIRECTION) g_object_get_data(G_OBJECT(action),"direction"));
  184 +}
  185 +
180 void ui_connect_target_action(GtkAction *action, GtkWidget *widget, const gchar *target, const gchar *direction, GError **error) 186 void ui_connect_target_action(GtkAction *action, GtkWidget *widget, const gchar *target, const gchar *direction, GError **error)
181 { 187 {
182 - #warning TODO: Implementar 188 + static const gchar *dirname[] = { "up", "down", "left", "right" };
  189 +
  190 + LIB3270_DIRECTION dir = (LIB3270_DIRECTION) -1;
  191 + int f;
  192 +
  193 + if(!(direction && target))
  194 + {
  195 + gtk_action_set_sensitive(action,FALSE);
  196 + return;
  197 + }
  198 +
  199 + for(f=0;f<G_N_ELEMENTS(dirname) && dir == -1;f++)
  200 + {
  201 + if(!g_strcasecmp(direction,dirname[f]))
  202 + {
  203 + dir = f;
  204 + break;
  205 + }
  206 + }
  207 +
  208 + if(dir == -1)
  209 + {
  210 + *error = g_error_new( g_quark_from_static_string(PACKAGE_NAME),
  211 + ENOENT,
  212 + _( "Unexpected direction \"%s\""),
  213 + direction);
  214 + }
  215 +
  216 + if(!g_strcasecmp(target,"selection"))
  217 + {
  218 + g_object_set_data(G_OBJECT(action),"direction",(gpointer) dir);
  219 + g_signal_connect(action,"activate",G_CALLBACK(selection_move_action),widget);
  220 +
  221 + }
  222 + else
  223 + {
  224 + *error = g_error_new( g_quark_from_static_string(PACKAGE_NAME),
  225 + ENOENT,
  226 + _( "Unexpected target \"%s\""),
  227 + target);
  228 + }
  229 +
183 } 230 }
184 231
185 static void action_pfkey(GtkAction *action, GtkWidget *widget) 232 static void action_pfkey(GtkAction *action, GtkWidget *widget)
src/gtk/uiparser/parsefile.c
@@ -155,8 +155,8 @@ @@ -155,8 +155,8 @@
155 } 155 }
156 else if(!g_strcasecmp(name,"move")) 156 else if(!g_strcasecmp(name,"move"))
157 { 157 {
158 - const gchar *target = ui_get_attribute("target",names,values);  
159 - const gchar *direction = ui_get_attribute("direction",names,values); 158 + target = ui_get_attribute("target",names,values);
  159 + direction = ui_get_attribute("direction",names,values);
160 160
161 if(!(target && direction)) 161 if(!(target && direction))
162 { 162 {
@@ -214,10 +214,10 @@ @@ -214,10 +214,10 @@
214 214
215 if(ix >= 0) 215 if(ix >= 0)
216 ui_connect_index_action(info->action[ix] = action,info->center_widget,ix,info->action); 216 ui_connect_index_action(info->action[ix] = action,info->center_widget,ix,info->action);
217 - else if(g_strcasecmp(name,"quit"))  
218 - connect(action,info->center_widget,name,id);  
219 else if(target) 217 else if(target)
220 ui_connect_target_action(action,info->center_widget,target,direction,error); 218 ui_connect_target_action(action,info->center_widget,target,direction,error);
  219 + else if(g_strcasecmp(name,"quit"))
  220 + connect(action,info->center_widget,name,id);
221 else 221 else
222 g_signal_connect(action,"activate",G_CALLBACK(gtk_main_quit), NULL); 222 g_signal_connect(action,"activate",G_CALLBACK(gtk_main_quit), NULL);
223 223
src/lib3270/selection.c
@@ -376,7 +376,7 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir @@ -376,7 +376,7 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir
376 break; 376 break;
377 377
378 case LIB3270_DIR_RIGHT: 378 case LIB3270_DIR_RIGHT:
379 - if( (hSession->select.end % hSession->cols) >= hSession->cols) 379 + if( (hSession->select.end % hSession->cols) >= (hSession->cols-1))
380 return EINVAL; 380 return EINVAL;
381 hSession->select.begin++; 381 hSession->select.begin++;
382 hSession->select.end++; 382 hSession->select.end++;
@@ -387,5 +387,7 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir @@ -387,5 +387,7 @@ LIB3270_EXPORT int lib3270_move_selection(H3270 *hSession, LIB3270_DIRECTION dir
387 } 387 }
388 388
389 update_selection(hSession); 389 update_selection(hSession);
  390 + lib3270_set_cursor_address(hSession,hSession->select.end);
  391 +
390 return 0; 392 return 0;
391 } 393 }
ui/00default.xml
@@ -194,10 +194,10 @@ @@ -194,10 +194,10 @@
194 <accelerator action='SelectUp' key='<Shift>Up' group='online' /> 194 <accelerator action='SelectUp' key='<Shift>Up' group='online' />
195 <accelerator action='SelectDown' key='<Shift>Down' group='online' /> 195 <accelerator action='SelectDown' key='<Shift>Down' group='online' />
196 196
197 - <accelerator action='SelectionRight' key='<alt>Right' />  
198 - <accelerator action='SelectionLeft' key='<alt>Left' />  
199 - <accelerator action='SelectionUp' key='<alt>Up' />  
200 - <accelerator action='SelectionDown' key='<alt>Down' /> 197 + <accelerator action='move' target='selection' direction='right' key='<alt>Right' />
  198 + <accelerator action='move' target='selection' direction='left' key='<alt>Left' />
  199 + <accelerator action='move' target='selection' direction='up' key='<alt>Up' />
  200 + <accelerator action='move' target='selection' direction='down' key='<alt>Down' />
201 201
202 <accelerator action='CursorRight' key='Right' group='online' /> 202 <accelerator action='CursorRight' key='Right' group='online' />
203 <accelerator action='CursorLeft' key='Left' group='online' /> 203 <accelerator action='CursorLeft' key='Left' group='online' />