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.
25 #include "UnicodeUtils.h"
27 #include "../TortoiseShell/resource.h"
28 #include "LoglistCommonResource.h"
30 #include "ProgressDlg.h"
32 * \ingroup TortoiseProc
33 * Options which can be used to configure the way the dialog box works
38 /// Don't actually do the merge - just practice it
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
)
55 virtual ~CGitProgressList();
57 void SetCommand(ProgressCommand
* command
) { ATLASSERT(command
); m_Command
= command
; }
58 void SetOptions(DWORD opts
) {m_options
= opts
;}
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
;
72 CAnimateCtrl
*m_pAnimate
;
73 CProgressCtrl
*m_pProgControl
;
74 ProgressCommand
*m_Command
;
76 volatile BOOL
IsCancelled() {return m_bCancelled
;}
77 volatile LONG
IsRunning() {return m_bThreadRunning
;}
78 CWinThread
* m_pThread
;
83 typedef std::vector
<std::function
<void()>> ContextMenuActionList
;
86 CGitProgressList
* list
;
90 class NotificationData
94 : color(::GetSysColor(COLOR_WINDOWTEXT
))
98 NotificationData(const CTGitPath
&path
, UINT actionTextId
)
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
;
115 bool bAuxItem
; // Set if this item is not a true 'Git action'
116 CString sPathColumnText
;
119 class WC_File_NotificationData
: public NotificationData
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
);
145 DECLARE_MESSAGE_MAP()
148 void SetWindowTitle(UINT id
, const CString
& urlorpath
, CString
& dialogname
);
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
);
162 static bool SortCompare(const NotificationData
* pElem1
, const NotificationData
* pElem2
);
164 static BOOL m_bAscending
;
165 static int m_nSortedColumn
;
168 static UINT
ProgressThreadEntry(LPVOID pVoid
);
169 UINT
ProgressThread();
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
));
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
);
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
];
205 volatile BOOL m_bCancelled
;
210 int nEnsureVisibleCount
;
212 CString m_sTotalBytesTransferred
;
213 size_t m_TotalBytesTransferred
;
217 bool m_bFinishedItemAdded
;
222 int m_itemCountTotal
;
225 CComPtr
<ITaskbarList3
> m_pTaskbarList
;
227 void ShowProgressBar();
230 afx_msg
void OnClose();
231 virtual BOOL
PreTranslateMessage(MSG
* pMsg
);
234 class ProgressCommand
237 CTGitPathList m_targetPathList
;
240 PostCmdCallback m_PostCmdCallback
;
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() {}