Home | History | Annotate | Download | only in event
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.inputmethod.event;
     18 
     19 /**
     20  * Class representing a generic input event as handled by Latin IME.
     21  *
     22  * This contains information about the origin of the event, but it is generalized and should
     23  * represent a software keypress, hardware keypress, or d-pad move alike.
     24  * Very importantly, this does not necessarily result in inputting one character, or even anything
     25  * at all - it may be a dead key, it may be a partial input, it may be a special key on the
     26  * keyboard, it may be a cancellation of a keypress (e.g. in a soft keyboard the finger of the
     27  * user has slid out of the key), etc. It may also be a batch input from a gesture or handwriting
     28  * for example.
     29  * The combiner should figure out what to do with this.
     30  */
     31 public class Event {
     32     // Should the types below be represented by separate classes instead? It would be cleaner
     33     // but probably a bit too much
     34     // An event we don't handle in Latin IME, for example pressing Ctrl on a hardware keyboard.
     35     final public static int EVENT_NOT_HANDLED = 0;
     36     // A character that is already final, for example pressing an alphabetic character on a
     37     // hardware qwerty keyboard.
     38     final public static int EVENT_COMMITTABLE = 1;
     39     // A dead key, which means a character that should combine with what is coming next. Examples
     40     // include the "^" character on an azerty keyboard which combines with "e" to make "", or
     41     // AltGr+' on a dvorak international keyboard which combines with "e" to make "". This is
     42     // true regardless of the language or combining mode, and should be seen as a property of the
     43     // key - a dead key followed by another key with which it can combine should be regarded as if
     44     // the keyboard actually had such a key.
     45     final public static int EVENT_DEAD = 2;
     46     // A toggle event is triggered by a key that affects the previous character. An example would
     47     // be a numeric key on a 10-key keyboard, which would toggle between 1 - a - b - c with
     48     // repeated presses.
     49     final public static int EVENT_TOGGLE = 3;
     50     // A mode event instructs the combiner to change modes. The canonical example would be the
     51     // hankaku/zenkaku key on a Japanese keyboard, or even the caps lock key on a qwerty keyboard
     52     // if handled at the combiner level.
     53     final public static int EVENT_MODE_KEY = 4;
     54 
     55     final private static int NOT_A_CODE_POINT = 0;
     56 
     57     final private int mType; // The type of event - one of the constants above
     58     // The code point associated with the event, if relevant. This is a unicode code point, and
     59     // has nothing to do with other representations of the key. It is only relevant if this event
     60     // is the right type: COMMITTABLE or DEAD or TOGGLE, but for a mode key like hankaku/zenkaku or
     61     // ctrl, there is no code point associated so this should be NOT_A_CODE_POINT to avoid
     62     // unintentional use of its value when it's not relevant.
     63     final public int mCodePoint;
     64     // The next event, if any. Null if there is no next event yet.
     65     final public Event mNextEvent;
     66 
     67     // This method is private - to create a new event, use one of the create* utility methods.
     68     private Event(final int type, final int codePoint, final Event next) {
     69         mType = type;
     70         mCodePoint = codePoint;
     71         mNextEvent = next;
     72     }
     73 
     74     public static Event createDeadEvent(final int codePoint, final Event next) {
     75         return new Event(EVENT_DEAD, codePoint, next);
     76     }
     77 
     78     public static Event createCommittableEvent(final int codePoint, final Event next) {
     79         return new Event(EVENT_COMMITTABLE, codePoint, next);
     80     }
     81 
     82     public static Event createNotHandledEvent() {
     83         return new Event(EVENT_NOT_HANDLED, NOT_A_CODE_POINT, null);
     84     }
     85 
     86     public boolean isCommittable() {
     87         return EVENT_COMMITTABLE == mType;
     88     }
     89 
     90     public boolean isDead() {
     91         return EVENT_DEAD == mType;
     92     }
     93 }
     94