home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / mfc / database / dynabind / sectform.cpp < prev    next >
C/C++ Source or Header  |  1998-03-26  |  9KB  |  344 lines

  1. // sectform.cpp : implementation of the CSectionForm class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "enroll.h"
  15. #include "sectset.h"
  16. #include "coursset.h"
  17. #include "enroldoc.h"
  18. #include "sectform.h"
  19. #include "addfield.h"
  20.  
  21. #ifdef _DEBUG
  22. #undef THIS_FILE
  23. static char BASED_CODE THIS_FILE[] = __FILE__;
  24. #endif
  25.  
  26. // For dynamically added fields
  27. #define IDC_EDIT_EXTRA 200
  28. #define IDC_STATIC_EXTRA 300
  29.  
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CSectionForm
  32.  
  33. IMPLEMENT_DYNCREATE(CSectionForm, CRecordView)
  34.  
  35. BEGIN_MESSAGE_MAP(CSectionForm, CRecordView)
  36.     //{{AFX_MSG_MAP(CSectionForm)
  37.     ON_CBN_SELENDOK(IDC_COURSELIST, OnSelendokCourselist)
  38.     //}}AFX_MSG_MAP
  39.     // Standard printing commands
  40.     ON_COMMAND(ID_OPTIONS_ADDFIELDS, OnOptionsAddfields)
  41.     ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
  42.     ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
  43.     ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
  44.     ON_COMMAND(ID_RECORD_REFRESH, OnRecordRefresh)
  45.     ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
  46. END_MESSAGE_MAP()
  47.  
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CSectionForm construction/destruction
  50.  
  51. CSectionForm::CSectionForm()
  52.     : CRecordView(CSectionForm::IDD)
  53. {
  54.     //{{AFX_DATA_INIT(CSectionForm)
  55.     m_pSet = NULL;
  56.     //}}AFX_DATA_INIT
  57.     m_bAddMode = FALSE;
  58. }
  59.  
  60. CSectionForm::~CSectionForm()
  61. {
  62.     while (!m_listEdit.IsEmpty())
  63.     {
  64.         delete m_listEdit.GetHead();
  65.         m_listEdit.RemoveHead();
  66.     }
  67.  
  68.     while (!m_listStatic.IsEmpty())
  69.     {
  70.         delete m_listStatic.GetHead();
  71.         m_listStatic.RemoveHead();
  72.     }
  73. }
  74.  
  75. void CSectionForm::DoDataExchange(CDataExchange* pDX)
  76. {
  77.     CRecordView::DoDataExchange(pDX);
  78.     //{{AFX_DATA_MAP(CSectionForm)
  79.     DDX_Control(pDX, IDC_STATIC_CAPACITY, m_staticLast);
  80.     DDX_Control(pDX, IDC_CAPACITY, m_editLast);
  81.     DDX_Control(pDX, IDC_SECTION, m_ctlSection);
  82.     DDX_Control(pDX, IDC_COURSELIST, m_ctlCourseList);
  83.     DDX_FieldCBString(pDX, IDC_COURSELIST, m_pSet->m_CourseID, m_pSet);
  84.     DDX_FieldText(pDX, IDC_CAPACITY, m_pSet->m_Capacity, m_pSet);
  85.     DDX_FieldText(pDX, IDC_INSTRUCTOR, m_pSet->m_InstructorID, m_pSet);
  86.     DDX_FieldText(pDX, IDC_ROOM, m_pSet->m_RoomNo, m_pSet);
  87.     DDX_FieldText(pDX, IDC_SCHEDULE, m_pSet->m_Schedule, m_pSet);
  88.     DDX_FieldText(pDX, IDC_SECTION, m_pSet->m_SectionNo, m_pSet);
  89.     //}}AFX_DATA_MAP
  90.  
  91.     // Make calls for any fields added at run-time
  92.     if (!m_pSet->m_listValue.IsEmpty())
  93.     {
  94.         UINT nField=0;
  95.         POSITION posValue = m_pSet->m_listValue.GetHeadPosition();
  96.         while (posValue)
  97.         {
  98.             DDX_FieldText(pDX, IDC_EDIT_EXTRA+nField,
  99.                 m_pSet->m_listValue.GetNext(posValue), m_pSet);
  100.             nField++;
  101.         }
  102.     }
  103. }
  104.  
  105.  
  106. void CSectionForm::OnInitialUpdate()
  107. {
  108.     m_pSet = &GetDocument()->m_sectionSet;
  109.  
  110.     // Fill the combo box with all of the courses
  111.     CEnrollDoc* pDoc = GetDocument();
  112.     if (!pDoc->m_courseSet.Open())
  113.         return;
  114.  
  115.     // Parameterize and sort the course recordset
  116.     m_pSet->m_strFilter = "CourseID = ?";
  117.     m_pSet->m_strCourseIDParam = pDoc->m_courseSet.m_CourseID;
  118.     m_pSet->m_strSort = "SectionNo";
  119.     m_pSet->m_pDatabase = pDoc->m_courseSet.m_pDatabase;
  120.  
  121.     CRecordView::OnInitialUpdate();
  122.  
  123.     m_ctlCourseList.ResetContent();
  124.     if (pDoc->m_courseSet.IsOpen())
  125.     {
  126.         while (pDoc->m_courseSet.IsEOF() != TRUE)
  127.         {
  128.             m_ctlCourseList.AddString(
  129.                 pDoc->m_courseSet.m_CourseID);
  130.             pDoc->m_courseSet.MoveNext();
  131.         }
  132.     }
  133.     m_ctlCourseList.SetCurSel(0);
  134.  
  135. }
  136.  
  137. BOOL CSectionForm::OnMove(UINT nIDMoveCommand)
  138. {
  139.     if (m_bAddMode)
  140.     {
  141.         if (!UpdateData())
  142.             return FALSE;
  143.         TRY
  144.         {
  145.             m_pSet->Update();
  146.         }
  147.         CATCH(CDBException, e)
  148.         {
  149.             AfxMessageBox(e->m_strError);
  150.             return FALSE;
  151.         }
  152.         END_CATCH
  153.  
  154.         m_pSet->Requery();
  155.         UpdateData(FALSE);
  156.         m_ctlSection.SetReadOnly(TRUE);
  157.         m_bAddMode = FALSE;
  158.         return TRUE;
  159.     }
  160.     else
  161.     {
  162.         return CRecordView::OnMove(nIDMoveCommand);
  163.     }
  164. }
  165.  
  166. /////////////////////////////////////////////////////////////////////////////
  167. // CSectionForm printing
  168.  
  169. BOOL CSectionForm::OnPreparePrinting(CPrintInfo* pInfo)
  170. {
  171.     // default preparation
  172.     return DoPreparePrinting(pInfo);
  173. }
  174.  
  175. void CSectionForm::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  176. {
  177.     // TODO: add extra initialization before printing
  178. }
  179.  
  180. void CSectionForm::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  181. {
  182.     // TODO: add cleanup after printing
  183. }
  184.  
  185. /////////////////////////////////////////////////////////////////////////////
  186. // CSectionForm diagnostics
  187.  
  188. #ifdef _DEBUG
  189. void CSectionForm::AssertValid() const
  190. {
  191.     CRecordView::AssertValid();
  192. }
  193.  
  194. void CSectionForm::Dump(CDumpContext& dc) const
  195. {
  196.     CRecordView::Dump(dc);
  197. }
  198.  
  199. CEnrollDoc* CSectionForm::GetDocument() // non-debug version is inline
  200. {
  201.     return STATIC_DOWNCAST(CEnrollDoc, m_pDocument);
  202. }
  203. #endif //_DEBUG
  204.  
  205. /////////////////////////////////////////////////////////////////////////////
  206. // CSectionForm database support
  207.  
  208. CRecordset* CSectionForm::OnGetRecordset()
  209. {
  210.     return m_pSet;
  211. }
  212.  
  213. /////////////////////////////////////////////////////////////////////////////
  214. // CSectionForm message handlers
  215.  
  216.  
  217. void CSectionForm::OnSelendokCourselist()
  218. {
  219.     m_ctlCourseList.GetLBText(m_ctlCourseList.GetCurSel(),
  220.         m_pSet->m_strCourseIDParam);
  221.     if (!m_bAddMode)
  222.     {
  223.         m_pSet->Requery();
  224.         if (m_pSet->IsEOF())
  225.         {
  226.             m_pSet->SetFieldNull(&(m_pSet->m_CourseID), FALSE);
  227.             m_pSet->m_CourseID = m_pSet->m_strCourseIDParam;
  228.         }
  229.         UpdateData(FALSE);
  230.     }
  231. }
  232.  
  233. void CSectionForm::OnRecordAdd()
  234. {
  235.     // If already in add mode, then complete previous new record
  236.     if (m_bAddMode)
  237.         OnMove(ID_RECORD_FIRST);
  238.  
  239.     CString strCurrentCourse = m_pSet->m_CourseID;
  240.     m_pSet->AddNew();
  241.     m_pSet->SetFieldNull(&(m_pSet->m_CourseID), FALSE);
  242.     m_pSet->m_CourseID = strCurrentCourse;
  243.     m_bAddMode = TRUE;
  244.     m_ctlSection.SetReadOnly(FALSE);
  245.     UpdateData(FALSE);
  246. }
  247.  
  248. void CSectionForm::OnRecordRefresh()
  249. {
  250.     if (m_bAddMode == TRUE)
  251.     {
  252.         m_pSet->Move(AFX_MOVE_REFRESH);
  253.         m_ctlSection.SetReadOnly(TRUE);
  254.         m_bAddMode = FALSE;
  255.     }
  256.     // Copy fields from recordset to form, thus
  257.     // overwriting any changes user may have made
  258.     // on the form
  259.     UpdateData(FALSE);
  260. }
  261.  
  262. void CSectionForm::OnRecordDelete()
  263. {
  264.     TRY
  265.     {
  266.         m_pSet->Delete();
  267.     }
  268.     CATCH(CDBException, e)
  269.     {
  270.         AfxMessageBox(e->m_strError);
  271.         return;
  272.     }
  273.     END_CATCH
  274.  
  275.     // Move to the next record after the one just deleted
  276.         m_pSet->MoveNext();
  277.  
  278.     // If we moved off the end of file, then move back to last record
  279.     if (m_pSet->IsEOF())
  280.         m_pSet->MoveLast();
  281.  
  282.     // If the recordset is now empty, then clear the fields
  283.     // left over from the deleted record
  284.     if (m_pSet->IsBOF())
  285.         m_pSet->SetFieldNull(NULL);
  286.     UpdateData(FALSE);
  287. }
  288.  
  289. void CSectionForm::OnOptionsAddfields()
  290. {
  291.     CAddField addfield;
  292.  
  293.     addfield.m_pSet = m_pSet;
  294.     if (addfield.DoModal() != IDOK || addfield.m_strField.IsEmpty())
  295.         return;
  296.  
  297.     CEdit* pedit;
  298.     CStatic* pstatic;
  299.     if (m_listEdit.IsEmpty())
  300.     {
  301.         // Find coordinates of Schedule edit control
  302.         m_editLast.GetWindowRect(&m_rc);
  303.         ScreenToClient(&m_rc);
  304.         m_nOffset = (m_rc.bottom - m_rc.top) + 10;
  305.  
  306.         // Find coords of Schedule label
  307.         m_staticLast.GetWindowRect(&m_rcStatic);
  308.         ScreenToClient(&m_rcStatic);
  309.  
  310.     }
  311.  
  312.     pedit = new CEdit();
  313.     m_listEdit.AddTail((CObject*)pedit);
  314.     m_rc.top += m_nOffset;
  315.     m_rc.bottom += m_nOffset;
  316.     pedit->Create(WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,
  317.         m_rc, this, IDC_EDIT_EXTRA+m_listEdit.GetCount()-1);
  318.     pedit->SetFont(GetFont());
  319.  
  320.     pstatic = new CStatic();
  321.     m_listStatic.AddTail((CObject*)pstatic);
  322.     m_rcStatic.top += m_nOffset;
  323.     m_rcStatic.bottom += m_nOffset;
  324.     CString Label = addfield.m_strField;
  325.     Label += ":";
  326.     pstatic->Create(Label, WS_CHILD | WS_VISIBLE, m_rcStatic, this,
  327.         IDC_STATIC_EXTRA+m_listStatic.GetCount()-1);
  328.     pstatic->SetFont(GetFont());
  329.  
  330.     // Resize the form to fit newly added controls
  331.     CSize size = GetTotalSize();
  332.     size.cy += m_nOffset;
  333.     SetScrollSizes(MM_TEXT, size);
  334.     GetParentFrame()->RecalcLayout();
  335.     ResizeParentToFit(FALSE);
  336.  
  337.     m_pSet->Close();
  338.     m_pSet->AddTextField(addfield.m_strField);
  339.     m_pSet->Open();
  340.  
  341.     // Fill new controls with data
  342.     UpdateData(FALSE);
  343. }
  344.