/****************************************************************************** * File: CDeviceUI.h * * Desc: * * CDeviceUI is a helper that holds all the views and a bunch of * information for a specific device. It has a CFlexWnd whose * handler it sets to the CDeviceView for the current view, * thus reusing one window to implement multiple pages. * * All CDeviceViews and CDeviceControls have a reference to the CDeviceUI * that created them (m_ui). Thus, they also have access to the * CUIGlobals, since CDeviceUI has a reference to them (m_ui.m_uig). * CDeviceUI also provides the following read-only public variables * for convenience, all referring to the device this CDeviceUI * represents: * * const DIDEVICEINSTANCEW &m_didi; * const LPDIRECTINPUTDEVICE8W &m_lpDID; * const DIDEVOBJSTRUCT &m_os; * * See usefuldi.h for a description of DIDEVOBJSTRUCT. * * CDeviceUI communicates to the rest of the UI via the CDeviceUINotify * abstract base class. Another class (in our case CDIDeviceActionConfigPage) * must derive from CDeviceUINotify, and define the DeviceUINotify() and * IsControlMapped() virtual functions. This derived class must be passed as * the last parameter to CDeviceUI's Init() function. All the views and * controls within the views notify the UI of user actions via m_ui.Notify(), * so that all actionformat manipulation can be done in the page class. The * views and controls themselves never touch the actionformat. See the * DEVICEUINOTIFY structure below for information on the parameter passed * through Notify()/DeviceUINotify(). * * Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved. * ***************************************************************************/ #ifdef FORWARD_DECLS struct DEVICEUINOTIFY; struct UIDELETENOTE; class CDeviceUINotify; class CDeviceUI; #else // FORWARD_DECLS #ifndef __CDEVICEUI_H__ #define __CDEVICEUI_H__ enum { DEVUINM_NUMVIEWSCHANGED, DEVUINM_ONCONTROLDESTROY, DEVUINM_MOUSEOVER, DEVUINM_CLICK, DEVUINM_DOUBLECLICK, DEVUINM_SELVIEW, DEVUINM_INVALID, DEVUINM_UNASSIGNCALLOUT, DEVUINM_RENEWDEVICE }; enum { DEVUINFROM_CONTROL, DEVUINFROM_THUMBNAIL, DEVUINFROM_SELWND, DEVUINFROM_VIEWWND, DEVUINFROM_INVALID }; struct DEVICEUINOTIFY { DEVICEUINOTIFY() : msg(DEVUINM_INVALID), from(DEVUINFROM_INVALID) {} int msg; int from; union { struct { CDeviceControl *pControl; } control; struct { CDeviceView *pView; BOOL bSelected; } thumbnail; struct { int dummy; } selwnd; struct { int dummy; } viewwnd; }; union { struct { int nView; } selview; struct { POINT point; } mouseover; struct { BOOL bLeftButton; } click; }; }; enum UIDELETENOTETYPE { UIDNT_VIEW, UIDNT_CONTROL, }; struct UIDELETENOTE { UIDELETENOTETYPE eType; int nViewIndex; int nControlIndex; DWORD dwObjID; }; typedef void (*DEVCTRLCALLBACK)(CDeviceControl *, LPVOID, BOOL); class CDeviceUINotify { public: virtual void DeviceUINotify(const DEVICEUINOTIFY &) = 0; virtual BOOL IsControlMapped(CDeviceControl *) = 0; }; class CDeviceUI { public: CDeviceUI(CUIGlobals &uig, IDIConfigUIFrameWindow &uif); ~CDeviceUI(); // intialization HRESULT Init(const DIDEVICEINSTANCEW &didi, LPDIRECTINPUTDEVICE8W lpDID, HWND hWnd, CDeviceUINotify *pNotify); // view state void SetView(int nView); void SetView(CDeviceView *pView); CDeviceView *GetView(int nView); CDeviceView *GetCurView(); int GetViewIndex(CDeviceView *pView); int GetCurViewIndex(); int GetNumViews() {return m_arpView.GetSize();} void NextView() {SetView((GetCurViewIndex() + 1) % GetNumViews());} void PrevView() {SetView((GetCurViewIndex() - 1 + GetNumViews()) % GetNumViews());} // gets the thumbnail for the specified view, // using the selected version if the view is selected CBitmap *GetViewThumbnail(int nView); // gets the thumbnail for the specified view, // specifiying whether or not we want the selected version CBitmap *GetViewThumbnail(int nView, BOOL bSelected); // for view/control to notify void Notify(const DEVICEUINOTIFY &uin) {if (m_pNotify != NULL) m_pNotify->DeviceUINotify(uin);} // device control access void SetAllControlCaptionsTo(LPCTSTR tszCaption); void SetCaptionForControlsAtOffset(DWORD dwOffset, LPCTSTR tszCaption, BOOL bFixed = FALSE); void DoForAllControls(DEVCTRLCALLBACK callback, LPVOID pVoid, BOOL bFixed = FALSE); void DoForAllControlsAtOffset(DWORD dwOffset, DEVCTRLCALLBACK callback, LPVOID pVoid, BOOL bFixed = FALSE); // page querying BOOL IsControlMapped(CDeviceControl *); // other void GetDeviceInstanceGuid(GUID &rGuid) {rGuid = m_didi.guidInstance;} // editing void SetEditMode(BOOL bEdit = TRUE); BOOL InEditMode() {return m_bInEditMode;} void Remove(CDeviceView *pView); void RemoveAll(); #define NVT_USER 1 #define NVT_POPULATE 2 #define NVT_REQUIREATLEASTONE 3 CDeviceView *NewView(); CDeviceView *UserNewView(); void RequireAtLeastOneView(); //@@BEGIN_MSINTERNAL #ifdef DDKBUILD void SetStateIndication(LPCTSTR) {} void EndStateIndication() {} BOOL WriteToINI(); #endif //@@END_MSINTERNAL void SetDevice(LPDIRECTINPUTDEVICE8W lpDID); // Sets the device object that we are using //@@BEGIN_MSINTERNAL #ifdef DDKBUILD // deletion noting void NoteDeleteView(CDeviceView *pView); void NoteDeleteView(int nView); void NoteDeleteControl(CDeviceControl *pControl); void NoteDeleteControl(int nView, int nControl, DWORD dwObjID); void NoteDeleteAllControlsForView(CDeviceView *pView); void NoteDeleteAllViews(); // deletion querying int GetNumDeleteNotes(); BOOL GetDeleteNote(UIDELETENOTE &uidn, int i); void ClearDeleteNotes(); // deletion debugging void DumpDeleteNotes(); #endif //@@END_MSINTERNAL // drawing void Invalidate(); // clearing void Unpopulate(); private: // delete notes CArray m_DeleteNotes; // who we're going to notify CDeviceUINotify *m_pNotify; HWND m_hWnd; // view state CArray m_arpView; CDeviceView *m_pCurView; BOOL m_bInEditMode; RECT m_ViewRect; void NumViewsChanged(); // device globals... public: // full access to ui globals and frame CUIGlobals &m_uig; IDIConfigUIFrameWindow &m_UIFrame; // read only public access versions const DIDEVICEINSTANCEW &m_didi; const LPDIRECTINPUTDEVICE8W &m_lpDID; const DIDEVOBJSTRUCT &m_os; private: // private versions DIDEVICEINSTANCEW m_priv_didi; LPDIRECTINPUTDEVICE8W m_priv_lpDID; DIDEVOBJSTRUCT m_priv_os; }; #endif //__CDEVICEUI_H__ #endif // FORWARD_DECLS