1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2006,2008 - TortoiseSVN
\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
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
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
20 #include "SysProgressDlg.h"
\r
22 CSysProgressDlg::CSysProgressDlg() :
\r
24 m_bValid(false), //not valid by default
\r
26 m_dwDlgFlags(PROGDLG_NORMAL)
\r
31 CSysProgressDlg::~CSysProgressDlg()
\r
35 if (m_isVisible) //still visible, so stop first before destroying
\r
36 m_pIDlg->StopProgressDialog();
\r
42 bool CSysProgressDlg::EnsureValid()
\r
48 hr = CoCreateInstance (CLSID_ProgressDialog, NULL, CLSCTX_INPROC_SERVER,
\r
49 IID_IProgressDialog, (void**)&m_pIDlg);
\r
52 m_bValid = true; //instance successfully created
\r
56 void CSysProgressDlg::SetTitle(LPCTSTR szTitle)
\r
61 m_pIDlg->SetTitle(T2COLE(szTitle));
\r
64 void CSysProgressDlg::SetTitle ( UINT idTitle)
\r
66 SetTitle(CString(MAKEINTRESOURCE(idTitle)));
\r
69 void CSysProgressDlg::SetLine(DWORD dwLine, LPCTSTR szText, bool bCompactPath /* = false */)
\r
74 m_pIDlg->SetLine(dwLine, T2COLE(szText), bCompactPath, NULL);
\r
79 void CSysProgressDlg::SetCancelMsg ( UINT idMessage )
\r
81 SetCancelMsg(CString(MAKEINTRESOURCE(idMessage)));
\r
85 void CSysProgressDlg::SetCancelMsg(LPCTSTR szMessage)
\r
90 m_pIDlg->SetCancelMsg(T2COLE(szMessage), NULL);
\r
94 void CSysProgressDlg::SetAnimation(HINSTANCE hinst, UINT uRsrcID)
\r
98 m_pIDlg->SetAnimation(hinst, uRsrcID);
\r
102 void CSysProgressDlg::SetAnimation(UINT uRsrcID)
\r
106 m_pIDlg->SetAnimation(AfxGetResourceHandle(), uRsrcID);
\r
110 void CSysProgressDlg::SetTime(bool bTime /* = true */)
\r
112 m_dwDlgFlags &= ~(PROGDLG_NOTIME | PROGDLG_AUTOTIME);
\r
115 m_dwDlgFlags |= PROGDLG_AUTOTIME;
\r
117 m_dwDlgFlags |= PROGDLG_NOTIME;
\r
120 void CSysProgressDlg::SetShowProgressBar(bool bShow /* = true */)
\r
123 m_dwDlgFlags &= ~PROGDLG_NOPROGRESSBAR;
\r
125 m_dwDlgFlags |= PROGDLG_NOPROGRESSBAR;
\r
128 HRESULT CSysProgressDlg::ShowModal (CWnd* pwndParent)
\r
131 return ShowModal(pwndParent->GetSafeHwnd());
\r
134 HRESULT CSysProgressDlg::ShowModeless(CWnd* pwndParent)
\r
137 return ShowModeless(pwndParent->GetSafeHwnd());
\r
140 void CSysProgressDlg::FormatPathLine ( DWORD dwLine, UINT idFormatText, ...)
\r
143 va_start(args, idFormatText);
\r
146 sText.FormatV(CString(MAKEINTRESOURCE(idFormatText)), args);
\r
147 SetLine(dwLine, sText, true);
\r
152 void CSysProgressDlg::FormatPathLine ( DWORD dwLine, CString FormatText, ...)
\r
155 va_start(args, FormatText);
\r
158 sText.FormatV(CString(FormatText), args);
\r
159 SetLine(dwLine, sText, true);
\r
164 void CSysProgressDlg::FormatNonPathLine(DWORD dwLine, UINT idFormatText, ...)
\r
167 va_start(args, idFormatText);
\r
170 sText.FormatV(CString(MAKEINTRESOURCE(idFormatText)), args);
\r
171 SetLine(dwLine, sText, false);
\r
177 HRESULT CSysProgressDlg::ShowModal (HWND hWndParent)
\r
184 hr = m_pIDlg->StartProgressDialog(hWndParent,
\r
186 m_dwDlgFlags | PROGDLG_MODAL,
\r
191 m_isVisible = true;
\r
198 HRESULT CSysProgressDlg::ShowModeless(HWND hWndParent)
\r
201 HRESULT hr = E_FAIL;
\r
205 hr = m_pIDlg->StartProgressDialog(hWndParent, NULL, m_dwDlgFlags, NULL);
\r
209 m_isVisible = true;
\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
220 hr=pOleWindow->GetWindow(&hDlgWnd);
\r
223 ShowWindow(hDlgWnd, SW_NORMAL);
\r
225 pOleWindow->Release();
\r
232 void CSysProgressDlg::SetProgress(DWORD dwProgress, DWORD dwMax)
\r
236 m_pIDlg->SetProgress(dwProgress, dwMax);
\r
241 void CSysProgressDlg::SetProgress64(ULONGLONG u64Progress, ULONGLONG u64ProgressMax)
\r
245 m_pIDlg->SetProgress64(u64Progress, u64ProgressMax);
\r
250 bool CSysProgressDlg::HasUserCancelled()
\r
254 return (0 != m_pIDlg->HasUserCancelled());
\r
259 void CSysProgressDlg::Stop()
\r
261 if ((m_isVisible)&&(m_bValid))
\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
268 IOleWindow *pOleWindow;
\r
269 HRESULT hr=m_pIDlg->QueryInterface(IID_IOleWindow,(LPVOID *)&pOleWindow);
\r
274 hr=pOleWindow->GetWindow(&hDlgWnd);
\r
277 ShowWindow(hDlgWnd, SW_HIDE);
\r
279 pOleWindow->Release();
\r
281 m_isVisible = false;
\r
282 m_pIDlg->Release();
\r
287 void CSysProgressDlg::ResetTimer()
\r
291 m_pIDlg->Timer(PDTIMER_RESET, NULL);
\r