Add work dir copy at log dialog
[TortoiseGit.git] / src / TortoiseProc / GitLogListBase.h
blob97ca7792a639a1498fc4873073ceb1378cf25a0e
1 #pragma once
3 #include "HintListCtrl.h"
4 #include "XPTheme.h"
5 #include "CommonResource.h"
6 #include "Git.h"
7 #include "ProjectProperties.h"
8 #include "TGitPath.h"
9 #include "registry.h"
10 #include "SplitterControl.h"
11 #include "Colors.h"
12 #include "MenuButton.h"
13 #include "LogDlgHelper.h"
14 #include "FilterEdit.h"
15 #include "GitRev.h"
16 #include "Tooltip.h"
17 #include "HintListCtrl.h"
18 //#include "GitLogList.h"
19 #include "lanes.h"
20 #include "GitLogCache.h"
21 #include <regex>
22 // CGitLogList
23 #if (NTDDI_VERSION < NTDDI_LONGHORN)
25 enum LISTITEMSTATES_MINE {
26 LISS_NORMAL = 1,
27 LISS_HOT = 2,
28 LISS_SELECTED = 3,
29 LISS_DISABLED = 4,
30 LISS_SELECTEDNOTFOCUS = 5,
31 LISS_HOTSELECTED = 6,
34 #define MCS_NOTRAILINGDATES 0x0040
35 #define MCS_SHORTDAYSOFWEEK 0x0080
36 #define MCS_NOSELCHANGEONNAV 0x0100
38 #define DTM_SETMCSTYLE (DTM_FIRST + 11)
40 #endif
42 #define ICONITEMBORDER 5
44 #define GITLOG_START 0
45 #define GITLOG_START_ALL 1
46 #define GITLOG_END 100
48 #define LOGFILTER_ALL 1
49 #define LOGFILTER_MESSAGES 2
50 #define LOGFILTER_PATHS 3
51 #define LOGFILTER_AUTHORS 4
52 #define LOGFILTER_REVS 5
53 #define LOGFILTER_REGEX 6
54 #define LOGFILTER_BUGID 7
56 //typedef void CALLBACK_PROCESS(void * data, int progress);
57 #define MSG_LOADED (WM_USER+110)
58 #define MSG_LOAD_PERCENTAGE (WM_USER+111)
59 #define MSG_REFLOG_CHANGED (WM_USER+112)
61 class CGitLogListBase : public CHintListCtrl
63 DECLARE_DYNAMIC(CGitLogListBase)
65 public:
66 CGitLogListBase();
67 virtual ~CGitLogListBase();
68 volatile LONG m_bNoDispUpdates;
69 BOOL m_IsIDReplaceAction;
70 BOOL m_IsOldFirst;
71 BOOL m_IsRebaseReplaceGraph;
73 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
74 void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
76 BOOL m_bStrictStopped;
77 BOOL m_bShowBugtraqColumn;
78 BOOL m_bSearchIndex;
79 BOOL m_bCancelled;
80 unsigned __int64 m_ContextMenuMask;
82 bool m_hasWC;
83 bool m_bShowWC;
84 GitRev m_wcRev;
85 volatile LONG m_bThreadRunning;
86 CLogCache m_LogCache;
88 enum
90 LOGLIST_GRAPH,
91 LOGLIST_ACTION,
92 LOGLIST_MESSAGE,
93 LOGLIST_AUTHOR,
94 LOGLIST_DATE,
95 LOGLIST_BUG,
96 LOGLIST_MESSAGE_MAX=300,
97 LOGLIST_MESSAGE_MIN=200
100 enum
102 // needs to start with 1, since 0 is the return value if *nothing* is clicked on in the context menu
103 ID_COMPARE = 1,
104 ID_SAVEAS,
105 ID_COMPARETWO,
106 ID_UPDATE,
107 ID_COPY,
108 ID_REVERTREV,
109 ID_MERGEREV,
110 ID_GNUDIFF1,
111 ID_GNUDIFF2,
112 ID_FINDENTRY,
113 ID_OPEN,
114 ID_BLAME,
115 ID_REPOBROWSE,
116 ID_LOG,
117 ID_POPPROPS,
118 ID_EDITAUTHOR,
119 ID_EDITLOG,
120 ID_DIFF,
121 ID_OPENWITH,
122 ID_COPYCLIPBOARD,
123 ID_COPYHASH,
124 ID_CHECKOUT,
125 ID_REVERTTOREV,
126 ID_BLAMECOMPARE,
127 ID_BLAMETWO,
128 ID_BLAMEDIFF,
129 ID_VIEWREV,
130 ID_VIEWPATHREV,
131 ID_EXPORT,
132 ID_COMPAREWITHPREVIOUS,
133 ID_BLAMEWITHPREVIOUS,
134 ID_GETMERGELOGS,
135 ID_REVPROPS,
136 ID_CHERRY_PICK,
137 ID_CREATE_BRANCH,
138 ID_CREATE_TAG,
139 ID_SWITCHTOREV,
140 ID_RESET,
141 ID_REBASE_PICK,
142 ID_REBASE_EDIT,
143 ID_REBASE_SQUASH,
144 ID_REBASE_SKIP,
145 ID_COMBINE_COMMIT,
146 ID_STASH_APPLY,
147 ID_REFLOG_DEL,
148 ID_REBASE_TO_VERSION,
149 ID_CREATE_PATCH,
150 ID_DELETE,
152 inline unsigned __int64 GetContextMenuBit(int i){ return ((unsigned __int64 )0x1)<<i ;}
153 void InsertGitColumn();
154 void ResizeAllListCtrlCols();
155 void CopySelectionToClipBoard(bool hashonly=FALSE);
156 void DiffSelectedRevWithPrevious();
157 bool IsSelectionContinuous();
158 int FillGitShortLog();
159 int FillGitLog(CTGitPath *path,int infomask=CGit:: LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,CString *from=NULL,CString *to=NULL);
161 inline int ShownCountWithStopped() const { return (int)m_arShownList.GetCount() + (m_bStrictStopped ? 1 : 0); }
162 int FetchLogAsync(void * data=NULL);
163 CPtrArray m_arShownList;
164 void Refresh();
165 void RecalculateShownList(CPtrArray * pShownlist);
166 void Clear();
168 int m_nSelectedFilter;
169 CLogDataVector m_logEntries;
170 void RemoveFilter();
171 void StartFilter();
172 bool ValidateRegexp(LPCTSTR regexp_str, tr1::wregex& pat, bool bMatchCase = false );
173 CString m_sFilterText;
174 CTime m_From;
175 CTime m_To;
177 CTGitPath m_Path;
178 int m_ShowMask;
180 void GetTimeRange(CTime &oldest,CTime &latest);
181 virtual void ContextMenuAction(int cmd,int FirstSelect, int LastSelect)=0;
182 void ReloadHashMap()
184 m_HashMap.clear();
185 g_Git.GetMapHashToFriendName(m_HashMap);
186 m_CurrentBranch=g_Git.GetCurrentBranch();
187 this->m_HeadHash=g_Git.GetHash(CString(_T("HEAD"))).Left(40);
189 void TerminateThread()
191 if(this->m_LoadingThread)
192 AfxTermThread((HINSTANCE)m_LoadingThread->m_hThread);
195 bool IsInWorkingThread()
197 return (AfxGetThread() == m_LoadingThread);
200 void SetStartRef(const CString& StartRef)
202 m_StartRef=StartRef;
205 CString GetStartRef() const {return m_StartRef;}
208 volatile bool m_bExitThread;
209 CWinThread* m_LoadingThread;
210 protected:
211 DECLARE_MESSAGE_MAP()
212 afx_msg void OnDestroy();
213 virtual afx_msg void OnNMCustomdrawLoglist(NMHDR *pNMHDR, LRESULT *pResult);
214 virtual afx_msg void OnLvnGetdispinfoLoglist(NMHDR *pNMHDR, LRESULT *pResult);
215 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
216 afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
217 afx_msg LRESULT OnLoad(WPARAM wParam, LPARAM lParam);
218 void OnNMDblclkLoglist(NMHDR * /*pNMHDR*/, LRESULT *pResult);
219 afx_msg void OnLvnOdfinditemLoglist(NMHDR *pNMHDR, LRESULT *pResult);
220 void PreSubclassWindow();
221 virtual BOOL PreTranslateMessage(MSG* pMsg);
222 static UINT LogThreadEntry(LPVOID pVoid);
223 UINT LogThread();
224 void FetchLastLogInfo();
225 void FetchFullLogInfo(CString &from, CString &to);
226 void FillBackGround(HDC hdc, int Index,CRect &rect);
227 void DrawTagBranch(HDC,CRect &rect,INT_PTR index);
228 void DrawGraph(HDC,CRect &rect,INT_PTR index);
230 BOOL GetShortName(CString ref, CString &shortname,CString prefix);
231 void paintGraphLane(HDC hdc,int laneHeight, int type, int x1, int x2,
232 const COLORREF& col,const COLORREF& activeColor, int top) ;
233 void DrawLine(HDC hdc, int x1, int y1, int x2, int y2){::MoveToEx(hdc,x1,y1,NULL);::LineTo(hdc,x2,y2);}
235 * Save column widths to the registry
237 void SaveColumnWidths(); // save col widths to the registry
239 BOOL IsEntryInDateRange(int i);
241 int GetHeadIndex();
243 bool m_bFilterWithRegex;
246 CXPTheme m_Theme;
247 BOOL m_bVista;
249 HICON m_hModifiedIcon;
250 HICON m_hReplacedIcon;
251 HICON m_hAddedIcon;
252 HICON m_hDeletedIcon;
254 HFONT m_boldFont;
256 CRegDWORD m_regMaxBugIDColWidth;
257 int m_nSearchIndex;
259 void *m_ProcData;
260 CStoreSelection* m_pStoreSelection;
261 MAP_HASH_NAME m_HashMap;
263 CColors m_Colors;
265 CString m_CurrentBranch;
266 CString m_HeadHash;
268 CString m_StartRef; //Ref of the top-commit
270 CString m_ColumnRegKey;
272 COLORREF m_LineColors[Lanes::COLORS_NUM];
273 DWORD m_DateFormat; // DATE_SHORTDATE or DATE_LONGDATE
274 bool m_bRelativeTimes; // Show relative times