// XTPPropertyGridItemExt.h
//
// This file is a part of the XTREME PROPERTYGRID 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(__XTPPROPERTYGRIDITEMEXT_H__)
#define __XTPPROPERTYGRIDITEMEXT_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPPropertyGridItemDate;
//===========================================================================
// Summary:
// Month calendar popup used for CXTPPropertyGridItemDate item.
//===========================================================================
class CXTPPropertyGridInplaceMonthCal : public CWnd
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPPropertyGridInplaceMonthCal object.
// Parameters:
// pItem - Parent item
//-----------------------------------------------------------------------
CXTPPropertyGridInplaceMonthCal(CXTPPropertyGridItemDate* pItem)
{
m_pItem = pItem;
}
//-----------------------------------------------------------------------
// Summary: Gets the minimal size needed to display one month.
// Parameters:
// pRect - Pointer to a RECT that will receive the minimal
// size needed to display one month. This parameter
// must be a valid address and cannot be NULL.
// Remarks:
// This member function implements the behavior of the
// CMonthCalCtrl::GetMinReqRect function.
// Returns:
// If successful, this member function returns nonzero and pRect
// receives the applicable bounding rectangle information. If
// unsuccessful, the member function returns 0.
//-----------------------------------------------------------------------
BOOL GetMinReqRect(RECT* pRect) const;
protected:
//-------------------------------------------------------------------------
// Summary: Called if the user hits the Return while an inplace calendar is displayed.
// Remarks: Also occurs when an item in the implace calendar is selected.
// See Also: OnCancel
//-------------------------------------------------------------------------
void OnAccept();
//-------------------------------------------------------------------------
// Summary: Called if the user hits the Escape key or clicks on another part of the
// property grid or other application while an inplace calendar is displayed.
// See Also: OnAccept
//-------------------------------------------------------------------------
void OnCancel();
//{{AFX_CODEJOCK_PRIVATE
virtual void PostNcDestroy();
virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
afx_msg void OnSelect(NMHDR* pNMHDR, LRESULT* pResult);
DECLARE_MESSAGE_MAP()
//}}AFX_CODEJOCK_PRIVATE
protected:
CXTPPropertyGridItemDate* m_pItem; // Parent item
};
//===========================================================================
// Summary:
// CXTPPropertyGridItemDate is a CXTPPropertyGridItem derived class.
// It is used to create Date item in a Property Grid control.
//
// Remarks:
// When the in-place button for a date item is pressed, a
// CXTPPropertyGridInplaceMonthCal object is created, which is a
// User Interface that allows the user to easily select a date.
//
// Example:
// This sample illustrates how to add an item of type Date to your grid.
//
// CXTPPropertyGridItem* pStandard = m_wndPropertyGrid.AddCategory(_T("Appointments"));
//
// //Create a Date object with the date 12/26/2004. Note that no time information is entered
// //because this information is ignored.
// COleDateTime dates(2004, 12, 26, 0, 0, 0);
//
// //Adds a date item to the property grid and set the date to the value stored in dates
// CXTPPropertyGridItemDate* pDate = (CXTPPropertyGridItemDate*)(pStandard->AddChildItem(new CXTPPropertyGridItemDate(_T("Date item"), dates)));
//
// //Set the date format to MM/DD/YYYY
// pDate->SetDateFormat("%m/%d/%Y");
//
// //Changes the date to 3/22/2001
// COleDateTime newDate(2003, 5, 12, 0, 0, 0);
//
// //Changes the date of the Date item.
// pDate->SetDate(newDate);
//
// //Gets the currently set date
// TRACE(_T("Current Date= %d/%d/%d\n"), pDate->GetMonth(), pDate->GetDay(), pDate->GetYear());
//
// See Also: SetDate, GetMonth, GetDay, GetYear, SetDateFormat
//===========================================================================
class _XTP_EXT_CLASS CXTPPropertyGridItemDate: public CXTPPropertyGridItem
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPPropertyGridItemDate object.
// Parameters:
// strCaption - Caption of the item.
// nID - Identifier of the item.
// oleDate - COleDateTime object containing the initial
// date of the item.
// pBindDate - If not NULL, then the value of this item
// is bound the value of this variable.
//-----------------------------------------------------------------------
CXTPPropertyGridItemDate(LPCTSTR strCaption, const COleDateTime& oleDate, COleDateTime* pBindDate = NULL);
CXTPPropertyGridItemDate(UINT nID, const COleDateTime& oleDate, COleDateTime* pBindDate = NULL); //
public:
//-----------------------------------------------------------------------
// Summary:
// Call this member to set the date of the item.
// Parameters:
// oleDate - COleDateTime containing a date. You must include
// the month, day, and year. All time information
// should be set to zero.
// Example:
// This sample illustrates how to set the currently selected
// date in and item of type CXTPPropertyGridItemDate.
//
// CXTPPropertyGridItem* pStandard = m_wndPropertyGrid.AddCategory(_T("Appointments"));
//
// //Create a Date object with the date 12/26/2004. Note that no time information is entered
// //because this information is ignored.
// COleDateTime dates(2004, 12, 26, 0, 0, 0);
//
// //Adds a date item to the property grid and set the date to the value stored in dates
// CXTPPropertyGridItemDate* pDate = (CXTPPropertyGridItemDate*)(pStandard->AddChildItem(new CXTPPropertyGridItemDate(_T("Date item"), dates)));
//
// //Set the date format to MM/DD/YYYY
// pDate->SetDateFormat("%m/%d/%Y");
//
// //Changes the date to 3/22/2001
// COleDateTime newDate(2003, 5, 12, 0, 0, 0);
//
// //Changes the date of the Date item.
// pDate->SetDate(newDate);
//
// //Gets the currently set date
// TRACE(_T("Current Date= %d/%d/%d\n"), pDate->GetMonth(), pDate->GetDay(), pDate->GetYear());
//
//-----------------------------------------------------------------------
virtual void SetDate(const COleDateTime& oleDate);
//-----------------------------------------------------------------------
// Summary:
// Call this member function to convert the time in the COleDateTime
// object to be represented as a SYSTEMTIME data structure.
// GetAsSystemTime stores the resulting time in the referenced
// sysTime object. The SYSTEMTIME data structure initialized by
// this function will have its wMilliseconds member set to zero.
// Parameters:
// sysTime - SYSTEMTIME object to hold date.
// Returns:
// TRUE if the COleDateTime date was successfully stored in the
// sysTime object.
// Example:
// This sample code illustrates how to use the GetAsSystemTime member.
//
// CXTPPropertyGridItem* pStandard = m_wndPropertyGrid.AddCategory(_T("Appointments"));
//
// //Create a Date object with the date 12/26/2004. Note that no time information is entered
// //because this information is ignored.
// COleDateTime dates(2004, 12, 26, 0, 0, 0);
//
// //Adds a date item to the property grid and set the date to the value stored in dates
// CXTPPropertyGridItemDate* pDate = (CXTPPropertyGridItemDate*)(pStandard->AddChildItem(new CXTPPropertyGridItemDate(_T("Date item"), dates)));
//
// //Creates a SYSTEMTIME object
// SYSTEMTIME sysTime;
//
// //Stores the day, month, and year into the SYSTEMTIME structure, all other members will be 0.
// if (pDate->GetAsSystemTime(sysTime))
// TRACE(_T("SysTime Current Date= %d/%d/%d\n"), sysTime.wMonth, sysTime.wDay, sysTime.wYear);
//
//-----------------------------------------------------------------------
virtual BOOL GetAsSystemTime(SYSTEMTIME& sysTime);
//-----------------------------------------------------------------------
// Summary:
// Call this member to return the currently selected date.
// Returns:
// The currently selected date.
//-----------------------------------------------------------------------
virtual const COleDateTime& GetDate() const;
//-----------------------------------------------------------------------
// Summary:
// Call this member to get the Day of the currently selected date.
// Returns:
// Day of the currently set date.
//-----------------------------------------------------------------------
virtual long GetDay();
//-----------------------------------------------------------------------
// Summary:
// Call this member to set the Day of the date.
// Parameters:
// nDay - New Day of date.
//-----------------------------------------------------------------------
virtual void SetDay(long nDay);
//-----------------------------------------------------------------------
// Summary:
// Call this member to get the Month of the currently selected date.
// Returns:
// Month of the currently set date.
//-----------------------------------------------------------------------
virtual long GetMonth();
//-----------------------------------------------------------------------
// Summary:
// Call this member to set the Month of the date.
// Parameters:
// nMonth - New Month of date.
//-----------------------------------------------------------------------
virtual void SetMonth(long nMonth);
//-----------------------------------------------------------------------
// Summary:
// Call this member to get the Year of the currently selected date.
// Returns:
// Year of the currently set date.
//-----------------------------------------------------------------------
virtual long GetYear();
//-----------------------------------------------------------------------
// Summary:
// Call this member to set the Year of the date.
// Parameters:
// nYear - New year of date.
//-----------------------------------------------------------------------
virtual void SetYear(long nYear);
//-----------------------------------------------------------------------
// Summary:
// This member is called to parse the month, day, and year from
// the COleDateTime object.
// Parameters:
// dt - COleDateTime object containing the month, day, and year
// strValue - The date format.
// Format Code:
// * \%m - Month as decimal number (01 - 12)
// * \%d - Day of month as decimal number (01 - 31)
// * \%Y - Year with century, as decimal number
// Format string for 05/22/2004 is "\%m\%d\%Y"
// Returns:
// TRUE if a valid date was extracted, FALSE if an invalid date
// or NULL date was found.
//-----------------------------------------------------------------------
virtual BOOL ParseDateTime(COleDateTime& dt, LPCTSTR strValue);
//-----------------------------------------------------------------------
// Summary:
// Call this member to change the date format.
// Parameters:
// strFormat - The date format.
// * %m - Month as decimal number (01 - 12)
// * %d - Day of month as decimal number (01 - 31)
// * %Y - Year with century, as decimal number
// Format string for 05/22/2004 is "\%m\%d\%Y"
// Example:
// This sample code illustrates how to change the date format of
// of type CXTPPropertyGridItemDate.
//
// CXTPPropertyGridItem* pStandard = m_wndPropertyGrid.AddCategory(_T("Appointments"));
//
// //Create a Date object with the date 12/26/2004. Note that no time information is entered
// //because this information is ignored.
// COleDateTime dates(2004, 12, 26, 0, 0, 0);
//
// //Adds a date item to the property grid and set the date to the value stored in dates
// CXTPPropertyGridItemDate* pDate = (CXTPPropertyGridItemDate*)(pStandard->AddChildItem(new CXTPPropertyGridItemDate(_T("Date item"), dates)));
//
// //Set the date format to MM/DD/YYYY
// pDate->SetDateFormat("%m/%d/%Y");
//
//-----------------------------------------------------------------------
virtual void SetDateFormat(LPCTSTR strFormat);
//-----------------------------------------------------------------------
// Summary:
// Call this member to allow null date
// Parameters:
// lpszNullValue - text to display for null date
//-----------------------------------------------------------------------
void AllowNullDate(LPCTSTR lpszNullValue);
//-----------------------------------------------------------------------
// Summary:
// Call this member get allow null date string
// Returns:
// null date string
//-----------------------------------------------------------------------
CString GetAllowNullDateString() const;
//-----------------------------------------------------------------------
// Summary:
// Call this method to bind an item to a COleDateTime object.
// Parameters:
// pBindDate - COleDateTime object to bind to item.
// Remarks:
// Variables can be bound to an item in two ways, the first is
// to pass in a variable at the time of creation, the second allows
// variables to be bound to an item after creation with the
// BindToDate member.
//
// Bound variables store the values of the property grid items
// and can be accessed without using the property grid methods
// and properties. Bound variables allow the property grid to
// store data in variables. When the value of a PropertyGridItem
// is changed, the value of the bound variable will be changed to
// the PropertyGridItem value. The advantage of binding is that
// the variable can be used and manipulated without using
// PropertyGridItem methods and properties.
//
// NOTE: If the value of the variable is changed without using
// the PropertyGrid, the PropertyGridItem value will not be
// updated until you call CXTPPropertyGrid::Refresh.
//-----------------------------------------------------------------------
void BindToDate(COleDateTime* pBindDate);
protected:
//-----------------------------------------------------------------------
// Summary:
// This method creates a formatted representation of the date/time value
// Parameters:
// oleDate - Date to be formatted.
//-----------------------------------------------------------------------
virtual CString Format(const COleDateTime& oleDate);
//-------------------------------------------------------------------------
// Summary:
// This method is called when the user presses the in-place button.
// Override the method to show an item-specific dialog.
// Parameters:
// pButton - Button that was pressed
// Remarks:
// The in-place button is the button that the user presses to
// display date picker.
//-------------------------------------------------------------------------
virtual void OnInplaceButtonDown(CXTPPropertyGridInplaceButton* pButton);
//-----------------------------------------------------------------------
// Summary:
// Call this method to change an item's value.
// Override this method to add new functionality.
// You should call the base class version of this function from your
// override.
// Parameters:
// strValue - New value of the item.
//-----------------------------------------------------------------------
virtual void SetValue(CString strValue);
//-----------------------------------------------------------------------
// Summary:
// This method is called when an item's value is changed. Override this
// function if needed.
// Parameters:
// strValue - New value of the item.
//-----------------------------------------------------------------------
void OnValueChanged(CString strValue);
//-------------------------------------------------------------------------
// Summary:
// This member is called before the item becomes visible in the
// property grid.
// Remarks:
// Before the item is inserted, it is first check to see if it
// is bound to a variable, if it is, then the value of the item
// is updated with the value stored in the bound variable.
//
// OnBeforeInsert is called when an item is inserted,
// when a category is inserted, when a category or item is
// expanded, and when the sort property has changed.
//-------------------------------------------------------------------------
virtual void OnBeforeInsert();
private:
void Init(const COleDateTime& oleDate);
protected:
COleDateTime m_oleDate; // Currently selected date. Only Month, Day, and Year are used.
CString m_strNullValue; // String value to be displayed for a Date Item when the current date is NULL.
COleDateTime* m_pBindDate; // Pointer to variable bound to this item, this is the date of the bound item.
friend class CXTPPropertyGridInplaceMonthCal;
DECLARE_DYNAMIC(CXTPPropertyGridItemDate)
};
AFX_INLINE const COleDateTime& CXTPPropertyGridItemDate::GetDate() const {
return m_oleDate;
}
#ifdef __AFXCTL_H__
//{{AFX_CODEJOCK_PRIVATE
//===========================================================================
// Summary:
// Picture item of ActiveX PropertyGrid
//===========================================================================
class _XTP_EXT_CLASS CXTPPropertyGridItemPicture: public CXTPPropertyGridItem
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a XTPPropertyGridItemPicture object.
// Parameters:
// strCaption - Text caption of this item.
// This is the text displayed in the left column of
// the property grid.
//-----------------------------------------------------------------------
CXTPPropertyGridItemPicture(LPCTSTR strCaption);
public:
virtual CPictureHolder& GetPicture();
virtual void SetPicturePath(LPCTSTR lpszPath);
protected:
//-------------------------------------------------------------------------
// Summary:
// This method is called when the user presses the in-place button.
// Override the method to show an item-specific dialog.
// Remarks:
// The in-place button is the button that the user presses to
// display browse folder dialog so they can select a picture.
// See Also: XTPPropertyGridItemFlags, CXTPPropertyGridItem::SetFlags
//-------------------------------------------------------------------------
virtual void OnInplaceButtonDown(CXTPPropertyGridInplaceButton* pButton);
//-----------------------------------------------------------------------
// Summary:
// This method is called when an item is drawn. Override this function if
// needed.
// Parameters:
// dc - Reference to the device context to be used for rendering an image
// of the item.
// rcValue - Bounding rectangle of the item.
// Returns:
// TRUE if item is self-drawn.
//-----------------------------------------------------------------------
virtual BOOL OnDrawItemValue(CDC& dc, CRect rcValue);
protected:
CPictureHolder m_olePicture;
CString m_strPicturePath;
int m_nPreviewWidth;
};
AFX_INLINE CPictureHolder& CXTPPropertyGridItemPicture::GetPicture() {
return m_olePicture;
}
//}}AFX_CODEJOCK_PRIVATE
#endif
//===========================================================================
// Summary:
// CXTPPropertyGridItemMultilineString is a CXTPPropertyGridItem derived class.
// It is used to create item with inplace multi line edit box
//===========================================================================
class _XTP_EXT_CLASS CXTPPropertyGridItemMultilineString: public CXTPPropertyGridItem
{
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPPropertyGridItemMultilineString object.
// Parameters:
// lpszCaption - Caption of the item.
// nID - Identifier of the item.
// strValue - The initial value of the item.
// pBindString - If not NULL, then the value of this item is bound the value of this variable.
//-----------------------------------------------------------------------
CXTPPropertyGridItemMultilineString(LPCTSTR lpszCaption, LPCTSTR strValue = NULL, CString* pBindString = NULL);
CXTPPropertyGridItemMultilineString(UINT nID, LPCTSTR strValue = NULL, CString* pBindString = NULL); //
protected:
//-------------------------------------------------------------------------
// Summary:
// This method is called when the user presses the in-place button.
// Override the method to show an item-specific dialog.
// Parameters:
// pButton - Button that was pressed.
// Remarks:
// The in-place button is the button that the user presses to
// display date picker.
//-------------------------------------------------------------------------
virtual void OnInplaceButtonDown(CXTPPropertyGridInplaceButton* pButton);
};
AFX_INLINE BOOL CXTPPropertyGridInplaceMonthCal::GetMinReqRect(RECT* pRect) const {
ASSERT(::IsWindow(m_hWnd)); return (BOOL) ::SendMessage(m_hWnd, MCM_GETMINREQRECT, 0, (LPARAM) pRect);
}
#endif // #if !defined(__XTPPROPERTYGRIDITEMEXT_H__)