Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

737 lines
19 KiB

  1. #include "stdafx.h"
  2. #include "propPage.h"
  3. #define DASSERT _ASSERTE
  4. #include "errorBase.h"
  5. #define CEDB_FAVORITES_NAME L"WMPlayer.Favorites"
  6. #define CEDB_PROP_ID_URL MAKEWPARAM( CEVT_LPWSTR, 1 )
  7. #define CEDB_PROP_ID_NAME MAKEWPARAM( CEVT_LPWSTR, 2 )
  8. CFavoritesPropertyPage::CFavoritesPropertyPage():
  9. m_hwndList( NULL ),
  10. m_hDb( INVALID_HANDLE_VALUE ),
  11. m_fLeaveDBOpen( FALSE ),
  12. m_hCursorWait( NULL )
  13. {
  14. m_dwTitleID = IDS_CE_PROPPAGE_FAVORITES_TITLE;
  15. m_hCursorWait = LoadCursor( NULL, MAKEINTRESOURCE( IDC_WAIT ) );
  16. }
  17. CFavoritesPropertyPage::~CFavoritesPropertyPage()
  18. {
  19. _ASSERTE( INVALID_HANDLE_VALUE == m_hDb );
  20. }
  21. //
  22. // Message Handlers
  23. //
  24. LRESULT CFavoritesPropertyPage::OnItemChanged(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
  25. {
  26. EnableControls();
  27. return( 0 );
  28. }
  29. LRESULT CFavoritesPropertyPage::OnEndLabelEdit(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
  30. {
  31. NMLVDISPINFO *pnmLV = (NMLVDISPINFO *)pnmh;
  32. if( NULL != pnmLV->item.pszText )
  33. {
  34. LVITEM lvi;
  35. memset( &lvi, 0, sizeof(lvi) );
  36. lvi.mask = LVIF_PARAM;
  37. lvi.iItem = pnmLV->item.iItem;
  38. lvi.lParam = (BOOL)TRUE;
  39. ListView_SetItem( m_hwndList, &lvi );
  40. ListView_SetColumnWidth( m_hwndList, 0, LVSCW_AUTOSIZE );
  41. ListView_SetColumnWidth( m_hwndList, 1, LVSCW_AUTOSIZE );
  42. SetDirty( TRUE );
  43. return( TRUE );
  44. }
  45. return( 0 );
  46. }
  47. LRESULT CFavoritesPropertyPage::OnKeyDown(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
  48. {
  49. LPNMLVKEYDOWN pnmKeyDown = (LPNMLVKEYDOWN)pnmh;
  50. if( NULL != pnmKeyDown )
  51. {
  52. if( VK_DELETE == pnmKeyDown->wVKey &&
  53. ::IsWindowEnabled( GetDlgItem( IDC_CE_PROPPAGE_FAVORITES_DELETE ) ) )
  54. {
  55. PostMessage( WM_COMMAND, MAKEWPARAM( IDC_CE_PROPPAGE_FAVORITES_DELETE, 0 ), 0 );
  56. }
  57. else if ( VK_INSERT == pnmKeyDown->wVKey &&
  58. ::IsWindowEnabled( GetDlgItem( IDC_CE_PROPPAGE_FAVORITES_ADD ) ) )
  59. {
  60. PostMessage( WM_COMMAND, MAKEWPARAM( IDC_CE_PROPPAGE_FAVORITES_ADD, 0 ), 0 );
  61. }
  62. }
  63. return( 0 );
  64. }
  65. LRESULT CFavoritesPropertyPage::OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  66. {
  67. CAddDialog dlg;
  68. HRESULT hr = S_OK;
  69. if( IDOK == dlg.DoModal( m_hWnd ) &&
  70. 0 != wcslen( dlg.m_wszURL ) )
  71. {
  72. hr = AddFavorite( dlg.m_wszURL, dlg.m_wszName, TRUE );
  73. }
  74. EnableControls();
  75. ShowError( hr );
  76. return( 0 );
  77. }
  78. LRESULT CFavoritesPropertyPage::OnDelete(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  79. {
  80. HCURSOR hCurNormal = NULL;
  81. if( NULL != m_hCursorWait)
  82. {
  83. hCurNormal = SetCursor( m_hCursorWait );
  84. }
  85. int iItem = -1;
  86. HRESULT hr = S_OK;
  87. m_fLeaveDBOpen = TRUE;
  88. while( SUCCEEDED( hr ) && -1 != (iItem = ListView_GetNextItem( m_hwndList, -1, LVNI_SELECTED ) ) )
  89. {
  90. hr = ManageFavorites( iItem, TRUE );
  91. UpdateWindow();
  92. }
  93. m_fLeaveDBOpen = FALSE;
  94. if( INVALID_HANDLE_VALUE != m_hDb )
  95. {
  96. CeCloseHandle( m_hDb );
  97. m_hDb = INVALID_HANDLE_VALUE;
  98. }
  99. //
  100. // Since the user could have deleted their radio presets, allow them to do it again
  101. //
  102. EnableControls();
  103. if( NULL != hCurNormal )
  104. {
  105. SetCursor( hCurNormal );
  106. }
  107. ShowError( hr );
  108. return( 0 );
  109. }
  110. //
  111. // IPropertyPage
  112. //
  113. STDMETHODIMP CFavoritesPropertyPage::Activate (HWND hWndParent, LPCRECT pRect, BOOL bModal)
  114. {
  115. HRESULT hr = S_OK;
  116. hr = IPropertyPageImpl<CFavoritesPropertyPage>::Activate( hWndParent, pRect, bModal );
  117. if( SUCCEEDED( hr ) )
  118. {
  119. hr = InitList();
  120. }
  121. if( SUCCEEDED( hr ) )
  122. {
  123. hr = EnableControls();
  124. }
  125. ShowError( hr );
  126. return( hr );
  127. }
  128. STDMETHODIMP CFavoritesPropertyPage::Apply()
  129. {
  130. HCURSOR hCurNormal = NULL;
  131. if( NULL != m_hCursorWait)
  132. {
  133. hCurNormal = SetCursor( m_hCursorWait );
  134. }
  135. int iItems = ListView_GetItemCount( m_hwndList );
  136. HRESULT hr = S_OK;
  137. if( !m_bDirty )
  138. {
  139. return( S_OK );
  140. }
  141. m_fLeaveDBOpen = TRUE;
  142. if( -1 != iItems )
  143. {
  144. while( SUCCEEDED( hr ) && iItems-- )
  145. {
  146. hr = ManageFavorites( iItems, FALSE );
  147. }
  148. }
  149. m_fLeaveDBOpen = FALSE;
  150. if( INVALID_HANDLE_VALUE != m_hDb )
  151. {
  152. CeCloseHandle( m_hDb );
  153. m_hDb = INVALID_HANDLE_VALUE;
  154. }
  155. SetDirty( FAILED( hr ) );
  156. if( NULL != hCurNormal )
  157. {
  158. SetCursor( hCurNormal );
  159. }
  160. ShowError( hr );
  161. return( hr );
  162. }
  163. HRESULT CFavoritesPropertyPage::InitList()
  164. {
  165. HRESULT hr = S_OK;
  166. CEOID dbOID;
  167. HANDLE hDb = INVALID_HANDLE_VALUE;
  168. HRESULT hrFailCreate = S_OK;
  169. BOOL fNoItems = TRUE;
  170. HCURSOR hCurNormal = NULL;
  171. if( NULL != m_hCursorWait)
  172. {
  173. hCurNormal = SetCursor( m_hCursorWait );
  174. }
  175. m_hwndList = GetDlgItem( IDC_CE_PROPPAGE_FAVORITES_FAVORITES );
  176. if( NULL == m_hwndList )
  177. {
  178. hr = HRESULT_FROM_WIN32( GetLastError() );
  179. }
  180. if( SUCCEEDED( hr ) )
  181. {
  182. LVCOLUMN lvc;
  183. WCHAR wszColumn[MAX_PATH];
  184. ListView_SetExtendedListViewStyle( m_hwndList, LVS_EX_FULLROWSELECT );
  185. lvc.mask = LVCF_TEXT;
  186. lvc.pszText = wszColumn;
  187. LoadString( _Module.GetResourceInstance(), IDS_NAME, wszColumn, sizeof(wszColumn)/sizeof(wszColumn[0]) );
  188. ListView_InsertColumn( m_hwndList, 0, &lvc );
  189. LoadString( _Module.GetResourceInstance(), IDS_CE_PROPPAGE_FAVORITES_URL, wszColumn, sizeof(wszColumn)/sizeof(wszColumn[0]) );
  190. ListView_InsertColumn( m_hwndList, 1, &lvc );
  191. }
  192. //
  193. //
  194. //
  195. //
  196. //
  197. if( SUCCEEDED( hr ) )
  198. {
  199. dbOID = CeCreateDatabase( CEDB_FAVORITES_NAME, 0, 0, NULL );
  200. if( 0 == dbOID )
  201. {
  202. hrFailCreate = HRESULT_FROM_WIN32( CeGetLastError() );
  203. if( SUCCEEDED( hrFailCreate ) )
  204. {
  205. hrFailCreate = HRESULT_FROM_WIN32( CeRapiGetError() );
  206. }
  207. }
  208. if( FAILED( hrFailCreate ) )
  209. {
  210. dbOID = 0;
  211. }
  212. hDb = CeOpenDatabase( &dbOID, CEDB_FAVORITES_NAME, 0, CEDB_AUTOINCREMENT, NULL );
  213. if( INVALID_HANDLE_VALUE == hDb )
  214. {
  215. if( FAILED( hrFailCreate ) )
  216. {
  217. hr = hrFailCreate;
  218. }
  219. else
  220. {
  221. hr = HRESULT_FROM_WIN32( CeGetLastError() );
  222. if( SUCCEEDED( hr ) )
  223. {
  224. hr = HRESULT_FROM_WIN32( CeRapiGetError() );
  225. }
  226. }
  227. }
  228. }
  229. if( SUCCEEDED( hr ) )
  230. {
  231. CEPROPVAL *pProps = NULL;
  232. WORD cProps = 0;
  233. LPBYTE lpBuffer = NULL;
  234. LPWSTR pszURL = NULL;
  235. LPWSTR pszName = NULL;
  236. DWORD dwSize = 0;
  237. while( 0 != (dbOID = CeReadRecordProps( hDb, CEDB_ALLOWREALLOC, &cProps, NULL, &lpBuffer, &dwSize ) ) )
  238. {
  239. pszURL = NULL;
  240. pszName = NULL;
  241. _ASSERTE( NULL != lpBuffer );
  242. if( NULL == lpBuffer )
  243. {
  244. continue;
  245. }
  246. while( cProps-- )
  247. {
  248. pProps = &(( CEPROPVAL *)lpBuffer)[cProps];
  249. if( pProps->propid == CEDB_PROP_ID_NAME )
  250. {
  251. pszName = pProps->val.lpwstr;
  252. }
  253. if( pProps->propid == CEDB_PROP_ID_URL )
  254. {
  255. pszURL = pProps->val.lpwstr;
  256. }
  257. }
  258. if( NULL != pszName && NULL != pszURL )
  259. {
  260. if( SUCCEEDED( AddFavorite( pszURL, pszName, FALSE ) ) )
  261. {
  262. fNoItems = FALSE;
  263. }
  264. }
  265. LocalFree( lpBuffer );
  266. cProps = 0;
  267. lpBuffer = NULL;
  268. dwSize = 0;
  269. }
  270. }
  271. if( SUCCEEDED( hr ) )
  272. {
  273. if( fNoItems )
  274. {
  275. ListView_SetColumnWidth( m_hwndList, 0, LVSCW_AUTOSIZE_USEHEADER );
  276. ListView_SetColumnWidth( m_hwndList, 1, LVSCW_AUTOSIZE_USEHEADER );
  277. }
  278. else
  279. {
  280. ListView_SetColumnWidth( m_hwndList, 0, LVSCW_AUTOSIZE );
  281. ListView_SetColumnWidth( m_hwndList, 1, LVSCW_AUTOSIZE );
  282. }
  283. }
  284. if( INVALID_HANDLE_VALUE != hDb )
  285. {
  286. CeCloseHandle( hDb );
  287. }
  288. if( NULL != hCurNormal )
  289. {
  290. SetCursor( hCurNormal );
  291. }
  292. return( hr );
  293. }
  294. HRESULT CFavoritesPropertyPage::EnableControls()
  295. {
  296. int iSelectedItem = 0;
  297. long cItems = 0;
  298. iSelectedItem = ListView_GetNextItem( m_hwndList, -1, LVNI_SELECTED );
  299. ::EnableWindow( GetDlgItem( IDC_CE_PROPPAGE_FAVORITES_DELETE ), -1 != iSelectedItem );
  300. ::ShowWindow( GetDlgItem( IDC_CE_PROPPAGE_FAVORITES_EXPORT ), SW_HIDE );
  301. return( S_OK );
  302. }
  303. void CFavoritesPropertyPage::ShowError(HRESULT hrError)
  304. {
  305. if( FAILED( hrError ) )
  306. {
  307. LPTSTR pszBuffer = NULL;
  308. if( 0 != FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |
  309. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  310. FORMAT_MESSAGE_IGNORE_INSERTS,
  311. NULL,
  312. hrError,
  313. 0,
  314. (LPTSTR)&pszBuffer,
  315. 0,
  316. NULL ) )
  317. {
  318. MessageBox( pszBuffer, NULL, MB_OK );
  319. }
  320. if( NULL != pszBuffer )
  321. {
  322. LocalFree( pszBuffer );
  323. }
  324. }
  325. }
  326. HRESULT CFavoritesPropertyPage::ManageFavorites( int iItem, BOOL fRemove)
  327. {
  328. HRESULT hr = S_OK;
  329. WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
  330. WCHAR wszName[MAX_PATH];
  331. LVITEM lvi;
  332. wszURL[0] = L'\0';
  333. wszName[0] = L'\0';
  334. memset( &lvi, 0, sizeof(lvi) );
  335. lvi.iItem = iItem;
  336. lvi.mask = LVIF_PARAM;
  337. ListView_GetItem( m_hwndList, &lvi);
  338. if( 0 != lvi.lParam || fRemove )
  339. {
  340. ListView_GetItemText( m_hwndList, iItem, 0, wszName, sizeof(wszName)/sizeof(wszName[0]) );
  341. ListView_GetItemText( m_hwndList, iItem, 1, wszURL, sizeof(wszURL)/sizeof(wszURL[0]) );
  342. if( 0 == wcslen( wszURL ) )
  343. {
  344. hr = E_INVALIDARG;
  345. }
  346. if( SUCCEEDED( hr ) )
  347. {
  348. hr = ManageFavorites( wszURL, wszName, fRemove );
  349. }
  350. if( SUCCEEDED( hr ) )
  351. {
  352. if( fRemove )
  353. {
  354. ListView_DeleteItem( m_hwndList, iItem );
  355. }
  356. else
  357. {
  358. lvi.lParam = 0;
  359. ListView_SetItem( m_hwndList, &lvi );
  360. }
  361. }
  362. }
  363. return( hr );
  364. }
  365. HRESULT CFavoritesPropertyPage::ManageFavorites( LPWSTR pszURL, LPWSTR pszName, BOOL fRemove )
  366. {
  367. CEOID dbOID;
  368. HANDLE hDb = INVALID_HANDLE_VALUE;
  369. HRESULT hrFailCreate = S_OK;
  370. BOOL fFound = FALSE;
  371. BOOL fRename = FALSE;
  372. HRESULT hr = S_OK;
  373. if( INVALID_HANDLE_VALUE != m_hDb )
  374. {
  375. hDb = m_hDb;
  376. }
  377. else
  378. {
  379. if( SUCCEEDED( hr ) )
  380. {
  381. dbOID = CeCreateDatabase( CEDB_FAVORITES_NAME, 0, 0, NULL );
  382. if( 0 == dbOID )
  383. {
  384. hrFailCreate = HRESULT_FROM_WIN32( CeGetLastError() );
  385. if( SUCCEEDED( hrFailCreate ) )
  386. {
  387. hrFailCreate = HRESULT_FROM_WIN32( CeRapiGetError() );
  388. }
  389. }
  390. if( FAILED( hrFailCreate ) )
  391. {
  392. dbOID = 0;
  393. }
  394. hDb = CeOpenDatabase( &dbOID, CEDB_FAVORITES_NAME, 0, CEDB_AUTOINCREMENT, NULL );
  395. if( INVALID_HANDLE_VALUE == hDb )
  396. {
  397. if( FAILED( hrFailCreate ) )
  398. {
  399. hr = hrFailCreate;
  400. }
  401. else
  402. {
  403. hr = HRESULT_FROM_WIN32( CeGetLastError() );
  404. if( SUCCEEDED( hr ) )
  405. {
  406. hr = HRESULT_FROM_WIN32( CeRapiGetError() );
  407. }
  408. }
  409. }
  410. }
  411. }
  412. if( SUCCEEDED( hr ) )
  413. {
  414. CEPROPVAL *pProps = NULL;
  415. CEPROPVAL props[2];
  416. WORD cProps = 0;
  417. LPBYTE lpBuffer = NULL;
  418. DWORD dwSize = 0;
  419. memset( &props, 0, sizeof(props) );
  420. props[0].propid = CEDB_PROP_ID_URL;
  421. props[0].val.lpwstr = pszURL;
  422. props[1].propid = CEDB_PROP_ID_NAME;
  423. props[1].val.lpwstr = pszName;
  424. while( 0 != (dbOID = CeReadRecordProps( hDb, CEDB_ALLOWREALLOC, &cProps, NULL, &lpBuffer, &dwSize) ) )
  425. {
  426. _ASSERTE( NULL != lpBuffer );
  427. if( NULL == lpBuffer )
  428. {
  429. continue;
  430. }
  431. while( cProps-- )
  432. {
  433. pProps = &(( CEPROPVAL *)lpBuffer)[cProps];
  434. if( pProps->propid == CEDB_PROP_ID_NAME &&
  435. 0 != wcsicmp( pProps->val.lpwstr, pszName ) )
  436. {
  437. fRename = TRUE;
  438. }
  439. if( pProps->propid == CEDB_PROP_ID_URL &&
  440. 0 == wcsicmp( pProps->val.lpwstr, pszURL ) )
  441. {
  442. fFound = TRUE;
  443. break;
  444. }
  445. }
  446. LocalFree( lpBuffer );
  447. cProps = 0;
  448. lpBuffer = NULL;
  449. dwSize = 0;
  450. if( fFound )
  451. {
  452. break;
  453. }
  454. else
  455. {
  456. fRename = FALSE;
  457. }
  458. }
  459. if( fRemove )
  460. {
  461. if( fFound )
  462. {
  463. if( !CeDeleteRecord( hDb, dbOID ) )
  464. {
  465. hr = HRESULT_FROM_WIN32( CeGetLastError() );
  466. if( SUCCEEDED( hr ) )
  467. {
  468. hr = HRESULT_FROM_WIN32( CeRapiGetError() );
  469. }
  470. }
  471. }
  472. }
  473. else
  474. {
  475. if( ( !fFound || fRename ) && 0 == CeWriteRecordProps( hDb, fRename ? dbOID : 0, sizeof(props)/sizeof(props[0]), props ) )
  476. {
  477. hr = HRESULT_FROM_WIN32( CeGetLastError() );
  478. if( SUCCEEDED( hr ) )
  479. {
  480. hr = HRESULT_FROM_WIN32( CeRapiGetError() );
  481. }
  482. }
  483. }
  484. }
  485. if( INVALID_HANDLE_VALUE != hDb )
  486. {
  487. if( m_fLeaveDBOpen )
  488. {
  489. m_hDb = hDb;
  490. }
  491. else
  492. {
  493. CeCloseHandle( hDb );
  494. }
  495. }
  496. return( hr );
  497. }
  498. HRESULT CFavoritesPropertyPage::AddFavorite( LPWSTR pszURL, LPWSTR pszName, BOOL fDirty )
  499. {
  500. HRESULT hr = S_OK;
  501. bool fAddedItem = false;
  502. LVITEM lvi;
  503. int iItem = -1;
  504. int cItems = ListView_GetItemCount( m_hwndList );
  505. WCHAR wszURL[INTERNET_MAX_URL_LENGTH];
  506. WCHAR wszName[MAX_PATH];
  507. bool fFound = false;
  508. if( NULL == pszURL || NULL == pszName )
  509. {
  510. hr = E_INVALIDARG;
  511. }
  512. if( SUCCEEDED( hr ) )
  513. {
  514. //
  515. // Try to find the item first
  516. //
  517. while( cItems-- )
  518. {
  519. ListView_GetItemText( m_hwndList, cItems, 1, wszURL, sizeof(wszURL)/sizeof(wszURL[0]) );
  520. if( 0 == wcsicmp( pszURL, wszURL ) )
  521. {
  522. iItem = cItems;
  523. fFound = true;
  524. break;
  525. }
  526. }
  527. //
  528. // If we didn't find it, then insert one
  529. //
  530. memset( &lvi, 0, sizeof(lvi) );
  531. if( -1 == iItem )
  532. {
  533. lvi.iItem = ListView_GetItemCount( m_hwndList );
  534. iItem = ListView_InsertItem( m_hwndList, &lvi );
  535. }
  536. else
  537. {
  538. lvi.iItem = iItem;
  539. }
  540. if( -1 != iItem )
  541. {
  542. ListView_SetItemText( m_hwndList, iItem, 0, pszName );
  543. ListView_SetItemText( m_hwndList, iItem, 1, pszURL );
  544. lvi.mask = LVIF_PARAM;
  545. if( fFound )
  546. {
  547. ListView_GetItem( m_hwndList, &lvi );
  548. fDirty = lvi.lParam;
  549. if( !fDirty )
  550. {
  551. ListView_GetItemText( m_hwndList, iItem, 0, wszName, sizeof(wszName)/sizeof(wszName[0]) );
  552. fDirty = wcsicmp( pszName, wszName );
  553. }
  554. }
  555. lvi.lParam = (LPARAM)fDirty;
  556. ListView_SetItem( m_hwndList, &lvi );
  557. ListView_EnsureVisible( m_hwndList, iItem, FALSE );
  558. ListView_SetColumnWidth( m_hwndList, 0, LVSCW_AUTOSIZE );
  559. ListView_SetColumnWidth( m_hwndList, 1, LVSCW_AUTOSIZE );
  560. }
  561. else
  562. {
  563. hr = E_OUTOFMEMORY;
  564. }
  565. }
  566. if( SUCCEEDED( hr ) )
  567. {
  568. SetDirty( fDirty );
  569. }
  570. return( hr );
  571. }
  572. ///////////////////////////////////////////////////////////////////////////////////////
  573. //
  574. //
  575. //
  576. CAddDialog::CAddDialog()
  577. {
  578. m_wszURL[0] = L'\0';
  579. m_wszName[0] = L'\0';
  580. }
  581. LRESULT CAddDialog::OnURLChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  582. {
  583. EnableControls();
  584. return( 0 );
  585. }
  586. LRESULT CAddDialog::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  587. {
  588. SendDlgItemMessage( IDC_CE_PROPPAGE_FAVORITES_URL, WM_GETTEXT, sizeof(m_wszURL)/sizeof(m_wszURL[0]), (LPARAM)m_wszURL );
  589. SendDlgItemMessage( IDC_CE_PROPPAGE_FAVORITES_NAME, WM_GETTEXT, sizeof(m_wszName)/sizeof(m_wszName[0]), (LPARAM)m_wszName );
  590. EndDialog( IDOK );
  591. return( 0 );
  592. }
  593. LRESULT CAddDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  594. {
  595. EndDialog( IDCANCEL );
  596. return( 0 );
  597. }
  598. LRESULT CAddDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  599. {
  600. SendDlgItemMessage( IDC_CE_PROPPAGE_FAVORITES_URL, EM_LIMITTEXT, sizeof(m_wszURL)/sizeof(m_wszURL[0]), 0 );
  601. SendDlgItemMessage( IDC_CE_PROPPAGE_FAVORITES_NAME, EM_LIMITTEXT, sizeof(m_wszName)/sizeof(m_wszName[0]), 0 );
  602. EnableControls();
  603. return( 0 );
  604. }
  605. void CAddDialog::EnableControls()
  606. {
  607. ::EnableWindow( GetDlgItem(IDOK), SendDlgItemMessage( IDC_CE_PROPPAGE_FAVORITES_URL, WM_GETTEXTLENGTH, 0, 0 ) != 0 );
  608. }