1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5Polymer('kb-keyset', {
6  align: "center",
7  // Propagate flick gestures to keys in this keyset.
8  flick: true,
9  isDefault: false,
10  nextKeyset: undefined,
11  // Weight offsets for positioning the keyset.
12  weightBottom: 15,
13  weightLeft: 10,
14  weightRight: 10,
15  weightTop: 6,
16
17  /**
18   * Weight assigned to space between keys, of the form "xPitch yPitch".
19   * Defaults to xPitch = yPitch if it's only a single number.
20   * @type {string}
21   */
22  pitch: "10",
23
24  /**
25   * Expands kb-key-sequences into individual keys.
26   */
27  flattenKeyset: function() {
28    var keySequences = this.querySelectorAll('kb-key-sequence');
29    if (keySequences.length != 0) {
30      keySequences.array().forEach(function(element) {
31        var generatedDom = element.generateDom();
32        element.parentNode.replaceChild(generatedDom, element);
33      });
34    }
35  },
36
37  // TODO(bshe): support select keyset on down, long and dbl events.
38  keyUp: function(event, detail) {
39    switch (detail.char) {
40      case 'Shift':
41      case 'Alt':
42      case 'Ctrl':
43      case 'Invalid':
44        return;
45      default:
46        break;
47    }
48    if (!detail.toKeyset)
49      detail.toKeyset = this.nextKeyset;
50  },
51  keyLongpress: function(event, detail) {
52    if (!detail.char)
53      return;
54
55    var altkeyContainer = this.$.altkeyContainer.getDistributedNodes()[0];
56    if (!altkeyContainer)
57      return;
58
59    var altkeyMetadata = this.$.altkeyMetadata;
60    var altkeys = altkeyMetadata.getAltkeys(detail.char,
61                                            !!detail.hintText);
62    if (!altkeys)
63      return;
64
65    var id = altkeys.id;
66    var activeAltKeySet = altkeyContainer.querySelector('#' + id);
67    if (!activeAltKeySet) {
68      var keyWidth = event.target.clientWidth;
69      var leftMargin = event.target.offsetLeft;
70      var maxLeftOffset = Math.round(leftMargin / keyWidth);
71      var rightMargin = this.clientWidth - leftMargin - keyWidth;
72      var maxRightOffset = Math.round(rightMargin / keyWidth);
73      activeAltKeySet = altkeyMetadata.createAltkeySet(detail.char,
74                                                       maxLeftOffset,
75                                                       maxRightOffset,
76                                                       detail.hintText);
77      altkeyContainer.appendChild(activeAltKeySet);
78    }
79
80    altkeyContainer.keyset = id;
81    event.target.dropKey();
82    activeAltKeySet.style.width = event.target.clientWidth *
83        activeAltKeySet.childElementCount + 'px';
84    activeAltKeySet.style.height = event.target.clientHeight + 'px';
85    activeAltKeySet.style.top = event.target.offsetTop + 'px';
86    var leftOffset = activeAltKeySet.offset * event.target.clientWidth;
87    activeAltKeySet.style.left = event.target.offsetLeft - leftOffset +
88        'px';
89    var nodes = activeAltKeySet.childNodes;
90    nodes[activeAltKeySet.offset].classList.add('active');
91    altkeyContainer.hidden = false;
92  },
93
94  show: function() {
95    var old = $('keyboard').querySelector('.activeKeyset');
96    if (old && old != this)
97      old.classList.remove('activeKeyset');
98    this.classList.add('activeKeyset');
99    this.fire('stateChange', {
100      state: 'keysetChanged',
101      value: this.id
102    });
103  },
104});
105