home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / winfe / srchdlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  21.5 KB  |  823 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18. // srchdlg.cpp : implementation file
  19. //
  20.  
  21. #include "stdafx.h"
  22. #include "srchdlg.h"
  23. #include "template.h"
  24. #include "wfemsg.h"
  25. #include "msg_srch.h"
  26. #include "dirprefs.h"
  27. #include "nethelp.h"
  28. #include "xp_help.h"
  29. #include "prefapi.h"
  30. #include "intlwin.h"
  31. #include "xp_time.h"
  32. #include "xplocale.h"
  33. #include "dateedit.h"
  34. #include "intl_csi.h"
  35.  
  36.  
  37. ////////////////////////////////////////////////////////////////////////////
  38. // CAddrEditProperities
  39.  
  40. CSearchDialog::CSearchDialog (LPCTSTR lpszCaption, MSG_Pane* pSearchPane, DIR_Server* pServer, CWnd * parent,
  41.          UINT numButtons, ButtonPosition buttonPosition, CPtrArray* buttonLabels) 
  42. #ifdef FEATURE_BUTTONPROPERTYPAGE   
  43.  :CButtonPropertySheet ( lpszCaption, parent, numButtons, buttonPosition, buttonLabels )
  44. #endif
  45. {
  46.     m_pServer = pServer;
  47.     m_pSearchPane = pSearchPane;
  48. #ifdef FEATURE_BUTTONPROPERTYPAGE
  49.     m_pBasicSearch = new CBasicSearch (this);
  50.     AddPage( m_pBasicSearch );
  51.     m_pAdvancedSearch = new CAdvancedSearch (this);
  52.     AddPage( m_pAdvancedSearch );
  53. #endif
  54. }
  55.  
  56. CSearchDialog::CSearchDialog (UINT nIDCaption, MSG_Pane* pSearchPane, DIR_Server* pServer, CWnd * parent,
  57.          UINT numButtons, ButtonPosition buttonPosition, CUIntArray* buttonLabels) 
  58. #ifdef FEATURE_BUTTONPROPERTYPAGE
  59.     :CButtonPropertySheet ( nIDCaption, parent, numButtons, buttonPosition, buttonLabels )
  60. #endif
  61. {
  62.     m_pServer = pServer;
  63.     m_pSearchPane = pSearchPane;
  64. #ifdef FEATURE_BUTTONPROPERTYPAGE
  65.     m_pBasicSearch = new CBasicSearch (this);
  66.     AddPage( m_pBasicSearch );
  67.     m_pAdvancedSearch = new CAdvancedSearch (this);
  68.     AddPage( m_pAdvancedSearch );
  69. #endif
  70. }
  71.  
  72. CSearchDialog::~CSearchDialog ( )
  73. {
  74.  
  75. }
  76.  
  77. void CSearchDialog::PostNcDestroy( )
  78. {
  79.     if ( m_pAdvancedSearch )
  80.         delete m_pAdvancedSearch;
  81.     if ( m_pBasicSearch )
  82.         delete m_pBasicSearch;
  83. }
  84.  
  85. void CSearchDialog::OnHelp()
  86. {
  87. #ifdef FEATURE_BUTTONPROPERTYPAGE
  88.     if (GetActivePage() == m_pAdvancedSearch)
  89.         NetHelp(HELP_ADD_USER_PROPS);
  90.     if (GetActivePage() == m_pBasicSearch)
  91.         NetHelp(HELP_ADD_USER_PROPS);
  92. #endif
  93. }
  94.  
  95. #ifdef FEATURE_BUTTONPROPERTYPAGE
  96. BEGIN_MESSAGE_MAP(CSearchDialog, CButtonPropertySheet)
  97. #else
  98. BEGIN_MESSAGE_MAP(CSearchDialog, CWnd)
  99. #endif
  100.     //{{AFX_MSG_MAP(CSearchDialog)
  101.         // NOTE: the ClassWizard will add message map macros here
  102.         ON_WM_CREATE()
  103.         ON_MESSAGE(LDS_GETSERVER,OnGetServer)
  104.         ON_MESSAGE(LDS_GETSEARCHPANE,OnGetSearchPane)
  105.         ON_MESSAGE(LDS_RECALC_LAYOUT,OnRecalcLayout)
  106.     //}}AFX_MSG_MAP
  107. END_MESSAGE_MAP()
  108.  
  109.  
  110. LRESULT CSearchDialog::OnGetServer(WPARAM wParam, LPARAM lParam)
  111. {
  112.     DIR_Server ** server = (DIR_Server **) lParam;
  113.     (*server) = m_pServer;
  114.     return 1;
  115. }
  116.  
  117. LRESULT CSearchDialog::OnGetSearchPane(WPARAM wParam, LPARAM lParam)
  118. {
  119.     MSG_Pane ** pane = (MSG_Pane **) lParam;
  120.     (*pane) = m_pSearchPane;
  121.     return 1;
  122. }
  123.  
  124. LRESULT CSearchDialog::OnRecalcLayout(WPARAM wParam, LPARAM lParam)
  125. {
  126. #ifdef FEATURE_BUTTONPROPERTYPAGE
  127.     RecalcLayout();
  128. #endif
  129.     return 1;
  130. }
  131.  
  132. int CSearchDialog::OnCreate( LPCREATESTRUCT lpCreateStruct )
  133. {
  134. #ifdef FEATURE_BUTTONPROPERTYPAGE
  135.     if (CButtonPropertySheet::OnCreate(lpCreateStruct) == -1)
  136. #else
  137.     if (CWnd::OnCreate(lpCreateStruct) == -1)
  138. #endif
  139.         return -1;
  140.  
  141.     int16 guicsid = 0;
  142.     CString cs;
  143.  
  144.     guicsid = CIntlWin::GetSystemLocaleCsid();
  145.  
  146.     HDC hDC = ::GetDC(m_hWnd);
  147.     LOGFONT lf;  
  148.     memset(&lf,0,sizeof(LOGFONT));
  149.  
  150.     lf.lfPitchAndFamily = FF_SWISS;
  151.     lf.lfWeight = FW_NORMAL;
  152.     lf.lfCharSet = IntlGetLfCharset(CIntlWin::GetSystemLocaleCsid());
  153.     if (CIntlWin::GetSystemLocaleCsid() == CS_LATIN1)
  154.          _tcscpy(lf.lfFaceName, "MS Sans Serif");
  155.     else
  156.          _tcscpy(lf.lfFaceName, IntlGetUIPropFaceName(CIntlWin::GetSystemLocaleCsid()));
  157.     lf.lfHeight = -MulDiv(9, ::GetDeviceCaps(hDC, LOGPIXELSY), 72);
  158.     m_pFont = theApp.CreateAppFont( lf );
  159.  
  160.     ::ReleaseDC(m_hWnd,hDC);
  161.  
  162.     XP_Bool prefBool= FALSE;
  163.  
  164.     PREF_GetBoolPref("mail.addr_book.useAdvancedSearch", &prefBool);
  165.     if (prefBool) {
  166. #ifdef FEATURE_BUTTONPROPERTYPAGE
  167.         SetActivePage (1);
  168. #endif
  169.         cs.LoadString (IDS_BASICSEARCH);
  170.         GetDlgItem(IDC_BUTTON4)->SetWindowText(cs);
  171.         cs.LoadString (IDS_ADVSEARCH_TITLE);
  172.         SetWindowText (cs);
  173.         ((CAdvancedSearch*)m_pAdvancedSearch)->InitializePrevSearch ();
  174.     }
  175.     else {
  176. #ifdef FEATURE_BUTTONPROPERTYPAGE
  177.         SetActivePage (0);
  178. #endif
  179.         cs.LoadString (IDS_BASICSEARCH_TITLE);
  180.         SetWindowText (cs);
  181.         ((CBasicSearch*)m_pBasicSearch)->InitializeSearchValues ();
  182.     }
  183.  
  184.     return 0;
  185. }
  186.  
  187. void CSearchDialog::OnButton2()
  188. {
  189. #ifdef FEATURE_BUTTONPROPERTYPAGE
  190.     if (GetActiveIndex() == 0) {
  191.         // save basic search
  192.         ((CBasicSearch*)m_pBasicSearch)->SavePreviousSearch();
  193.     }
  194.     else {
  195.         // save advanced search
  196.         ((CAdvancedSearch*)m_pAdvancedSearch)->SavePreviousSearch();
  197.     }
  198.  
  199.  
  200.     CButtonPropertySheet::OnButton2();
  201. #endif
  202.  
  203. } // END OF    FUNCTION CSearchDialog::OnButton2()
  204.  
  205. void CSearchDialog::OnButton3()
  206. {
  207.     OnHelp();
  208.  
  209. } // END OF    FUNCTION CSearchDialog::OnButton3()
  210.  
  211. void CSearchDialog::OnButton4()
  212. {
  213. #ifdef FEATURE_BUTTONPROPERTYPAGE
  214.     CString cs;
  215.     if (GetActiveIndex() == 0) {
  216.         // switch to advanced
  217.         cs.LoadString (IDS_BASICSEARCH);
  218.         GetDlgItem(IDC_BUTTON4)->SetWindowText(cs);
  219.         ((CBasicSearch*)m_pBasicSearch)->SavePreviousSearch();
  220.         SetActivePage(1);
  221.         cs.LoadString (IDS_ADVSEARCH_TITLE);
  222.         SetWindowText (cs);
  223.         ((CAdvancedSearch*)m_pAdvancedSearch)->InitializePrevSearch ();
  224.     }
  225.     else {
  226.         // switch to basic
  227.         cs.LoadString (IDS_ADVSEARCH);
  228.         GetDlgItem(IDC_BUTTON4)->SetWindowText(cs);
  229.         ((CAdvancedSearch*)m_pAdvancedSearch)->SavePreviousSearch();
  230.         SetActivePage(0);
  231.         cs.LoadString (IDS_BASICSEARCH_TITLE);
  232.         SetWindowText (cs);
  233.         ((CBasicSearch*)m_pBasicSearch)->InitializeSearchValues ();
  234.     }
  235.     PREF_SetBoolPref("mail.addr_book.useAdvancedSearch", GetActiveIndex());
  236. #endif
  237. } // END OF    FUNCTION CSearchDialog::OnButton4()
  238.  
  239.  
  240. /////////////////////////////////////////////////////////////////////////////
  241. // CAdvancedSearch property page
  242.  
  243. CAdvancedSearch::CAdvancedSearch(CWnd *pParent) 
  244. #ifdef FEATURE_BUTTONPROPERTYPAGE
  245.     : CButtonPropertyPage(CAdvancedSearch::IDD)
  246. #endif
  247. {
  248.     //{{AFX_DATA_INIT(CAddressUser)
  249.     //}}AFX_DATA_INIT
  250.     m_iMoreCount = 0;
  251.     m_bLogicType = 0;
  252.     m_bChanged = FALSE;
  253. }
  254.  
  255. CAdvancedSearch::~CAdvancedSearch()
  256. {
  257. }
  258.  
  259. void CAdvancedSearch::DoDataExchange(CDataExchange* pDX)
  260. {
  261. #ifdef FEATURE_BUTTONPROPERTYPAGE
  262.     CButtonPropertyPage::DoDataExchange(pDX);
  263. #else
  264.     CDialog::DoDataExchange(pDX);
  265. #endif
  266.  
  267.     //{{AFX_DATA_MAP(CAdvancedSearch)
  268.     //}}AFX_DATA_MAP
  269. }
  270.  
  271. #ifdef FEATURE_BUTTONPROPERTYPAGE
  272. BEGIN_MESSAGE_MAP(CAdvancedSearch, CButtonPropertyPage)
  273. #else
  274. BEGIN_MESSAGE_MAP(CAdvancedSearch, CDialog)
  275. #endif
  276.     //{{AFX_MSG_MAP(CAdvancedSearch)
  277.         // NOTE: the ClassWizard will add message map macros here
  278.     ON_BN_CLICKED(IDC_MORE, OnMore)
  279.     ON_BN_CLICKED(IDC_FEWER, OnFewer)
  280.     ON_BN_CLICKED(IDC_CLEAR_SEARCH, OnClearSearch)
  281.     ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB1, OnAttrib1)
  282.     ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB2, OnAttrib2)
  283.     ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB3, OnAttrib3)
  284.     ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB4, OnAttrib4)
  285.     ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB5, OnAttrib5)
  286.     ON_CBN_SELCHANGE(IDC_COMBO_OP1, OnOperatorValueChanged)
  287.     ON_CBN_SELCHANGE(IDC_COMBO_OP2, OnOperatorValueChanged)
  288.     ON_CBN_SELCHANGE(IDC_COMBO_OP3, OnOperatorValueChanged)
  289.     ON_CBN_SELCHANGE(IDC_COMBO_OP4, OnOperatorValueChanged)
  290.     ON_CBN_SELCHANGE(IDC_COMBO_OP5, OnOperatorValueChanged)
  291.     ON_CBN_SELCHANGE(IDC_COMBO_AND_OR, OnAndOr)
  292.     ON_EN_CHANGE( IDC_EDIT_VALUE1, OnEditValueChanged )
  293.     ON_EN_CHANGE( IDC_EDIT_VALUE2, OnEditValueChanged )
  294.     ON_EN_CHANGE( IDC_EDIT_VALUE3, OnEditValueChanged )
  295.     ON_EN_CHANGE( IDC_EDIT_VALUE4, OnEditValueChanged )
  296. #ifdef ON_UPDATE_COMMAND_UI_RANGE
  297.     ON_UPDATE_COMMAND_UI_RANGE( IDC_COMBO_ATTRIB1, IDC_EDIT_VALUE5, OnUpdateQuery )
  298. #endif
  299.     //}}AFX_MSG_MAP
  300. END_MESSAGE_MAP()
  301.  
  302.  
  303. #ifndef ON_UPDATE_COMMAND_UI_RANGE
  304.  
  305. BOOL CAdvancedSearch::OnCmdMsg( UINT nID, int nCode, void* pExtra, 
  306.                              AFX_CMDHANDLERINFO* pHandlerInfo ) 
  307. {
  308.     if ((nID >= IDC_COMBO_ATTRIB1) && (nID <= IDC_EDIT_VALUE5) && 
  309.         ( nCode == CN_UPDATE_COMMAND_UI) ) {
  310.         OnUpdateQuery( (CCmdUI *) pExtra );
  311.         return TRUE;
  312.     }
  313.     return CDialog::OnCmdMsg( nID, nCode, pExtra, pHandlerInfo );
  314. }
  315.  
  316. #endif
  317.  
  318. void CAdvancedSearch::OnUpdateQuery( CCmdUI *pCmdUI )
  319. {
  320.     pCmdUI->Enable( TRUE );
  321. }
  322.  
  323. void CAdvancedSearch::AdjustHeight(int dy)
  324. {
  325.     CRect rect;
  326.     GetWindowRect(&rect);
  327.  
  328.     CSize size = rect.Size();
  329.     size.cy += dy;
  330.  
  331.     SetWindowPos( NULL, 0, 0, size.cx, size.cy, SWP_NOACTIVATE|SWP_NOZORDER|SWP_SHOWWINDOW);
  332.     GetWindowRect(&rect);
  333. }
  334.  
  335.  
  336. /////////////////////////////////////////////////////////////////////////////
  337. // CAddressUser message handlers
  338.  
  339. BOOL CAdvancedSearch::OnInitDialog() 
  340. {
  341. #ifdef FEATURE_BUTTONPROPERTYPAGE
  342.     // TODO: Add your specialized code here and/or call the base class
  343.     CButtonPropertyPage::OnInitDialog();
  344. #endif
  345.     m_searchObj.InitializeAttributes (widgetText, attribCommonName);
  346.  
  347.     DIR_Server * pServer = NULL;
  348.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &pServer);
  349.  
  350.     m_searchObj.New (this);
  351.  
  352.     m_searchObj.UpdateAttribList(scopeLdapDirectory, pServer);
  353.     m_searchObj.UpdateOpList(scopeLdapDirectory, pServer);
  354.  
  355.     GetDlgItem(IDC_STATIC1)->SetWindowText(pServer->description);
  356.  
  357.     return TRUE;
  358. }
  359.  
  360.  
  361. void CAdvancedSearch::InitializePrevSearch() 
  362. {
  363.     int dy = 0;
  364.     MSG_Pane * pane = NULL;
  365.     DIR_Server * pServer = NULL;
  366.  
  367.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &pServer);
  368.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSEARCHPANE, 0, (LPARAM) &pane);
  369.     
  370.     dy += m_searchObj.InitializeLDAPSearchWindow (pane, pServer, &m_iMoreCount, m_bLogicType);
  371.  
  372.     if (m_iMoreCount < 4)
  373.         GetDlgItem(IDC_MORE)->EnableWindow (TRUE);
  374.     else
  375.         GetDlgItem(IDC_MORE)->EnableWindow (FALSE);
  376.     if (m_iMoreCount > 0)
  377.         GetDlgItem(IDC_FEWER)->EnableWindow (TRUE);
  378.     else
  379.         GetDlgItem(IDC_FEWER)->EnableWindow (FALSE);
  380.  
  381.     AdjustHeight (dy);
  382.  
  383.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_RECALC_LAYOUT, 0, 0);
  384. }
  385.  
  386.  
  387. BOOL CAdvancedSearch::SavePreviousSearch( )
  388. {
  389.     // save the query 
  390.     if (m_bChanged) 
  391.     {
  392.         MSG_Pane * pane = NULL;
  393.         DIR_Server * server = NULL;
  394.  
  395.         ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  396.         ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSEARCHPANE, 0, (LPARAM) &pane);
  397.         MSG_SearchFree (pane);
  398.         MSG_SearchAlloc (pane);
  399.         MSG_AddLdapScope(pane, server);
  400.         m_searchObj.BuildQuery(pane, m_iMoreCount, m_bLogicType);
  401.     }
  402.  
  403.     return (TRUE);
  404. }
  405.  
  406.  
  407. BOOL CAdvancedSearch::OnSetActive() 
  408. {
  409. #ifdef FEATURE_BUTTONPROPERTYPAGE
  410.     // TODO: Add your specialized code here and/or call the base class
  411.     if(!CButtonPropertyPage::OnSetActive()) 
  412.         return(FALSE);
  413.  
  414.     m_bChanged = FALSE;
  415. #endif
  416.     return(TRUE);
  417. }
  418.  
  419.  
  420. void CAdvancedSearch::OnOK()
  421. {
  422.     MSG_Pane * pane = NULL;
  423.     DIR_Server * server = NULL;
  424.  
  425.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  426.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSEARCHPANE, 0, (LPARAM) &pane);
  427.     MSG_SearchFree (pane);
  428.     MSG_SearchAlloc (pane);
  429.     MSG_AddLdapScope(pane, server);
  430.     m_searchObj.BuildQuery(pane, m_iMoreCount, m_bLogicType);
  431. }
  432.  
  433. void CAdvancedSearch::OnAndOr()
  434. {
  435.     m_searchObj.OnAndOr(m_iMoreCount, &m_bLogicType);
  436.     m_bChanged = TRUE;
  437. }
  438.  
  439. void CAdvancedSearch::OnMore()
  440. {
  441.     int dy = 0;
  442.  
  443.     dy = m_searchObj.More(&m_iMoreCount, m_bLogicType);
  444.  
  445.     if (m_iMoreCount < 4)
  446.         GetDlgItem(IDC_MORE)->EnableWindow (TRUE);
  447.     else
  448.         GetDlgItem(IDC_MORE)->EnableWindow (FALSE);
  449.     if (m_iMoreCount > 0)
  450.         GetDlgItem(IDC_FEWER)->EnableWindow (TRUE);
  451.     else
  452.         GetDlgItem(IDC_FEWER)->EnableWindow (FALSE);
  453.  
  454.     AdjustHeight (dy);
  455.  
  456.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_RECALC_LAYOUT, 0, 0);
  457. }
  458.  
  459. void CAdvancedSearch::OnFewer()
  460. {
  461.     int dy = 0;
  462.  
  463.     dy = m_searchObj.Fewer(&m_iMoreCount, m_bLogicType);
  464.  
  465.     if (m_iMoreCount < 4)
  466.         GetDlgItem(IDC_MORE)->EnableWindow (TRUE);
  467.     else
  468.         GetDlgItem(IDC_MORE)->EnableWindow (FALSE);
  469.     if (m_iMoreCount > 0)
  470.         GetDlgItem(IDC_FEWER)->EnableWindow (TRUE);
  471.     else
  472.         GetDlgItem(IDC_FEWER)->EnableWindow (FALSE);
  473.  
  474.     AdjustHeight (dy);
  475.  
  476.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_RECALC_LAYOUT, 0, 0);
  477. }
  478.  
  479. void CAdvancedSearch::OnClearSearch()
  480. {
  481.     int dy = 0;
  482.  
  483.     MSG_Pane * pane = NULL;
  484.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSEARCHPANE, 0, (LPARAM) &pane);
  485.  
  486.     MSG_SearchFree (pane);
  487.  
  488.     dy = m_searchObj.ClearSearch(&m_iMoreCount, TRUE);
  489.  
  490.     AdjustHeight (dy);
  491.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_RECALC_LAYOUT, 0, 0);
  492.     m_bChanged = TRUE;
  493. }
  494.  
  495. void CAdvancedSearch::OnEditValueChanged ()
  496. {
  497.     m_bChanged = TRUE;
  498. }
  499.  
  500. void CAdvancedSearch::OnOperatorValueChanged ()
  501. {
  502.     m_bChanged = TRUE;
  503. }
  504.  
  505. void CAdvancedSearch::OnAttrib1()
  506. {
  507.     DIR_Server * server = NULL;
  508.  
  509.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  510.  
  511.     m_searchObj.UpdateOpList(0, scopeLdapDirectory, server);
  512.     m_bChanged = TRUE;
  513. }
  514.  
  515. void CAdvancedSearch::OnAttrib2()
  516. {
  517.     DIR_Server * server = NULL;
  518.  
  519.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  520.     m_searchObj.UpdateOpList(1, scopeLdapDirectory, server);
  521.     m_bChanged = TRUE;
  522. }
  523.  
  524. void CAdvancedSearch::OnAttrib3()
  525. {
  526.     DIR_Server * server = NULL;
  527.  
  528.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  529.     m_searchObj.UpdateOpList(2, scopeLdapDirectory, server);
  530.     m_bChanged = TRUE;
  531. }
  532.  
  533. void CAdvancedSearch::OnAttrib4()
  534. {
  535.     DIR_Server * server = NULL;
  536.  
  537.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  538.     m_searchObj.UpdateOpList(3, scopeLdapDirectory, server);
  539.     m_bChanged = TRUE;
  540. }
  541.  
  542. void CAdvancedSearch::OnAttrib5()
  543. {
  544.     DIR_Server * server = NULL;
  545.  
  546.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  547.     m_searchObj.UpdateOpList(4, scopeLdapDirectory, server);
  548.     m_bChanged = TRUE;
  549. }
  550.  
  551.  
  552.  
  553. /////////////////////////////////////////////////////////////////////////////
  554. // CBasicSearch property page
  555.  
  556. static int BasicChoicesTable[][2] =
  557.     {{IDC_STATIC1, IDC_EDIT_VALUE1},
  558.      {IDC_STATIC2, IDC_EDIT_VALUE2},
  559.      {IDC_STATIC3, IDC_EDIT_VALUE3},
  560.      {IDC_STATIC4, IDC_EDIT_VALUE4}};
  561.  
  562. #define BASIC_COL_LABEL        0
  563. #define BASIC_COL_VALUE        1
  564. #define BASIC_COL_COUNT        2
  565.  
  566. static _TCHAR szResultText[64];
  567.  
  568. CBasicSearch::CBasicSearch(CWnd *pParent) 
  569. #ifdef FEATURE_BUTTONPROPERTYPAGE
  570.     : CButtonPropertyPage(CBasicSearch::IDD)
  571. #endif
  572. {
  573.     //{{AFX_DATA_INIT(CBasicSearch)
  574.     //}}AFX_DATA_INIT
  575.     m_bChanged = FALSE;
  576. }
  577.  
  578. CBasicSearch::~CBasicSearch()
  579. {
  580.     m_bLogicType = 1;
  581. }
  582.  
  583. void CBasicSearch::DoDataExchange(CDataExchange* pDX)
  584. {
  585. #ifdef FEATURE_BUTTONPROPERTYPAGE
  586.     CButtonPropertyPage::DoDataExchange(pDX);
  587. #else
  588.     CDialog::DoDataExchange(pDX);
  589. #endif
  590.     //{{AFX_DATA_MAP(CBasicSearch)
  591.     //}}AFX_DATA_MAP
  592. }
  593.  
  594. #ifdef FEATURE_BUTTONPROPERTYPAGE
  595. BEGIN_MESSAGE_MAP(CBasicSearch, CButtonPropertyPage)
  596. #else
  597. BEGIN_MESSAGE_MAP(CBasicSearch, CDialog)
  598. #endif
  599.  
  600.     //{{AFX_MSG_MAP(CBasicSearch)
  601.         // NOTE: the ClassWizard will add message map macros here
  602.     ON_EN_CHANGE( IDC_EDIT_VALUE1, OnEditValueChanged )
  603.     ON_EN_CHANGE( IDC_EDIT_VALUE2, OnEditValueChanged )
  604.     ON_EN_CHANGE( IDC_EDIT_VALUE3, OnEditValueChanged )
  605.     ON_EN_CHANGE( IDC_EDIT_VALUE4, OnEditValueChanged )
  606.     //}}AFX_MSG_MAP
  607. END_MESSAGE_MAP()
  608.  
  609. /////////////////////////////////////////////////////////////////////////////
  610. // CAddressUser message handlers
  611.  
  612. BOOL CBasicSearch::OnInitDialog() 
  613. {
  614.     MSG_SearchMenuItem items[4];
  615.     int maxItems = 4;
  616.  
  617. #ifdef FEATURE_BUTTONPROPERTYPAGE
  618.     CButtonPropertyPage::OnInitDialog();
  619. #endif
  620.  
  621.     DIR_Server * pServer = NULL;
  622.     int j = 0;
  623.  
  624.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &pServer);
  625.     GetDlgItem(IDC_STATIC5)->SetWindowText(pServer->description);
  626.  
  627.     MSG_GetBasicLdapSearchAttributes (pServer, items, &maxItems);
  628.  
  629.     for (j = 0; j < maxItems; j++) {
  630.         (GetDlgItem (BasicChoicesTable[j][BASIC_COL_LABEL]))->SetWindowText (items[j].name);
  631.     }
  632.     
  633.     return TRUE;
  634. }
  635.  
  636. void CBasicSearch::InitializeSearchValues ()
  637. {
  638.     MSG_Pane * pane = NULL;
  639.     int numTerms = 0;
  640.     MSG_SearchAttribute attrib;
  641.     MSG_SearchOperator op;
  642.     MSG_SearchValue value;
  643.     MSG_SearchMenuItem items[4];
  644.     int maxItems = 4;
  645.     int j = 0;
  646.     DIR_Server * pServer = NULL;
  647.  
  648.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &pServer);
  649.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSEARCHPANE, 0, (LPARAM) &pane);
  650.  
  651.     MSG_GetBasicLdapSearchAttributes (pServer, items, &maxItems);
  652.     MSG_CountSearchTerms (pane, &numTerms);
  653.  
  654.     // set all the terms back to empty strings
  655.     for (j = 0; j < maxItems; j++) {
  656.         (GetDlgItem (BasicChoicesTable[j][BASIC_COL_VALUE]))->SetWindowText("");
  657.     }
  658.  
  659.     // get the attributes for the directory used in the last search
  660.     // and make sure that 
  661.     // it hasn't been remaped from customization 
  662.     int numScopes = 0;
  663.     DIR_Server * server = NULL;
  664.     uint16 maxItems2 = 16;
  665.     MSG_SearchMenuItem items2[16];
  666.     MSG_ScopeAttribute scope = scopeLdapDirectory;
  667.     MSG_CountSearchScopes (pane, &numScopes);
  668.     BOOL bCompareAttrib = FALSE;
  669.             
  670.     // find the attributes
  671.     if (numScopes) {
  672.         ASSERT (numScopes == 1);
  673.         MSG_GetNthSearchScope (pane, 0, &scope, (void**) &server);
  674.         if (server && !DIR_AreServersSame (pServer, server)) {                    
  675.             MSG_GetAttributesForSearchScopes (WFE_MSGGetMaster(), scopeLdapDirectory, 
  676.                         (void**) &server, 1, items2, &maxItems2);
  677.             bCompareAttrib = TRUE;
  678.         }
  679.     }
  680.                 
  681.     // set them to the values in the search pane
  682.     for (int i = 0; i < maxItems && i < numTerms; i++)
  683.     {
  684.         BOOL found = FALSE;
  685.         int k = 0;
  686.         MSG_GetNthSearchTerm (pane, i, &attrib, &op, &value);
  687.         if (bCompareAttrib)
  688.         {
  689.             while (k < maxItems2 && !found) {
  690.                 if (items2 [k].attrib != attrib)
  691.                     k++;
  692.                 else 
  693.                     found = TRUE;
  694.             }
  695.         }
  696.  
  697.         for (j = 0; j < maxItems; j++) {
  698.             if ((items[j].attrib ==  attrib) && (!(GetDlgItem (BasicChoicesTable[j][BASIC_COL_VALUE]))->GetWindowTextLength())) {
  699.                 if (bCompareAttrib) {
  700.                     if (found && (strcmp (items2 [k].name, items[j].name ) == 0))
  701.                         (GetDlgItem (BasicChoicesTable[j][BASIC_COL_VALUE]))->SetWindowText(value.u.string);
  702.                 }
  703.                 else
  704.                     (GetDlgItem (BasicChoicesTable[j][BASIC_COL_VALUE]))->SetWindowText(value.u.string);
  705.             }
  706.         }
  707.     }
  708. }
  709.  
  710. void CBasicSearch::OnEditValueChanged ()
  711. {
  712.     m_bChanged = TRUE;
  713. }
  714.  
  715.  
  716. BOOL CBasicSearch::SavePreviousSearch( )
  717. {
  718.     // save the query 
  719.     if (m_bChanged) 
  720.     {
  721.         MSG_Pane * pane = NULL;
  722.         DIR_Server * server = NULL;
  723.  
  724.         ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  725.         ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSEARCHPANE, 0, (LPARAM) &pane);
  726.         MSG_SearchFree (pane);
  727.         MSG_SearchAlloc (pane);
  728.         MSG_AddLdapScope(pane, server);
  729.         BuildQuery(pane, m_bLogicType);
  730.     }
  731.  
  732.     return (TRUE);
  733. }
  734.  
  735.  
  736. BOOL CBasicSearch::OnSetActive() 
  737. {
  738. #ifdef FEATURE_BUTTONPROPERTYPAGE
  739.     if(!CButtonPropertyPage::OnSetActive()) 
  740.         return(FALSE);
  741.  
  742.     m_bChanged = FALSE;
  743. #endif
  744.  
  745.     return(TRUE);
  746. }
  747.  
  748.  
  749. void CBasicSearch::OnOK()
  750. {
  751.     MSG_Pane * pane = NULL;
  752.     DIR_Server * server = NULL;
  753.  
  754.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &server);
  755.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSEARCHPANE, 0, (LPARAM) &pane);
  756.     MSG_SearchFree (pane);
  757.     MSG_SearchAlloc (pane);
  758.     MSG_AddLdapScope(pane, server);
  759.     BuildQuery(pane, m_bLogicType);
  760. }
  761.  
  762. void CBasicSearch::BuildQuery (MSG_Pane* searchPane, BOOL bLogicType)
  763. {
  764.     MSG_SearchAttribute attrib;
  765.     MSG_SearchOperator op;
  766.     MSG_SearchValue value;
  767.     CNSDateEdit *date = NULL;
  768.     CComboBox * combo = NULL;
  769.     int iCurSel = 0;
  770.     CWnd * widget = NULL;
  771.     MSG_SearchMenuItem items[4];
  772.     int maxItems = 4;
  773.  
  774.     DIR_Server * pServer = NULL;
  775.     ::SendMessage (GetParent()->GetSafeHwnd(), LDS_GETSERVER, 0, (LPARAM) &pServer);
  776.  
  777.     MSG_GetBasicLdapSearchAttributes (pServer, items, &maxItems);
  778.  
  779.     for (int i = 0; i <= 3; i++) {
  780.         attrib = (MSG_SearchAttribute) items[i].attrib;
  781.  
  782.         op = (MSG_SearchOperator) opContains;
  783.  
  784.         widget = GetDlgItem(BasicChoicesTable[i][BASIC_COL_VALUE]);
  785.         widget->GetWindowText(szResultText, sizeof(szResultText));
  786.  
  787.         value.attribute = attrib;
  788.         switch (attrib) {
  789.         case attribDate: 
  790.             {
  791.                 CTime ctime;
  792.                 date = (CNSDateEdit *) GetDlgItem(BasicChoicesTable[i][BASIC_COL_VALUE]);
  793.                 date->GetDate(ctime);
  794.                 value.u.date = ctime.GetTime();
  795.             }
  796.             break;
  797.         case attribPriority:
  798.             combo = (CComboBox *) GetDlgItem(BasicChoicesTable[i][BASIC_COL_VALUE]);
  799.             iCurSel = combo->GetCurSel();
  800.             value.u.priority = (MSG_PRIORITY) combo->GetItemData(iCurSel);
  801.             break;
  802.         case attribMsgStatus:
  803.             combo = (CComboBox *) GetDlgItem(BasicChoicesTable[i][BASIC_COL_VALUE]);
  804.             iCurSel = combo->GetCurSel();
  805.             value.u.msgStatus = combo->GetItemData(iCurSel);
  806.             break;
  807.         default:
  808.             if (XP_STRLEN (szResultText))
  809.                 value.u.string = XP_STRDUP (szResultText);
  810.             else
  811.                 value.u.string = NULL;
  812.         }
  813.         if (value.u.string)
  814.         {
  815.             MSG_AddSearchTerm(searchPane, attrib, op, &value, !bLogicType, NULL);
  816.             XP_FREE(value.u.string);
  817.         }
  818.     }
  819.     
  820. }
  821.  
  822.  
  823.