You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
351 lines
11 KiB
351 lines
11 KiB
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// comctrls.h
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
#include "FontInfo.H"
|
|
|
|
#ifndef MDT_COMON_CONTROLS
|
|
#define MDT_COMON_CONTROLS 1
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The classes defined below (CEditControlEditBox, CEditControlListBox) are
|
|
// used to implement a lighter weight, general purpose Edit control than the
|
|
// UFM Editor specific classes that are defined above. (A normal Edit Box is
|
|
// part of this Edit Control, too.)
|
|
|
|
class CEditControlListBox ; // Forward class declaration
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditControlEditBox window
|
|
|
|
class CEditControlEditBox : public CEdit
|
|
{
|
|
CEditControlListBox* m_pceclb ; // Pointer to related list box control
|
|
|
|
// Construction
|
|
public:
|
|
CEditControlEditBox(CEditControlListBox* pceclb) ;
|
|
|
|
// Attributes
|
|
public:
|
|
|
|
// Operations
|
|
public:
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CEditControlEditBox)
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
public:
|
|
virtual ~CEditControlEditBox();
|
|
|
|
// Generated message map functions
|
|
protected:
|
|
//{{AFX_MSG(CEditControlEditBox)
|
|
afx_msg void OnKillfocus();
|
|
//}}AFX_MSG
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CEditControlListBox window
|
|
|
|
class CEditControlListBox : public CListBox
|
|
{
|
|
CEdit* m_pceName ;
|
|
CEditControlEditBox* m_pcecebValue ;
|
|
bool m_bReady ; // True iff ready for operations
|
|
int m_nCurSelIdx ; // Currently selected item's index
|
|
|
|
// Construction
|
|
public:
|
|
CEditControlListBox(CEdit* pce, CEditControlEditBox* pceceb) ;
|
|
|
|
// Attributes
|
|
public:
|
|
|
|
// Operations
|
|
public:
|
|
bool Init(CStringArray& csamodels, CStringArray& csafiles, int ntabstop) ;
|
|
void SaveValue(void) ;
|
|
bool GetGPDInfo(CStringArray& csavalues, CStringArray* pcsanames = NULL) ;
|
|
void SelectLBEntry(int nidx, bool bsave = false) ;
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CEditControlListBox)
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
public:
|
|
virtual ~CEditControlListBox();
|
|
|
|
// Generated message map functions
|
|
protected:
|
|
//{{AFX_MSG(CEditControlListBox)
|
|
afx_msg void OnSelchange();
|
|
afx_msg void OnDblclk();
|
|
//}}AFX_MSG
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The classes defined below are for the CFullEditListCtrl and CFELCEditBox
|
|
// classes. Together, they support a List Control in Report View
|
|
// in which subitems can be edited too, complete rows can be selected, and
|
|
// the data can be sorted by numeric or text columns. CFELCEditBox is a
|
|
// helper class that is only used by CFullEditListCtrl.
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFELCEditBox Class
|
|
|
|
class CFELCEditBox : public CEdit
|
|
{
|
|
// Construction
|
|
public:
|
|
CFELCEditBox() ;
|
|
|
|
// Attributes
|
|
public:
|
|
|
|
// Operations
|
|
public:
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CFELCEditBox)
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
public:
|
|
virtual ~CFELCEditBox() ;
|
|
|
|
// Generated message map functions
|
|
protected:
|
|
//{{AFX_MSG(CFELCEditBox)
|
|
afx_msg void OnKillFocus(CWnd* pNewWnd) ;
|
|
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
|
|
//}}AFX_MSG
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
|
|
// The following structure(s), enumeration(s), and definitions are used with
|
|
// CFullEditListCtrl.
|
|
|
|
typedef enum {
|
|
COLDATTYPE_INT = 0, COLDATTYPE_STRING, COLDATTYPE_FLOAT, COLDATTYPE_TOGGLE,
|
|
COLDATTYPE_CUSTEDIT
|
|
} COLDATTYPE ;
|
|
|
|
|
|
typedef struct _COLINFO { // Maintains info on each column
|
|
int nwidth ; // The column width
|
|
bool beditable ; // True iff the column is editable
|
|
COLDATTYPE cdttype ; // The type of data in the column
|
|
bool bsortable ; // True iff the rows can be sorted on this column
|
|
bool basc ; // True iff the column has been sort ascended
|
|
LPCTSTR lpctstrtoggle ; // If toggle type, pointer to toggle string
|
|
} COLINFO, *PCOLINFO ;
|
|
|
|
|
|
#define COMPUTECOLWIDTH -1
|
|
#define SETWIDTHTOREMAINDER -2
|
|
|
|
|
|
// The following flags are used to indicate the toggle state of the list's
|
|
// columns. These values are assigned to m_dwToggleFlags.
|
|
|
|
#define TF_HASTOGGLECOLUMNS 1 // The list has toggle column(s)
|
|
#define TF_CLICKONROW 2 // Dbl-Clking on row toggles single column
|
|
#define TF_CLICKONCOLUMN 4 // Must dbl-clk on column (cell) to toggle it
|
|
|
|
|
|
// The following flags are used to indicate which one - if any - of the list's
|
|
// column's data may be modified via a custom edit routine in the class'
|
|
// owner. These values are assigned to m_dwCustEditFlags.
|
|
|
|
#define CEF_HASTOGGLECOLUMNS 1 // The list has a custom edit column
|
|
#define CEF_CLICKONROW 2 // Dbl-Clking on row activates single column
|
|
#define CEF_CLICKONCOLUMN 4 // Must dbl-clk on cell to activate dialog
|
|
|
|
|
|
// Miscellaneous flags used to control the behaviour of CFullEditListCtrl.
|
|
// These flags are passed to InitControl() in its dwmiscflags parameter.
|
|
|
|
#define MF_SENDCHANGEMESSAGE 1 // Send WM_LISTCELLCHANGED messages
|
|
#define MF_IGNOREINSERT 2 // Ignore INS key
|
|
#define MF_IGNOREDELETE 4 // Ignore DEL key
|
|
#define MF_IGNOREINSDEL 6 // Ignore INS and DEL key
|
|
|
|
|
|
// This message is sent - when requested - to a CFullEditListCtrl class
|
|
// instance's owner whenever a list cell is changed after the list had been
|
|
// initialized. (Yes, this really is better than having the owner handle
|
|
// LVN_ITEMCHANGED messages.)
|
|
|
|
#define WM_LISTCELLCHANGED (WM_USER + 999)
|
|
|
|
|
|
// A function of this type is passed to ExtraInit_CustEditCol() and called by
|
|
// CheckHandleCustEditColumn() when nonstandard editting is needed for a
|
|
// specific cell.
|
|
|
|
typedef bool (CALLBACK* LPCELLEDITPROC) (CObject* pcoowner, int nrow, int ncol,
|
|
CString* pcscontents) ;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFullEditListCtrl Class
|
|
|
|
class CFullEditListCtrl : public CListCtrl
|
|
{
|
|
// Constructor
|
|
public:
|
|
CFullEditListCtrl();
|
|
~CFullEditListCtrl();
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CFullEditListCtrl)
|
|
public:
|
|
virtual BOOL PreTranslateMessage(MSG* pMsg);
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
protected:
|
|
CFELCEditBox m_edit;
|
|
|
|
// Message maps
|
|
//{{AFX_MSG(CFullEditListCtrl)
|
|
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
|
|
afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);
|
|
afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
|
|
afx_msg void OnKeydown(NMHDR* pNMHDR, LRESULT* pResult);
|
|
afx_msg void OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult);
|
|
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
|
|
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
private:
|
|
PCOLINFO m_pciColInfo ; // Ptr to array of structs with column info
|
|
int m_nNumColumns ; // The number of columns in the list
|
|
int m_nSortColumn ; // Number of column being sorted
|
|
int m_nNextItemData ; // Next item data number to use
|
|
int m_nRow ; // Row being edited
|
|
int m_nColumn ; // Column being edited
|
|
DWORD m_dwToggleFlags ; // Flags indicating toggle flag for list
|
|
DWORD m_dwMiscFlags ; // Misc flags used to control list's actions
|
|
CObject* m_pcoOwner ; // Pointer to class that owns this one
|
|
DWORD m_dwCustEditFlags ; // Flags describing custom edit column
|
|
CUIntArray m_cuiaCustEditRows ;// Array indicating specific cust edit rows
|
|
LPCELLEDITPROC m_lpCellEditProc ; // Ptr to custom cell editing proc
|
|
|
|
public:
|
|
bool CheckHandleToggleColumns(int nrow, int ncol, PCOLINFO pci) ;
|
|
void InitControl(DWORD dwaddlexstyles, int numrows, int numcols,
|
|
DWORD dwtoggleflags = 0, int neditlen = 0,
|
|
int dwmiscflags = 0) ;
|
|
int InitLoadColumn(int ncolnum, LPCSTR strlabel, int nwidth, int nwidthpad,
|
|
bool beditable, bool bsortable, COLDATTYPE cdtdatatype,
|
|
CObArray* pcoadata, LPCTSTR lpctstrtoggle = NULL) ;
|
|
bool ExtraInit_CustEditCol(int ncolnum, CObject* pcoowner,
|
|
DWORD dwcusteditflags,
|
|
CUIntArray& cuiacusteditrows,
|
|
LPCELLEDITPROC lpcelleditproc) ;
|
|
bool CheckHandleCustEditColumn(int nrow, int ncol, PCOLINFO pci) ;
|
|
BOOL GetPointRowCol(LPPOINT lpPoint, int& iRow, int& iCol, CRect& rect) ;
|
|
BOOL GetColCellRect(LPPOINT lpPoint, int& iRow, int& iCol, CRect& rect) ;
|
|
bool SaveValue() ;
|
|
void HideEditBox() ;
|
|
bool GetColumnData(CObArray* pcoadata, int ncolnum) ;
|
|
bool SetColumnData(CObArray* pcoadata, int ncolnum) ;
|
|
static int CALLBACK SortListData(LPARAM lp1, LPARAM lp2, LPARAM lp3) ;
|
|
bool SortControl(int nsortcolumn) ;
|
|
void SingleSelect(int nitem) ;
|
|
bool GetRowData(int nrow, CStringArray& csafields) ;
|
|
int GetNumColumns() { return m_nNumColumns ; }
|
|
bool GetColSortOrder(int ncol) {
|
|
ASSERT(ncol >= 0 && ncol <= m_nNumColumns) ;
|
|
return ((m_pciColInfo + ncol)->basc) ;
|
|
} ;
|
|
bool EndEditing(bool bsave) ;
|
|
bool EditCurRowSpecCol(int ncolumn) ;
|
|
int GetCurRow() { return m_nRow ; }
|
|
void SetCurRow(int nrow) ;
|
|
int GetCurCol() { return m_nColumn ; }
|
|
void SendChangeNotification(int nrow, int ncol) ;
|
|
} ;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFlagsListBox window
|
|
|
|
class CFlagsListBox : public CListBox
|
|
{
|
|
// Construction
|
|
public:
|
|
CFlagsListBox();
|
|
|
|
// Attributes
|
|
public:
|
|
bool m_bReady ; // True iff listbox has been initialized
|
|
CUIntArray m_cuiaFlagGroupings ; // Flag groupings array
|
|
int m_nGrpCnt ; // Number of flag groupings
|
|
CString m_csSetString ; // String used to indicate a bit is set
|
|
int m_nNumFields ; // Number of flag fields in list box
|
|
bool m_bNoClear ; // True iff can't clear flags directly
|
|
int m_nNoClearGrp ; // Group for which m_bNoClear applies
|
|
|
|
// Operations
|
|
public:
|
|
bool Init(CStringArray& csafieldnames, DWORD dwsettings,
|
|
CUIntArray& cuiaflaggroupings, int ngrpcnt,
|
|
LPTSTR lptstrsetstring, int ntabstop, bool bnoclear = false,
|
|
int nocleargrp = -1) ;
|
|
bool Init2(CStringArray& csafieldnames, CString* pcssettings,
|
|
CUIntArray& cuiaflaggroupings, int ngrpcnt,
|
|
LPTSTR lptstrsetstring, int ntabstop, bool bnoclear = false,
|
|
int nocleargrp = -1) ;
|
|
DWORD GetNewFlagDWord() ;
|
|
void GetNewFlagString(CString* pcsflags, bool badd0x = true) ;
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CFlagsListBox)
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
public:
|
|
virtual ~CFlagsListBox();
|
|
|
|
// Generated message map functions
|
|
protected:
|
|
//{{AFX_MSG(CFlagsListBox)
|
|
afx_msg void OnDblclk();
|
|
//}}AFX_MSG
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//{{AFX_INSERT_LOCATION}}
|
|
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
|
|
|
|
|
|
#endif // #define MDT_COMON_CONTROLS
|
|
|
|
|
|
|