Home | History | Annotate | Download | only in elements
      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-keyset" attributes="nextKeyset isDefault"
      8     on-key-up="{{keyUp}}" on-key-longpress="{{keyLongpress}}">
      9   <template>
     10     <style>
     11       :host {
     12         -webkit-box-flex: 1;
     13         -webkit-box-orient: vertical;
     14         display: -webkit-box;
     15       }
     16     </style>
     17     <content select="kb-row"></content>
     18     <content select="kb-altkey-container" id="altkeyContainer"
     19         touch-action="none"></content>
     20     <kb-altkey-data id="altkeyMetadata"></kb-altkey-data> 
     21   </template>
     22   <script>
     23     Polymer('kb-keyset', {
     24       isDefault: false,
     25       nextKeyset: undefined,
     26       // TODO(bshe): support select keyset on down, long and dbl events.
     27       keyUp: function(event, detail) {
     28         switch (detail.char) {
     29           case 'Shift':
     30           case 'Alt':
     31           case 'Ctrl':
     32             return;
     33           default:
     34             break;
     35         }
     36         if (!detail.toKeyset)
     37           detail.toKeyset = this.nextKeyset;
     38       },
     39       keyLongpress: function(event, detail) {
     40         if (!detail.char)
     41           return;
     42 
     43         var altkeyContainer = this.$.altkeyContainer.getDistributedNodes()[0];
     44         if (!altkeyContainer)
     45           return;
     46 
     47         var altkeyMetadata = this.$.altkeyMetadata;
     48         var altkeys = altkeyMetadata.getAltkeys(detail.char,
     49                                                 !!detail.hintText);
     50         if (!altkeys)
     51           return;
     52 
     53         var id = altkeys.id;
     54         var activeAltKeySet = altkeyContainer.querySelector('#' + id);
     55         if (!activeAltKeySet) {
     56           var keyWidth = event.target.clientWidth;
     57           var leftMargin = event.target.offsetLeft;
     58           var maxLeftOffset = Math.round(leftMargin / keyWidth);
     59           var rightMargin = this.clientWidth - leftMargin - keyWidth;
     60           var maxRightOffset = Math.round(rightMargin / keyWidth);
     61           activeAltKeySet = altkeyMetadata.createAltkeySet(detail.char,
     62                                                            maxLeftOffset,
     63                                                            maxRightOffset,
     64                                                            detail.hintText);
     65           altkeyContainer.appendChild(activeAltKeySet);
     66         }
     67 
     68         altkeyContainer.keyset = id;
     69         event.target.dropKey();
     70         activeAltKeySet.style.width = event.target.clientWidth *
     71             activeAltKeySet.childElementCount + 'px';
     72         activeAltKeySet.style.height = event.target.clientHeight + 'px';
     73         activeAltKeySet.style.top = event.target.offsetTop + 'px';
     74         var leftOffset = activeAltKeySet.offset * event.target.clientWidth;
     75         activeAltKeySet.style.left = event.target.offsetLeft - leftOffset +
     76             'px';
     77         var nodes = activeAltKeySet.childNodes;
     78         nodes[activeAltKeySet.offset].classList.add('active');
     79         altkeyContainer.hidden = false;
     80       }
     81     });
     82   </script>
     83 </polymer-element>
     84