Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

601 lines
15 KiB

/************************************************************************
* *
* FORMWND.CPP *
* *
* Copyright (C) Microsoft Corporation 1995 *
* All Rights reserved. *
* *
************************************************************************/
#include "stdafx.h"
#include "resource.h"
#pragma hdrstop
#include "hpjdoc.h"
#include "formwnd.h"
#include "setwinpo.h"
#include "setwinco.h"
#include "btnsec.h"
#include "addalias.h"
#include <limits.h>
#include <string.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static const DWORD aHelpIds[] = {
IDC_COMBO_WINDOWS, IDH_COMBO_WINDOWS,
IDC_BUTTON_ADD_WINDOW, IDH_BUTTON_ADD_WINDOW,
IDC_BUTTON_REMOVE_WINDOW, IDH_BUTTON_REMOVE_WINDOW,
IDC_EDIT_WINDOW_TITLE, IDH_EDIT_WINDOW_TITLE,
IDC_RADIO_AUTOSIZE, IDH_RADIO_AUTOSIZE,
IDC_RADIO_MAXIMIZE, IDH_RADIO_MAXIMIZE,
IDC_BUTTON_SET_POS, IDH_BUTTON_SET_POS,
IDC_BUTTON_BUTTONS, IDH_BUTTON_BUTTONS,
IDC_BUTTON_COLORS, IDH_BUTTON_COLORS,
IDC_TXT_LEFT, IDH_TXT_POSITION,
IDC_TXT_TOP, IDH_TXT_POSITION,
IDC_TXT_WIDTH, IDH_TXT_POSITION,
IDC_TXT_HEIGHT, IDH_TXT_POSITION,
0, 0
};
CFormWnd::CFormWnd(CHpjDoc* pHpjDoc, CWnd* pParent)
: CDialog(CFormWnd::IDD, pParent)
{
pDoc = pHpjDoc;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
if (pDoc->cwsmags) {
cwsmags = pDoc->cwsmags;
/*
* Allocate and copy the various window structures to our own
* copy. We'll restore the document version when we're asked
* to save our data.
*/
pwsmagBase = (PSTR) lcCalloc(sizeof(WSMAG) * cwsmags);
memcpy(pwsmagBase, pDoc->pwsmagBase, sizeof(WSMAG) * cwsmags);
}
else
pwsmagBase = NULL;
//{{AFX_DATA_INIT(CFormWnd)
m_cszTitle = "";
m_cszComment = "";
//}}AFX_DATA_INIT
pwsmag = NULL;
fInitialized = FALSE;
pcombo = NULL;
}
CFormWnd::~CFormWnd()
{
if (pwsmagBase)
lcFree(pwsmagBase);
}
static const char txtDefault[] = "default";
void CFormWnd::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFormWnd)
DDX_Text(pDX, IDC_EDIT_WINDOW_TITLE, m_cszTitle);
DDV_MaxChars(pDX, m_cszTitle, CBMAXTITLE - 1);
DDX_Text(pDX, IDC_EDIT_COMMENT, m_cszComment);
//}}AFX_DATA_MAP
if (pDX->m_bSaveAndValidate) {
if (cwsmags > UCHAR_MAX) {
MsgBox(IDS_TOO_MANY_WINDOWS);
pDX->Fail();
}
else if (pDoc->options.fVersion3 && cwsmags > 6) {
if (AfxMessageBox(IDS_TOO_MANY_WNDS_FOR_VERSION, MB_YESNO, 0)
== IDNO)
pDX->Fail();
}
}
if (!pcombo)
pcombo = (CComboBox*) GetDlgItem(IDC_COMBO_WINDOWS);
// REVIEW: no dice -- we must duplicate the document's pwsmagBase,
// and only set the document's version if the user clicks OK.
if (!pDX->m_bSaveAndValidate) { // initialization
if (!fInitialized) {
SetChicagoDialogStyles(m_hWnd);
fInitialized = TRUE;
/*
* If we don't have a window, then we add one now.
* Without a window, the dialog doesn't make sense.
*/
if (!pwsmagBase) {
if (!AddWindow())
SendMessage(WM_COMMAND, IDCANCEL, 0);
return;
}
/*
* We call ourselves whenever the combo-box changes, but
* we only want to execute this code once.
*/
if (pwsmagBase) {
for (int i = 0; i < cwsmags; i++) {
pwsmag = (PWSMAG)
(sizeof(WSMAG) * i + pwsmagBase);
pcombo->AddString(pwsmag->rgchMember);
}
pwsmag = (PWSMAG) pwsmagBase;
}
if (pwsmag) {
pcombo->SelectString(-1, pwsmag->rgchMember);
((CEdit*) GetDlgItem(IDC_EDIT_WINDOW_TITLE))->
SetWindowText(pwsmag->rgchCaption);
((CEdit*) GetDlgItem(IDC_EDIT_COMMENT))->
SetWindowText((pwsmag->pcszComment ?
*pwsmag->pcszComment : ""));
}
InitializeControls();
}
else {
InitializeControls();
}
}
else { // save the data
if (pwsmagBase) {
ASSERT(pwsmag);
SaveTitleComment();
if (cwsmags != pDoc->cwsmags) {
pDoc->cwsmags = cwsmags;
if (!cwsmags) {
lcFree(pDoc->pwsmagBase);
pDoc->pwsmagBase = NULL;
return; // nothing more to do if no window defs
}
else {
if (pDoc->pwsmagBase)
pDoc->pwsmagBase =
(PSTR) lcReAlloc(pDoc->pwsmagBase,
sizeof(WSMAG) * cwsmags);
else
pDoc->pwsmagBase =
(PSTR) lcCalloc(sizeof(WSMAG) * cwsmags);
if (!pDoc->pwsmagBase)
OOM();
}
}
memcpy(pDoc->pwsmagBase, pwsmagBase, sizeof(WSMAG) * cwsmags);
}
}
}
BEGIN_MESSAGE_MAP(CFormWnd, CDialog)
//{{AFX_MSG_MAP(CFormWnd)
ON_BN_CLICKED(IDC_BUTTON_SET_POS, OnButtonSetPos)
ON_BN_CLICKED(IDC_BUTTON_BUTTONS, OnButtons)
ON_CBN_SELCHANGE(IDC_COMBO_WINDOWS, OnSelchangeComboWindows)
ON_BN_CLICKED(IDC_CHECK_ABSOLUTE, OnCheckAbsolute)
ON_BN_CLICKED(IDC_ON_TOP, OnCheckOnTop)
ON_BN_CLICKED(IDC_BUTTON_DEFAULT_POS, OnButtonDefaultPos)
ON_BN_CLICKED(IDC_BUTTON_COLORS, OnButtonColors)
ON_BN_CLICKED(IDC_BUTTON_ADD_WINDOW, OnButtonAddWindow)
ON_BN_CLICKED(IDC_BUTTON_REMOVE_WINDOW, OnButtonRemoveWindow)
ON_BN_CLICKED(IDC_RADIO_STANDARD, OnRadioStandard)
ON_BN_CLICKED(IDC_RADIO_AUTOSIZE, OnRadioAutosize)
ON_BN_CLICKED(IDC_RADIO_MAXIMIZE, OnRadioMaximize)
ON_BN_CLICKED(IDHELP, OnHelp)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
ON_MESSAGE(WM_HELP, OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFormWnd message handlers
void CFormWnd::OnButtonSetPos()
{
CSetWinPos cwinpos(pwsmag, this);
cwinpos.DoModal();
InitializeSize(pwsmag);
}
LRESULT CFormWnd::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
::WinHelp((HWND) wParam,
AfxGetApp()->m_pszHelpFilePath,
HELP_CONTEXTMENU, (DWORD) (LPVOID) aHelpIds);
return 0;
}
LRESULT CFormWnd::OnHelp(WPARAM wParam, LPARAM lParam)
{
::WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle,
AfxGetApp()->m_pszHelpFilePath,
HELP_WM_HELP, (DWORD) (LPVOID) aHelpIds);
return 0;
}
void CFormWnd::OnButtons()
{
CBtnSec btnsec(pwsmag, (cwsmags > 1));
btnsec.DoModal();
}
void CFormWnd::OnSelchangeComboWindows()
{
if (pwsmagBase) {
SaveTitleComment();
char szBuf[50];
pcombo->GetLBText(pcombo->GetCurSel(), szBuf);
for (int i = 0; i < cwsmags; i++) {
PWSMAG pwsmagNew = (PWSMAG)
(sizeof(WSMAG) * i + pwsmagBase);
if (lstrcmpi(pwsmagNew->rgchMember, szBuf) == 0) {
if (pwsmagNew == pwsmag)
return; // nothing has changed
else {
pwsmag = pwsmagNew;
((CEdit*) GetDlgItem(IDC_EDIT_WINDOW_TITLE))->
SetWindowText(pwsmag->rgchCaption);
((CEdit*) GetDlgItem(IDC_EDIT_COMMENT))->
SetWindowText((pwsmag->pcszComment ?
*pwsmag->pcszComment : ""));
InitializeControls();
return;
}
}
}
}
}
static const char txtMain[] = "main";
void STDCALL CFormWnd::InitializeControls(void)
{
((CButton*) GetDlgItem(IDC_BUTTON_SET_POS))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_BUTTON_BUTTONS))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_BUTTON_REMOVE_WINDOW))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_EDIT_WINDOW_TITLE))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_RADIO_STANDARD))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_RADIO_AUTOSIZE))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_RADIO_MAXIMIZE))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_BUTTON_COLORS))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_BUTTON_DEFAULT_POS))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_CHECK_ABSOLUTE))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CButton*) GetDlgItem(IDC_ON_TOP))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CEdit*) GetDlgItem(IDC_EDIT_COMMENT))->
EnableWindow(pwsmag ? TRUE : FALSE);
((CEdit*) GetDlgItem(IDC_EDIT_WINDOW_TITLE))->
EnableWindow(pwsmag ? TRUE : FALSE);
if (pwsmag) {
((CButton*) GetDlgItem(IDC_CHECK_ABSOLUTE))->
SetCheck(pwsmag->grf & FWSMAG_ABSOLUTE);
((CButton*) GetDlgItem(IDC_ON_TOP))->
SetCheck(pwsmag->grf & FWSMAG_ON_TOP);
InitializeSize(pwsmag);
int idBtn;
if (pwsmag->grf & FWSMAG_AUTO_SIZE)
idBtn = IDC_RADIO_AUTOSIZE;
else if (pwsmag->wMax & 1)
idBtn = IDC_RADIO_MAXIMIZE;
else
idBtn = IDC_RADIO_STANDARD;
CheckRadioButton(IDC_RADIO_MAXIMIZE, IDC_RADIO_STANDARD,
idBtn);
// Maximized windows can't be auto-sized.
if (lstrcmpi(pwsmag->rgchMember, txtMain) == 0)
((CButton*) GetDlgItem(IDC_RADIO_AUTOSIZE))->
EnableWindow(FALSE);
else
((CButton*) GetDlgItem(IDC_RADIO_AUTOSIZE))->
EnableWindow(TRUE);
}
}
void STDCALL CFormWnd::InitializeSize(PWSMAG pSetWsmag)
{
char szBuf[20];
if (pSetWsmag->grf & FWSMAG_X) {
_itoa(pSetWsmag->x, szBuf, 10);
((CStatic*) GetDlgItem(IDC_TXT_LEFT))->
SetWindowText(szBuf);
}
else
((CStatic*) GetDlgItem(IDC_TXT_LEFT))->
SetWindowText(txtDefault);
if (pSetWsmag->grf & FWSMAG_Y) {
_itoa(pSetWsmag->y, szBuf, 10);
((CStatic*) GetDlgItem(IDC_TXT_TOP))->
SetWindowText(szBuf);
}
else
((CStatic*) GetDlgItem(IDC_TXT_TOP))->
SetWindowText(txtDefault);
if (pSetWsmag->grf & FWSMAG_DX) {
_itoa(pSetWsmag->dx, szBuf, 10);
((CStatic*) GetDlgItem(IDC_TXT_WIDTH))->
SetWindowText(szBuf);
}
else
((CStatic*) GetDlgItem(IDC_TXT_WIDTH))->
SetWindowText(txtDefault);
if (pSetWsmag->grf & FWSMAG_DY) {
_itoa(pSetWsmag->dy, szBuf, 10);
((CStatic*) GetDlgItem(IDC_TXT_HEIGHT))->
SetWindowText(szBuf);
}
else
((CStatic*) GetDlgItem(IDC_TXT_HEIGHT))->
SetWindowText(txtDefault);
}
void CFormWnd::OnCheckAbsolute()
{
CButton* pbtn = (CButton*) GetDlgItem(IDC_CHECK_ABSOLUTE);
if (pbtn->GetCheck()) {
if (pDoc->options.fVersion3) { // not allowed with a version 3 help file
if (AfxMessageBox(IDS_NO_ABS_WITH_VER3, MB_YESNO, 0) == IDNO) {
pbtn->SetCheck(FALSE);
return;
}
else
pDoc->options.fVersion3 = FALSE;
}
if (!(pwsmag->grf & FWSMAG_ABSOLUTE)) {
if (pwsmag->grf & FWSMAG_X)
pwsmag->x = MulDiv(pwsmag->x, cxScreen, dxVirtScreen);
if (pwsmag->grf & FWSMAG_Y)
pwsmag->y = MulDiv(pwsmag->y, cyScreen, dyVirtScreen);
if (pwsmag->grf & FWSMAG_DX)
pwsmag->dx = MulDiv(pwsmag->dx, cxScreen, dxVirtScreen);
if (pwsmag->grf & FWSMAG_DY)
pwsmag->dy = MulDiv(pwsmag->dy, cyScreen, dyVirtScreen);
pwsmag->grf |= FWSMAG_ABSOLUTE;
InitializeSize(pwsmag);
}
}
else {
if (pwsmag->grf & FWSMAG_ABSOLUTE) {
if (pwsmag->grf & FWSMAG_X)
pwsmag->x = MulDiv(pwsmag->x, dxVirtScreen, cxScreen);
if (pwsmag->grf & FWSMAG_Y)
pwsmag->y = MulDiv(pwsmag->y, dyVirtScreen, cyScreen);
if (pwsmag->grf & FWSMAG_DX)
pwsmag->dx = MulDiv(pwsmag->dx, dxVirtScreen, cxScreen);
if (pwsmag->grf & FWSMAG_DY)
pwsmag->dy = MulDiv(pwsmag->dy, dyVirtScreen, cyScreen);
pwsmag->grf &= ~FWSMAG_ABSOLUTE;
InitializeSize(pwsmag);
}
}
}
void CFormWnd::OnCheckOnTop()
{
if (((CButton*) GetDlgItem(IDC_ON_TOP))->GetCheck())
pwsmag->grf |= FWSMAG_ON_TOP;
else
pwsmag->grf &= ~FWSMAG_ON_TOP;
}
void CFormWnd::OnButtonDefaultPos()
{
pwsmag->grf &= ~(FWSMAG_X | FWSMAG_Y | FWSMAG_DX | FWSMAG_DY);
InitializeSize(pwsmag);
}
void CFormWnd::OnButtonColors()
{
CSetWinColor cwincolor(pwsmag, this);
cwincolor.DoModal();
}
void CFormWnd::OnButtonAddWindow()
{
AddWindow();
}
void CFormWnd::OnButtonRemoveWindow()
{
if (pwsmagBase) {
char szBuf[50];
int cursel = pcombo->GetCurSel();
pcombo->GetLBText(pcombo->GetCurSel(), szBuf);
for (int i = 0; i < cwsmags; i++) {
pwsmag = (PWSMAG)
(sizeof(WSMAG) * i + pwsmagBase);
if (lstrcmpi(pwsmag->rgchMember, szBuf) == 0) {
if (i < cwsmags - 1) // fill in the hole
memcpy(&pwsmag[0], &pwsmag[1],
sizeof(WSMAG) * (cwsmags - i - 1));
cwsmags--;
if (cwsmags)
pwsmagBase = (PSTR) lcReAlloc(pwsmagBase,
sizeof(WSMAG) * cwsmags);
else {
lcClearFree(&pwsmagBase);
pwsmag = NULL;
}
pcombo->DeleteString(cursel);
if (cwsmags) {
pwsmag = (PWSMAG)
(sizeof(WSMAG) * (cwsmags - 1) + pwsmagBase);
((CEdit*) GetDlgItem(IDC_EDIT_WINDOW_TITLE))->
SetWindowText(pwsmag->rgchCaption);
((CEdit*) GetDlgItem(IDC_EDIT_COMMENT))->
SetWindowText((pwsmag->pcszComment ?
*pwsmag->pcszComment : ""));
}
InitializeControls();
if (pwsmag)
pcombo->SelectString(-1, pwsmag->rgchMember);
else
pcombo->ResetContent();
return;
}
}
ASSERT(i < cwsmags); // if we assert, we didn't find the window
}
}
BOOL STDCALL CFormWnd::AddWindow(void)
{
CAddAlias addwindow(this);
addwindow.idDlgCaption = IDS_ADD_WINDOW_CAPTION;
addwindow.idStr1Prompt = IDS_ADD_WINDOW;
addwindow.idStr2Prompt = CAddAlias::HIDE_CONTROL;
addwindow.cbMaxStr1 = 8; // window names can only have 8 characters
addwindow.idEmptyStr1 = IDS_EMPTY_WINDOW;
DisplayDialog:
if (addwindow.DoModal() == IDOK) {
if (!pwsmagBase) {
pwsmagBase =(PSTR) lcCalloc(sizeof(WSMAG));
if (!pwsmagBase)
OOM(); // should we save first?
cwsmags = 1;
}
else {
for (int i = 0; i < cwsmags; i++) {
pwsmag = (PWSMAG)
(sizeof(WSMAG) * i + pwsmagBase);
if (_stricmp(addwindow.m_cszContext,
pwsmag->rgchMember) == 0) {
CString cstr;
AfxFormatString1(cstr, IDS_WINDOW_ALREADY_ADDED,
addwindow.m_cszContext);
AfxMessageBox(cstr);
goto DisplayDialog;
}
}
cwsmags++;
pwsmagBase = (PSTR) lcReAlloc(pwsmagBase,
sizeof(WSMAG) * cwsmags);
if (!pwsmagBase)
OOM(); // should we save first?
}
pwsmag = (PWSMAG)
(sizeof(WSMAG) * (cwsmags - 1) + pwsmagBase);
strcpy(pwsmag->rgchMember, addwindow.m_cszContext);
if (!addwindow.m_str3.IsEmpty()) {
m_cszComment = addwindow.m_str3;
((CEdit*) GetDlgItem(IDC_EDIT_COMMENT))->
SetWindowText(m_cszComment);
}
((CEdit*) GetDlgItem(IDC_EDIT_WINDOW_TITLE))->
SetWindowText(pwsmag->rgchCaption);
pcombo->AddString(pwsmag->rgchMember);
pcombo->SelectString(-1, pwsmag->rgchMember);
InitializeControls();
return TRUE;
}
return FALSE;
}
void CFormWnd::OnRadioStandard()
{
ASSERT(pwsmag);
pwsmag->grf &= ~(FWSMAG_AUTO_SIZE | FWSMAG_MAXIMIZE);
pwsmag->wMax &= ~(FWSMAG_WMAX_MAXIMIZE);
}
void CFormWnd::OnRadioAutosize()
{
ASSERT(pwsmag);
pwsmag->grf &= ~(FWSMAG_MAXIMIZE);
pwsmag->grf |= FWSMAG_AUTO_SIZE;
pwsmag->wMax &= ~(FWSMAG_WMAX_MAXIMIZE);
}
void CFormWnd::OnRadioMaximize()
{
ASSERT(pwsmag);
pwsmag->grf &= ~(FWSMAG_AUTO_SIZE);
pwsmag->grf |= FWSMAG_MAXIMIZE;
pwsmag->wMax |= FWSMAG_WMAX_MAXIMIZE;
}
void CFormWnd::SaveTitleComment(void)
{
((CEdit*) GetDlgItem(IDC_EDIT_WINDOW_TITLE))->
GetWindowText(m_cszTitle);
((CEdit*) GetDlgItem(IDC_EDIT_COMMENT))->
GetWindowText(m_cszComment);
if (!m_cszTitle.IsEmpty()) {
pwsmag->grf |= FWSMAG_CAPTION;
lstrcpyn(pwsmag->rgchCaption, m_cszTitle, CBMAXTITLE);
}
else {
pwsmag->grf &= ~FWSMAG_CAPTION;
*pwsmag->rgchCaption = '\0';
}
if (!m_cszComment.IsEmpty()) {
if (pwsmag->pcszComment)
*pwsmag->pcszComment = m_cszComment;
else
pwsmag->pcszComment = new CString(m_cszComment);
}
else if (pwsmag->pcszComment) {
delete pwsmag->pcszComment;
pwsmag->pcszComment = NULL;
}
}
void CFormWnd::OnHelp()
{
HelpOverview(m_hWnd, IDH_HCW_FORM_WINDOW);
}