@ -40,6 +40,8 @@ typedef struct
{
GtkWidget * dialog ;
gboolean focus_out ;
GtkWidget * date_edit ;
GtkWidget * num_edit ;
} DupTransDialog ;
@ -70,6 +72,56 @@ parse_num (const char *string, long int *num)
return TRUE ;
}
/*
* This code works around an annoying bug in the SpinButton - - as soon
* as you focus into the spin button it wants to force a digit to
* appear and there is nothing the user can do . Once you focus in ,
* the user cannot make the spin button entry be empty .
*
* To make matters worse , the spin button draws this number AFTER a
* focus - out event , so we can ' t just use that event to clear it out .
*
* To work around this problem we hook into two signals , focus - out and
* draw . The focus - out event lets us know when we leave the
* spinbutton entry , and we set a flag to remember this fact , and also
* queue a redraw ( just to be sure ) . The draw event happens more
* frequently , but also happens after the spin button digitizes
* itself . So when we hit a draw event we can check the flag and if
* it ' s set we can potentially empty out the entry .
*
* This also means you cannot have a check numbered " 0 " , but that is
* probably a reasonable limitation .
*/
static void
gnc_dup_trans_focus_out_cb ( GtkSpinButton * button , GdkEventFocus * event ,
gpointer user_data )
{
DupTransDialog * dt_dialog = user_data ;
g_return_if_fail ( GTK_IS_SPIN_BUTTON ( button ) ) ;
if ( ! dt_dialog ) return ;
dt_dialog - > focus_out = TRUE ;
gtk_widget_queue_draw ( GTK_WIDGET ( button ) ) ;
}
static void
gnc_dup_trans_draw_cb ( GtkSpinButton * button , GdkRectangle * unused , gpointer data )
{
DupTransDialog * dt_dialog = data ;
g_return_if_fail ( GTK_IS_SPIN_BUTTON ( button ) ) ;
if ( ! dt_dialog ) return ;
if ( ! dt_dialog - > focus_out )
return ;
dt_dialog - > focus_out = FALSE ;
if ( ! gtk_spin_button_get_value_as_int ( button ) )
gtk_entry_set_text ( GTK_ENTRY ( button ) , " " ) ;
}
static void
gnc_dup_trans_dialog_create ( GtkWidget * parent , DupTransDialog * dt_dialog ,
time_t date , const char * num_str )
@ -112,6 +164,11 @@ gnc_dup_trans_dialog_create (GtkWidget * parent, DupTransDialog *dt_dialog,
gnome_dialog_editable_enters ( GNOME_DIALOG ( dialog ) ,
GTK_EDITABLE ( num_spin ) ) ;
gtk_signal_connect ( GTK_OBJECT ( num_spin ) , " focus-out-event " ,
GTK_SIGNAL_FUNC ( gnc_dup_trans_focus_out_cb ) , dt_dialog ) ;
gtk_signal_connect ( GTK_OBJECT ( num_spin ) , " draw " ,
GTK_SIGNAL_FUNC ( gnc_dup_trans_draw_cb ) , dt_dialog ) ;
if ( num_str & & parse_num ( num_str , & num ) )
gtk_spin_button_set_value ( GTK_SPIN_BUTTON ( num_spin ) , num + 1 ) ;
else