www.pudn.com > MapDB.rar > QueryDlg.cpp


// QueryDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "MapDB.h" 
#include "QueryDlg.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CQueryDlg dialog 
 
 
CQueryDlg::CQueryDlg(CMapDBDoc * pDoc,CWnd* pParent /*=NULL*/) 
	: CDialog(CQueryDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CQueryDlg) 
	m_prompt = _T(""); 
	//}}AFX_DATA_INIT 
	m_query = 0; 
	m_pDoc = pDoc; 
} 
 
 
void CQueryDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CQueryDlg) 
	DDX_Control(pDX, IDC_FROMLIST, m_fromlist); 
	DDX_Control(pDX, IDC_TOLIST, m_tolist); 
	DDX_Text(pDX, IDC_PROMPT_STATIC, m_prompt); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CQueryDlg, CDialog) 
	//{{AFX_MSG_MAP(CQueryDlg) 
	ON_BN_CLICKED(IDC_ADD_BUTTON, OnAddButton) 
	ON_BN_CLICKED(IDC_ADDALL_BUTTON, OnAddallButton) 
	ON_BN_CLICKED(IDC_REMOVE_BUTTON, OnRemoveButton) 
	ON_BN_CLICKED(IDC_REMOVEALL_BUTTON, OnRemoveallButton) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CQueryDlg message handlers 
 
void CQueryDlg::OnAddButton()  
{ 
	if ( ! m_fromlist.GetSelCount() ) 
		return; 
	int * buf = NULL; 
	buf = new int[m_fromlist.GetSelCount()]; 
	long selNum = m_fromlist.GetSelItems(m_fromlist.GetSelCount(),buf); 
	for (int count = 0;count < selNum;count ++) 
	{ 
		CString item; 
		m_fromlist.GetText(buf[count] - count,item); 
		m_tolist.AddString(item); 
		m_fromlist.DeleteString(buf[count] - count); 
	} 
	if ( buf )  delete [] buf; 
} 
 
void CQueryDlg::OnAddallButton()  
{ 
	for ( ; m_fromlist.GetCount() ; ) 
	{ 
		CString item; 
		m_fromlist.GetText(0,item); 
		m_fromlist.DeleteString(0); 
		m_tolist.AddString(item); 
	}	 
} 
 
void CQueryDlg::OnRemoveButton()  
{ 
	if ( ! m_tolist.GetSelCount() ) 
		return; 
	int * buf = NULL; 
	buf = new int[m_tolist.GetSelCount()]; 
	long selNum = m_tolist.GetSelItems(m_tolist.GetSelCount(),buf); 
	for (int count = 0;count < selNum;count ++) 
	{ 
		CString item; 
		m_tolist.GetText(buf[count] - count,item); 
		m_fromlist.AddString(item); 
		m_tolist.DeleteString(buf[count] - count); 
	} 
	if ( buf )  delete [] buf; 
} 
 
void CQueryDlg::OnRemoveallButton()  
{ 
	for ( ; m_tolist.GetCount() ; ) 
	{ 
		CString item; 
		m_tolist.GetText(0,item); 
		m_tolist.DeleteString(0); 
		m_fromlist.AddString(item); 
	}	 
} 
 
void CQueryDlg::OnOK()  
{ 
	UpdateData(TRUE); 
	if ( m_pDoc && m_fromlist.GetCount() && ! m_tolist.GetCount() ) 
	{ 
		CString message; 
		message.LoadString(IDS_MUSTSELECTITEM); 
		AfxMessageBox(message); 
		return; 
	} 
	if ( m_pDoc && m_tolist.GetCount() ) 
	{ 
		if ( m_query == IDQUERY ) 
		{ 
			m_pDoc->m_objsel.RemoveAll(); 
			m_pDoc->m_objsel.SetSize(m_pDoc->GetByte(m_pDoc->m_mapobjs.GetSize())); 
			for (int count = 0;count < m_tolist.GetCount();count ++) 
			{ 
				DWORD id,index; 
				char item[256]; 
				m_tolist.GetText(count,item); 
				id = atol(item); 
				if ( m_pDoc->m_mapobjids.Lookup(id,index) ) 
					m_pDoc->m_objsel[index / 8].SetAt(index % 8); 
			} 
		} 
		else if ( m_query == TITLEQUERY ) 
		{ 
			m_pDoc->m_objsel.RemoveAll(); 
			m_pDoc->m_objsel.SetSize(m_pDoc->GetByte(m_pDoc->m_mapobjs.GetSize())); 
			m_pDoc->m_titlesel.RemoveAll(); 
			m_pDoc->m_titlesel.SetSize(m_pDoc->GetByte(m_pDoc->m_maptitles.GetCount())); 
			for (int count = 0;count < m_tolist.GetCount();count ++) 
			{ 
				DWORD title,index; 
				char item[256]; 
				m_tolist.GetText(count,item); 
				title = atol(item); 
				if ( m_pDoc->m_maptitles.Lookup(title,index) ) 
					m_pDoc->m_titlesel[index / 8].SetAt(index % 8); 
			} 
			for (count = 0;count < m_pDoc->m_titlesel.GetSize();count ++) 
			{ 
				for (int bitcount = 0;bitcount < 8;bitcount ++) 
				{ 
					if ( m_pDoc->m_titlesel[count][bitcount] ) 
					{ 
						for (int objcount = 0;objcount < m_pDoc->m_mapobjs.GetSize();objcount ++) 
						{ 
							long bytecount = ( count * 8 + bitcount ) *  
								m_pDoc->GetByte(m_pDoc->m_mapobjs.GetSize()) + objcount / 8; 
							int idx = objcount % 8; 
							if ( m_pDoc->m_titleidx[bytecount][idx] ) 
								m_pDoc->m_objsel[objcount / 8].SetAt(objcount % 8); 
						} 
					} 
				} 
			} 
		} 
		m_pDoc->QueryPos(); 
	}	 
	CDialog::OnOK(); 
} 
 
BOOL CQueryDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	if ( m_query == IDQUERY ) 
	{ 
		CString text; 
		text.LoadString(IDS_IDQUERY); 
		SetWindowText(text); 
		m_prompt.LoadString(IDS_IDQUERYPROMPT); 
		if ( m_pDoc ) 
		{ 
			CString idformat; 
			idformat.Format("%c0%dld",'%',(int)log10(m_pDoc->m_mapobjs.GetSize()) + 1); 
			for (int count = 0;count < m_pDoc->m_mapobjs.GetSize();count ++ ) 
			{ 
				CMapObject * obj = m_pDoc->m_mapobjs[count]; 
				CString objid; 
				objid.Format(idformat,obj->ID); 
				m_fromlist.AddString(objid); 
			} 
		} 
	} 
	else if ( m_query == TITLEQUERY ) 
	{ 
		CString text; 
		text.LoadString(IDS_TITLEQUERY); 
		SetWindowText(text); 
		m_prompt.LoadString(IDS_TITLEQUERYPROMPT); 
		if ( m_pDoc ) 
		{ 
			DWORD title,tvalue; 
			POSITION pos = m_pDoc->m_maptitles.GetStartPosition(); 
			for ( ; pos != NULL; ) 
			{ 
				m_pDoc->m_maptitles.GetNextAssoc(pos,title,tvalue); 
				CString objtitle; 
				objtitle.Format("%ld",title); 
				m_fromlist.AddString(objtitle); 
			} 
		} 
	} 
	else 
	{ 
		return FALSE; 
	} 
 
	UpdateData(FALSE); 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CQueryDlg::SetQuery(int query) 
{ 
	m_query = query; 
}