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.

343 lines
14 KiB

  1. #include "precomp.h"
  2. #include "btoolbar.h"
  3. static DWORD bToolbar_InitHelper(HWND hwndList, LPCTSTR pcszCustIns, LPCTSTR pcszAltDir, LPCTSTR pcszWorkDir);
  4. static void bToolbar_SaveHelper(HWND hwndList, LPCTSTR pcszCustIns, LPCTSTR pcszBToolbarDir, DWORD dwMode);
  5. static PBTOOLBAR findBToolbar(HWND hwndList);
  6. static INT_PTR CALLBACK editBToolbarProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
  7. DWORD WINAPI BToolbar_InitA(HWND hwndList, LPCSTR pcszCustIns, LPCSTR pcszAltDir, LPCSTR pcszWorkDir)
  8. {
  9. USES_CONVERSION;
  10. return bToolbar_InitHelper(hwndList, A2CT(pcszCustIns), A2CT(pcszAltDir), A2CT(pcszWorkDir));
  11. }
  12. DWORD WINAPI BToolbar_InitW(HWND hwndList, LPCWSTR pcwszCustIns, LPCWSTR pcwszAltDir, LPCWSTR pcwszWorkDir)
  13. {
  14. USES_CONVERSION;
  15. return bToolbar_InitHelper(hwndList, W2CT(pcwszCustIns), W2CT(pcwszAltDir), W2CT(pcwszWorkDir));
  16. }
  17. void WINAPI BToolbar_Remove(HWND hwndList)
  18. {
  19. PBTOOLBAR pBToolbar;
  20. int i;
  21. i = ListBox_GetCurSel(hwndList);
  22. pBToolbar = (PBTOOLBAR)ListBox_GetItemData(hwndList, (WPARAM)i);
  23. pBToolbar->fDeleted = TRUE;
  24. ListBox_DeleteString(hwndList, (WPARAM)i);
  25. if (ListBox_SetCurSel(hwndList, (WPARAM)i) == LB_ERR) // last item in the list
  26. {
  27. if (ListBox_SetCurSel(hwndList, (WPARAM)(i-1)) == LB_ERR) // no more items left
  28. {
  29. int rgids[] = { IDC_EDITBTOOLBAR, IDC_REMOVEBTOOLBAR };
  30. EnsureDialogFocus(GetParent(hwndList), rgids, countof(rgids), IDC_ADDBTOOLBAR);
  31. DisableDlgItems (GetParent(hwndList), rgids, countof(rgids));
  32. }
  33. }
  34. EnableWindow(GetDlgItem(GetParent(hwndList), IDC_ADDBTOOLBAR), TRUE);
  35. }
  36. void WINAPI BToolbar_Edit(HWND hwndList, BOOL fAdd)
  37. {
  38. PBTOOLBAR pBToolbar;
  39. int i = -1;
  40. if (fAdd)
  41. pBToolbar = findBToolbar(hwndList);
  42. else
  43. {
  44. i = ListBox_GetCurSel(hwndList);
  45. pBToolbar = (PBTOOLBAR)ListBox_GetItemData(hwndList, (WPARAM)i);
  46. }
  47. if (pBToolbar == NULL)
  48. {
  49. if (fAdd) {
  50. // REVIEW: (andrewgu) from the code perspective it looks like this can only happen
  51. // when maximum number of toolbar buttons reached. if this is the case it's high time
  52. // to delete some.
  53. EnsureDialogFocus(GetParent(hwndList), IDC_ADDBTOOLBAR, IDC_REMOVEBTOOLBAR);
  54. DisableDlgItem (GetParent(hwndList), IDC_ADDBTOOLBAR);
  55. }
  56. return;
  57. }
  58. if (DialogBoxParam( g_hInst, MAKEINTRESOURCE(IDD_BTOOLBARPOPUP),
  59. GetParent(hwndList), editBToolbarProc, (LPARAM)pBToolbar ) == IDOK)
  60. {
  61. if (!fAdd)
  62. ListBox_DeleteString(hwndList, (WPARAM)i);
  63. i = ListBox_AddString(hwndList, (LPARAM) pBToolbar->szCaption);
  64. ListBox_SetItemData(hwndList, (WPARAM)i, (LPARAM)pBToolbar);
  65. ListBox_SetCurSel(hwndList, (WPARAM)i);
  66. ListBox_SetTopIndex(hwndList, (WPARAM)i);
  67. EnableWindow(GetDlgItem(GetParent(hwndList), IDC_REMOVEBTOOLBAR), TRUE);
  68. EnableWindow(GetDlgItem(GetParent(hwndList), IDC_EDITBTOOLBAR), TRUE);
  69. }
  70. }
  71. void WINAPI BToolbar_SaveA(HWND hwndList, LPCSTR pcszCustIns, LPCSTR pcszBToolbarDir, DWORD dwMode /*= IEM_NEUTRAL*/)
  72. {
  73. USES_CONVERSION;
  74. bToolbar_SaveHelper(hwndList, A2CT(pcszCustIns), A2CT(pcszBToolbarDir), dwMode);
  75. }
  76. void WINAPI BToolbar_SaveW(HWND hwndList, LPCWSTR pcwszCustIns, LPCWSTR pcwszBToolbarDir, DWORD dwMode /*= IEM_NEUTRAL*/)
  77. {
  78. USES_CONVERSION;
  79. bToolbar_SaveHelper(hwndList, W2CT(pcwszCustIns), W2CT(pcwszBToolbarDir), dwMode);
  80. }
  81. static DWORD bToolbar_InitHelper(HWND hwndList, LPCTSTR pcszCustIns, LPCTSTR pcszAltDir, LPCTSTR pcszWorkDir)
  82. {
  83. PBTOOLBAR pBToolbar;
  84. PBTOOLBAR paBToolbar;
  85. PBTOOLBAR paOldBToolbar;
  86. TCHAR szBToolbarTextParam[32];
  87. TCHAR szBToolbarIcoParam[32];
  88. TCHAR szBToolbarActionParam[32];
  89. TCHAR szBToolbarHotIcoParam[32];
  90. // TCHAR szBToolbarToolTextParam[32];
  91. TCHAR szBToolbarShowParam[32];
  92. int i, j;
  93. ASSERT(((pcszAltDir == NULL) && (pcszWorkDir == NULL)) ||
  94. ((pcszAltDir != NULL) && (pcszWorkDir != NULL)));
  95. ListBox_ResetContent(hwndList);
  96. if ((paBToolbar = (PBTOOLBAR)CoTaskMemAlloc(sizeof(BTOOLBAR) * MAX_BTOOLBARS)) == NULL)
  97. return 0;
  98. ZeroMemory(paBToolbar, sizeof(BTOOLBAR) * MAX_BTOOLBARS);
  99. for (i=0, pBToolbar = paBToolbar; i < MAX_BTOOLBARS; i++, pBToolbar++)
  100. {
  101. wnsprintf(szBToolbarTextParam, ARRAYSIZE(szBToolbarTextParam), TEXT("%s%i"), IK_BTCAPTION, i);
  102. wnsprintf(szBToolbarIcoParam, ARRAYSIZE(szBToolbarIcoParam), TEXT("%s%i"), IK_BTICON, i);
  103. wnsprintf(szBToolbarActionParam, ARRAYSIZE(szBToolbarActionParam), TEXT("%s%i"), IK_BTACTION, i);
  104. wnsprintf(szBToolbarHotIcoParam, ARRAYSIZE(szBToolbarHotIcoParam), TEXT("%s%i"), IK_BTHOTICO, i);
  105. // wnsprintf(szBToolbarToolTextParam, ARRAYSIZE(szBToolbarToolTextParam), TEXT("%s%i"), IK_BTTOOLTIP, i);
  106. wnsprintf(szBToolbarShowParam, ARRAYSIZE(szBToolbarShowParam), TEXT("%s%i"), IK_BTSHOW, i);
  107. if (GetPrivateProfileString(IS_BTOOLBARS, szBToolbarTextParam, TEXT(""),
  108. pBToolbar->szCaption, ARRAYSIZE(pBToolbar->szCaption), pcszCustIns) == 0)
  109. break;
  110. GetPrivateProfileString(IS_BTOOLBARS, szBToolbarIcoParam, TEXT(""), pBToolbar->szIcon, ARRAYSIZE(pBToolbar->szIcon), pcszCustIns);
  111. GetPrivateProfileString(IS_BTOOLBARS, szBToolbarActionParam, TEXT(""), pBToolbar->szAction, ARRAYSIZE(pBToolbar->szAction), pcszCustIns);
  112. GetPrivateProfileString(IS_BTOOLBARS, szBToolbarHotIcoParam, TEXT(""), pBToolbar->szHotIcon, ARRAYSIZE(pBToolbar->szHotIcon), pcszCustIns);
  113. // GetPrivateProfileString(IS_BTOOLBARS, szBToolbarToolTextParam, TEXT(""), pBToolbar->szToolTipText, ARRAYSIZE(pBToolbar->szToolTipText), pcszCustIns);
  114. pBToolbar->fShow = (BOOL)GetPrivateProfileInt(IS_BTOOLBARS, szBToolbarShowParam, 1, pcszCustIns);
  115. if (pcszAltDir != NULL)
  116. {
  117. MoveFileToWorkDir(PathFindFileName(pBToolbar->szIcon), pcszAltDir, pcszWorkDir);
  118. MoveFileToWorkDir(PathFindFileName(pBToolbar->szHotIcon), pcszAltDir, pcszWorkDir);
  119. }
  120. j = ListBox_AddString(hwndList, (LPARAM) pBToolbar->szCaption );
  121. ListBox_SetItemData(hwndList, (WPARAM)j, (LPARAM)pBToolbar);
  122. }
  123. paOldBToolbar = (PBTOOLBAR)SetWindowLongPtr(hwndList, GWLP_USERDATA, (LONG_PTR)paBToolbar);
  124. // delete previous allocation(mainly for profile manager)
  125. if (paOldBToolbar != NULL)
  126. CoTaskMemFree(paOldBToolbar);
  127. return i;
  128. }
  129. static void bToolbar_SaveHelper(HWND hwndList, LPCTSTR pcszCustIns, LPCTSTR pcszBToolbarDir, DWORD dwMode)
  130. {
  131. TCHAR szBToolbarTextParam[32];
  132. TCHAR szBToolbarIcoParam[32];
  133. TCHAR szBToolbarActionParam[32];
  134. TCHAR szBToolbarHotIcoParam[32];
  135. // TCHAR szBToolbarToolTextParam[32];
  136. TCHAR szBToolbarShowParam[32];
  137. TCHAR szTempPath[MAX_PATH];
  138. PBTOOLBAR pBToolbar;
  139. PBTOOLBAR paBToolbar;
  140. GUID guid;
  141. int i, j;
  142. // create a temp path to copy all files to temporarily
  143. GetTempPath(countof(szTempPath), szTempPath);
  144. if (CoCreateGuid(&guid) == NOERROR)
  145. {
  146. TCHAR szGUID[128];
  147. CoStringFromGUID(guid, szGUID, countof(szGUID));
  148. PathAppend(szTempPath, szGUID);
  149. }
  150. else
  151. PathAppend(szTempPath, TEXT("IEAKTOOL"));
  152. PathCreatePath(szTempPath);
  153. WritePrivateProfileString(IS_BTOOLBARS, NULL, NULL, pcszCustIns);
  154. WritePrivateProfileString(NULL, NULL, NULL, pcszCustIns);
  155. paBToolbar = (PBTOOLBAR)GetWindowLongPtr(hwndList, GWLP_USERDATA);
  156. for (i = 0, j = 0, pBToolbar = paBToolbar; (i < MAX_BTOOLBARS) && (pBToolbar != NULL); i++, pBToolbar++ )
  157. {
  158. if (pBToolbar->fDeleted || ISNULL(pBToolbar->szCaption))
  159. continue;
  160. wnsprintf(szBToolbarTextParam, ARRAYSIZE(szBToolbarTextParam), TEXT("%s%i"), IK_BTCAPTION, j);
  161. wnsprintf(szBToolbarIcoParam, ARRAYSIZE(szBToolbarIcoParam), TEXT("%s%i"), IK_BTICON, j);
  162. wnsprintf(szBToolbarActionParam, ARRAYSIZE(szBToolbarActionParam), TEXT("%s%i"), IK_BTACTION, j);
  163. wnsprintf(szBToolbarHotIcoParam, ARRAYSIZE(szBToolbarHotIcoParam), TEXT("%s%i"), IK_BTHOTICO, j);
  164. // wnsprintf(szBToolbarToolTextParam, ARRAYSIZE(szBToolbarToolTextParam), TEXT("%s%i"), IK_BTTOOLTIP, j);
  165. wnsprintf(szBToolbarShowParam, ARRAYSIZE(szBToolbarShowParam), TEXT("%s%i"), IK_BTSHOW, j);
  166. WritePrivateProfileString(IS_BTOOLBARS, szBToolbarTextParam, pBToolbar->szCaption, pcszCustIns);
  167. WritePrivateProfileString(IS_BTOOLBARS, szBToolbarActionParam, pBToolbar->szAction, pcszCustIns);
  168. WritePrivateProfileString(IS_BTOOLBARS, szBToolbarIcoParam, pBToolbar->szIcon, pcszCustIns);
  169. WritePrivateProfileString(IS_BTOOLBARS, szBToolbarHotIcoParam, pBToolbar->szHotIcon, pcszCustIns);
  170. // WritePrivateProfileString(IS_BTOOLBARS, szBToolbarToolTextParam, pBToolbar->szToolTipText, pcszCustIns);
  171. WritePrivateProfileString(IS_BTOOLBARS, szBToolbarShowParam, pBToolbar->fShow ? TEXT("1") : TEXT("0"), pcszCustIns);
  172. if (PathFileExists(pBToolbar->szIcon))
  173. CopyFileToDir(pBToolbar->szIcon, szTempPath);
  174. else
  175. {
  176. TCHAR szFile[MAX_PATH];
  177. PathCombine(szFile, pcszBToolbarDir, PathFindFileName(pBToolbar->szIcon));
  178. CopyFileToDir(szFile, szTempPath);
  179. }
  180. if (PathFileExists(pBToolbar->szHotIcon))
  181. CopyFileToDir(pBToolbar->szHotIcon, szTempPath);
  182. else
  183. {
  184. TCHAR szFile[MAX_PATH];
  185. PathCombine(szFile, pcszBToolbarDir, PathFindFileName(pBToolbar->szHotIcon));
  186. CopyFileToDir(szFile, szTempPath);
  187. }
  188. j++;
  189. }
  190. // do not free for profile manager since we might still be on the page due to file save
  191. if (!HasFlag(dwMode, IEM_PROFMGR) && (paBToolbar != NULL))
  192. {
  193. CoTaskMemFree(paBToolbar);
  194. SetWindowLong(hwndList, GWLP_USERDATA, NULL);
  195. }
  196. PathRemovePath(pcszBToolbarDir);
  197. PathCreatePath(pcszBToolbarDir);
  198. CopyFileToDir(szTempPath, pcszBToolbarDir);
  199. PathRemovePath(szTempPath);
  200. }
  201. static PBTOOLBAR findBToolbar(HWND hwndList)
  202. {
  203. PBTOOLBAR pBToolbar;
  204. int i;
  205. for (pBToolbar = (PBTOOLBAR)GetWindowLongPtr(hwndList, GWLP_USERDATA), i = 0;
  206. (i < MAX_BTOOLBARS) && (pBToolbar != NULL); i++, pBToolbar++)
  207. {
  208. if (pBToolbar->fDeleted || ISNULL(pBToolbar->szCaption))
  209. {
  210. ZeroMemory(pBToolbar, sizeof (BTOOLBAR));
  211. pBToolbar->fShow = TRUE;
  212. return pBToolbar;
  213. }
  214. }
  215. return NULL;
  216. }
  217. static INT_PTR CALLBACK editBToolbarProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  218. {
  219. PBTOOLBAR pBToolbar;
  220. TCHAR szTemp[INTERNET_MAX_URL_LENGTH];
  221. switch (uMsg)
  222. {
  223. case WM_INITDIALOG:
  224. pBToolbar = (PBTOOLBAR)lParam;
  225. SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pBToolbar);
  226. EnableDBCSChars(hDlg, IDE_BTCAPTION);
  227. EnableDBCSChars(hDlg, IDE_BTACTION);
  228. // EnableDBCSChars(hDlg, IDE_BTTOOLTEXT);
  229. EnableDBCSChars(hDlg, IDE_BTICON);
  230. EnableDBCSChars(hDlg, IDE_BTHOTICON);
  231. Edit_LimitText(GetDlgItem(hDlg, IDE_BTCAPTION), MAX_BTOOLBAR_TEXT_LENGTH);
  232. Edit_LimitText(GetDlgItem(hDlg, IDE_BTACTION), _MAX_FNAME);
  233. // Edit_LimitText(GetDlgItem(hDlg, IDE_BTTOOLTEXT), ARRAYSIZE(pBToolbar->szToolTipText)-1);
  234. Edit_LimitText(GetDlgItem(hDlg, IDE_BTICON), _MAX_FNAME);
  235. Edit_LimitText(GetDlgItem(hDlg, IDE_BTHOTICON), _MAX_FNAME);
  236. SetDlgItemText(hDlg, IDE_BTCAPTION, pBToolbar->szCaption);
  237. SetDlgItemText(hDlg, IDE_BTACTION, pBToolbar->szAction);
  238. // SetDlgItemText(hDlg, IDE_BTTOOLTEXT, pBToolbar->szToolTipText);
  239. SetDlgItemText(hDlg, IDE_BTICON, pBToolbar->szIcon);
  240. SetDlgItemText(hDlg, IDE_BTHOTICON, pBToolbar->szHotIcon);
  241. CheckDlgButton(hDlg, IDC_BUTTONSTATE,
  242. pBToolbar->fShow ? BST_CHECKED : BST_UNCHECKED);
  243. break;
  244. case WM_COMMAND:
  245. switch(HIWORD(wParam))
  246. {
  247. case BN_CLICKED:
  248. switch (LOWORD(wParam))
  249. {
  250. case IDC_BROWSEBTICO:
  251. case IDC_BROWSEBTHOTICO:
  252. if (BrowseForFile(hDlg, szTemp, ARRAYSIZE(szTemp), GFN_ICO ))
  253. SetDlgItemText(hDlg,
  254. (LOWORD(wParam) == IDC_BROWSEBTICO) ? IDE_BTICON : IDE_BTHOTICON, szTemp);
  255. break;
  256. case IDC_BROWSEBTACTION:
  257. if (BrowseForFile(hDlg, szTemp, ARRAYSIZE(szTemp), GFN_EXE ))
  258. SetDlgItemText(hDlg, IDE_BTACTION, szTemp);
  259. break;
  260. case IDCANCEL:
  261. EndDialog( hDlg, IDCANCEL );
  262. break;
  263. case IDOK:
  264. if (!CheckField(hDlg, IDE_BTCAPTION, FC_NONNULL) ||
  265. !CheckField(hDlg, IDE_BTACTION, FC_NONNULL) ||
  266. !CheckField(hDlg, IDE_BTHOTICON, FC_NONNULL | FC_FILE | FC_EXISTS) ||
  267. !CheckField(hDlg, IDE_BTICON, FC_NONNULL | FC_FILE | FC_EXISTS))
  268. break;
  269. pBToolbar = (PBTOOLBAR)GetWindowLongPtr(hDlg, DWLP_USER);
  270. GetDlgItemText(hDlg, IDE_BTCAPTION, pBToolbar->szCaption, ARRAYSIZE(pBToolbar->szCaption));
  271. GetDlgItemText(hDlg, IDE_BTACTION, pBToolbar->szAction, ARRAYSIZE(pBToolbar->szAction));
  272. // GetDlgItemText(hDlg, IDE_BTTOOLTEXT, pBToolbar->szToolTipText, ARRAYSIZE(pBToolbar->szToolTipText));
  273. GetDlgItemText(hDlg, IDE_BTICON, pBToolbar->szIcon, ARRAYSIZE(pBToolbar->szIcon));
  274. GetDlgItemText(hDlg, IDE_BTHOTICON, pBToolbar->szHotIcon, ARRAYSIZE(pBToolbar->szHotIcon));
  275. pBToolbar->fShow = (IsDlgButtonChecked(hDlg, IDC_BUTTONSTATE) == BST_CHECKED);
  276. EndDialog( hDlg, IDOK );
  277. break;
  278. }
  279. break;
  280. }
  281. break;
  282. default:
  283. return FALSE;
  284. }
  285. return TRUE;
  286. }