You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

531 lines
21 KiB
C++

// XTPReportInplaceControls.h
//
// This file is a part of the XTREME REPORTCONTROL MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPREPORTINPLACECONTROLS_H__)
#define __XTPREPORTINPLACECONTROLS_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPReportRecord;
class CXTPReportControl;
class CXTPReportRecordItem;
class CXTPReportRecordItemConstraints;
class CXTPReportRecordItemConstraint;
//===========================================================================
// Summary:
// CXTPReportInplaceControl is the base class for all in-place controls of
// report control item.
// Remarks:
// There are 3 built-in in-place controls for Report control item:
// * CXTPReportInplaceEdit - represents edit control to allow users change cell
// of report control
// * CXTPReportInplaceButton - represents single button of item.
// * CXTPReportInplaceList - represents in-place list box to allow user select
// constraints of report item
// See Also: CXTPReportInplaceEdit, CXTPReportInplaceButton, CXTPReportInplaceList
//===========================================================================
class _XTP_EXT_CLASS CXTPReportInplaceControl : public XTP_REPORTRECORDITEM_ARGS
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPReportInplaceControl object
//-----------------------------------------------------------------------
CXTPReportInplaceControl();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPReportInplaceControl object, handles cleanup
// and deallocation.
//-----------------------------------------------------------------------
virtual ~CXTPReportInplaceControl();
protected:
//-------------------------------------------------------------------------
// Summary:
// This method is called internal to fill item arguments of in-place control
// Parameters:
// pItemArgs - Arguments of item.
//-------------------------------------------------------------------------
virtual void SetItemArgs(XTP_REPORTRECORDITEM_ARGS* pItemArgs);
};
//===========================================================================
// Summary:
// CXTPReportInplaceEdit is the CXTPReportInplaceControl derived class,
// it represents edit control to allow users change cell of report control.
//===========================================================================
class _XTP_EXT_CLASS CXTPReportInplaceEdit : public CEdit, public CXTPReportInplaceControl
{
DECLARE_DYNAMIC(CXTPReportInplaceEdit)
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPReportInplaceEdit object
//-----------------------------------------------------------------------
CXTPReportInplaceEdit();
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPReportInplaceEdit object, handles cleanup
// and deallocation.
//-----------------------------------------------------------------------
virtual ~CXTPReportInplaceEdit();
public:
//-------------------------------------------------------------------------
// Summary:
// This method is called to hide in-place edit control
//-------------------------------------------------------------------------
void HideWindow();
//-----------------------------------------------------------------------
// Summary:
// This member function retrieves a child report control item
// Returns:
// A pointer to a CXTPReportRecordItem
//-----------------------------------------------------------------------
CXTPReportRecordItem* GetItem() const;
//-----------------------------------------------------------------------
// Summary:
// Call this method to create in-place edit control.
// Parameters:
// pItemArgs - Parameters of item cell.
//-----------------------------------------------------------------------
void Create(XTP_REPORTRECORDITEM_ARGS* pItemArgs);
//-----------------------------------------------------------------------
// Summary:
// Call this method to set edit text.
// Parameters:
// lpszString - String to set.
//-----------------------------------------------------------------------
void SetWindowText(LPCTSTR lpszString);
protected:
//-----------------------------------------------------------------------
// Summary:
// This method is called to change font of in-place edit control
// Parameters:
// pFont - New font to be set.
//-----------------------------------------------------------------------
void SetFont(CFont* pFont);
protected:
//{{AFX_CODEJOCK_PRIVATE
DECLARE_MESSAGE_MAP()
//{{AFX_VIRTUAL(CXTPReportInplaceControl)
virtual BOOL PreTranslateMessage(MSG* pMsg);
//}}AFX_VIRTUAL
//{{AFX_MSG(CXTPReportInplaceControl)
afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
afx_msg void OnEnKillfocus();
afx_msg void OnEnChange();
afx_msg UINT OnGetDlgCode();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg HBRUSH CtlColor(CDC* pDC, UINT /*nCtlColor*/);
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
private:
BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
protected:
CString m_strValue; // The value of item before user change it.
CString m_strText_prev; // The text value from previous change.
CFont m_fntEdit; // Font of in-place edit.
CXTPReportRecordItemConstraint* m_pSelectedConstraint; // Selected constraint.
COLORREF m_clrText; // Text color of in-place edit.
BOOL m_bSetWindowText; // Indicates that text is being set with SetWindowText function.
//private:
friend class CXTPReportRecordItem;
};
AFX_INLINE CXTPReportRecordItem* CXTPReportInplaceEdit::GetItem() const
{
return pItem;
}
AFX_INLINE BOOL CXTPReportInplaceEdit::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
AFX_INLINE BOOL CXTPReportInplaceEdit::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
return CEdit::Create(dwStyle, rect, pParentWnd, nID);
}
const UINT XTP_ID_REPORT_EXPANDBUTTON = 100; //<ALIAS CXTPReportInplaceButton::CXTPReportInplaceButton@UINT>
const UINT XTP_ID_REPORT_COMBOBUTTON = 101; //<ALIAS CXTPReportInplaceButton::CXTPReportInplaceButton@UINT>
const UINT XTP_ID_REPORT_SPINBUTTON = 102; //<ALIAS CXTPReportInplaceButton::CXTPReportInplaceButton@UINT>
//===========================================================================
// Summary:
// CXTPReportInplaceButton is the CXTPReportInplaceControl derived class,
// it represents combo button and expand button of report cell.
//===========================================================================
class _XTP_EXT_CLASS CXTPReportInplaceButton : public CStatic, public CXTPReportInplaceControl
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPReportInplaceButton object
// Parameters:
// nID - Identifier of in-place button. Can be any of the values listed in the Remarks section.
// Remarks:
// Default identifiers are:
// * <b>XTP_ID_REPORT_EXPANDBUTTON</b> Indicates the button acts like an expand button
// * <b>XTP_ID_REPORT_COMBOBUTTON</b> Indicates the button acts like a combo button.
// * <b>XTP_ID_REPORT_SPINBUTTON</b> Indicates the button acts like a spin button.
//-----------------------------------------------------------------------
CXTPReportInplaceButton(UINT nID);
//-----------------------------------------------------------------------
// Summary:
// Call this method to create in-place button control.
// Parameters:
// pItemArgs - Parameters of item cell.
// rcButtons - Bounding rectangle of the button
//-----------------------------------------------------------------------
void Create(XTP_REPORTRECORDITEM_ARGS* pItemArgs, CRect& rcButtons);
//-----------------------------------------------------------------------
// Summary:
// Retrieves identifier of the button
// Returns:
// Identifier of the button.
//-----------------------------------------------------------------------
int GetID() const;
//-----------------------------------------------------------------------
// Summary:
// Call this method to determine if user pressed the button.
// Returns:
// TRUE if user pressed the button.
//-----------------------------------------------------------------------
BOOL IsPressed() const;
//-----------------------------------------------------------------------
// Summary:
// Call this method to determine the button state.
// Returns:
// The button state.
//-----------------------------------------------------------------------
int GetState() const;
//-----------------------------------------------------------------------
// Summary:
// This member function retrieves a child report control item.
// Returns:
// A pointer to a CXTPReportRecordItem
//-----------------------------------------------------------------------
CXTPReportRecordItem* GetItem() const;
//-----------------------------------------------------------------------
// Summary:
// Retrieves button width.
// Returns:
// A width of the button.
//-----------------------------------------------------------------------
int GetWidth() const;
//-----------------------------------------------------------------------
// Summary:
// Call this method to determine if button placed inside the cell rect,
// or outside (near right cell side).
// Returns:
// TRUE if button is inside cell, FALSE otherwise.
//-----------------------------------------------------------------------
BOOL IsInsideCellButton() const;
//-----------------------------------------------------------------------
// Summary:
// Call this method to set button place inside the cell rect,
// or outside (near right cell side).
// Parameters:
// bInsideCell - TRUE if button is inside cell, FALSE otherwise.
//-----------------------------------------------------------------------
void SetInsideCellButton(BOOL bInsideCell);
//-----------------------------------------------------------------------
// Summary:
// Sets the icon index for the button.
// Parameters:
// nIconIndex - icon index.
// See Also:
// GetIconIndex
//-----------------------------------------------------------------------
void SetIconIndex(int nIconIndex);
//-----------------------------------------------------------------------
// Summary:
// Retrieves the icon index for the button.
// Returns:
// Icon index.
// See Also:
// SetIconIndex
//-----------------------------------------------------------------------
int GetIconIndex() const;
//-----------------------------------------------------------------------
// Summary:
// Retrieves the spin button properties.
// Returns:
// The requested value.
// See Also:
// SetSpinButtonMin, SetSpinButtonMax, SetSpinButtonStep
//-----------------------------------------------------------------------
int GetSpinButtonMin() const;
int GetSpinButtonMax() const; //<COMBINE CXTPReportInplaceButton::GetSpinButtonMin>
int GetSpinButtonStep() const; //<COMBINE CXTPReportInplaceButton::GetSpinButtonMin>
//-----------------------------------------------------------------------
// Summary:
// Use these member functions to set spin button properties.
// Parameters:
// nValue - New Property value.
// See Also:
// GetSpinButtonMin, GetSpinButtonMax, GetSpinButtonStep
//-----------------------------------------------------------------------
void SetSpinButtonMin(int nValue);
void SetSpinButtonMax(int nValue); //<COMBINE CXTPReportInplaceButton::SetSpinButtonMin>
void SetSpinButtonStep(int nValue); //<COMBINE CXTPReportInplaceButton::SetSpinButtonMin>
//-----------------------------------------------------------------------
// Summary:
// Call this function to activate the button.
//-----------------------------------------------------------------------
void Activate();
int m_Items2Show; // Picklist desired item's number to show
protected:
//{{AFX_CODEJOCK_PRIVATE
DECLARE_MESSAGE_MAP()
//{{AFX_VIRTUAL(CXTPReportInplaceButton)
virtual void OnFinalRelease();
//{{AFX_VIRTUAL
//{{AFX_MSG(CXTPReportInplaceButton)
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnCaptureChanged(CWnd* pWnd);
afx_msg void OnTimer(UINT_PTR nIDEvent);
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
private:
BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
BOOL Create(LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff);
protected:
int m_nID; // Identifier of the button.
int m_nWidth; // Width of the button.
int m_nFixedHeight; // Height of the button.
BOOL m_bInsideCell; // Store button place: inside the cell rect, or outside.
int m_nIconIndex; // Icon index.
BOOL m_bPressed; // TRUE if the button is pressed.
BOOL m_bOver; // TRUE if the mouse cursor is over the button.
int m_nState; // Button state.
int m_nSpinMin; // Spin button only: minimum value.
int m_nSpinMax; // Spin button only: maximum value.
int m_nSpinStep; // Spin button only: step value.
UINT_PTR m_unSpinTimerCnt; // Spin button only: timer counter.
UINT_PTR m_unSpinTimerId; // Spin button only: timer identifier.
int m_nSpinIncrement; // Spin button only: increment value.
friend class CXTPReportRecordItem;
};
AFX_INLINE int CXTPReportInplaceButton::GetID() const {
return m_nID;
}
AFX_INLINE BOOL CXTPReportInplaceButton::IsPressed() const {
return m_bPressed && m_bOver;
}
AFX_INLINE int CXTPReportInplaceButton::GetState() const {
return m_bOver ? m_nState : 0;
}
AFX_INLINE BOOL CXTPReportInplaceButton::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) {
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
AFX_INLINE BOOL CXTPReportInplaceButton::Create(LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) {
return CStatic::Create(lpszText, dwStyle, rect, pParentWnd, nID);
}
AFX_INLINE CXTPReportRecordItem* CXTPReportInplaceButton::GetItem() const {
return pItem;
}
AFX_INLINE void CXTPReportInplaceButton::SetIconIndex(int nIconIndex) {
m_nIconIndex = nIconIndex;
}
AFX_INLINE int CXTPReportInplaceButton::GetIconIndex() const {
return m_nIconIndex;
}
//===========================================================================
// Summary:
// CXTPReportInplaceList is the CXTPReportInplaceControl derived class,
// it represents list box with constraints of item.
// See Also: CXTPReportRecordItemConstraints
//===========================================================================
class _XTP_EXT_CLASS CXTPReportInplaceList : public CListBox, public CXTPReportInplaceControl
{
public:
//-------------------------------------------------------------------------
// Summary:
// Constructs a CXTPReportInplaceList object
//-------------------------------------------------------------------------
CXTPReportInplaceList();
public:
//-----------------------------------------------------------------------
// Summary:
// Call this method to create in-place list control.
// Parameters:
// pItemArgs - Parameters of item cell.
// pConstaints - constraints of item
//-----------------------------------------------------------------------
void Create(XTP_REPORTRECORDITEM_ARGS* pItemArgs, CXTPReportRecordItemConstraints* pConstaints);
//-------------------------------------------------------------------------
// Summary:
// This method is called to cancel user selection.
//-------------------------------------------------------------------------
void Cancel();
//-------------------------------------------------------------------------
// Summary:
// This method is called to save selected value of list box.
//-------------------------------------------------------------------------
void Apply();
int m_Items2Show;
protected:
//{{AFX_CODEJOCK_PRIVATE
DECLARE_MESSAGE_MAP()
//{{AFX_VIRTUAL(CXTPReportInplaceList)
virtual BOOL PreTranslateMessage(MSG* pMsg);
void PostNcDestroy();
//}}AFX_VIRTUAL
//{{AFX_MSG(CXTPReportInplaceList)
afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
afx_msg UINT OnGetDlgCode();
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnLButtonUp(UINT, CPoint point);
afx_msg void OnNcPaint();
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
//-------------------------------------------------------------------------
// Summary:
// This method is called internal to fill item arguments of in-place control
// Parameters:
// pItemArgs - Arguments of item.
//-------------------------------------------------------------------------
virtual void SetItemArgs(XTP_REPORTRECORDITEM_ARGS* pItemArgs);
//-------------------------------------------------------------------------
// Summary:
// This method is called internally to react on selection changing.
// Parameters:
// nLBIndex - An index of the selected item in the list.
//-------------------------------------------------------------------------
virtual void OnSelectionChanged(int nLBIndex);
private:
CString m_strHotSearchContext;
DWORD m_dwLastKeyDownTime;
BOOL m_bApply;
BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
};
//////////////////////////////////////////////////////////////////////////
AFX_INLINE BOOL CXTPReportInplaceList::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) {
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
AFX_INLINE BOOL CXTPReportInplaceList::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) {
return CListBox::Create(dwStyle, rect, pParentWnd, nID);
}
AFX_INLINE int CXTPReportInplaceButton::GetWidth() const {
return m_nWidth;
}
AFX_INLINE BOOL CXTPReportInplaceButton::IsInsideCellButton() const {
return m_bInsideCell;
}
AFX_INLINE void CXTPReportInplaceButton::SetInsideCellButton(BOOL bInsideCell) {
m_bInsideCell = bInsideCell;
}
AFX_INLINE int CXTPReportInplaceButton::GetSpinButtonMin() const {
return m_nSpinMin;
}
AFX_INLINE int CXTPReportInplaceButton::GetSpinButtonMax() const {
return m_nSpinMax;
}
AFX_INLINE int CXTPReportInplaceButton::GetSpinButtonStep() const{
return m_nSpinStep;
}
AFX_INLINE void CXTPReportInplaceButton::SetSpinButtonMin(int nValue) {
m_nSpinMin = nValue;
}
AFX_INLINE void CXTPReportInplaceButton::SetSpinButtonMax(int nValue) {
m_nSpinMax = nValue;
}
AFX_INLINE void CXTPReportInplaceButton::SetSpinButtonStep(int nValue) {
m_nSpinStep = nValue;
}
#endif // #if !defined(__XTPREPORTINPLACECONTROLS_H__)