// formatta.cpp : implementation file // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1995 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "wordpad.h" #include "formatta.h" #include "ddxm.h" #include "helpids.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif const DWORD CFormatTabDlg::m_nHelpIDs[] = { IDC_BUTTON_SET, IDH_WORDPAD_TABSET, IDC_BUTTON_CLEAR, IDH_WORDPAD_TABCLEAR, IDC_BUTTON_CLEARALL, IDH_WORDPAD_TAB_CLEARALL, IDC_COMBO1, IDH_WORDPAD_TABSTOPS, IDC_BOX, (DWORD) -1, 0, 0 }; ///////////////////////////////////////////////////////////////////////////// // CFormatTabDlg dialog CFormatTabDlg::CFormatTabDlg(PARAFORMAT& pf, CWnd* pParent /*=NULL*/) : CCSDialog(CFormatTabDlg::IDD, pParent) { m_pf = pf; m_tabarray = new LONG[MAX_TAB_STOPS]; m_nCount = 0; if (m_pf.dwMask & PFM_TABSTOPS) { m_nCount = m_pf.cTabCount; ASSERT(m_pf.cTabCount <= MAX_TAB_STOPS); for (int i=0;i<m_pf.cTabCount;i++) m_tabarray[i] = m_pf.rgxTabs[i]; } //{{AFX_DATA_INIT(CFormatTabDlg) //}}AFX_DATA_INIT } CFormatTabDlg::~CFormatTabDlg() { delete [] m_tabarray; } void CFormatTabDlg::DoDataExchange(CDataExchange* pDX) { CCSDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFormatTabDlg) DDX_Control(pDX, IDC_BUTTON_CLEARALL, m_buttonClearAll); DDX_Control(pDX, IDC_BUTTON_SET, m_buttonSet); DDX_Control(pDX, IDC_BUTTON_CLEAR, m_buttonClear); DDX_Control(pDX, IDC_COMBO1, m_comboBox); //}}AFX_DATA_MAP if (!pDX->m_bSaveAndValidate) UpdateListBox(); } BEGIN_MESSAGE_MAP(CFormatTabDlg, CCSDialog) //{{AFX_MSG_MAP(CFormatTabDlg) ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnClickedClear) ON_BN_CLICKED(IDC_BUTTON_CLEARALL, OnClickedClearAll) ON_BN_CLICKED(IDC_BUTTON_SET, OnClickedSet) ON_CBN_EDITCHANGE(IDC_COMBO1, OnEditChange) ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchange) ON_MESSAGE(WM_HELP, OnHelp) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CFormatTabDlg message handlers void CFormatTabDlg::OnClickedClear() { int nTab; int nSel = m_comboBox.GetCurSel(); if (nSel == CB_ERR) { CDataExchange dx(this, TRUE); DDX_Twips(&dx, IDC_COMBO1, nTab); DDV_MinMaxTwips(&dx, nTab, 0, 31680); if (nTab != DDXM_BLANK) { if (RemoveTabFromArray(nTab)) UpdateListBox(); } } else { ASSERT(nSel < m_nCount); RemoveTabFromArrayByIndex(nSel); UpdateListBox(); } UpdateButtons(); SetEditFocus(); } void CFormatTabDlg::OnClickedClearAll() { m_nCount = 0; m_comboBox.ResetContent(); UpdateButtons(); SetEditFocus(); } void CFormatTabDlg::OnClickedSet() { Set(); UpdateButtons(); SetEditFocus(); } BOOL CFormatTabDlg::Set() { int nTab = 0; CDataExchange dx(this, TRUE); DDX_Twips(&dx, IDC_COMBO1, nTab); DDV_MinMaxTwips(&dx, nTab, 0, 31680); if (nTab != DDXM_BLANK) { if (m_nCount == MAX_TAB_STOPS) { AfxMessageBox(IDS_NOMORETABS); m_comboBox.Clear(); return FALSE; } if (AddTabToArray(nTab)) UpdateListBox(); return TRUE; } return FALSE; } void CFormatTabDlg::SetEditFocus() { m_comboBox.SetFocus(); m_comboBox.SetEditSel(0,-1); } BOOL CFormatTabDlg::RemoveTabFromArray(LONG lTab) { int i; for (i=0;i<m_nCount;i++) { if (m_tabarray[i] == lTab) { RemoveTabFromArrayByIndex(i); return TRUE; } } return FALSE; } void CFormatTabDlg::RemoveTabFromArrayByIndex(int nIndex) { memmove(&m_tabarray[nIndex], &m_tabarray[nIndex+1], (m_nCount-nIndex-1)*sizeof(LONG)); m_nCount--; } BOOL CFormatTabDlg::AddTabToArray(LONG lTab) { int i; BOOL bInsert = FALSE; LONG lTemp; for (i=0;i<m_nCount;i++) { if (!bInsert && lTab < m_tabarray[i]) bInsert = TRUE; else if (lTab == m_tabarray[i]) // we don't want repeats return FALSE; if (bInsert) { lTemp = m_tabarray[i]; m_tabarray[i] = lTab; lTab = lTemp; } } m_tabarray[m_nCount++] = lTab; return TRUE; } void CFormatTabDlg::UpdateListBox() { int i; TCHAR szT[64]; ASSERT(m_nCount >= 0); m_comboBox.ResetContent(); for (i=0;i<m_nCount;i++) { theApp.PrintTwips(szT, ARRAYSIZE(szT), m_tabarray[i], 2); m_comboBox.AddString(szT); } } void CFormatTabDlg::OnOK() { if (m_buttonSet.IsWindowEnabled()) { if (!Set()) return; } CCSDialog::OnOK(); m_pf.cTabCount = (SHORT) m_nCount; for (int i=0;i<m_nCount;i++) m_pf.rgxTabs[i] = m_tabarray[i]; m_pf.dwMask = PFM_TABSTOPS; } void CFormatTabDlg::OnEditChange() { UpdateButtons(); } void CFormatTabDlg::UpdateButton(CButton& button, BOOL b) { if (b != button.IsWindowEnabled()) button.EnableWindow(b); } void CFormatTabDlg::UpdateButtons() { UpdateButton(m_buttonClearAll, m_nCount > 0); BOOL bHasText = (m_comboBox.GetWindowTextLength() > 0); UpdateButton(m_buttonSet, bHasText); UpdateButton(m_buttonClear, bHasText); WORD wID = LOWORD(GetDefID()); if (bHasText && wID != IDC_BUTTON_SET) SetDefID(IDC_BUTTON_SET); else if (!bHasText && wID != IDOK) SetDefID(IDOK); } BOOL CFormatTabDlg::OnInitDialog() { CCSDialog::OnInitDialog(); UpdateButtons(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CFormatTabDlg::OnSelchange() { UpdateButton(m_buttonClearAll, m_nCount > 0); // force these since if the edit control is empty and // an item in the box is clicked on, the edit control will // not be filled in first UpdateButton(m_buttonSet, TRUE); UpdateButton(m_buttonClear, TRUE); WORD wID = LOWORD(GetDefID()); if (wID != IDC_BUTTON_SET) SetDefID(IDC_BUTTON_SET); } LONG CFormatTabDlg::OnHelp(WPARAM, LPARAM lParam) { LPHELPINFO phi = (LPHELPINFO) lParam ; HWND hWndCombo = ::GetDlgItem(m_hWnd, IDC_COMBO1) ; HWND hWndItem = (HWND) phi->hItemHandle ; if (::GetParent(hWndItem) == hWndCombo) { hWndItem = hWndCombo ; } ::WinHelp(hWndItem, AfxGetApp()->m_pszHelpFilePath, HELP_WM_HELP, (DWORD_PTR)GetHelpIDs()); return 0; }