FilterDlg.cpp
上传用户:y440e3
上传日期:2010-03-08
资源大小:200k
文件大小:11k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // FilterDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "draw.h"
  5. #include "FilterDlg.h"
  6. #include "data1ret.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CFilterDlg dialog
  14. CFilterDlg::CFilterDlg(CDataBaseSet* pSet,CWnd* pParent /*=NULL*/)
  15. : CDialog(CFilterDlg::IDD, pParent)
  16. {
  17. m_pSet=pSet;
  18. for(int i=0;i<10;i++)
  19. m_strOperator[i]=(char *)malloc(4);
  20. m_NumbOperator=6;
  21. strcpy(m_strOperator[0],"<>");
  22. strcpy(m_strOperator[1],"<=");
  23. strcpy(m_strOperator[2],">=");
  24. strcpy(m_strOperator[3],"=");
  25. strcpy(m_strOperator[4],"<");
  26. strcpy(m_strOperator[5],">");
  27. m_OperatorLong[0]=2;
  28. m_OperatorLong[1]=2;
  29. m_OperatorLong[2]=2;
  30. m_OperatorLong[3]=1;
  31. m_OperatorLong[4]=1;
  32. m_OperatorLong[5]=1;
  33. if(!m_pSet->IsOpen())
  34. m_pSet->Open();
  35. m_NumbField=m_pSet->GetODBCFieldCount();
  36. CODBCFieldInfo fieldinfo1;
  37. CODBCFieldInfo& fieldinfo=fieldinfo1;
  38. for(i=0;i<m_NumbField;i++)
  39. {
  40. m_pSet->GetODBCFieldInfo(i,fieldinfo);
  41. pFieldInfo[i]=fieldinfo1;
  42. }
  43. m_strFilter=m_pSet->m_strFilter;
  44. m_NumbAnd=0;
  45. m_NumbOr=0;
  46. }
  47. void CFilterDlg::DoDataExchange(CDataExchange* pDX)
  48. {
  49. CDialog::DoDataExchange(pDX);
  50. //{{AFX_DATA_MAP(CFilterDlg)
  51. // NOTE: the ClassWizard will add DDX and DDV calls here
  52. //}}AFX_DATA_MAP
  53. }
  54. BEGIN_MESSAGE_MAP(CFilterDlg, CDialog)
  55. //{{AFX_MSG_MAP(CFilterDlg)
  56. ON_BN_CLICKED(ID_AND_ADD, OnAndAdd)
  57. ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
  58. ON_LBN_SELCHANGE(IDC_LIST2, OnSelchangeList2)
  59. ON_BN_CLICKED(ID_OR_ADD, OnOrAdd)
  60. ON_BN_CLICKED(ID_AND_DEL, OnAndDelete)
  61. ON_BN_CLICKED(ID_OR_DEL, OnOrDelete)
  62. ON_BN_CLICKED(ID_OR_MODIFY, OnOrModify)
  63. ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
  64. //}}AFX_MSG_MAP
  65. END_MESSAGE_MAP()
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CFilterDlg message handlers
  68. int CFilterDlg::BreakAndStr(CString m_str)
  69. {
  70. int nChar,nChar1;
  71. m_str.TrimLeft();
  72. m_str.TrimRight();
  73. nChar=m_str.GetLength();
  74. CString m_str1=m_str;
  75. CString m_str2;
  76. int nStart;
  77. m_str1.MakeUpper();
  78. nStart=0;
  79. m_NumbAnd=0;
  80. int n;
  81. do
  82. {
  83. n=m_str1.Find("AND",nStart);
  84. if(n>=0)
  85. {
  86. if(n>nStart)
  87. {
  88. m_str2=m_str.Mid(nStart,n-nStart);
  89. m_str2.TrimLeft();
  90. m_str2.TrimRight();
  91. nChar1=m_str2.GetLength();
  92. if(m_str2.GetAt(0)==40&&m_str2.GetAt(nChar1-1)==41)
  93. m_strAnd[m_NumbAnd]=m_str2.Mid(1,nChar1-2);
  94. else
  95. m_strAnd[m_NumbAnd]=m_str2;
  96. m_NumbAnd++;
  97. m_str2.Empty();
  98. }
  99. nStart=n+3;
  100. }
  101. else
  102. {
  103. if(nStart<nChar)
  104. {
  105. m_str2=m_str.Mid(nStart,nChar);
  106. m_str2.TrimLeft();
  107. m_str2.TrimRight();
  108. nChar1=m_str2.GetLength();
  109. if(m_str2.GetAt(0)==40&&m_str2.GetAt(nChar1-1)==41)
  110. m_strAnd[m_NumbAnd]=m_str2.Mid(1,nChar1-2);
  111. else
  112. m_strAnd[m_NumbAnd]=m_str2;
  113. m_NumbAnd++;
  114. m_str2.Empty();
  115. }
  116. }
  117. } while(n>=0);
  118. return m_NumbAnd;
  119. }
  120. int CFilterDlg::BreakOrStr(CString m_str)
  121. {
  122. int nChar,nChar1;
  123. m_str.TrimLeft();
  124. m_str.TrimRight();
  125. nChar=m_str.GetLength();
  126. CString m_str1=m_str;
  127. CString m_str2;
  128. int nStart;
  129. m_str1.MakeUpper();
  130. nStart=0;
  131. m_NumbOr=0;
  132. int n;
  133. do
  134. {
  135. n=m_str1.Find(" OR ",nStart);
  136. if(n>=0)
  137. {
  138. if(n>nStart)
  139. {
  140. m_str2=m_str.Mid(nStart,n-nStart);
  141. m_str2.TrimLeft();
  142. m_str2.TrimRight();
  143. nChar1=m_str2.GetLength();
  144. if(m_str2.GetAt(0)==40&&m_str2.GetAt(nChar1-1)==41)
  145. m_strOr[m_NumbOr]=m_str2.Mid(1,nChar1-2);
  146. else
  147. m_strOr[m_NumbOr]=m_str2;
  148. m_NumbOr++;
  149. m_str2.Empty();
  150. }
  151. nStart=n+4;
  152. }
  153. else
  154. {
  155. if(nStart<nChar)
  156. {
  157. m_str2=m_str.Mid(nStart,nChar);
  158. m_str2.TrimLeft();
  159. m_str2.TrimRight();
  160. nChar1=m_str2.GetLength();
  161. if(m_str2.GetAt(0)==40&&m_str2.GetAt(nChar1-1)==41)
  162. m_strOr[m_NumbOr]=m_str2.Mid(1,nChar1-2);
  163. else
  164. m_strOr[m_NumbOr]=m_str2;
  165. m_NumbOr++;
  166. m_str2.Empty();
  167. }
  168. }
  169. } while(n>=0);
  170. return m_NumbOr;
  171. }
  172. void CFilterDlg::OnAndAdd() 
  173. {
  174. if(m_NumbAnd>=14)
  175. {
  176. AfxMessageBox("最多只能有14个.AND.子式");
  177. return;
  178. }
  179. CString m_str1;
  180. CString& p_str1=m_str1;
  181. BOOL yn=MakeOrStr(p_str1);
  182. if(yn)
  183. {
  184. m_strOr[0]=m_str1;
  185. m_NumbOr=1;
  186. plist2->ResetContent();
  187. plist2->AddString(m_str1);
  188. plist2->SetCurSel(0);
  189. MakeAndStr(p_str1);
  190. plist1->AddString(m_str1);
  191. plist1->SetCurSel(m_NumbAnd);
  192. m_strAnd[m_NumbAnd++]=m_str1;
  193. MakeStr();
  194. }
  195. }
  196. void CFilterDlg::OnSelchangeList1() 
  197. {
  198. int n=plist1->GetCurSel();
  199. if(n<0)
  200. {
  201. plist2->ResetContent();
  202. return;
  203. }
  204. BreakOrStr(m_strAnd[n]);
  205. plist2->ResetContent();
  206. for(int i=0;i<m_NumbOr;i++)
  207. plist2->AddString(m_strOr[i]);
  208. }
  209. BOOL CFilterDlg::OnInitDialog() 
  210. {
  211. CDialog::OnInitDialog();
  212. plist1=(CListBox *)GetDlgItem(IDC_LIST1);
  213. plist2=(CListBox *)GetDlgItem(IDC_LIST2);
  214. pcom1=(CComboBox *)GetDlgItem(IDC_COMBO1);
  215. pcom2=(CComboBox *)GetDlgItem(IDC_COMBO2);
  216. plist1->ResetContent();
  217. plist2->ResetContent();
  218. pcom1->ResetContent();
  219. pcom2->ResetContent();
  220. for(int i=0;i<m_NumbOperator;i++)
  221. pcom2->AddString(m_strOperator[i]);
  222. for(i=0;i<m_NumbField;i++)
  223. pcom1->AddString(pFieldInfo[i].m_strName);
  224. BreakAndStr(m_strFilter);
  225. for(i=0;i<m_NumbAnd;i++)
  226. plist1->AddString(m_strAnd[i]);
  227. if(m_NumbAnd>0)
  228. {
  229. plist1->SetCurSel(0);
  230. OnSelchangeList1();
  231. }
  232. MakeStr();
  233. return TRUE;  // return TRUE unless you set the focus to a control
  234.               // EXCEPTION: OCX Property Pages should return FALSE
  235. }
  236. void CFilterDlg::OnSelchangeList2() 
  237. {
  238. short nIndex;
  239. int n=plist2->GetCurSel();
  240. if(n<0)
  241. return;
  242. CString m_str2,m_str3;
  243. CString m_str1=m_strOr[n];
  244. m_str1.TrimLeft();
  245. m_str1.TrimRight();
  246. BOOL yn=0;
  247. for(int i=0;i<m_NumbOperator;i++)
  248. {
  249. n=m_str1.Find(m_strOperator[i],0);
  250. if(n>0)
  251. {
  252. nIndex=i;
  253. yn=1;
  254. break;
  255. }
  256. }
  257. BOOL yn1=0;
  258. if(yn)
  259. {
  260. pcom2->SetCurSel(nIndex);
  261. m_str2=m_str1.Left(n);
  262. for(i=0;i<m_NumbField;i++)
  263. {
  264. //if(m_str2.Compare(m_strField[i])==0)
  265. if(!m_str2.Compare(pFieldInfo[i].m_strName))
  266. {
  267. yn1=1;
  268. break;
  269. }
  270. }
  271. if(yn1)
  272. pcom1->SetCurSel(i);
  273. else
  274. pcom1->SetCurSel(-1);
  275. m_str3=m_str1.Mid(n+m_OperatorLong[nIndex]);
  276. SetDlgItemText(IDC_EDIT1,m_str3);
  277. OnSelchangeCombo1();
  278. }
  279. else
  280. SetDlgItemText(IDC_EDIT1,m_str2);
  281. }
  282. void CFilterDlg::OnOrAdd() 
  283. {
  284. int nlist1=plist1->GetCurSel();
  285. if(nlist1<0)
  286. return;
  287. if(m_NumbOr>=6)
  288. {
  289. AfxMessageBox("最多只能有6个.OR.子式");
  290. return;
  291. }
  292. CString m_str1;
  293. CString& p_str1=m_str1;
  294. BOOL yn=MakeOrStr(p_str1);
  295. if(yn)
  296. {
  297. m_strOr[m_NumbOr++]=m_str1;
  298. plist2->AddString(m_str1);
  299. plist2->SetCurSel(m_NumbOr-1);
  300. MakeAndStr(p_str1);
  301. plist1->DeleteString(nlist1);
  302. if(nlist1==m_NumbAnd-1)
  303. plist1->AddString(m_str1);
  304. else
  305. plist1->InsertString(nlist1,m_str1);
  306. plist1->SetCurSel(nlist1);
  307. m_strAnd[nlist1]=m_str1;
  308. MakeStr();
  309. }
  310. }
  311. BOOL CFilterDlg::MakeOrStr(CString &m_str)
  312. {
  313. CString m_str1;
  314. BOOL yn;
  315. int ncom1=pcom1->GetCurSel();
  316. if(ncom1<0)
  317. return FALSE;
  318. // m_str="(";
  319. m_str+=pFieldInfo[ncom1].m_strName;
  320. int ncom2=pcom2->GetCurSel();
  321. if(ncom2<0)
  322. return FALSE;
  323. m_str+=m_strOperator[ncom2];
  324. GetDlgItemText(IDC_EDIT1,m_str1);
  325. m_str1.TrimLeft();
  326. m_str1.TrimRight();
  327. int nn=m_str1.GetLength();
  328. if(nn<=0)
  329. {
  330. AfxMessageBox("没有输入字符值");
  331. return FALSE;
  332. }
  333. if(pFieldInfo[ncom1].m_nSQLType==1)
  334. yn=1;
  335. else
  336. yn=0;
  337. if(nn>2&&pFieldInfo[ncom1].m_nSQLType==1)
  338. {
  339. if(m_str1.GetAt(0)==39&&m_str1.GetAt(nn-1)==39)
  340. yn=0;
  341. }
  342. if(yn)
  343. m_str+="'";
  344. m_str+=m_str1;
  345. if(yn)
  346. m_str+="'";
  347. // m_str+=")";
  348. return TRUE;
  349. }
  350. BOOL CFilterDlg::MakeStr()
  351. {
  352. m_strFilter.Empty();
  353. for(int i=0;i<m_NumbAnd;i++)
  354. {
  355. m_strAnd[i].TrimLeft();
  356. m_strAnd[i].TrimRight();
  357. if(i>0)
  358. m_strFilter+=" AND ";
  359. m_strFilter+="(";
  360. m_strFilter+=m_strAnd[i];
  361. m_strFilter+=")";
  362. }
  363. SetDlgItemText(IDC_EDIT2,m_strFilter);
  364. return TRUE;
  365. }
  366. BOOL CFilterDlg::MakeAndStr(CString& m_str)
  367. {
  368. if(m_NumbOr<=0)
  369. return FALSE;
  370. m_str.Empty();
  371. for(int i=0;i<m_NumbOr;i++)
  372. {
  373. if(i>0)
  374. m_str+=" or ";
  375. m_str+="(";
  376. m_str+=m_strOr[i];
  377. m_str+=")";
  378. }
  379. return TRUE;
  380. }
  381. void CFilterDlg::OnAndDelete() 
  382. {
  383. // TODO: Add your control notification handler code here
  384. short nlist1=plist1->GetCurSel();
  385. if(nlist1<0)
  386. return;
  387. plist1->DeleteString(nlist1);
  388. m_NumbAnd--;
  389. if(nlist1=m_NumbAnd)
  390. plist1->SetCurSel(nlist1-1);
  391. else
  392. plist1->SetCurSel(nlist1);
  393. for(int i=nlist1;i<m_NumbAnd;i++)
  394. m_strAnd[i]=m_strAnd[i+1];
  395. m_strAnd[m_NumbAnd].Empty();
  396. OnSelchangeList1();
  397. MakeStr();
  398. }
  399. void CFilterDlg::OnOrDelete() 
  400. {
  401. // TODO: Add your control notification handler code here
  402. int nlist1=plist1->GetCurSel();
  403. if(nlist1<0)
  404. return;
  405. int nlist2=plist2->GetCurSel();
  406. if(nlist2<0)
  407. return;
  408. plist2->DeleteString(nlist2);
  409. m_NumbOr--;
  410. for(int i=nlist2;i<m_NumbOr;i++)
  411. m_strOr[i]=m_strOr[i+1];
  412. if(nlist2==m_NumbOr)
  413. plist2->SetCurSel(nlist2-1);
  414. else
  415. plist2->SetCurSel(nlist2);
  416. OnSelchangeList2();
  417. CString m_str1;
  418. CString& p_str1=m_str1;
  419. if(MakeAndStr(p_str1)) //如果能够得到.AND.条件式
  420. {
  421. plist1->DeleteString(nlist1);
  422. if(nlist1==m_NumbAnd-1)
  423. plist1->AddString(m_str1);
  424. else
  425. plist1->InsertString(nlist1,m_str1);
  426. plist1->SetCurSel(nlist1);
  427. m_strAnd[nlist1]=m_str1;
  428. }
  429. else //如果不能得到.AND.条件式
  430. OnAndDelete();
  431. MakeStr();
  432. }
  433. void CFilterDlg::OnOrModify() 
  434. {
  435. // TODO: Add your control notification handler code here
  436. short nlist1=plist1->GetCurSel();
  437. if(nlist1<0)
  438. return;
  439. short nlist2=plist2->GetCurSel();
  440. if(nlist2<0)
  441. return;
  442. CString m_str1;
  443. CString& p_str1=m_str1;
  444. BOOL yn=MakeOrStr(p_str1);
  445. if(yn)
  446. {
  447. m_strOr[nlist2]=m_str1;
  448. plist2->DeleteString(nlist2);
  449. if(nlist2==m_NumbOr-1)
  450. plist2->AddString(m_str1);
  451. else
  452. plist2->InsertString(nlist2,m_str1);
  453. plist2->SetCurSel(nlist2);
  454. MakeAndStr(p_str1);
  455. plist1->DeleteString(nlist1);
  456. if(nlist1==m_NumbAnd-1)
  457. plist1->AddString(m_str1);
  458. else
  459. plist1->InsertString(nlist1,m_str1);
  460. plist1->SetCurSel(nlist1);
  461. m_strAnd[nlist1]=m_str1;
  462. MakeStr();
  463. }
  464. }
  465. void CFilterDlg::OnOK() 
  466. {
  467. // TODO: Add extra validation here
  468. GetDlgItemText(IDC_EDIT2,m_strFilter);
  469. if(m_pSet->IsOpen())
  470. m_pSet->Close();
  471. CString m_str=m_pSet->m_strFilter;
  472. m_pSet->m_strFilter=m_strFilter;
  473. if(m_pSet->Open())
  474. {
  475. for(int i=0;i<10;i++)
  476. free(m_strOperator[i]);
  477. EndDialog(IDOK);
  478. }
  479. else
  480. m_pSet->m_strFilter=m_str;
  481. }
  482. void CFilterDlg::OnCancel() 
  483. {
  484. // TODO: Add extra cleanup here
  485. for(int i=0;i<10;i++)
  486. free(m_strOperator[i]);
  487. EndDialog(IDCANCEL);
  488. }
  489. void CFilterDlg::OnSelchangeCombo1() 
  490. {
  491. // TODO: Add your control notification handler code here
  492. int ncom1=pcom1->GetCurSel();
  493. if(ncom1<0)
  494. {
  495. pcom2->EnableWindow(1);
  496. return;
  497. }
  498. if(pFieldInfo[ncom1].m_nSQLType==1) //如果是字符类型
  499. {
  500. pcom2->SetCurSel(3);
  501. pcom2->EnableWindow(0);
  502. }
  503. else
  504. pcom2->EnableWindow(1);
  505. }