OSDN Git Service

RebaseDlg: Show Commit Info at tooltip for branch and upstream 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 "ProgressDlg.h"\r
21 \r
22 CProgressDlg::CProgressDlg() :\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 CProgressDlg::~CProgressDlg()\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 CProgressDlg::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 CProgressDlg::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 CProgressDlg::SetTitle ( UINT idTitle)\r
65 {\r
66         SetTitle(CString(MAKEINTRESOURCE(idTitle)));\r
67 }\r
68 \r
69 void CProgressDlg::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 CProgressDlg::SetCancelMsg ( UINT idMessage )\r
80 {\r
81         SetCancelMsg(CString(MAKEINTRESOURCE(idMessage)));\r
82 }\r
83 #endif // _MFC_VER\r
84 \r
85 void CProgressDlg::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 CProgressDlg::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 CProgressDlg::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 CProgressDlg::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 CProgressDlg::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 CProgressDlg::ShowModal (CWnd* pwndParent)\r
129 {\r
130         EnsureValid();\r
131         return ShowModal(pwndParent->GetSafeHwnd());\r
132 }\r
133 \r
134 HRESULT CProgressDlg::ShowModeless(CWnd* pwndParent)\r
135 {\r
136         EnsureValid();\r
137         return ShowModeless(pwndParent->GetSafeHwnd());\r
138 }\r
139 \r
140 void CProgressDlg::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 CProgressDlg::FormatNonPathLine(DWORD dwLine, UINT idFormatText, ...)\r
153 {\r
154         va_list args;\r
155         va_start(args, idFormatText);\r
156 \r
157         CString sText;\r
158         sText.FormatV(CString(MAKEINTRESOURCE(idFormatText)), args);\r
159         SetLine(dwLine, sText, false);\r
160 \r
161         va_end(args);\r
162 }\r
163 \r
164 #endif\r
165 HRESULT CProgressDlg::ShowModal (HWND hWndParent)\r
166 {\r
167         EnsureValid();\r
168         HRESULT hr;\r
169         if (m_bValid)\r
170         {\r
171 \r
172                 hr = m_pIDlg->StartProgressDialog(hWndParent,\r
173                         NULL,\r
174                         m_dwDlgFlags | PROGDLG_MODAL,\r
175                         NULL);\r
176 \r
177                 if (SUCCEEDED(hr))\r
178                 {\r
179                         m_isVisible = true;\r
180                 }\r
181                 return hr;\r
182         }\r
183         return E_FAIL;\r
184 }\r
185 \r
186 HRESULT CProgressDlg::ShowModeless(HWND hWndParent)\r
187 {\r
188         EnsureValid();\r
189         HRESULT hr = E_FAIL;\r
190 \r
191         if (m_bValid)\r
192         {\r
193                 hr = m_pIDlg->StartProgressDialog(hWndParent, NULL, m_dwDlgFlags, NULL);\r
194 \r
195                 if (SUCCEEDED(hr))\r
196                 {\r
197                         m_isVisible = true;\r
198 \r
199                         // The progress window can be remarkably slow to display, particularly\r
200                         // if its parent is blocked.\r
201                         // This process finds the hwnd for the progress window and gives it a kick...\r
202                         IOleWindow *pOleWindow;\r
203                         HRESULT hr=m_pIDlg->QueryInterface(IID_IOleWindow,(LPVOID *)&pOleWindow);\r
204                         if(SUCCEEDED(hr))\r
205                         {\r
206                                 HWND hDlgWnd;\r
207 \r
208                                 hr=pOleWindow->GetWindow(&hDlgWnd);\r
209                                 if(SUCCEEDED(hr))\r
210                                 {\r
211                                         ShowWindow(hDlgWnd, SW_NORMAL);\r
212                                 }\r
213                                 pOleWindow->Release();\r
214                         }\r
215                 }\r
216         }\r
217         return hr;\r
218 }\r
219 \r
220 void CProgressDlg::SetProgress(DWORD dwProgress, DWORD dwMax)\r
221 {\r
222         if (m_bValid)\r
223         {\r
224                 m_pIDlg->SetProgress(dwProgress, dwMax);\r
225         }\r
226 }\r
227 \r
228 \r
229 void CProgressDlg::SetProgress64(ULONGLONG u64Progress, ULONGLONG u64ProgressMax)\r
230 {\r
231         if (m_bValid)\r
232         {\r
233                 m_pIDlg->SetProgress64(u64Progress, u64ProgressMax);\r
234         }\r
235 }\r
236 \r
237 \r
238 bool CProgressDlg::HasUserCancelled()\r
239 {\r
240         if (m_bValid)\r
241         {\r
242                 return (0 != m_pIDlg->HasUserCancelled());\r
243         }\r
244         return FALSE;\r
245 }\r
246 \r
247 void CProgressDlg::Stop()\r
248 {\r
249     if ((m_isVisible)&&(m_bValid))\r
250     {\r
251         m_pIDlg->StopProgressDialog();\r
252                 //Sometimes the progress dialog sticks around after stopping it,\r
253                 //until the mouse pointer is moved over it or some other triggers.\r
254                 //This process finds the hwnd of the progress dialog and hides it\r
255                 //immediately.\r
256                 IOleWindow *pOleWindow;\r
257                 HRESULT hr=m_pIDlg->QueryInterface(IID_IOleWindow,(LPVOID *)&pOleWindow);\r
258                 if(SUCCEEDED(hr))\r
259                 {\r
260                         HWND hDlgWnd;\r
261 \r
262                         hr=pOleWindow->GetWindow(&hDlgWnd);\r
263                         if(SUCCEEDED(hr))\r
264                         {\r
265                                 ShowWindow(hDlgWnd, SW_HIDE);\r
266                         }\r
267                         pOleWindow->Release();\r
268                 }\r
269         m_isVisible = false;\r
270                 m_pIDlg->Release();\r
271                 m_bValid = false;\r
272     }\r
273 }\r
274 \r
275 void CProgressDlg::ResetTimer()\r
276 {\r
277         if (m_bValid)\r
278         {\r
279                 m_pIDlg->Timer(PDTIMER_RESET, NULL);\r
280         }\r
281 }\r