OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 """This module provides functionality to generate dart:html event classes.""" | 6 """This module provides functionality to generate dart:html event classes.""" |
7 | 7 |
8 import logging | 8 import logging |
9 | 9 |
10 _logger = logging.getLogger('dartgenerator') | 10 _logger = logging.getLogger('dartgenerator') |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 self._template_loader = template_loader | 195 self._template_loader = template_loader |
196 | 196 |
197 def ProcessInterface(self, interface, html_interface_name, custom_events, | 197 def ProcessInterface(self, interface, html_interface_name, custom_events, |
198 events_interface_emitter, events_implementation_emitter): | 198 events_interface_emitter, events_implementation_emitter): |
199 events = set([attr for attr in interface.attributes | 199 events = set([attr for attr in interface.attributes |
200 if attr.type.id == 'EventListener']) | 200 if attr.type.id == 'EventListener']) |
201 if not events and interface.id not in _html_explicit_event_classes: | 201 if not events and interface.id not in _html_explicit_event_classes: |
202 return None | 202 return None |
203 | 203 |
204 self._event_classes.add(interface.id) | 204 self._event_classes.add(interface.id) |
205 events_interface = html_interface_name + 'Events' | 205 events_class_name = html_interface_name + 'Events' |
206 parent_events_interface = self._GetParentEventsInterface(interface) | 206 parent_events_interface = self._GetParentEventsInterface(interface) |
207 | 207 |
208 if not events: | 208 if not events: |
209 return parent_events_interface | 209 return parent_events_interface |
210 | 210 |
211 interface_events_members = events_interface_emitter.Emit( | 211 template_file = 'impl_%s.darttemplate' % events_class_name |
212 '\nabstract class $INTERFACE implements $PARENT {\n$!MEMBERS}\n', | |
213 INTERFACE=events_interface, | |
214 PARENT=parent_events_interface) | |
215 | |
216 template_file = 'impl_%s.darttemplate' % events_interface | |
217 template = (self._template_loader.TryLoad(template_file) or | 212 template = (self._template_loader.TryLoad(template_file) or |
218 '\n' | 213 '\n' |
219 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' | 214 'class $CLASSNAME extends $SUPER {\n' |
220 ' $CLASSNAME(_ptr) : super(_ptr);\n' | 215 ' $CLASSNAME(EventTarget _ptr) : super(_ptr);\n' |
221 '$!MEMBERS}\n') | 216 '$!MEMBERS}\n') |
222 | 217 |
223 # TODO(jacobr): specify the type of _ptr as EventTarget | 218 # TODO(jacobr): specify the type of _ptr as EventTarget |
224 implementation_events_members = events_implementation_emitter.Emit( | 219 implementation_events_members = events_implementation_emitter.Emit( |
225 template, | 220 template, |
226 CLASSNAME='_%sImpl' % events_interface, | 221 CLASSNAME=events_class_name, |
227 INTERFACE=events_interface, | 222 SUPER='%s' % parent_events_interface) |
228 SUPER='_%sImpl' % parent_events_interface) | |
229 | 223 |
230 dom_event_names = set() | 224 dom_event_names = set() |
231 for event in events: | 225 for event in events: |
232 dom_name = event.id[2:] | 226 dom_name = event.id[2:] |
233 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) | 227 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) |
234 dom_event_names.add(dom_name) | 228 dom_event_names.add(dom_name) |
235 if html_interface_name in _html_manual_events: | 229 if html_interface_name in _html_manual_events: |
236 dom_event_names.update(_html_manual_events[html_interface_name]) | 230 dom_event_names.update(_html_manual_events[html_interface_name]) |
237 for dom_name in sorted(dom_event_names): | 231 for dom_name in sorted(dom_event_names): |
238 if dom_name not in _html_event_names: | 232 if dom_name not in _html_event_names: |
239 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n
ame) | 233 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n
ame) |
240 continue | 234 continue |
241 | 235 |
242 html_name = _html_event_names[dom_name] | 236 html_name = _html_event_names[dom_name] |
243 interface_events_members.Emit('\n EventListenerList get $NAME;\n', | |
244 NAME=html_name) | |
245 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) | 237 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) |
246 if not full_event_name in custom_events: | 238 if not full_event_name in custom_events: |
247 implementation_events_members.Emit( | 239 implementation_events_members.Emit( |
248 "\n" | 240 "\n" |
249 " EventListenerList get $NAME => this['$DOM_NAME'];\n", | 241 " EventListenerList get $NAME => this['$DOM_NAME'];\n", |
250 NAME=html_name, | 242 NAME=html_name, |
251 DOM_NAME=dom_name) | 243 DOM_NAME=dom_name) |
252 | 244 |
253 return events_interface | 245 return events_class_name |
254 | 246 |
255 # TODO(jacobr): this isn't quite right.... | 247 # TODO(jacobr): this isn't quite right.... |
256 def _GetParentEventsInterface(self, interface): | 248 def _GetParentEventsInterface(self, interface): |
257 # Ugly hack as we don't specify that Document and DocumentFragment inherit | 249 # Ugly hack as we don't specify that Document and DocumentFragment inherit |
258 # from Element in our IDL. | 250 # from Element in our IDL. |
259 if interface.id == 'Document' or interface.id == 'DocumentFragment': | 251 if interface.id == 'Document' or interface.id == 'DocumentFragment': |
260 return 'ElementEvents' | 252 return 'ElementEvents' |
261 | 253 |
262 parent_events_interface = 'Events' | 254 parent_events_interface = 'Events' |
263 interfaces_with_events = set() | 255 interfaces_with_events = set() |
264 for parent in self._database.Hierarchy(interface): | 256 for parent in self._database.Hierarchy(interface): |
265 if parent != interface and parent.id in self._event_classes: | 257 if parent != interface and parent.id in self._event_classes: |
266 parent_events_interface = parent.id + 'Events' | 258 parent_events_interface = parent.id + 'Events' |
267 interfaces_with_events.add(parent) | 259 interfaces_with_events.add(parent) |
268 if len(interfaces_with_events) > 1: | 260 if len(interfaces_with_events) > 1: |
269 raise Exception('Only one parent event class allowed ' + interface.id) | 261 raise Exception('Only one parent event class allowed ' + interface.id) |
270 return parent_events_interface | 262 return parent_events_interface |
OLD | NEW |