1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2013, 2015-2017 - TortoiseGit
4 // Copyright (C) 2003-2008, 2014 - 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.
22 // TortoiseGitBlameView.h : interface of the CTortoiseGitBlameView class
28 #include "Scintilla.h"
33 #include "GitBlameLogList.h"
34 #include "TortoiseGitBlameData.h"
37 const COLORREF black
= RGB(0,0,0);
38 const COLORREF white
= RGB(0xff,0xff,0xff);
39 const COLORREF red
= RGB(0xFF, 0, 0);
40 const COLORREF offWhite
= RGB(0xFF, 0xFB, 0xF0);
41 const COLORREF darkGreen
= RGB(0, 0x80, 0);
42 const COLORREF darkBlue
= RGB(0, 0, 0x80);
43 const COLORREF lightBlue
= RGB(0xA6, 0xCA, 0xF0);
44 const int blockSize
= 128 * 1024;
47 #define HEADER_HEIGHT 18
48 #define LOCATOR_WIDTH 10
50 #define MAX_LOG_LENGTH 2000
54 #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
57 #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
60 class CSciEditBlame
: public CSciEdit
62 DECLARE_DYNAMIC(CSciEditBlame
)
64 afx_msg
void OnKeyDown(UINT nChar
, UINT nRepCnt
, UINT nFlags
)
70 if ((Call(SCI_AUTOCACTIVE
)==0)&&(Call(SCI_CALLTIPACTIVE
)==0))
72 ::SendMessage(::AfxGetApp()->GetMainWnd()->m_hWnd
, WM_CLOSE
, 0, 0);
78 CWnd::OnKeyDown(nChar
, nRepCnt
, nFlags
);
82 class CTortoiseGitBlameView
: public CView
86 // needs to start with 1, since 0 is the return value if *nothing* is clicked on in the context menu
88 ID_COMPAREWITHPREVIOUS
,
90 ID_COPYHASHTOCLIPBOARD
,
94 protected: // create from serialization only
95 CTortoiseGitBlameView();
96 DECLARE_DYNCREATE(CTortoiseGitBlameView
)
100 CTortoiseGitBlameDoc
* GetDocument() const;
101 int GetEncode(unsigned char * buffer
, int size
, int *bomoffset
);
107 virtual void OnDraw(CDC
* pDC
); // overridden to draw this view
108 virtual BOOL
OnEraseBkgnd(CDC
* pDC
);
109 virtual BOOL
PreCreateWindow(CREATESTRUCT
& cs
);
111 virtual BOOL
OnPreparePrinting(CPrintInfo
* pInfo
);
112 virtual void OnBeginPrinting(CDC
* pDC
, CPrintInfo
* pInfo
);
113 virtual void OnEndPrinting(CDC
* pDC
, CPrintInfo
* pInfo
);
117 virtual ~CTortoiseGitBlameView();
119 virtual void AssertValid() const;
120 virtual void Dump(CDumpContext
& dc
) const;
125 // Generated message map functions
127 BOOL
PreTranslateMessage(MSG
* pMsg
);
128 afx_msg
void OnSysColorChange();
129 afx_msg
void OnChangeEncode(UINT nID
);
130 afx_msg
void OnEditFind();
131 afx_msg
void OnEditGoto();
132 afx_msg
void OnFindNext();
133 afx_msg
void OnFindPrev();
134 afx_msg
void OnFilePrintPreview();
135 afx_msg
void OnRButtonUp(UINT nFlags
, CPoint point
);
136 afx_msg
int OnCreate(LPCREATESTRUCT lpcs
);
137 afx_msg
void OnSize(UINT nType
, int cx
, int cy
);
138 afx_msg
void OnSciPainted(NMHDR
*, LRESULT
*);
139 afx_msg
void OnLButtonDown(UINT nFlags
,CPoint point
);
140 afx_msg
void OnRButtonDown(UINT nFlags
,CPoint point
){OnLButtonDown(nFlags
,point
);CView::OnRButtonDown(nFlags
,point
);};
141 afx_msg
void OnSciGetBkColor(NMHDR
*, LRESULT
*);
142 afx_msg
void OnMouseHover(UINT nFlags
, CPoint point
);
143 afx_msg
void OnMouseMove(UINT nFlags
, CPoint point
);
144 afx_msg
void OnMouseLeave();
145 afx_msg LRESULT
OnFindDialogMessage(WPARAM wParam
, LPARAM lParam
);
146 afx_msg
void OnViewNext();
147 afx_msg
void OnViewPrev();
148 afx_msg
void OnViewToggleAuthor();
149 afx_msg
void OnUpdateViewToggleAuthor(CCmdUI
*pCmdUI
);
150 afx_msg
void OnViewToggleDate();
151 afx_msg
void OnUpdateViewToggleDate(CCmdUI
*pCmdUI
);
152 afx_msg
void OnViewToggleShowFilename();
153 afx_msg
void OnUpdateViewToggleShowFilename(CCmdUI
*pCmdUI
);
154 afx_msg
void OnViewToggleShowOriginalLineNumber();
155 afx_msg
void OnUpdateViewToggleShowOriginalLineNumber(CCmdUI
*pCmdUI
);
156 afx_msg
void OnViewDetectMovedOrCopiedLinesToggleDisabled();
157 afx_msg
void OnUpdateViewDetectMovedOrCopiedLinesToggleDisabled(CCmdUI
*pCmdUI
);
158 afx_msg
void OnViewDetectMovedOrCopiedLinesToggleWithinFile();
159 afx_msg
void OnUpdateViewDetectMovedOrCopiedLinesToggleWithinFile(CCmdUI
*pCmdUI
);
160 afx_msg
void OnViewDetectMovedOrCopiedLinesToggleFromModifiedFiles();
161 afx_msg
void OnUpdateViewDetectMovedOrCopiedLinesToggleFromModifiedFiles(CCmdUI
*pCmdUI
);
162 afx_msg
void OnViewDetectMovedOrCopiedLinesToggleFromExistingFilesAtFileCreation();
163 afx_msg
void OnUpdateViewDetectMovedOrCopiedLinesToggleFromExistingFilesAtFileCreation(CCmdUI
*pCmdUI
);
164 afx_msg
void OnViewDetectMovedOrCopiedLinesToggleFromExistingFiles();
165 afx_msg
void OnUpdateViewDetectMovedOrCopiedLinesToggleFromExistingFiles(CCmdUI
*pCmdUI
);
166 afx_msg
void OnViewToggleIgnoreWhitespace();
167 afx_msg
void OnUpdateViewToggleIgnoreWhitespace(CCmdUI
*pCmdUI
);
168 afx_msg
void OnViewToggleShowCompleteLog();
169 afx_msg
void OnUpdateViewToggleShowCompleteLog(CCmdUI
*pCmdUI
);
170 afx_msg
void OnViewToggleOnlyFirstParent();
171 afx_msg
void OnUpdateViewToggleOnlyFirstParent(CCmdUI
* pCmdUI
);
172 afx_msg
void OnViewToggleFollowRenames();
173 afx_msg
void OnUpdateViewToggleFollowRenames(CCmdUI
*pCmdUI
);
174 afx_msg
void OnViewToggleColorByAge();
175 afx_msg
void OnUpdateViewToggleColorByAge(CCmdUI
*pCmdUI
);
176 afx_msg
void OnViewToggleLexer();
177 afx_msg
void OnUpdateViewToggleLexer(CCmdUI
*pCmdUI
);
178 afx_msg
void OnViewWrapLongLines();
179 afx_msg
void OnUpdateViewWrapLongLines(CCmdUI
* pCmdUI
);
180 afx_msg
void OnUpdateViewCopyToClipboard(CCmdUI
*pCmdUI
);
181 void OnViewDetectMovedOrCopiedLines(DWORD dwDetectMovedOrCopiedLines
);
182 void ContextMenuAction(int cmd
, GitRev
* pRev
, GIT_REV_LIST
& parentHash
, const std::vector
<CString
>& parentFilename
);
183 void ReloadDocument();
185 DECLARE_MESSAGE_MAP()
187 static UINT m_FindDialogMessage
;
190 void MapLineToLogIndex();
191 void UpdateInfo(int encode
= 0);
192 CString
ResolveCommitFile(int line
);
193 CString
ResolveCommitFile(const CString
& path
);
194 void FocusOn(GitRevLoglist
* pRev
);
196 CSciEditBlame m_TextView
;
210 BOOL bIgnoreAllSpaces
;
214 BOOL m_bShowFilename
;
215 BOOL m_bShowOriginalLineNumber
;
216 DWORD m_dwDetectMovedOrCopiedLines
;
217 BOOL m_bIgnoreWhitespace
;
218 BOOL m_bShowCompleteLog
;
219 BOOL m_bOnlyFirstParent
;
220 BOOL m_bFollowRenames
;
221 BOOL m_bBlameOuputContainsOtherFilenames
;
223 LRESULT
SendEditor(UINT Msg
, WPARAM wParam
=0, LPARAM lParam
=0);
225 void SetAStyle(int style
, COLORREF fore
, COLORREF back
= ::GetSysColor(COLOR_WINDOW
), int size
= -1, const char* face
= nullptr);
227 void InitialiseEditor();
228 LONG
GetBlameWidth();
229 void DrawBlame(HDC hDC
);
230 void DrawLocatorBar(HDC hDC
);
231 void CopyToClipboard();
232 bool DoSearch(CTortoiseGitBlameData::SearchDirection direction
);
233 bool GotoLine(int line
);
234 bool ScrollToLine(long line
);
236 void SetSelectedLine(int line
) { m_SelectedLine
= line
;};
239 CGitHash m_SelectedHash
;
240 CGitHash m_selecteddate
;
243 bool m_bWrapLongLines
;
245 CTortoiseGitBlameData m_data
;
246 std::vector
<int> m_lineToLogIndex
;
248 CLogDataVector
* GetLogData();
254 void SetupLexer(CString filename
);
255 void SetupCppLexer();
256 int GetLineUnderCursor(CPoint point
);
257 COLORREF
GetLineColor(int line
);
258 COLORREF
InterColor(COLORREF c1
, COLORREF c2
, int Slider
);
265 LONG m_filenameWidth
;
266 LONG m_originalLineNumberWidth
;
268 int m_SelectedLine
; ///< zero-based
270 COLORREF m_mouserevcolor
;
271 COLORREF m_mouseauthorcolor
;
272 COLORREF m_selectedrevcolor
;
273 COLORREF m_selectedauthorcolor
;
274 COLORREF m_windowcolor
;
275 COLORREF m_textcolor
;
276 COLORREF m_texthighlightcolor
;
278 CRegStdDWORD m_regOldLinesColor
;
279 CRegStdDWORD m_regNewLinesColor
;
281 CGitBlameLogList
* GetLogList();
283 CFindReplaceDialog
*m_pFindDialog
;
285 #ifdef USE_TEMPFILENAME
289 DWORD m_DateFormat
; // DATE_SHORTDATE or DATE_LONGDATE
290 bool m_bRelativeTimes
; // Show relative times
302 #ifndef _DEBUG // debug version in TortoiseGitBlameView.cpp
303 inline CTortoiseGitBlameDoc
* CTortoiseGitBlameView::GetDocument() const
304 { return reinterpret_cast<CTortoiseGitBlameDoc
*>(m_pDocument
); }