| // | 
 | // Copyright 2005 The Android Open Source Project | 
 | // | 
 | // Simulated device data. | 
 | // | 
 |  | 
 | // For compilers that support precompilation, include "wx/wx.h". | 
 | #include "wx/wxprec.h" | 
 |  | 
 | // Otherwise, include all standard headers | 
 | #ifndef WX_PRECOMP | 
 | # include "wx/wx.h" | 
 | #endif | 
 | #include "wx/image.h"   // needed for Windows build | 
 |  | 
 | #include "LinuxKeys.h" | 
 | #include "PhoneButton.h" | 
 |  | 
 | using namespace android; | 
 |  | 
 |  | 
 | /* | 
 |  * Create a PhoneButton without a backing image. | 
 |  */ | 
 | bool PhoneButton::Create(const char* label) | 
 | { | 
 |     assert(!mHasImage);     // quick check for re-use | 
 |  | 
 |     mKeyCode = LookupKeyCode(label); | 
 |     if (mKeyCode == kKeyCodeUnknown) { | 
 |         fprintf(stderr, "WARNING: key code '%s' not recognized\n", label); | 
 |         // keep going | 
 |     } | 
 |  | 
 |     return true; | 
 | } | 
 |  | 
 | /* | 
 |  * Create a PhoneButton with an associated image.  Don't load the image yet. | 
 |  */ | 
 | bool PhoneButton::Create(const char* label, const char* imageFileName, | 
 |     int x, int y) | 
 | { | 
 |     if (!Create(label)) | 
 |         return false; | 
 |  | 
 |     if (mSelectedImage.Create(imageFileName, x, y)) | 
 |         mHasImage = true; | 
 |     else | 
 |         fprintf(stderr, "Warning: image create (%s, %d, %d) failed\n", | 
 |             imageFileName, x, y); | 
 |  | 
 |     return true; | 
 | } | 
 |  | 
 | /* | 
 |  * Load the image, if any. | 
 |  */ | 
 | bool PhoneButton::LoadResources(void) | 
 | { | 
 |     if (!mHasImage) | 
 |         return true;        // no image associated with this button | 
 |  | 
 |     bool result = mSelectedImage.LoadResources(); | 
 |     if (result) | 
 |         CreateHighlightedBitmap(); | 
 |     return result; | 
 | } | 
 |  | 
 | /* | 
 |  * Unload the image if we loaded one. | 
 |  */ | 
 | bool PhoneButton::UnloadResources(void) | 
 | { | 
 |     if (!mHasImage) | 
 |         return true; | 
 |  | 
 |     return mSelectedImage.UnloadResources(); | 
 | } | 
 |  | 
 | /* use an inline instead of macro so we don't evaluate args multiple times */ | 
 | static inline int MinVal(int a, int b) { return (a < b ? a : b); } | 
 |  | 
 | /* | 
 |  * Create the "highlighted" bitmap from the "selected" image. | 
 |  */ | 
 | void PhoneButton::CreateHighlightedBitmap(void) | 
 | { | 
 |     wxBitmap* src = mSelectedImage.GetBitmap(); | 
 |     assert(src != NULL); | 
 |     wxImage tmpImage = src->ConvertToImage(); | 
 |  | 
 |     unsigned char* pRGB = tmpImage.GetData();       // top-left RGBRGB... | 
 |     int x, y; | 
 |  | 
 |     /* | 
 |      * Modify the color used for the "highlight" image. | 
 |      */ | 
 |     for (y = tmpImage.GetHeight()-1; y >= 0; --y) { | 
 |         for (x = tmpImage.GetWidth()-1; x >= 0; --x) { | 
 |             *(pRGB)   = MinVal(*(pRGB)   + *(pRGB) / 8, 255); | 
 |             *(pRGB+1) = MinVal(*(pRGB+1) + *(pRGB+1) / 8, 255); | 
 |             *(pRGB+2) = *(pRGB+2) * 5 / 8; | 
 |  | 
 |             pRGB += 3; | 
 |         } | 
 |     } | 
 |  | 
 |     mHighlightedBitmap = wxBitmap(tmpImage); | 
 | } | 
 |  | 
 | /* | 
 |  * Check to see if the button "collides" with the specified point. | 
 |  * | 
 |  * This is currently a simple rectangle check, but could be modified | 
 |  * to take image transparency into account. | 
 |  */ | 
 | bool PhoneButton::CheckCollision(int x, int y) const | 
 | { | 
 |     if (!mHasImage) | 
 |         return false; | 
 |  | 
 |     return (x >= mSelectedImage.GetX() && | 
 |             x < mSelectedImage.GetX() + mSelectedImage.GetWidth() && | 
 |             y >= mSelectedImage.GetY() && | 
 |             y < mSelectedImage.GetY() + mSelectedImage.GetHeight()); | 
 | } | 
 |  | 
 | /* | 
 |  * Look up a key code based on a string. | 
 |  * | 
 |  * Returns kKeyCodeUnknown if the label doesn't match anything. | 
 |  */ | 
 | KeyCode PhoneButton::LookupKeyCode(const char* label) const | 
 | { | 
 |     static const struct { | 
 |         const char* label; | 
 |         int keyCode; | 
 |     } codeList[] = { | 
 |         { "soft-left",      KEY_MENU }, | 
 |         { "soft-right",     KEY_KBDILLUMUP }, | 
 |         { "home",           KEY_HOME }, | 
 |         { "back",           KEY_BACK }, | 
 |         { "call",           KEY_F3 }, | 
 |         { "phone-dial",     KEY_F3 }, | 
 |         { "end-call",       KEY_F4 }, | 
 |         { "phone-hangup",   KEY_F4 }, | 
 |         { "0",              KEY_0 }, | 
 |         { "1",              KEY_1 }, | 
 |         { "2",              KEY_2 }, | 
 |         { "3",              KEY_3 }, | 
 |         { "4",              KEY_4 }, | 
 |         { "5",              KEY_5 }, | 
 |         { "6",              KEY_6 }, | 
 |         { "7",              KEY_7 }, | 
 |         { "8",              KEY_8 }, | 
 |         { "9",              KEY_9 }, | 
 |         { "star",           KEY_SWITCHVIDEOMODE }, | 
 |         { "pound",          KEY_KBDILLUMTOGGLE }, | 
 |         { "dpad-up",        KEY_UP }, | 
 |         { "dpad-down",      KEY_DOWN }, | 
 |         { "dpad-left",      KEY_LEFT }, | 
 |         { "dpad-right",     KEY_RIGHT }, | 
 |         { "dpad-center",    KEY_REPLY }, | 
 |         { "volume-up",      KEY_VOLUMEUP }, | 
 |         { "volume-down",    KEY_VOLUMEDOWN }, | 
 |         { "power",          KEY_POWER }, | 
 |         { "camera",         KEY_CAMERA }, | 
 |         //{ "clear",          kKeyCodeClear }, | 
 |     }; | 
 |     const int numCodes = sizeof(codeList) / sizeof(codeList[0]); | 
 |  | 
 |     for (int i = 0; i < numCodes; i++) { | 
 |         if (strcmp(label, codeList[i].label) == 0) | 
 |             return (KeyCode) codeList[i].keyCode; | 
 |     } | 
 |  | 
 |     return kKeyCodeUnknown; | 
 | }; | 
 |  |