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.
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
)
99 : color(::GetSysColor(COLOR_WINDOWTEXT
))
103 sActionColumnText
.LoadString(actionTextId
);
106 virtual ~NotificationData() {};
108 virtual void SetColorCode(CColors
& /*colors*/) {};
109 virtual void GetContextMenu(CIconMenu
& /*popup*/, ContextMenuActionList
& /*actions*/) {};
110 virtual void HandleDblClick() const {}
112 // The text we put into the first column (the Git action for normal items, just text for aux items)
113 CString sActionColumnText
;
116 bool bAuxItem
; // Set if this item is not a true 'Git action'
117 CString sPathColumnText
;
120 class WC_File_NotificationData
: public NotificationData
126 git_wc_notify_resolved
,
127 git_wc_notify_revert
,
128 git_wc_notify_checkout
,
129 } git_wc_notify_action_t
;
131 WC_File_NotificationData(const CTGitPath
& path
, git_wc_notify_action_t action
);
132 virtual void SetColorCode(CColors
& colors
);
134 git_wc_notify_action_t action
;
136 virtual void GetContextMenu(CIconMenu
& popup
, ContextMenuActionList
& actions
);
137 virtual void HandleDblClick() const;
140 void AddNotify(NotificationData
* data
, CColors::Colors color
= CColors::COLOR_END
);
141 int UpdateProgress(const git_transfer_progress
* stat
);
143 void SetProgressLabelText(const CString
& str
);
146 DECLARE_MESSAGE_MAP()
149 void SetWindowTitle(UINT id
, const CString
& urlorpath
, CString
& dialogname
);
152 afx_msg
void OnNMCustomdrawSvnprogress(NMHDR
*pNMHDR
, LRESULT
*pResult
);
153 afx_msg
void OnLvnGetdispinfoSvnprogress(NMHDR
*pNMHDR
, LRESULT
*pResult
);
154 afx_msg
void OnNMDblclkSvnprogress(NMHDR
*pNMHDR
, LRESULT
*pResult
);
155 afx_msg
void OnHdnItemclickSvnprogress(NMHDR
*pNMHDR
, LRESULT
*pResult
);
156 afx_msg
void OnContextMenu(CWnd
* pWnd
, CPoint point
);
157 afx_msg
void OnTimer(UINT_PTR nIDEvent
);
158 afx_msg
void OnSize(UINT nType
, int cx
, int cy
);
159 LRESULT
OnShowConflictResolver(WPARAM
, LPARAM
);
160 afx_msg
void OnLvnBegindragSvnprogress(NMHDR
*pNMHDR
, LRESULT
*pResult
);
163 static bool SortCompare(const NotificationData
* pElem1
, const NotificationData
* pElem2
);
165 static BOOL m_bAscending
;
166 static int m_nSortedColumn
;
169 static UINT
ProgressThreadEntry(LPVOID pVoid
);
170 UINT
ProgressThread();
173 void ReportGitError();
174 void ReportUserCanceled();
175 void ReportError(const CString
& sError
);
176 void ReportWarning(const CString
& sWarning
);
177 void ReportNotification(const CString
& sNotification
);
178 void ReportCmd(const CString
& sCmd
);
179 void ReportString(CString sMessage
, const CString
& sMsgKind
, COLORREF color
= ::GetSysColor(COLOR_WINDOWTEXT
));
182 void AddItemToList();
183 CString
BuildInfoString();
186 * Resizes the columns of the progress list so that the headings are visible.
188 void ResizeColumns();
190 /// Predicate function to tell us if a notification data item is auxiliary or not
191 static bool NotificationDataIsAux(const NotificationData
* pData
);
194 typedef std::vector
<NotificationData
*> NotificationDataVect
;
196 NotificationDataVect m_arData
;
198 volatile LONG m_bThreadRunning
;
200 int m_options
; // Use values from the ProgressOptions enum
203 TCHAR m_columnbuf
[MAX_PATH
];
206 volatile BOOL m_bCancelled
;
211 int nEnsureVisibleCount
;
213 CString m_sTotalBytesTransferred
;
214 size_t m_TotalBytesTransferred
;
218 bool m_bFinishedItemAdded
;
223 int m_itemCountTotal
;
226 CComPtr
<ITaskbarList3
> m_pTaskbarList
;
228 void ShowProgressBar();
231 afx_msg
void OnClose();
232 virtual BOOL
PreTranslateMessage(MSG
* pMsg
);
235 class ProgressCommand
238 CTGitPathList m_targetPathList
;
241 PostCmdCallback m_PostCmdCallback
;
244 : m_PostCmdCallback(nullptr)
247 void SetPathList(CTGitPathList
& pathList
) { m_targetPathList
= pathList
; }
248 virtual bool Run(CGitProgressList
* list
, CString
& sWindowTitle
, int& m_itemCountTotal
, int& m_itemCount
) = 0;
249 virtual bool ShowInfo(CString
& /*info*/) { return false; }
250 virtual ~ProgressCommand() {}