• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!--
2  -- Copyright 2013 The Chromium Authors. All rights reserved.
3  -- Use of this source code is governed by a BSD-style license that can be
4  -- found in the LICENSE file.
5  -->
6
7<polymer-element name="kb-altkey-data" attributes="char list">
8<script>
9  (function() {
10    var altKeys = {};
11    var idMap = {};
12
13    /**
14     * Creates a unique identifier based on the key provided.
15     * This identifier is of the form 'idHASH' where HASH is
16     * the concatenation of the keycodes of every character in the string.
17     * @param {string} key Key for which we want an identifier.
18     * @return {string} The unique id for key.
19     */
20    function createId(key) {
21      var hash = key.split('').map(
22        // Returns the key code for the character.
23        function(character) {
24          return character.charCodeAt(0);
25        }
26      ).join('');
27      return 'id' + hash;
28    }
29
30    Polymer('kb-altkey-data', {
31
32      /**
33       * Retrieves a list of alternative keys to display on a long-press.
34       * @param {string} char The base character.
35       * @param {boolean=} opt_force If true, force the creation of a list
36       *    even if empty. Used when constructing a set of alternates for keys
37       *    with hintTexts.
38       * @return {?Object.{id: string, list: string}}
39       */
40      getAltkeys: function(char, opt_force) {
41        var id = idMap[char];
42        if (id) {
43          return {
44            'id': id,
45            'keys': altKeys[id]
46          };
47        }
48        if (opt_force) {
49          return {
50            'id': createId(char),
51            'keys': []
52          };
53        }
54      },
55
56      /**
57       * Registers lists of alternative keys displayed on a long-press.
58       * @param {Object.<string, Array.<string>>} data Mapping of characters to
59       *     lists of alternatives.
60       */
61      registerAltkeys: function(data) {
62        for (var key in data) {
63          var id = idMap[key];
64          if (!id)
65            idMap[key] = id = createId(key);
66          altKeys[id] = data[key];
67        }
68      },
69
70      /**
71       * Creates a list of alternate candidates to display in a popup on a
72       * long-press.
73       * @param {string} char The base character.
74       * @param {number} maxLeftOffset Limits the number of candidates
75       *      displayed to the left of the base character to prevent running
76       *      past the left edge of the keyboard.
77       * @param {number} maxRightOffset Limits the number of candidates
78       *     displayed to the right of the base character to prvent running
79       *     past the right edge of the keyboard.
80       * @param {string=} opt_additionalKeys Optional list of additional keys
81       *     to include in the candidates list.
82       */
83      createAltkeySet: function(char,
84                                maxLeftOffset,
85                                maxRightOffset,
86                                opt_additionalKeys) {
87        var altKeys = this.getAltkeys(char, true /* forced */);
88        if (altKeys) {
89          var list = altKeys.keys;
90          if (opt_additionalKeys)
91            list = opt_additionalKeys.split('').concat(list);
92          list = [char].concat(list);
93
94          var set = document.createElement('kb-altkey-set');
95          // Candiates are approximately in decreasing order of usage, and are
96          // arranged in a single row in the popup display.  To reduce the
97          // expected length of the drag gesture for selecting a candidate,
98          // more likely candidates are placed in the center of the popup,
99          // which is achieved by alternately appending and prepending
100          // candiates in the alternatives popup.
101          var prepend = false;
102          var leftOffset = 0;
103          var rightOffset = 0;
104          for (var i = 0; i < list.length; i++) {
105            var key = document.createElement('kb-altkey');
106            key.textContent = list[i];
107            if (prepend) {
108              set.insertBefore(key, set.firstChild);
109              leftOffset++;
110            } else {
111              set.appendChild(key);
112              rightOffset++;
113            }
114            prepend = !prepend;
115            // Verify that there is room remaining for an additional character.
116            if (leftOffset == maxLeftOffset && rightOffset == maxRightOffset)
117              break;
118            if (leftOffset == maxLeftOffset)
119              prepend = false;
120            else if (rightOffset == maxRightOffset)
121              prepend = true;
122          }
123          set.id = altKeys.id;
124          set.offset = leftOffset;
125          return set;
126        }
127      },
128
129    });
130  })();
131</script>
132</polymer-element>
133