OSDN Git Service

merge original branch.
[tortoisegit/TortoiseGitJp.git] / src / Utils / MiscUI / ProgressDlg.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2006,2008 - TortoiseSVN\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 #include "stdafx.h"\r
20 #include "SysProgressDlg.h"\r
21 \r
22 CSysProgressDlg::CSysProgressDlg() :\r
23                         m_pIDlg(NULL),\r
24                     m_bValid(false),                    //not valid by default\r
25             m_isVisible(false),\r
26                     m_dwDlgFlags(PROGDLG_NORMAL)\r
27 {\r
28         EnsureValid();\r
29 }\r
30 \r
31 CSysProgressDlg::~CSysProgressDlg()\r
32 {\r
33     if (m_bValid)\r
34     {\r
35             if (m_isVisible)                    //still visible, so stop first before destroying\r
36                 m_pIDlg->StopProgressDialog();\r
37 \r
38         m_pIDlg->Release();\r
39     }\r
40 }\r
41 \r
42 bool CSysProgressDlg::EnsureValid()\r
43 {\r
44         if (!m_bValid)\r
45         {\r
46                 HRESULT hr;\r
47 \r
48                 hr = CoCreateInstance (CLSID_ProgressDialog, NULL, CLSCTX_INPROC_SERVER,\r
49                         IID_IProgressDialog, (void**)&m_pIDlg);\r
50 \r
51                 if (SUCCEEDED(hr))\r
52                         m_bValid = true;                                //instance successfully created\r
53         }\r
54         return m_bValid;\r
55 }\r
56 void CSysProgressDlg::SetTitle(LPCTSTR szTitle)\r
57 {\r
58     USES_CONVERSION;\r
59     if (m_bValid)\r
60         {\r
61                 m_pIDlg->SetTitle(T2COLE(szTitle));\r
62         }\r
63 }\r
64 void CSysProgressDlg::SetTitle ( UINT idTitle)\r
65 {\r
66         SetTitle(CString(MAKEINTRESOURCE(idTitle)));\r
67 }\r
68 \r
69 void CSysProgressDlg::SetLine(DWORD dwLine, LPCTSTR szText, bool bCompactPath /* = false */)\r
70 {\r
71         USES_CONVERSION;\r
72         if (m_bValid)\r
73         {\r
74                 m_pIDlg->SetLine(dwLine, T2COLE(szText), bCompactPath, NULL);\r
75         }\r
76 }\r
77 \r
78 #ifdef _MFC_VER\r
79 void CSysProgressDlg::SetCancelMsg ( UINT idMessage )\r
80 {\r
81         SetCancelMsg(CString(MAKEINTRESOURCE(idMessage)));\r
82 }\r
83 #endif // _MFC_VER\r
84 \r
85 void CSysProgressDlg::SetCancelMsg(LPCTSTR szMessage)\r
86 {\r
87     USES_CONVERSION;\r
88         if (m_bValid)\r
89         {\r
90                 m_pIDlg->SetCancelMsg(T2COLE(szMessage), NULL);\r
91         }\r
92 }\r
93 \r
94 void CSysProgressDlg::SetAnimation(HINSTANCE hinst, UINT uRsrcID)\r
95 {\r
96         if (m_bValid)\r
97         {\r
98                 m_pIDlg->SetAnimation(hinst, uRsrcID);\r
99         }\r
100 }\r
101 #ifdef _MFC_VER\r
102 void CSysProgressDlg::SetAnimation(UINT uRsrcID)\r
103 {\r
104         if (m_bValid)\r
105         {\r
106                 m_pIDlg->SetAnimation(AfxGetResourceHandle(), uRsrcID);\r
107         }\r
108 }\r
109 #endif\r
110 void CSysProgressDlg::SetTime(bool bTime /* = true */)\r
111 {\r
112     m_dwDlgFlags &= ~(PROGDLG_NOTIME | PROGDLG_AUTOTIME);\r
113 \r
114     if (bTime)\r
115         m_dwDlgFlags |= PROGDLG_AUTOTIME;\r
116     else\r
117         m_dwDlgFlags |= PROGDLG_NOTIME;\r
118 }\r
119 \r
120 void CSysProgressDlg::SetShowProgressBar(bool bShow /* = true */)\r
121 {\r
122     if (bShow)\r
123         m_dwDlgFlags &= ~PROGDLG_NOPROGRESSBAR;\r
124     else\r
125         m_dwDlgFlags |= PROGDLG_NOPROGRESSBAR;\r
126 }\r
127 #ifdef _MFC_VER\r
128 HRESULT CSysProgressDlg::ShowModal (CWnd* pwndParent)\r
129 {\r
130         EnsureValid();\r
131         return ShowModal(pwndParent->GetSafeHwnd());\r
132 }\r
133 \r
134 HRESULT CSysProgressDlg::ShowModeless(CWnd* pwndParent)\r
135 {\r
136         EnsureValid();\r
137         return ShowModeless(pwndParent->GetSafeHwnd());\r
138 }\r
139 \r
140 void CSysProgressDlg::FormatPathLine ( DWORD dwLine, UINT idFormatText, ...)\r
141 {\r
142         va_list args;\r
143         va_start(args, idFormatText);\r
144 \r
145         CString sText;\r
146         sText.FormatV(CString(MAKEINTRESOURCE(idFormatText)), args);\r
147         SetLine(dwLine, sText, true);\r
148 \r
149         va_end(args);\r
150 }\r
151 \r
152 void CSysProgressDlg::FormatPathLine ( DWORD dwLine, CString FormatText, ...)\r
153 {\r
154         va_list args;\r
155         va_start(args, FormatText);\r
156 \r
157         CString sText;\r
158         sText.FormatV(CString(FormatText), args);\r
159         SetLine(dwLine, sText, true);\r
160 \r
161         va_end(args);\r
162 }\r
163 \r
164 void CSysProgressDlg::FormatNonPathLine(DWORD dwLine, UINT idFormatText, ...)\r
165 {\r
166         va_list args;\r
167         va_start(args, idFormatText);\r
168 \r
169         CString sText;\r
170         sText.FormatV(CString(MAKEINTRESOURCE(idFormatText)), args);\r
171         SetLine(dwLine, sText, false);\r
172 \r
173         va_end(args);\r
174 }\r
175 \r
176 #endif\r
177 HRESULT CSysProgressDlg::ShowModal (HWND hWndParent)\r
178 {\r
179         EnsureValid();\r
180         HRESULT hr;\r
181         if (m_bValid)\r
182         {\r
183 \r
184                 hr = m_pIDlg->StartProgressDialog(hWndParent,\r
185                         NULL,\r
186                         m_dwDlgFlags | PROGDLG_MODAL,\r
187                         NULL);\r
188 \r
189                 if (SUCCEEDED(hr))\r
190                 {\r
191                         m_isVisible = true;\r
192                 }\r
193                 return hr;\r
194         }\r
195         return E_FAIL;\r
196 }\r
197 \r
198 HRESULT CSysProgressDlg::ShowModeless(HWND hWndParent)\r
199 {\r
200         EnsureValid();\r
201         HRESULT hr = E_FAIL;\r
202 \r
203         if (m_bValid)\r
204         {\r
205                 hr = m_pIDlg->StartProgressDialog(hWndParent, NULL, m_dwDlgFlags, NULL);\r
206 \r
207                 if (SUCCEEDED(hr))\r
208                 {\r
209                         m_isVisible = true;\r
210 \r
211                         // The progress window can be remarkably slow to display, particularly\r
212                         // if its parent is blocked.\r
213                         // This process finds the hwnd for the progress window and gives it a kick...\r
214                         IOleWindow *pOleWindow;\r
215                         HRESULT hr=m_pIDlg->QueryInterface(IID_IOleWindow,(LPVOID *)&pOleWindow);\r
216                         if(SUCCEEDED(hr))\r
217                         {\r
218                                 HWND hDlgWnd;\r
219 \r
220                                 hr=pOleWindow->GetWindow(&hDlgWnd);\r
221                                 if(SUCCEEDED(hr))\r
222                                 {\r
223                                         ShowWindow(hDlgWnd, SW_NORMAL);\r
224                                 }\r
225                                 pOleWindow->Release();\r
226                         }\r
227                 }\r
228         }\r
229         return hr;\r
230 }\r
231 \r
232 void CSysProgressDlg::SetProgress(DWORD dwProgress, DWORD dwMax)\r
233 {\r
234         if (m_bValid)\r
235         {\r
236                 m_pIDlg->SetProgress(dwProgress, dwMax);\r
237         }\r
238 }\r
239 \r
240 \r
241 void CSysProgressDlg::SetProgress64(ULONGLONG u64Progress, ULONGLONG u64ProgressMax)\r
242 {\r
243         if (m_bValid)\r
244         {\r
245                 m_pIDlg->SetProgress64(u64Progress, u64ProgressMax);\r
246         }\r
247 }\r
248 \r
249 \r
250 bool CSysProgressDlg::HasUserCancelled()\r
251 {\r
252         if (m_bValid)\r
253         {\r
254                 return (0 != m_pIDlg->HasUserCancelled());\r
255         }\r
256         return FALSE;\r
257 }\r
258 \r
259 void CSysProgressDlg::Stop()\r
260 {\r
261     if ((m_isVisible)&&(m_bValid))\r
262     {\r
263         m_pIDlg->StopProgressDialog();\r
264                 //Sometimes the progress dialog sticks around after stopping it,\r
265                 //until the mouse pointer is moved over it or some other triggers.\r
266                 //This process finds the hwnd of the progress dialog and hides it\r
267                 //immediately.\r
268                 IOleWindow *pOleWindow;\r
269                 HRESULT hr=m_pIDlg->QueryInterface(IID_IOleWindow,(LPVOID *)&pOleWindow);\r
270                 if(SUCCEEDED(hr))\r
271                 {\r
272                         HWND hDlgWnd;\r
273 \r
274                         hr=pOleWindow->GetWindow(&hDlgWnd);\r
275                         if(SUCCEEDED(hr))\r
276                         {\r
277                                 ShowWindow(hDlgWnd, SW_HIDE);\r
278                         }\r
279                         pOleWindow->Release();\r
280                 }\r
281         m_isVisible = false;\r
282                 m_pIDlg->Release();\r
283                 m_bValid = false;\r
284     }\r
285 }\r
286 \r
287 void CSysProgressDlg::ResetTimer()\r
288 {\r
289         if (m_bValid)\r
290         {\r
291                 m_pIDlg->Timer(PDTIMER_RESET, NULL);\r
292         }\r
293 }\r