[glom] Glade instantiation: Simplify, make more robust, and test.



commit 8364855d1eec004374ba99b82198a20fef49623e
Author: Murray Cumming <murrayc murrayc com>
Date:   Sat Apr 10 13:09:52 2010 +0200

    Glade instantiation: Simplify, make more robust, and test.
    
      * glom/glade_utils.h: get_glade_widget_derived_with_warning():
      Don'te an ID. This requires the class to have a static glade_id member and
      glade_developer (bool) member, telling us what file and what ID to use.
      This associates the IDs and filenames with the class, instead of being in other files,
      to avoid duplication and to avoid using the wrong ones.
      This allows us to remove get_glade_developer_widget_derived_with_warning().
      * Many files: Use these new methods, to avoid mentioning glade IDs.
      * tests/test_glade_derived_instantiation.cc: Try to instantiate all the known
      derived glade dialogs.

 ChangeLog                                          |   13 +
 Makefile_glom.am                                   |   19 +-
 Makefile_tests.am                                  |    5 +
 glom/application.cc                                |   96 +++------
 glom/application.h                                 |    3 +
 glom/base_db.cc                                    |  236 ++++++--------------
 glom/box_reports.cc                                |    3 +
 glom/box_reports.h                                 |    3 +
 glom/dialog_connection.cc                          |    3 +
 glom/dialog_connection.h                           |    3 +
 glom/dialog_existing_or_new.cc                     |    3 +
 glom/dialog_existing_or_new.h                      |    3 +
 glom/dialog_invalid_data.cc                        |   13 +-
 glom/dialog_invalid_data.h                         |    3 +
 glom/dialog_progress_creating.cc                   |    3 +
 glom/dialog_progress_creating.h                    |    3 +
 glom/filechooser_export.cc                         |   26 +--
 glom/frame_glom.cc                                 |  130 +++---------
 glom/glade_utils.cc                                |   31 +--
 glom/glade_utils.h                                 |   64 +++---
 glom/glom.glade                                    |    3 +-
 glom/import_csv/dialog_import_csv.cc               |    5 +-
 glom/import_csv/dialog_import_csv.h                |    3 +
 glom/import_csv/dialog_import_csv_progress.cc      |    3 +
 glom/import_csv/dialog_import_csv_progress.h       |    3 +
 glom/main.cc                                       |   13 +-
 glom/mode_data/box_data_calendar_related.cc        |   15 +-
 glom/mode_data/box_data_details.cc                 |   12 +-
 glom/mode_data/box_data_list.cc                    |   12 +-
 glom/mode_data/box_data_list_related.cc            |   12 +-
 glom/mode_data/box_data_list_related.h             |    2 -
 glom/mode_data/buttonglom.cc                       |   36 +--
 glom/mode_data/datawidget/datawidget.cc            |  112 ++--------
 glom/mode_data/datawidget/datawidget.h             |    1 -
 glom/mode_data/datawidget/dialog_choose_date.cc    |    3 +
 glom/mode_data/datawidget/dialog_choose_date.h     |    3 +
 glom/mode_data/datawidget/dialog_choose_id.cc      |    3 +
 glom/mode_data/datawidget/dialog_choose_id.h       |    3 +
 glom/mode_data/datawidget/label.cc                 |   35 +--
 glom/mode_data/flowtablewithfields.cc              |   84 +++-----
 glom/mode_design/dialog_add_related_table.cc       |    3 +
 glom/mode_design/dialog_add_related_table.h        |    3 +
 glom/mode_design/dialog_database_preferences.cc    |    3 +
 glom/mode_design/dialog_database_preferences.h     |    3 +
 glom/mode_design/dialog_fields.cc                  |    3 +
 glom/mode_design/dialog_fields.h                   |    3 +
 glom/mode_design/dialog_initial_password.cc        |    3 +
 glom/mode_design/dialog_initial_password.h         |    3 +
 glom/mode_design/dialog_relationships.cc           |    3 +
 glom/mode_design/dialog_relationships.h            |    3 +
 glom/mode_design/fields/box_db_table_definition.cc |    5 +-
 glom/mode_design/fields/dialog_fieldcalculation.cc |    3 +
 glom/mode_design/fields/dialog_fieldcalculation.h  |    3 +
 glom/mode_design/fields/dialog_fielddefinition.cc  |   49 ++---
 glom/mode_design/fields/dialog_fielddefinition.h   |    5 +-
 glom/mode_design/layout/dialog_choose_field.cc     |    3 +
 glom/mode_design/layout/dialog_choose_field.h      |    3 +
 .../layout/dialog_choose_relationship.cc           |    3 +
 .../layout/dialog_choose_relationship.h            |    3 +
 .../layout/dialog_layout_calendar_related.cc       |    3 +
 .../layout/dialog_layout_calendar_related.h        |    3 +
 glom/mode_design/layout/dialog_layout_details.cc   |  108 ++-------
 glom/mode_design/layout/dialog_layout_details.h    |    3 +
 glom/mode_design/layout/dialog_layout_export.cc    |    3 +
 glom/mode_design/layout/dialog_layout_export.h     |    3 +
 glom/mode_design/layout/dialog_layout_list.cc      |    3 +
 glom/mode_design/layout/dialog_layout_list.h       |    3 +
 .../layout/dialog_layout_list_related.cc           |    3 +
 .../layout/dialog_layout_list_related.h            |    3 +
 .../layout/layout_item_dialogs/box_formatting.cc   |    3 +
 .../layout/layout_item_dialogs/box_formatting.h    |    3 +
 .../layout_item_dialogs/dialog_buttonscript.cc     |    3 +
 .../layout_item_dialogs/dialog_buttonscript.h      |    3 +
 .../layout_item_dialogs/dialog_field_layout.cc     |   14 +-
 .../layout_item_dialogs/dialog_field_layout.h      |    3 +
 .../layout_item_dialogs/dialog_field_summary.cc    |    3 +
 .../layout_item_dialogs/dialog_field_summary.h     |    3 +
 .../layout_item_dialogs/dialog_formatting.cc       |   10 +-
 .../layout/layout_item_dialogs/dialog_group_by.cc  |   25 +--
 .../layout/layout_item_dialogs/dialog_group_by.h   |    3 +
 .../dialog_groupby_secondaryfields.cc              |    3 +
 .../dialog_groupby_secondaryfields.h               |    3 +
 .../dialog_groupby_sortfields.cc                   |    3 +
 .../dialog_groupby_sortfields.h                    |    3 +
 .../layout_item_dialogs/dialog_imageobject.cc      |    3 +
 .../layout_item_dialogs/dialog_imageobject.h       |    3 +
 .../layout/layout_item_dialogs/dialog_notebook.cc  |    3 +
 .../layout/layout_item_dialogs/dialog_notebook.h   |    3 +
 .../layout_item_dialogs/dialog_textobject.cc       |    3 +
 .../layout/layout_item_dialogs/dialog_textobject.h |    3 +
 .../mode_design/print_layouts/box_print_layouts.cc |    3 +
 glom/mode_design/print_layouts/box_print_layouts.h |    3 +
 .../print_layouts/dialog_text_formatting.cc        |   15 +-
 .../print_layouts/dialog_text_formatting.h         |    3 +
 .../print_layouts/window_print_layout_edit.cc      |    3 +
 .../print_layouts/window_print_layout_edit.h       |    3 +
 .../dialog_relationships_overview.cc               |    2 +
 .../dialog_relationships_overview.h                |    5 +-
 .../report_layout/dialog_layout_report.cc          |  135 ++++-------
 .../report_layout/dialog_layout_report.h           |    3 +
 .../script_library/dialog_new_script.cc            |    3 +
 .../mode_design/script_library/dialog_new_script.h |    3 +
 .../script_library/dialog_script_library.cc        |   15 +-
 .../script_library/dialog_script_library.h         |    3 +
 .../translation/dialog_change_language.cc          |    3 +
 .../translation/dialog_change_language.h           |    3 +
 .../translation/dialog_copy_translation.cc         |    3 +
 .../translation/dialog_copy_translation.h          |    3 +
 .../translation/dialog_identify_original.cc        |    3 +
 .../translation/dialog_identify_original.h         |    3 +
 .../mode_design/translation/window_translations.cc |   99 ++++-----
 glom/mode_design/translation/window_translations.h |    3 +
 glom/mode_design/users/dialog_choose_user.cc       |    3 +
 glom/mode_design/users/dialog_choose_user.h        |    9 +-
 glom/mode_design/users/dialog_groups_list.cc       |   27 +--
 glom/mode_design/users/dialog_groups_list.h        |    3 +
 glom/mode_design/users/dialog_new_group.cc         |    3 +
 glom/mode_design/users/dialog_new_group.h          |    3 +
 glom/mode_design/users/dialog_user.cc              |    3 +
 glom/mode_design/users/dialog_user.h               |    3 +
 glom/mode_design/users/dialog_users_list.cc        |   38 +---
 glom/mode_design/users/dialog_users_list.h         |    3 +
 glom/navigation/box_tables.cc                      |    3 +
 glom/navigation/box_tables.h                       |    3 +
 glom/print_layout/canvas_print_layout.cc           |   29 +--
 glom/utility_widgets/dialog_flowtable.cc           |    3 +
 glom/utility_widgets/dialog_flowtable.h            |    3 +
 glom/utility_widgets/dialog_image_progress.cc      |    3 +
 glom/utility_widgets/dialog_image_progress.h       |    7 +-
 glom/utility_widgets/imageglom.cc                  |    8 +-
 130 files changed, 765 insertions(+), 1079 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index f686a65..078af1f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -25,6 +25,19 @@
 
 2010-04-10  Murray Cumming  <murrayc murrayc com>
 
+  Glade instantiation: Simplify, make more robust, and test.
+  
+  * glom/glade_utils.h: get_glade_widget_derived_with_warning(), 
+  get_glade_developer_widget_derived_with_warning(): Add method overloads that 
+  don't take an ID. These require the class to have a static glade_id member.
+  This associates the IDs with the class, instead of being in other files, 
+  to avoid duplication and to avoid using the wrong ones.
+  * Many files: Use these new methods, to avoid mentioning glade IDs.
+  * tests/test_glade_derived_instantiation.cc: Try to instantiate all the known 
+  derived glade dialogs.
+  
+2010-04-10  Murray Cumming  <murrayc murrayc com>
+
   Notebook properties dialog: Fix a probable crash.
   
 	* glom/base_db.cc: :offer_notebook(): Fix a typo in the glade ID.
diff --git a/Makefile_glom.am b/Makefile_glom.am
index 64b5058..cb2ab37 100644
--- a/Makefile_glom.am
+++ b/Makefile_glom.am
@@ -15,7 +15,7 @@
 ## You should have received a copy of the GNU General Public License
 ## along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-glom_glom_SOURCES =							\
+glom_source_files = \
 	glom/application.cc						\
 	glom/application.h						\
 	glom/base_db.cc							\
@@ -48,7 +48,6 @@ glom_glom_SOURCES =							\
 	glom/glom_postgres.h						\
 	glom/glom_privs.cc						\
 	glom/glom_privs.h						\
-	glom/main.cc							\
 	glom/notebook_glom.cc						\
 	glom/notebook_glom.h						\
 	glom/signal_reemitter.h						\
@@ -208,7 +207,7 @@ glom_glom_SOURCES =							\
 	glom/utility_widgets/db_adddel/glom_db_treemodel.h
 
 if !GLOM_ENABLE_CLIENT_ONLY
-glom_glom_SOURCES +=							\
+glom_source_files +=							\
 	glom/mode_design/dialog_database_preferences.cc				\
 	glom/mode_design/dialog_database_preferences.h				\
 	glom/mode_design/dialog_initial_password.cc					\
@@ -342,22 +341,28 @@ glom_glom_SOURCES +=							\
 endif
 
 if !GLOM_ENABLE_MAEMO
-glom_glom_SOURCES +=							\
+glom_source_files +=							\
 	glom/navigation/box_tables.cc					\
 	glom/navigation/box_tables.h
 else
-glom_glom_SOURCES +=							\
+glom_source_files +=							\
 	glom/navigation/maemo/pickerbutton_table.cc			\
 	glom/navigation/maemo/pickerbutton_table.h
 endif
 
-glom_glom_LDADD = $(win_resfile) \
+glom_glom_SOURCES =							\
+	glom/main.cc							\
+	$(glom_source_files)
+
+glom_all_libs = $(win_resfile) \
 	glom/libglom/libglom-$(GLOM_ABI_VERSION).la \
 	$(GLOM_LIBS) $(PYTHON_LIBS) $(BOOST_PYTHON_LIBS) $(INTLLIBS)
 if !GLOM_ENABLE_MAEMO
-glom_glom_LDADD += -lgettextpo
+glom_all_libs += -lgettextpo
 endif
 
+glom_glom_LDADD = $(glom_all_libs)
+
 if HOST_WIN32
 # Suppress console window
 glom_glom_LDFLAGS = -mwindows
diff --git a/Makefile_tests.am b/Makefile_tests.am
index 549dc36..c90c3cb 100644
--- a/Makefile_tests.am
+++ b/Makefile_tests.am
@@ -30,6 +30,7 @@ check_PROGRAMS =						\
 	tests/test_python_execute_script \
 	tests/import/test_parsing \
 	tests/import/test_signals \
+	tests/test_glade_derived_instantiation \
 	tests/glade_toplevels_instantiation
 
 TESTS =	tests/test_parsing_time	\
@@ -37,11 +38,13 @@ TESTS =	tests/test_parsing_time	\
 	tests/test_dtd_file_validation.sh \
 	tests/test_glade_file_validation.sh \
 	tests/test_glade_toplevels_instantiation.sh \
+	tests/test_glade_derived_instantiation \
 	tests/test_load_python_library \
 	tests/test_python_module \
 	tests/test_python_execute_func \
 	tests/test_python_execute_func_date \
 	tests/test_python_execute_script
+	
 # These hang most of the time, but not always:
 #	tests/import/test_parsing \
 #	tests/import/test_signals
@@ -83,6 +86,7 @@ tests_import_test_signals_SOURCES =	\
 	tests/import/utils.cc\
 	tests/import/utils.h\
 	tests/import/test_signals.cc
+tests_test_glade_derived_instantiation_SOURCES = tests/test_glade_derived_instantiation.cc $(glom_source_files)
 
 glom_libglom_test_connectionpool_LDADD = $(tests_ldadd)
 glom_libglom_test_document_LDADD = $(tests_ldadd)
@@ -125,3 +129,4 @@ tests_test_python_execute_func_date_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON
 tests_test_python_execute_script_LDADD = $(tests_ldadd) $(GLOM_LIBS) $(PYTHON_LIBS)
 tests_import_test_parsing_LDADD = $(LIBGLOM_LIBS) $(GLOM_LIBS)
 tests_import_test_signals_LDADD = $(LIBGLOM_LIBS) $(GLOM_LIBS)
+tests_test_glade_derived_instantiation_LDADD = $(glom_all_libs)
diff --git a/glom/application.cc b/glom/application.cc
index 07173f2..5f146dc 100644
--- a/glom/application.cc
+++ b/glom/application.cc
@@ -72,6 +72,9 @@ namespace Glom
 // Global application variable
 Application* global_application = 0;
 
+const char* Application::glade_id("window_main");
+const bool Application::glade_developer(false);
+
 Application::Application(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : type_base(cobject, "Glom"),
   m_pBoxTop(0),
@@ -710,7 +713,7 @@ void Application::open_browsed_document(const EpcServiceInfo* server, const Glib
     //Request a password to attempt retrieval of the document over the network:
     Dialog_Connection* dialog_connection = 0;
     //Load the Glade file and instantiate its widgets to get the dialog stuff:
-    Utils::get_glade_widget_derived_with_warning("dialog_connection", dialog_connection);
+    Utils::get_glade_widget_derived_with_warning(dialog_connection);
     dialog_connection->set_transient_for(*this);
     dialog_connection->set_connect_to_browsed();
     dialog_connection->set_database_name(service_name);
@@ -1381,29 +1384,9 @@ bool Application::offer_new_or_existing()
 {
   //Offer to load an existing document, or start a new one.
   const Glib::ustring glade_path = Utils::get_glade_file_path("glom.glade");
-  Glib::RefPtr<Gtk::Builder> refXml;
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(glade_path, "dialog_existing_or_new");
-  }
-  catch(const Glib::Error& ex)
-  {
-    std::cerr << "Application::offer_new_or_existing(): Gtk::Builder::create_from_file() failed: " << ex.what() << std::endl;
-  }
-#else
-  std::auto_ptr<Glib::Error> ex;
-  refXml = Gtk::Builder::create_from_file(glade_path, "dialog_existing_or_new", ex);
-  if(ex.get())
-  {
-    std::cerr << "Application::offer_new_or_existing(): Gtk::Builder::create_from_file() failed:" << ex->what() << std::endl;
-  }
-#endif
-
-  g_assert(refXml);
 
   Dialog_ExistingOrNew* dialog_raw = 0;
-  refXml->get_widget_derived("dialog_existing_or_new", dialog_raw);
+  Utils::get_glade_widget_derived_with_warning(dialog_raw);
   std::auto_ptr<Dialog_ExistingOrNew> dialog(dialog_raw);
   dialog->set_transient_for(*this);
 /*
@@ -1664,25 +1647,17 @@ bool Application::recreate_database(bool& user_cancelled)
 
   //Show the user that something is happening, because the INSERTS might take time.
   //TOOD: This doesn't actually show up until near the end, even with Gtk::Main::instance()->iteration().
-  std::auto_ptr<Dialog_ProgressCreating> dialog_progress;
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "window_progress");
-  if(refXml)
-  {
-    Dialog_ProgressCreating* dialog_progress_temp = 0;
-    refXml->get_widget_derived("window_progress", dialog_progress_temp);
-    if(dialog_progress_temp)
-    {
-      dialog_progress_temp->set_message(_("Creating Glom Database"), _("Creating Glom database from example file."));
-      dialog_progress.reset(dialog_progress_temp); //Put the dialog in an auto_ptr so that it will be deleted (and hidden) when the current function returns.
+  Dialog_ProgressCreating* dialog_progress_temp = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog_progress_temp);
+  dialog_progress_temp->set_message(_("Creating Glom Database"), _("Creating Glom database from example file."));
+  std::auto_ptr<Dialog_ProgressCreating> dialog_progress(dialog_progress_temp); //Put the dialog in an auto_ptr so that it will be deleted (and hidden) when the current function returns.
 
-      dialog_progress->set_transient_for(*this);
-      dialog_progress->show();
+  dialog_progress->set_transient_for(*this);
+  dialog_progress->show();
 
-      //Ensure that the dialog is shown, instead of waiting for the application to be idle:
-      while(Gtk::Main::instance()->events_pending())
-        Gtk::Main::instance()->iteration();
-    }
-  }
+  //Ensure that the dialog is shown, instead of waiting for the application to be idle:
+  while(Gtk::Main::instance()->events_pending())
+    Gtk::Main::instance()->iteration();
 
   dialog_progress->pulse();
 
@@ -2444,41 +2419,34 @@ void Application::stop_self_hosting_of_document_database()
 
 void Application::on_menu_developer_changelanguage()
 {
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_change_language");
-  if(refXml)
-  {
-    Dialog_ChangeLanguage* dialog = 0;
-    refXml->get_widget_derived("dialog_change_language", dialog);
-    if(dialog)
-    {
-      dialog->set_icon_name("glom");
-      dialog->set_transient_for(*this);
-      const int response =       Glom::Utils::dialog_run_with_help(dialog, "dialog_change_language");
-      dialog->hide();
-
-      if(response == Gtk::RESPONSE_OK)
-      {
-        TranslatableItem::set_current_locale(dialog->get_locale());
+  Dialog_ChangeLanguage* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  
+  dialog->set_icon_name("glom");
+  dialog->set_transient_for(*this);
+  const int response =       Glom::Utils::dialog_run_with_help(dialog, "dialog_change_language");
+  dialog->hide();
 
-       //Get the translations from the document (in Operator mode, we only load the necessary translations.)
-       //This also updates the UI, so we show all the translated titles:
-       int failure_code = 0;
-       get_document()->load(failure_code);
+  if(response == Gtk::RESPONSE_OK)
+  {
+    TranslatableItem::set_current_locale(dialog->get_locale());
 
-       m_pFrame->show_table_refresh(); //load() doesn't seem to refresh the view.
-      }
+    //Get the translations from the document (in Operator mode, we only load the necessary translations.)
+    //This also updates the UI, so we show all the translated titles:
+    int failure_code = 0;
+    get_document()->load(failure_code);
 
-      delete dialog;
-    }
+    m_pFrame->show_table_refresh(); //load() doesn't seem to refresh the view.
   }
+
+  delete dialog;
 }
 
 void Application::on_menu_developer_translations()
 {
   if(!m_window_translations)
   {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_translations");
-    refXml->get_widget_derived("window_translations", m_window_translations);
+    Utils::get_glade_widget_derived_with_warning(m_window_translations);
     if(m_window_translations)
     {
       m_pFrame->add_view(m_window_translations);
diff --git a/glom/application.h b/glom/application.h
index 85763be..332f0b9 100644
--- a/glom/application.h
+++ b/glom/application.h
@@ -56,6 +56,9 @@ class Window_Translations;
 class Application : public GlomBakery::App_WithDoc_Gtk
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Application(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Application();
 
diff --git a/glom/base_db.cc b/glom/base_db.cc
index f4e3301..cf5145b 100644
--- a/glom/base_db.cc
+++ b/glom/base_db.cc
@@ -1815,30 +1815,8 @@ sharedptr<LayoutItem_Field> Base_DB::offer_field_list_select_one_field(const sha
 {
   sharedptr<LayoutItem_Field> result;
 
-  Glib::RefPtr<Gtk::Builder> refXml;
-
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_field");
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-    return result;
-  }
-#else
-  std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_field", error);
-  if (error.get())
-  {
-    std::cerr << error->what() << std::endl;
-    return result;
-  }
-#endif
-
   Dialog_ChooseField* dialog = 0;
-  refXml->get_widget_derived("dialog_choose_field", dialog);
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   if(dialog)
   {
@@ -1865,30 +1843,8 @@ Base_DB::type_list_field_items Base_DB::offer_field_list(const Glib::ustring& ta
 {
   type_list_field_items result;
 
-  Glib::RefPtr<Gtk::Builder> refXml;
-
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_field");
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-    return result;
-  }
-#else
-  std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_field", error);
-  if (error.get())
-  {
-    std::cerr << error->what() << std::endl;
-    return result;
-  }
-#endif
-
   Dialog_ChooseField* dialog = 0;
-  refXml->get_widget_derived("dialog_choose_field", dialog);
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   if(dialog)
   {
@@ -1913,31 +1869,24 @@ bool Base_DB::offer_item_formatting(const sharedptr<LayoutItem_WithFormatting>&
 {
   bool result = false;
 
-  try
-  {
-    Dialog_Formatting dialog;
-    if(transient_for)
-      dialog.set_transient_for(*transient_for);
+  Dialog_Formatting dialog;
+  if(transient_for)
+    dialog.set_transient_for(*transient_for);
 
-    add_view(&dialog);
+  add_view(&dialog);
 
-    dialog.set_item(layout_item);
-
-    const int response = dialog.run();
-    if(response == Gtk::RESPONSE_OK)
-    {
-      //Get the chosen formatting:
-       dialog.use_item_chosen(layout_item);
-       result = true;
-    }
-    //Cancel means use the old one:
+  dialog.set_item(layout_item);
 
-    remove_view(&dialog);
-  }
-  catch(const Gtk::BuilderError& ex)
+  const int response = dialog.run();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen formatting:
+     dialog.use_item_chosen(layout_item);
+     result = true;
   }
+  //Cancel means use the old one:
+
+  remove_view(&dialog);
 
   return result;
 }
@@ -1946,40 +1895,28 @@ sharedptr<LayoutItem_Field> Base_DB::offer_field_formatting(const sharedptr<cons
 {
   sharedptr<LayoutItem_Field> result;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_layout_field_properties");
-
-    Dialog_FieldLayout* dialog = 0;
-    refXml->get_widget_derived("dialog_layout_field_properties", dialog);
+  Dialog_FieldLayout* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
-    if(dialog)
-    {
-      if(transient_for)
-        dialog->set_transient_for(*transient_for);
+  if(transient_for)
+    dialog->set_transient_for(*transient_for);
 
-      add_view(dialog);
+  add_view(dialog);
 
-      dialog->set_field(start_field, table_name);
+  dialog->set_field(start_field, table_name);
 
 
-      const int response = dialog->run();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen field:
-        result = dialog->get_field_chosen();
-      }
-      else if(start_field) //Cancel means use the old one:
-        result = glom_sharedptr_clone(start_field);
-
-      remove_view(dialog);
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  const int response = dialog->run();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen field:
+    result = dialog->get_field_chosen();
   }
+  else if(start_field) //Cancel means use the old one:
+    result = glom_sharedptr_clone(start_field);
+
+  remove_view(dialog);
+  delete dialog;
 
   return result;
 }
@@ -1988,34 +1925,23 @@ sharedptr<LayoutItem_Text> Base_DB::offer_textobject(const sharedptr<LayoutItem_
 {
   sharedptr<LayoutItem_Text> result = start_textobject;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_textobject");
-
-    Dialog_TextObject* dialog = 0;
-    refXml->get_widget_derived("window_textobject", dialog);
-    if(dialog)
-    {
-      if(transient_for)
-        dialog->set_transient_for(*transient_for);
-
-      dialog->set_textobject(start_textobject, Glib::ustring(), show_title);
-      int response = Glom::Utils::dialog_run_with_help(dialog, "window_textobject");
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        result = dialog->get_textobject();
-      }
+  Dialog_TextObject* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  
+  if(transient_for)
+    dialog->set_transient_for(*transient_for);
 
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  dialog->set_textobject(start_textobject, Glib::ustring(), show_title);
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "window_textobject");
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen relationship:
+    result = dialog->get_textobject();
   }
 
+  delete dialog;
+
   return result;
 }
 
@@ -2023,34 +1949,23 @@ sharedptr<LayoutItem_Image> Base_DB::offer_imageobject(const sharedptr<LayoutIte
 {
   sharedptr<LayoutItem_Image> result = start_imageobject;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_imageobject");
-
-    Dialog_ImageObject* dialog = 0;
-    refXml->get_widget_derived("window_imageobject", dialog);
-    if(dialog)
-    {
-      if(transient_for)
-        dialog->set_transient_for(*transient_for);
-
-      dialog->set_imageobject(start_imageobject, Glib::ustring(), show_title);
-      const int response = Glom::Utils::dialog_run_with_help(dialog, "window_imageobject");
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        result = dialog->get_imageobject();
-      }
+  Dialog_ImageObject* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+ 
+  if(transient_for)
+    dialog->set_transient_for(*transient_for);
 
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  dialog->set_imageobject(start_imageobject, Glib::ustring(), show_title);
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "window_imageobject");
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen relationship:
+    result = dialog->get_imageobject();
   }
 
+  delete dialog;
+
   return result;
 }
 
@@ -2058,35 +1973,24 @@ sharedptr<LayoutItem_Notebook> Base_DB::offer_notebook(const sharedptr<LayoutIte
 {
   sharedptr<LayoutItem_Notebook> result = start_notebook;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_notebook");
-
-    Dialog_Notebook* dialog = 0;
-    refXml->get_widget_derived("dialog_notebook", dialog);
-    if(dialog)
-    {
-      if(transient_for)
-        dialog->set_transient_for(*transient_for);
+  Dialog_Notebook* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  
+  if(transient_for)
+    dialog->set_transient_for(*transient_for);
 
-      dialog->set_notebook(start_notebook);
-      //dialog->set_transient_for(*this);
-      const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_notebook");
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        result = dialog->get_notebook();
-      }
-
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  dialog->set_notebook(start_notebook);
+  //dialog->set_transient_for(*this);
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_notebook");
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen relationship:
+    result = dialog->get_notebook();
   }
 
+  delete dialog;
+
   return result;
 }
 #endif // !GLOM_ENABLE_CLIENT_ONLY
diff --git a/glom/box_reports.cc b/glom/box_reports.cc
index 7aea5d6..04894b7 100644
--- a/glom/box_reports.cc
+++ b/glom/box_reports.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Box_Reports::glade_id("box_reports");
+const bool Box_Reports::glade_developer(true);
+
 Box_Reports::Box_Reports(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Box_DB_Table(cobject, builder),
   m_colReportName(0),
diff --git a/glom/box_reports.h b/glom/box_reports.h
index be98c60..547de7d 100644
--- a/glom/box_reports.h
+++ b/glom/box_reports.h
@@ -30,6 +30,9 @@ namespace Glom
 class Box_Reports : public Box_DB_Table
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Box_Reports(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Box_Reports();
 
diff --git a/glom/dialog_connection.cc b/glom/dialog_connection.cc
index 8d7c0db..0a3cbdb 100644
--- a/glom/dialog_connection.cc
+++ b/glom/dialog_connection.cc
@@ -32,6 +32,9 @@
 namespace Glom
 {
 
+const char* Dialog_Connection::glade_id("dialog_connection");
+const bool Dialog_Connection::glade_developer(false);
+
 Dialog_Connection::Dialog_Connection(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   Base_DB(),
diff --git a/glom/dialog_connection.h b/glom/dialog_connection.h
index 07a6ec7..0f3e667 100644
--- a/glom/dialog_connection.h
+++ b/glom/dialog_connection.h
@@ -36,6 +36,9 @@ class Dialog_Connection
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Connection(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Connection();
 
diff --git a/glom/dialog_existing_or_new.cc b/glom/dialog_existing_or_new.cc
index 44bd102..936a93a 100644
--- a/glom/dialog_existing_or_new.cc
+++ b/glom/dialog_existing_or_new.cc
@@ -101,6 +101,9 @@ private:
 namespace Glom
 {
 
+const char* Dialog_ExistingOrNew::glade_id("dialog_existing_or_new");
+const bool Dialog_ExistingOrNew::glade_developer(false);
+
 Dialog_ExistingOrNew::Dialog_ExistingOrNew(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject)
 {
diff --git a/glom/dialog_existing_or_new.h b/glom/dialog_existing_or_new.h
index 8f6a2b4..558b280 100644
--- a/glom/dialog_existing_or_new.h
+++ b/glom/dialog_existing_or_new.h
@@ -46,6 +46,9 @@ class Dialog_ExistingOrNew
   : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   enum Action {
     NONE,
     NEW_EMPTY,
diff --git a/glom/dialog_invalid_data.cc b/glom/dialog_invalid_data.cc
index c7bc071..db4c769 100644
--- a/glom/dialog_invalid_data.cc
+++ b/glom/dialog_invalid_data.cc
@@ -26,21 +26,16 @@
 namespace Glom
 {
 
+const char* Dialog_InvalidData::glade_id("dialog_data_invalid_format");
+const bool Dialog_InvalidData::glade_developer(false);
+
 /** Show the dialog.
  * @result true if the data in the field should be reverted.
  */
 bool glom_show_dialog_invalid_data(Field::glom_field_type glom_type)
 {
-  //TODO: Share a global instance, to make this quicker?
-#ifdef GLIBMM_EXCEPTIONS_ENABLED  
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_data_invalid_format");
-#else
-  std::auto_ptr<Glib::Error> error;  
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_data_invalid_format", error);
-#endif
-
   Dialog_InvalidData* dialog = 0;
-  refXml->get_widget_derived("dialog_data_invalid_format", dialog);
+  Utils::get_glade_widget_derived_with_warning(dialog);
   dialog->set_example_data(glom_type);
   //dialog->set_transient_for(*this);
   const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_data_invalid_format");
diff --git a/glom/dialog_invalid_data.h b/glom/dialog_invalid_data.h
index ffe9f80..093281d 100644
--- a/glom/dialog_invalid_data.h
+++ b/glom/dialog_invalid_data.h
@@ -37,6 +37,9 @@ bool glom_show_dialog_invalid_data(Field::glom_field_type glom_type);
 class Dialog_InvalidData : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_InvalidData(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_InvalidData();
 
diff --git a/glom/dialog_progress_creating.cc b/glom/dialog_progress_creating.cc
index 60cc4c0..21019b8 100644
--- a/glom/dialog_progress_creating.cc
+++ b/glom/dialog_progress_creating.cc
@@ -26,6 +26,9 @@
 namespace Glom
 {
 
+const char* Dialog_ProgressCreating::glade_id("window_progress");
+const bool Dialog_ProgressCreating::glade_developer(false);
+
 Dialog_ProgressCreating::Dialog_ProgressCreating(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Window(cobject),
   m_progress(0),
diff --git a/glom/dialog_progress_creating.h b/glom/dialog_progress_creating.h
index aa2fb91..a977f4e 100644
--- a/glom/dialog_progress_creating.h
+++ b/glom/dialog_progress_creating.h
@@ -36,6 +36,9 @@ class Dialog_ProgressCreating
   : public Gtk::Window
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_ProgressCreating(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ProgressCreating();
 
diff --git a/glom/filechooser_export.cc b/glom/filechooser_export.cc
index 2a3d305..6f82d5e 100644
--- a/glom/filechooser_export.cc
+++ b/glom/filechooser_export.cc
@@ -55,25 +55,13 @@ FileChooser_Export::FileChooser_Export()
 
 #ifndef GLOM_ENABLE_CLIENT_ONLY
   //TODO: Use a generic layout dialog?
-#ifdef GLIBMM_EXCEPTIONS_ENABLED  
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_data_layout_export");
-#else
-  std::auto_ptr<Glib::Error> error;  
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_data_layout_export", error);
-#endif
-
-  if(refXml)
-  {
-    Dialog_Layout_Export* dialog = 0;
-    refXml->get_widget_derived("window_data_layout_export", dialog);
-    if(dialog)
-    {
-      m_pDialogLayout = dialog;
-      m_pDialogLayout->set_icon_name("glom");
-      //add_view(m_pDialogLayout); //Give it access to the document.
-      m_pDialogLayout->signal_hide().connect( sigc::mem_fun(*this, &FileChooser_Export::on_dialog_layout_hide) );
-    }
-  }
+  Dialog_Layout_Export* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  
+  m_pDialogLayout = dialog;
+  m_pDialogLayout->set_icon_name("glom");
+  //add_view(m_pDialogLayout); //Give it access to the document.
+  m_pDialogLayout->signal_hide().connect( sigc::mem_fun(*this, &FileChooser_Export::on_dialog_layout_hide) );
 #endif //GLOM_ENABLE_CLIENT_ONLY
 }
 
diff --git a/glom/frame_glom.cc b/glom/frame_glom.cc
index bd06938..8213b50 100644
--- a/glom/frame_glom.cc
+++ b/glom/frame_glom.cc
@@ -898,8 +898,7 @@ void Frame_Glom::on_menu_file_import()
       file_chooser.hide();
 
       Dialog_Import_CSV* dialog = 0;
-      Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_import_csv");
-      refXml->get_widget_derived("dialog_import_csv", dialog);
+      Glom::Utils::get_glade_widget_derived_with_warning(dialog);
       add_view(dialog);
 
       dialog->import(file_chooser.get_uri(), m_table_name);
@@ -908,17 +907,7 @@ void Frame_Glom::on_menu_file_import()
         dialog->hide();
 
         Dialog_Import_CSV_Progress* progress_dialog = 0;
-
-        //GtkBuilder can't find top-level objects (GtkTextBuffer in this case),
-        //that one top-level object references.
-        //See http://bugzilla.gnome.org/show_bug.cgi?id=575714
-        //so we need to this silliness. murrayc.
-        std::list<Glib::ustring> builder_ids;
-        builder_ids.push_back("dialog_import_csv_progress");
-        builder_ids.push_back("textbuffer1");
-
-        Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), builder_ids);
-        refXml->get_widget_derived("dialog_import_csv_progress", progress_dialog);
+        Glom::Utils::get_glade_widget_derived_with_warning(progress_dialog);
         add_view(progress_dialog);
 
         progress_dialog->init_db_details(dialog->get_target_table_name());
@@ -1252,17 +1241,7 @@ void Frame_Glom::on_menu_Tables_AddRelatedTable()
     m_dialog_addrelatedtable = 0;
   }
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_add_related_table");
-
-    refXml->get_widget_derived("dialog_add_related_table", m_dialog_addrelatedtable);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-
+  Utils::get_glade_widget_derived_with_warning(m_dialog_addrelatedtable);
   if(!m_dialog_addrelatedtable)
     return;
 
@@ -1396,7 +1375,7 @@ void Frame_Glom::do_menu_Navigate_Table(bool open_default)
   //Create the dialog, if it has not already been created:
   if(!m_pBox_Tables)
   {
-    Utils::get_glade_widget_derived_with_warning("box_navigation_tables", m_pBox_Tables);
+    Utils::get_glade_widget_derived_with_warning(m_pBox_Tables);
     m_pDialog_Tables = new Window_BoxHolder(m_pBox_Tables, _("Edit Tables"));
     m_pDialog_Tables->signal_hide().connect(sigc::mem_fun(*this, &Frame_Glom::on_dialog_tables_hide));
 
@@ -1702,30 +1681,18 @@ void Frame_Glom::load_from_document()
 void Frame_Glom::on_menu_developer_database_preferences()
 {
   Dialog_Database_Preferences* dialog = 0;
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_database_preferences");
-    refXml->get_widget_derived("dialog_database_preferences", dialog);
-    if(dialog)
-    {
-      dialog->set_icon_name("glom");
-      dialog->set_transient_for(*(get_app_window()));
-      add_view(dialog);
-      dialog->load_from_document();
-
-      Glom::Utils::dialog_run_with_help(dialog, "dialog_database_preferences");
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  dialog->set_icon_name("glom");
+  dialog->set_transient_for(*(get_app_window()));
+  add_view(dialog);
+  dialog->load_from_document();
 
-      remove_view(dialog);
-      delete dialog;
+  Glom::Utils::dialog_run_with_help(dialog, "dialog_database_preferences");
 
-      //show_system_name(); //In case it has changed.
-    }
-  }
+  remove_view(dialog);
+  delete dialog;
 
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
+  //show_system_name(); //In case it has changed.
 }
 
 void Frame_Glom::on_menu_developer_fields()
@@ -1740,19 +1707,9 @@ void Frame_Glom::do_menu_developer_fields(Gtk::Window& parent, const Glib::ustri
 {
   if(!m_pDialog_Fields)
   {
-    try
-    {
-      Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_design");
-
-      refXml->get_widget_derived("window_design", m_pDialog_Fields);
-      m_pDialog_Fields->set_icon_name("glom");
-      m_pDialog_Fields->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_developer_dialog_hide));
-    }
-    catch(const Gtk::BuilderError& ex)
-    {
-      std::cerr << ex.what() << std::endl;
-    }
-
+    Utils::get_glade_widget_derived_with_warning(m_pDialog_Fields);
+    m_pDialog_Fields->set_icon_name("glom");
+    m_pDialog_Fields->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_developer_dialog_hide));
     add_view(m_pDialog_Fields);
   }
 
@@ -1784,7 +1741,7 @@ void Frame_Glom::on_menu_developer_relationships_overview()
 {
   if(!m_dialog_relationships_overview)
   {
-    Utils::get_glade_developer_widget_derived_with_warning("dialog_relationships_overview", m_dialog_relationships_overview);
+    Utils::get_glade_widget_derived_with_warning(m_dialog_relationships_overview);
     add_view(m_dialog_relationships_overview);
   }
 
@@ -1807,7 +1764,7 @@ void Frame_Glom::do_menu_developer_relationships(Gtk::Window& parent, const Glib
   //Create the widget if necessary:
   if(!m_pDialog_Relationships)
   {
-    Utils::get_glade_developer_widget_derived_with_warning("window_design", m_pDialog_Relationships);
+    Utils::get_glade_widget_derived_with_warning(m_pDialog_Relationships);
     m_pDialog_Relationships->set_icon_name("glom");
     m_pDialog_Relationships->set_title("Relationships");
     m_pDialog_Relationships->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_developer_dialog_hide));
@@ -1831,17 +1788,7 @@ void Frame_Glom::on_menu_developer_relationships()
 void Frame_Glom::on_menu_developer_users()
 {
   Dialog_GroupsList* dialog = 0;
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_groups");
-
-    refXml->get_widget_derived("window_groups", dialog);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-
+  Utils::get_glade_widget_derived_with_warning(dialog);
   dialog->set_icon_name("glom");
   dialog->set_transient_for(*get_app_window());
 
@@ -1878,12 +1825,12 @@ void Frame_Glom::on_menu_developer_reports()
   //Create the widget if necessary:
   if(!m_pBox_Reports)
   {
-    Utils::get_glade_developer_widget_derived_with_warning("box_reports", m_pBox_Reports);
+    Utils::get_glade_widget_derived_with_warning(m_pBox_Reports);
     m_pDialog_Reports = new Window_BoxHolder(m_pBox_Reports);
     m_pDialog_Reports->set_transient_for(*(get_app_window()));
     m_pDialog_Reports->set_title(_("Reports"));
 
-    Utils::get_glade_developer_widget_derived_with_warning("window_report_layout", m_pDialogLayoutReport);
+    Utils::get_glade_widget_derived_with_warning(m_pDialogLayoutReport);
     add_view(m_pDialogLayoutReport);
     m_pDialogLayoutReport->set_icon_name("glom");
     m_pDialogLayoutReport->set_transient_for(*(get_app_window()));
@@ -1909,7 +1856,7 @@ void Frame_Glom::on_menu_developer_print_layouts()
   //Create the widget if necessary:
   if(!m_pBox_PrintLayouts)
   {
-    Utils::get_glade_developer_widget_derived_with_warning("box_print_layouts", m_pBox_PrintLayouts);
+    Utils::get_glade_widget_derived_with_warning(m_pBox_PrintLayouts);
     m_pDialog_PrintLayouts = new Window_BoxHolder(m_pBox_PrintLayouts);
 
     m_pDialog_PrintLayouts->set_transient_for(*get_app_window());
@@ -1928,8 +1875,7 @@ void Frame_Glom::on_menu_developer_print_layouts()
 void Frame_Glom::on_menu_developer_script_library()
 {
   Dialog_ScriptLibrary* dialog = 0;
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_script_library");
-  refXml->get_widget_derived("dialog_script_library", dialog);
+  Utils::get_glade_widget_derived_with_warning(dialog);
   dialog->set_transient_for(*(get_app_window()));
   add_view(dialog); //Give it access to the document.
   dialog->load_from_document();
@@ -1959,7 +1905,7 @@ void Frame_Glom::on_box_print_layouts_selected(const Glib::ustring& print_layout
   //Create the dialog if necessary:
   if(!m_pDialogLayoutPrint)
   {
-    Utils::get_glade_developer_widget_derived_with_warning("window_print_layout_edit", m_pDialogLayoutPrint);
+    Utils::get_glade_widget_derived_with_warning(m_pDialogLayoutPrint);
     add_view(m_pDialogLayoutPrint);
     m_pDialogLayoutPrint->signal_hide().connect( sigc::mem_fun(*this, &Frame_Glom::on_dialog_layout_print_hide) );
   }
@@ -2116,29 +2062,7 @@ bool Frame_Glom::connection_request_initial_password(Glib::ustring& user, Glib::
 
   //Ask for a new username and password to specify when creating a new self-hosted database.
   Dialog_InitialPassword* dialog = 0;
-  Glib::RefPtr<Gtk::Builder> refXml;
-
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_initial_password");
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-    return false;
-  }
-#else
-  std::auto_ptr<Gtk::BuilderError> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_initial_password", error);
-  if(error.get())
-  {
-    std::cerr << error->what() << std::endl;
-    return false;
-  }
-#endif //GLIBMM_EXCEPTIONS_ENABLED
-
-  refXml->get_widget_derived("dialog_initial_password", dialog);
+  Utils::get_glade_widget_derived_with_warning(dialog);
   if(!dialog)
     return false;
 
@@ -2189,7 +2113,7 @@ bool Frame_Glom::connection_request_password_and_choose_new_database_name()
 
   if(!m_pDialogConnection)
   {
-    Utils::get_glade_widget_derived_with_warning("dialog_connection", m_pDialogConnection);
+    Utils::get_glade_widget_derived_with_warning(m_pDialogConnection);
     add_view(m_pDialogConnection); //Also a composite view.
   }
 
@@ -2485,7 +2409,7 @@ bool Frame_Glom::connection_request_password_and_attempt(bool& database_not_foun
       m_pDialogConnection = 0;
     }
 
-    Utils::get_glade_widget_derived_with_warning("dialog_connection", m_pDialogConnection);
+    Utils::get_glade_widget_derived_with_warning(m_pDialogConnection);
     add_view(m_pDialogConnection); //Also a composite view.
 
     m_pDialogConnection->load_from_document(); //Get good defaults.
diff --git a/glom/glade_utils.cc b/glom/glade_utils.cc
index 5e9622a..ad3a34c 100644
--- a/glom/glade_utils.cc
+++ b/glom/glade_utils.cc
@@ -33,32 +33,17 @@ Dialog_ProgressCreating* get_and_show_pulse_dialog(const Glib::ustring& message,
   if(!parent_window)
     std::cerr << "debug: Glom: get_and_show_pulse_dialog(): parent_window is NULL" << std::endl;
 
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "window_progress");
-#else  
-  std::auto_ptr<Glib::Error> error;
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "window_progress", error);
-#endif
+  Dialog_ProgressCreating* dialog_progress = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog_progress);
+  dialog_progress->set_message(_("Processing"), message);
+  dialog_progress->set_modal();
 
-  if(refXml)
-  {
-    Dialog_ProgressCreating* dialog_progress = 0;
-    refXml->get_widget_derived("window_progress", dialog_progress);
-    if(dialog_progress)
-    {
-      dialog_progress->set_message(_("Processing"), message);
-      dialog_progress->set_modal();
+  if(parent_window)
+    dialog_progress->set_transient_for(*parent_window);
 
-      if(parent_window)
-        dialog_progress->set_transient_for(*parent_window);
+  dialog_progress->show();
 
-      dialog_progress->show();
-
-      return dialog_progress;
-    }
-  }
-
-  return 0;
+  return dialog_progress;
 }
 
 } //namespace Utils
diff --git a/glom/glade_utils.h b/glom/glade_utils.h
index 660e004..8287ca3 100644
--- a/glom/glade_utils.h
+++ b/glom/glade_utils.h
@@ -31,6 +31,9 @@ namespace Glom
 namespace Utils
 {
 
+const char* const FILENAME_GLADE("glom.glade");
+const char* const FILENAME_GLADE_DEVELOPER("glom_developer.glade");
+
 inline std::string get_glade_file_path(const std::string& filename)
 {
 #ifdef G_OS_WIN32
@@ -44,22 +47,22 @@ inline std::string get_glade_file_path(const std::string& filename)
 }
 
 template<class T_Widget>
-void get_glade_widget_derived_with_warning(const Glib::ustring& id, T_Widget*& widget)
+void helper_get_glade_widget_derived_with_warning(const std::string& filename, const Glib::ustring& id, T_Widget*& widget)
 {
   Glib::RefPtr<Gtk::Builder> refXml;
 
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
+  #ifdef GLIBMM_EXCEPTIONS_ENABLED
   try
   {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), id);
+    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path(filename), id);
   }
-  catch(const Glib::Error& ex)
+  catch(const Gtk::BuilderError& ex)
   {
     std::cerr << ex.what() << std::endl;
   }
 #else
   std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), id, error);
+  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path(filename), id, error);
   if (error.get())
   {
     std::cerr << error->what() << std::endl;
@@ -73,43 +76,34 @@ void get_glade_widget_derived_with_warning(const Glib::ustring& id, T_Widget*& w
 }
 
 template<class T_Widget>
-void get_glade_developer_widget_derived_with_warning(const Glib::ustring& id, T_Widget*& widget)
+void helper_get_glade_widget_derived_with_warning(const Glib::ustring& id, T_Widget*& widget)
 {
-  Glib::RefPtr<Gtk::Builder> refXml;
-
-  #ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), id);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-#else
-  std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), id, error);
-  if (error.get())
-  {
-    std::cerr << error->what() << std::endl;
-  }
-#endif
+  helper_get_glade_widget_derived_with_warning("glom.glade", id, widget);
+}
 
-  if(refXml)
-  {
-    refXml->get_widget_derived(id, widget);
-  }
+/** This should be used with classes that have a static glade_id member.
+ */
+template<class T_Widget>
+void get_glade_widget_derived_with_warning(T_Widget*& widget)
+{
+  widget = 0;
+  
+  if(T_Widget::glade_developer)
+    helper_get_glade_widget_derived_with_warning(FILENAME_GLADE_DEVELOPER, T_Widget::glade_id, widget);
+  else
+    helper_get_glade_widget_derived_with_warning(FILENAME_GLADE, T_Widget::glade_id, widget);
 }
 
+
 template<class T_Widget>
-void get_glade_widget_with_warning(const Glib::ustring& id, T_Widget*& widget)
+void get_glade_widget_with_warning(const std::string& filename, const Glib::ustring& id, T_Widget*& widget)
 {
   Glib::RefPtr<Gtk::Builder> refXml;
 
 #ifdef GLIBMM_EXCEPTIONS_ENABLED
   try
   {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), id);
+    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path(filename), id);
   }
   catch(const Glib::Error& ex)
   {
@@ -117,7 +111,7 @@ void get_glade_widget_with_warning(const Glib::ustring& id, T_Widget*& widget)
   }
 #else
   std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), id, error);
+  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path(filename), id, error);
   if (error.get())
   {
     std::cerr << error->what() << std::endl;
@@ -130,6 +124,12 @@ void get_glade_widget_with_warning(const Glib::ustring& id, T_Widget*& widget)
   }
 }
 
+template<class T_Widget>
+void get_glade_widget_with_warning(const Glib::ustring& id, T_Widget*& widget)
+{
+  get_glade_widget_with_warning(FILENAME_GLADE, id, widget);
+}
+
 Dialog_ProgressCreating* get_and_show_pulse_dialog(const Glib::ustring& message, Gtk::Window* parent_window);
 
 } //namespace Utils
diff --git a/glom/glom.glade b/glom/glom.glade
index 454dd6c..39fa5f6 100644
--- a/glom/glom.glade
+++ b/glom/glom.glade
@@ -1659,7 +1659,8 @@ The data in the field was not recognized. Please try to correct the data or reve
       <action-widget response="-11">button11</action-widget>
     </action-widgets>
   </object>
-    <object class="GtkDialog" id="dialog_choose_date">
+
+  <object class="GtkDialog" id="dialog_choose_date">
     <property name="title" translatable="yes">Choose Date</property>
     <property name="type_hint">dialog</property>
     <child internal-child="vbox">
diff --git a/glom/import_csv/dialog_import_csv.cc b/glom/import_csv/dialog_import_csv.cc
index a943e4e..3e24f84 100644
--- a/glom/import_csv/dialog_import_csv.cc
+++ b/glom/import_csv/dialog_import_csv.cc
@@ -60,6 +60,9 @@ Glib::ustring encoding_display(const Glib::ustring& name, const Glib::ustring& c
 namespace Glom
 {
 
+const char* Dialog_Import_CSV::glade_id("dialog_import_csv");
+const bool Dialog_Import_CSV::glade_developer(false);
+
 Dialog_Import_CSV::Dialog_Import_CSV(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_auto_detect_encoding(),
@@ -143,7 +146,7 @@ Dialog_Import_CSV::Dialog_Import_CSV(BaseObjectType* cobject, const Glib::RefPtr
   const Glib::ustring date_text = Glom::Conversions::format_date(the_c_time, std::locale::classic() /* ignored */, true /* iso_format */);
   const Glib::ustring advice = Glib::ustring::compose(_("Note that the source file should contain numbers and dates in international ISO format. For instance, 22nd November 2008 should be %1."), date_text);
   m_advice_label->set_text(advice);
-  std::cout << "DEBUG: advice=" << advice << std::endl;
+  //std::cout << "DEBUG: advice=" << advice << std::endl;
 
   clear();
 }
diff --git a/glom/import_csv/dialog_import_csv.h b/glom/import_csv/dialog_import_csv.h
index bc02de9..48b3c2b 100644
--- a/glom/import_csv/dialog_import_csv.h
+++ b/glom/import_csv/dialog_import_csv.h
@@ -44,6 +44,9 @@ class Dialog_Import_CSV
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Import_CSV(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
 
   void import(const Glib::ustring& uri, const Glib::ustring& into_table);
diff --git a/glom/import_csv/dialog_import_csv_progress.cc b/glom/import_csv/dialog_import_csv_progress.cc
index 42994b1..85e1b70 100644
--- a/glom/import_csv/dialog_import_csv_progress.cc
+++ b/glom/import_csv/dialog_import_csv_progress.cc
@@ -27,6 +27,9 @@
 namespace Glom
 {
 
+const char* Dialog_Import_CSV_Progress::glade_id("dialog_import_csv_progress");
+const bool Dialog_Import_CSV_Progress::glade_developer(false);
+
 Dialog_Import_CSV_Progress::Dialog_Import_CSV_Progress(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject), 
   m_data_source(0), 
diff --git a/glom/import_csv/dialog_import_csv_progress.h b/glom/import_csv/dialog_import_csv_progress.h
index fa2f1ca..ab99ffe 100644
--- a/glom/import_csv/dialog_import_csv_progress.h
+++ b/glom/import_csv/dialog_import_csv_progress.h
@@ -33,6 +33,9 @@ class Dialog_Import_CSV_Progress
     public Base_DB_Table_Data
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_Import_CSV_Progress(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
 
   virtual bool init_db_details(const Glib::ustring& table_name);
diff --git a/glom/main.cc b/glom/main.cc
index 06df329..45e983e 100644
--- a/glom/main.cc
+++ b/glom/main.cc
@@ -26,6 +26,7 @@
 
 //#include <gnome.h>
 #include <glom/libglom/init.h>
+#include <glom/glade_utils.h>
 #include <gtkmm/main.h>
 #include <gtkmm/messagedialog.h>
 #include <giomm.h>
@@ -620,18 +621,8 @@ main(int argc, char* argv[])
     if(group.m_arg_debug_date_check)
       return 0; //This command-line option is documented as stopping afterwards.
 
-    // Main app
-#ifdef GLIBMM_EXCEPTIONS_ENABLED    
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Glom::Utils::get_glade_file_path("glom.glade"), "window_main");
-#else
-    std::auto_ptr<Glib::Error> error;
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Glom::Utils::get_glade_file_path("glom.glade"), "window_main", error);
-#endif     
-
-
-
     Glom::Application* pApplication = 0;
-    refXml->get_widget_derived("window_main", pApplication);
+    Glom::Utils::get_glade_widget_derived_with_warning(pApplication);
     g_assert(pApplication);
 
     pApplication->set_command_line_args(argc, argv);
diff --git a/glom/mode_data/box_data_calendar_related.cc b/glom/mode_data/box_data_calendar_related.cc
index c246b46..8105f98 100644
--- a/glom/mode_data/box_data_calendar_related.cc
+++ b/glom/mode_data/box_data_calendar_related.cc
@@ -24,6 +24,7 @@
 #include <glom/application.h>
 #include <libglom/data_structure/glomconversions.h>
 #include <glom/frame_glom.h> //For show_ok_dialog()
+#include <glom/glade_utils.h>
 #include <glibmm/i18n.h>
 
 namespace Glom
@@ -356,17 +357,9 @@ void Box_Data_Calendar_Related::on_dialog_layout_hide()
 #ifndef GLOM_ENABLE_CLIENT_ONLY
 Dialog_Layout* Box_Data_Calendar_Related::create_layout_dialog() const
 {
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(
-      GLOM_PKGDATADIR G_DIR_SEPARATOR_S "glade" G_DIR_SEPARATOR_S "glom_developer.glade",
-      "window_data_layout");
-  if(refXml)
-  {
-    Dialog_Layout_Calendar_Related* dialog = 0;
-    refXml->get_widget_derived("window_data_layout", dialog);
-    return dialog;
-  }
-
-  return 0;
+  Dialog_Layout_Calendar_Related* dialog = 0;
+  Glom::Utils::get_glade_widget_derived_with_warning(dialog);
+  return dialog;
 }
 
 void Box_Data_Calendar_Related::prepare_layout_dialog(Dialog_Layout* dialog)
diff --git a/glom/mode_data/box_data_details.cc b/glom/mode_data/box_data_details.cc
index cdbb933..fba041f 100644
--- a/glom/mode_data/box_data_details.cc
+++ b/glom/mode_data/box_data_details.cc
@@ -1051,15 +1051,9 @@ void Box_Data_Details::print_layout()
 #ifndef GLOM_ENABLE_CLIENT_ONLY
 Dialog_Layout* Box_Data_Details::create_layout_dialog() const
 {
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_data_layout"); //TODO: Use a generic layout dialog?
-  if(refXml)
-  {
-    Dialog_Layout_Details* dialog = 0;
-    refXml->get_widget_derived("window_data_layout", dialog);
-    return dialog;
-  }
-
-  return 0;
+  Dialog_Layout_Details* dialog = 0;
+  Glom::Utils::get_glade_widget_derived_with_warning(dialog);
+  return dialog;
 }
 
 void Box_Data_Details::prepare_layout_dialog(Dialog_Layout* dialog)
diff --git a/glom/mode_data/box_data_list.cc b/glom/mode_data/box_data_list.cc
index d2e9b00..5c70e3c 100644
--- a/glom/mode_data/box_data_list.cc
+++ b/glom/mode_data/box_data_list.cc
@@ -613,15 +613,9 @@ void Box_Data_List::on_dialog_layout_hide()
 
 Dialog_Layout* Box_Data_List::create_layout_dialog() const
 {
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_data_layout"); //TODO: Use a generic layout dialog?
-  if(refXml)
-  {
-    Dialog_Layout_List* dialog = 0;
-    refXml->get_widget_derived("window_data_layout", dialog);
-    return dialog;
-  }
-
-  return 0;
+  Dialog_Layout_List* dialog = 0;
+  Glom::Utils::get_glade_widget_derived_with_warning(dialog);
+  return dialog;
 }
 
 void Box_Data_List::prepare_layout_dialog(Dialog_Layout* dialog)
diff --git a/glom/mode_data/box_data_list_related.cc b/glom/mode_data/box_data_list_related.cc
index 58c9fc8..c4b8646 100644
--- a/glom/mode_data/box_data_list_related.cc
+++ b/glom/mode_data/box_data_list_related.cc
@@ -331,15 +331,9 @@ void Box_Data_List_Related::on_dialog_layout_hide()
 #ifndef GLOM_ENABLE_CLIENT_ONLY
 Dialog_Layout* Box_Data_List_Related::create_layout_dialog() const
 {
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_data_layout");
-  if(refXml)
-  {
-    Dialog_Layout_List_Related* dialog = 0;
-    refXml->get_widget_derived("window_data_layout", dialog);
-    return dialog;
-  }
-  
-  return 0;
+  Dialog_Layout_List_Related* dialog = 0;
+  Glom::Utils::get_glade_widget_derived_with_warning(dialog);
+  return dialog;
 }
 
 void Box_Data_List_Related::prepare_layout_dialog(Dialog_Layout* dialog)
diff --git a/glom/mode_data/box_data_list_related.h b/glom/mode_data/box_data_list_related.h
index e008512..8fbb21a 100644
--- a/glom/mode_data/box_data_list_related.h
+++ b/glom/mode_data/box_data_list_related.h
@@ -28,8 +28,6 @@
 namespace Glom
 {
 
-class Dialog_Layout_List_Related;
-
 class Box_Data_List_Related : public Box_Data_Portal
 {
 public: 
diff --git a/glom/mode_data/buttonglom.cc b/glom/mode_data/buttonglom.cc
index 5ef5bd6..beff876 100644
--- a/glom/mode_data/buttonglom.cc
+++ b/glom/mode_data/buttonglom.cc
@@ -63,33 +63,21 @@ Application* ButtonGlom::get_application()
 #ifndef GLOM_ENABLE_CLIENT_ONLY
 void ButtonGlom::on_menu_properties_activate()
 {
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_button_script");
-
-    Dialog_ButtonScript* dialog = 0;
-    refXml->get_widget_derived("window_button_script", dialog);
-
-    if(dialog)
-    {
-      sharedptr<LayoutItem_Button> layout_item = 
-        sharedptr<LayoutItem_Button>::cast_dynamic(get_layout_item());
-      dialog->set_script(layout_item, m_table_name);
-      int response = Glom::Utils::dialog_run_with_help(dialog, "window_button_script");
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        dialog->get_script(layout_item);
-        signal_layout_changed().emit();
-      }
+  Dialog_ButtonScript* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  sharedptr<LayoutItem_Button> layout_item = 
+    sharedptr<LayoutItem_Button>::cast_dynamic(get_layout_item());
+  dialog->set_script(layout_item, m_table_name);
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "window_button_script");
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    dialog->get_script(layout_item);
+    signal_layout_changed().emit();
   }
+
+  delete dialog;
 }
 
 bool ButtonGlom::on_button_press_event(GdkEventButton *event)
diff --git a/glom/mode_data/datawidget/datawidget.cc b/glom/mode_data/datawidget/datawidget.cc
index 4768f4a..fdd68a7 100644
--- a/glom/mode_data/datawidget/datawidget.cc
+++ b/glom/mode_data/datawidget/datawidget.cc
@@ -496,31 +496,9 @@ sharedptr<LayoutItem_Field> DataWidget::offer_field_list(const Glib::ustring& ta
 sharedptr<LayoutItem_Field> DataWidget::offer_field_list(const Glib::ustring& table_name, const sharedptr<const LayoutItem_Field>& start_field, Document* document, Application* app)
 {
   sharedptr<LayoutItem_Field> result;
-
-  Glib::RefPtr<Gtk::Builder> refXml;
-
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_field");
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-    return result;
-  }
-#else
-  std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_field", error);
-  if (error.get())
-  {
-    std::cerr << error->what() << std::endl;
-    return result;
-  }  
-#endif
   
   Dialog_ChooseField* dialog = 0;
-  refXml->get_widget_derived("dialog_choose_field", dialog);
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   if(dialog)
   {
@@ -546,39 +524,27 @@ sharedptr<LayoutItem_Field> DataWidget::offer_field_layout(const sharedptr<const
 {
   sharedptr<LayoutItem_Field> result;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_layout_field_properties");
+  Dialog_FieldLayout* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
-    Dialog_FieldLayout* dialog = 0;
-    refXml->get_widget_derived("dialog_layout_field_properties", dialog);
+  add_view(dialog); //Give it access to the document.
+  dialog->set_field(start_field, m_table_name);
 
-    if(dialog)
-    {
-      add_view(dialog); //Give it access to the document.
-      dialog->set_field(start_field, m_table_name);
-
-      Gtk::Window* parent = get_application();
-      if(parent)
-        dialog->set_transient_for(*parent);
+  Gtk::Window* parent = get_application();
+  if(parent)
+    dialog->set_transient_for(*parent);
 
-      const int response = dialog->run();
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen field:
-        result = dialog->get_field_chosen();
-      }
-
-      remove_view(dialog);
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  const int response = dialog->run();
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen field:
+    result = dialog->get_field_chosen();
   }
 
+  remove_view(dialog);
+  delete dialog;
+
   return result;
 }
 
@@ -676,29 +642,8 @@ const Gtk::Widget* DataWidget::get_data_child_widget() const
 
 void DataWidget::on_button_choose_date()
 {
-  Glib::RefPtr<Gtk::Builder> refXml;
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_choose_date");
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-    return;
-  }
-#else
-  std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_choose_date", error);
-  if (error.get())
-  {
-    std::cerr << error->what() << std::endl;
-    return;
-  } 
-#endif
-
   DataWidgetChildren::Dialog_ChooseDate* dialog = 0;
-  refXml->get_widget_derived("dialog_choose_date", dialog);
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   if(dialog)
   {
@@ -735,29 +680,8 @@ bool DataWidget::offer_related_record_id_find(Gnome::Gda::Value& chosen_id)
   //Initialize output variable:
   chosen_id = Gnome::Gda::Value();
 
-  Glib::RefPtr<Gtk::Builder> refXml;
-#ifdef GLIBMM_EXCEPTIONS_ENABLED
-  try
-  {
-    refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_find_id");
-  }
-  catch(const Glib::Error& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-    return result;
-  }
-#else
-  std::auto_ptr<Glib::Error> error;
-  refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_find_id", error);
-  if (error.get())
-  {
-    std::cerr << error->what() << std::endl;
-    return result;
-  }
-#endif
-
   DataWidgetChildren::Dialog_ChooseID* dialog = 0;
-  refXml->get_widget_derived("dialog_find_id", dialog);
+  Glom::Utils::get_glade_widget_derived_with_warning(dialog);
 
   if(dialog)
   {
diff --git a/glom/mode_data/datawidget/datawidget.h b/glom/mode_data/datawidget/datawidget.h
index 44f85bf..2588213 100644
--- a/glom/mode_data/datawidget/datawidget.h
+++ b/glom/mode_data/datawidget/datawidget.h
@@ -42,7 +42,6 @@ class DataWidget
    public View_Composite_Glom
 {
 public:
-  //explicit DataWidget(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   explicit DataWidget(const sharedptr<LayoutItem_Field>& field, const Glib::ustring& table_name, const Document* document);
   virtual ~DataWidget();
 
diff --git a/glom/mode_data/datawidget/dialog_choose_date.cc b/glom/mode_data/datawidget/dialog_choose_date.cc
index 6be07c0..546222f 100644
--- a/glom/mode_data/datawidget/dialog_choose_date.cc
+++ b/glom/mode_data/datawidget/dialog_choose_date.cc
@@ -29,6 +29,9 @@ namespace Glom
 namespace DataWidgetChildren
 {
 
+const char* Dialog_ChooseDate::glade_id("dialog_choose_date");
+const bool Dialog_ChooseDate::glade_developer(false);
+
 Dialog_ChooseDate::Dialog_ChooseDate()
 : m_calendar(0)
 {
diff --git a/glom/mode_data/datawidget/dialog_choose_date.h b/glom/mode_data/datawidget/dialog_choose_date.h
index 0655b73..d230bb1 100644
--- a/glom/mode_data/datawidget/dialog_choose_date.h
+++ b/glom/mode_data/datawidget/dialog_choose_date.h
@@ -37,6 +37,9 @@ class Dialog_ChooseDate
   : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_ChooseDate();
   Dialog_ChooseDate(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ChooseDate();
diff --git a/glom/mode_data/datawidget/dialog_choose_id.cc b/glom/mode_data/datawidget/dialog_choose_id.cc
index c55864c..2955880 100644
--- a/glom/mode_data/datawidget/dialog_choose_id.cc
+++ b/glom/mode_data/datawidget/dialog_choose_id.cc
@@ -36,6 +36,9 @@ namespace Glom
 namespace DataWidgetChildren
 {
 
+const char* Dialog_ChooseID::glade_id("dialog_find_id");
+const bool Dialog_ChooseID::glade_developer(false);
+
 Dialog_ChooseID::Dialog_ChooseID()
 : m_label_table_name(0),
   m_pBox_QuickFind(0),
diff --git a/glom/mode_data/datawidget/dialog_choose_id.h b/glom/mode_data/datawidget/dialog_choose_id.h
index 38f62db..c4e3d0c 100644
--- a/glom/mode_data/datawidget/dialog_choose_id.h
+++ b/glom/mode_data/datawidget/dialog_choose_id.h
@@ -38,6 +38,9 @@ class Dialog_ChooseID
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_ChooseID();
   Dialog_ChooseID(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ChooseID();
diff --git a/glom/mode_data/datawidget/label.cc b/glom/mode_data/datawidget/label.cc
index c3a79ea..ce27ce7 100644
--- a/glom/mode_data/datawidget/label.cc
+++ b/glom/mode_data/datawidget/label.cc
@@ -78,32 +78,21 @@ void Label::on_menu_properties_activate()
   if(!textobject)
     return;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_textobject");
-
-    Dialog_TextObject* dialog = 0;
-    refXml->get_widget_derived("window_textobject", dialog);
+  Dialog_TextObject* dialog = 0;
+  Glom::Utils::get_glade_widget_derived_with_warning(dialog);
 
-    if(dialog)
-    {
-      dialog->set_textobject(textobject, m_table_name);
-      const int response = dialog->run();
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        dialog->get_textobject(textobject);
-      }
-      signal_layout_changed().emit();
-
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  dialog->set_textobject(textobject, m_table_name);
+  const int response = dialog->run();
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen relationship:
+    dialog->get_textobject(textobject);
   }
+
+  signal_layout_changed().emit();
+
+  delete dialog;
 }
 
 bool Label::on_button_press_event(GdkEventButton *event)
diff --git a/glom/mode_data/flowtablewithfields.cc b/glom/mode_data/flowtablewithfields.cc
index a3c270a..f4d34d2 100644
--- a/glom/mode_data/flowtablewithfields.cc
+++ b/glom/mode_data/flowtablewithfields.cc
@@ -40,7 +40,7 @@
 #include <glibmm/i18n.h>
 
 namespace Glom
-{
+{	
   
 FlowTableWithFields::Info::Info()
 : m_first(0),
@@ -1585,32 +1585,21 @@ bool FlowTableWithFields::dnd_add_to_layout_group(const sharedptr<LayoutItem>& i
 
 void FlowTableWithFields::on_menu_properties_activate()
 {
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_flowtable");
-
-    Dialog_FlowTable* dialog = 0;
-    refXml->get_widget_derived("dialog_flowtable", dialog);
-
-    if(dialog)
-    {
-      dialog->set_flowtable(this);
-      const int response = dialog->run();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        sharedptr<LayoutGroup> group = get_layout_group();
-        group->set_columns_count( dialog->get_columns_count() );
-        group->set_title(dialog->get_title());
-        signal_layout_changed().emit();
-      }
-
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  Dialog_FlowTable* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  
+  dialog->set_flowtable(this);
+  const int response = dialog->run();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    sharedptr<LayoutGroup> group = get_layout_group();
+    group->set_columns_count( dialog->get_columns_count() );
+    group->set_title(dialog->get_title());
+    signal_layout_changed().emit();
   }
+
+  delete dialog;
+ 
 }
 
 void FlowTableWithFields::on_menu_delete_activate()
@@ -1659,39 +1648,28 @@ bool FlowTableWithFields::on_button_press_event(GdkEventButton *event)
 
 sharedptr<LayoutItem_Portal> FlowTableWithFields::get_portal_relationship()
 {
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_relationship");
+  Dialog_ChooseRelationship* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
     
-    Dialog_ChooseRelationship* dialog = 0;
-    refXml->get_widget_derived("dialog_choose_relationship", dialog);
-    
-    if(dialog)
+  Document* pDocument = static_cast<Document*>(get_document());
+  dialog->set_document(pDocument, m_table_name);
+  //TODO: dialog->set_transient_for(*get_app_window());
+  const int response = dialog->run();
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
+  {
+    //Get the chosen relationship:
+    sharedptr<Relationship> relationship  = dialog->get_relationship_chosen();
+    if(relationship)
     {
-      Document* pDocument = static_cast<Document*>(get_document());
-      dialog->set_document(pDocument, m_table_name);
-      //TODO: dialog->set_transient_for(*get_app_window());
-      const int response = dialog->run();
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        sharedptr<Relationship> relationship  = dialog->get_relationship_chosen();
-        if(relationship)
-        {
-          sharedptr<LayoutItem_Portal> layout_item = sharedptr<LayoutItem_Portal>::create();
-          layout_item->set_relationship(relationship);
-          return layout_item;
-        }
-      }
-      
+      sharedptr<LayoutItem_Portal> layout_item = sharedptr<LayoutItem_Portal>::create();
+      layout_item->set_relationship(relationship);
       delete dialog;
+      return layout_item;
     }
   }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
+      
+  delete dialog;
   return sharedptr<LayoutItem_Portal>();
 }
 
diff --git a/glom/mode_design/dialog_add_related_table.cc b/glom/mode_design/dialog_add_related_table.cc
index bbf9e9c..2edbcdf 100644
--- a/glom/mode_design/dialog_add_related_table.cc
+++ b/glom/mode_design/dialog_add_related_table.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Dialog_AddRelatedTable::glade_id("dialog_add_related_table");
+const bool Dialog_AddRelatedTable::glade_developer(true);
+
 Dialog_AddRelatedTable::Dialog_AddRelatedTable(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   Base_DB(),
diff --git a/glom/mode_design/dialog_add_related_table.h b/glom/mode_design/dialog_add_related_table.h
index 66ef05b..09d9cbc 100644
--- a/glom/mode_design/dialog_add_related_table.h
+++ b/glom/mode_design/dialog_add_related_table.h
@@ -35,6 +35,9 @@ class Dialog_AddRelatedTable
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_AddRelatedTable(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_AddRelatedTable();
 
diff --git a/glom/mode_design/dialog_database_preferences.cc b/glom/mode_design/dialog_database_preferences.cc
index e54d978..257d220 100644
--- a/glom/mode_design/dialog_database_preferences.cc
+++ b/glom/mode_design/dialog_database_preferences.cc
@@ -29,6 +29,9 @@
 namespace Glom
 {
 
+const char* Dialog_Database_Preferences::glade_id("dialog_database_preferences");
+const bool Dialog_Database_Preferences::glade_developer(true);
+
 Dialog_Database_Preferences::Dialog_Database_Preferences(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   Base_DB(),
diff --git a/glom/mode_design/dialog_database_preferences.h b/glom/mode_design/dialog_database_preferences.h
index 47ae549..d8c77ac 100644
--- a/glom/mode_design/dialog_database_preferences.h
+++ b/glom/mode_design/dialog_database_preferences.h
@@ -40,6 +40,9 @@ class Dialog_Database_Preferences
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Database_Preferences(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Database_Preferences();
 
diff --git a/glom/mode_design/dialog_fields.cc b/glom/mode_design/dialog_fields.cc
index 3e07b42..4c2ed2b 100644
--- a/glom/mode_design/dialog_fields.cc
+++ b/glom/mode_design/dialog_fields.cc
@@ -27,6 +27,9 @@
 namespace Glom
 {
 
+const char* Dialog_Fields::glade_id("window_design");
+const bool Dialog_Fields::glade_developer(true);
+
 Dialog_Fields::Dialog_Fields(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Design(cobject, builder),
   m_box(0)
diff --git a/glom/mode_design/dialog_fields.h b/glom/mode_design/dialog_fields.h
index b3a643f..af3e240 100644
--- a/glom/mode_design/dialog_fields.h
+++ b/glom/mode_design/dialog_fields.h
@@ -30,6 +30,9 @@ namespace Glom
 class Dialog_Fields : public Dialog_Design
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Fields(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Fields();
 
diff --git a/glom/mode_design/dialog_initial_password.cc b/glom/mode_design/dialog_initial_password.cc
index 2b3de72..2db221c 100644
--- a/glom/mode_design/dialog_initial_password.cc
+++ b/glom/mode_design/dialog_initial_password.cc
@@ -26,6 +26,9 @@
 namespace Glom
 {
 
+const char* Dialog_InitialPassword::glade_id("dialog_initial_password");
+const bool Dialog_InitialPassword::glade_developer(true);
+
 Dialog_InitialPassword::Dialog_InitialPassword(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   Base_DB(),
diff --git a/glom/mode_design/dialog_initial_password.h b/glom/mode_design/dialog_initial_password.h
index b3adfa1..43b89f3 100644
--- a/glom/mode_design/dialog_initial_password.h
+++ b/glom/mode_design/dialog_initial_password.h
@@ -36,6 +36,9 @@ class Dialog_InitialPassword
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_InitialPassword(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_InitialPassword();
 
diff --git a/glom/mode_design/dialog_relationships.cc b/glom/mode_design/dialog_relationships.cc
index b620c53..724f89c 100644
--- a/glom/mode_design/dialog_relationships.cc
+++ b/glom/mode_design/dialog_relationships.cc
@@ -27,6 +27,9 @@
 namespace Glom
 {
 
+const char* Dialog_Relationships::glade_id("window_design");
+const bool Dialog_Relationships::glade_developer(true);
+
 Dialog_Relationships::Dialog_Relationships(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Design(cobject, builder),
   m_box(0)
diff --git a/glom/mode_design/dialog_relationships.h b/glom/mode_design/dialog_relationships.h
index 153500f..46453d1 100644
--- a/glom/mode_design/dialog_relationships.h
+++ b/glom/mode_design/dialog_relationships.h
@@ -30,6 +30,9 @@ namespace Glom
 class Dialog_Relationships : public Dialog_Design
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Relationships(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Relationships();
 
diff --git a/glom/mode_design/fields/box_db_table_definition.cc b/glom/mode_design/fields/box_db_table_definition.cc
index 78cec56..ac97fb8 100644
--- a/glom/mode_design/fields/box_db_table_definition.cc
+++ b/glom/mode_design/fields/box_db_table_definition.cc
@@ -43,10 +43,7 @@ void Box_DB_Table_Definition::init()
 {
   //m_strHint = _("Click [Edit] to edit the field definition in more detail.\nUse the Mode menu to see Data or perform a Find.");
 
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_field_definition_edit");
-  if(refXml)
-    refXml->get_widget_derived("window_field_definition_edit", m_pDialog);
-
+  Utils::get_glade_widget_derived_with_warning(m_pDialog);
   m_pDialog->set_icon_name("glom");
 
   add_view(m_pDialog); //Give it access to the document.
diff --git a/glom/mode_design/fields/dialog_fieldcalculation.cc b/glom/mode_design/fields/dialog_fieldcalculation.cc
index 3fb9c10..9a82282 100644
--- a/glom/mode_design/fields/dialog_fieldcalculation.cc
+++ b/glom/mode_design/fields/dialog_fieldcalculation.cc
@@ -32,6 +32,9 @@
 namespace Glom
 {
 
+const char* Dialog_FieldCalculation::glade_id("window_field_calculation");
+const bool Dialog_FieldCalculation::glade_developer(true);
+
 Dialog_FieldCalculation::Dialog_FieldCalculation(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject)
 {
diff --git a/glom/mode_design/fields/dialog_fieldcalculation.h b/glom/mode_design/fields/dialog_fieldcalculation.h
index 88d578e..8f1d010 100644
--- a/glom/mode_design/fields/dialog_fieldcalculation.h
+++ b/glom/mode_design/fields/dialog_fieldcalculation.h
@@ -36,6 +36,9 @@ class Dialog_FieldCalculation
 
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_FieldCalculation(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_FieldCalculation();
 
diff --git a/glom/mode_design/fields/dialog_fielddefinition.cc b/glom/mode_design/fields/dialog_fielddefinition.cc
index 83a306a..19b4a97 100644
--- a/glom/mode_design/fields/dialog_fielddefinition.cc
+++ b/glom/mode_design/fields/dialog_fielddefinition.cc
@@ -29,6 +29,9 @@
 namespace Glom
 {
 
+const char* Dialog_FieldDefinition::glade_id("window_field_definition_edit");
+const bool Dialog_FieldDefinition::glade_developer(true);
+
 Dialog_FieldDefinition::Dialog_FieldDefinition(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Properties(cobject, builder),
   m_pDataWidget_DefaultValueSimple(0),
@@ -84,16 +87,7 @@ Dialog_FieldDefinition::Dialog_FieldDefinition(BaseObjectType* cobject, const Gl
   builder->get_widget("box_formatting_placeholder", m_box_formatting_placeholder);
 
   //Get the formatting stuff:
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXmlFormatting = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "box_formatting");
-    refXmlFormatting->get_widget_derived("box_formatting", m_box_formatting);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-
+  Utils::get_glade_widget_derived_with_warning(m_box_formatting);
   m_box_formatting_placeholder->pack_start(*m_box_formatting);
   add_view(m_box_formatting);
 
@@ -376,29 +370,22 @@ void Dialog_FieldDefinition::on_combo_lookup_relationship_changed()
 void Dialog_FieldDefinition::on_button_edit_calculation()
 {
   //TODO: Share a global instance, to make this quicker?
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(
-      Utils::get_glade_file_path("glom_developer.glade"), "window_field_calculation");
-  if(refXml)
-  {
-    Dialog_FieldCalculation* dialog = 0;
-    refXml->get_widget_derived("window_field_calculation", dialog);
-    if(dialog)
-    {
-      add_view(dialog); //Give it access to the document.
-
-      m_Field->set_calculation( m_pTextView_Calculation->get_buffer()->get_text() );
-      dialog->set_field(m_Field, m_table_name);
-      //TODO: dialog.set_transient_for(*get_app_window());
-      const int response = Glom::Utils::dialog_run_with_help(dialog, "window_field_calculation");
-      if(response == Gtk::RESPONSE_OK)
-      {
-        m_pTextView_Calculation->get_buffer()->set_text( dialog->get_field()->get_calculation() );
-      }
+  Dialog_FieldCalculation* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  
+  add_view(dialog); //Give it access to the document.
 
-      remove_view(dialog);
-      delete dialog;
-    }
+  m_Field->set_calculation( m_pTextView_Calculation->get_buffer()->get_text() );
+  dialog->set_field(m_Field, m_table_name);
+  //TODO: dialog.set_transient_for(*get_app_window());
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "window_field_calculation");
+  if(response == Gtk::RESPONSE_OK)
+  {
+    m_pTextView_Calculation->get_buffer()->set_text( dialog->get_field()->get_calculation() );
   }
+
+  remove_view(dialog);
+  delete dialog;
 }
 
 } //namespace Glom
diff --git a/glom/mode_design/fields/dialog_fielddefinition.h b/glom/mode_design/fields/dialog_fielddefinition.h
index add2378..236f09d 100644
--- a/glom/mode_design/fields/dialog_fielddefinition.h
+++ b/glom/mode_design/fields/dialog_fielddefinition.h
@@ -40,7 +40,10 @@ class Dialog_FieldDefinition
  : public Dialog_Properties,
    public Base_DB //Give this class access to the current document, and to some utility methods.
 {
-public: 
+public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_FieldDefinition(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_FieldDefinition();
 
diff --git a/glom/mode_design/layout/dialog_choose_field.cc b/glom/mode_design/layout/dialog_choose_field.cc
index c4b9b9e..fec7da0 100644
--- a/glom/mode_design/layout/dialog_choose_field.cc
+++ b/glom/mode_design/layout/dialog_choose_field.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Dialog_ChooseField::glade_id("dialog_choose_field");
+const bool Dialog_ChooseField::glade_developer(true);
+
 Dialog_ChooseField::Dialog_ChooseField(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_combo_relationship(0),
diff --git a/glom/mode_design/layout/dialog_choose_field.h b/glom/mode_design/layout/dialog_choose_field.h
index 41ad7f7..094c4a7 100644
--- a/glom/mode_design/layout/dialog_choose_field.h
+++ b/glom/mode_design/layout/dialog_choose_field.h
@@ -35,6 +35,9 @@ namespace Glom
 class Dialog_ChooseField : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_ChooseField(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ChooseField();
 
diff --git a/glom/mode_design/layout/dialog_choose_relationship.cc b/glom/mode_design/layout/dialog_choose_relationship.cc
index 63d84a8..bd10715 100644
--- a/glom/mode_design/layout/dialog_choose_relationship.cc
+++ b/glom/mode_design/layout/dialog_choose_relationship.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Dialog_ChooseRelationship::glade_id("dialog_choose_relationship");
+const bool Dialog_ChooseRelationship::glade_developer(true);
+
 Dialog_ChooseRelationship::Dialog_ChooseRelationship()
 : m_label_table_name(0),
   m_button_select(0),
diff --git a/glom/mode_design/layout/dialog_choose_relationship.h b/glom/mode_design/layout/dialog_choose_relationship.h
index c941e11..833783e 100644
--- a/glom/mode_design/layout/dialog_choose_relationship.h
+++ b/glom/mode_design/layout/dialog_choose_relationship.h
@@ -32,6 +32,9 @@ namespace Glom
 class Dialog_ChooseRelationship : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+	
   Dialog_ChooseRelationship();
   Dialog_ChooseRelationship(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ChooseRelationship();
diff --git a/glom/mode_design/layout/dialog_layout_calendar_related.cc b/glom/mode_design/layout/dialog_layout_calendar_related.cc
index 713ab6a..bc1b12e 100644
--- a/glom/mode_design/layout/dialog_layout_calendar_related.cc
+++ b/glom/mode_design/layout/dialog_layout_calendar_related.cc
@@ -30,6 +30,9 @@
 namespace Glom
 {
 
+const char* Dialog_Layout_Calendar_Related::glade_id("window_data_layout");
+const bool Dialog_Layout_Calendar_Related::glade_developer(true);
+
 Dialog_Layout_Calendar_Related::Dialog_Layout_Calendar_Related(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout_List(cobject, builder),
   m_combo_relationship(0),
diff --git a/glom/mode_design/layout/dialog_layout_calendar_related.h b/glom/mode_design/layout/dialog_layout_calendar_related.h
index 64ff7d3..8c5b766 100644
--- a/glom/mode_design/layout/dialog_layout_calendar_related.h
+++ b/glom/mode_design/layout/dialog_layout_calendar_related.h
@@ -33,6 +33,9 @@ namespace Glom
 class Dialog_Layout_Calendar_Related : public Dialog_Layout_List
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_Layout_Calendar_Related(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Layout_Calendar_Related();
 
diff --git a/glom/mode_design/layout/dialog_layout_details.cc b/glom/mode_design/layout/dialog_layout_details.cc
index eeef0ca..3bf858c 100644
--- a/glom/mode_design/layout/dialog_layout_details.cc
+++ b/glom/mode_design/layout/dialog_layout_details.cc
@@ -32,6 +32,9 @@
 namespace Glom
 {
 
+const char* Dialog_Layout_Details::glade_id("window_data_layout");
+const bool Dialog_Layout_Details::glade_developer(true);
+
 Dialog_Layout_Details::Dialog_Layout_Details(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout(cobject, builder),
   m_treeview_fields(0),
@@ -548,71 +551,22 @@ sharedptr<LayoutItem_Button> Dialog_Layout_Details::offer_button_script_edit(con
 {
   sharedptr<LayoutItem_Button> result;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_button_script");
-
-    Dialog_ButtonScript* dialog = 0;
-    refXml->get_widget_derived("window_button_script", dialog);
-
-    if(dialog)
-    {
-      dialog->set_script(button, m_table_name);
-      dialog->set_transient_for(*this);
-      const int response = Glom::Utils::dialog_run_with_help(dialog, "window_button_script");
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        result = dialog->get_script();
-      }
-
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  Dialog_ButtonScript* dialog = 0;
+  Glom::Utils::get_glade_widget_derived_with_warning(dialog);
+  dialog->set_script(button, m_table_name);
+  dialog->set_transient_for(*this);
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "window_button_script");
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen relationship:
+     result = dialog->get_script();
   }
 
-  return result;
-}
-
-/*
-sharedptr<LayoutItem_Text> Dialog_Layout_Details::offer_textobject_edit(const sharedptr<const LayoutItem_Text>& textobject)
-{
-  sharedptr<LayoutItem_Text> result;
-
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_textobject");
-
-    Dialog_TextObject* dialog = 0;
-    refXml->get_widget_derived("window_textobject", dialog);
-
-    if(dialog)
-    {
-      dialog->set_textobject(textobject, m_table_name);
-      dialog->set_transient_for(*this);
-      const int response = dialog->run();
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        result = dialog->get_textobject();
-      }
-
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
+  delete dialog;
 
   return result;
 }
-*/
 
 sharedptr<Relationship> Dialog_Layout_Details::offer_relationship_list()
 {
@@ -623,34 +577,22 @@ sharedptr<Relationship> Dialog_Layout_Details::offer_relationship_list(const sha
 {
   sharedptr<Relationship> result = glom_sharedptr_clone(item);
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_relationship");
+  Dialog_ChooseRelationship* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
-    Dialog_ChooseRelationship* dialog = 0;
-    refXml->get_widget_derived("dialog_choose_relationship", dialog);
-
-    if(dialog)
-    {
-      dialog->set_document(get_document(), m_table_name);
-      dialog->select_item(item);
-      dialog->set_transient_for(*this);
-      const int response = dialog->run();
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        result = dialog->get_relationship_chosen();
-      }
-
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  dialog->set_document(get_document(), m_table_name);
+  dialog->select_item(item);
+  dialog->set_transient_for(*this);
+  const int response = dialog->run();
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen relationship:
+    result = dialog->get_relationship_chosen();
   }
 
+  delete dialog;
+
   return result;
 }
 
diff --git a/glom/mode_design/layout/dialog_layout_details.h b/glom/mode_design/layout/dialog_layout_details.h
index 7fa7a6b..4b080ea 100644
--- a/glom/mode_design/layout/dialog_layout_details.h
+++ b/glom/mode_design/layout/dialog_layout_details.h
@@ -30,6 +30,9 @@ namespace Glom
 class Dialog_Layout_Details : public Dialog_Layout
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_Layout_Details(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Layout_Details();
 
diff --git a/glom/mode_design/layout/dialog_layout_export.cc b/glom/mode_design/layout/dialog_layout_export.cc
index 433c247..8d34ec9 100644
--- a/glom/mode_design/layout/dialog_layout_export.cc
+++ b/glom/mode_design/layout/dialog_layout_export.cc
@@ -29,6 +29,9 @@
 namespace Glom
 {
 
+const char* Dialog_Layout_Export::glade_id("window_data_layout_export");
+const bool Dialog_Layout_Export::glade_developer(true);
+
 Dialog_Layout_Export::Dialog_Layout_Export(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout(cobject, builder, false /* no table title */),
   m_treeview_fields(0),
diff --git a/glom/mode_design/layout/dialog_layout_export.h b/glom/mode_design/layout/dialog_layout_export.h
index e7fd7ea..9e46ea4 100644
--- a/glom/mode_design/layout/dialog_layout_export.h
+++ b/glom/mode_design/layout/dialog_layout_export.h
@@ -29,6 +29,9 @@ namespace Glom
 class Dialog_Layout_Export : public Dialog_Layout
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Layout_Export(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Layout_Export();
 
diff --git a/glom/mode_design/layout/dialog_layout_list.cc b/glom/mode_design/layout/dialog_layout_list.cc
index 6e8b91d..c0e1e3a 100644
--- a/glom/mode_design/layout/dialog_layout_list.cc
+++ b/glom/mode_design/layout/dialog_layout_list.cc
@@ -30,6 +30,9 @@
 namespace Glom
 {
 
+const char* Dialog_Layout_List::glade_id("window_data_layout");
+const bool Dialog_Layout_List::glade_developer(true);
+
 Dialog_Layout_List::Dialog_Layout_List(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout_Details(cobject, builder)
 {
diff --git a/glom/mode_design/layout/dialog_layout_list.h b/glom/mode_design/layout/dialog_layout_list.h
index fe13dd3..682c608 100644
--- a/glom/mode_design/layout/dialog_layout_list.h
+++ b/glom/mode_design/layout/dialog_layout_list.h
@@ -29,6 +29,9 @@ namespace Glom
 class Dialog_Layout_List : public Dialog_Layout_Details
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_Layout_List(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Layout_List();
 };
diff --git a/glom/mode_design/layout/dialog_layout_list_related.cc b/glom/mode_design/layout/dialog_layout_list_related.cc
index 66a684e..400b7e8 100644
--- a/glom/mode_design/layout/dialog_layout_list_related.cc
+++ b/glom/mode_design/layout/dialog_layout_list_related.cc
@@ -31,6 +31,9 @@
 namespace Glom
 {
 
+const char* Dialog_Layout_List_Related::glade_id("window_data_layout");
+const bool Dialog_Layout_List_Related::glade_developer(true);
+
 Dialog_Layout_List_Related::Dialog_Layout_List_Related(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout_List(cobject, builder),
   m_combo_relationship(0),
diff --git a/glom/mode_design/layout/dialog_layout_list_related.h b/glom/mode_design/layout/dialog_layout_list_related.h
index 21c883f..5f49791 100644
--- a/glom/mode_design/layout/dialog_layout_list_related.h
+++ b/glom/mode_design/layout/dialog_layout_list_related.h
@@ -31,6 +31,9 @@ namespace Glom
 class Dialog_Layout_List_Related : public Dialog_Layout_List
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_Layout_List_Related(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Layout_List_Related();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/box_formatting.cc b/glom/mode_design/layout/layout_item_dialogs/box_formatting.cc
index c38b0ae..9bb0651 100644
--- a/glom/mode_design/layout/layout_item_dialogs/box_formatting.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/box_formatting.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Box_Formatting::glade_id("box_formatting");
+const bool Box_Formatting::glade_developer(true);
+
 Box_Formatting::Box_Formatting(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::VBox(cobject),
   m_vbox_numeric_format(0),
diff --git a/glom/mode_design/layout/layout_item_dialogs/box_formatting.h b/glom/mode_design/layout/layout_item_dialogs/box_formatting.h
index 3a6a5a0..6e31676 100644
--- a/glom/mode_design/layout/layout_item_dialogs/box_formatting.h
+++ b/glom/mode_design/layout/layout_item_dialogs/box_formatting.h
@@ -37,6 +37,9 @@ class Box_Formatting
    public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Box_Formatting(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Box_Formatting();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc
index cf23948..0ac3132 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.cc
@@ -31,6 +31,9 @@
 namespace Glom
 {
 
+const char* Dialog_ButtonScript::glade_id("window_button_script");
+const bool Dialog_ButtonScript::glade_developer(true);
+
 Dialog_ButtonScript::Dialog_ButtonScript(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject)
 {
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.h b/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.h
index c960099..45c34dc 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_buttonscript.h
@@ -37,6 +37,9 @@ class Dialog_ButtonScript
 
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_ButtonScript(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ButtonScript();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.cc
index a2bb9df..5d4dd35 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.cc
@@ -26,6 +26,9 @@
 namespace Glom
 {
 
+const char* Dialog_FieldLayout::glade_id("dialog_layout_field_properties");
+const bool Dialog_FieldLayout::glade_developer(true);
+
 Dialog_FieldLayout::Dialog_FieldLayout(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_label_field_name(0),
@@ -51,16 +54,7 @@ Dialog_FieldLayout::Dialog_FieldLayout(BaseObjectType* cobject, const Glib::RefP
   builder->get_widget("box_formatting_placeholder", m_box_formatting_placeholder);
 
   //Get the formatting stuff:
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXmlFormatting = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "box_formatting");
-    refXmlFormatting->get_widget_derived("box_formatting", m_box_formatting);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-
+  Utils::get_glade_widget_derived_with_warning(m_box_formatting);
   m_box_formatting_placeholder->pack_start(*m_box_formatting);
   add_view(m_box_formatting);
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.h b/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.h
index 1d93f71..b3703ad 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_field_layout.h
@@ -37,6 +37,9 @@ class Dialog_FieldLayout
    public View_Composite_Glom //Give it access to the document.
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_FieldLayout(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_FieldLayout();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.cc
index 95bfdf0..aaaaab9 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Dialog_FieldSummary::glade_id("dialog_field_summary");
+const bool Dialog_FieldSummary::glade_developer(true);
+
 Dialog_FieldSummary::Dialog_FieldSummary(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_label_field(0),
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.h b/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.h
index cba1d26..b6aa2fe 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_field_summary.h
@@ -37,6 +37,9 @@ class Dialog_FieldSummary
    public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_FieldSummary(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_FieldSummary();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc
index d769521..2941e60 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_formatting.cc
@@ -33,15 +33,7 @@ Dialog_Formatting::Dialog_Formatting()
   set_border_width(6);
 
   //Get the formatting stuff:
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXmlFormatting = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "box_formatting");
-    refXmlFormatting->get_widget_derived("box_formatting", m_box_formatting);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
+  Utils::get_glade_widget_derived_with_warning(m_box_formatting);
 
   get_vbox()->pack_start(*m_box_formatting, Gtk::PACK_EXPAND_WIDGET);
   add_view(m_box_formatting);
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc
index 770d0be..570b860 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.cc
@@ -28,6 +28,9 @@
 namespace Glom
 {
 
+const char* Dialog_GroupBy::glade_id("dialog_group_by");
+const bool Dialog_GroupBy::glade_developer(true);
+
 Dialog_GroupBy::Dialog_GroupBy(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_label_group_by(0),
@@ -130,15 +133,8 @@ void Dialog_GroupBy::on_button_field_sort_by()
 {
   if(!m_dialog_choose_sort_fields)
   {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_groupby_sort_fields");
-    if(refXml)
-    {
-      refXml->get_widget_derived("dialog_groupby_sort_fields", m_dialog_choose_sort_fields);
-      if(m_dialog_choose_sort_fields)
-      {
-        add_view(m_dialog_choose_sort_fields); //Give it access to the document.
-      }
-    }
+    Utils::get_glade_widget_derived_with_warning(m_dialog_choose_sort_fields);
+    add_view(m_dialog_choose_sort_fields); //Give it access to the document.
   }
 
   if(m_dialog_choose_sort_fields)
@@ -160,15 +156,8 @@ void Dialog_GroupBy::on_button_secondary_fields()
 {
   if(!m_dialog_choose_secondary_fields)
   {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_groupby_secondary_fields");
-    if(refXml)
-    {
-      refXml->get_widget_derived("dialog_groupby_secondary_fields", m_dialog_choose_secondary_fields);
-      if(m_dialog_choose_secondary_fields)
-      {
-        add_view(m_dialog_choose_secondary_fields); //Give it access to the document.
-      }
-    }
+    Utils::get_glade_widget_derived_with_warning(m_dialog_choose_secondary_fields);
+    add_view(m_dialog_choose_secondary_fields); //Give it access to the document.
   }
 
   if(m_dialog_choose_secondary_fields)
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.h b/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.h
index b72ebdf..86d6d8d 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_group_by.h
@@ -39,6 +39,9 @@ class Dialog_GroupBy
    public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_GroupBy(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_GroupBy();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.cc
index 68fc288..32d1c32 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.cc
@@ -27,6 +27,9 @@
 namespace Glom
 {
 
+const char* Dialog_GroupBy_SecondaryFields::glade_id("dialog_groupby_secondary_fields");
+const bool Dialog_GroupBy_SecondaryFields::glade_developer(true);
+
 Dialog_GroupBy_SecondaryFields::Dialog_GroupBy_SecondaryFields(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout(cobject, builder, false /* means no table title */),
   m_treeview_fields(0),
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.h b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.h
index 61c3f4b..495c2ee 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_secondaryfields.h
@@ -32,6 +32,9 @@ class Dialog_GroupBy_SecondaryFields
  : public Dialog_Layout //It has some useful stuff
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_GroupBy_SecondaryFields(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_GroupBy_SecondaryFields();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc
index 01174d7..8347b9d 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.cc
@@ -27,6 +27,9 @@
 namespace Glom
 {
 
+const char* Dialog_GroupBy_SortFields::glade_id("dialog_groupby_sort_fields");
+const bool Dialog_GroupBy_SortFields::glade_developer(true);
+
 Dialog_GroupBy_SortFields::Dialog_GroupBy_SortFields(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout(cobject, builder, false /* means no table title */),
   m_treeview_fields(0),
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.h b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.h
index 85d96aa..3c246e7 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_groupby_sortfields.h
@@ -32,6 +32,9 @@ class Dialog_GroupBy_SortFields
  : public Dialog_Layout //It has some useful stuff
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_GroupBy_SortFields(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_GroupBy_SortFields();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.cc
index e2489cb..dce609b 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.cc
@@ -29,6 +29,9 @@
 namespace Glom
 {
 
+const char* Dialog_ImageObject::glade_id("window_imageobject");
+const bool Dialog_ImageObject::glade_developer(true);
+
 Dialog_ImageObject::Dialog_ImageObject(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_box_title(0),
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.h b/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.h
index 1c0b2c4..18e0f07 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_imageobject.h
@@ -36,6 +36,9 @@ class Dialog_ImageObject
 
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_ImageObject(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ImageObject();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc
index 7ba3aa8..2dcc3c0 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.cc
@@ -27,6 +27,9 @@
 namespace Glom
 {
 
+const char* Dialog_Notebook::glade_id("dialog_notebook");
+const bool Dialog_Notebook::glade_developer(true);
+
 Dialog_Notebook::Dialog_Notebook(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout(cobject, builder, false /* means no table title */),
   m_treeview(0),
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.h b/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.h
index 2b738b1..9a0bb7e 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_notebook.h
@@ -33,6 +33,9 @@ class Dialog_Notebook
  : public Dialog_Layout //It has some useful stuff
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Notebook(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Notebook();
 
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.cc b/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.cc
index 4b6b326..a0120d6 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.cc
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.cc
@@ -29,6 +29,9 @@
 namespace Glom
 {
 
+const char* Dialog_TextObject::glade_id("window_textobject");
+const bool Dialog_TextObject::glade_developer(true);
+
 Dialog_TextObject::Dialog_TextObject(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_box_title(0),
diff --git a/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.h b/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.h
index 6abcd8f..d0037b0 100644
--- a/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.h
+++ b/glom/mode_design/layout/layout_item_dialogs/dialog_textobject.h
@@ -35,6 +35,9 @@ class Dialog_TextObject
 
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+  
   Dialog_TextObject(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_TextObject();
 
diff --git a/glom/mode_design/print_layouts/box_print_layouts.cc b/glom/mode_design/print_layouts/box_print_layouts.cc
index ebdf018..45a1877 100644
--- a/glom/mode_design/print_layouts/box_print_layouts.cc
+++ b/glom/mode_design/print_layouts/box_print_layouts.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Box_Print_Layouts::glade_id("box_print_layouts");
+const bool Box_Print_Layouts::glade_developer(true);
+
 Box_Print_Layouts::Box_Print_Layouts(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Box_DB_Table(cobject, builder),
   m_colName(0),
diff --git a/glom/mode_design/print_layouts/box_print_layouts.h b/glom/mode_design/print_layouts/box_print_layouts.h
index 38370d5..d7c8188 100644
--- a/glom/mode_design/print_layouts/box_print_layouts.h
+++ b/glom/mode_design/print_layouts/box_print_layouts.h
@@ -31,6 +31,9 @@ namespace Glom
 class Box_Print_Layouts : public Box_DB_Table
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Box_Print_Layouts(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Box_Print_Layouts();
 
diff --git a/glom/mode_design/print_layouts/dialog_text_formatting.cc b/glom/mode_design/print_layouts/dialog_text_formatting.cc
index 2aa2462..57b5a4e 100644
--- a/glom/mode_design/print_layouts/dialog_text_formatting.cc
+++ b/glom/mode_design/print_layouts/dialog_text_formatting.cc
@@ -26,6 +26,9 @@
 namespace Glom
 {
 
+const char* Dialog_TextFormatting::glade_id("window_text_format");
+const bool Dialog_TextFormatting::glade_developer(true);
+
 Dialog_TextFormatting::Dialog_TextFormatting(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Window(cobject),
   m_box_formatting_placeholder(0),
@@ -39,17 +42,7 @@ Dialog_TextFormatting::Dialog_TextFormatting(BaseObjectType* cobject, const Glib
   //Get the place to put the Formatting stuff:
   builder->get_widget("box_formatting_placeholder", m_box_formatting_placeholder);
  
-  //Get the formatting stuff:
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXmlFormatting = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "box_formatting");
-    refXmlFormatting->get_widget_derived("box_formatting", m_box_formatting);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-
+  Utils::get_glade_widget_derived_with_warning(m_box_formatting);
   m_box_formatting_placeholder->pack_start(*m_box_formatting);
   add_view(m_box_formatting);
   m_box_formatting->set_is_for_print_layout();
diff --git a/glom/mode_design/print_layouts/dialog_text_formatting.h b/glom/mode_design/print_layouts/dialog_text_formatting.h
index 85bef10..2a79e5e 100644
--- a/glom/mode_design/print_layouts/dialog_text_formatting.h
+++ b/glom/mode_design/print_layouts/dialog_text_formatting.h
@@ -36,6 +36,9 @@ class Dialog_TextFormatting
   public View_Composite_Glom
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_TextFormatting(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_TextFormatting();
 
diff --git a/glom/mode_design/print_layouts/window_print_layout_edit.cc b/glom/mode_design/print_layouts/window_print_layout_edit.cc
index 250b3c6..7027aa6 100644
--- a/glom/mode_design/print_layouts/window_print_layout_edit.cc
+++ b/glom/mode_design/print_layouts/window_print_layout_edit.cc
@@ -32,6 +32,9 @@
 namespace Glom
 {
 
+const char* Window_PrintLayout_Edit::glade_id("window_print_layout_edit");
+const bool Window_PrintLayout_Edit::glade_developer(true);
+
 Window_PrintLayout_Edit::Window_PrintLayout_Edit(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Window(cobject),
   m_entry_name(0),
diff --git a/glom/mode_design/print_layouts/window_print_layout_edit.h b/glom/mode_design/print_layouts/window_print_layout_edit.h
index 9b399a2..3210d1d 100644
--- a/glom/mode_design/print_layouts/window_print_layout_edit.h
+++ b/glom/mode_design/print_layouts/window_print_layout_edit.h
@@ -43,6 +43,9 @@ class Window_PrintLayout_Edit
   public View_Composite_Glom
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Window_PrintLayout_Edit(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Window_PrintLayout_Edit();
 
diff --git a/glom/mode_design/relationships_overview/dialog_relationships_overview.cc b/glom/mode_design/relationships_overview/dialog_relationships_overview.cc
index 0ee5aa0..4e70d76 100644
--- a/glom/mode_design/relationships_overview/dialog_relationships_overview.cc
+++ b/glom/mode_design/relationships_overview/dialog_relationships_overview.cc
@@ -36,6 +36,8 @@ namespace Glom
 int Dialog_RelationshipsOverview::m_last_size_x = 0;
 int Dialog_RelationshipsOverview::m_last_size_y = 0;
 
+const char* Dialog_RelationshipsOverview::glade_id("dialog_relationships_overview");
+const bool Dialog_RelationshipsOverview::glade_developer(true);
 
 Dialog_RelationshipsOverview::Dialog_RelationshipsOverview(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
   : Gtk::Dialog(cobject),
diff --git a/glom/mode_design/relationships_overview/dialog_relationships_overview.h b/glom/mode_design/relationships_overview/dialog_relationships_overview.h
index b8d5a47..7713e76 100644
--- a/glom/mode_design/relationships_overview/dialog_relationships_overview.h
+++ b/glom/mode_design/relationships_overview/dialog_relationships_overview.h
@@ -40,12 +40,15 @@
 
 namespace Glom
 {
-
+ 
 class Dialog_RelationshipsOverview
  : public Gtk::Dialog,
    public View_Composite_Glom
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_RelationshipsOverview(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_RelationshipsOverview();
   
diff --git a/glom/mode_design/report_layout/dialog_layout_report.cc b/glom/mode_design/report_layout/dialog_layout_report.cc
index 8c13415..32f2370 100644
--- a/glom/mode_design/report_layout/dialog_layout_report.cc
+++ b/glom/mode_design/report_layout/dialog_layout_report.cc
@@ -42,6 +42,9 @@
 namespace Glom
 {
 
+const char* Dialog_Layout_Report::glade_id("window_report_layout");
+const bool Dialog_Layout_Report::glade_developer(true);
+
 Dialog_Layout_Report::Dialog_Layout_Report(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Dialog_Layout(cobject, builder, false /* No table title */),
   m_notebook_parts(0),
@@ -689,33 +692,21 @@ sharedptr<Relationship> Dialog_Layout_Report::offer_relationship_list()
 {
   sharedptr<Relationship> result;
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_relationship");
-
-    Dialog_ChooseRelationship* dialog = 0;
-    refXml->get_widget_derived("dialog_choose_relationship", dialog);
+  Dialog_ChooseRelationship* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
-    if(dialog)
-    {
-      dialog->set_document(get_document(), m_table_name);
-      dialog->set_transient_for(*this);
-      int response = dialog->run();
-      dialog->hide();
-      if(response == Gtk::RESPONSE_OK)
-      {
-        //Get the chosen relationship:
-        result = dialog->get_relationship_chosen();
-      }
-
-      delete dialog;
-    }
-  }
-  catch(const Gtk::BuilderError& ex)
+  dialog->set_document(get_document(), m_table_name);
+  dialog->set_transient_for(*this);
+  const int response = dialog->run();
+  dialog->hide();
+  if(response == Gtk::RESPONSE_OK)
   {
-    std::cerr << ex.what() << std::endl;
+    //Get the chosen relationship:
+    result = dialog->get_relationship_chosen();
   }
 
+  delete dialog;
+
   return result;
 }
 
@@ -826,43 +817,30 @@ void Dialog_Layout_Report::on_button_edit()
       sharedptr<LayoutItem_FieldSummary> fieldsummary = sharedptr<LayoutItem_FieldSummary>::cast_dynamic(item);
       if(fieldsummary)
       {
-        try
-        {
-          Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_field_summary");
+        Dialog_FieldSummary* dialog = 0;
+        Utils::get_glade_widget_derived_with_warning(dialog);
+        add_view(dialog);
+        dialog->set_item(fieldsummary, m_table_name);
+        dialog->set_transient_for(*this);
 
-          Dialog_FieldSummary* dialog = 0;
-          refXml->get_widget_derived("dialog_field_summary", dialog);
+        const int response = dialog->run();
+        dialog->hide();
 
-          if(dialog)
+        if(response == Gtk::RESPONSE_OK)
+        {
+          //Get the chosen relationship:
+          sharedptr<LayoutItem_FieldSummary> chosenitem = dialog->get_item();
+          if(chosenitem)
           {
-            add_view(dialog);
-            dialog->set_item(fieldsummary, m_table_name);
-            dialog->set_transient_for(*this);
-
-            const int response = dialog->run();
-            dialog->hide();
+            *fieldsummary = *chosenitem; //TODO_Performance.
 
-            if(response == Gtk::RESPONSE_OK)
-            {
-              //Get the chosen relationship:
-              sharedptr<LayoutItem_FieldSummary> chosenitem = dialog->get_item();
-              if(chosenitem)
-              {
-                *fieldsummary = *chosenitem; //TODO_Performance.
-
-                model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm?
-                m_modified = true;
-              }
-            }
-
-            remove_view(dialog);
-            delete dialog;
+            model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm?
+            m_modified = true;
           }
         }
-        catch(const Gtk::BuilderError& ex)
-        {
-          std::cerr << ex.what() << std::endl;
-        }
+
+        remove_view(dialog);
+        delete dialog;
       }
       else
       {
@@ -908,42 +886,29 @@ void Dialog_Layout_Report::on_button_edit()
               sharedptr<LayoutItem_GroupBy> group_by = sharedptr<LayoutItem_GroupBy>::cast_dynamic(item);
               if(group_by)
               {
-                try
-                {
-                  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_group_by");
+                Dialog_GroupBy* dialog = 0;
+                Utils::get_glade_widget_derived_with_warning(dialog);
+                add_view(dialog);
+                dialog->set_item(group_by, m_table_name);
+                dialog->set_transient_for(*this);
   
-                  Dialog_GroupBy* dialog = 0;
-                  refXml->get_widget_derived("dialog_group_by", dialog);
+                const int response = dialog->run();
+                dialog->hide();
   
-                  if(dialog)
+                if(response == Gtk::RESPONSE_OK)
+                {
+                  //Get the chosen relationship:
+                  sharedptr<LayoutItem_GroupBy> chosenitem = dialog->get_item();
+                  if(chosenitem)
                   {
-                    add_view(dialog);
-                    dialog->set_item(group_by, m_table_name);
-                    dialog->set_transient_for(*this);
-  
-                    const int response = dialog->run();
-                    dialog->hide();
-  
-                    if(response == Gtk::RESPONSE_OK)
-                    {
-                      //Get the chosen relationship:
-                      sharedptr<LayoutItem_GroupBy> chosenitem = dialog->get_item();
-                      if(chosenitem)
-                      {
-                        *group_by = *chosenitem;
-                        model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm?
-                        m_modified = true;
-                      }
-                    }
-  
-                    remove_view(dialog);
-                    delete dialog;
+                    *group_by = *chosenitem;
+                    model->row_changed(Gtk::TreeModel::Path(iter), iter); //TODO: Add row_changed(iter) to gtkmm?
+                    m_modified = true;
                   }
                 }
-                catch(const Gtk::BuilderError& ex)
-                {
-                  std::cerr << ex.what() << std::endl;
-                }
+  
+                remove_view(dialog);
+                delete dialog;
               }
             }
           }
diff --git a/glom/mode_design/report_layout/dialog_layout_report.h b/glom/mode_design/report_layout/dialog_layout_report.h
index 71328ba..ae6fad6 100644
--- a/glom/mode_design/report_layout/dialog_layout_report.h
+++ b/glom/mode_design/report_layout/dialog_layout_report.h
@@ -33,6 +33,9 @@ namespace Glom
 class Dialog_Layout_Report : public Dialog_Layout
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Layout_Report(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Layout_Report();
 
diff --git a/glom/mode_design/script_library/dialog_new_script.cc b/glom/mode_design/script_library/dialog_new_script.cc
index 98bac99..e6e8040 100644
--- a/glom/mode_design/script_library/dialog_new_script.cc
+++ b/glom/mode_design/script_library/dialog_new_script.cc
@@ -23,6 +23,9 @@
 namespace Glom
 {
 
+const char* Dialog_NewScript::glade_id("dialog_new_library_script");
+const bool Dialog_NewScript::glade_developer(true);
+
 Dialog_NewScript::Dialog_NewScript(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_entry_name(0)
diff --git a/glom/mode_design/script_library/dialog_new_script.h b/glom/mode_design/script_library/dialog_new_script.h
index 0b5b85d..31ce935 100644
--- a/glom/mode_design/script_library/dialog_new_script.h
+++ b/glom/mode_design/script_library/dialog_new_script.h
@@ -31,6 +31,9 @@ namespace Glom
 class Dialog_NewScript : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_NewScript(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_NewScript();
 
diff --git a/glom/mode_design/script_library/dialog_script_library.cc b/glom/mode_design/script_library/dialog_script_library.cc
index 6aa5af9..80c7224 100644
--- a/glom/mode_design/script_library/dialog_script_library.cc
+++ b/glom/mode_design/script_library/dialog_script_library.cc
@@ -35,6 +35,9 @@
 namespace Glom
 {
 
+const char* Dialog_ScriptLibrary::glade_id("dialog_script_library");
+const bool Dialog_ScriptLibrary::glade_developer(true);
+
 Dialog_ScriptLibrary::Dialog_ScriptLibrary(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject)
 {
@@ -92,17 +95,7 @@ void Dialog_ScriptLibrary::on_button_add()
     return;
 
   Dialog_NewScript* dialog = 0;
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_new_library_script");
-
-    refXml->get_widget_derived("dialog_new_library_script", dialog);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-
+  Utils::get_glade_widget_derived_with_warning(dialog);
   dialog->set_icon_name("glom");
   dialog->set_transient_for(*this);
   const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_new_script");
diff --git a/glom/mode_design/script_library/dialog_script_library.h b/glom/mode_design/script_library/dialog_script_library.h
index 3b96dc0..30e2f01 100644
--- a/glom/mode_design/script_library/dialog_script_library.h
+++ b/glom/mode_design/script_library/dialog_script_library.h
@@ -37,6 +37,9 @@ class Dialog_ScriptLibrary
 
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_ScriptLibrary(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ScriptLibrary();
 
diff --git a/glom/mode_design/translation/dialog_change_language.cc b/glom/mode_design/translation/dialog_change_language.cc
index a77bba4..207772f 100644
--- a/glom/mode_design/translation/dialog_change_language.cc
+++ b/glom/mode_design/translation/dialog_change_language.cc
@@ -24,6 +24,9 @@
 namespace Glom
 {
 
+const char* Dialog_ChangeLanguage::glade_id("dialog_change_language");
+const bool Dialog_ChangeLanguage::glade_developer(true);
+
 Dialog_ChangeLanguage::Dialog_ChangeLanguage(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_combo_locale(0)
diff --git a/glom/mode_design/translation/dialog_change_language.h b/glom/mode_design/translation/dialog_change_language.h
index c38f53e..4475c69 100644
--- a/glom/mode_design/translation/dialog_change_language.h
+++ b/glom/mode_design/translation/dialog_change_language.h
@@ -34,6 +34,9 @@ class Dialog_ChangeLanguage
   : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_ChangeLanguage(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ChangeLanguage();
 
diff --git a/glom/mode_design/translation/dialog_copy_translation.cc b/glom/mode_design/translation/dialog_copy_translation.cc
index 8150b27..8e514f4 100644
--- a/glom/mode_design/translation/dialog_copy_translation.cc
+++ b/glom/mode_design/translation/dialog_copy_translation.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Dialog_CopyTranslation::glade_id("dialog_translation_copy");
+const bool Dialog_CopyTranslation::glade_developer(true);
+
 Dialog_CopyTranslation::Dialog_CopyTranslation(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_combo_locale(0)
diff --git a/glom/mode_design/translation/dialog_copy_translation.h b/glom/mode_design/translation/dialog_copy_translation.h
index c0ec471..1255401 100644
--- a/glom/mode_design/translation/dialog_copy_translation.h
+++ b/glom/mode_design/translation/dialog_copy_translation.h
@@ -35,6 +35,9 @@ class Dialog_CopyTranslation
   : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_CopyTranslation(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_CopyTranslation();
 
diff --git a/glom/mode_design/translation/dialog_identify_original.cc b/glom/mode_design/translation/dialog_identify_original.cc
index dc8ef81..b89523d 100644
--- a/glom/mode_design/translation/dialog_identify_original.cc
+++ b/glom/mode_design/translation/dialog_identify_original.cc
@@ -26,6 +26,9 @@
 namespace Glom
 {
 
+const char* Dialog_IdentifyOriginal::glade_id("dialog_translation_identify_original");
+const bool Dialog_IdentifyOriginal::glade_developer(true);
+
 Dialog_IdentifyOriginal::Dialog_IdentifyOriginal(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_label_original(0),
diff --git a/glom/mode_design/translation/dialog_identify_original.h b/glom/mode_design/translation/dialog_identify_original.h
index d51905f..8c0d46b 100644
--- a/glom/mode_design/translation/dialog_identify_original.h
+++ b/glom/mode_design/translation/dialog_identify_original.h
@@ -36,6 +36,9 @@ class Dialog_IdentifyOriginal
     public View_Glom
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_IdentifyOriginal(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_IdentifyOriginal();
 
diff --git a/glom/mode_design/translation/window_translations.cc b/glom/mode_design/translation/window_translations.cc
index 97a9f86..c7e69b5 100644
--- a/glom/mode_design/translation/window_translations.cc
+++ b/glom/mode_design/translation/window_translations.cc
@@ -42,6 +42,9 @@
 namespace Glom
 {
 
+const char* Window_Translations::glade_id("window_translations");
+const bool Window_Translations::glade_developer(true);
+
 Window_Translations::Window_Translations(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Window(cobject),
   m_treeview(0),
@@ -131,32 +134,25 @@ void Window_Translations::enable_buttons()
 
 void Window_Translations::on_button_identify()
 {
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_translation_identify_original");
-  if(refXml)
+  Dialog_IdentifyOriginal* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  add_view(dialog);
+  dialog->load_from_document(); //Doesn't seem to happen otherwise.
+  dialog->set_icon_name("glom");
+  dialog->set_transient_for(*this);
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_translation_identify_original");
+  dialog->hide();
+
+  if(response == Gtk::RESPONSE_OK)
   {
-    Dialog_IdentifyOriginal* dialog = 0;
-    refXml->get_widget_derived("dialog_translation_identify_original", dialog);
-    if(dialog)
-    {
-      add_view(dialog);
-      dialog->load_from_document(); //Doesn't seem to happen otherwise.
-      dialog->set_icon_name("glom");
-      dialog->set_transient_for(*this);
-      const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_translation_identify_original");
-      dialog->hide();
-
-      if(response == Gtk::RESPONSE_OK)
-      {
-        get_document()->set_translation_original_locale(dialog->get_locale());
+    get_document()->set_translation_original_locale(dialog->get_locale());
 
-        //Save and update:
-        on_combo_target_locale_changed();
-      }
-
-      remove_view(dialog);
-      delete dialog;
-    }
+    //Save and update:
+    on_combo_target_locale_changed();
   }
+
+  remove_view(dialog);
+  delete dialog;
 }
 
 
@@ -362,48 +358,41 @@ void Window_Translations::on_button_ok()
 
 void Window_Translations::on_button_copy_translation()
 {
-   Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_translation_copy");
-  if(refXml)
+  Dialog_CopyTranslation* dialog = 0;
+  Utils::get_glade_widget_derived_with_warning(dialog);
+  dialog->set_icon_name("glom");
+  dialog->set_transient_for(*this);
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_translation_copy");
+  dialog->hide();
+
+  if(response == Gtk::RESPONSE_OK)
   {
-    Dialog_CopyTranslation* dialog = 0;
-    refXml->get_widget_derived("dialog_translation_copy", dialog);
-    if(dialog)
+    const Glib::ustring copy_source_locale = dialog->get_locale();
+    if(!copy_source_locale.empty())
     {
-      dialog->set_icon_name("glom");
-      dialog->set_transient_for(*this);
-      const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_translation_copy");
-      dialog->hide();
+      //Save and update:
+      on_combo_target_locale_changed();
 
-      if(response == Gtk::RESPONSE_OK)
+      for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter)
       {
-        const Glib::ustring copy_source_locale = dialog->get_locale();
-        if(!copy_source_locale.empty())
-        {
-          //Save and update:
-          on_combo_target_locale_changed();
-
-          for(Gtk::TreeModel::iterator iter = m_model->children().begin(); iter != m_model->children().end(); ++iter)
-          {
-            Gtk::TreeModel::Row row = *iter;
-
-            sharedptr<TranslatableItem> item = row[m_columns.m_col_item];
-            if(item)
-            {
-              //Copy the translation from the chosen locale to the current locale:
-              const Glib::ustring translation = item->get_title(copy_source_locale);
-              row[m_columns.m_col_translation] = translation;
-            }
-          }
+        Gtk::TreeModel::Row row = *iter;
 
-          //Save and update:
-          m_treeview_modified = true;
-          save_to_document();
+        sharedptr<TranslatableItem> item = row[m_columns.m_col_item];
+        if(item)
+        {
+          //Copy the translation from the chosen locale to the current locale:
+          const Glib::ustring translation = item->get_title(copy_source_locale);
+          row[m_columns.m_col_translation] = translation;
         }
       }
 
-      delete dialog;
+      //Save and update:
+      m_treeview_modified = true;
+      save_to_document();
     }
   }
+
+  delete dialog;
 }
 
 void Window_Translations::on_combo_target_locale_changed()
diff --git a/glom/mode_design/translation/window_translations.h b/glom/mode_design/translation/window_translations.h
index 03aabf2..29b031c 100644
--- a/glom/mode_design/translation/window_translations.h
+++ b/glom/mode_design/translation/window_translations.h
@@ -37,6 +37,9 @@ class Window_Translations
   public View_Composite_Glom //So it can use the document.
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Window_Translations(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Window_Translations();
 
diff --git a/glom/mode_design/users/dialog_choose_user.cc b/glom/mode_design/users/dialog_choose_user.cc
index cb3f641..b8138dd 100644
--- a/glom/mode_design/users/dialog_choose_user.cc
+++ b/glom/mode_design/users/dialog_choose_user.cc
@@ -23,6 +23,9 @@
 namespace Glom
 {
 
+const char* Dialog_ChooseUser::glade_id("dialog_choose_user");
+const bool Dialog_ChooseUser::glade_developer(true);
+
 Dialog_ChooseUser::Dialog_ChooseUser(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_combo_name(0)
diff --git a/glom/mode_design/users/dialog_choose_user.h b/glom/mode_design/users/dialog_choose_user.h
index 6180f3f..02c4fb9 100644
--- a/glom/mode_design/users/dialog_choose_user.h
+++ b/glom/mode_design/users/dialog_choose_user.h
@@ -18,8 +18,8 @@
  * Boston, MA 02111-1307, USA.
  */
 
-#ifndef GLOM_MODE_DESIGN_USERS_DIALOG_NEWGROUP_H
-#define GLOM_MODE_DESIGN_USERS_DIALOG_NEWGROUP_H
+#ifndef GLOM_MODE_DESIGN_USERS_DIALOG_CHOOSE_USER_H
+#define GLOM_MODE_DESIGN_USERS_DIALOG_CHOOSE_USER_H
 
 #include <gtkmm/builder.h>
 #include <gtkmm/dialog.h>
@@ -32,6 +32,9 @@ namespace Glom
 class Dialog_ChooseUser : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_ChooseUser(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_ChooseUser();
 
@@ -46,5 +49,5 @@ private:
 
 } //namespace Glom
 
-#endif //GLOM_MODE_DESIGN_USERS_DIALOG_NEWGROUP_H
+#endif //GLOM_MODE_DESIGN_USERS_DIALOG_CHOOSER_USER_H
 
diff --git a/glom/mode_design/users/dialog_groups_list.cc b/glom/mode_design/users/dialog_groups_list.cc
index 921c213..503309f 100644
--- a/glom/mode_design/users/dialog_groups_list.cc
+++ b/glom/mode_design/users/dialog_groups_list.cc
@@ -32,6 +32,9 @@
 namespace Glom
 {
 
+const char* Dialog_GroupsList::glade_id("window_groups");
+const bool Dialog_GroupsList::glade_developer(true);
+
 Dialog_GroupsList::Dialog_GroupsList(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_treeview_groups(0),
@@ -236,20 +239,11 @@ void Dialog_GroupsList::on_button_group_delete()
 void Dialog_GroupsList::on_button_group_new()
 {
   Dialog_NewGroup* dialog = 0;
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_new_group");
-
-    refXml->get_widget_derived("dialog_new_group", dialog);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   dialog->set_icon_name("glom");
   dialog->set_transient_for(*this);
-  int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_new_group");
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_new_group");
 
   const Glib::ustring group_name = dialog->m_entry_name->get_text();
 
@@ -298,16 +292,7 @@ void Dialog_GroupsList::on_button_group_users()
       const Glib::ustring group_name = row[m_model_columns_groups.m_col_name];
 
       Dialog_UsersList* dialog = 0;
-      try
-      {
-        Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_users");
-
-        refXml->get_widget_derived("window_users", dialog);
-      }
-      catch(const Gtk::BuilderError& ex)
-      {
-        std::cerr << ex.what() << std::endl;
-      }
+      Utils::get_glade_widget_derived_with_warning(dialog);
 
       dialog->set_icon_name("glom");
       dialog->set_transient_for(*this);
diff --git a/glom/mode_design/users/dialog_groups_list.h b/glom/mode_design/users/dialog_groups_list.h
index 17e6ce2..75c2b15 100644
--- a/glom/mode_design/users/dialog_groups_list.h
+++ b/glom/mode_design/users/dialog_groups_list.h
@@ -33,6 +33,9 @@ class Dialog_GroupsList
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_GroupsList(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_GroupsList();
 
diff --git a/glom/mode_design/users/dialog_new_group.cc b/glom/mode_design/users/dialog_new_group.cc
index 13410b1..497ff93 100644
--- a/glom/mode_design/users/dialog_new_group.cc
+++ b/glom/mode_design/users/dialog_new_group.cc
@@ -23,6 +23,9 @@
 namespace Glom
 {
 
+const char* Dialog_NewGroup::glade_id("dialog_new_group");
+const bool Dialog_NewGroup::glade_developer(true);
+
 Dialog_NewGroup::Dialog_NewGroup(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_entry_name(0)
diff --git a/glom/mode_design/users/dialog_new_group.h b/glom/mode_design/users/dialog_new_group.h
index 7c278b1..dc04da9 100644
--- a/glom/mode_design/users/dialog_new_group.h
+++ b/glom/mode_design/users/dialog_new_group.h
@@ -31,6 +31,9 @@ namespace Glom
 class Dialog_NewGroup : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_NewGroup(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_NewGroup();
 
diff --git a/glom/mode_design/users/dialog_user.cc b/glom/mode_design/users/dialog_user.cc
index 1e680ec..e7978d8 100644
--- a/glom/mode_design/users/dialog_user.cc
+++ b/glom/mode_design/users/dialog_user.cc
@@ -26,6 +26,9 @@
 namespace Glom
 {
 
+const char* Dialog_User::glade_id("dialog_user");
+const bool Dialog_User::glade_developer(true);
+
 Dialog_User::Dialog_User(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject)
 {
diff --git a/glom/mode_design/users/dialog_user.h b/glom/mode_design/users/dialog_user.h
index 5e10c60..fc98e6d 100644
--- a/glom/mode_design/users/dialog_user.h
+++ b/glom/mode_design/users/dialog_user.h
@@ -31,6 +31,9 @@ namespace Glom
 class Dialog_User : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_User(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_User();
 
diff --git a/glom/mode_design/users/dialog_users_list.cc b/glom/mode_design/users/dialog_users_list.cc
index 2d0af3b..ba368a3 100644
--- a/glom/mode_design/users/dialog_users_list.cc
+++ b/glom/mode_design/users/dialog_users_list.cc
@@ -30,6 +30,9 @@
 namespace Glom
 {
 
+const char* Dialog_UsersList::glade_id("window_users");
+const bool Dialog_UsersList::glade_developer(true);
+
 Dialog_UsersList::Dialog_UsersList(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_treeview_users(0),
@@ -179,23 +182,14 @@ void Dialog_UsersList::on_button_user_delete()
 void Dialog_UsersList::on_button_user_add()
 {
   Dialog_ChooseUser* dialog = 0;
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_choose_user");
-
-    refXml->get_widget_derived("dialog_choose_user", dialog);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   dialog->set_transient_for(*this);
 
   //Fill it with the list of users:
   dialog->set_user_list( Privs::get_database_users() );
 
-  int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_choose_user");
+  const int response = Glom::Utils::dialog_run_with_help(dialog, "dialog_choose_user");
 
   const Glib::ustring user = dialog->get_user();
 
@@ -230,16 +224,7 @@ void Dialog_UsersList::on_button_user_add()
 void Dialog_UsersList::on_button_user_new()
 {
   Dialog_User* dialog = 0;
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_user");
-
-    refXml->get_widget_derived("dialog_user", dialog);
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   dialog->set_transient_for(*this);
   dialog->m_combo_group->set_sensitive(false); //It is being added to the current group, so don't offer a different group.
@@ -285,16 +270,7 @@ void Dialog_UsersList::on_button_user_edit()
       Gtk::TreeModel::Row row = *iter;
 
       Dialog_User* dialog = 0;
-      try
-      {
-        Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "dialog_user");
-
-        refXml->get_widget_derived("dialog_user", dialog);
-      }
-      catch(const Gtk::BuilderError& ex)
-      {
-        std::cerr << ex.what() << std::endl;
-      }
+      Utils::get_glade_widget_derived_with_warning(dialog);
 
       dialog->set_transient_for(*this);
 
diff --git a/glom/mode_design/users/dialog_users_list.h b/glom/mode_design/users/dialog_users_list.h
index 0719ba9..2002159 100644
--- a/glom/mode_design/users/dialog_users_list.h
+++ b/glom/mode_design/users/dialog_users_list.h
@@ -34,6 +34,9 @@ class Dialog_UsersList
     public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_UsersList(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_UsersList();
 
diff --git a/glom/navigation/box_tables.cc b/glom/navigation/box_tables.cc
index 5455d30..2ed20f6 100644
--- a/glom/navigation/box_tables.cc
+++ b/glom/navigation/box_tables.cc
@@ -26,6 +26,9 @@
 namespace Glom
 {
 
+const char* Box_Tables::glade_id("box_navigation_tables");
+const bool Box_Tables::glade_developer(false);
+
 Box_Tables::Box_Tables(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Box_WithButtons(cobject, builder),
   m_pCheckButtonShowHidden(0),
diff --git a/glom/navigation/box_tables.h b/glom/navigation/box_tables.h
index ee79809..5af1eaa 100644
--- a/glom/navigation/box_tables.h
+++ b/glom/navigation/box_tables.h
@@ -38,6 +38,9 @@ class Box_Tables
   public Base_DB
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Box_Tables(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Box_Tables();
 
diff --git a/glom/print_layout/canvas_print_layout.cc b/glom/print_layout/canvas_print_layout.cc
index f5353cd..35c95f3 100644
--- a/glom/print_layout/canvas_print_layout.cc
+++ b/glom/print_layout/canvas_print_layout.cc
@@ -316,16 +316,7 @@ sharedptr<LayoutItem_Portal> Canvas_PrintLayout::offer_related_records(const sha
   sharedptr<LayoutItem_Portal> result = portal;
 
   Dialog_Layout_List_Related* dialog = 0;
-
-  Glib::RefPtr<Gtk::Builder> refXml = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_data_layout");
-  if(refXml)
-    refXml->get_widget_derived("window_data_layout", dialog);
-  
-  if(!dialog)
-  {
-    std::cerr << "Canvas_PrintLayout::offer_related_records(): dialog was NULL." << std::endl;
-    return result;
-  }
+  Utils::get_glade_widget_derived_with_warning(dialog);
 
   add_view(dialog); //Give it access to the document.
 
@@ -411,22 +402,10 @@ void Canvas_PrintLayout::on_context_menu_formatting()
      m_dialog_format = 0;
   }
 
-  try
-  {
-    Glib::RefPtr<Gtk::Builder> refXmlFormatting = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom_developer.glade"), "window_text_format");
-    refXmlFormatting->get_widget_derived("window_text_format", m_dialog_format);
-    add_view(m_dialog_format);
+  Utils::get_glade_widget_derived_with_warning(m_dialog_format);
+  add_view(m_dialog_format);
 
-    m_dialog_format->signal_hide().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_dialog_format_hide) );
-  }
-  catch(const Gtk::BuilderError& ex)
-  {
-    std::cerr << ex.what() << std::endl;
-  }
-
-
-  if(!m_dialog_format)
-    return;
+  m_dialog_format->signal_hide().connect( sigc::mem_fun(*this, &Canvas_PrintLayout::on_dialog_format_hide) );
 
   //We need an if here, because they have no common base class.
   //TODO: Maybe they should.
diff --git a/glom/utility_widgets/dialog_flowtable.cc b/glom/utility_widgets/dialog_flowtable.cc
index 03fa6b0..f7bfbd5 100644
--- a/glom/utility_widgets/dialog_flowtable.cc
+++ b/glom/utility_widgets/dialog_flowtable.cc
@@ -25,6 +25,9 @@
 namespace Glom
 {
 
+const char* Dialog_FlowTable::glade_id("dialog_flowtable");
+const bool Dialog_FlowTable::glade_developer(true);
+		
 Dialog_FlowTable::Dialog_FlowTable(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject),
   m_entry_title(0),
diff --git a/glom/utility_widgets/dialog_flowtable.h b/glom/utility_widgets/dialog_flowtable.h
index c993d53..3f917a9 100644
--- a/glom/utility_widgets/dialog_flowtable.h
+++ b/glom/utility_widgets/dialog_flowtable.h
@@ -35,6 +35,9 @@ class Dialog_FlowTable
 
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+	
   Dialog_FlowTable(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_FlowTable();
 
diff --git a/glom/utility_widgets/dialog_image_progress.cc b/glom/utility_widgets/dialog_image_progress.cc
index 221b811..ad8e9ac 100644
--- a/glom/utility_widgets/dialog_image_progress.cc
+++ b/glom/utility_widgets/dialog_image_progress.cc
@@ -34,6 +34,9 @@ const unsigned int CHUNK_SIZE = 2048;
 namespace Glom
 {
 
+const char* Dialog_Image_Progress::glade_id("dialog_image_progress");
+const bool Dialog_Image_Progress::glade_developer(false);
+
 Dialog_Image_Progress::Dialog_Image_Progress(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder)
 : Gtk::Dialog(cobject)
 {
diff --git a/glom/utility_widgets/dialog_image_progress.h b/glom/utility_widgets/dialog_image_progress.h
index bd8c71e..dd70037 100644
--- a/glom/utility_widgets/dialog_image_progress.h
+++ b/glom/utility_widgets/dialog_image_progress.h
@@ -19,7 +19,7 @@
  */
 
 #ifndef GLOM_DIALOG_UTILITY_WIDGETSIMPORT_CSV_PROGRESS_H
-#define GLOM_DIALOG_IMPORT_CSV_PROGRESS_H
+#define GLOM_DIALOG_UTILITY_WIDGETSIMPORT_CSV_PROGRESS_H
 
 #include <gtkmm/dialog.h>
 #include <gtkmm/builder.h>
@@ -36,6 +36,9 @@ namespace Glom
 class Dialog_Image_Progress : public Gtk::Dialog
 {
 public:
+  static const char* glade_id;
+  static const bool glade_developer;
+
   Dialog_Image_Progress(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder);
   virtual ~Dialog_Image_Progress();
 
@@ -63,5 +66,5 @@ private:
 
 } //namespace Glom
 
-#endif //GLOM_DIALOG_IMPORT_CSV_PROGRESS_H
+#endif //GLOM_DIALOG_UTILITY_WIDGETSIMPORT_CSV_PROGRESS_H
 
diff --git a/glom/utility_widgets/imageglom.cc b/glom/utility_widgets/imageglom.cc
index b5e797d..b41e8bd 100644
--- a/glom/utility_widgets/imageglom.cc
+++ b/glom/utility_widgets/imageglom.cc
@@ -358,13 +358,7 @@ void ImageGlom::on_menupopup_activate_select_file()
     if(!uri.empty())
     {
       Dialog_Image_Progress* dialog;
-#ifdef GLIBMM_EXCEPTIONS_ENABLED      
-      Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_image_progress");
-#else
-      std::auto_ptr<Glib::Error> error;      
-      Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file(Utils::get_glade_file_path("glom.glade"), "dialog_image_progress", error);
-#endif
-      builder->get_widget_derived("dialog_image_progress", dialog);
+      Utils::get_glade_widget_derived_with_warning(dialog);
       if(dialog)
       {
         // Automatically delete the dialog when we no longer need it:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]