Fix possible crash if git config is broken
[TortoiseGit.git] / src / TortoiseProc / GitProgressList.h
bloba25f0a9bb37084634802a0abbb9bdea55675613d
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2015 - 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;
84 struct Payload
86 CGitProgressList* list;
87 git_repository* repo;
90 class NotificationData
92 public:
93 NotificationData()
94 : color(::GetSysColor(COLOR_WINDOWTEXT))
95 , bAuxItem(false)
96 {};
98 NotificationData(const CTGitPath &path, UINT actionTextId)
99 : NotificationData()
101 this->path = path;
102 sActionColumnText.LoadString(actionTextId);
105 virtual ~NotificationData() {};
107 virtual void SetColorCode(CColors& /*colors*/) {};
108 virtual void GetContextMenu(CIconMenu& /*popup*/, ContextMenuActionList& /*actions*/) {};
109 virtual void HandleDblClick() const {}
111 // The text we put into the first column (the Git action for normal items, just text for aux items)
112 CString sActionColumnText;
113 CTGitPath path;
114 COLORREF color;
115 bool bAuxItem; // Set if this item is not a true 'Git action'
116 CString sPathColumnText;
119 class WC_File_NotificationData : public NotificationData
121 public:
122 typedef enum
124 git_wc_notify_add,
125 git_wc_notify_resolved,
126 git_wc_notify_revert,
127 git_wc_notify_checkout,
128 } git_wc_notify_action_t;
130 WC_File_NotificationData(const CTGitPath& path, git_wc_notify_action_t action);
131 virtual void SetColorCode(CColors& colors);
133 git_wc_notify_action_t action;
135 virtual void GetContextMenu(CIconMenu& popup, ContextMenuActionList& actions);
136 virtual void HandleDblClick() const;
139 void AddNotify(NotificationData* data, CColors::Colors color = CColors::COLOR_END);
140 int UpdateProgress(const git_transfer_progress* stat);
142 void SetProgressLabelText(const CString& str);
144 protected:
145 DECLARE_MESSAGE_MAP()
147 public:
148 void SetWindowTitle(UINT id, const CString& urlorpath, CString& dialogname);
150 protected:
151 afx_msg void OnNMCustomdrawSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
152 afx_msg void OnLvnGetdispinfoSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
153 afx_msg void OnNMDblclkSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
154 afx_msg void OnHdnItemclickSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
155 afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
156 afx_msg void OnTimer(UINT_PTR nIDEvent);
157 afx_msg void OnSize(UINT nType, int cx, int cy);
158 LRESULT OnShowConflictResolver(WPARAM, LPARAM);
159 afx_msg void OnLvnBegindragSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
161 void Sort();
162 static bool SortCompare(const NotificationData* pElem1, const NotificationData* pElem2);
164 static BOOL m_bAscending;
165 static int m_nSortedColumn;
167 private:
168 static UINT ProgressThreadEntry(LPVOID pVoid);
169 UINT ProgressThread();
171 public:
172 void ReportGitError();
173 void ReportUserCanceled();
174 void ReportError(const CString& sError);
175 void ReportWarning(const CString& sWarning);
176 void ReportNotification(const CString& sNotification);
177 void ReportCmd(const CString& sCmd);
178 void ReportString(CString sMessage, const CString& sMsgKind, COLORREF color = ::GetSysColor(COLOR_WINDOWTEXT));
180 private:
181 void AddItemToList();
182 CString BuildInfoString();
185 * Resizes the columns of the progress list so that the headings are visible.
187 void ResizeColumns();
189 /// Predicate function to tell us if a notification data item is auxiliary or not
190 static bool NotificationDataIsAux(const NotificationData* pData);
192 private:
193 typedef std::vector<NotificationData *> NotificationDataVect;
195 NotificationDataVect m_arData;
197 volatile LONG m_bThreadRunning;
199 int m_options; // Use values from the ProgressOptions enum
202 TCHAR m_columnbuf[MAX_PATH];
204 public:
205 volatile BOOL m_bCancelled;
207 private:
208 int iFirstResized;
209 BOOL bSecondResized;
210 int nEnsureVisibleCount;
212 CString m_sTotalBytesTransferred;
213 size_t m_TotalBytesTransferred;
215 CColors m_Colors;
217 bool m_bFinishedItemAdded;
218 bool m_bLastVisible;
220 public:
221 int m_itemCount;
222 int m_itemCountTotal;
224 public:
225 CComPtr<ITaskbarList3> m_pTaskbarList;
226 void Init();
227 void ShowProgressBar();
229 protected:
230 afx_msg void OnClose();
231 virtual BOOL PreTranslateMessage(MSG* pMsg);
234 class ProgressCommand
236 protected:
237 CTGitPathList m_targetPathList;
239 public:
240 PostCmdCallback m_PostCmdCallback;
242 ProgressCommand()
243 : m_PostCmdCallback(nullptr)
246 void SetPathList(CTGitPathList& pathList) { m_targetPathList = pathList; }
247 virtual bool Run(CGitProgressList* list, CString& sWindowTitle, int& m_itemCountTotal, int& m_itemCount) = 0;
248 virtual bool ShowInfo(CString& /*info*/) { return false; }
249 virtual ~ProgressCommand() {}