1.1 --- a/libxml2dom/events.py Fri Apr 06 18:37:16 2007 +0000
1.2 +++ b/libxml2dom/events.py Fri Apr 06 18:38:06 2007 +0000
1.3 @@ -21,6 +21,7 @@
1.4 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
1.5 """
1.6
1.7 +import xml.dom
1.8 import time
1.9
1.10 XML_EVENTS_NAMESPACE = "http://www.w3.org/2001/xml-events"
1.11 @@ -32,13 +33,19 @@
1.12
1.13 class DocumentEvent:
1.14
1.15 - "An event interface supportable by documents."
1.16 + """
1.17 + An event interface supportable by documents.
1.18 + See: http://www.w3.org/TR/DOM-Level-3-Events/events.html#Events-DocumentEvent
1.19 + """
1.20
1.21 def canDispatch(self, namespaceURI, type):
1.22 - raise NotImplementedError, "canDispatch"
1.23 + return namespaceURI is None and event_types.has_key(type)
1.24
1.25 def createEvent(self, eventType):
1.26 - raise NotImplementedError, "createEvent"
1.27 + try:
1.28 + return event_types[eventType]()
1.29 + except KeyError:
1.30 + raise xml.dom.DOMException(xml.dom.NOT_SUPPORTED_ERR)
1.31
1.32 class Event:
1.33
1.34 @@ -48,16 +55,15 @@
1.35 AT_TARGET = 2
1.36 BUBBLING_PHASE = 3
1.37
1.38 - def __init__(self, target, currentTarget):
1.39 + def __init__(self):
1.40
1.41 "Initialise the event."
1.42
1.43 - self.target = target
1.44 - self.currentTarget = currentTarget
1.45 - self.defaultPrevented = 0
1.46 -
1.47 # Initialised later:
1.48
1.49 + self.target = None
1.50 + self.currentTarget = None
1.51 + self.defaultPrevented = 0
1.52 self.type = None
1.53 self.namespaceURI = None
1.54
1.55 @@ -85,26 +91,51 @@
1.56 def stopImmediatePropagation(self):
1.57 pass
1.58
1.59 +class UIEvent(Event):
1.60 +
1.61 + "A user interface event."
1.62 +
1.63 + def __init__(self):
1.64 + Event.__init__(self)
1.65 + self.detail = None
1.66 +
1.67 +class MouseEvent(UIEvent):
1.68 +
1.69 + "A mouse-related event."
1.70 +
1.71 + def __init__(self):
1.72 + Event.__init__(self)
1.73 + self.screenX, self.screenY, self.clientX, self.clientY, self.button = None, None, None, None, None
1.74 +
1.75 +# Event types registry.
1.76 +
1.77 +event_types = {
1.78 + "Event" : Event,
1.79 + "UIEvent" : UIEvent,
1.80 + "MouseEvent" : MouseEvent
1.81 + }
1.82 +
1.83 class EventTarget:
1.84
1.85 "An event target class."
1.86
1.87 - def __init__(self):
1.88 - self.listeners = {}
1.89 -
1.90 def addEventListener(self, type, listener, useCapture):
1.91 self.addEventListenerNS(None, type, listener, useCapture)
1.92
1.93 - def addEventListenerNS(self, namespaceURI, type, listener, useCapture):
1.94 - if not self.listeners.has_key((namespaceURI, type)):
1.95 - self.listeners[(namespaceURI, type)] = []
1.96 - self.listeners[(namespaceURI, type)].append((listener, useCapture))
1.97 + def addEventListenerNS(self, namespaceURI, type, listener, useCapture, group=None): # NOTE: group ignored
1.98 + listeners = self.ownerDocument.global_.listeners
1.99 + if not listeners.has_key(self):
1.100 + listeners[self] = {}
1.101 + if not listeners[self].has_key((namespaceURI, type)):
1.102 + listeners[self][(namespaceURI, type)] = []
1.103 + listeners[self][(namespaceURI, type)].append((listener, useCapture))
1.104
1.105 def dispatchEvent(self, evt):
1.106 + listeners = self.ownerDocument.global_.listeners
1.107 if not evt.type:
1.108 raise EventException(EventException.UNSPECIFIED_EVENT_TYPE_ERR)
1.109 # Dispatch on namespaceURI, type.
1.110 - for listener in self.listeners.get((evt.namespaceURI, evt.type), []):
1.111 + for listener, useCapture in listeners.get(self, {}).get((evt.namespaceURI, evt.type), []):
1.112 listener.handleEvent(evt)
1.113 return evt.defaultPrevented
1.114
1.115 @@ -112,10 +143,10 @@
1.116 self.removeEventListenerNS(None, type, listener, useCapture)
1.117
1.118 def removeEventListenerNS(self, namespaceURI, type, listener, useCapture):
1.119 - if self.listeners.has_key((namespaceURI, type)):
1.120 - listeners = self.listeners[(namespaceURI, type)]
1.121 + listeners = self.ownerDocument.global_.listeners
1.122 + if listeners.has_key(self) and listeners[self].has_key((namespaceURI, type)):
1.123 try:
1.124 - listeners.remove((listener, useCapture))
1.125 + listeners[self][(namespaceURI, type)].remove((listener, useCapture))
1.126 except ValueError:
1.127 pass
1.128