blob: e66bae031f5746dc0b5a14d635ddd64f748d11be [file] [log] [blame]
/*
* 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;
}
}
}