|  | // | 
|  | // Copyright 2005 The Android Open Source Project | 
|  | // | 
|  | // Window with simulated phone. | 
|  | // | 
|  | #ifndef _SIM_PHONE_WINDOW_H | 
|  | #define _SIM_PHONE_WINDOW_H | 
|  |  | 
|  | #include "PhoneData.h" | 
|  | #include "DeviceManager.h" | 
|  | #include "DeviceWindow.h" | 
|  | #include <ui/KeycodeLabels.h> | 
|  |  | 
|  | class MainFrame; | 
|  |  | 
|  | /* | 
|  | * This window displays the simulated phone views, and handles keyboard and | 
|  | * mouse input. | 
|  | * | 
|  | * If we switch to a different "mode", we may display different "views", | 
|  | * but the set of "displays" remains the same.  (Got that?) | 
|  | * | 
|  | * We can't just do these things in the main frame because we can't easily | 
|  | * grab the keyboard input. | 
|  | */ | 
|  | class PhoneWindow : public wxDialog { | 
|  | public: | 
|  | PhoneWindow(wxWindow* parent, const wxPoint& posn); | 
|  | virtual ~PhoneWindow(void); | 
|  |  | 
|  | /* call this initially, and after a mode change */ | 
|  | bool Setup(int phoneIdx); | 
|  |  | 
|  | bool IsReady(void) const { | 
|  | return (mNumViewInfo > 0 && mpViewInfo != NULL); | 
|  | } | 
|  |  | 
|  | PhoneData* GetPhoneData(void) const; | 
|  |  | 
|  | const wxString& GetCurrentMode(void) const { return mCurrentMode; } | 
|  | void SetCurrentMode(const wxString& mode) { mCurrentMode = mode; } | 
|  | void SetCurrentMode(const char* mode) { mCurrentMode = wxString::FromAscii(mode); } | 
|  |  | 
|  | DeviceManager* GetDeviceManager(void) { return &mDeviceManager; } | 
|  |  | 
|  | /* this is called when the phone data is reloaded */ | 
|  | void DevicesRescanned(void); | 
|  |  | 
|  | void Vibrate(int vibrateOn); | 
|  |  | 
|  | private: | 
|  | /* | 
|  | * Hold some information about the "views" being shown in our window. | 
|  | */ | 
|  | class ViewInfo { | 
|  | public: | 
|  | ViewInfo(void) | 
|  | : mX(-1), mY(-1), mDisplayX(-1), mDisplayY(-1), | 
|  | mWidth(-1), mHeight(-1), mDisplayIndex(-1) | 
|  | {} | 
|  | ~ViewInfo(void) {} | 
|  |  | 
|  | int GetX(void) const { return mX; } | 
|  | int GetY(void) const { return mY; } | 
|  | int GetDisplayX(void) const { return mDisplayX; } | 
|  | int GetDisplayY(void) const { return mDisplayY; } | 
|  | int GetWidth(void) const { return mWidth; } | 
|  | int GetHeight(void) const { return mHeight; } | 
|  | int GetDisplayIndex(void) const { return mDisplayIndex; } | 
|  |  | 
|  | void SetX(int val) { mX = val; } | 
|  | void SetY(int val) { mY = val; } | 
|  | void SetDisplayX(int val) { mDisplayX = val; } | 
|  | void SetDisplayY(int val) { mDisplayY = val; } | 
|  | void SetWidth(int val) { mWidth = val; } | 
|  | void SetHeight(int val) { mHeight = val; } | 
|  | void SetDisplayIndex(int val) { mDisplayIndex = val; } | 
|  |  | 
|  | private: | 
|  | int     mX, mY;                 // view offset within PhoneWindow | 
|  | int     mDisplayX, mDisplayY;   // display offset within view | 
|  | int     mWidth, mHeight;        // view dimensions | 
|  |  | 
|  | int     mDisplayIndex;          // index into mpDeviceWindow | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Hold information about currently pressed keys. | 
|  | */ | 
|  | class KeyInfo { | 
|  | public: | 
|  | KeyInfo(void) : mKeyCode(AKEYCODE_UNKNOWN) {} | 
|  | KeyInfo(const KeyInfo& src) { | 
|  | mKeyCode = src.mKeyCode; | 
|  | } | 
|  | ~KeyInfo(void) {} | 
|  |  | 
|  | KeyInfo& operator=(const KeyInfo& src) { | 
|  | if (this != &src) { | 
|  | mKeyCode = src.mKeyCode; | 
|  | } | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | int32_t GetKeyCode(void) const { return mKeyCode; } | 
|  | void SetKeyCode(int32_t keyCode) { mKeyCode = keyCode; } | 
|  |  | 
|  | //PhoneButton* GetPhoneButton(void) const { return mpButton; } | 
|  | //void SetPhoneButton(PhoneButton* pButton) { mpButton = pButton; } | 
|  |  | 
|  | private: | 
|  | int32_t mKeyCode; | 
|  | //PhoneButton*        mpButton; | 
|  | }; | 
|  |  | 
|  | void OnActivate(wxActivateEvent& event); | 
|  | void OnMove(wxMoveEvent& event); | 
|  | void OnClose(wxCloseEvent& event); | 
|  | void OnTimer(wxTimerEvent& event); | 
|  | void OnKeyDown(wxKeyEvent& event); | 
|  | void OnKeyUp(wxKeyEvent& event); | 
|  | void OnErase(wxEraseEvent& event); | 
|  | void OnPaint(wxPaintEvent& WXUNUSED(event)); | 
|  | void OnMouseLeftDown(wxMouseEvent& event); | 
|  | void OnMouseLeftUp(wxMouseEvent& event); | 
|  | void OnMouseRightDown(wxMouseEvent& event); | 
|  | void OnMouseRightUp(wxMouseEvent& event); | 
|  | void OnMouseMotion(wxMouseEvent& event); | 
|  | void OnMouseLeaveWindow(wxMouseEvent& WXUNUSED(event)); | 
|  | bool GetTouchPosition(const wxMouseEvent& event, int* pScreenX, | 
|  | int* pScreenY); | 
|  |  | 
|  | bool GetDimensions(PhoneData* pPhoneData, PhoneView* pPhoneView, | 
|  | ViewInfo* pDim); | 
|  | int ConvertKeyCode(int wxKeyCode) const; | 
|  |  | 
|  | /* press a key on the device */ | 
|  | void AddPressedKey(int32_t keyCode); | 
|  | /* release a key on the device */ | 
|  | void RemovePressedKey(int32_t keyCode); | 
|  | /* "raise" all keys */ | 
|  | void ClearPressedKeys(void); | 
|  | /* determine whether a key is down */ | 
|  | bool IsKeyPressed(int32_t keyCode); | 
|  |  | 
|  | /* manage the device runtime */ | 
|  | DeviceManager   mDeviceManager; | 
|  |  | 
|  | /* button mouse-over highlight handling */ | 
|  | int             mpMOHViewIndex;     // mouse is in this view | 
|  | PhoneButton*    mpMOHButton;        //   over this button | 
|  | int32_t         mMouseKeySent;     // to handle "key up" for mouse button | 
|  |  | 
|  | /* handle multiple simultaneous key presses */ | 
|  | android::List<KeyInfo>  mPressedKeys; | 
|  | typedef android::List<KeyInfo>::iterator ListIter; | 
|  |  | 
|  | /* ViewInfos, 1:1 with PhoneView entries for the current mode */ | 
|  | ViewInfo*       mpViewInfo;         // array of view data | 
|  | int             mNumViewInfo;       // #of elements in mpViewInfo | 
|  |  | 
|  | /* DeviceWindows, 1:1 with PhoneDisplay entries for this device */ | 
|  | DeviceWindow**  mpDeviceWindow;     // array of pointers to device windows | 
|  | int             mNumDeviceWindows;  // #of device windows | 
|  |  | 
|  | /* state */ | 
|  | int             mPhoneModel;        // index into model list | 
|  | wxString        mCurrentMode; | 
|  |  | 
|  | bool            mPlacementChecked;  // leave it offscreen if they want | 
|  |  | 
|  | MainFrame*      mpParent;           // retain pointer to parent window | 
|  |  | 
|  | enum { kVibrateTimerId = 1010 }; | 
|  | wxTimer         mTimer; | 
|  | int             mVibrateX; | 
|  |  | 
|  | /* touchscreen simulation */ | 
|  | bool            mTrackingTouch; | 
|  | int             mTouchX; | 
|  | int             mTouchY; | 
|  |  | 
|  | DECLARE_EVENT_TABLE() | 
|  | }; | 
|  |  | 
|  | #endif // _SIM_PHONE_WINDOW_H |