RebaseDlg: Show Commit List at oldest is first
[TortoiseGit.git] / src / TortoiseProc / RebaseDlg.cpp
blob636c30f311e09e703cf1bb7319a70bafbd3b65b8
1 // RebaseDlg.cpp : implementation file
2 //
4 #include "stdafx.h"
5 #include "TortoiseProc.h"
6 #include "RebaseDlg.h"
7 #include "AppUtils.h"
9 // CRebaseDlg dialog
11 IMPLEMENT_DYNAMIC(CRebaseDlg, CResizableStandAloneDialog)
13 CRebaseDlg::CRebaseDlg(CWnd* pParent /*=NULL*/)
14 : CResizableStandAloneDialog(CRebaseDlg::IDD, pParent)
15 , m_bPickAll(FALSE)
16 , m_bSquashAll(FALSE)
17 , m_bEditAll(FALSE)
19 m_RebaseStage=CHOOSE_BRANCH;
22 CRebaseDlg::~CRebaseDlg()
26 void CRebaseDlg::DoDataExchange(CDataExchange* pDX)
28 CDialog::DoDataExchange(pDX);
29 DDX_Control(pDX, IDC_REBASE_PROGRESS, m_ProgressBar);
30 DDX_Control(pDX, IDC_STATUS_STATIC, m_CtrlStatusText);
31 DDX_Check(pDX, IDC_PICK_ALL, m_bPickAll);
32 DDX_Check(pDX, IDC_SQUASH_ALL, m_bSquashAll);
33 DDX_Check(pDX, IDC_EDIT_ALL, m_bEditAll);
34 DDX_Control(pDX, IDC_REBASE_SPLIT, m_wndSplitter);
35 DDX_Control(pDX,IDC_COMMIT_LIST,m_CommitList);
36 DDX_Control(pDX,IDC_REBASE_COMBOXEX_BRANCH, this->m_BranchCtrl);
37 DDX_Control(pDX,IDC_REBASE_COMBOXEX_UPSTREAM, this->m_UpstreamCtrl);
42 BEGIN_MESSAGE_MAP(CRebaseDlg, CResizableStandAloneDialog)
43 ON_BN_CLICKED(IDC_PICK_ALL, &CRebaseDlg::OnBnClickedPickAll)
44 ON_BN_CLICKED(IDC_SQUASH_ALL, &CRebaseDlg::OnBnClickedSquashAll)
45 ON_BN_CLICKED(IDC_EDIT_ALL, &CRebaseDlg::OnBnClickedEditAll)
46 ON_BN_CLICKED(IDC_REBASE_SPLIT, &CRebaseDlg::OnBnClickedRebaseSplit)
47 ON_WM_SIZE()
48 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_BRANCH, &CRebaseDlg::OnCbnSelchangeBranch)
49 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_UPSTREAM, &CRebaseDlg::OnCbnSelchangeUpstream)
50 END_MESSAGE_MAP()
52 void CRebaseDlg::AddRebaseAnchor()
54 AddAnchor(IDC_REBASE_TAB,TOP_LEFT,BOTTOM_RIGHT);
55 AddAnchor(IDC_COMMIT_LIST,TOP_LEFT, TOP_RIGHT);
56 AddAnchor(IDC_REBASE_SPLIT,TOP_LEFT, TOP_RIGHT);
57 AddAnchor(IDC_STATUS_STATIC, BOTTOM_LEFT,BOTTOM_RIGHT);
58 AddAnchor(IDC_REBASE_CONTINUE,BOTTOM_RIGHT);
59 AddAnchor(IDC_REBASE_ABORT, BOTTOM_RIGHT);
60 AddAnchor(IDC_REBASE_PROGRESS,BOTTOM_LEFT, BOTTOM_RIGHT);
61 AddAnchor(IDC_PICK_ALL,TOP_LEFT);
62 AddAnchor(IDC_SQUASH_ALL,TOP_LEFT);
63 AddAnchor(IDC_EDIT_ALL,TOP_LEFT);
64 AddAnchor(IDC_REBASE_COMBOXEX_UPSTREAM,TOP_LEFT);
65 AddAnchor(IDC_REBASE_COMBOXEX_BRANCH,TOP_LEFT);
66 AddAnchor(IDC_REBASE_STATIC_UPSTREAM,TOP_LEFT);
67 AddAnchor(IDC_REBASE_STATIC_BRANCH,TOP_LEFT);
71 BOOL CRebaseDlg::OnInitDialog()
73 CResizableStandAloneDialog::OnInitDialog();
75 CRect rectDummy;
76 //IDC_REBASE_DUMY_TAB
78 GetClientRect(m_DlgOrigRect);
79 m_CommitList.GetClientRect(m_CommitListOrigRect);
81 CWnd *pwnd=this->GetDlgItem(IDC_REBASE_DUMY_TAB);
82 pwnd->GetWindowRect(&rectDummy);
84 rectDummy.top-=20;
85 rectDummy.bottom-=20;
87 rectDummy.left-=5;
88 rectDummy.right-=5;
90 if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_REBASE_TAB))
92 TRACE0("Failed to create output tab window\n");
93 return FALSE; // fail to create
95 m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);
96 // Create output panes:
97 //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
98 const DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;
100 if (! this->m_FileListCtrl.Create(dwStyle,rectDummy,&this->m_ctrlTabCtrl,0) )
102 TRACE0("Failed to create output windows\n");
103 return FALSE; // fail to create
106 if( ! this->m_LogMessageCtrl.Create(_T("Scintilla"),_T("source"),0,rectDummy,&m_ctrlTabCtrl,0,0) )
108 TRACE0("Failed to create log message control");
109 return FALSE;
112 m_tooltips.Create(this);
114 m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS , _T("RebaseDlg"));
116 m_ctrlTabCtrl.AddTab(&m_FileListCtrl,_T("Conflict File"));
117 m_ctrlTabCtrl.AddTab(&m_LogMessageCtrl,_T("Commit Message"),1);
118 AddRebaseAnchor();
121 EnableSaveRestore(_T("RebaseDlg"));
123 DWORD yPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
124 RECT rcDlg, rcLogMsg, rcFileList;
125 GetClientRect(&rcDlg);
126 m_CommitList.GetWindowRect(&rcLogMsg);
127 ScreenToClient(&rcLogMsg);
128 this->m_ctrlTabCtrl.GetWindowRect(&rcFileList);
129 ScreenToClient(&rcFileList);
130 if (yPos)
132 RECT rectSplitter;
133 m_wndSplitter.GetWindowRect(&rectSplitter);
134 ScreenToClient(&rectSplitter);
135 int delta = yPos - rectSplitter.top;
136 if ((rcLogMsg.bottom + delta > rcLogMsg.top)&&(rcLogMsg.bottom + delta < rcFileList.bottom - 30))
138 m_wndSplitter.SetWindowPos(NULL, 0, yPos, 0, 0, SWP_NOSIZE);
139 DoSize(delta);
143 if( this->m_RebaseStage == CHOOSE_BRANCH)
145 this->LoadBranchInfo();
147 }else
149 this->m_BranchCtrl.EnableWindow(FALSE);
150 this->m_UpstreamCtrl.EnableWindow(FALSE);
153 m_CommitList.m_IsIDReplaceAction = TRUE;
154 m_CommitList.m_IsOldFirst = TRUE;
156 m_CommitList.DeleteAllItems();
157 m_CommitList.InsertGitColumn();
159 FetchLogList();
160 return TRUE;
162 // CRebaseDlg message handlers
164 void CRebaseDlg::OnBnClickedPickAll()
166 // TODO: Add your control notification handler code here
169 void CRebaseDlg::OnBnClickedSquashAll()
171 // TODO: Add your control notification handler code here
174 void CRebaseDlg::OnBnClickedEditAll()
176 // TODO: Add your control notification handler code here
179 void CRebaseDlg::OnBnClickedRebaseSplit()
181 // TODO: Add your control notification handler code here
184 LRESULT CRebaseDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
186 switch (message) {
187 case WM_NOTIFY:
188 if (wParam == IDC_REBASE_SPLIT)
190 SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
191 DoSize(pHdr->delta);
193 break;
196 return __super::DefWindowProc(message, wParam, lParam);
199 void CRebaseDlg::DoSize(int delta)
202 this->RemoveAllAnchors();
204 CSplitterControl::ChangeHeight(GetDlgItem(IDC_COMMIT_LIST), delta, CW_TOPALIGN);
205 //CSplitterControl::ChangeHeight(GetDlgItem(), delta, CW_TOPALIGN);
206 CSplitterControl::ChangeHeight(GetDlgItem(IDC_REBASE_TAB), -delta, CW_BOTTOMALIGN);
207 //CSplitterControl::ChangeHeight(GetDlgItem(), -delta, CW_BOTTOMALIGN);
208 CSplitterControl::ChangePos(GetDlgItem(IDC_SQUASH_ALL),0,delta);
209 CSplitterControl::ChangePos(GetDlgItem(IDC_PICK_ALL),0,delta);
210 CSplitterControl::ChangePos(GetDlgItem(IDC_EDIT_ALL),0,delta);
212 this->AddRebaseAnchor();
213 // adjust the minimum size of the dialog to prevent the resizing from
214 // moving the list control too far down.
215 CRect rcLogMsg;
216 m_CommitList.GetClientRect(rcLogMsg);
217 SetMinTrackSize(CSize(m_DlgOrigRect.Width(), m_DlgOrigRect.Height()-m_CommitListOrigRect.Height()+rcLogMsg.Height()));
219 SetSplitterRange();
220 // m_CommitList.Invalidate();
222 // GetDlgItem(IDC_LOGMESSAGE)->Invalidate();
224 this->m_ctrlTabCtrl.Invalidate();
225 this->m_CommitList.Invalidate();
226 this->m_FileListCtrl.Invalidate();
227 this->m_LogMessageCtrl.Invalidate();
231 void CRebaseDlg::SetSplitterRange()
233 if ((m_CommitList)&&(m_ctrlTabCtrl))
235 CRect rcTop;
236 m_CommitList.GetWindowRect(rcTop);
237 ScreenToClient(rcTop);
238 CRect rcMiddle;
239 m_ctrlTabCtrl.GetWindowRect(rcMiddle);
240 ScreenToClient(rcMiddle);
241 if (rcMiddle.Height() && rcMiddle.Width())
242 m_wndSplitter.SetRange(rcTop.top+60, rcMiddle.bottom-80);
246 void CRebaseDlg::OnSize(UINT nType,int cx, int cy)
248 // first, let the resizing take place
249 __super::OnSize(nType, cx, cy);
251 //set range
252 SetSplitterRange();
255 void CRebaseDlg::SaveSplitterPos()
257 if (!IsIconic())
259 CRegDWORD regPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
260 RECT rectSplitter;
261 m_wndSplitter.GetWindowRect(&rectSplitter);
262 ScreenToClient(&rectSplitter);
263 regPos = rectSplitter.top;
267 void CRebaseDlg::LoadBranchInfo()
269 m_BranchCtrl.SetMaxHistoryItems(0x7FFFFFFF);
270 m_UpstreamCtrl.SetMaxHistoryItems(0x7FFFFFFF);
272 STRING_VECTOR list;
273 list.clear();
274 int current;
275 g_Git.GetBranchList(list,&current,CGit::BRANCH_ALL);
276 m_BranchCtrl.AddString(list);
277 m_UpstreamCtrl.AddString(list);
279 m_BranchCtrl.SetCurSel(current);
281 AddBranchToolTips(&m_BranchCtrl);
282 AddBranchToolTips(&m_UpstreamCtrl);
286 void CRebaseDlg::OnCbnSelchangeBranch()
288 FetchLogList();
291 void CRebaseDlg::OnCbnSelchangeUpstream()
293 FetchLogList();
296 void CRebaseDlg::FetchLogList()
298 m_CommitList.Clear();
299 this->m_CommitList.FillGitLog(NULL,0,&m_UpstreamCtrl.GetString(),&m_BranchCtrl.GetString());
300 if( m_CommitList.GetItemCount() == 0 )
301 m_CommitList.ShowText(_T("Nothing Rebase"));
303 CString hash=g_Git.GetHash(m_UpstreamCtrl.GetString());
305 if(m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash.size() >=0 )
307 if(hash == m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash[0])
309 m_CommitList.Clear();
310 m_CommitList.ShowText(_T("Nothing Rebase"));
314 m_CommitList.Invalidate();
316 m_tooltips.Pop();
317 AddBranchToolTips(&this->m_BranchCtrl);
318 AddBranchToolTips(&this->m_UpstreamCtrl);
322 void CRebaseDlg::AddBranchToolTips(CHistoryCombo *pBranch)
324 if(pBranch)
326 CString text=pBranch->GetString();
327 CString tooltip;
328 BYTE_VECTOR data;
329 g_Git.GetLog(data,text,NULL,1,0);
330 GitRev rev;
331 rev.ParserFromLog(data);
332 tooltip.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
333 rev.m_CommitHash,
334 rev.m_AuthorName,
335 CAppUtils::FormatDateAndTime(rev.m_AuthorDate,DATE_LONGDATE),
336 rev.m_Subject,
337 rev.m_Body);
339 pBranch->DisableTooltip();
340 this->m_tooltips.AddTool(pBranch->GetComboBoxCtrl(),tooltip);
344 BOOL CRebaseDlg::PreTranslateMessage(MSG*pMsg)
346 m_tooltips.RelayEvent(pMsg);
347 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);