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 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
469 self._event_classes.add(interface.id) | 469 self._event_classes.add(interface.id) |
470 events_class_name = html_interface_name + 'Events' | 470 events_class_name = html_interface_name + 'Events' |
471 parent_events_class_name = self._GetParentEventsClassName(interface) | 471 parent_events_class_name = self._GetParentEventsClassName(interface) |
472 | 472 |
473 if not event_names: | 473 if not event_names: |
474 return parent_events_class_name | 474 return parent_events_class_name |
475 | 475 |
476 template_file = 'impl_%s.darttemplate' % events_class_name | 476 template_file = 'impl_%s.darttemplate' % events_class_name |
477 template = (self._template_loader.TryLoad(template_file) or | 477 template = (self._template_loader.TryLoad(template_file) or |
478 '\n' | 478 '\n' |
479 '/// @docsEditable true\n' | 479 '@DocsEditable\n' |
480 'class $CLASSNAME extends $SUPER {\n' | 480 'class $CLASSNAME extends $SUPER {\n' |
481 ' /// @docsEditable true\n' | 481 ' @DocsEditable\n' |
482 ' $CLASSNAME(EventTarget _ptr) : super(_ptr);\n' | 482 ' $CLASSNAME(EventTarget _ptr) : super(_ptr);\n' |
483 '$!MEMBERS}\n') | 483 '$!MEMBERS}\n') |
484 | 484 |
485 # TODO(jacobr): specify the type of _ptr as EventTarget | 485 # TODO(jacobr): specify the type of _ptr as EventTarget |
486 implementation_events_members = events_implementation_emitter.Emit( | 486 implementation_events_members = events_implementation_emitter.Emit( |
487 template, | 487 template, |
488 CLASSNAME=events_class_name, | 488 CLASSNAME=events_class_name, |
489 SUPER='%s' % parent_events_class_name) | 489 SUPER='%s' % parent_events_class_name) |
490 | 490 |
491 dom_event_names = set() | 491 dom_event_names = set() |
492 for event in event_names: | 492 for event in event_names: |
493 dom_name = event | 493 dom_name = event |
494 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) | 494 dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name) |
495 dom_event_names.add(dom_name) | 495 dom_event_names.add(dom_name) |
496 if html_interface_name in _html_manual_events: | 496 if html_interface_name in _html_manual_events: |
497 dom_event_names.update(_html_manual_events[html_interface_name]) | 497 dom_event_names.update(_html_manual_events[html_interface_name]) |
498 for dom_name in sorted(dom_event_names): | 498 for dom_name in sorted(dom_event_names): |
499 if dom_name not in _html_event_names: | 499 if dom_name not in _html_event_names: |
500 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n
ame) | 500 _logger.warn('omitting %s event as there is no HTML name for it' % dom_n
ame) |
501 continue | 501 continue |
502 | 502 |
503 html_name = _html_event_names[dom_name] | 503 html_name = _html_event_names[dom_name] |
504 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) | 504 full_event_name = '%sEvents.%s' % (html_interface_name, html_name) |
505 if not full_event_name in custom_events: | 505 if not full_event_name in custom_events: |
506 implementation_events_members.Emit( | 506 implementation_events_members.Emit( |
507 "\n" | 507 "\n" |
508 " /// @docsEditable true\n" | 508 " @DocsEditable\n" |
509 " EventListenerList get $NAME => this['$DOM_NAME'];\n", | 509 " EventListenerList get $NAME => this['$DOM_NAME'];\n", |
510 NAME=html_name, | 510 NAME=html_name, |
511 DOM_NAME=dom_name) | 511 DOM_NAME=dom_name) |
512 | 512 |
513 return events_class_name | 513 return events_class_name |
514 | 514 |
515 # TODO(jacobr): this isn't quite right.... | 515 # TODO(jacobr): this isn't quite right.... |
516 def _GetParentEventsClassName(self, interface): | 516 def _GetParentEventsClassName(self, interface): |
517 # Ugly hack as we don't specify that Document and DocumentFragment inherit | 517 # Ugly hack as we don't specify that Document and DocumentFragment inherit |
518 # from Element in our IDL. | 518 # from Element in our IDL. |
519 if interface.id == 'Document' or interface.id == 'DocumentFragment': | 519 if interface.id == 'Document' or interface.id == 'DocumentFragment': |
520 return 'ElementEvents' | 520 return 'ElementEvents' |
521 | 521 |
522 parent_events_class_name = 'Events' | 522 parent_events_class_name = 'Events' |
523 interfaces_with_events = set() | 523 interfaces_with_events = set() |
524 for parent in self._database.Hierarchy(interface): | 524 for parent in self._database.Hierarchy(interface): |
525 if parent != interface and parent.id in self._event_classes: | 525 if parent != interface and parent.id in self._event_classes: |
526 parent_name = self._renamer.RenameInterface(parent) | 526 parent_name = self._renamer.RenameInterface(parent) |
527 parent_events_class_name = parent_name + 'Events' | 527 parent_events_class_name = parent_name + 'Events' |
528 interfaces_with_events.add(parent) | 528 interfaces_with_events.add(parent) |
529 if len(interfaces_with_events) > 1: | 529 if len(interfaces_with_events) > 1: |
530 raise Exception('Only one parent event class allowed ' + interface.id) | 530 raise Exception('Only one parent event class allowed ' + interface.id) |
531 return parent_events_class_name | 531 return parent_events_class_name |
OLD | NEW |