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