Home | History | Annotate | Download | only in app
      1 //
      2 // Copyright 2005 The Android Open Source Project
      3 //
      4 // Window with simulated phone.
      5 //
      6 #ifndef _SIM_PHONE_WINDOW_H
      7 #define _SIM_PHONE_WINDOW_H
      8 
      9 #include "PhoneData.h"
     10 #include "DeviceManager.h"
     11 #include "DeviceWindow.h"
     12 #include <ui/KeycodeLabels.h>
     13 
     14 class MainFrame;
     15 
     16 /*
     17  * This window displays the simulated phone views, and handles keyboard and
     18  * mouse input.
     19  *
     20  * If we switch to a different "mode", we may display different "views",
     21  * but the set of "displays" remains the same.  (Got that?)
     22  *
     23  * We can't just do these things in the main frame because we can't easily
     24  * grab the keyboard input.
     25  */
     26 class PhoneWindow : public wxDialog {
     27 public:
     28     PhoneWindow(wxWindow* parent, const wxPoint& posn);
     29     virtual ~PhoneWindow(void);
     30 
     31     /* call this initially, and after a mode change */
     32     bool Setup(int phoneIdx);
     33 
     34     bool IsReady(void) const {
     35         return (mNumViewInfo > 0 && mpViewInfo != NULL);
     36     }
     37 
     38     PhoneData* GetPhoneData(void) const;
     39 
     40     const wxString& GetCurrentMode(void) const { return mCurrentMode; }
     41     void SetCurrentMode(const wxString& mode) { mCurrentMode = mode; }
     42     void SetCurrentMode(const char* mode) { mCurrentMode = wxString::FromAscii(mode); }
     43 
     44     DeviceManager* GetDeviceManager(void) { return &mDeviceManager; }
     45 
     46     /* this is called when the phone data is reloaded */
     47     void DevicesRescanned(void);
     48 
     49     void Vibrate(int vibrateOn);
     50 
     51 private:
     52     /*
     53      * Hold some information about the "views" being shown in our window.
     54      */
     55     class ViewInfo {
     56     public:
     57         ViewInfo(void)
     58             : mX(-1), mY(-1), mDisplayX(-1), mDisplayY(-1),
     59               mWidth(-1), mHeight(-1), mDisplayIndex(-1)
     60         {}
     61         ~ViewInfo(void) {}
     62 
     63         int GetX(void) const { return mX; }
     64         int GetY(void) const { return mY; }
     65         int GetDisplayX(void) const { return mDisplayX; }
     66         int GetDisplayY(void) const { return mDisplayY; }
     67         int GetWidth(void) const { return mWidth; }
     68         int GetHeight(void) const { return mHeight; }
     69         int GetDisplayIndex(void) const { return mDisplayIndex; }
     70 
     71         void SetX(int val) { mX = val; }
     72         void SetY(int val) { mY = val; }
     73         void SetDisplayX(int val) { mDisplayX = val; }
     74         void SetDisplayY(int val) { mDisplayY = val; }
     75         void SetWidth(int val) { mWidth = val; }
     76         void SetHeight(int val) { mHeight = val; }
     77         void SetDisplayIndex(int val) { mDisplayIndex = val; }
     78 
     79     private:
     80         int     mX, mY;                 // view offset within PhoneWindow
     81         int     mDisplayX, mDisplayY;   // display offset within view
     82         int     mWidth, mHeight;        // view dimensions
     83 
     84         int     mDisplayIndex;          // index into mpDeviceWindow
     85     };
     86 
     87     /*
     88      * Hold information about currently pressed keys.
     89      */
     90     class KeyInfo {
     91     public:
     92         KeyInfo(void) : mKeyCode(AKEYCODE_UNKNOWN) {}
     93         KeyInfo(const KeyInfo& src) {
     94             mKeyCode = src.mKeyCode;
     95         }
     96         ~KeyInfo(void) {}
     97 
     98         KeyInfo& operator=(const KeyInfo& src) {
     99             if (this != &src) {
    100                 mKeyCode = src.mKeyCode;
    101             }
    102             return *this;
    103         }
    104 
    105         int32_t GetKeyCode(void) const { return mKeyCode; }
    106         void SetKeyCode(int32_t keyCode) { mKeyCode = keyCode; }
    107 
    108         //PhoneButton* GetPhoneButton(void) const { return mpButton; }
    109         //void SetPhoneButton(PhoneButton* pButton) { mpButton = pButton; }
    110 
    111     private:
    112         int32_t mKeyCode;
    113         //PhoneButton*        mpButton;
    114     };
    115 
    116     void OnActivate(wxActivateEvent& event);
    117     void OnMove(wxMoveEvent& event);
    118     void OnClose(wxCloseEvent& event);
    119     void OnTimer(wxTimerEvent& event);
    120     void OnKeyDown(wxKeyEvent& event);
    121     void OnKeyUp(wxKeyEvent& event);
    122     void OnErase(wxEraseEvent& event);
    123     void OnPaint(wxPaintEvent& WXUNUSED(event));
    124     void OnMouseLeftDown(wxMouseEvent& event);
    125     void OnMouseLeftUp(wxMouseEvent& event);
    126     void OnMouseRightDown(wxMouseEvent& event);
    127     void OnMouseRightUp(wxMouseEvent& event);
    128     void OnMouseMotion(wxMouseEvent& event);
    129     void OnMouseLeaveWindow(wxMouseEvent& WXUNUSED(event));
    130     bool GetTouchPosition(const wxMouseEvent& event, int* pScreenX,
    131         int* pScreenY);
    132 
    133     bool GetDimensions(PhoneData* pPhoneData, PhoneView* pPhoneView,
    134         ViewInfo* pDim);
    135     int ConvertKeyCode(int wxKeyCode) const;
    136 
    137     /* press a key on the device */
    138     void AddPressedKey(int32_t keyCode);
    139     /* release a key on the device */
    140     void RemovePressedKey(int32_t keyCode);
    141     /* "raise" all keys */
    142     void ClearPressedKeys(void);
    143     /* determine whether a key is down */
    144     bool IsKeyPressed(int32_t keyCode);
    145 
    146     /* manage the device runtime */
    147     DeviceManager   mDeviceManager;
    148 
    149     /* button mouse-over highlight handling */
    150     int             mpMOHViewIndex;     // mouse is in this view
    151     PhoneButton*    mpMOHButton;        //   over this button
    152     int32_t         mMouseKeySent;     // to handle "key up" for mouse button
    153 
    154     /* handle multiple simultaneous key presses */
    155     android::List<KeyInfo>  mPressedKeys;
    156     typedef android::List<KeyInfo>::iterator ListIter;
    157 
    158     /* ViewInfos, 1:1 with PhoneView entries for the current mode */
    159     ViewInfo*       mpViewInfo;         // array of view data
    160     int             mNumViewInfo;       // #of elements in mpViewInfo
    161 
    162     /* DeviceWindows, 1:1 with PhoneDisplay entries for this device */
    163     DeviceWindow**  mpDeviceWindow;     // array of pointers to device windows
    164     int             mNumDeviceWindows;  // #of device windows
    165 
    166     /* state */
    167     int             mPhoneModel;        // index into model list
    168     wxString        mCurrentMode;
    169 
    170     bool            mPlacementChecked;  // leave it offscreen if they want
    171 
    172     MainFrame*      mpParent;           // retain pointer to parent window
    173 
    174     enum { kVibrateTimerId = 1010 };
    175     wxTimer         mTimer;
    176     int             mVibrateX;
    177 
    178     /* touchscreen simulation */
    179     bool            mTrackingTouch;
    180     int             mTouchX;
    181     int             mTouchY;
    182 
    183     DECLARE_EVENT_TABLE()
    184 };
    185 
    186 #endif // _SIM_PHONE_WINDOW_H
    187