+/* This file is part of EdiTeX, an editor of mathematical
+ * expressions based on TeX syntax.
+ *
+ * Copyright (C) 2002-2003 Luca Padovani <lpadovan@cs.unibo.it>,
+ * 2003 Paolo Marinelli <pmarinel@cs.unibo.it>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * For more information, please visit the project's home page
+ * http://helm.cs.unibo.it/editex/
+ * or send an email to <lpadovan@cs.unibo.it>
+ */
#include <sstream>
+#include <cassert>
#include "globals.hh"
#include "dom.hh"
DOM::DocumentType dt;
doc = di.createDocument(TML_NS_URI, "tml:tex", dt);
DOM::Element root = doc.get_documentElement();
- root.setAttributeNS(XMLNS_NS_URI, "xmlns:tml", TML_NS_URI);
assert(root);
+ root.setAttributeNS(XMLNS_NS_URI, "xmlns:tml", TML_NS_URI);
DOM::EventTarget et(doc);
assert(et);
et.removeEventListener("DOMSubtreeModified", *this, false);
}
+void
+TDocument::reset()
+{
+ DOM::Element root = doc.createElementNS(TML_NS_URI, "tml:tex");
+ root.setAttributeNS(XMLNS_NS_URI, "xmlns:tml", TML_NS_URI);
+ doc.replaceChild(root, doc.get_documentElement());
+ clearDirty();
+}
+
void
TDocument::serialize(const char* filename) const
{
di.saveDocumentToFile(doc, filename, GDOME_SAVE_LIBXML_INDENT);
}
+std::string
+TDocument::makeId(unsigned id)
+{
+ std::ostringstream os;
+ os << "I" << id;
+ return os.str();
+}
+
TNode
TDocument::create(const std::string& name, unsigned id) const
{
DOM::Element elem = doc.createElementNS(TML_NS_URI, "tml:" + name);
- if (id > 0)
- {
- ostringstream os;
- os << "I" << id;
- elem.setAttribute("id", os.str());
- }
+ if (id > 0) elem.setAttribute("id", makeId(id));
return elem;
}
unsigned d1 = nodeDepth(n1);
unsigned d2 = nodeDepth(n2);
- cout << "finding common ancestor " << d1 << " " << d2 << endl;
+ // cout << "finding common ancestor " << d1 << " " << d2 << endl;
while (d1 < d2)
{
return DOM::Node(0);
}
+TNode
+TDocument::getNodeByIdAux(const TNode& node, const std::string& id)
+{
+ if (node.hasId(id)) return node;
+ else
+ for (TNode p = node.first(); p; p = p.next())
+ if (TNode res = getNodeByIdAux(p, id)) return res;
+ return TNode();
+}
+
+TNode
+TDocument::getNodeById(unsigned id) const
+{
+ DOM::Element root = doc.get_documentElement();
+ assert(root);
+ return getNodeByIdAux(root, makeId(id));
+}
+
void
TDocument::handleEvent(const DOM::Event& ev)
{
DOM::MutationEvent me(ev);
assert(me);
+#if 0
if (dirty)
cout << "TDocument::handleEvent DIRTY BEFORE = " << dirty.getAttribute("id") << endl;
else
cout << "TDocument::handleEvent DIRTY BEFORE = (nil)" << endl;
+#endif
if (DOM::Node node = me.get_target())
if (dirty)
else
assert(0);
+#if 0
cout << "TDocument::handleEvent target = " << DOM::Node(me.get_target()).get_nodeName() << " DIRTY AFTER = "
<< dirty.getAttribute("id") << " ME = " << DOM::Node(me.get_target()).get_nodeName() << endl;
-
+#endif
}