Fixed issue #2082: RebaseDlg: Reorder commits via drag'n'drop
[TortoiseGit.git] / src / TortoiseProc / RebaseDlg.h
blob1afec863f53ca6070738ee6e04c549e8b04fc81e
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2017 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #pragma once
21 #include "StandAloneDlg.h"
22 #include "GitStatusListCtrl.h"
23 #include "SciEdit.h"
24 #include "SplitterControl.h"
25 #include "HistoryCombo.h"
26 #include "GitLogList.h"
27 #include "MenuButton.h"
28 #include "ProjectProperties.h"
29 #include "AppUtils.h"
31 // CRebaseDlg dialog
32 #define IDC_REBASE_TAB 0x1000000
34 #define REBASE_TAB_CONFLICT 0
35 #define REBASE_TAB_MESSAGE 1
36 #define REBASE_TAB_LOG 2
38 #define MSG_REBASE_UPDATE_UI (WM_USER+151)
40 class CRebaseDlg : public CResizableStandAloneDialog
42 DECLARE_DYNAMIC(CRebaseDlg)
44 public:
45 CRebaseDlg(CWnd* pParent = nullptr); // standard constructor
46 virtual ~CRebaseDlg();
48 // Dialog Data
49 enum { IDD = IDD_REBASE };
51 enum REBASE_STAGE
53 CHOOSE_BRANCH,
54 CHOOSE_COMMIT_PICK_MODE,
55 REBASE_START,
56 REBASE_CONTINUE,
57 REBASE_ABORT,
58 REBASE_FINISH,
59 REBASE_CONFLICT,
60 REBASE_EDIT,
61 REBASE_SQUASH_EDIT,
62 REBASE_SQUASH_CONFLICT,
63 REBASE_DONE,
64 REBASE_ERROR,
67 protected:
68 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
69 virtual BOOL OnInitDialog();
70 DECLARE_MESSAGE_MAP()
71 virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
72 virtual HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
73 LRESULT OnRebaseUpdateUI(WPARAM wParam, LPARAM lParam);
74 void DoSize(int delta);
75 void AddRebaseAnchor();
76 void RemoveAnchor();
78 void SetSplitterRange();
79 void SaveSplitterPos();
81 void LoadBranchInfo();
82 void FetchLogList();
83 void SetAllRebaseAction(int action);
84 void OnCancel();
86 CRect m_DlgOrigRect;
87 CRect m_CommitListOrigRect;
88 CString m_sStatusText;
89 bool m_bStatusWarning;
90 BOOL PreTranslateMessage(MSG* pMsg);
91 bool LogListHasFocus(HWND hwnd);
92 bool LogListHasMenuItem(int i);
94 CSciEdit m_wndOutputRebase;
95 void SetContinueButtonText();
96 void SetControlEnable();
97 void UpdateProgress();
98 void UpdateCurrentStatus();
99 void ListConflictFile(bool noStoreScrollPosition);
100 int RunGitCmdRetryOrAbort(const CString& cmd);
101 int DoRebase();
102 afx_msg LRESULT OnGitStatusListCtrlNeedsRefresh(WPARAM, LPARAM);
103 void Refresh();
104 volatile LONG m_bThreadRunning;
105 int RebaseThread();
106 static UINT RebaseThreadEntry(LPVOID pVoid) { return reinterpret_cast<CRebaseDlg*>(pVoid)->RebaseThread(); };
107 BOOL IsEnd();
109 int IsCommitEmpty(const CGitHash& hash);
111 BOOL m_IsFastForward;
113 CGitHash m_OrigBranchHash;
114 CGitHash m_OrigUpstreamHash;
115 CString m_OrigHEADBranch;
116 CGitHash m_OrigHEADHash;
118 ProjectProperties m_ProjectProperties;
120 int VerifyNoConflict();
121 CString GetRebaseModeName(int rebasemode);
123 CString m_SquashMessage;
124 struct SquashFirstMetaData
126 CString name;
127 CString email;
128 CTime time;
129 bool set = false;
131 SquashFirstMetaData()
132 : set(false)
136 SquashFirstMetaData(GitRev* rev)
137 : set(true)
139 name = rev->GetAuthorName();
140 email = rev->GetAuthorEmail();
141 time = rev->GetAuthorDate();
144 void UpdateDate(GitRev* rev)
146 ATLASSERT(set);
147 time = rev->GetAuthorDate();
150 void Empty()
152 set = false;
153 name.Empty();
154 email.Empty();
155 time = 0;
158 CString GetAuthor() const
160 if (!set)
161 return CString();
162 CString temp;
163 temp.Format(L"%s <%s>", (LPCTSTR)name, (LPCTSTR)email);
164 return temp;
167 CString GetAsParam(bool now) const
169 if (!set)
170 return CString();
172 CString date = time.Format(L"%Y-%m-%dT%H:%M:%S");
173 if (now)
174 date = CAppUtils::GetMsysgitVersion() > 0x02010000 ? L"\"now\"" : L"\"\"";
176 CString temp;
177 temp.Format(L"--date=%s --author=\"%s\" ", (LPCTSTR)date, (LPCTSTR)GetAuthor());
178 return temp;
180 } m_SquashFirstMetaData;
181 int m_iSquashdate;
183 int CheckNextCommitIsSquash();
184 int GetCurrentCommitID();
185 int FinishRebase();
186 void RewriteNotes();
188 CMenuButton m_PostButton;
190 afx_msg void OnBnClickedPickAll();
191 afx_msg void OnBnClickedSquashAll();
192 afx_msg void OnBnClickedEditAll();
193 afx_msg void OnBnClickedRebaseSplit();
194 afx_msg void OnSize(UINT nType, int cx, int cy);
195 afx_msg void OnCbnSelchangeBranch();
196 afx_msg void OnCbnSelchangeUpstream();
197 afx_msg void OnBnClickedContinue();
198 afx_msg void OnBnClickedAbort();
199 afx_msg void OnLvnItemchangedLoglist(NMHDR *pNMHDR, LRESULT *pResult);
200 afx_msg void OnSysColorChange();
201 afx_msg LRESULT OnThemeChanged();
202 void FillLogMessageCtrl();
204 CProgressCtrl m_ProgressBar;
205 CStatic m_CtrlStatusText;
207 BOOL m_bForce;
208 BOOL m_bAddCherryPickedFrom;
209 BOOL m_bAutoSkipFailedCommit;
210 bool m_bRebaseAutoEnd;
212 public:
213 CStringArray m_PostButtonTexts;
214 CGitLogList m_CommitList;
216 CString m_Upstream;
217 CString m_Branch;
218 CString m_Onto;
220 BOOL m_IsCherryPick;
221 bool m_bRebaseAutoStart;
222 BOOL m_bPreserveMerges;
223 protected:
224 CSplitterControl m_wndSplitter;
225 CMFCTabCtrl m_ctrlTabCtrl;
226 CGitStatusListCtrl m_FileListCtrl;
227 CSciEdit m_LogMessageCtrl;
229 CHistoryCombo m_BranchCtrl;
230 CHistoryCombo m_UpstreamCtrl;
232 CMenuButton m_SplitAllOptions;
234 BOOL m_bSplitCommit;
236 REBASE_STAGE m_RebaseStage;
237 bool m_bFinishedRebase;
238 bool m_bStashed;
240 std::unordered_map<CGitHash, CGitHash> m_rewrittenCommitsMap;
241 std::vector<CGitHash> m_forRewrite;
242 std::unordered_map<CGitHash, GIT_REV_LIST> m_droppedCommitsMap;
243 std::vector<CGitHash> m_currentCommits;
245 void AddBranchToolTips(CHistoryCombo *pBranch);
246 void AddLogString(CString str);
247 int StartRebase();
248 int CheckRebaseCondition();
249 void CheckRestoreStash();
250 int m_CurrentRebaseIndex;
251 int GoNext();
252 void ResetParentForSquash(const CString& commitMessage);
253 void CleanUpRebaseActiveFolder();
254 afx_msg void OnBnClickedButtonReverse();
255 afx_msg void OnBnClickedButtonBrowse();
256 afx_msg void OnBnClickedRebaseCheckForce();
257 afx_msg void OnBnClickedCheckCherryPickedFrom();
258 afx_msg void OnBnClickedRebasePostButton();
259 afx_msg void OnBnClickedSplitAllOptions();
260 afx_msg void OnBnClickedButtonUp();
261 afx_msg void OnBnClickedButtonDown();
262 afx_msg void OnHelp();
264 afx_msg LRESULT OnTaskbarBtnCreated(WPARAM wParam, LPARAM lParam);
265 CComPtr<ITaskbarList3> m_pTaskbarList;
267 afx_msg LRESULT OnRebaseActionMessage(WPARAM wParam, LPARAM lParam);
268 afx_msg LRESULT OnCommitsReordered(WPARAM wParam, LPARAM lParam);
269 afx_msg void OnBnClickedRebaseSplitCommit();
270 afx_msg void OnBnClickedButtonOnto();
271 afx_msg void OnBnClickedButtonAdd();