Home | History | Annotate | Download | only in model
      1 <!DOCTYPE html>
      2 <!--
      3 Copyright (c) 2014 The Chromium Authors. All rights reserved.
      4 Use of this source code is governed by a BSD-style license that can be
      5 found in the LICENSE file.
      6 -->
      7 
      8 <link rel="import" href="/base/extension_registry.html">
      9 
     10 <script>
     11 'use strict';
     12 
     13 /**
     14  * @fileoverview Provides the EventRegistry class.
     15  */
     16 tr.exportTo('tr.model', function() {
     17   // Create the type registry.
     18   function EventRegistry() {
     19   }
     20 
     21   var options = new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);
     22   tr.b.decorateExtensionRegistry(EventRegistry, options);
     23 
     24   // Enforce all options objects have the right fields.
     25   EventRegistry.addEventListener('will-register', function(e) {
     26     var metadata = e.typeInfo.metadata;
     27 
     28     if (metadata.name === undefined)
     29       throw new Error('Registered events must provide name metadata');
     30     var i = tr.b.findFirstInArray(
     31       EventRegistry.getAllRegisteredTypeInfos(),
     32       function(x) { return x.metadata.name === metadata.name; });
     33     if (i !== undefined)
     34       throw new Error('Event type with that name already registered');
     35 
     36     if (metadata.pluralName === undefined)
     37       throw new Error('Registered events must provide pluralName metadata');
     38     if (metadata.singleViewElementName === undefined) {
     39       throw new Error('Registered events must provide ' +
     40                       'singleViewElementName metadata');
     41     }
     42     if (metadata.multiViewElementName === undefined) {
     43       throw new Error('Registered events must provide ' +
     44                       'multiViewElementName metadata');
     45     }
     46   });
     47 
     48   // Helper: lookup Events indexed by type name.
     49   var eventsByTypeName = undefined;
     50   EventRegistry.getEventTypeInfoByTypeName = function(typeName) {
     51     if (eventsByTypeName === undefined) {
     52       eventsByTypeName = {};
     53       EventRegistry.getAllRegisteredTypeInfos().forEach(function(typeInfo) {
     54         eventsByTypeName[typeInfo.metadata.name] = typeInfo;
     55       });
     56     }
     57     return eventsByTypeName[typeName];
     58   }
     59 
     60   // Ensure eventsByTypeName stays current.
     61   EventRegistry.addEventListener('registry-changed', function() {
     62     eventsByTypeName = undefined;
     63   });
     64 
     65   function convertCamelCaseToTitleCase(name) {
     66     var result = name.replace(/[A-Z]/g, ' $&');
     67     result = result.charAt(0).toUpperCase() + result.slice(1);
     68     return result;
     69   }
     70 
     71   EventRegistry.getUserFriendlySingularName = function(typeName) {
     72     var typeInfo = EventRegistry.getEventTypeInfoByTypeName(typeName);
     73     var str = typeInfo.metadata.name;
     74     return convertCamelCaseToTitleCase(str);
     75   };
     76 
     77   EventRegistry.getUserFriendlyPluralName = function(typeName) {
     78     var typeInfo = EventRegistry.getEventTypeInfoByTypeName(typeName);
     79     var str = typeInfo.metadata.pluralName;
     80     return convertCamelCaseToTitleCase(str);
     81   };
     82 
     83   return {
     84     EventRegistry: EventRegistry
     85   };
     86 });
     87 </script>
     88