[Gnucash-changes] r13400 - gnucash/trunk - Add account-deletion handling for SXes. Bug#312730.

Joshua Sled jsled at cvs.gnucash.org
Sun Feb 26 14:55:18 EST 2006


Author: jsled
Date: 2006-02-26 14:55:17 -0500 (Sun, 26 Feb 2006)
New Revision: 13400
Trac: http://svn.gnucash.org/trac/changeset/13400

Modified:
   gnucash/trunk/ChangeLog
   gnucash/trunk/src/engine/SX-book.c
   gnucash/trunk/src/engine/SX-book.h
   gnucash/trunk/src/gnome/dialog-scheduledxaction.c
   gnucash/trunk/src/gnome/glade/sched-xact.glade
Log:
Add account-deletion handling for SXes.  Bug#312730.


Modified: gnucash/trunk/ChangeLog
===================================================================
--- gnucash/trunk/ChangeLog	2006-02-26 19:44:29 UTC (rev 13399)
+++ gnucash/trunk/ChangeLog	2006-02-26 19:55:17 UTC (rev 13400)
@@ -15,6 +15,11 @@
 
 2006-02-26  Joshua Sled  <jsled at asynchronous.org>
 
+	* src/engine/SX-book.c (gnc_sx_get_sxes_referencing_account): 
+	* src/gnome/dialog-scheduledxaction.c: Add handler for
+	account-deleted events, determine and display editors for SXes
+	referencing those accounts.  Fixes Bug#312730.
+
 	* src/report/utility-reports/Makefile.am (SCM_FILE_LINKS):
 	* src/report/utility-reports/utility-reports.scm: 
 	* src/report/utility-reports/iframe-url.scm:

Modified: gnucash/trunk/src/engine/SX-book.c
===================================================================
--- gnucash/trunk/src/engine/SX-book.c	2006-02-26 19:44:29 UTC (rev 13399)
+++ gnucash/trunk/src/engine/SX-book.c	2006-02-26 19:55:17 UTC (rev 13400)
@@ -129,7 +129,6 @@
   xaccGroupMarkSaved(gnc_collection_get_template_group(col));
 }
 
-
 static QofObject sxtg_object_def = 
 {
   interface_version: QOF_OBJECT_VERSION,
@@ -146,13 +145,13 @@
 /* ====================================================================== */
 
 SchedXactions *
-gnc_collection_get_schedxaction_list( QofCollection *col)
+gnc_collection_get_schedxaction_list(QofCollection *col)
 {
   return qof_collection_get_data (col);
 }
 
 GList *
-gnc_collection_get_schedxactions( QofCollection *col)
+gnc_collection_get_schedxactions(QofCollection *col)
 {
   SchedXactions *list;
   list = qof_collection_get_data (col);
@@ -161,7 +160,7 @@
 }
 
 GList *
-gnc_book_get_schedxactions( QofBook *book )
+gnc_book_get_schedxactions(QofBook *book)
 {
   QofCollection *col;
   col = qof_book_get_collection (book, GNC_ID_SXTT);
@@ -280,4 +279,28 @@
   return qof_object_register (&sxtt_object_def);
 }
 
+GList*
+gnc_sx_get_sxes_referencing_account(QofBook *book, Account *acct)
+{
+  GList *rtn = NULL;
+  const GUID *acct_guid = xaccAccountGetGUID(acct);
+  GList *sx_list = gnc_book_get_schedxactions(book);
+  for (; sx_list != NULL; sx_list = sx_list->next)
+  {
+    SchedXaction *sx = (SchedXaction*)sx_list->data;
+    GList *splits = xaccSchedXactionGetSplits(sx);
+    for (; splits != NULL; splits = splits->next)
+    {
+      Split *s = (Split*)splits->data;
+      KvpFrame *frame = kvp_frame_get_frame(xaccSplitGetSlots(s), GNC_SX_ID);
+      GUID *sx_split_acct_guid = kvp_frame_get_guid(frame, GNC_SX_ACCOUNT);
+      if (guid_equal(acct_guid, sx_split_acct_guid))
+      {
+        rtn = g_list_append(rtn, sx);
+      }
+    }
+  }
+  return rtn;
+}
+
 /* ========================== END OF FILE =============================== */

Modified: gnucash/trunk/src/engine/SX-book.h
===================================================================
--- gnucash/trunk/src/engine/SX-book.h	2006-02-26 19:44:29 UTC (rev 13399)
+++ gnucash/trunk/src/engine/SX-book.h	2006-02-26 19:55:17 UTC (rev 13400)
@@ -53,6 +53,9 @@
 AccountGroup * gnc_book_get_template_group(QofBook *book);
 AccountGroup * gnc_collection_get_template_group(QofCollection *col);
 
+/** @return The list of SXes which reference the given Account. Caller should free this list. **/
+GList* gnc_sx_get_sxes_referencing_account(QofBook *book, Account *acct);
+
 #endif /* GNC_SX_BOOK_H */
 /** @} */
 /** @} */

Modified: gnucash/trunk/src/gnome/dialog-scheduledxaction.c
===================================================================
--- gnucash/trunk/src/gnome/dialog-scheduledxaction.c	2006-02-26 19:44:29 UTC (rev 13399)
+++ gnucash/trunk/src/gnome/dialog-scheduledxaction.c	2006-02-26 19:55:17 UTC (rev 13400)
@@ -1,7 +1,7 @@
 /********************************************************************\
  * dialog-scheduledxaction.c : dialog for scheduled transaction     *
  *    list and editor                                               *
- * Copyright (C) 2001,2002 Joshua Sled <jsled at asynchronous.org>     *
+ * Copyright (C) 2001,2002,2006 Joshua Sled <jsled at asynchronous.org>*
  *                                                                  *
  * This program is free software; you can redistribute it and/or    *
  * modify it under the terms of the GNU General Public License as   *
@@ -29,6 +29,9 @@
 #include <locale.h>
 #include <time.h>
 
+#include "qof.h"
+#include "gnc-book.h"
+#include "Account.h"
 #include "FreqSpec.h"
 #include "SchedXaction.h"
 #include "SX-book.h"
@@ -65,6 +68,8 @@
 
 static QofLogModule log_module = GNC_MOD_SX;
 
+static gint _sx_engine_event_handler_id = -1;
+
 #define SX_LIST_GCONF_SECTION "dialogs/scheduled_trans/transaction_list"
 #define SX_LIST_WIN_PREFIX "sx_list_win"
 #define SX_LIST_GLADE_NAME "Scheduled Transaction List"
@@ -2456,10 +2461,99 @@
   gtk_widget_set_sensitive(widget, create);
 }
 
+typedef struct _acct_deletion_handler_data
+{
+  GList *affected_sxes;
+  GtkWidget *dialog;
+} acct_deletion_handler_data;
 
+static void
+_open_editors(GtkDialog *dialog, gint response_code, gpointer data)
+{
+  acct_deletion_handler_data *adhd = (acct_deletion_handler_data *)data;
+  gtk_widget_hide_all(adhd->dialog);
+  {
+    GList *sx_iter;
+    for (sx_iter = adhd->affected_sxes; sx_iter; sx_iter = sx_iter->next)
+    {
+      gnc_ui_scheduled_xaction_editor_dialog_create(NULL, 
+                                                    (SchedXaction*)sx_iter->data,
+                                                    FALSE);
+    }
+  }
+  g_list_free(adhd->affected_sxes);
+  gtk_widget_destroy(GTK_WIDGET(adhd->dialog));
+  g_free(adhd);
+}
+
+static void
+_sx_engine_event_handler(QofEntity *ent, QofEventId event_type, gpointer user_data)
+{
+  Account *acct;
+  QofBook *book;
+  GList *affected_sxes;
+
+  if (!(event_type & QOF_EVENT_DESTROY))
+    return;
+  if (!GNC_IS_ACCOUNT(ent))
+    return;
+  acct = GNC_ACCOUNT(ent);
+  book = qof_instance_get_book(QOF_INSTANCE(acct));
+  affected_sxes = gnc_sx_get_sxes_referencing_account(book, acct);
+
+  if (g_list_length(affected_sxes) == 0)
+     return;
+
+  {
+    GList *sx_iter;
+    acct_deletion_handler_data *data;
+    GladeXML *xml;
+    GtkWidget *dialog;
+    GtkListStore *name_list;
+    GtkTreeView *list;
+    GtkTreeViewColumn *name_column;
+    GtkCellRenderer *renderer;
+
+    xml = gnc_glade_xml_new("sched-xact.glade", "Account Deletion");
+    dialog = glade_xml_get_widget(xml, "Account Deletion");
+    list = GTK_TREE_VIEW(glade_xml_get_widget(xml, "sx_list"));
+
+    data = (acct_deletion_handler_data*)g_new0(acct_deletion_handler_data, 1);
+    data->dialog = dialog;
+    data->affected_sxes = affected_sxes;
+    name_list = gtk_list_store_new(1, G_TYPE_STRING);
+    for (sx_iter = affected_sxes; sx_iter != NULL; sx_iter = sx_iter->next)
+    {
+      SchedXaction *sx;
+      GtkTreeIter iter;
+      gchar *sx_name;
+
+      sx = (SchedXaction*)sx_iter->data;
+      sx_name = xaccSchedXactionGetName(sx);
+      gtk_list_store_append(name_list, &iter);
+      gtk_list_store_set(name_list, &iter, 0, sx_name, -1);
+    }
+    gtk_tree_view_set_model(list, GTK_TREE_MODEL(name_list));
+    g_object_unref(G_OBJECT(name_list));
+
+    renderer = gtk_cell_renderer_text_new();
+    name_column = gtk_tree_view_column_new_with_attributes(_("Name"),
+                                                           renderer,
+                                                           "text", 0, NULL);
+    gtk_tree_view_append_column(list, name_column);
+
+    g_signal_connect(G_OBJECT(dialog), "response",
+                     G_CALLBACK(_open_editors), data);
+
+    gtk_widget_show_all(GTK_WIDGET(dialog));
+  }
+}
+
 void
 gnc_ui_sx_initialize (void)
 {
+  _sx_engine_event_handler_id = qof_event_register_handler(_sx_engine_event_handler, NULL);
+
   gnc_hook_add_dangler(HOOK_BOOK_OPENED,
 		       (GFunc)gnc_sx_sxsincelast_book_opened, NULL);
   gnc_preferences_add_page (SX_GLADE_FILE,

Modified: gnucash/trunk/src/gnome/glade/sched-xact.glade
===================================================================
--- gnucash/trunk/src/gnome/glade/sched-xact.glade	2006-02-26 19:44:29 UTC (rev 13399)
+++ gnucash/trunk/src/gnome/glade/sched-xact.glade	2006-02-26 19:55:17 UTC (rev 13400)
@@ -8551,4 +8551,116 @@
   </child>
 </widget>
 
+<widget class="GtkDialog" id="Account Deletion">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Account Deletion</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_CENTER</property>
+  <property name="modal">False</property>
+  <property name="default_width">320</property>
+  <property name="default_height">240</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox24">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area24">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="okbutton1">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox181">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="label847994">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">The following Scheduled Transactions reference the deleted account, and must now be corrected.  Press OK to edit them.</property>
+	      <property name="use_underline">False</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">True</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkScrolledWindow" id="scrolledwindow20">
+	      <property name="visible">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+	      <property name="shadow_type">GTK_SHADOW_IN</property>
+	      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+	      <child>
+		<widget class="GtkTreeView" id="sx_list">
+		  <property name="visible">True</property>
+		  <property name="headers_visible">False</property>
+		  <property name="rules_hint">False</property>
+		  <property name="reorderable">False</property>
+		  <property name="enable_search">False</property>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
 </glade-interface>



More information about the gnucash-changes mailing list