- add sources.
[platform/framework/web/crosswalk.git] / src / ui / keyboard / resources / elements / kb-modifier-key.html
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-modifier-key" class="unlocked dark" extends="kb-key"
8     on-pointerout="out">
9   <script>
10     (function () {
11
12       /**
13        * The possible states of the key.
14        * @const
15        * @type {Enum}
16        */
17       var KEY_STATES = {
18         PRESSED: "pressed", // Key-down.
19         UNLOCKED: "unlocked", // Default state.
20         TAPPED: "tapped", // Key-down followed by key-up.
21         CHORDING: "chording", // Chording mode.
22       };
23
24       /**
25        * A map of the state of all modifier keys.
26        * @type {Object}
27        */
28       var states = {};
29
30       Polymer('kb-modifier-key', {
31         up: function(event) {
32           if (this.state == KEY_STATES.PRESSED)
33             this.state = KEY_STATES.TAPPED;
34           else
35             this.state = KEY_STATES.UNLOCKED;
36           this.super([event]);
37         },
38
39         down: function(event) {
40           // First transition state so that populateDetails generates
41           // correct data.
42           switch (this.state) {
43             case KEY_STATES.UNLOCKED:
44               this.state = KEY_STATES.PRESSED;
45               break;
46             case KEY_STATES.TAPPED:
47               this.state = KEY_STATES.UNLOCKED;
48               break;
49             case KEY_STATES.PRESSED:
50             case KEY_STATES.CHORDING:
51               // We pressed another key at the same time,
52               // so ignore second press.
53               return;
54             default:
55               console.error("Undefined key state: " + state);
56               break;
57           }
58           this.super([event]);
59         },
60
61         /**
62          * Returns whether the modifier for this key is active.
63          * @return {boolean}
64          */
65         isActive: function() {
66           return this.state != KEY_STATES.UNLOCKED;
67         },
68
69         /**
70          * Notifies key that a non-control keyed down.
71          * A control key is defined as one of shift, control or alt.
72          */
73         onNonControlKeyDown: function() {
74           switch(this.state) {
75             case (KEY_STATES.PRESSED):
76               this.state = KEY_STATES.CHORDING;
77               break;
78           }
79         },
80
81         /**
82          * Notifies key that a non-control keyed was typed.
83          * A control key is defined as one of shift, control or alt.
84          */
85         onNonControlKeyTyped: function() {
86            switch(this.state) {
87              case (KEY_STATES.TAPPED):
88                this.state = KEY_STATES.UNLOCKED;
89                break;
90            }
91         },
92
93         /**
94          * Called on a pointer-out event. Ends chording.
95          * @param {event} event The pointer-out event.
96          */
97         out: function(event) {
98           // TODO(rsadam): Add chording event so that we don't reset
99           // when shift-chording.
100           if (this.state == KEY_STATES.CHORDING) {
101             this.state = KEY_STATES.UNLOCKED;
102           }
103         },
104
105         /*
106          * Overrides the autoRelease function to enable chording.
107          */
108         autoRelease: function() {
109         },
110
111         populateDetails: function(caller) {
112           var detail = this.super([caller]);
113           if (this.state != KEY_STATES.UNLOCKED)
114             detail.activeModifier = this.charValue;
115           return detail;
116         },
117
118         /**
119          *  Resets the modifier key state.
120          */
121         reset: function() {
122           this.state = KEY_STATES.UNLOCKED;
123         },
124
125         get state() {
126           if (!this.innerText)
127             console.error("innerText not defined for kb-modifier-key: "
128                 + this);
129           // All keys default to the unlock state.
130           if (!(this.innerText in states))
131             states[this.innerText] = KEY_STATES.UNLOCKED;
132           return states[this.innerText];
133         },
134
135         set state(value) {
136           states[this.innerText] = value;
137         }
138       });
139     })();
140   </script>
141 </polymer-element>