1
// TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2023 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include "StandAloneDlg.h"
23 #include "MenuButton.h"
24 #include "GestureEnabledControl.h"
26 #define MSG_PROGRESSDLG_UPDATE_UI (WM_USER+121)
28 // CProgressDlg dialog
29 #define MSG_PROGRESSDLG_START 0
30 #define MSG_PROGRESSDLG_RUN 50
31 #define MSG_PROGRESSDLG_END 110
32 #define MSG_PROGRESSDLG_FAILED 111
34 enum class GitProgressAutoClose
{
36 AUTOCLOSE_IF_NO_OPTIONS
,
37 AUTOCLOSE_IF_NO_ERRORS
,
40 using PostCmdAction
= std::function
<void()>;
45 PostCmd(UINT icon
, UINT msgId
, PostCmdAction action
)
49 label
.LoadString(msgId
);
52 PostCmd(UINT msgId
, PostCmdAction action
)
53 : PostCmd(0, msgId
, action
)
57 PostCmd(UINT icon
, CString label
, PostCmdAction action
)
64 PostCmd(CString label
, PostCmdAction action
)
65 : PostCmd(0, label
, action
)
74 using PostCmdList
= std::vector
<PostCmd
>;
75 using PostCmdCallback
= std::function
<void(DWORD status
, PostCmdList
&)>;
76 using PostExecCallback
= std::function
<void(HWND hWnd
, DWORD
& exitCode
, CString
& extraMsg
)>;
78 class CProgressDlg
: public CResizableStandAloneDialog
80 DECLARE_DYNAMIC(CProgressDlg
)
82 CProgressDlg(CWnd
* pParent
= nullptr); // standard constructor
83 virtual ~CProgressDlg();
86 BOOL
OnInitDialog() override
;
89 enum { IDD
= IDD_GITPROGRESS
};
93 PostCmdCallback m_PostCmdCallback
;
94 std::vector
<CString
> m_GitCmdList
;
95 PostExecCallback m_PostExecCallback
; // After executing command line, this callback can modify exit code / display extra message
96 STRING_VECTOR m_GitDirList
;
97 CString m_PreText
; // optional text to show in log window before running command
98 CString m_PreFailText
; // optional fail text to show in log window
99 bool m_bShowCommand
; // whether to display the command in the log window (default true)
101 bool m_bBufferAll
; // Buffer All to improve speed when there are many file add at commit
102 int m_iBufferAllImmediateLines
; // When Buffer All is enabled, we might not get important oputput of git at the beginning, so, ignore buffer all for the first 10 lines...
103 GitProgressAutoClose m_AutoClose
;
109 CString
GetLogText() const { CString text
; m_Log
.GetWindowText(text
); return text
; }
112 PostCmdList m_PostCmdList
;
113 void WriteLog() const;
114 CMenuButton m_ctrlPostCmd
;
116 CProgressCtrl m_Progress
;
118 CGestureEnabledControlTmpl
<CRichEditCtrl
> m_Log
;
119 CAnimateCtrl m_Animate
;
120 CStatic m_CurrentWork
;
121 CWinThread
* m_pThread
;
123 volatile bool m_bAbort
;
125 ULONGLONG m_startTick
;
127 void DoDataExchange(CDataExchange
* pDX
) override
; // DDX/DDV support
128 static UINT
ProgressThreadEntry(LPVOID pVoid
);
129 UINT
ProgressThread();
133 void ParserCmdOutput(char ch
);
134 static const int s_iProgressLinesLimit
;
136 LRESULT
OnProgressUpdateUI(WPARAM wParam
,LPARAM lParam
);
138 afx_msg LRESULT
OnTaskbarBtnCreated(WPARAM wParam
, LPARAM lParam
);
139 CComPtr
<ITaskbarList3
> m_pTaskbarList
;
141 void OnCancel() override
;
142 afx_msg
void OnClose();
144 void SetupLogMessageViewControl();
145 afx_msg
void OnEnscrollLog();
146 afx_msg
void OnEnLinkLog(NMHDR
* pNMHDR
, LRESULT
* pResult
);
148 CGitGuardedByteArray m_Databuf
;
149 virtual CString
Convert2UnionCode(const char* buff
)
151 return CUnicodeUtils::GetUnicode(buff
);
156 DECLARE_MESSAGE_MAP()
158 //Share with Sync Dailog
159 static int ParsePercentage(CString
&log
, int pos
);
161 static void ClearESC(CString
&str
);
164 static void ParserCmdOutput(CRichEditCtrl
&log
,CProgressCtrl
&progressctrl
,HWND m_hWnd
,CComPtr
<ITaskbarList3
> m_pTaskbarList
,
165 CStringA
& oneline
, char ch
, CWnd
* CurrentWork
= nullptr);
168 *@param dirlist if empty, the current directory of param git is used; otherwise each entry in param cmdlist uses the corresponding entry in param dirlist
170 static UINT
RunCmdList(CWnd
* pWnd
, STRING_VECTOR
& cmdlist
, STRING_VECTOR
& dirlist
, bool bShowCommand
, CString
* pfilename
, volatile bool* bAbort
, CGitGuardedByteArray
* pdata
, CGit
* git
= &g_Git
);
172 static void KillProcessTree(DWORD dwProcessId
, unsigned int depth
= 0);
174 static void InsertColorText(CRichEditCtrl
&edit
,CString text
,COLORREF rgb
);
177 afx_msg
void OnBnClickedOk();
178 afx_msg
void OnBnClickedButton1();
180 BOOL
PreTranslateMessage(MSG
* pMsg
) override
;
182 struct ACCELLERATOR
{
187 std::map
<wchar_t, ACCELLERATOR
> m_accellerators
;
189 LRESULT
DefWindowProc(UINT message
, WPARAM wParam
, LPARAM lParam
) override
;
192 class CCommitProgressDlg
:public CProgressDlg
195 CCommitProgressDlg(CWnd
* pParent
= nullptr) : CProgressDlg(pParent
)
199 CString
Convert2UnionCode(const char* buff
) override
;