|
|
1.1 root 1: // chartdlg.cpp : Defines the behaviors for the Entry and print abort
2: // dialogs. The Entry dialog layout is defined in
3: // entry.dlg; print abort is defined in chart.rc
4: //
5: // This is a part of the Microsoft Foundation Classes C++ library.
6: // Copyright (C) 1992 Microsoft Corporation
7: // All rights reserved.
8: //
9: // This source code is only intended as a supplement to the
10: // Microsoft Foundation Classes Reference and Microsoft
11: // QuickHelp documentation provided with the library.
12: // See these sources for detailed information regarding the
13: // Microsoft Foundation Classes product.
14: //
15:
16: #include "chart.h"
17:
18: #include <ctype.h>
19:
20:
21: static char szFormat[] = "%5d %s";
22: static int nFormatSplit = 5;
23: static BOOL bChange;
24:
25: #define MAXSTRINGLEN 200
26:
27: /////////////////////////////////////////////////////////////////////////////
28: // CEntryDialog
29:
30: BEGIN_MESSAGE_MAP(CEntryDialog, CModalDialog)
31: ON_BN_CLICKED(BTN_ADD, OnBtnAdd)
32: ON_BN_CLICKED(BTN_DEL, OnBtnDel)
33: ON_LBN_SELCHANGE(LIST_BOX, OnListSelChange)
34: END_MESSAGE_MAP()
35:
36: // OnInitDialog:
37: // Initialize the data entry dialog. If there's already chart data,
38: // stuff it into the dialog.
39: // Note: This member function should not be put into the dialog
40: // class message map -- it is called automatically by the CModalDialog
41: // class code. This is a special case.
42: //
43: BOOL CEntryDialog::OnInitDialog()
44: {
45: // Call base class' for proper initialization.
46: //
47: if (!CModalDialog::OnInitDialog())
48: {
49: return FALSE;
50: }
51:
52: bChange = FALSE;
53:
54: // Initial conditions -- add items but don't delete them
55: //
56: GetDlgItem(BTN_ADD)->SetWindowText("Add");
57: GetDlgItem(BTN_DEL)->EnableWindow(FALSE);
58:
59: // If there's pre-existing data, stuff it into the dialog
60: //
61: if (m_pData != NULL)
62: {
63: ASSERT(m_pData->m_pChartData != NULL);
64: CObList* pData = m_pData->m_pChartData;
65:
66: // Insert the title here.
67: //
68: CEdit* pTitle = (CEdit*) GetDlgItem(EDIT_TITLE);
69: pTitle->SetSel(0, -1);
70: pTitle->ReplaceSel(m_pData->m_Title);
71:
72: int nItems = pData->GetCount();
73: if (nItems > 0)
74: {
75: // Now fill in the list box control.
76: //
77: CListBox* pListBox = (CListBox*) GetDlgItem(LIST_BOX);
78: pListBox->ResetContent();
79:
80: POSITION pos = pData->GetHeadPosition();
81:
82: for (int i = 0; i < nItems; i++)
83: {
84: CChartData* ptr;
85: char szValue[MAXSTRINGLEN];
86:
87: ptr = (CChartData*)pData->GetNext(pos);
88: sprintf(szValue, szFormat, ptr->height, ptr->szName);
89:
90: pListBox->AddString(szValue);
91: }
92: }
93: }
94:
95: return TRUE;
96: }
97:
98: // DoModal:
99: // While we're running this dialog, the member variable m_pData should
100: // point to the user's data.
101: //
102: void CEntryDialog::DoModal(CChartObject* pData)
103: {
104: m_pData = pData;
105: CModalDialog::DoModal();
106: m_pData = NULL;
107: }
108:
109: // OnListSelChange:
110: // The selection has changed; update edit fields with the new selection's
111: // height and label.
112: //
113: void CEntryDialog::OnListSelChange()
114: {
115: int nLength;
116: char szLabel[MAXSTRINGLEN];
117:
118: CListBox* pListBox = (CListBox*) GetDlgItem(LIST_BOX);
119:
120: m_nIndex = pListBox->GetCurSel();
121:
122: if (m_nIndex == LB_ERR)
123: {
124: m_nIndex = -1;
125: return;
126: }
127:
128: nLength = pListBox->GetText(m_nIndex, szLabel);
129: szLabel[nLength] = '\0';
130:
131: szLabel[nFormatSplit] = '\0';
132: GetDlgItem(EDIT_VALUE)->SetWindowText(szLabel);
133: GetDlgItem(EDIT_LABEL)->SetWindowText(&szLabel[nFormatSplit+1]);
134:
135: bChange = TRUE;
136: GetDlgItem(BTN_ADD)->SetWindowText("Change");
137: GetDlgItem(BTN_DEL)->EnableWindow();
138: }
139:
140: // OnBtnAdd:
141: // Transfer a new (height, label) from the edit fields to the listbox.
142: // Validate height before transfer
143: //
144: void CEntryDialog::OnBtnAdd()
145: {
146: int nLabLength, nLength;
147: char szValue[MAXSTRINGLEN];
148: char szLabel[MAXSTRINGLEN];
149: char szTitle[MAXSTRINGLEN];
150:
151: // valid #'s are ints >= 0
152:
153: BOOL bValid = FALSE;
154:
155: int iValue = GetDlgItemInt(EDIT_VALUE, &bValid, TRUE);
156:
157: if (bValid && (iValue >= 0))
158: {
159: SetDlgItemInt(EDIT_VALUE, iValue, FALSE);
160: }
161: else
162: {
163: MessageBox("An invalid value has been entered.", "Chart",
164: MB_ICONEXCLAMATION | MB_OK);
165: return;
166: }
167:
168: CWnd* pItem;
169: pItem = GetDlgItem(EDIT_LABEL);
170:
171: nLabLength = pItem->GetWindowTextLength();
172:
173: if (nLabLength >= MAXSTRINGLEN)
174: {
175: nLabLength = MAXSTRINGLEN-1;
176: }
177:
178: pItem->GetWindowText(szLabel, nLabLength+1);
179:
180: szLabel[nLabLength] = '\0';
181:
182: pItem = GetDlgItem(EDIT_TITLE);
183: nLength = pItem->GetWindowTextLength();
184:
185: if (nLength >= MAXSTRINGLEN)
186: {
187: nLength = MAXSTRINGLEN-1;
188: }
189:
190: pItem->GetWindowText(szTitle, nLength+1);
191:
192: szTitle[nLength] = '\0';
193:
194: m_pData->m_Title = szTitle;
195: sprintf(szValue, szFormat, iValue, szLabel);
196:
197: CListBox* pListBox = (CListBox*) GetDlgItem(LIST_BOX);
198:
199: if (!bChange)
200: {
201: pListBox->AddString(szValue);
202: }
203: else
204: {
205: pListBox->DeleteString(m_nIndex);
206: pListBox->InsertString(m_nIndex, szValue);
207:
208: bChange = FALSE;
209: GetDlgItem(BTN_ADD)->SetWindowText("Add");
210: GetDlgItem(BTN_DEL)->EnableWindow(FALSE);
211:
212: // Now no item is selected
213: m_nIndex = -1;
214: pListBox->SetCurSel(m_nIndex);
215: }
216:
217: m_pData->m_bDirty = TRUE;
218:
219: ClearEditBoxes();
220: }
221:
222: // OnBtnDel:
223: // Delete the currently selected entry
224: //
225: void CEntryDialog::OnBtnDel()
226: {
227: if (bChange)
228: {
229: CListBox* pListBox = (CListBox*) GetDlgItem(LIST_BOX);
230: pListBox->DeleteString(m_nIndex);
231:
232: // Now no item is selected
233: m_nIndex = -1;
234: pListBox->SetCurSel(m_nIndex);
235:
236: bChange = FALSE;
237: GetDlgItem(BTN_ADD)->SetWindowText("Add");
238: GetDlgItem(BTN_DEL)->EnableWindow(FALSE);
239: }
240:
241: m_pData->m_bDirty = TRUE;
242:
243: ClearEditBoxes();
244: }
245:
246: // OnOK:
247: // Transfer array data from the dialog to the app chart object
248: //
249: void CEntryDialog::OnOK()
250: {
251: if (!SetupArrayStructure())
252: return;
253:
254: CModalDialog::OnOK();
255: }
256:
257: // SetupArrayStructure:
258: //
259: BOOL CEntryDialog::SetupArrayStructure()
260: {
261: short nCount, nLength, i;
262: char szBuffer[MAXSTRINGLEN];
263: CWnd* pItem;
264:
265: m_pData->RemoveAll();
266:
267: pItem = GetDlgItem(EDIT_TITLE);
268: nLength = pItem->GetWindowTextLength();
269:
270: if (nLength >= MAXSTRINGLEN)
271: {
272: nLength = MAXSTRINGLEN-1;
273: }
274:
275: pItem->GetWindowText(szBuffer, nLength+1);
276: szBuffer[nLength] = '\0';
277:
278: if (m_pData->m_Title != szBuffer)
279: {
280: m_pData->m_Title = szBuffer;
281: m_pData->m_bDirty = TRUE;
282: }
283:
284:
285: CListBox* pListBox = (CListBox*) GetDlgItem(LIST_BOX);
286: nCount = pListBox->GetCount();
287:
288: if (nCount == 0)
289: {
290: MessageBox("Warning: no values in chart.","Chart");
291: }
292: else
293: {
294: for (i = 0; i < nCount; i++)
295: {
296: CChartData* ptr;
297:
298: ptr = new CChartData;
299: pListBox->GetText(i, szBuffer);
300:
301: szBuffer[nFormatSplit] = '\0';
302:
303: ptr->height = atoi(szBuffer);
304: strcpy(ptr->szName, &szBuffer[nFormatSplit+1]);
305:
306: m_pData->m_pChartData->AddTail(ptr);
307: }
308: }
309:
310: return TRUE;
311: }
312:
313: // ClearEditBoxes:
314: //
315: void CEntryDialog::ClearEditBoxes()
316: {
317: CEdit* pEditValue = (CEdit*) GetDlgItem(EDIT_VALUE);
318:
319: // Select entire field contents
320: pEditValue->SetSel(0, -1);
321: pEditValue->Clear();
322:
323: CEdit* pEditLabel = (CEdit*) GetDlgItem(EDIT_LABEL);
324: pEditLabel->SetSel(0, -1);
325: pEditLabel->Clear();
326:
327: pEditValue->SetFocus();
328: }
329:
330: ////////////////////////////////////////////////////////////////
331: // CPrintDlgBox
332: // Modeless print abort dialog box
333: //
334:
335: BEGIN_MESSAGE_MAP(CPrintDlgBox, CDialog)
336: ON_COMMAND(IDCANCEL, OnCancel)
337: END_MESSAGE_MAP()
338:
339: CPrintDlgBox::CPrintDlgBox()
340: {
341: // Dialog defined in chart.rc
342: //
343: Create("PrintDlgBox");
344: }
345:
346: // OnInitDialog:
347: // Disable this dialog box's system menu 'Close' item so user can't
348: // dismiss this dialog
349: //
350: BOOL CPrintDlgBox::OnInitDialog()
351: {
352: GetSystemMenu(FALSE)->EnableMenuItem(SC_CLOSE, MF_GRAYED);
353: return TRUE;
354: }
355:
356: // OnCancel:
357: // User hit the cancel button; re-enable the main frame window
358: // (disabled elsewhere)
359: //
360: void CPrintDlgBox::OnCancel()
361: {
362: extern BOOL bUserAbort;
363:
364: bUserAbort = TRUE;
365: GetParent()->EnableWindow(TRUE);
366: EndDialog(0);
367: }
368:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.