Do not quit TortoiseGitProc after running Bisect Start from log list
[TortoiseGit.git] / src / TortoiseProc / GitProgressList.h
blob053c12570f26199a2df8b2cce82c62ba85476056
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2014 - TortoiseGit
4 // Copyright (C) 2003-2008 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #pragma once
21 #include "TGitPath.h"
22 #include "Git.h"
23 #include "Colors.h"
24 #include "Win7.h"
25 #include "UnicodeUtils.h"
26 #include "resource.h"
27 #include "../TortoiseShell/resource.h"
28 #include "LoglistCommonResource.h"
29 #include "IconMenu.h"
30 #include "ProgressDlg.h"
31 /**
32 * \ingroup TortoiseProc
33 * Options which can be used to configure the way the dialog box works
35 typedef enum
37 ProgOptNone = 0,
38 /// Don't actually do the merge - just practice it
39 ProgOptDryRun = 0x04,
40 } ProgressOptions;
42 // CGitProgressList
43 struct git_transfer_progress;
44 #define WM_SHOWCONFLICTRESOLVER (WM_APP + 100)
45 #define WM_PROG_CMD_FINISH (WM_APP + 200)
46 #define WM_PROG_CMD_START (WM_APP + 201)
48 class ProgressCommand;
49 class CGitProgressList : public CListCtrl
51 DECLARE_DYNAMIC(CGitProgressList)
53 public:
54 CGitProgressList();
55 virtual ~CGitProgressList();
57 void SetCommand(ProgressCommand* command) { ATLASSERT(command); m_Command = command; }
58 void SetOptions(DWORD opts) {m_options = opts;}
60 /**
61 * If the number of items for which the operation is done on is known
62 * beforehand, that number can be set here. It is then used to show a more
63 * accurate progress bar during the operation.
65 void SetItemCountTotal(long count) { if(count) m_itemCountTotal = count; }
66 void SetItemProgress(long count) { m_itemCount = count;} // do not use SetItemCount here as this overrides the ListBox method
67 bool SetBackgroundImage(UINT nID);
68 bool DidErrorsOccur() {return m_bErrorsOccurred;}
69 bool m_bErrorsOccurred;
70 CWnd *m_pProgressLabelCtrl;
71 CWnd *m_pInfoCtrl;
72 CAnimateCtrl *m_pAnimate;
73 CProgressCtrl *m_pProgControl;
74 ProgressCommand *m_Command;
75 void Cancel();
76 volatile BOOL IsCancelled() {return m_bCancelled;}
77 volatile LONG IsRunning() {return m_bThreadRunning;}
78 CWinThread* m_pThread;
79 CWnd *m_pPostWnd;
80 bool m_bSetTitle;
82 public:
83 typedef std::vector<std::function<void()>> ContextMenuActionList;
85 class NotificationData
87 public:
88 NotificationData()
89 : color(::GetSysColor(COLOR_WINDOWTEXT))
90 , bAuxItem(false)
91 {};
93 NotificationData(const CTGitPath &path, UINT actionTextId)
94 : color(::GetSysColor(COLOR_WINDOWTEXT))
95 , bAuxItem(false)
97 this->path = path;
98 sActionColumnText.LoadString(actionTextId);
101 virtual ~NotificationData() {};
103 virtual void SetColorCode(CColors& /*colors*/) {};
104 virtual void GetContextMenu(CIconMenu& /*popup*/, ContextMenuActionList& /*actions*/) {};
105 virtual void HandleDblClick() const {}
107 // The text we put into the first column (the Git action for normal items, just text for aux items)
108 CString sActionColumnText;
109 CTGitPath path;
110 COLORREF color;
111 bool bAuxItem; // Set if this item is not a true 'Git action'
112 CString sPathColumnText;
115 class WC_File_NotificationData : public NotificationData
117 public:
118 typedef enum
120 git_wc_notify_add,
121 git_wc_notify_resolved,
122 git_wc_notify_revert,
123 git_wc_notify_checkout,
124 } git_wc_notify_action_t;
126 WC_File_NotificationData(const CTGitPath& path, git_wc_notify_action_t action);
127 virtual void SetColorCode(CColors& colors);
129 git_wc_notify_action_t action;
131 virtual void GetContextMenu(CIconMenu& popup, ContextMenuActionList& actions);
132 virtual void HandleDblClick() const;
135 void AddNotify(NotificationData* data, CColors::Colors color = CColors::COLOR_END);
136 BOOL UpdateProgress(const git_transfer_progress* stat);
138 void SetProgressLabelText(const CString& str);
140 protected:
141 DECLARE_MESSAGE_MAP()
143 public:
144 void SetWindowTitle(UINT id, const CString& urlorpath, CString& dialogname);
146 protected:
147 afx_msg void OnNMCustomdrawSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
148 afx_msg void OnLvnGetdispinfoSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
149 afx_msg void OnNMDblclkSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
150 afx_msg void OnHdnItemclickSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
151 afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
152 afx_msg void OnTimer(UINT_PTR nIDEvent);
153 afx_msg void OnSize(UINT nType, int cx, int cy);
154 LRESULT OnShowConflictResolver(WPARAM, LPARAM);
155 afx_msg void OnLvnBegindragSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
157 void Sort();
158 static bool SortCompare(const NotificationData* pElem1, const NotificationData* pElem2);
160 static BOOL m_bAscending;
161 static int m_nSortedColumn;
163 private:
164 static UINT ProgressThreadEntry(LPVOID pVoid);
165 UINT ProgressThread();
167 public:
168 void ReportGitError();
169 void ReportUserCanceled();
170 void ReportError(const CString& sError);
171 void ReportWarning(const CString& sWarning);
172 void ReportNotification(const CString& sNotification);
173 void ReportCmd(const CString& sCmd);
174 void ReportString(CString sMessage, const CString& sMsgKind, COLORREF color = ::GetSysColor(COLOR_WINDOWTEXT));
176 private:
177 void AddItemToList();
178 CString BuildInfoString();
181 * Resizes the columns of the progress list so that the headings are visible.
183 void ResizeColumns();
185 /// Predicate function to tell us if a notification data item is auxiliary or not
186 static bool NotificationDataIsAux(const NotificationData* pData);
188 private:
189 typedef std::vector<NotificationData *> NotificationDataVect;
191 NotificationDataVect m_arData;
193 volatile LONG m_bThreadRunning;
195 int m_options; // Use values from the ProgressOptions enum
198 TCHAR m_columnbuf[MAX_PATH];
200 public:
201 volatile BOOL m_bCancelled;
203 private:
204 int iFirstResized;
205 BOOL bSecondResized;
206 int nEnsureVisibleCount;
208 CString m_sTotalBytesTransferred;
209 size_t m_TotalBytesTransferred;
211 CColors m_Colors;
213 bool m_bFinishedItemAdded;
214 bool m_bLastVisible;
216 public:
217 int m_itemCount;
218 int m_itemCountTotal;
220 public:
221 CComPtr<ITaskbarList3> m_pTaskbarList;
222 void Init();
223 void ShowProgressBar();
225 protected:
226 afx_msg void OnClose();
227 virtual BOOL PreTranslateMessage(MSG* pMsg);
230 class ProgressCommand
232 protected:
233 CTGitPathList m_targetPathList;
235 public:
236 PostCmdCallback m_PostCmdCallback;
238 ProgressCommand()
239 : m_PostCmdCallback(nullptr)
242 void SetPathList(CTGitPathList& pathList) { m_targetPathList = pathList; }
243 virtual bool Run(CGitProgressList* list, CString& sWindowTitle, int& m_itemCountTotal, int& m_itemCount) = 0;
244 virtual bool ShowInfo(CString& /*info*/) { return false; }
245 virtual ~ProgressCommand() {}