www.pudn.com > 陈建春VC开发GIS的源码.rar > DatabaseView.cpp, change:1999-06-20,size:12081b


// DatabaseView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "draw.h" 
#include "drawdoc.h" 
#include "selectdatadlg.h" 
#include "DatabaseView.h" 
#include "data1dlg.h" 
#include "sortdlg.h" 
#include "linkdlg.h" 
#include "filterdlg.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDatabaseView 
 
IMPLEMENT_DYNCREATE(CDatabaseView, CScrollView) 
 
CDatabaseView::CDatabaseView() 
{ 
	nIndex=-1; 
	sizeTotal.cx=sizeTotal.cy=300; 
	sizePage.cx=sizePage.cy=300; 
	sizeLine.cx=sizeLine.cy=10; 
	nSelectData=0; 
} 
 
CDatabaseView::~CDatabaseView() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CDatabaseView, CScrollView) 
	//{{AFX_MSG_MAP(CDatabaseView) 
	ON_WM_SIZE() 
	ON_WM_LBUTTONDOWN() 
	ON_COMMAND(ID_RECORD_ADD, OnRecordAdd) 
	ON_COMMAND(ID_RECORD_MODIFY, OnRecordModify) 
	ON_COMMAND(ID_RECORD_FILTER, OnRecordFilter) 
	ON_COMMAND(ID_RECORD_SORT, OnRecordSort) 
	ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete) 
	ON_COMMAND(ID_RECORD_LINK, OnRecordLink) 
	ON_COMMAND(ID_RECORD_DELETE_ALL, OnRecordDeleteAll) 
	ON_COMMAND(ID_FILE_SELECT, OnFileSelect) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDatabaseView drawing 
 
void CDatabaseView::OnInitialUpdate() 
{ 
	 
	CDrawDoc* pDoc = GetDocument(); 
	m_pSet1=&pDoc->m_data1; 
	m_pSet=pDoc->GetDataSet(nSelectData); 
	m_pSet=&pDoc->m_data1; 
	//	m_pSet2=(CRecordSet *)&pDoc->m_data1; 
	m_pLinkSet1=&pDoc->m_linkdata1; 
	Init1(); 
	Init2(); 
	CScrollView::OnInitialUpdate(); 
	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
	//CSize sizeTotal; 
} 
 
void CDatabaseView::Init1() 
{ 
	TEXTMETRIC tm; 
	CDC* dc=GetDC(); 
	dc->GetTextMetrics(&tm); 
	ReleaseDC(dc); 
	nCharHeight=tm.tmHeight+2; 
	nCharWidth=tm.tmAveCharWidth+2; 
	if(m_pSet->IsOpen()) 
		m_pSet->Close(); 
	m_pSet->Open(); 
	nField=m_pSet->GetODBCFieldCount(); 
	CODBCFieldInfo fieldinfo1; 
	CODBCFieldInfo& fieldinfo=fieldinfo1; 
	for(int i=0;i<nField;i++) 
	{ 
		m_pSet->GetODBCFieldInfo(i,fieldinfo); 
		nFieldWide[i]=(short)fieldinfo1.m_nPrecision; 
	} 
	nScreenWide=0; 
	nFieldStart[0]=0; 
	for(i=0;i<nField;i++) 
	{ 
		nScreenWide=nScreenWide+nFieldWide[i]*nCharWidth; 
		nFieldStart[i+1]=nFieldStart[i]+nFieldWide[i]*nCharWidth; 
	} 
	sizeTotal.cx=nScreenWide; 
	sizeLine.cx=nCharWidth*5; 
} 
 
void CDatabaseView::Init2() 
{ 
	if(m_pSet->IsOpen()) 
		m_pSet->Close(); 
	m_pSet->Open(); 
	if(m_pSet->IsBOF()) 
		nRecord=0; 
	else 
	{ 
		m_pSet->MoveFirst(); 
		nRecord=0; 
		while(!m_pSet->IsEOF()) 
		{ 
			m_pSet->MoveNext(); 
			nRecord++; 
		} 
	} 
	nScreenHeight=nRecord*nCharHeight; 
	if(nScreenHeight==0) 
		nScreenHeight=20; 
	sizeTotal.cy=nScreenHeight; 
	sizeLine.cy=nCharHeight+2; 
	if(nRecord>0) 
	{ 
		if(nIndex<1||nIndex>nRecord) 
			nIndex=1; 
	} 
	else  
		nIndex=-1; 
//	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
} 
 
 
/*void CDatabaseView::Init() 
{ 
	TEXTMETRIC tm; 
	CDC* dc=GetDC(); 
	dc->GetTextMetrics(&tm); 
	ReleaseDC(dc); 
	nCharHeight=tm.tmHeight+2; 
	nCharWidth=tm.tmAveCharWidth+2; 
	if(m_pSet1->IsOpen()) 
		m_pSet1->Close(); 
//	m_pSet1->m_strFilter="only_id>0"; 
	m_pSet1->Open(); 
	if(m_pSet1->IsBOF()) 
		nRecord=0; 
	else 
	{ 
		m_pSet1->MoveFirst(); 
		nRecord=0; 
		while(!m_pSet1->IsEOF()) 
		{ 
			m_pSet1->MoveNext(); 
			nRecord++; 
		} 
	} 
	nField=m_pSet1->GetODBCFieldCount(); 
	CODBCFieldInfo fieldinfo1; 
	CODBCFieldInfo& fieldinfo=fieldinfo1; 
	//nRecord=m_pSet1->GetRecordCount(); 
	for(int i=0;i<nField;i++) 
	{ 
		m_pSet1->GetODBCFieldInfo(i,fieldinfo); 
		nFieldWide[i]=(short)fieldinfo1.m_nPrecision; 
	} 
	nScreenHeight=nRecord*nCharHeight; 
	nScreenWide=0; 
	nFieldStart[0]=0; 
	for(i=0;i<nField;i++) 
	{ 
		nScreenWide=nScreenWide+nFieldWide[i]*nCharWidth; 
		nFieldStart[i+1]=nFieldStart[i]+nFieldWide[i]*nCharWidth; 
	} 
 
	if(nScreenHeight==0) 
		nScreenHeight=20; 
	if(nRecord>0) 
		nIndex=1; 
	else 
		nIndex=-1; 
	sizeTotal.cx=nScreenWide; 
	sizeTotal.cy=nScreenHeight; 
	// TODO: calculate the total size of this view 
	sizeLine.cx=nCharWidth*5; 
	sizeLine.cy=nCharHeight+2; 
	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
} 
*/ 
void CDatabaseView::OnDraw(CDC* pDC) 
{ 
	CRect r1; 
	CDrawDoc* pDoc = GetDocument(); 
	CPen pen1(0,1,RGB(255,0,0)); 
//	CPen* pOldPen=ht.SelectObject(&pen1); 
	pDC->SetTextColor(RGB(255,0,0)); 
	CString c1; 
	CString& c2=c1; 
	pDC->SetMapMode(1);	 
	m_pSet->MoveFirst(); 
	for(int i=0;i<nRecord;i++) 
	{ 
		for(int j=0;j<nField;j++) 
		{ 
			m_pSet->GetFieldValue(j,c2); 
			pDC->TextOut(nFieldStart[j],i*nCharHeight,c1); 
		} 
		m_pSet->MoveNext(); 
	} 
	if(nIndex>0) 
	{ 
		GetRect(nIndex,&r1); 
		pDC->InvertRect(&r1); 
	} 
	//	pDC->SelectObject(pOldPen); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDatabaseView diagnostics 
 
#ifdef _DEBUG 
void CDatabaseView::AssertValid() const 
{ 
	CScrollView::AssertValid(); 
} 
 
void CDatabaseView::Dump(CDumpContext& dc) const 
{ 
	CScrollView::Dump(dc); 
} 
 
CDrawDoc* CDatabaseView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc))); 
	return (CDrawDoc*)m_pDocument; 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CDatabaseView message handlers 
 
void CDatabaseView::OnSize(UINT nType, int cx, int cy)  
{ 
	CScrollView::OnSize(nType, cx, cy); 
	// TODO: Add your message handler code here 
	sizePage.cx=cx; 
	sizePage.cy=cy; 
	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
} 
 
void CDatabaseView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CRect r1; 
	CClientDC ht(this); 
	OnPrepareDC(&ht); 
	ht.DPtoLP(&point); 
	int nIndex1=point.y/nCharHeight+1; 
	if(nIndex1!=nIndex&&nIndex1>0&&nIndex1=nRecord) 
	{ 
		if(nIndex>0) 
		{ 
			GetRect(nIndex,&r1); 
			ht.InvertRect(&r1); 
		} 
		GetRect(nIndex1,&r1); 
		ht.InvertRect(&r1); 
		nIndex=nIndex1; 
	} 
	CScrollView::OnLButtonDown(nFlags, point); 
} 
 
 
void CDatabaseView::GetRect(int nRow, CRect *r1) 
{ 
	r1->left=0; 
	r1->right=nFieldStart[nField-1]+nFieldWide[nField-1]*nCharWidth; 
	r1->top=(nRow-1)*nCharHeight; 
	r1->bottom=r1->top+nCharHeight; 
} 
 
void CDatabaseView::OnRecordAdd()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=GetDocument(); 
	if(m_pSet->IsOpen()) 
		m_pSet->Close(); 
	int ID=pDoc->DataInfo[nSelectData].only_ID; 
	if(ID==1) 
	{ 
		CData1Dlg dlg(m_pSet1,1,GetOnlyID()); 
		if(dlg.DoModal()==IDOK) 
		{ 
			Init2(); 
			SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
			UpdateWindow(); 
			Invalidate(); 
		} 
	} 
	else if(ID==2) 
	{ 
//		CData2Dlg dlg(m_pSet2,1,GetOnlyID()); 
		CData1Dlg dlg(m_pSet1,1,GetOnlyID()); 
		if(dlg.DoModal()==IDOK) 
		{ 
			Init2(); 
			SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
			UpdateWindow(); 
			Invalidate(); 
		} 
	} 
} 
 
/*int CDatabaseView::GetOnlyID() 
{ 
	int *Index1,id; 
	Index1= GetDocument()->m_Index; 
	CString m_str1=m_pSet1->m_strFilter; 
	m_pSet1->m_strFilter=""; 
	if(m_pSet1->IsOpen()) 
		m_pSet1->Close(); 
	m_pSet1->Open(); 
	for(int i=0;i<20000;i++) 
		Index1[i]=0; 
	while(!m_pSet1->IsEOF()) 
	{ 
		Index1[m_pSet1->m_only_id]=1; 
		m_pSet1->MoveNext(); 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(Index1[i]==0) 
		{ 
			id=i; 
			break; 
		} 
	} 
	m_pSet1->Close(); 
	m_pSet1->m_strFilter=m_str1; 
	m_pSet1->Open(); 
	return id; 
} 
*/ 
/* 
int CDatabaseView::GetOnlyID() 
{ 
	int *Index1,id; 
	Index1= GetDocument()->m_Index; 
	CString m_str1=m_pSet->m_strFilter; 
	m_pSet->m_strFilter=""; 
	if(m_pSet->IsOpen()) 
		m_pSet->Close(); 
	m_pSet->Open(); 
	for(int i=0;i<20000;i++) 
		Index1[i]=0; 
	while(!m_pSet->IsEOF()) 
	{ 
		Index1[m_pSet->GetID()]=1; 
		m_pSet->MoveNext(); 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(Index1[i]==0) 
		{ 
			id=i; 
			break; 
		} 
	} 
	m_pSet->Close(); 
	m_pSet->m_strFilter=m_str1; 
	m_pSet->Open(); 
	return id; 
} 
*/ 
 
int CDatabaseView::GetOnlyID() 
{ 
	int *Index1,id; 
	Index1= GetDocument()->m_Index; 
	CString m_str1=m_pSet->m_strFilter; 
	m_pSet->m_strFilter=""; 
	if(m_pSet->IsOpen()) 
		m_pSet->Close(); 
	m_pSet->Open(); 
	for(int i=0;i<20000;i++) 
		Index1[i]=0; 
	CString c1; 
	CString& c2=c1; 
	i=0; 
	m_pSet->GetFieldValue(i,c2); 
	while(!m_pSet->IsEOF()) 
	{ 
		Index1[atoi(c1)]=1; 
		m_pSet->MoveNext(); 
	} 
	for(i=0;i<20000;i++) 
	{ 
		if(Index1[i]==0) 
		{ 
			id=i; 
			break; 
		} 
	} 
	m_pSet->Close(); 
	m_pSet->m_strFilter=m_str1; 
	m_pSet->Open(); 
	return id; 
} 
 
 
void CDatabaseView::OnRecordModify()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=GetDocument(); 
	if(nIndex=0&&nIndex>nRecord) 
		return; 
	CString m_str1=m_pSet->m_strFilter; 
	CString m_str2=m_pSet->m_strSort; 
	if(m_pSet->IsOpen()) 
		m_pSet->Close(); 
	int ID=pDoc->DataInfo[nSelectData].only_ID; 
	if(ID==1) 
	{ 
		if(m_pSet1->IsOpen()) 
			m_pSet1->Close(); 
		m_pSet1->m_strFilter=m_str1; 
		m_pSet1->m_strSort=m_str2; 
		m_pSet1->Open(); 
		m_pSet1->MoveFirst(); 
		m_pSet1->Move(nIndex-1); 
		CData1Dlg dlg(m_pSet1,0,0); 
		if(dlg.DoModal()) 
		{ 
			Init2(); 
			SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
			Invalidate(); 
		} 
	} 
	else if(ID==2) 
	{ 
/*		if(m_pSet2->IsOpen()) 
			m_pSet2->Close(); 
		m_pSet2->m_strFilter=m_str1; 
		m_pSet2->m_strSort=m_str2; 
		m_pSet2->Open(); 
		m_pSet2->MoveFirst(); 
		m_pSet2->Move(nIndex-1); 
		CData2Dlg dlg(m_pSet2,0,0);*/ 
		CData1Dlg dlg(m_pSet1,0,0); 
 
		if(dlg.DoModal()) 
		{ 
			Init2(); 
			SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
			Invalidate(); 
		} 
	} 
} 
 
void CDatabaseView::OnRecordFilter()  
{ 
	// TODO: Add your command handler code here 
	CFilterDlg dlg(m_pSet); 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_pSet->m_strFilter=dlg.m_strFilter; 
		Init2(); 
		SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
		Invalidate(); 
	} 
} 
 
void CDatabaseView::OnRecordSort()  
{ 
	// TODO: Add your command handler code here 
	CSortDlg pDg1(m_pSet); 
	if(pDg1.DoModal()==IDOK) 
	{ 
		if(m_pSet->IsOpen()) 
			m_pSet->Close(); 
		m_pSet->m_strSort=pDg1.m_strSort; 
		m_pSet->Open(); 
		Invalidate(); 
	} 
} 
 
void CDatabaseView::OnRecordDelete()  
{ 
	// TODO: Add your command handler code here 
	if(nIndex<1||nIndex>nRecord) 
		return; 
	if(!m_pSet->IsOpen()) 
		m_pSet->Open(); 
	m_pSet->MoveFirst(); 
	m_pSet->Move(nIndex-1); 
	m_pSet->Delete(); 
	CPoint p1; 
	p1=GetScrollPosition(); 
	sizeTotal.cy-=nCharHeight; 
	if(nIndex==nRecord) 
		nIndex--; 
	Init2(); 
	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
	Invalidate(); 
	ScrollToPosition(p1);	 
} 
 
void CDatabaseView::OnRecordLink()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=GetDocument(); 
	m_pSet1->MoveFirst(); 
	m_pSet1->Move(nIndex-1); 
	CString m_str; 
	m_str="(database_id="; 
	short lb=pDoc->GetDataID(nSelectData); 
	if(lb<0) 
		return; 
	char p1[9]; 
	sprintf(p1,"%d",lb); 
	m_str+=p1; 
	m_str+=") AND (record_id="; 
	int ID=m_pSet->GetID(); 
	sprintf(p1,"%d",ID); 
	m_str+=p1; 
	m_str+=")"; 
	m_pLinkSet1->m_strFilter=m_str; 
	CLinkDlg pDlg1(GetDocument(),m_pLinkSet1,1,lb,ID); 
	pDlg1.DoModal(); 
} 
 
void CDatabaseView::OnRecordDeleteAll()  
{ 
	if(!m_pSet->IsOpen()) 
		m_pSet->Open(); 
	for(int i=nRecord-1;i>=0;i--) 
	{ 
		m_pSet->MoveFirst(); 
		m_pSet->Move(i); 
		m_pSet->Delete(); 
	} 
	nIndex=-1; 
	Init2(); 
	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
	Invalidate(); 
} 
 
void CDatabaseView::OnFileSelect()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc = GetDocument(); 
	CSelectDataDlg pDlg1(pDoc,nSelectData); 
	if(pDlg1.DoModal()==IDOK) 
	{ 
		int nn=pDlg1.m_Index; 
		if(nn!=nSelectData) 
		{ 
			if(m_pSet->IsOpen()) 
				m_pSet->Close(); 
			nSelectData=nn; 
			m_pSet=pDoc->GetDataSet(nSelectData); 
			m_pSet->Open(); 
			nIndex=-1; 
			Init1(); 
			Init2(); 
			SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine); 
			Invalidate(); 
		} 
	} 
}