// // 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