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.

308 lines
7.4 KiB

  1. //
  2. // utbdlgs.cpp
  3. //
  4. #include "private.h"
  5. #include "globals.h"
  6. #include "resource.h"
  7. #include "tipbar.h"
  8. #include "utbdlgs.h"
  9. #include "cregkey.h"
  10. #include "regstr.h"
  11. extern HINSTANCE g_hInst;
  12. const TCHAR c_szCTFMon[] = TEXT("CTFMON.EXE");
  13. BOOL CUTBCloseLangBarDlg::_fIsDlgShown = FALSE;
  14. BOOL CUTBMinimizeLangBarDlg::_fIsDlgShown = FALSE;
  15. //+---------------------------------------------------------------------------
  16. //
  17. // DoCloseLangbar
  18. //
  19. //----------------------------------------------------------------------------
  20. void DoCloseLangbar()
  21. {
  22. CMyRegKey key;
  23. ITfLangBarMgr *putb = NULL;
  24. HRESULT hr = TF_CreateLangBarMgr(&putb);
  25. if (SUCCEEDED(hr) && putb)
  26. {
  27. hr = putb->ShowFloating(TF_SFT_HIDDEN);
  28. SafeReleaseClear(putb);
  29. }
  30. if (SUCCEEDED(hr))
  31. TurnOffSpeechIfItsOn();
  32. if (key.Open(HKEY_CURRENT_USER, REGSTR_PATH_RUN, KEY_ALL_ACCESS) == S_OK)
  33. {
  34. key.DeleteValue(c_szCTFMon);
  35. }
  36. }
  37. //////////////////////////////////////////////////////////////////////////////
  38. //
  39. // CUTBLangBarDlg
  40. //
  41. //////////////////////////////////////////////////////////////////////////////
  42. //+---------------------------------------------------------------------------
  43. //
  44. // DlgProc
  45. //
  46. //----------------------------------------------------------------------------
  47. INT_PTR CALLBACK CUTBLangBarDlg::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  48. {
  49. switch (uMsg)
  50. {
  51. case WM_INITDIALOG:
  52. SetThis(hDlg, lParam);
  53. //
  54. // System could get cmdshow from USERSTARTUPDATA and it is
  55. // minimized. So we need to restore the window.
  56. //
  57. ShowWindow(hDlg, SW_RESTORE);
  58. UpdateWindow(hDlg);
  59. break;
  60. case WM_COMMAND:
  61. GetThis(hDlg)->OnCommand(hDlg, wParam, lParam);
  62. break;
  63. default:
  64. return FALSE;
  65. }
  66. return TRUE;
  67. }
  68. //+---------------------------------------------------------------------------
  69. //
  70. // StartThread
  71. //
  72. //----------------------------------------------------------------------------
  73. BOOL CUTBLangBarDlg::StartThread()
  74. {
  75. HANDLE hThread;
  76. DWORD dwThreadId;
  77. if (IsDlgShown())
  78. return FALSE;
  79. SetDlgShown(TRUE);
  80. hThread = CreateThread(NULL, 0, s_ThreadProc, this, 0, &dwThreadId);
  81. if (hThread)
  82. {
  83. _AddRef();
  84. CloseHandle(hThread);
  85. }
  86. else
  87. SetDlgShown(FALSE);
  88. return TRUE;
  89. }
  90. //+---------------------------------------------------------------------------
  91. //
  92. // s_ThreadProc
  93. //
  94. //----------------------------------------------------------------------------
  95. DWORD CUTBLangBarDlg::s_ThreadProc(void *pv)
  96. {
  97. CUTBLangBarDlg *_this = (CUTBLangBarDlg *)pv;
  98. return _this->ThreadProc();
  99. }
  100. //+---------------------------------------------------------------------------
  101. //
  102. // ThreadProc
  103. //
  104. //----------------------------------------------------------------------------
  105. DWORD CUTBLangBarDlg::ThreadProc()
  106. {
  107. Assert(_pszDlgStr);
  108. MuiDialogBoxParam(g_hInst,
  109. _pszDlgStr,
  110. NULL,
  111. DlgProc,
  112. (LPARAM)this);
  113. SetDlgShown(FALSE);
  114. _Release();
  115. return TRUE;
  116. }
  117. //////////////////////////////////////////////////////////////////////////////
  118. //
  119. // CUTBCloseLangBarDlg
  120. //
  121. //////////////////////////////////////////////////////////////////////////////
  122. //+---------------------------------------------------------------------------
  123. //
  124. // DoModal
  125. //
  126. //----------------------------------------------------------------------------
  127. int CUTBCloseLangBarDlg::DoModal(HWND hWnd)
  128. {
  129. CMyRegKey key;
  130. BOOL bShow = TRUE;
  131. if (key.Open(HKEY_CURRENT_USER, c_szUTBKey, KEY_READ) == S_OK)
  132. {
  133. DWORD dwValue;
  134. if (key.QueryValue(dwValue, c_szDontShowCloseLangBarDlg) == S_OK)
  135. bShow = dwValue ? FALSE : TRUE;
  136. }
  137. if (!bShow)
  138. return 0;
  139. StartThread();
  140. return 1;
  141. }
  142. //+---------------------------------------------------------------------------
  143. //
  144. // OnCommand
  145. //
  146. //----------------------------------------------------------------------------
  147. BOOL CUTBCloseLangBarDlg::OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
  148. {
  149. switch (LOWORD(wParam))
  150. {
  151. case IDOK:
  152. {
  153. DoCloseLangbar();
  154. if (IsDlgButtonChecked(hDlg, IDC_DONTSHOWAGAIN))
  155. {
  156. CMyRegKey key;
  157. if (key.Create(HKEY_CURRENT_USER, c_szUTBKey) == S_OK)
  158. key.SetValue(1, c_szDontShowCloseLangBarDlg);
  159. }
  160. EndDialog(hDlg, 1);
  161. break;
  162. }
  163. case IDCANCEL:
  164. EndDialog(hDlg, 0);
  165. break;
  166. default:
  167. return FALSE;
  168. }
  169. return TRUE;
  170. }
  171. //////////////////////////////////////////////////////////////////////////////
  172. //
  173. // CUTBMinimizeLangBarDlg
  174. //
  175. //////////////////////////////////////////////////////////////////////////////
  176. //+---------------------------------------------------------------------------
  177. //
  178. // DoModal
  179. //
  180. //----------------------------------------------------------------------------
  181. int CUTBMinimizeLangBarDlg::DoModal(HWND hWnd)
  182. {
  183. CMyRegKey key;
  184. BOOL bShow = FALSE; // #478364: default is FALSE from now.
  185. if (key.Open(HKEY_CURRENT_USER, c_szUTBKey, KEY_READ) == S_OK)
  186. {
  187. DWORD dwValue;
  188. if (key.QueryValue(dwValue, c_szDontShowMinimizeLangBarDlg) == S_OK)
  189. bShow = dwValue ? FALSE : TRUE;
  190. }
  191. if (!bShow)
  192. return 0;
  193. StartThread();
  194. return 1;
  195. }
  196. //+---------------------------------------------------------------------------
  197. //
  198. // OnCommand
  199. //
  200. //----------------------------------------------------------------------------
  201. BOOL CUTBMinimizeLangBarDlg::OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
  202. {
  203. switch (LOWORD(wParam))
  204. {
  205. case IDOK:
  206. if (IsDlgButtonChecked(hDlg, IDC_DONTSHOWAGAIN))
  207. {
  208. CMyRegKey key;
  209. if (key.Create(HKEY_CURRENT_USER, c_szUTBKey) == S_OK)
  210. key.SetValue(1, c_szDontShowMinimizeLangBarDlg);
  211. }
  212. EndDialog(hDlg, 1);
  213. break;
  214. case IDCANCEL:
  215. EndDialog(hDlg, 0);
  216. break;
  217. default:
  218. return FALSE;
  219. }
  220. return TRUE;
  221. }
  222. //+---------------------------------------------------------------------------
  223. //
  224. // ThreadProc
  225. //
  226. //----------------------------------------------------------------------------
  227. DWORD CUTBMinimizeLangBarDlg::ThreadProc()
  228. {
  229. //
  230. // for JP MSIME2002.
  231. //
  232. // Japanese MSIME2002 always add and remove item at every focus change.
  233. // if we show the minimized dialog box immediately, the deskband
  234. // size won't include the items of MSIME2002.
  235. // Wait 700ms so the dialog box is shown after MSIME2002 add its item
  236. // and the langband can calc the size with them.
  237. //
  238. // And we think showing this dialog box is not good UI. Like a normal
  239. // window, we should show animation to let the end user know
  240. // where the minimzed is gone to.
  241. //
  242. Sleep(700);
  243. return CUTBLangBarDlg::ThreadProc();
  244. }