259 lines
6.4 KiB
C++
259 lines
6.4 KiB
C++
/******************************************************************************
|
|
* 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<UIDELETENOTE, UIDELETENOTE &> m_DeleteNotes;
|
|
|
|
// who we're going to notify
|
|
CDeviceUINotify *m_pNotify;
|
|
HWND m_hWnd;
|
|
|
|
// view state
|
|
CArray<CDeviceView *, CDeviceView *&> 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
|