summaryrefslogtreecommitdiff
path: root/src/core/dom/Node.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/dom/Node.cpp')
-rw-r--r--src/core/dom/Node.cpp145
1 files changed, 0 insertions, 145 deletions
diff --git a/src/core/dom/Node.cpp b/src/core/dom/Node.cpp
deleted file mode 100644
index c9651fb..0000000
--- a/src/core/dom/Node.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- Ousía
- Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "Node.hpp"
-
-namespace ousia {
-namespace dom {
-
-/* Class Node */
-
-void Node::setName(std::string name)
-{
- // Call the name change event
- NameChangeEvent ev{this->name, name};
- triggerEvent(ev);
-
- // Set the new name
- this->name = std::move(name);
-}
-
-void Node::path(std::vector<std::string> &p) const
-{
- if (!isRoot()) {
- parent->path(p);
- }
- p.push_back(name);
-}
-
-std::vector<std::string> Node::path() const
-{
- std::vector<std::string> res;
- path(res);
- return res;
-}
-
-void Node::doResolve(std::vector<Rooted<Node>> &res,
- const std::vector<std::string> &path, Filter filter,
- void *filterData, unsigned idx, VisitorSet &visited)
-{
- // Do nothing in the default implementation
-}
-
-int Node::resolve(std::vector<Rooted<Node>> &res,
- const std::vector<std::string> &path, Filter filter,
- void *filterData, unsigned idx, VisitorSet &visited,
- const std::string *alias)
-{
- // Abort if this node was already visited for this path index
- std::pair<const Node *, int> recKey = std::make_pair(this, idx);
- if (visited.find(recKey) != visited.end()) {
- return res.size();
- }
- visited.insert(recKey);
-
- // Check whether the we can continue the path
- if (path[idx] == name || (alias && *alias == name)) {
- // If we have reached the end of the path and the node is successfully
- // tested by the filter function, add it to the result. Otherwise
- // continue searching along the path
- if (idx + 1 == path.size()) {
- if (!filter || filter(this, filterData)) {
- res.push_back(this);
- }
- } else {
- doResolve(res, path, filter, filterData, idx + 1, visited);
- }
- }
-
- // Restart the search from here in order to find all possible nodes that can
- // be matched to the given path
- doResolve(res, path, filter, filterData, 0, visited);
-
- return res.size();
-}
-
-std::vector<Rooted<Node>> Node::resolve(const std::vector<std::string> &path,
- Filter filter = nullptr,
- void *filterData = nullptr)
-{
- std::vector<Rooted<Node>> res;
- VisitorSet visited;
- resolve(res, path, filter, filterData, 0, visited, nullptr);
- return res;
-}
-
-int Node::registerEventHandler(EventType type, EventHandler handler,
- Handle<Managed> owner,
- bool includeChildren)
-{
- const int id = handlerIdCounter++;
- handlers.insert(std::make_pair(
- type,
- EventHandlerDescriptor{id, handler, owner, this, includeChildren}));
- return id;
-}
-
-bool Node::unregisterEventHandler(int id) {
- for (auto it = handlers.begin(); it != handlers.end(); it++) {
- if (it->second.id == id) {
- handlers.erase(it);
- return true;
- }
- }
- return false;
-}
-
-bool Node::triggerEvent(Event &event, bool fromChild) {
- bool res = false;
- // Iterate over all event handlers
- const auto range = handlers.equal_range(event.type);
- for (auto it = range.first; it != range.second; it++) {
- // Fetch a reference to the descriptor, check whether it should be
- // called for bubbled events
- EventHandlerDescriptor descr = it->second;
- if (!fromChild || descr.includeChildren) {
- descr.handler(event, descr.owner);
- res = true;
- }
- }
-
- // If possible, let the event bubble up to the parent node
- if (event.canBubble() && !parent.isNull()) {
- res = parent->triggerEvent(event, true) | res;
- }
- return res;
-}
-
-}
-}
-