gusucode.com > ADO智能开发包C++源码程序 > ADO智能开发包/sfxdb_src_1.0.510.1/sfx/Source/db/src/DBNavigator.cpp

    // DBRecordBar.cpp : implementation file
//

#include "stdafx.h"
#include <shlwapi.h>
#include "DBNavigator.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDBNavigator

CDBNavigator::CDBNavigator()
{
	m_pWnd = this;
	m_bCheck = false;
}

CDBNavigator::~CDBNavigator()
{
}


BEGIN_MESSAGE_MAP(CDBNavigator, CToolBar)
	//{{AFX_MSG_MAP(CDBNavigator)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
//工具条按钮:第一条,上一条,下一条,最后一条,添加,删除,修改。
BOOL CDBNavigator::InitButtons()
{
//		ID_DB_FIRST	= 1001,
//		ID_DB_PRIOR	= 1002,
//		ID_DB_NEXT	= 1003,
//		ID_DB_LAST	= 1004,
//		ID_DB_INSERT	= 1005,
//		ID_DB_DELETE	= 1006,
//		ID_DB_REFRESH = 1007,
//		ID_DB_GOTO	= 1008,
#pragma warning(disable:4309)
#pragma warning(disable:4305)
TBBUTTON _Button[] = {
		{0,	ID_DB_FIRST, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_FIRST, 0},
		{1,	ID_DB_PRIOR, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_PRIOR, 0},
		{2,	ID_DB_NEXT, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_NEXT, 0},
		{3,	ID_DB_LAST, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_LAST, 0},
		{-1, -1, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
		{4, ID_DB_INSERT, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_INSERT, 0},
		{5, ID_DB_DELETE, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_DELETE, 0},
		{6, ID_DB_EDIT, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_EDIT, 0},
		{7, ID_DB_POST, TBSTATE_ENABLED, TBSTYLE_BUTTON|TBSTYLE_AUTOSIZE, ID_DB_POST, 0},
	};
#pragma warning(default:4309)
#pragma warning(default:4305)

	int _Count = sizeof(_Button)/sizeof(TBBUTTON);
	GetToolBarCtrl().AddButtons(_Count, (LPTBBUTTON)_Button);		
	SetCmdWnd(m_hWnd);
	TRACE(_T("------Buttons Count: %d"), GetToolBarCtrl().GetButtonCount());

	//if (NULL != m_pRecordSet)
	//{
	//	EnableWindow(TRUE);
	//}else
	//{
	//	EnableWindow(FALSE);
	//}

	return TRUE;
}


void CDBNavigator::ShowText(bool bShow)
{
	if (bShow)
	{
		SetButtonText(0, _T("第一条"));
		SetButtonText(1, _T("上一条"));
		SetButtonText(2, _T("下一条"));
		SetButtonText(3, _T("最后一条"));
		SetButtonText(5, _T("添加"));
		SetButtonText(6, _T("删除"));
		SetButtonText(7, _T("修改"));
		SetButtonText(8, _T("写入"));
	}else
	{
		SetButtonText(0, _T(""));
		SetButtonText(1, _T(""));
		SetButtonText(2, _T(""));
		SetButtonText(3, _T(""));
		SetButtonText(4, _T(""));
		SetButtonText(5, _T(""));
		SetButtonText(6, _T(""));
		SetButtonText(7, _T(""));
	}
}


void CDBNavigator::SetPos(int x, int y)
{
	RECT Rect;
	RECT ToolBarRect={x,y,x,0};
	int Count = GetToolBarCtrl().GetButtonCount();

	if (Count>0)
	{	
		GetItemRect(Count-1, &Rect);
		Rect.left = x;
		Rect.top = y;
		Rect.right += x;
		Rect.bottom += y;
		MoveWindow(&Rect);
	}
}


BOOL CDBNavigator::CreateCombo()
{
	//CRect	rect;
	//int		_nIndex = 5; //CommandToIndex(ID_DB_GOTO);
	//HWND	_hWndEdit = NULL;

	//SetButtonInfo(_nIndex, ID_DB_GOTO, TBBS_SEPARATOR, 120);
	//GetToolBarCtrl().GetItemRect(_nIndex, &rect);
	//rect.bottom -=1;
	//rect.top	= 1;
	//rect.bottom = rect.top + 250;
	//if(!m_ComboBox.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN|
	//						WS_VSCROLL|WS_TABSTOP|CBS_HASSTRINGS, rect, this, ID_DB_COMBOBOX))
	//{
	//	TRACE(_T("-------建立CDBNavigator工具条失败。"));
	//	return FALSE;
	//}

	//POINT pt={1, 1};
	//_hWndEdit = ::ChildWindowFromPoint(m_ComboBox.m_hWnd, pt); 
	//ASSERT(_hWndEdit);	
	//VERIFY(SetEditType(_hWndEdit, EDIT_NUM));

	return TRUE;
}

VOID CDBNavigator::UpdateUI()
{
	CToolBarCtrl *_BarCtrl = &GetToolBarCtrl();
	//if (adEditNone == m_pRecordSet->GetEditMode())
	//{
		//LONG _Pos = m_pRecordSet->GetAbsolutePosition();
		//if (_Pos<=1)	//指向了第一条记录。
		//{
		//	_BarCtrl->EnableButton(ID_DB_FIRST, FALSE);
		//	_BarCtrl->EnableButton(ID_DB_PRIOR, FALSE);
		//}else
		//{
		//	_BarCtrl->EnableButton(ID_DB_FIRST, TRUE);
		//	_BarCtrl->EnableButton(ID_DB_PRIOR, TRUE);
		//}

		//if (_Pos>=m_pRecordSet->GetRecordCount())
		//{
		//	_BarCtrl->EnableButton(ID_DB_NEXT, FALSE);
		//	_BarCtrl->EnableButton(ID_DB_LAST, FALSE);
		//}else
		//{
		//	_BarCtrl->EnableButton(ID_DB_NEXT, TRUE);
		//	_BarCtrl->EnableButton(ID_DB_LAST, TRUE);
		//}
		if (0>=m_pRecordSet->GetRecordCount())
		{
			_BarCtrl->EnableButton(ID_DB_FIRST, FALSE);
			_BarCtrl->EnableButton(ID_DB_PRIOR, FALSE);
			_BarCtrl->EnableButton(ID_DB_NEXT, FALSE);
			_BarCtrl->EnableButton(ID_DB_LAST, FALSE);
		}

		if (m_pRecordSet->IsBof())	//指向了第一条记录。
		{
			_BarCtrl->EnableButton(ID_DB_FIRST, FALSE);
			_BarCtrl->EnableButton(ID_DB_PRIOR, FALSE);
		}else
		{
			_BarCtrl->EnableButton(ID_DB_FIRST, TRUE);
			_BarCtrl->EnableButton(ID_DB_PRIOR, TRUE);
		}

		if (m_pRecordSet->IsEof())
		{
			_BarCtrl->EnableButton(ID_DB_NEXT, FALSE);
			_BarCtrl->EnableButton(ID_DB_LAST, FALSE);
		}else
		{
			_BarCtrl->EnableButton(ID_DB_NEXT, TRUE);
			_BarCtrl->EnableButton(ID_DB_LAST, TRUE);
		}

		if (m_pRecordSet->GetEditChange())
		{
			_BarCtrl->EnableButton(ID_DB_POST, TRUE);
		}else
		{
			_BarCtrl->EnableButton(ID_DB_POST, FALSE);
		}
	//}

	//把只读状态改为修改状态
	INT nIndex = _BarCtrl->CommandToIndex(ID_DB_READ);
	if (-1 == nIndex)
	{ 
		nIndex = _BarCtrl->CommandToIndex(ID_DB_EDIT);
		_BarCtrl->EnableButton(ID_DB_EDIT, TRUE);
	}else
	{
		_BarCtrl->EnableButton(ID_DB_READ, TRUE);
	}

	if (m_pRecordSet->GetReadOnly())
	{
		_BarCtrl->SetCmdID(nIndex, ID_DB_EDIT);
		SetButtonText(nIndex, _T("修改"));
		_BarCtrl->EnableButton(ID_DB_INSERT, FALSE);
		_BarCtrl->EnableButton(ID_DB_DELETE, FALSE);
		_BarCtrl->EnableButton(ID_DB_POST, FALSE);
	}else
	{
		_BarCtrl->SetCmdID(nIndex, ID_DB_READ);
		SetButtonText(nIndex, _T("只读"));
		_BarCtrl->EnableButton(ID_DB_INSERT, TRUE);
		_BarCtrl->EnableButton(ID_DB_DELETE, TRUE);
	}	
}

//
BOOL ListBox_FindStringAdd(HWND hWndCtrl, LPCWSTR lpszString)
{
	return TRUE;
}

//HRESULT CDBNavigator::WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
//{
//	//if (nMsg==WM_LS_DATA)
//	//{
//	//	OnLsData(wParam, lParam);
//	//}
//	return CTrueColorToolBar::WindowProc(nMsg, wParam, lParam);
//}



BOOL CDBNavigator::OnCommand(WPARAM wParam, LPARAM lParam)
{
	TRACE(_T("---------RecordBar ID:%d\n"), LOWORD(wParam));

	m_bCheck = true;
	try
	{
		switch(LOWORD(wParam))
		{
		case ID_DB_FIRST:	//第一个。
			{
				m_pRecordSet->MoveFirst();
				TRACE(_T("-------记录指针指向第一个.\n"));
			}break;
		case ID_DB_PRIOR:	//上一个。
			{
				m_pRecordSet->MovePrevious();
				TRACE(_T("-------记录指针向上移动一个。\n"));
			}break;
		case ID_DB_NEXT:	//下一个
			{
				TRACE(_T("-------记录指针向下移动一个。\n"));
				m_pRecordSet->MoveNext();
			}break;
		case ID_DB_LAST:	//最后一个。
			{
				m_pRecordSet->MoveLast();
				TRACE(_T("-------记录指针指向最后一条。\n"));
			}break;
		case ID_DB_DELETE:
			{
				m_bCheck = false;
				ASSERT(NULL != m_pWnd);
				if (DeleteRecordHint(m_pWnd->m_hWnd, m_pRecordSet->GetAbsolutePosition()))
				{
					if (m_pRecordSet->Delete())
						m_bCheck = true;
				}
			}break;
		case ID_DB_INSERT:
			{
				VERIFY(m_pRecordSet->AddNew());
			}break;
		case ID_DB_EDIT:
			{
				if (m_pRecordSet->GetReadOnly())
				{
					//把只读状态改为修改状态
					m_pRecordSet->SetReadOnly(false);
				}
			}break;
		case ID_DB_READ:
			{
				if (!m_pRecordSet->GetReadOnly())
				{
					//把修改状态改为只读状态
					m_pRecordSet->SetReadOnly(true);
				}
			}break;
		case ID_DB_POST:
			{
				ASSERT(NULL != m_pRecordSet);
				m_pRecordSet->Update();
			}break;
		default:
			{
				m_bCheck = false;
				return CToolBar::OnCommand(wParam, lParam);	
			}
		}
		if (m_bCheck)
		{
			UpdateUI();
		}
	}catch (_com_error &e)
	{
		m_bCheck = false;
		adoShowComError(m_hWnd, e);
	}

	m_bCheck = false;
	return FALSE;
}


void CDBNavigator::EnableButtons(BOOL bEnable)
{
	CToolBarCtrl *_BarCtrl = &GetToolBarCtrl();
	int iIndex = 0;		
	TBBUTTON tb;

	if ((NULL != _BarCtrl) && (NULL != _BarCtrl->m_hWnd))
	{
		for (; iIndex<_BarCtrl->GetButtonCount(); iIndex++)
		{
			_BarCtrl->GetButton(iIndex, &tb);
			_BarCtrl->EnableButton(tb.idCommand, bEnable);
		}
	}

}


void CDBNavigator::_OnElseCMDEvents(BASE_CMD nCMD, LPARAM lParam)
{
	ASSERT(NULL != m_pWnd);

	switch(nCMD)
	{
	case BC_CLEAR:
		return;
	case BC_READONLY:
		{
			if (m_pRecordSet->IsOpen())
			{
				UpdateUI();
			}else
			{
				EnableButtons(FALSE);
			}
		}return;
	case BC_EDITCHANGE:
		{
			if ((BOOL)lParam)
			{
				GetToolBarCtrl().EnableButton(ID_DB_POST, FALSE);
			}else
			{
				GetToolBarCtrl().EnableButton(ID_DB_POST, TRUE);
			}
		}break;
	}
	CDBBaseControl::_OnElseCMDEvents(nCMD, lParam);
}


BOOL CDBNavigator::SetAdoRecordset(CAdoRecordset *pRecordset)
{
	if (CDBBaseControl::SetAdoRecordset(pRecordset))
	{
		EnableButtons(TRUE);
		return TRUE;
	}

	EnableButtons(FALSE);
	return FALSE;
}


void CDBNavigator::virDataChange()	//数据改变了
{
	if (!m_bCheck)
	{
		UpdateUI();
	}
}


void CDBNavigator::virDataWrite()
{
	UpdateUI();
}


void CDBNavigator::UpdateField()
{
	UpdateUI();
}