Merge branch 'scintilla-551'
[TortoiseGit.git] / src / TortoiseProc / ProgressDlg.h
blob567957ca9c30045eb6810a73b63af1aea94697f3
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.
19 #pragma once
21 #include "StandAloneDlg.h"
22 #include "Git.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{
35 AUTOCLOSE_NO,
36 AUTOCLOSE_IF_NO_OPTIONS,
37 AUTOCLOSE_IF_NO_ERRORS,
40 using PostCmdAction = std::function<void()>;
42 class PostCmd
44 public:
45 PostCmd(UINT icon, UINT msgId, PostCmdAction action)
46 : icon(icon)
47 , action(action)
49 label.LoadString(msgId);
52 PostCmd(UINT msgId, PostCmdAction action)
53 : PostCmd(0, msgId, action)
57 PostCmd(UINT icon, CString label, PostCmdAction action)
58 : icon(icon)
59 , action(action)
60 , label(label)
64 PostCmd(CString label, PostCmdAction action)
65 : PostCmd(0, label, action)
69 UINT icon;
70 CString label;
71 PostCmdAction 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)
81 public:
82 CProgressDlg(CWnd* pParent = nullptr); // standard constructor
83 virtual ~CProgressDlg();
85 private:
86 BOOL OnInitDialog() override;
88 // Dialog Data
89 enum { IDD = IDD_GITPROGRESS };
91 public:
92 CString m_GitCmd;
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)
100 CString m_LogFile;
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;
104 CGit * m_Git;
106 DWORD m_GitStatus;
107 CString m_LogText;
109 CString GetLogText() const { CString text; m_Log.GetWindowText(text); return text; }
111 private:
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;
124 bool m_bDone;
125 ULONGLONG m_startTick;
127 void DoDataExchange(CDataExchange* pDX) override; // DDX/DDV support
128 static UINT ProgressThreadEntry(LPVOID pVoid);
129 UINT ProgressThread();
131 CStringA m_LogTextA;
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);
154 int m_BufStart;
156 DECLARE_MESSAGE_MAP()
158 //Share with Sync Dailog
159 static int ParsePercentage(CString &log, int pos);
161 static void ClearESC(CString &str);
163 public:
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);
176 private:
177 afx_msg void OnBnClickedOk();
178 afx_msg void OnBnClickedButton1();
180 BOOL PreTranslateMessage(MSG* pMsg) override;
182 struct ACCELLERATOR {
183 int id;
184 int cnt;
185 int wmid;
187 std::map<wchar_t, ACCELLERATOR> m_accellerators;
188 HACCEL m_hAccel;
189 LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) override;
192 class CCommitProgressDlg:public CProgressDlg
194 public:
195 CCommitProgressDlg(CWnd* pParent = nullptr) : CProgressDlg(pParent)
199 CString Convert2UnionCode(const char* buff) override;