home *** CD-ROM | disk | FTP | other *** search
/ Mastering MFC Development / MMD.ISO / samples / c08 / add_del / bibview.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-02-20  |  11.1 KB  |  488 lines

  1. // BiblioView.cpp : implementation of the CBiblioView class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "Biblio.h"
  6. #include "mainfrm.h"
  7. #include "BibSet.h"
  8. #include "BibDoc.h"
  9. #include "BibView.h"
  10.  
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16.  
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CBiblioView
  19.  
  20. IMPLEMENT_DYNCREATE(CBiblioView, CDaoRecordView)
  21.  
  22. BEGIN_MESSAGE_MAP(CBiblioView, CDaoRecordView)
  23.     //{{AFX_MSG_MAP(CBiblioView)
  24.     ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
  25.     ON_UPDATE_COMMAND_UI(ID_RECORD_ADD, OnUpdateRecordAdd)
  26.     ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
  27.     ON_UPDATE_COMMAND_UI(ID_RECORD_DELETE, OnUpdateRecordDelete)
  28.     ON_COMMAND(ID_TRANSACT_BEGIN, OnTransactBegin)
  29.     ON_UPDATE_COMMAND_UI(ID_TRANSACT_BEGIN, OnUpdateTransactBegin)
  30.     ON_COMMAND(ID_TRANSACT_COMMIT, OnTransactCommit)
  31.     ON_UPDATE_COMMAND_UI(ID_TRANSACT_COMMIT, OnUpdateTransactCommit)
  32.     ON_COMMAND(ID_TRANSACT_ROLLBACK, OnTransactRollback)
  33.     ON_UPDATE_COMMAND_UI(ID_TRANSACT_ROLLBACK, OnUpdateTransactRollback)
  34.     ON_COMMAND(ID_RECORD_EDIT, OnRecordEdit)
  35.     ON_UPDATE_COMMAND_UI(ID_RECORD_EDIT, OnUpdateRecordEdit)
  36.     //}}AFX_MSG_MAP
  37.     ON_UPDATE_COMMAND_UI(ID_INDICATOR_TRANSACT, OnUpdateIndicatorTransact)
  38. END_MESSAGE_MAP()
  39.  
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CBiblioView construction/destruction
  42.  
  43. CBiblioView::CBiblioView()
  44.     : CDaoRecordView(CBiblioView::IDD)
  45. {
  46.     //{{AFX_DATA_INIT(CBiblioView)
  47.     m_pSet = NULL;
  48.     //}}AFX_DATA_INIT
  49.     // TODO: add construction code here
  50.     m_bOnRecordAdd = FALSE;
  51.     m_bTransact = FALSE;
  52.     m_nTransactions = 0;
  53. }
  54.  
  55. CBiblioView::~CBiblioView()
  56. {
  57. }
  58.  
  59. void CBiblioView::DoDataExchange(CDataExchange* pDX)
  60. {
  61.     CDaoRecordView::DoDataExchange(pDX);
  62.     //{{AFX_DATA_MAP(CBiblioView)
  63.     DDX_FieldText(pDX, IDC_TITLE, m_pSet->m_Title, m_pSet);
  64.     DDX_FieldText(pDX, IDC_ISBN, m_pSet->m_ISBN, m_pSet);
  65.     DDX_FieldText(pDX, IDC_YEAR_PUBLISHED, m_pSet->m_Year_Published, m_pSet);
  66.     DDX_FieldText(pDX, IDC_SUBJECT, m_pSet->m_Subject, m_pSet);
  67.     DDX_FieldText(pDX, IDC_NOTES, m_pSet->m_Notes, m_pSet);
  68.     DDX_FieldText(pDX, IDC_COMMENTS, m_pSet->m_Comments, m_pSet);
  69.     DDX_FieldText(pDX, IDC_DESCRIPTION, m_pSet->m_Description, m_pSet);
  70.     DDX_FieldText(pDX, IDC_PUBID, m_pSet->m_PubID, m_pSet);
  71.     //}}AFX_DATA_MAP
  72. }
  73.  
  74. BOOL CBiblioView::PreCreateWindow(CREATESTRUCT& cs)
  75. {
  76.     // TODO: Modify the Window class or styles here by modifying
  77.     //  the CREATESTRUCT cs
  78.  
  79.     return CDaoRecordView::PreCreateWindow(cs);
  80. }
  81.  
  82. void CBiblioView::OnInitialUpdate()
  83. {
  84.     m_pSet = &GetDocument()->m_biblioSet;
  85.     CDaoRecordView::OnInitialUpdate();
  86.  
  87.     // Size parent to fit size of RecordView form
  88.     GetParentFrame()->RecalcLayout();
  89.     ResizeParentToFit();
  90. }
  91.  
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CBiblioView diagnostics
  94.  
  95. #ifdef _DEBUG
  96. void CBiblioView::AssertValid() const
  97. {
  98.     CDaoRecordView::AssertValid();
  99. }
  100.  
  101. void CBiblioView::Dump(CDumpContext& dc) const
  102. {
  103.     CDaoRecordView::Dump(dc);
  104. }
  105.  
  106. CBiblioDoc* CBiblioView::GetDocument() // non-debug version is inline
  107. {
  108.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBiblioDoc)));
  109.     return (CBiblioDoc*)m_pDocument;
  110. }
  111. #endif //_DEBUG
  112.  
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CBiblioView database support
  115. CDaoRecordset* CBiblioView::OnGetRecordset()
  116. {
  117.     return m_pSet;
  118. }
  119.  
  120.  
  121. /////////////////////////////////////////////////////////////////////////////
  122. // CBiblioView message handlers
  123.  
  124. void CBiblioView::OnRecordAdd() 
  125. {
  126.     ASSERT(FALSE == m_bOnRecordAdd);
  127.     m_bOnRecordAdd = TRUE;
  128.     
  129.     try
  130.     {
  131.         OnGetRecordset()->AddNew();
  132.     }
  133.     catch(CDaoException* e)
  134.     {
  135.         MessageBox("DaoException on AddNew", "DAO Exception");
  136.         e->Delete();
  137.         return;
  138.     }
  139.     catch(CMemoryException* e)
  140.     {
  141.         MessageBox("Memory Exception on AddNew", "DAO Exception");
  142.         e->Delete();
  143.         return;
  144.     }
  145.  
  146.     // AddNew successful. Move empty buffer to recordview controls
  147.     UpdateData(FALSE);
  148. }
  149.  
  150. void CBiblioView::OnUpdateRecordAdd(CCmdUI* pCmdUI) 
  151. {
  152.     pCmdUI->Enable(!m_bOnRecordAdd && OnGetRecordset()->CanUpdate());
  153. }
  154.  
  155. void CBiblioView::OnRecordEdit() 
  156. {
  157.     // TODO: Add your command handler code here
  158.     ASSERT(FALSE == m_bOnRecordAdd);
  159.     m_bOnRecordAdd = TRUE;
  160.     
  161.     try
  162.     {
  163.         OnGetRecordset()->Edit();
  164.     }
  165.     catch(CDaoException* e)
  166.     {
  167.         MessageBox("DaoException on Edit", "DAO Exception");
  168.         e->Delete();
  169.         return;
  170.     }
  171. }
  172.  
  173. void CBiblioView::OnUpdateRecordEdit(CCmdUI* pCmdUI) 
  174. {
  175.     // TODO: Add your command update UI handler code here
  176.     pCmdUI->Enable(!m_bOnRecordAdd && OnGetRecordset()->CanUpdate());
  177. }
  178.  
  179. void CBiblioView::OnRecordDelete() 
  180. {
  181.     ASSERT(OnGetRecordset()->CanUpdate());
  182.     if(m_bOnRecordAdd)
  183.     {
  184.         if(IDYES == MessageBox("Do you wish to cancel adding or "
  185.             "editting of the current record?", "User Request",
  186.             MB_YESNO | MB_ICONQUESTION))
  187.         {
  188.             m_bOnRecordAdd = FALSE;
  189.             OnGetRecordset()->CancelUpdate();
  190.         }
  191.     }
  192.     else
  193.     {
  194.         if(!OnGetRecordset()->IsBOF() && !OnGetRecordset()->IsEOF())
  195.         {
  196.             if(IDYES == MessageBox("Do you wish to continue"
  197.                 "deletion of the current record?", "User Request",
  198.                 MB_YESNO | MB_ICONQUESTION))
  199.             {
  200.                 OnGetRecordset()->Delete();
  201.                 // Remember to move from the deleted record.
  202.                 OnGetRecordset()->MoveNext();
  203.                 if(OnGetRecordset()->IsEOF())
  204.                     OnGetRecordset()->MoveLast();
  205.             }
  206.         }
  207.     }
  208. }
  209.  
  210. void CBiblioView::OnUpdateRecordDelete(CCmdUI* pCmdUI) 
  211. {
  212.     if(OnGetRecordset()->CanUpdate())
  213.     {
  214.         if(m_bOnRecordAdd)
  215.             pCmdUI->SetText("&Cancel Add/Edit");
  216.         else 
  217.         {
  218.             pCmdUI->SetText("&Delete");
  219.             pCmdUI->Enable(!OnGetRecordset()->IsBOF() && !OnGetRecordset()->IsEOF());
  220.         }
  221.     }
  222.     else
  223.         pCmdUI->Enable(FALSE);
  224. }
  225.  
  226. BOOL CBiblioView::OnMove( UINT nIDMoveCommand )
  227. {
  228.     ASSERT(OnGetRecordset()->IsOpen());
  229.  
  230.     if(m_bOnRecordAdd && m_pSet->CanUpdate())
  231.     {
  232.         if(!UpdateData())
  233.             return FALSE;
  234.         try
  235.         {
  236.             OnGetRecordset()->Update();
  237.             if(m_bTransact)
  238.             {
  239.                 // if in transaction mode, increment transaction count and
  240.                 // update the status bar
  241.                 m_nTransactions++;
  242.                 char szText[20];
  243.                 sprintf(szText, "Trans: %03d", m_nTransactions);
  244.                 ((CMainFrame*)AfxGetMainWnd())->
  245.                     GetStatusBar()->SetPaneText(2, szText);
  246.             }
  247.         }
  248.         catch(CDaoException* e)
  249.         {
  250.             AfxMessageBox(e->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
  251.             e->Delete();
  252.         }
  253.         m_bOnRecordAdd = FALSE;        // turn off add mode
  254.     }
  255.  
  256.     // This is copied directly from the CDaoRecordView 
  257.     // implementation of OnMove.
  258.     BOOL bBookmarkable = m_pSet->CanBookmark();
  259.     BOOL bScrollable = m_pSet->CanScroll();
  260.  
  261.     switch(nIDMoveCommand)
  262.     {
  263.     case ID_RECORD_PREV:
  264.         m_pSet->MovePrev();
  265.  
  266.         if (!m_pSet->IsBOF())
  267.         {
  268.             if (bBookmarkable)
  269.                 m_varBookmarkCurrent = m_pSet->GetBookmark();
  270.  
  271.             // Enable forward scrolling
  272.             m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
  273.  
  274.             if (bScrollable)
  275.             {
  276.                 m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
  277.  
  278.                 if (IsOnFirstRecord())
  279.                     // Disable backward scrolling
  280.                     m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
  281.                 else
  282.                     m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
  283.             }
  284.             else
  285.             {
  286.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
  287.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
  288.             }
  289.  
  290.  
  291.             break;
  292.         }
  293.         // Fall through to reset to first record
  294.  
  295.     case ID_RECORD_FIRST:
  296.         m_pSet->MoveFirst();
  297.  
  298.         // backward scrolling never allowed after movefirst
  299.         m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
  300.  
  301.         if (m_pSet->IsEOF())
  302.         {
  303.             // Empty recordset, disable forward too
  304.             m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
  305.             m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
  306.         }
  307.         else
  308.         {
  309.             if (bBookmarkable)
  310.             {
  311.                 m_varBookmarkCurrent = m_pSet->GetBookmark();
  312.                 m_varBookmarkFirst = m_varBookmarkCurrent;
  313.             }
  314.  
  315.             // Enable forward scrolling
  316.             m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
  317.  
  318.             if (bScrollable)
  319.                 m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
  320.             else
  321.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;  
  322.         }
  323.  
  324.         break;
  325.  
  326.     case ID_RECORD_NEXT:
  327.         m_pSet->MoveNext();
  328.  
  329.         if (!m_pSet->IsEOF())
  330.         {
  331.             if (bBookmarkable)
  332.                 m_varBookmarkCurrent = m_pSet->GetBookmark();
  333.  
  334.             if (IsOnLastRecord())
  335.             {
  336.                 // Disable forward scrolling
  337.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
  338.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;  
  339.             }
  340.             else
  341.             {
  342.                 m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
  343.                 m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;  
  344.             }
  345.  
  346.             if (bScrollable)
  347.                 m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
  348.             else
  349.             {
  350.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;  
  351.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
  352.             }
  353.  
  354.             break;
  355.         }
  356.  
  357.         // Can't fall through to move last
  358.         if (!bScrollable)
  359.         {
  360.             // At the end of forward only recordset
  361.             m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
  362.             m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;  
  363.             m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
  364.             break;
  365.         }
  366.  
  367.         // Fall through to reset to last record
  368.  
  369.     case ID_RECORD_LAST:
  370.         m_pSet->MoveLast();
  371.  
  372.         // forward scrolling never allowed after movelast
  373.         m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
  374.         m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
  375.  
  376.         if (m_pSet->IsBOF())
  377.         {
  378.             // Empty recordset, disable backward too
  379.             m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
  380.         }
  381.         else
  382.         {
  383.             if (bBookmarkable)
  384.             {
  385.                 m_varBookmarkCurrent = m_pSet->GetBookmark();
  386.                 m_varBookmarkLast = m_varBookmarkCurrent;
  387.             }
  388.  
  389.             // Enable backward scrolling
  390.             if (bBookmarkable)
  391.                 m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
  392.             else
  393.                 m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD; 
  394.         }
  395.         break;
  396.  
  397.     default:
  398.         // Unexpected case value
  399.         ASSERT(FALSE);
  400.     }
  401.     UpdateData(FALSE);
  402.     return TRUE;
  403. }
  404.  
  405. void CBiblioView::OnTransactBegin() 
  406. {
  407.     ASSERT(OnGetRecordset()->CanTransact());
  408.  
  409.     if(m_bTransact)
  410.         return;
  411.  
  412.     try
  413.     {
  414.     OnGetRecordset()->m_pDatabase->m_pWorkspace->BeginTrans();
  415.     }
  416.     catch(CDaoException* e)
  417.     {
  418.         MessageBox(e->m_pErrorInfo->m_strDescription, "DAO Exception");
  419.         e->Delete();
  420.         return;
  421.     }
  422.  
  423.     m_nTransactions = 0;
  424.     m_bTransact = TRUE;
  425. }
  426.  
  427. void CBiblioView::OnUpdateTransactBegin(CCmdUI* pCmdUI) 
  428. {
  429.     // TODO: Add your command update UI handler code here
  430.     pCmdUI->Enable(!m_bTransact && OnGetRecordset()->CanTransact());
  431. }
  432.  
  433. void CBiblioView::OnTransactCommit() 
  434. {
  435.     ASSERT(OnGetRecordset()->CanTransact());
  436.  
  437.     if(!m_bTransact)
  438.         return;
  439.  
  440.     try
  441.     {
  442.     OnGetRecordset()->m_pDatabase->m_pWorkspace->CommitTrans();
  443.     }
  444.     catch(CDaoException* e)
  445.     {
  446.         MessageBox(e->m_pErrorInfo->m_strDescription, "DAO Exception");
  447.         e->Delete();
  448.         return;
  449.     }
  450.     m_nTransactions = 0;
  451.     m_bTransact = FALSE;
  452. }
  453.  
  454. void CBiblioView::OnUpdateTransactCommit(CCmdUI* pCmdUI) 
  455. {
  456.     pCmdUI->Enable(m_bTransact);
  457. }
  458.  
  459. void CBiblioView::OnTransactRollback() 
  460. {
  461.     ASSERT(OnGetRecordset()->CanTransact());
  462.  
  463.     if(!m_bTransact)
  464.         return;
  465.  
  466.     OnGetRecordset()->m_pDatabase->m_pWorkspace->Rollback();
  467.     m_nTransactions = 0;
  468.     m_bTransact = FALSE;
  469. }
  470.  
  471. void CBiblioView::OnUpdateTransactRollback(CCmdUI* pCmdUI) 
  472. {
  473.     pCmdUI->Enable(m_bTransact && 0 < m_nTransactions);
  474. }
  475.  
  476. void CBiblioView::OnUpdateIndicatorTransact(CCmdUI* pCmdUI) 
  477. {
  478.     pCmdUI->Enable(m_bTransact);
  479.     if(m_bTransact)
  480.     {
  481.         char szText[20];
  482.         sprintf(szText, "Trans: %03d", m_nTransactions);
  483.         pCmdUI->SetText(szText);
  484.     }
  485. }
  486.  
  487.  
  488.