/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.motorola.studio.android.emulator.core.skin; import java.util.Collection; import java.util.LinkedHashSet; import java.util.StringTokenizer; import org.eclipse.swt.graphics.Rectangle; /** * DESCRIPTION: * This is a default implementation of the interface IAndroidEmulatorKey * * RESPONSIBILITY: * - Provide an easy way to find the keys pressed during mouse interaction * at skin * - Provide means of retrieving the keysym associated with each key * * COLABORATORS: * None. * * USAGE: * Provide a coordinate to the isInsideKey methods to test if the coordinate * is inside the key area * Use the getKeysym of a key to retrieve the code that needs to be sent in a * key event message to the server, informing that a key was pressed or released */ public class AndroidPressKey implements IAndroidKey { // Constants used in the isFlipValid method private static final int FLIP_SLIDE_OPENED_ONLY = 0; private static final int FLIP_SLIDE_CLOSED_ONLY = 1; private static final int FLIP_SLIDE_OPENED_AND_CLOSED = 2; /** * Fields that can be found in an ordinary key.xml file */ private final String name; private final String toolTip; private final String keycode; private final Rectangle keyArea; private final int flipSlideEnabledCode; private final Collection<String> morphingModeCollection = new LinkedHashSet<String>(); /** * Creates a new AndroidPressKey object. * * @param name The key name. This is usually a human readable skin, that * provides key identification * @param keycode The code that will be sent to server if the key is pressed * @param toolTip The text that will be shown as the key tool tip. * @param startx X coordinate of the upper left corner of the key * @param starty Y coordinate of the upper left corner of the key * @param endx X coordinate of the lower right corner of the key * @param endy Y coordinate of the lower right corner of the key * @param morphingModes A comma separated list of morphing modes to which this * key applies, or null if not applicable * @param flipenabled true if this key is valid in closed flip mode; * false if the key is valid in opened flip mode */ public AndroidPressKey(String name, String keycode, String toolTip, int startx, int starty, int endx, int endy, String morphingModes, int flipEnabledCode) { this(name, keycode, toolTip, new Rectangle(startx, starty, endx - startx, endy - starty), morphingModes, flipEnabledCode); } /** * Creates a new AndroidPressKey object. * * @param name The key name. This is usually a human readable skin, that * provides key identification * @param keycode The code that will be sent to server if the key is pressed * @param toolTip The text that will be shown as the key tool tip. * @param key A rectangle that represents the key area at skin * @param morphingModes A comma separated list of morphing modes to which this * key applies, or null if not applicable * @param flipenabled true if this key is valid in closed flip mode; * false if the key is valid in opened flip mode */ public AndroidPressKey(String name, String keycode, String toolTip, Rectangle key, String morphingModes, int flipEnabledCode) { this.name = name; this.keycode = keycode; this.toolTip = toolTip; this.keyArea = key; this.flipSlideEnabledCode = flipEnabledCode; if (morphingModes != null) { StringTokenizer st = new StringTokenizer(morphingModes, ","); String token; while (st.hasMoreTokens()) { token = st.nextToken(); morphingModeCollection.add(token); } } } /** * @see IAndroidKey#getKeysym() */ public String getKeysym() { return keycode; } /** * @see IAndroidKey#isInsideKey(int, int) */ public boolean isInsideKey(int x, int y) { return keyArea.contains(x, y); } /** * Retrieves the X coordinate of the lower right corner of the key * * @return X coordinate of the lower right corner of the key */ public int getEndx() { return keyArea.x + keyArea.width; } /** * Retrieves the Y coordinate of the lower right corner of the key * * @return Y coordinate of the lower right corner of the key */ public int getEndy() { return keyArea.y + keyArea.height; } /** * Tests if the key is valid in the current flip/slide mode * * @param isFlipSlideClosed True if the flip/slide is currently closed * False if the flip/slide is currently opened * * @return true if the key is valid in the current flip/slide mode; false otherwise */ public boolean isFlipSlideValid(boolean isFlipSlideClosed) { boolean flipSlideValid = false; if ((flipSlideEnabledCode == FLIP_SLIDE_OPENED_AND_CLOSED) || (isFlipSlideClosed && (flipSlideEnabledCode == FLIP_SLIDE_CLOSED_ONLY)) || (!isFlipSlideClosed && (flipSlideEnabledCode == FLIP_SLIDE_OPENED_ONLY))) { flipSlideValid = true; } return flipSlideValid; } /** * Retrieves the key name * * @return The key name */ public String getName() { return name; } /** * Retrieves the tool tip text of the key. * * @return The tool tip text of the key. */ public String getToolTip() { return toolTip; } /** * Retrieves the X coordinate of the upper left corner of the key * * @return X coordinate of the upper left corner of the key */ public int getStartx() { return keyArea.x; } /** * Retrieves the Y coordinate of the upper left corner of the key * * @return Y coordinate of the upper left corner of the key */ public int getStarty() { return keyArea.y; } /** * Retrieves a rectangle that represents the key area at skin * * @return A rectangle that represents the key area at skin */ public Rectangle getKeyArea() { return keyArea; } /** * Tests if the key applies to the provided morphing mode * * @param morphingMode The morphing mode name * @return true if the key applies to the morphing mode; false otherwise */ public boolean hasMorphingMode(String morphingMode) { if (morphingMode != null) { return morphingModeCollection.contains(morphingMode); } else { return false; } } }