2002-10-26 Joshua Sled <jsled@asynchronous.org>

* src/gnome/dialog-sxsincelast.c (sxsincelast_tc_row_sel): Place
	the template transaction associated with the SX in the window,
	fixing Bug#93900.

	* src/gnome/dialog-sxsincelast.c (sxsincelast_populate): Process
	the auto-create transactions if there are only auto-create,
	no-notify SXes as a result of the since-last-run-dialog
	invocation; fixes bug #96944.

	* src/gnome/dialog-sxsincelast.c (sxsincelast_populate): Changed
	return-value from sxsincelast_populate to reflect all the possible
	conditions, allowing...

	* src/gnome/window-main.c (gnc_main_window_sched_xaction_slr_cb):
	Changed since-last-run-dialog-create return-value handling; fixes
	Bug#90060.

	* src/gnome/dialog-sxsincelast.c (add_to_create_list_to_gui):
	Setup of to-create page more correct; the first item which needs
	interaction is selected, or the widgets are set to inactive.
	Fixes Bug#96669 and Bug#96665.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7394 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Joshua Sled 2002-10-27 03:34:14 +00:00
parent a791960784
commit 3e900c3139
7 changed files with 259 additions and 55 deletions

View File

@ -1,3 +1,27 @@
2002-10-26 Joshua Sled <jsled@asynchronous.org>
* src/gnome/dialog-sxsincelast.c (sxsincelast_tc_row_sel): Place
the template transaction associated with the SX in the window,
fixing Bug#93900.
* src/gnome/dialog-sxsincelast.c (sxsincelast_populate): Process
the auto-create transactions if there are only auto-create,
no-notify SXes as a result of the since-last-run-dialog
invocation; fixes bug #96944.
* src/gnome/dialog-sxsincelast.c (sxsincelast_populate): Changed
return-value from sxsincelast_populate to reflect all the possible
conditions, allowing...
* src/gnome/window-main.c (gnc_main_window_sched_xaction_slr_cb):
Changed since-last-run-dialog-create return-value handling; fixes
Bug#90060.
* src/gnome/dialog-sxsincelast.c (add_to_create_list_to_gui):
Setup of to-create page more correct; the first item which needs
interaction is selected, or the widgets are set to inactive.
Fixes Bug#96669 and Bug#96665.
2002-10-26 Christian Stimming <stimming@tuhh.de>
* src/import-export/hbci/gnc-hbci-kvp.h,

View File

@ -49,6 +49,7 @@
#include "config.h"
#include <limits.h>
#include <gnome.h>
#include <glib.h>
@ -110,6 +111,7 @@
#define CANCEL_BUTTON "cancel_button"
#define VARIABLE_TABLE "variables_table"
#define AUTO_CREATE_VBOX "ac_vbox"
#define TO_CREATE_TXN_REG_FRAME "to_create_txn_reg_frame"
#define CREATED_VBOX "created_vbox"
#define WHAT_TO_DO_VBOX "what_to_do_vbox"
#define WHAT_TO_DO_PROGRESS "creation_progress"
@ -247,6 +249,8 @@ typedef struct _sxSinceLastData {
GladeXML *gxml;
GtkProgressBar *prog;
GtkStatusbar *toCreateFormula;
guint formulaCtxId;
GtkStatusbar *toCreateStatus;
guint statusCtxId;
@ -279,15 +283,19 @@ typedef struct _sxSinceLastData {
GNCLedgerDisplay *created_ledger;
GNCRegWidget *created_regWidget;
GNCLedgerDisplay *to_create_ledger;
GNCRegWidget *to_create_regWidget;
} sxSinceLastData;
static void sxsincelast_init( sxSinceLastData *sxsld );
static void create_autoCreate_ledger( sxSinceLastData *sxsld );
static void create_created_ledger( sxSinceLastData *sxsld );
static void create_to_create_ledger( sxSinceLastData *sxsld );
static gncUIWidget sxsld_ledger_get_parent( GNCLedgerDisplay *ld );
static void gnc_sxsld_commit_ledgers( sxSinceLastData *sxsld );
static gboolean sxsincelast_populate( sxSinceLastData *sxsld );
static gint sxsincelast_populate( sxSinceLastData *sxsld );
static void sxsincelast_druid_cancelled( GnomeDruid *druid, gpointer ud );
static void sxsincelast_close_handler( gpointer ud );
@ -377,10 +385,18 @@ static gint sxsld_get_future_created_txn_count( sxSinceLastData *sxsld );
/**
* Used to wrap for the book-open hook, where the book filename is given.
**/
gboolean
void
gnc_ui_sxsincelast_guile_wrapper( char *bookfile )
{
return gnc_ui_sxsincelast_dialog_create();
const char *no_dialog_but_created_msg =
_( "There are no Scheduled Transactions to be entered at this time.\n"
"(%d %s automatically created)" );
gint ret;
ret = gnc_ui_sxsincelast_dialog_create();
if ( ret < 0 ) {
gnc_info_dialog( no_dialog_but_created_msg,
-(ret), -(ret) == 1 ? _("transaction") : _("transactions") );
}
}
static gboolean
@ -396,21 +412,28 @@ show_handler (const char *class, gint component_id,
}
/**
* Returns TRUE if the dialogs were created, FALSE if not. The caller
* probably wants to use this to inform the user in the manner appropriate to
* the calling context.
* @return The magnitude of the return value is the number of auto-created,
* no-notification scheduled transactions created. This value is positive if
* there are additionally other SXes which need user interaction and the
* Druid has been displayed, or negative if there are not, and no Druid
* window was realized. In the case where there the dialog has been
* displayed but no auto-create-no-notify transactions have been created,
* INT_MAX [limits.h] is returned. 0 is treated as negative, with no
* transactions created and no dialog displayed. The caller can use this
* value as appropriate to inform the user.
*
* [i.e., for book-open-hook: do nothing; for menu-selection: display an info
* [e.g., for book-open-hook: do nothing; for menu-selection: display an info
* dialog stating there's nothing to do.]
**/
gboolean
gint
gnc_ui_sxsincelast_dialog_create()
{
int autoCreateCount;
sxSinceLastData *sxsld;
if (gnc_forall_gui_components (DIALOG_SXSINCELAST_CM_CLASS,
show_handler, NULL))
return TRUE;
return 0;
sxsld = g_new0( sxSinceLastData, 1 );
@ -418,9 +441,10 @@ gnc_ui_sxsincelast_dialog_create()
sxsld->toCreateList = sxsld->reminderList = sxsld->toRemoveList = NULL;
sxsld->sxInitStates = g_hash_table_new( g_direct_hash, g_direct_equal );
if ( ! sxsincelast_populate( sxsld ) ) {
autoCreateCount = sxsincelast_populate( sxsld );
if ( autoCreateCount <= 0 ) {
g_free( sxsld );
return FALSE;
return autoCreateCount;
}
sxsld->gxml = gnc_glade_xml_new( SX_GLADE_FILE,
@ -432,7 +456,7 @@ gnc_ui_sxsincelast_dialog_create()
GNOME_DRUID( glade_xml_get_widget( sxsld->gxml,
SXSLD_DRUID_GLADE_NAME ) );
sxsincelast_init( sxsld );
return TRUE;
return autoCreateCount;
}
static void
@ -950,6 +974,9 @@ to_create_prep( GnomeDruidPage *druid_page,
clean_variable_table( sxsld );
add_to_create_list_to_gui( sxsld->toCreateList, sxsld );
gtk_clist_thaw( GTK_CLIST(w) );
gnome_druid_set_buttons_sensitive(
sxsld->sincelast_druid,
( gnc_sxsld_get_appropriate_page( sxsld,
@ -1552,6 +1579,7 @@ sxsincelast_init( sxSinceLastData *sxsld )
create_autoCreate_ledger( sxsld );
create_created_ledger( sxsld );
create_to_create_ledger( sxsld );
{
int width, height;
@ -1723,11 +1751,13 @@ add_to_create_list_to_gui( GList *toCreateList, sxSinceLastData *sxsld )
toCreateInstance *tci;
GtkCTree *ct;
GtkCTreeNode *sxNode;
GtkCTreeNode *firstToBeProcessedRow;
char *rowText[ TO_CREATE_LIST_WIDTH ];
GList *insts;
ct = GTK_CTREE( glade_xml_get_widget( sxsld->gxml, TO_CREATE_LIST ) );
firstToBeProcessedRow = NULL;
for ( ; toCreateList ; toCreateList = toCreateList->next ) {
tct = (toCreateTuple*)toCreateList->data;
@ -1782,13 +1812,21 @@ add_to_create_list_to_gui( GList *toCreateList, sxSinceLastData *sxsld )
rowText,
0, NULL, NULL, NULL, NULL,
TRUE, FALSE );
if ( !allVarsBound && !firstToBeProcessedRow ) {
firstToBeProcessedRow = tci->node;
}
gtk_ctree_node_set_row_data( ct, tci->node, tci );
g_free( rowText[0] );
}
}
/* FIXME: Simulate a 'next' button press to get the right "first
* thing" hilighted */
/* Setup the first thing to be processed, or disable controls. */
if ( firstToBeProcessedRow ) {
gtk_ctree_select( ct, firstToBeProcessedRow );
sxsld_set_sensitive_tci_controls( sxsld, TRUE );
} else {
sxsld_set_sensitive_tci_controls( sxsld, FALSE );
}
}
static
@ -1991,31 +2029,28 @@ processSelectedReminderList( GList *goodList, sxSinceLastData *sxsld )
}
/**
* Returns TRUE if there's some populated in the dialog to show to the user,
* FALSE if not.
* @see gnc_ui_sxsincelast_dialog_create for the return value definition.
**/
static gboolean
static
gint
sxsincelast_populate( sxSinceLastData *sxsld )
{
int toRet = 0;
gboolean onlyNoNotify = TRUE;
GList *sxList, *instanceList, *l, **containingList;
SchedXaction *sx;
GDate end, endPlusReminders;
gint daysInAdvance;
gboolean autocreateState, notifyState;
gboolean showIt;
toCreateTuple *tct;
toCreateInstance *tci;
showIt = FALSE;
instanceList = NULL;
sxList = gnc_book_get_schedxactions( gnc_get_current_book () );
if ( sxList == NULL ) {
DEBUG( "No scheduled transactions to populate." );
return FALSE;
return toRet;
}
for ( ; sxList; sxList = sxList->next ) {
@ -2027,7 +2062,7 @@ sxsincelast_populate( sxSinceLastData *sxsld )
PERR( "Why are we able to find a SX initial state "
"hash entry for something we're seeing for "
"the first time?" );
return FALSE;
return toRet;
}
{
void *sx_state;
@ -2059,6 +2094,8 @@ sxsincelast_populate( sxSinceLastData *sxsld )
postponed = gnc_sx_get_defer_instances( sx );
for ( l = postponed; l; l = l->next ) {
onlyNoNotify = FALSE;
tci = g_new0( toCreateInstance, 1 );
tci->sxStateData = (void*)l->data;
tci->date = g_date_new();
@ -2096,6 +2133,13 @@ sxsincelast_populate( sxSinceLastData *sxsld )
tct = g_new0( toCreateTuple, 1 );
tct->sx = sx;
for ( l = instanceList ; l; l = l->next ) {
/* only count the no-notify txns for this. */
if ( autocreateState && !notifyState ) {
onlyNoNotify &= (!notifyState);
toRet++;
}
tci = (toCreateInstance*)l->data;
tci->parentTCT = tct;
@ -2108,16 +2152,32 @@ sxsincelast_populate( sxSinceLastData *sxsld )
/* abstractly place the TCT onto the afore-determined list. */
*containingList = g_list_append( *containingList, tct );
/* Report RE:showing the dialog iff there's stuff in it to
* show. */
showIt |= ( (g_list_length(sxsld->autoCreateList) > 0)
|| (g_list_length(sxsld->toCreateList) > 0) );
}
showIt |= ( g_list_length( sxsld->reminderList ) > 0
|| g_list_length( sxsld->toRemoveList ) > 0 );
return showIt;
/* Return appropriately. */
{
gboolean stuffToDo =
( g_list_length( sxsld->toRemoveList ) > 0
|| g_list_length( sxsld->reminderList ) > 0
|| g_list_length( sxsld->toCreateList ) > 0 );
if ( onlyNoNotify && !stuffToDo ) {
toRet = -(toRet);
}
if ( toRet == 0
&& ( stuffToDo
|| g_list_length( sxsld->autoCreateList ) > 0 ) ) {
toRet = INT_MAX;
}
}
/* if we're about to return a negative value [indicating only
* auto-create no-notify txns], then actually create them. */
if ( toRet < 0 ) {
process_auto_create_list( sxsld->autoCreateList, sxsld );
}
return toRet;
}
static void
@ -2728,16 +2788,14 @@ sxsincelast_tc_row_sel( GtkCTree *ct,
toCreateInstance *tci;
sxSinceLastData *sxsld;
/* FIXME: this should more gracefully deal with multiple 'row-select'
* signals from double/triple-clicks. */
sxsld = (sxSinceLastData*)user_data;
tci = (toCreateInstance*)gtk_ctree_node_get_row_data( ct, node );
if ( tci == NULL ) {
PERR( "Given row-selection for row w/o "
"bound toCreateInstance." );
return;
}
g_assert( tci );
sxsld->curSelTCI = tci;
sxsld_set_sensitive_tci_controls( sxsld, TRUE );
/* set real sensitivity based on the state of the TCI; when we change
@ -2757,6 +2815,17 @@ sxsincelast_tc_row_sel( GtkCTree *ct,
sxsld );
}
/* Setup the query for the to-create register to only show the
* transaction[s] associated with this lineitem. */
{
gchar *sxGUIDstr;
sxGUIDstr = guid_to_string( xaccSchedXactionGetGUID( tci->parentTCT->sx ) );
sxsld->to_create_ledger = gnc_ledger_display_template_gl( sxGUIDstr );
gnc_regWidget_set_ledger_display( sxsld->to_create_regWidget,
sxsld->to_create_ledger );
}
/* Get the count of variables; potentially remove the system-defined
* variables if they're present in the expression. */
varHashSize = g_hash_table_size( tci->varBindings );
@ -3501,6 +3570,50 @@ create_created_ledger( sxSinceLastData *sxsld )
gnc_ledger_display_refresh( sxsld->created_ledger );
}
static void
create_to_create_ledger( sxSinceLastData *sxsld )
{
SplitRegister *splitreg;
GtkWidget *txn_reg_frame;
Query *q;
q = xaccMallocQuery();
sxsld->to_create_ledger = gnc_ledger_display_query( q,
GENERAL_LEDGER,
REG_STYLE_LEDGER );
xaccFreeQuery( q );
gnc_ledger_display_set_handlers( sxsld->to_create_ledger,
NULL,
sxsld_ledger_get_parent );
gnc_ledger_display_set_user_data( sxsld->to_create_ledger, (gpointer)sxsld );
splitreg = gnc_ledger_display_get_split_register( sxsld->to_create_ledger );
/* FIXME: make configurable? */
gnucash_register_set_initial_rows( 4 );
sxsld->to_create_regWidget =
GNC_REGWIDGET(gnc_regWidget_new( sxsld->to_create_ledger,
GTK_WINDOW( sxsld->sincelast_window ),
CAP_SCHEDULE ));
txn_reg_frame = glade_xml_get_widget( sxsld->gxml, TO_CREATE_TXN_REG_FRAME );
gtk_container_add( GTK_CONTAINER( txn_reg_frame ),
GTK_WIDGET( sxsld->to_create_regWidget ) );
/* configure... */
/* don't use double-line */
/* FIXME */
gnc_split_register_config( splitreg,
splitreg->type, splitreg->style,
FALSE );
/* don't show present/future divider [by definition, not necessary] */
gnc_split_register_show_present_divider( splitreg, FALSE );
/* force a refresh */
gnc_ledger_display_refresh( sxsld->to_create_ledger );
}
static
gncUIWidget
sxsld_ledger_get_parent( GNCLedgerDisplay *ld )

View File

@ -23,8 +23,22 @@
#ifndef DIALOG_SXSINCELAST_H
#define DIALOG_SXSINCELAST_H
gboolean gnc_ui_sxsincelast_dialog_create( void );
gboolean gnc_ui_sxsincelast_guile_wrapper( char* );
/**
* @return The magnitude of the return value is the number of auto-created,
* no-notification scheduled transactions created. This value is positive if
* there are additionally other SXes which need user interaction and the
* Druid has been displayed, or negative if there are not, and no Druid
* window was realized. In the case where there the dialog has been
* displayed but no auto-create-no-notify transactions have been created,
* INT_MAX [limits.h] is returned. 0 is treated as negative, with no
* transactions created and no dialog displayed. The caller can use this
* value as appropriate to inform the user.
*
* [e.g., for book-open-hook: do nothing; for menu-selection: display an info
* dialog stating there's nothing to do.]
**/
gint gnc_ui_sxsincelast_dialog_create( void );
void gnc_ui_sxsincelast_guile_wrapper( char* );
/**
* Returns the varaibles from the Splits of the given SchedXaction as the

View File

@ -4119,19 +4119,65 @@ Postpone
</widget>
<widget>
<class>GtkStatusbar</class>
<name>to_create_status</name>
<border_width>5</border_width>
<class>GtkHBox</class>
<name>hbox175</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label847967</name>
<label>Value:</label>
<justify>GTK_JUSTIFY_CENTER</justify>
<wrap>False</wrap>
<xalign>0.5</xalign>
<yalign>0.5</yalign>
<xpad>3</xpad>
<ypad>3</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkStatusbar</class>
<name>to_create_status</name>
<border_width>3</border_width>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
</widget>
</widget>
</widget>
</widget>
</widget>
</widget>
<widget>
<class>GtkFrame</class>
<name>to_create_txn_reg_frame</name>
<label>Transaction</label>
<label_xalign>0.05</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>Placeholder</class>
</widget>
</widget>
</widget>
</widget>

View File

@ -248,16 +248,9 @@ by the user closing the window.")
"gnc_ui_scheduled_xaction_dialog_create" '()
"Open the Scheduled Transaction Editor" )
(gw:wrap-function
ws
'gnc:sx-sincelast-create
'<gw:bool>
"gnc_ui_sxsincelast_dialog_create" '()
"Wrapper to open the since-last-run dialog from a book-open hook." )
(gw:wrap-function
ws
'gnc:sx-since-last-run-wrapper
'<gw:bool>
'<gw:void>
"gnc_ui_sxsincelast_guile_wrapper" '(((<gw:mchars> caller-owned) bookfile))
"Wrapper to open the since-last-run dialog from a book-open hook." ))

View File

@ -651,13 +651,26 @@ gnc_main_window_sched_xaction_cb (GtkWidget *widget, gpointer data)
gnc_ui_scheduled_xaction_dialog_create();
}
static void
gnc_main_window_sched_xaction_slr_cb (GtkWidget *widget, gpointer data) {
static
void
gnc_main_window_sched_xaction_slr_cb (GtkWidget *widget, gpointer data)
{
gint ret;
const char *nothing_to_do_msg =
_( "There are no Scheduled Transactions to deal with." );
if ( ! gnc_ui_sxsincelast_dialog_create() ) {
_( "There are no Scheduled Transactions to be entered at this time." );
const char *no_dialog_but_created_msg =
_( "There are no Scheduled Transactions to be entered at this time.\n"
"(%d %s automatically created)" );
ret = gnc_ui_sxsincelast_dialog_create();
if ( ret == 0 ) {
gnc_info_dialog( nothing_to_do_msg );
}
} else if ( ret < 0 ) {
gnc_info_dialog( no_dialog_but_created_msg,
-(ret), -(ret) == 1 ? _("transaction") : _("transactions") );
} /* else { this else [>0 means dialog was created] intentionally left
* blank. } */
}
static

View File

@ -124,6 +124,7 @@ struct _RegWindow
sort_type_t sort_type;
RegDateWindow *date_window;
/* pcd = "print check dialog" */
gpointer pcd;
gboolean read_only;
};