enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / pbd / stateful.cc
index 7d6762919131fb2ee3eeff0549390e6082598247..8b8219f7e2243306f201f95257b035ec20b18cf0 100644 (file)
@@ -35,7 +35,7 @@
 #include "pbd/xml++.h"
 #include "pbd/error.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 
@@ -44,6 +44,8 @@ namespace PBD {
 int Stateful::current_state_version = 0;
 int Stateful::loading_state_version = 0;
 
+Glib::Threads::Private<bool> Stateful::_regenerate_xml_or_string_ids;
+
 Stateful::Stateful ()
        : _extra_xml (0)
        , _instant_xml (0)
@@ -69,7 +71,7 @@ Stateful::add_extra_xml (XMLNode& node)
                _extra_xml = new XMLNode ("Extra");
        }
 
-       _extra_xml->remove_nodes (node.name());
+       _extra_xml->remove_nodes_and_delete (node.name());
        _extra_xml->add_child_nocopy (node);
 }
 
@@ -381,6 +383,12 @@ bool
 Stateful::set_id (const XMLNode& node)
 {
        const XMLProperty* prop;
+       bool* regen = _regenerate_xml_or_string_ids.get();
+
+       if (regen && *regen) {
+               reset_id ();
+               return true;
+       }
 
        if ((prop = node.property ("id")) != 0) {
                _id = prop->value ();
@@ -399,7 +407,31 @@ Stateful::reset_id ()
 void
 Stateful::set_id (const string& str)
 {
-       _id = str;
+       bool* regen = _regenerate_xml_or_string_ids.get();
+
+       if (regen && *regen) {
+               reset_id ();
+       } else {
+               _id = str;
+       }
+}
+
+bool
+Stateful::regenerate_xml_or_string_ids () const
+{
+       bool* regen = _regenerate_xml_or_string_ids.get();
+       if (regen && *regen) {
+               return true;
+       } else {
+               return false;
+       }
+}
+
+void
+Stateful::set_regenerate_xml_and_string_ids_in_this_thread (bool yn)
+{
+       bool* val = new bool (yn);
+       _regenerate_xml_or_string_ids.set (val);
 }
 
 } // namespace PBD