27#include "../dom/document.hxx"
29#include <osl/mutex.hxx>
31using namespace css::uno;
32using namespace css::xml::dom;
33using namespace css::xml::dom::events;
44 auto tIter = pTMap->find(aType);
45 if (tIter == pTMap->end()) {
47 auto const pair = pTMap->emplace(aType,
ListenerMap());
48 pMap = & pair.first->second;
50 pMap = & tIter->second;
52 assert(pMap !=
nullptr);
53 pMap->emplace(pNode, aListener);
62 auto tIter = pTMap->find(aType);
63 if (tIter == pTMap->end())
68 ListenerMap::iterator iter = rMap.find(pNode);
69 while (iter != rMap.end() && iter->first == pNode)
72 if (iter->second.is() && iter->second == aListener)
74 iter = rMap.erase(iter);
87 xmlNodePtr
const pNode,
88 const OUString& aType, Reference< XEvent >
const& xEvent)
91 TypeListenerMap::const_iterator tIter = rTMap.find(aType);
92 if (tIter != rTMap.end()) {
94 auto iterRange = rMap.equal_range(pNode);
95 for(
auto iter = iterRange.first; iter != iterRange.second; ++iter )
98 (iter->second)->handleEvent(xEvent);
105 xmlNodePtr
const pNode, Reference<XNode>
const& xNode,
106 Reference< XEvent >
const& i_xEvent)
const
111 ::osl::MutexGuard g(rMutex);
117 if (captureListeners.empty() && targetListeners.empty())
122 OUString
const aType = i_xEvent->getType();
123 if (aType ==
"DOMSubtreeModified" ||
124 aType ==
"DOMNodeInserted" ||
125 aType ==
"DOMNodeRemoved" ||
126 aType ==
"DOMNodeRemovedFromDocument" ||
127 aType ==
"DOMNodeInsertedIntoDocument" ||
128 aType ==
"DOMAttrModified" ||
129 aType ==
"DOMCharacterDataModified" )
131 Reference< XMutationEvent >
const aMEvent(i_xEvent,
137 pMEvent->initMutationEvent(
138 aType, aMEvent->getBubbles(), aMEvent->getCancelable(),
139 aMEvent->getRelatedNode(), aMEvent->getPrevValue(),
140 aMEvent->getNewValue(), aMEvent->getAttrName(),
141 aMEvent->getAttrChange());
144 aType ==
"DOMFocusIn" ||
145 aType ==
"DOMFocusOut" ||
146 aType ==
"DOMActivate" )
148 Reference< XUIEvent >
const aUIEvent(i_xEvent, UNO_QUERY_THROW);
150 pUIEvent->initUIEvent(aType,
151 aUIEvent->getBubbles(), aUIEvent->getCancelable(),
152 aUIEvent->getView(), aUIEvent->getDetail());
156 aType ==
"mousedown" ||
157 aType ==
"mouseup" ||
158 aType ==
"mouseover" ||
159 aType ==
"mousemove" ||
160 aType ==
"mouseout" )
162 Reference< XMouseEvent >
const aMouseEvent(i_xEvent,
165 pMouseEvent->initMouseEvent(aType,
166 aMouseEvent->getBubbles(), aMouseEvent->getCancelable(),
167 aMouseEvent->getView(), aMouseEvent->getDetail(),
168 aMouseEvent->getScreenX(), aMouseEvent->getScreenY(),
169 aMouseEvent->getClientX(), aMouseEvent->getClientY(),
170 aMouseEvent->getCtrlKey(), aMouseEvent->getAltKey(),
171 aMouseEvent->getShiftKey(), aMouseEvent->getMetaKey(),
172 aMouseEvent->getButton(), aMouseEvent->getRelatedTarget());
173 pEvent = pMouseEvent;
179 aType, i_xEvent->getBubbles(), i_xEvent->getCancelable());
181 pEvent->m_target.set(xNode, UNO_QUERY_THROW);
182 pEvent->m_currentTarget = i_xEvent->getCurrentTarget();
183 pEvent->m_time = i_xEvent->getTimeStamp();
187 Reference< XEvent >
const xEvent(pEvent);
190 typedef std::vector< ::std::pair<Reference<XEventTarget>, xmlNodePtr> >
192 NodeVector_t captureVector;
194 ::osl::MutexGuard g(rMutex);
196 xmlNodePtr cur = pNode;
197 while (cur !=
nullptr)
199 Reference< XEventTarget >
const xRef(
201 captureVector.emplace_back(xRef, cur);
212 NodeVector_t::const_reverse_iterator rinode =
213 const_cast<NodeVector_t const&
>(captureVector).rbegin();
214 if (rinode ==
const_cast<NodeVector_t const&
>(captureVector).rend())
218 pEvent->m_phase = PhaseType_CAPTURING_PHASE;
220 const_cast<NodeVector_t const&
>(captureVector).rend())
222 pEvent->m_currentTarget = rinode->first;
223 callListeners(captureListeners, rinode->second, aType, xEvent);
224 if (pEvent->m_canceled)
return;
228 NodeVector_t::const_iterator inode = captureVector.begin();
231 pEvent->m_phase = PhaseType_AT_TARGET;
232 pEvent->m_currentTarget = inode->first;
233 callListeners(targetListeners, inode->second, aType, xEvent);
234 if (pEvent->m_canceled)
return;
237 if (i_xEvent->getBubbles()) {
238 pEvent->m_phase = PhaseType_BUBBLING_PHASE;
239 while (inode != captureVector.end())
241 pEvent->m_currentTarget = inode->first;
243 inode->second, aType, xEvent);
244 if (pEvent->m_canceled)
return;
::rtl::Reference< CNode > GetCNode(xmlNodePtr const pNode, bool const bCreate=true)
get UNO wrapper instance for a libxml node
TypeListenerMap m_CaptureListeners
void removeListener(xmlNodePtr pNode, const OUString &aType, const css::uno::Reference< css::xml::dom::events::XEventListener > &aListener, bool bCapture)
void dispatchEvent(DOM::CDocument &rDocument, ::osl::Mutex &rMutex, xmlNodePtr const pNode, css::uno::Reference< css::xml::dom::XNode > const &xNode, css::uno::Reference< css::xml::dom::events::XEvent > const &xEvent) const
void addListener(xmlNodePtr pNode, const OUString &aType, const css::uno::Reference< css::xml::dom::events::XEventListener > &aListener, bool bCapture)
static void callListeners(TypeListenerMap const &rTMap, xmlNodePtr const pNode, const OUString &aType, const css::uno::Reference< css::xml::dom::events::XEvent > &xEvent)
TypeListenerMap m_TargetListeners
std::multimap< xmlNodePtr, css::uno::Reference< css::xml::dom::events::XEventListener > > ListenerMap
std::map< OUString, ListenerMap > TypeListenerMap