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.

509 lines
21 KiB
C++

// XTPPropertySheet.h : interface for the CXTPPropertySheet class.
//
// This file is a part of the XTREME CONTROLS 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(__XTPPROPERTYSHEET_H__)
#define __XTPPROPERTYSHEET_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CXTPPropertyPageNavigator;
class CXTPPropertyPage;
//-----------------------------------------------------------------------
// Summary:
// XTPPropertyPageBorder is an enumeration used to set the client frame style drawn around the client of tabs.
// Example:
// <code>wndSheet.SetPageBorderStyle(xtpPageBorderFrame);</code>
// See Also: CXTPPropertySheet
//
// <KEYWORDS xtpPageBorderNone, xtpPageBorderBottomLine, xtpPageBorderFrame>
//-----------------------------------------------------------------------
enum XTPPropertyPageBorder
{
xtpPageBorderNone,
xtpPageBorderBottomLine,
xtpPageBorderFrame
};
//===========================================================================
// Summary:
// CXTPPropertySheet is a CDialog derived class
// It represents property sheet, otherwise known as tab dialog box.
// A property sheet consists of a CXTPPropertySheet object and one or more CXTPPropertyPage objects.
// See Also:
// CXTPPropertySheet::DoModal, CXTPPropertyPage, CXTPPropertyPageNavigator
//===========================================================================
class _XTP_EXT_CLASS CXTPPropertySheet : public CDialog
{
DECLARE_DYNAMIC(CXTPPropertySheet)
public:
//-----------------------------------------------------------------------
// Summary:
// Constructs a CXTPPropertySheet object.
// Parameters:
// nIDCaption - ID of the caption to be used for the property sheet.
// pParentWnd - Points to the parent window of the property sheet. If NULL, the parent window will be the main window of the application.
// iSelectPage - The index of the page that will initially be on top. Default is the first page added to the sheet
// pszCaption - Points to a string containing the caption to be used for the property sheet. Cannot be NULL
// Remarks:
// Use this member function to construct a CPropertySheet object.
// To display the property sheet, call DoModal or Create.
// The string contained in the first parameter will be placed in the caption bar for the property sheet.
//-----------------------------------------------------------------------
CXTPPropertySheet();
CXTPPropertySheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0); // <combine CXTPPropertySheet::CXTPPropertySheet>
CXTPPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0); // <combine CXTPPropertySheet::CXTPPropertySheet>
//-----------------------------------------------------------------------
// Summary:
// Destroys a CXTPPropertySheet object, handles cleanup and deallocation
//-----------------------------------------------------------------------
~CXTPPropertySheet();
public:
//-----------------------------------------------------------------------
// Summary:
// Displays a modeless property sheet.
// Parameters:
// pParentWnd - Points to parent window. If NULL, parent is the desktop.
// dwStyle - Window styles for property sheet
// dwExStyle - Extended window styles for property sheet
// Remarks:
// The default style, expressed by passing -1 as dwStyle, is actually
// WS_SYSMENU | WS_POPUP | WS_CAPTION | DS_MODALFRAME | DS_CONTEXT_HELP | WS_VISIBLE.
//
// To display a modal property sheet, call DoModal instead.
// See Also:
// CXTPPropertySheet::DoModal
//-----------------------------------------------------------------------
BOOL Create(CWnd* pParentWnd = NULL, DWORD dwStyle = (DWORD)-1, DWORD dwExStyle = 0);
//-----------------------------------------------------------------------
// Summary:
// Displays a modal property sheet.
// Returns:
// IDOK or IDCANCEL if the function was successful; otherwise 0 or -1.
// Remarks:
// Call this member function to display a modal property sheet.
// The return value corresponds to the ID of the control that closed the property sheet.
// After this function returns, the windows corresponding to the property sheet and all the pages
// will have been destroyed.
//
// To display a modeless property sheet, call Create instead.
// See Also:
// CXTPPropertySheet::Create
//-----------------------------------------------------------------------
INT_PTR DoModal();
public:
//-----------------------------------------------------------------------
// Summary:
// Adds a page to the property sheet.
// Parameters:
// pPage - Points to the page to be added to the property sheet. Cannot be NULL.
// Remarks:
// This member function adds the supplied page with the rightmost tab in the property sheet.
// Add pages to the property sheet in the left-to-right order you want them to appear.
//
// AddPage adds the CPropertyPage object to the CPropertySheet object's list of pages but does
// not actually create the window for the page. The framework postpones creation of the window for the page until the user selects that page.
// See Also:
// CXTPPropertySheet::GetPageCount
//-----------------------------------------------------------------------
void AddPage(CXTPPropertyPage* pPage);
void InsertPage(int nIndex, CXTPPropertyPage* pPage);
//-----------------------------------------------------------------------
// Summary:
// This member function removes a page from the property sheet and destroys the associated window.
// Parameters:
// pPage - Points to the page to be removed from the property sheet. Cannot be NULL.
// nPage - Index of the page to be removed. Must be between 0 and one less than the number of pages in the property sheet, inclusive.
// See Also:
// CXTPPropertySheet::AddPage
//-----------------------------------------------------------------------
void RemovePage(int nPage);
void RemovePage(CXTPPropertyPage* pPage); // <combine CXTPPropertySheet::RemovePage@int>
//-----------------------------------------------------------------------
// Summary:
// Retrieves the number of pages in the property sheet.
// Returns:
// The number of pages in the property sheet.
// Remarks:
// Call this member function to determine the number of pages currently in the property sheet.
// See Also:
// CXTPPropertySheet::AddPage, CXTPPropertySheet::GetPage
//-----------------------------------------------------------------------
int GetPageCount() const;
//-----------------------------------------------------------------------
// Summary:
// Retrieves a pointer to the specified page.
// Parameters:
// nPage - Index of the desired page, starting at 0.
// Must be between 0 and one less than the number of pages in the property sheet, inclusive.
// Returns:
// The pointer to the page corresponding to the nPage parameter.
// Remarks:
// Call this member function to determine the number of pages currently in the property sheet.
// See Also:
// CXTPPropertySheet::AddPage, CXTPPropertySheet::GetPageCount
//-----------------------------------------------------------------------
CXTPPropertyPage* GetPage(int nPage) const;
//-----------------------------------------------------------------------
// Summary:
// Retrieves the index of the specified page of the property sheet.
// Parameters:
// pPage - Points to the page with the index to be found. Cannot be NULL
// Returns:
// The index number of a page.
// Remarks:
// Use this member function to retrieve the index number of the specified page in the property sheet.
// For example, you would use GetPageIndex to get the page index in order to use SetActivePage or GetPage..
// See Also:
// CXTPPropertySheet::GetActivePage
//-----------------------------------------------------------------------
int GetPageIndex(CXTPPropertyPage* pPage) const;
//-----------------------------------------------------------------------
// Summary:
// Returns the active page object.
// Returns:
// The pointer to the active page.
// Remarks:
// Call this member function to retrieve the property sheet window's active page.
// Use this member function to perform some action on the active page
// See Also:
// CXTPPropertySheet::GetPage
//-----------------------------------------------------------------------
CXTPPropertyPage* GetActivePage() const;
//-----------------------------------------------------------------------
// Summary:
// Retrieves the index of the active page of the property sheet.
// Returns:
// The index number of the active page.
// Remarks:
// Call this member function to get the index number of the property sheet window's active page,
// then use the returned index number as the parameter for GetPage.
// See Also:
// CXTPPropertySheet::GetActivePage
//-----------------------------------------------------------------------
int GetActiveIndex() const;
//-----------------------------------------------------------------------
// Summary:
// Programmatically sets the active page object.
// Parameters:
// pPage - Points to the page to set in the property sheet. It cannot be NULL.
// nPage - Index of the page to set. It must be between 0 and one less than the number of pages in the property sheet, inclusive.
// Returns:
// Nonzero if the property sheet is activated successfully; otherwise 0.
// Remarks:
// Use this member function to change the active page.
// For example, use SetActivePage if a user's action on one page should cause another page to become the active page.
// See Also:
// CXTPPropertySheet::GetActivePage
//-----------------------------------------------------------------------
BOOL SetActivePage(int nPage);
BOOL SetActivePage(CXTPPropertyPage* pPage); // <combine CXTPPropertySheet::SetActivePage@int>
//-----------------------------------------------------------------------
// Summary:
// Sets the caption of the property sheet.
// Parameters:
// lpszText - Points to the text to be used as the caption in the title bar of the property sheet.
// Remarks:
// Call this member function to specify the property sheet's caption
// (the text displayed in the title bar of a frame window).
// See Also:
// CXTPPropertySheet::GetPage
//-----------------------------------------------------------------------
void SetTitle(LPCTSTR lpszText);
//-----------------------------------------------------------------------
// Summary:
// Returns bounding rectangle for all property pages.
// Returns:
// CRect bounding rectangle for all property pages.
//-----------------------------------------------------------------------
CRect GetPageRect() const;
public:
//-----------------------------------------------------------------------
// Summary:
// Returns currently used navigator object
// Returns:
// CXTPPropertyPageNavigator class pointer presented navigator object
// See Also:
// CXTPPropertySheet::SetNavigator
//-----------------------------------------------------------------------
CXTPPropertyPageNavigator* GetNavigator() const;
//-----------------------------------------------------------------------
// Summary:
// Sets navigator object that will be used to switch property pages
// Parameters:
// pNavigator - CXTPPropertyPageNavigator class pointer that will be set as new navigator
// Remarks:
// CXTPPropertyPageNavigator class used to specify how user will navigate and switch pages.
// Default navigator classes are:
// * <b>CXTPPropertyPageTabNavigator</b> - represents TabControl navigator
// * <b>CXTPPropertyPageListNavigator</b> - represents List navigator
// * <b>CXTPPropertyPageTreeNavigator</b> - represents Tree navigator
// Example:
// <code>
// CXTPPropertyPageListNavigator* pList = new CXTPPropertyPageListNavigator();
// pList->SetListStyle(xtpListBoxOffice2007);
// ps.SetNavigator(pList);
// </code>
// See Also:
// CXTPPropertySheet::GetNavigator
//-----------------------------------------------------------------------
void SetNavigator(CXTPPropertyPageNavigator* pNavigator);
public:
//-----------------------------------------------------------------------
// Summary:
// Adds new button to property sheet window
// Parameters:
// nIDCaption - ID of the caption to be used for the property sheet button.
// nID - identifier to be used for the property sheet button.
// Returns:
// Nonzero if the property sheet is activated successfully; otherwise 0.
// See Also:
// CXTPPropertySheet::RemoveButtons
//-----------------------------------------------------------------------
virtual BOOL AddButton(UINT nIDCaption, UINT nID);
//-----------------------------------------------------------------------
// Summary:
// Deletes all buttons from property sheet
// See Also:
// CXTPPropertySheet::AddButton
//-----------------------------------------------------------------------
void RemoveButtons();
//-----------------------------------------------------------------------
// Summary:
// Sets border around client page rectangle
// Parameters:
// nBorder - Border style to be set
// See Also:
// XTPPropertyPageBorder, CXTPPropertySheet::GetPageBorderStyle
//-----------------------------------------------------------------------
void SetPageBorderStyle(XTPPropertyPageBorder nBorder);
//-----------------------------------------------------------------------
// Summary:
// Retrieves border style around client page rectangle
// Returns:
// XTPPropertyPageBorder Border style.
// See Also:
// XTPPropertyPageBorder, CXTPPropertySheet::SetPageBorderStyle
//-----------------------------------------------------------------------
XTPPropertyPageBorder GetPageBorderStyle() const;
//-----------------------------------------------------------------------
// Summary:
// Call this member to allow user resize property sheet
// Parameters:
// bResizable - TRUE to allow user resize property sheet
//-----------------------------------------------------------------------
void SetResizable(BOOL bResizable = TRUE);
//-----------------------------------------------------------------------
// Summary:
// Call this member to set custom size for property pages
// Parameters:
// szPage - New page size to be set
//-----------------------------------------------------------------------
void SetPageSize(CSize szPage);
public:
//-----------------------------------------------------------------------
// Summary:
// This member function saves the window placement to the registry.
// Parameters:
// pszSection - Name of a section in the initialization file or a key in the Windows
// registry where placement information is stored.
// Returns:
// TRUE if succeeds
//-----------------------------------------------------------------------
BOOL SavePlacement(LPCTSTR pszSection);
//-----------------------------------------------------------------------
// Summary:
// This member function loads saved window placement information from
// the registry.
// Parameters:
// pszSection - Name of a section in the initialization file or a key in the Windows
// registry where placement information is stored.
// Returns:
// TRUE if position was changed
//-----------------------------------------------------------------------
BOOL LoadPlacement(LPCTSTR pszSection);
//-----------------------------------------------------------------------
// Summary:
// This member function loads saved window placement information from
// the registry. This version is the same as LoadPlacement but there
// is no need for calling SavePlacement when the window is destroyed.
// This will be called automatically.
// Parameters:
// pszSection - Name of a section in the initialization file or a key in the Windows
// registry where placement information is stored.
// Returns:
// TRUE if position was changed
//-----------------------------------------------------------------------
BOOL AutoLoadPlacement(LPCTSTR pszSection);
protected:
//-----------------------------------------------------------------------
// Summary:
// This method is called to create all property sheet buttons
//-----------------------------------------------------------------------
virtual BOOL CreateButtons();
//-----------------------------------------------------------------------
// Summary:
// This method is called to create property page window
// Parameters:
// pPage - Page to be created
//-----------------------------------------------------------------------
virtual BOOL CreatePage(CXTPPropertyPage* pPage);
//{{AFX_CODEJOCK_PRIVATE
public:
CFont* GetFont();
void EndDialog(int nEndID);
void RecalcLayout(LPSIZE pPageSize = NULL, BOOL bMoveWindow = FALSE);
BOOL IsWizard() const;
HWND GetNavigatorHwnd() const;
protected:
void CommonConstruct(CWnd* pParentWnd, UINT iSelectPage);
protected:
virtual BOOL CreateClient();
void ResizeParentToFit(CSize szClient, BOOL bMoveWindow);
BOOL IsPositionRelativeToWindow();
void MoveButtons(AFX_SIZEPARENTPARAMS* pLayout, CSize szClient);
void CreateFont(CXTPPropertyPage* pActivePage);
virtual CButton* CreateButton();
private:
void PageInfoChanged(CXTPPropertyPage* pPage, BOOL bModified);
BOOL OnButtonClick(UINT nButton);
LRESULT SendPageNotify(CXTPPropertyPage* pPage, int code, LPARAM lParam = 0);
TCHAR ToUpper(TCHAR vkTCHAR);
//}}AFX_CODEJOCK_PRIVATE
protected:
//{{AFX_CODEJOCK_PRIVATE
DECLARE_MESSAGE_MAP()
//{{AFX_VIRTUAL(CXTPPropertySheet)
public:
virtual BOOL PreTranslateMessage(MSG* pMsg);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL
//{{AFX_MSG(CXTPPropertySheet)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
virtual BOOL OnInitDialog();
afx_msg LRESULT OnCommandHelp(WPARAM wParam, LPARAM lParam);
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnClose();
afx_msg void OnPaint();
afx_msg LRESULT OnQuerySiblings(WPARAM wParam, LPARAM lParam);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg LRESULT HandleInitDialog(WPARAM, LPARAM);
//}}AFX_MSG
//}}AFX_CODEJOCK_PRIVATE
protected:
CString m_strCaption; // Caption of the dialog
LPDLGTEMPLATE m_lpDlgTemplate; // Dialog template
CArray<CButton*, CButton*> m_arrButtons; // Array of buttons of property sheet
CXTPPropertyPageNavigator* m_pNavigator; // Currently used navigator
CFont m_fntNormal; // Font used to draw buttons and navigator
CArray<CXTPPropertyPage*, CXTPPropertyPage*> m_arrPages; // Array of propety pages
CXTPPropertyPage* m_pActivePage; // Pointer to active property page
CRect m_rcPage; // Bounding rectangle of active page
BOOL m_bAllowApply; // TRUE to allow enable apply button
BOOL m_bModeless; // TRUE if property sheet was created as modeless window
BOOL m_bResizable; // TRUE if dialog can be resized
CSize m_szWindow; // Last window size of property sheet
CSize m_szButton; // Button size
CScrollBar m_scSizeIcon; // Resize glyph
XTPPropertyPageBorder m_nPageBorderStyle; // Client border style
CString m_strSection;
public:
PROPSHEETHEADER m_psh; // The Windows PROPSHEETHEADER structure. Provides access to basic property sheet parameters.
};
AFX_INLINE int CXTPPropertySheet::GetPageCount() const {
return (int)m_arrPages.GetSize();
}
AFX_INLINE CXTPPropertyPage* CXTPPropertySheet::GetPage(int nPage) const {
return nPage >= 0 && nPage < m_arrPages.GetSize() ? m_arrPages.GetAt(nPage) : NULL;
}
AFX_INLINE CXTPPropertyPage* CXTPPropertySheet::GetActivePage() const {
return m_hWnd ? m_pActivePage : GetPage(m_psh.nStartPage);
}
AFX_INLINE int CXTPPropertySheet::GetActiveIndex() const {
return m_hWnd ? GetPageIndex(m_pActivePage) : m_psh.nStartPage;
}
AFX_INLINE CXTPPropertyPageNavigator* CXTPPropertySheet::GetNavigator() const {
return m_pNavigator;
}
AFX_INLINE CFont* CXTPPropertySheet::GetFont() {
return &m_fntNormal;
}
AFX_INLINE CRect CXTPPropertySheet::GetPageRect() const {
return m_rcPage;
}
AFX_INLINE XTPPropertyPageBorder CXTPPropertySheet::GetPageBorderStyle() const {
return m_nPageBorderStyle;
}
AFX_INLINE INT_PTR CXTPPropertySheet::DoModal() {
return CDialog::DoModal();
}
#endif // !defined(__XTPPROPERTYSHEET_H__)