GitProgressDlg: Move most part of function to GitProgressList
[TortoiseGit.git] / src / TortoiseProc / GitProgressList.h
blobf9933b9a637c5dfa25d313fcf5e6c3388aa389da
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2013 - 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 "ProjectProperties.h"
23 #include "Git.h"
24 #include "GitStatus.h"
25 #include "Colors.h"
26 //#include "..\IBugTraqProvider\IBugTraqProvider_h.h"
27 #include "afxwin.h"
28 #include "Win7.h"
29 #include "UnicodeUtils.h"
30 #include "resource.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 ProgOptRecursive = 0x01,
39 ProgOptNonRecursive = 0x00,
40 /// Don't actually do the merge - just practice it
41 ProgOptDryRun = 0x04,
42 ProgOptIgnoreExternals = 0x08,
43 ProgOptKeeplocks = 0x10,
44 /// for locking this means steal the lock, for unlocking it means breaking the lock
45 ProgOptLockForce = 0x20,
46 ProgOptSwitchAfterCopy = 0x40,
47 ProgOptIncludeIgnored = 0x80,
48 ProgOptIgnoreAncestry = 0x100,
49 ProgOptEolDefault = 0x200,
50 ProgOptEolCRLF = 0x400,
51 ProgOptEolLF = 0x800,
52 ProgOptEolCR = 0x1000,
53 ProgOptSkipConflictCheck = 0x2000,
54 ProgOptRecordOnly = 0x4000
55 } ProgressOptions;
57 typedef enum
59 CLOSE_MANUAL = 0,
60 CLOSE_NOERRORS,
61 CLOSE_NOCONFLICTS,
62 CLOSE_NOMERGES,
63 CLOSE_LOCAL
64 } ProgressCloseOptions;
66 typedef enum
68 git_wc_notify_add,
69 git_wc_notify_sendmail_start,
70 git_wc_notify_sendmail_error,
71 git_wc_notify_sendmail_retry,
72 git_wc_notify_sendmail_done,
73 git_wc_notify_resolved,
74 git_wc_notify_revert,
75 git_wc_notify_fetch,
76 git_wc_notify_checkout,
77 git_wc_notify_update_ref,
79 }git_wc_notify_action_t;
81 typedef enum
83 SENDMAIL_ATTACHMENT =0x1,
84 SENDMAIL_COMBINED =0x2,
85 SENDMAIL_MAPI =0x4
87 // CGitProgressList
88 struct git_transfer_progress;
89 #define WM_SHOWCONFLICTRESOLVER (WM_APP + 100)
91 class CGitProgressList : public CListCtrl
93 DECLARE_DYNAMIC(CGitProgressList)
95 public:
96 typedef enum
98 GitProgress_Add,
99 GitProgress_Checkout,
100 GitProgress_Copy,
101 GitProgress_Export,
102 GitProgress_Rename,
103 GitProgress_Resolve,
104 GitProgress_Revert,
105 GitProgress_Switch,
106 GitProgress_SendMail,
107 GitProgress_Clone,
108 GitProgress_Fetch,
109 } Command;
111 CGitProgressList();
112 virtual ~CGitProgressList();
114 void SetCommand(CGitProgressList::Command cmd) {m_Command = cmd;}
115 void SetOptions(DWORD opts) {m_options = opts;}
116 void SetPathList(const CTGitPathList& pathList) {m_targetPathList = pathList;}
117 void SetUrl(const CString& url) {m_url.SetFromUnknown(url);}
118 void SetSecondUrl(const CString& url) {m_url2.SetFromUnknown(url);}
119 void SetCommitMessage(const CString& msg) {m_sMessage = msg;}
120 void SetIsBare(bool b) { m_bBare = b; }
121 void SetNoCheckout(bool b){ m_bNoCheckout = b; }
122 void SetRefSpec(CString spec){ m_RefSpec = spec; }
123 void SetAutoTag(int tag){ m_AutoTag = tag; }
125 // void SetRevision(const GitRev& rev) {m_Revision = rev;}
126 // void SetRevisionEnd(const GitRev& rev) {m_RevisionEnd = rev;}
128 void SetDiffOptions(const CString& opts) {m_diffoptions = opts;}
129 void SetSendMailOption(CString &TO, CString &CC,CString &Subject,DWORD flags){m_SendMailTO=TO;m_SendMailSubject=Subject; m_SendMailCC=CC;this->m_SendMailFlags = flags;}
130 void SetDepth(git_depth_t depth = git_depth_unknown) {m_depth = depth;}
131 void SetPegRevision(GitRev pegrev = GitRev()) {m_pegRev = pegrev;}
132 void SetProjectProperties(ProjectProperties props) {m_ProjectProperties = props;}
133 void SetChangeList(const CString& changelist, bool keepchangelist) {m_changelist = changelist; m_keepchangelist = keepchangelist;}
134 void SetSelectedList(const CTGitPathList& selPaths);
135 // void SetRevisionRanges(const GitRevRangeArray& revArray) {m_revisionArray = revArray;}
136 // void SetBugTraqProvider(const CComPtr<IBugTraqProvider> pBugtraqProvider) { m_BugTraqProvider = pBugtraqProvider;}
138 * If the number of items for which the operation is done on is known
139 * beforehand, that number can be set here. It is then used to show a more
140 * accurate progress bar during the operation.
142 void SetItemCount(long count) {if(count) m_itemCountTotal = count;}
143 bool SetBackgroundImage(UINT nID);
144 bool DidErrorsOccur() {return m_bErrorsOccurred;}
145 bool m_bErrorsOccurred;
146 CWnd *m_pTextCtrl;
147 CAnimateCtrl *m_pAnimate;
148 Command m_Command;
149 virtual BOOL Cancel();
150 volatile BOOL IsCancelled() {return m_bCancelled;}
151 volatile LONG IsRunning() {return m_bThreadRunning;}
152 CWinThread* m_pThread;
153 bool m_AlwaysConflicted;
154 private:
155 class NotificationData
157 public:
158 NotificationData()
159 : color(::GetSysColor(COLOR_WINDOWTEXT))
160 , action((git_wc_notify_action_t)-1)
161 , bConflictedActionItem(false)
162 , bAuxItem(false)
164 git_wc_notify_action_t action;
165 #if 0
166 action((git_wc_notify_action_t)-1),
167 kind(git_node_none),
168 content_state(git_wc_notify_state_inapplicable),
169 prop_state(git_wc_notify_state_inapplicable),
170 rev(0),
172 bConflictedActionItem(false),
173 bAuxItem(false)
175 // lock_state(git_wc_notify_lock_state_unchanged)
177 // merge_range.end = 0;
178 // merge_range.start = 0;
180 #endif
181 public:
182 // The text we put into the first column (the Git action for normal items, just text for aux items)
183 CString sActionColumnText;
184 CTGitPath path;
185 CTGitPath basepath;
186 // CString changelistname;
188 // git_node_kind_t kind;
189 // CString mime_type;
190 // git_wc_notify_state_t content_state;
191 // git_wc_notify_state_t prop_state;
192 // git_wc_notify_lock_state_t lock_state;
193 // git_merge_range_t merge_range;
194 git_revnum_t rev;
195 COLORREF color;
196 // CString owner; ///< lock owner
197 bool bConflictedActionItem; // Is this item a conflict?
198 bool bAuxItem; // Set if this item is not a true 'Git action'
199 CString sPathColumnText;
200 CGitHash m_OldHash;
201 CGitHash m_NewHash;
204 protected:
205 DECLARE_MESSAGE_MAP()
207 //Need update in the future implement the virtual methods from Git base class
208 virtual BOOL Notify(const CTGitPath& path,
209 git_wc_notify_action_t action,
210 int status = 0,
211 CString *strErr =NULL
213 git_node_kind_t kind, const CString& mime_type,
214 git_wc_notify_state_t content_state,
215 git_wc_notify_state_t prop_state, LONG rev,
216 const git_lock_t * lock, git_wc_notify_lock_state_t lock_state,
217 const CString& changelistname,
218 git_merge_range_t * range,
219 git_error_t * err, apr_pool_t * pool*/
221 virtual BOOL Notify(const git_wc_notify_action_t action, const git_transfer_progress *stat);
222 virtual BOOL Notify(const git_wc_notify_action_t action, CString str, const git_oid *a, const git_oid *b);
224 // virtual git_wc_conflict_choice_t ConflictResolveCallback(const git_wc_conflict_description_t *description, CString& mergedfile);
226 static int FetchCallback(const git_transfer_progress *stats, void *payload)
228 return !((CGitProgressList*)payload) -> Notify(git_wc_notify_fetch, stats);
231 static void CheckoutCallback(const char *path, size_t cur, size_t tot, void *payload)
233 CTGitPath tpath = CUnicodeUtils::GetUnicode(CStringA(path), CP_UTF8);
234 ((CGitProgressList*)payload) -> m_itemCountTotal = tot;
235 ((CGitProgressList*)payload) -> m_itemCount = cur;
236 ((CGitProgressList*)payload) -> Notify(tpath, git_wc_notify_checkout);
239 static void RemoteProgressCallback(const char *str, int len, void *data)
241 CString progText;
242 progText = CUnicodeUtils::GetUnicode(CStringA(str, len));
243 ((CGitProgressList*)data) -> SetDlgItemText(IDC_PROGRESSLABEL, progText);
245 static int RemoteCompletionCallback(git_remote_completion_type /*type*/, void * /*data*/)
247 return 0;
249 static int RemoteUpdatetipsCallback(const char *refname, const git_oid *a, const git_oid *b, void *data)
251 CString str;
252 str = CUnicodeUtils::GetUnicode(refname);
253 ((CGitProgressList*)data) -> Notify(git_wc_notify_update_ref, str, a, b);
254 return 0;
257 afx_msg void OnNMCustomdrawSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
258 afx_msg void OnLvnGetdispinfoSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
259 afx_msg void OnNMDblclkSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
260 afx_msg void OnHdnItemclickSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
261 afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
262 afx_msg LRESULT OnGitProgress(WPARAM wParam, LPARAM lParam);
263 afx_msg void OnTimer(UINT_PTR nIDEvent);
264 afx_msg void OnSize(UINT nType, int cx, int cy);
265 LRESULT OnShowConflictResolver(WPARAM, LPARAM);
266 afx_msg void OnLvnBegindragSvnprogress(NMHDR *pNMHDR, LRESULT *pResult);
267 afx_msg LRESULT OnTaskbarBtnCreated(WPARAM wParam, LPARAM lParam);
269 void Sort();
270 static bool SortCompare(const NotificationData* pElem1, const NotificationData* pElem2);
272 static BOOL m_bAscending;
273 static int m_nSortedColumn;
274 CStringList m_ExtStack;
276 private:
277 static UINT ProgressThreadEntry(LPVOID pVoid);
278 UINT ProgressThread();
280 void ReportGitError();
281 void ReportError(const CString& sError);
282 void ReportWarning(const CString& sWarning);
283 void ReportNotification(const CString& sNotification);
284 void ReportCmd(const CString& sCmd);
285 void ReportString(CString sMessage, const CString& sMsgKind, COLORREF color = ::GetSysColor(COLOR_WINDOWTEXT));
286 void AddItemToList();
287 CString BuildInfoString();
288 CString GetPathFromColumnText(const CString& sColumnText);
291 * Resizes the columns of the progress list so that the headings are visible.
293 void ResizeColumns();
295 /// Predicate function to tell us if a notification data item is auxiliary or not
296 static bool NotificationDataIsAux(const NotificationData* pData);
298 // the commands to execute
299 bool CmdAdd(CString& sWindowTitle, bool& localoperation);
300 bool CmdCheckout(CString& sWindowTitle, bool& localoperation);
301 bool CmdCopy(CString& sWindowTitle, bool& localoperation);
302 bool CmdExport(CString& sWindowTitle, bool& localoperation);
303 bool CmdRename(CString& sWindowTitle, bool& localoperation);
304 bool CmdResolve(CString& sWindowTitle, bool& localoperation);
305 bool CmdRevert(CString& sWindowTitle, bool& localoperation);
306 bool CmdSwitch(CString& sWindowTitle, bool& localoperation);
307 bool CmdSendMail(CString& sWindowTitle, bool& localoperation);
308 bool CmdClone(CString& sWindowTitle, bool& localoperation);
309 bool CmdFetch(CString& sWindowTitle, bool& localoperation);
311 private:
312 typedef std::map<CStringA, git_revnum_t> StringRevMap;
313 typedef std::vector<NotificationData *> NotificationDataVect;
315 CString m_mergedfile;
316 NotificationDataVect m_arData;
318 volatile LONG m_bThreadRunning;
320 ProjectProperties m_ProjectProperties;
322 int m_options; // Use values from the ProgressOptions enum
323 git_depth_t m_depth;
324 CTGitPathList m_targetPathList;
325 CTGitPathList m_selectedPaths;
326 CTGitPath m_url;
327 CTGitPath m_url2;
328 CString m_sMessage;
329 CString m_diffoptions;
330 GitRev m_Revision;
331 GitRev m_RevisionEnd;
332 GitRev m_pegRev;
333 // GitRevRangeArray m_revisionArray;
334 CString m_changelist;
335 bool m_keepchangelist;
337 CTGitPath m_basePath;
338 StringRevMap m_UpdateStartRevMap;
339 StringRevMap m_FinishedRevMap;
341 TCHAR m_columnbuf[MAX_PATH];
343 volatile BOOL m_bCancelled;
344 int m_nConflicts;
345 bool m_bMergesAddsDeletesOccurred;
347 int iFirstResized;
348 BOOL bSecondResized;
349 int nEnsureVisibleCount;
351 CString m_sTotalBytesTransferred;
352 size_t m_TotalBytesTransferred;
354 CColors m_Colors;
356 bool m_bFinishedItemAdded;
357 bool m_bLastVisible;
359 int m_itemCount;
360 int m_itemCountTotal;
362 DWORD m_SendMailFlags;
363 CString m_SendMailTO;
364 CString m_SendMailCC;
365 CString m_SendMailSubject;
367 /// CComPtr<IBugTraqProvider> m_BugTraqProvider;
368 CComPtr<ITaskbarList3> m_pTaskbarList;
370 // some strings different methods can use
371 CString sDryRun;
372 CString sRecordOnly;
374 bool m_bBare;
375 bool m_bNoCheckout;
376 CString m_RefSpec;
377 int m_AutoTag;
378 public:
379 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
380 afx_msg void OnClose();
381 virtual BOOL PreTranslateMessage(MSG* pMsg);