Html程序  |  84行  |  3.01 KB

<!--
  -- Copyright 2013 The Chromium Authors. All rights reserved.
  -- Use of this source code is governed by a BSD-style license that can be
  -- found in the LICENSE file.
  -->

<polymer-element name="kb-keyset" attributes="nextKeyset isDefault"
    on-key-up="{{keyUp}}" on-key-longpress="{{keyLongpress}}">
  <template>
    <style>
      :host {
        -webkit-box-flex: 1;
        -webkit-box-orient: vertical;
        display: -webkit-box;
      }
    </style>
    <content select="kb-row"></content>
    <content select="kb-altkey-container" id="altkeyContainer"
        touch-action="none"></content>
    <kb-altkey-data id="altkeyMetadata"></kb-altkey-data> 
  </template>
  <script>
    Polymer('kb-keyset', {
      isDefault: false,
      nextKeyset: undefined,
      // TODO(bshe): support select keyset on down, long and dbl events.
      keyUp: function(event, detail) {
        switch (detail.char) {
          case 'Shift':
          case 'Alt':
          case 'Ctrl':
            return;
          default:
            break;
        }
        if (!detail.toKeyset)
          detail.toKeyset = this.nextKeyset;
      },
      keyLongpress: function(event, detail) {
        if (!detail.char)
          return;

        var altkeyContainer = this.$.altkeyContainer.getDistributedNodes()[0];
        if (!altkeyContainer)
          return;

        var altkeyMetadata = this.$.altkeyMetadata;
        var altkeys = altkeyMetadata.getAltkeys(detail.char,
                                                !!detail.hintText);
        if (!altkeys)
          return;

        var id = altkeys.id;
        var activeAltKeySet = altkeyContainer.querySelector('#' + id);
        if (!activeAltKeySet) {
          var keyWidth = event.target.clientWidth;
          var leftMargin = event.target.offsetLeft;
          var maxLeftOffset = Math.round(leftMargin / keyWidth);
          var rightMargin = this.clientWidth - leftMargin - keyWidth;
          var maxRightOffset = Math.round(rightMargin / keyWidth);
          activeAltKeySet = altkeyMetadata.createAltkeySet(detail.char,
                                                           maxLeftOffset,
                                                           maxRightOffset,
                                                           detail.hintText);
          altkeyContainer.appendChild(activeAltKeySet);
        }

        altkeyContainer.keyset = id;
        event.target.dropKey();
        activeAltKeySet.style.width = event.target.clientWidth *
            activeAltKeySet.childElementCount + 'px';
        activeAltKeySet.style.height = event.target.clientHeight + 'px';
        activeAltKeySet.style.top = event.target.offsetTop + 'px';
        var leftOffset = activeAltKeySet.offset * event.target.clientWidth;
        activeAltKeySet.style.left = event.target.offsetLeft - leftOffset +
            'px';
        var nodes = activeAltKeySet.childNodes;
        nodes[activeAltKeySet.offset].classList.add('active');
        altkeyContainer.hidden = false;
      }
    });
  </script>
</polymer-element>