2020-09-30 17:12:29 +02:00

204 lines
4.9 KiB
C++

/************************************************************************
* *
* WINPG.CPP *
* *
* Copyright (C) Microsoft Corporation 1995 *
* All Rights reserved. *
* *
************************************************************************/
#include "stdafx.h"
#include "propopt.h"
#include "winpg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define INVALID_PTR ((CWindowsPage *) (LPVOID) -1L)
CWindowsPage::CWindowsPage(UINT nIDTemplate, CPropWindows *pOwner) :
CPropertyPage(nIDTemplate)
{
// Save a pointer to the property sheet.
m_pOwner = pOwner;
// Save and invalid pointer so we know this page hasn't
// been added to the list.
m_pNextPage = INVALID_PTR;
// The combo box, its contents, and the current selection
// are initially invalid.
m_pcombo = NULL;
m_fInvalid = TRUE;
m_iSelected = -1;
m_pwsmag = NULL;
}
BOOL CWindowsPage::OnInitDialog()
{
SetChicagoDialogStyles(m_hWnd, FALSE);
CPropertyPage::OnInitDialog();
return TRUE;
}
BOOL CWindowsPage::OnSetActive()
{
// On first activation, the following call triggers OnInitDialog,
// which calls DoDataExcange.
BOOL fReturn = CPropertyPage::OnSetActive();
// On first activation, add this page to the list and get a
// pointer to the combo box.
if (m_pNextPage == INVALID_PTR) {
m_pNextPage = m_pOwner->m_pFirstPage;
m_pOwner->m_pFirstPage = this;
m_pcombo = (CComboBox *) GetDlgItem(IDC_COMBO_WINDOWS);
ASSERT(m_pcombo);
}
// The combo box pointer we got on first activation should
// still be valid.
ASSERT(m_pcombo == (CComboBox *) GetDlgItem(IDC_COMBO_WINDOWS));
// Make sure this page has the right window selected.
SyncWithParent();
return fReturn;
}
void CWindowsPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
// Note: we don't initialize controls here; we do so
// during OnSetActive or OnSelChangeComboWindows.
if (pDX->m_bSaveAndValidate) {
if (m_pwsmag)
SaveAndValidate(pDX);
}
}
void CWindowsPage::SyncWithParent()
{
ASSERT(m_pcombo);
// Update the combo box if necessary.
if (m_fInvalid) {
m_pOwner->FillCombo(m_pcombo);
m_fInvalid = FALSE;
}
if (m_iSelected == -1 || m_iSelected != m_pOwner->m_iSelected) {
// No current selection or selection changed: initialize.
m_iSelected = m_pOwner->m_iSelected;
m_pwsmag = (m_iSelected == -1) ?
NULL : m_pOwner->m_pwsmagBase + m_iSelected;
InitializeControls();
// Note: we don't need to SaveAndValidate the outgoing window
// because that is done when a page loses activation.
}
else {
// Current selection is valid, but we need to reinitialize
// m_pwsmag because the base address may have changed.
ASSERT(m_pOwner->m_pwsmagBase);
m_pwsmag = m_pOwner->m_pwsmagBase + m_iSelected;
}
// Select the appropriate combo box item.
m_pcombo->SetCurSel(m_iSelected);
}
BOOL CWindowsPage::AddWindow()
{
// Save the attributes of any outgoing window. It's easiest
// to do this now while m_pwsmag is still valid.
if (m_iSelected != -1)
SaveAndValidate();
// Display new window dialog and add it to the array.
if (!m_pOwner->AddWindow(this, m_pcombo))
return FALSE;
// Select the new window.
SyncWithParent();
return TRUE;
}
BOOL CWindowsPage::DeleteWindow()
{
// The following call should set the current page's selection to -1.
if (!m_pOwner->DeleteWindow())
return FALSE;
SyncWithParent();
return TRUE;
}
#ifdef CHANGE_WINDOW_TITLE // not currently supported
BOOL CWindowsPage::ChangeWindowTitle(LPSTR lpszTitle)
{
if (!m_pOwner->ChangeWindowTitle(lpszTitle))
return FALSE;
ASSERT(m_pcombo);
m_pOwner->FillCombo(m_pcombo);
m_pcombo->SetCurSel(m_iSelected);
m_fInvalid = FALSE;
return TRUE;
}
#endif
BOOL CWindowsPage::IsMainWindow()
{
ASSERT(m_pwsmag);
// Note: the following call uses the document's LCID.
return (stricmp(m_pwsmag->rgchMember, "main") == 0);
}
BEGIN_MESSAGE_MAP(CWindowsPage, CPropertyPage)
//{{AFX_MSG_MAP(CWindowsPage)
ON_CBN_SELCHANGE(IDC_COMBO_WINDOWS, OnSelchangeComboWindows)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
ON_MESSAGE(WM_HELP, OnHelp)
END_MESSAGE_MAP()
void CWindowsPage::OnSelchangeComboWindows()
{
// Save any changes to the outgoing window.
if (m_iSelected != -1)
SaveAndValidate();
// Point to the new window.
m_iSelected = m_pOwner->m_iSelected = m_pcombo->GetCurSel();
m_pwsmag = m_pOwner->m_pwsmagBase + m_iSelected;
// Initialize controls based on new window.
InitializeControls();
}
LRESULT CWindowsPage::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
::WinHelp((HWND) wParam,
AfxGetApp()->m_pszHelpFilePath,
HELP_CONTEXTMENU, (DWORD) (LPVOID) GetHelpIDs());
return 0;
}
LRESULT CWindowsPage::OnHelp(WPARAM wParam, LPARAM lParam)
{
::WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle,
AfxGetApp()->m_pszHelpFilePath,
HELP_WM_HELP, (DWORD) (LPVOID) GetHelpIDs());
return 0;
}