home *** CD-ROM | disk | FTP | other *** search
- // BiblioView.cpp : implementation of the CBiblioView class
- //
-
- #include "stdafx.h"
- #include "Biblio.h"
- #include "mainfrm.h"
- #include "BibSet.h"
- #include "BibDoc.h"
- #include "BibView.h"
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // CBiblioView
-
- IMPLEMENT_DYNCREATE(CBiblioView, CDaoRecordView)
-
- BEGIN_MESSAGE_MAP(CBiblioView, CDaoRecordView)
- //{{AFX_MSG_MAP(CBiblioView)
- ON_COMMAND(ID_RECORD_ADD, OnRecordAdd)
- ON_UPDATE_COMMAND_UI(ID_RECORD_ADD, OnUpdateRecordAdd)
- ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete)
- ON_UPDATE_COMMAND_UI(ID_RECORD_DELETE, OnUpdateRecordDelete)
- ON_COMMAND(ID_TRANSACT_BEGIN, OnTransactBegin)
- ON_UPDATE_COMMAND_UI(ID_TRANSACT_BEGIN, OnUpdateTransactBegin)
- ON_COMMAND(ID_TRANSACT_COMMIT, OnTransactCommit)
- ON_UPDATE_COMMAND_UI(ID_TRANSACT_COMMIT, OnUpdateTransactCommit)
- ON_COMMAND(ID_TRANSACT_ROLLBACK, OnTransactRollback)
- ON_UPDATE_COMMAND_UI(ID_TRANSACT_ROLLBACK, OnUpdateTransactRollback)
- ON_COMMAND(ID_RECORD_EDIT, OnRecordEdit)
- ON_UPDATE_COMMAND_UI(ID_RECORD_EDIT, OnUpdateRecordEdit)
- //}}AFX_MSG_MAP
- ON_UPDATE_COMMAND_UI(ID_INDICATOR_TRANSACT, OnUpdateIndicatorTransact)
- END_MESSAGE_MAP()
-
- /////////////////////////////////////////////////////////////////////////////
- // CBiblioView construction/destruction
-
- CBiblioView::CBiblioView()
- : CDaoRecordView(CBiblioView::IDD)
- {
- //{{AFX_DATA_INIT(CBiblioView)
- m_pSet = NULL;
- //}}AFX_DATA_INIT
- // TODO: add construction code here
- m_bOnRecordAdd = FALSE;
- m_bTransact = FALSE;
- m_nTransactions = 0;
- }
-
- CBiblioView::~CBiblioView()
- {
- }
-
- void CBiblioView::DoDataExchange(CDataExchange* pDX)
- {
- CDaoRecordView::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CBiblioView)
- DDX_FieldText(pDX, IDC_TITLE, m_pSet->m_Title, m_pSet);
- DDX_FieldText(pDX, IDC_ISBN, m_pSet->m_ISBN, m_pSet);
- DDX_FieldText(pDX, IDC_YEAR_PUBLISHED, m_pSet->m_Year_Published, m_pSet);
- DDX_FieldText(pDX, IDC_SUBJECT, m_pSet->m_Subject, m_pSet);
- DDX_FieldText(pDX, IDC_NOTES, m_pSet->m_Notes, m_pSet);
- DDX_FieldText(pDX, IDC_COMMENTS, m_pSet->m_Comments, m_pSet);
- DDX_FieldText(pDX, IDC_DESCRIPTION, m_pSet->m_Description, m_pSet);
- DDX_FieldText(pDX, IDC_PUBID, m_pSet->m_PubID, m_pSet);
- //}}AFX_DATA_MAP
- }
-
- BOOL CBiblioView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
-
- return CDaoRecordView::PreCreateWindow(cs);
- }
-
- void CBiblioView::OnInitialUpdate()
- {
- m_pSet = &GetDocument()->m_biblioSet;
- CDaoRecordView::OnInitialUpdate();
-
- // Size parent to fit size of RecordView form
- GetParentFrame()->RecalcLayout();
- ResizeParentToFit();
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CBiblioView diagnostics
-
- #ifdef _DEBUG
- void CBiblioView::AssertValid() const
- {
- CDaoRecordView::AssertValid();
- }
-
- void CBiblioView::Dump(CDumpContext& dc) const
- {
- CDaoRecordView::Dump(dc);
- }
-
- CBiblioDoc* CBiblioView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBiblioDoc)));
- return (CBiblioDoc*)m_pDocument;
- }
- #endif //_DEBUG
-
- /////////////////////////////////////////////////////////////////////////////
- // CBiblioView database support
- CDaoRecordset* CBiblioView::OnGetRecordset()
- {
- return m_pSet;
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CBiblioView message handlers
-
- void CBiblioView::OnRecordAdd()
- {
- ASSERT(FALSE == m_bOnRecordAdd);
- m_bOnRecordAdd = TRUE;
-
- try
- {
- OnGetRecordset()->AddNew();
- }
- catch(CDaoException* e)
- {
- MessageBox("DaoException on AddNew", "DAO Exception");
- e->Delete();
- return;
- }
- catch(CMemoryException* e)
- {
- MessageBox("Memory Exception on AddNew", "DAO Exception");
- e->Delete();
- return;
- }
-
- // AddNew successful. Move empty buffer to recordview controls
- UpdateData(FALSE);
- }
-
- void CBiblioView::OnUpdateRecordAdd(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(!m_bOnRecordAdd && OnGetRecordset()->CanUpdate());
- }
-
- void CBiblioView::OnRecordEdit()
- {
- // TODO: Add your command handler code here
- ASSERT(FALSE == m_bOnRecordAdd);
- m_bOnRecordAdd = TRUE;
-
- try
- {
- OnGetRecordset()->Edit();
- }
- catch(CDaoException* e)
- {
- MessageBox("DaoException on Edit", "DAO Exception");
- e->Delete();
- return;
- }
- }
-
- void CBiblioView::OnUpdateRecordEdit(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(!m_bOnRecordAdd && OnGetRecordset()->CanUpdate());
- }
-
- void CBiblioView::OnRecordDelete()
- {
- ASSERT(OnGetRecordset()->CanUpdate());
- if(m_bOnRecordAdd)
- {
- if(IDYES == MessageBox("Do you wish to cancel adding or "
- "editting of the current record?", "User Request",
- MB_YESNO | MB_ICONQUESTION))
- {
- m_bOnRecordAdd = FALSE;
- OnGetRecordset()->CancelUpdate();
- }
- }
- else
- {
- if(!OnGetRecordset()->IsBOF() && !OnGetRecordset()->IsEOF())
- {
- if(IDYES == MessageBox("Do you wish to continue"
- "deletion of the current record?", "User Request",
- MB_YESNO | MB_ICONQUESTION))
- {
- OnGetRecordset()->Delete();
- // Remember to move from the deleted record.
- OnGetRecordset()->MoveNext();
- if(OnGetRecordset()->IsEOF())
- OnGetRecordset()->MoveLast();
- }
- }
- }
- }
-
- void CBiblioView::OnUpdateRecordDelete(CCmdUI* pCmdUI)
- {
- if(OnGetRecordset()->CanUpdate())
- {
- if(m_bOnRecordAdd)
- pCmdUI->SetText("&Cancel Add/Edit");
- else
- {
- pCmdUI->SetText("&Delete");
- pCmdUI->Enable(!OnGetRecordset()->IsBOF() && !OnGetRecordset()->IsEOF());
- }
- }
- else
- pCmdUI->Enable(FALSE);
- }
-
- BOOL CBiblioView::OnMove( UINT nIDMoveCommand )
- {
- ASSERT(OnGetRecordset()->IsOpen());
-
- if(m_bOnRecordAdd && m_pSet->CanUpdate())
- {
- if(!UpdateData())
- return FALSE;
- try
- {
- OnGetRecordset()->Update();
- if(m_bTransact)
- {
- // if in transaction mode, increment transaction count and
- // update the status bar
- m_nTransactions++;
- char szText[20];
- sprintf(szText, "Trans: %03d", m_nTransactions);
- ((CMainFrame*)AfxGetMainWnd())->
- GetStatusBar()->SetPaneText(2, szText);
- }
- }
- catch(CDaoException* e)
- {
- AfxMessageBox(e->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
- e->Delete();
- }
- m_bOnRecordAdd = FALSE; // turn off add mode
- }
-
- // This is copied directly from the CDaoRecordView
- // implementation of OnMove.
- BOOL bBookmarkable = m_pSet->CanBookmark();
- BOOL bScrollable = m_pSet->CanScroll();
-
- switch(nIDMoveCommand)
- {
- case ID_RECORD_PREV:
- m_pSet->MovePrev();
-
- if (!m_pSet->IsBOF())
- {
- if (bBookmarkable)
- m_varBookmarkCurrent = m_pSet->GetBookmark();
-
- // Enable forward scrolling
- m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
-
- if (bScrollable)
- {
- m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
-
- if (IsOnFirstRecord())
- // Disable backward scrolling
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
- else
- m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
- }
- else
- {
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
- }
-
-
- break;
- }
- // Fall through to reset to first record
-
- case ID_RECORD_FIRST:
- m_pSet->MoveFirst();
-
- // backward scrolling never allowed after movefirst
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
-
- if (m_pSet->IsEOF())
- {
- // Empty recordset, disable forward too
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
- }
- else
- {
- if (bBookmarkable)
- {
- m_varBookmarkCurrent = m_pSet->GetBookmark();
- m_varBookmarkFirst = m_varBookmarkCurrent;
- }
-
- // Enable forward scrolling
- m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
-
- if (bScrollable)
- m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
- else
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
- }
-
- break;
-
- case ID_RECORD_NEXT:
- m_pSet->MoveNext();
-
- if (!m_pSet->IsEOF())
- {
- if (bBookmarkable)
- m_varBookmarkCurrent = m_pSet->GetBookmark();
-
- if (IsOnLastRecord())
- {
- // Disable forward scrolling
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
- }
- else
- {
- m_nStatus |= AFX_DAOVIEW_SCROLL_NEXT;
- m_nStatus |= AFX_DAOVIEW_SCROLL_LAST;
- }
-
- if (bScrollable)
- m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
- else
- {
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
- }
-
- break;
- }
-
- // Can't fall through to move last
- if (!bScrollable)
- {
- // At the end of forward only recordset
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
- break;
- }
-
- // Fall through to reset to last record
-
- case ID_RECORD_LAST:
- m_pSet->MoveLast();
-
- // forward scrolling never allowed after movelast
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_NEXT;
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_LAST;
-
- if (m_pSet->IsBOF())
- {
- // Empty recordset, disable backward too
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
- }
- else
- {
- if (bBookmarkable)
- {
- m_varBookmarkCurrent = m_pSet->GetBookmark();
- m_varBookmarkLast = m_varBookmarkCurrent;
- }
-
- // Enable backward scrolling
- if (bBookmarkable)
- m_nStatus |= AFX_DAOVIEW_SCROLL_BACKWARD;
- else
- m_nStatus &= ~AFX_DAOVIEW_SCROLL_BACKWARD;
- }
- break;
-
- default:
- // Unexpected case value
- ASSERT(FALSE);
- }
- UpdateData(FALSE);
- return TRUE;
- }
-
- void CBiblioView::OnTransactBegin()
- {
- ASSERT(OnGetRecordset()->CanTransact());
-
- if(m_bTransact)
- return;
-
- try
- {
- OnGetRecordset()->m_pDatabase->m_pWorkspace->BeginTrans();
- }
- catch(CDaoException* e)
- {
- MessageBox(e->m_pErrorInfo->m_strDescription, "DAO Exception");
- e->Delete();
- return;
- }
-
- m_nTransactions = 0;
- m_bTransact = TRUE;
- }
-
- void CBiblioView::OnUpdateTransactBegin(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(!m_bTransact && OnGetRecordset()->CanTransact());
- }
-
- void CBiblioView::OnTransactCommit()
- {
- ASSERT(OnGetRecordset()->CanTransact());
-
- if(!m_bTransact)
- return;
-
- try
- {
- OnGetRecordset()->m_pDatabase->m_pWorkspace->CommitTrans();
- }
- catch(CDaoException* e)
- {
- MessageBox(e->m_pErrorInfo->m_strDescription, "DAO Exception");
- e->Delete();
- return;
- }
- m_nTransactions = 0;
- m_bTransact = FALSE;
- }
-
- void CBiblioView::OnUpdateTransactCommit(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(m_bTransact);
- }
-
- void CBiblioView::OnTransactRollback()
- {
- ASSERT(OnGetRecordset()->CanTransact());
-
- if(!m_bTransact)
- return;
-
- OnGetRecordset()->m_pDatabase->m_pWorkspace->Rollback();
- m_nTransactions = 0;
- m_bTransact = FALSE;
- }
-
- void CBiblioView::OnUpdateTransactRollback(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(m_bTransact && 0 < m_nTransactions);
- }
-
- void CBiblioView::OnUpdateIndicatorTransact(CCmdUI* pCmdUI)
- {
- pCmdUI->Enable(m_bTransact);
- if(m_bTransact)
- {
- char szText[20];
- sprintf(szText, "Trans: %03d", m_nTransactions);
- pCmdUI->SetText(szText);
- }
- }
-
-
-