/************************************************************************ * * * 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 #include #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); }