Annotation of mstools/mfc/samples/chart/chartdlg.cpp, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.