1 // RebaseDlg.cpp : implementation file
\r
5 #include "TortoiseProc.h"
\r
6 #include "RebaseDlg.h"
\r
7 #include "AppUtils.h"
\r
11 IMPLEMENT_DYNAMIC(CRebaseDlg, CResizableStandAloneDialog)
\r
13 CRebaseDlg::CRebaseDlg(CWnd* pParent /*=NULL*/)
\r
14 : CResizableStandAloneDialog(CRebaseDlg::IDD, pParent)
\r
16 , m_bSquashAll(FALSE)
\r
19 m_RebaseStage=CHOOSE_BRANCH;
\r
22 CRebaseDlg::~CRebaseDlg()
\r
26 void CRebaseDlg::DoDataExchange(CDataExchange* pDX)
\r
28 CDialog::DoDataExchange(pDX);
\r
29 DDX_Control(pDX, IDC_REBASE_PROGRESS, m_ProgressBar);
\r
30 DDX_Control(pDX, IDC_STATUS_STATIC, m_CtrlStatusText);
\r
31 DDX_Check(pDX, IDC_PICK_ALL, m_bPickAll);
\r
32 DDX_Check(pDX, IDC_SQUASH_ALL, m_bSquashAll);
\r
33 DDX_Check(pDX, IDC_EDIT_ALL, m_bEditAll);
\r
34 DDX_Control(pDX, IDC_REBASE_SPLIT, m_wndSplitter);
\r
35 DDX_Control(pDX,IDC_COMMIT_LIST,m_CommitList);
\r
36 DDX_Control(pDX,IDC_REBASE_COMBOXEX_BRANCH, this->m_BranchCtrl);
\r
37 DDX_Control(pDX,IDC_REBASE_COMBOXEX_UPSTREAM, this->m_UpstreamCtrl);
\r
42 BEGIN_MESSAGE_MAP(CRebaseDlg, CResizableStandAloneDialog)
\r
43 ON_BN_CLICKED(IDC_PICK_ALL, &CRebaseDlg::OnBnClickedPickAll)
\r
44 ON_BN_CLICKED(IDC_SQUASH_ALL, &CRebaseDlg::OnBnClickedSquashAll)
\r
45 ON_BN_CLICKED(IDC_EDIT_ALL, &CRebaseDlg::OnBnClickedEditAll)
\r
46 ON_BN_CLICKED(IDC_REBASE_SPLIT, &CRebaseDlg::OnBnClickedRebaseSplit)
\r
48 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_BRANCH, &CRebaseDlg::OnCbnSelchangeBranch)
\r
49 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_UPSTREAM, &CRebaseDlg::OnCbnSelchangeUpstream)
\r
52 void CRebaseDlg::AddRebaseAnchor()
\r
54 AddAnchor(IDC_REBASE_TAB,TOP_LEFT,BOTTOM_RIGHT);
\r
55 AddAnchor(IDC_COMMIT_LIST,TOP_LEFT, TOP_RIGHT);
\r
56 AddAnchor(IDC_REBASE_SPLIT,TOP_LEFT, TOP_RIGHT);
\r
57 AddAnchor(IDC_STATUS_STATIC, BOTTOM_LEFT,BOTTOM_RIGHT);
\r
58 AddAnchor(IDC_REBASE_CONTINUE,BOTTOM_RIGHT);
\r
59 AddAnchor(IDC_REBASE_ABORT, BOTTOM_RIGHT);
\r
60 AddAnchor(IDC_REBASE_PROGRESS,BOTTOM_LEFT, BOTTOM_RIGHT);
\r
61 AddAnchor(IDC_PICK_ALL,TOP_LEFT);
\r
62 AddAnchor(IDC_SQUASH_ALL,TOP_LEFT);
\r
63 AddAnchor(IDC_EDIT_ALL,TOP_LEFT);
\r
64 AddAnchor(IDC_REBASE_COMBOXEX_UPSTREAM,TOP_LEFT);
\r
65 AddAnchor(IDC_REBASE_COMBOXEX_BRANCH,TOP_LEFT);
\r
66 AddAnchor(IDC_REBASE_STATIC_UPSTREAM,TOP_LEFT);
\r
67 AddAnchor(IDC_REBASE_STATIC_BRANCH,TOP_LEFT);
\r
71 BOOL CRebaseDlg::OnInitDialog()
\r
73 CResizableStandAloneDialog::OnInitDialog();
\r
76 //IDC_REBASE_DUMY_TAB
\r
78 GetClientRect(m_DlgOrigRect);
\r
79 m_CommitList.GetClientRect(m_CommitListOrigRect);
\r
81 CWnd *pwnd=this->GetDlgItem(IDC_REBASE_DUMY_TAB);
\r
82 pwnd->GetWindowRect(&rectDummy);
\r
85 rectDummy.bottom-=20;
\r
90 if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_REBASE_TAB))
\r
92 TRACE0("Failed to create output tab window\n");
\r
93 return FALSE; // fail to create
\r
95 m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);
\r
96 // Create output panes:
\r
97 //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
\r
98 const DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;
\r
100 if (! this->m_FileListCtrl.Create(dwStyle,rectDummy,&this->m_ctrlTabCtrl,0) )
\r
102 TRACE0("Failed to create output windows\n");
\r
103 return FALSE; // fail to create
\r
106 if( ! this->m_LogMessageCtrl.Create(_T("Scintilla"),_T("source"),0,rectDummy,&m_ctrlTabCtrl,0,0) )
\r
108 TRACE0("Failed to create log message control");
\r
112 m_tooltips.Create(this);
\r
114 m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS , _T("RebaseDlg"));
\r
116 m_ctrlTabCtrl.AddTab(&m_FileListCtrl,_T("Conflict File"));
\r
117 m_ctrlTabCtrl.AddTab(&m_LogMessageCtrl,_T("Commit Message"),1);
\r
121 EnableSaveRestore(_T("RebaseDlg"));
\r
123 DWORD yPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
\r
124 RECT rcDlg, rcLogMsg, rcFileList;
\r
125 GetClientRect(&rcDlg);
\r
126 m_CommitList.GetWindowRect(&rcLogMsg);
\r
127 ScreenToClient(&rcLogMsg);
\r
128 this->m_ctrlTabCtrl.GetWindowRect(&rcFileList);
\r
129 ScreenToClient(&rcFileList);
\r
133 m_wndSplitter.GetWindowRect(&rectSplitter);
\r
134 ScreenToClient(&rectSplitter);
\r
135 int delta = yPos - rectSplitter.top;
\r
136 if ((rcLogMsg.bottom + delta > rcLogMsg.top)&&(rcLogMsg.bottom + delta < rcFileList.bottom - 30))
\r
138 m_wndSplitter.SetWindowPos(NULL, 0, yPos, 0, 0, SWP_NOSIZE);
\r
143 if( this->m_RebaseStage == CHOOSE_BRANCH)
\r
145 this->LoadBranchInfo();
\r
149 this->m_BranchCtrl.EnableWindow(FALSE);
\r
150 this->m_UpstreamCtrl.EnableWindow(FALSE);
\r
153 m_CommitList.m_IsIDReplaceAction = TRUE;
\r
154 m_CommitList.m_IsOldFirst = TRUE;
\r
155 m_CommitList.m_IsRebaseReplaceGraph = TRUE;
\r
157 m_CommitList.DeleteAllItems();
\r
158 m_CommitList.InsertGitColumn();
\r
163 // CRebaseDlg message handlers
\r
165 void CRebaseDlg::OnBnClickedPickAll()
\r
167 // TODO: Add your control notification handler code here
\r
168 this->UpdateData();
\r
169 if(this->m_bPickAll)
\r
170 this->SetAllRebaseAction(CTGitPath::LOGACTIONS_REBASE_PICK);
\r
172 this->m_bEditAll=FALSE;
\r
173 this->m_bSquashAll=FALSE;
\r
174 this->UpdateData(FALSE);
\r
178 void CRebaseDlg::OnBnClickedSquashAll()
\r
180 // TODO: Add your control notification handler code here
\r
181 this->UpdateData();
\r
182 if(this->m_bSquashAll)
\r
183 this->SetAllRebaseAction(CTGitPath::LOGACTIONS_REBASE_SQUASH);
\r
185 this->m_bEditAll=FALSE;
\r
186 this->m_bPickAll=FALSE;
\r
187 this->UpdateData(FALSE);
\r
191 void CRebaseDlg::OnBnClickedEditAll()
\r
193 // TODO: Add your control notification handler code here
\r
194 this->UpdateData();
\r
195 if( this->m_bEditAll )
\r
196 this->SetAllRebaseAction(CTGitPath::LOGACTIONS_REBASE_EDIT);
\r
198 this->m_bPickAll=FALSE;
\r
199 this->m_bSquashAll=FALSE;
\r
200 this->UpdateData(FALSE);
\r
204 void CRebaseDlg::SetAllRebaseAction(int action)
\r
206 for(int i=0;i<this->m_CommitList.m_logEntries.size();i++)
\r
208 m_CommitList.m_logEntries[i].m_Action=action;
\r
210 m_CommitList.Invalidate();
\r
213 void CRebaseDlg::OnBnClickedRebaseSplit()
\r
215 this->UpdateData();
\r
216 // TODO: Add your control notification handler code here
\r
219 LRESULT CRebaseDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
\r
223 if (wParam == IDC_REBASE_SPLIT)
\r
225 SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
\r
226 DoSize(pHdr->delta);
\r
231 return __super::DefWindowProc(message, wParam, lParam);
\r
234 void CRebaseDlg::DoSize(int delta)
\r
237 this->RemoveAllAnchors();
\r
239 CSplitterControl::ChangeHeight(GetDlgItem(IDC_COMMIT_LIST), delta, CW_TOPALIGN);
\r
240 //CSplitterControl::ChangeHeight(GetDlgItem(), delta, CW_TOPALIGN);
\r
241 CSplitterControl::ChangeHeight(GetDlgItem(IDC_REBASE_TAB), -delta, CW_BOTTOMALIGN);
\r
242 //CSplitterControl::ChangeHeight(GetDlgItem(), -delta, CW_BOTTOMALIGN);
\r
243 CSplitterControl::ChangePos(GetDlgItem(IDC_SQUASH_ALL),0,delta);
\r
244 CSplitterControl::ChangePos(GetDlgItem(IDC_PICK_ALL),0,delta);
\r
245 CSplitterControl::ChangePos(GetDlgItem(IDC_EDIT_ALL),0,delta);
\r
247 this->AddRebaseAnchor();
\r
248 // adjust the minimum size of the dialog to prevent the resizing from
\r
249 // moving the list control too far down.
\r
251 m_CommitList.GetClientRect(rcLogMsg);
\r
252 SetMinTrackSize(CSize(m_DlgOrigRect.Width(), m_DlgOrigRect.Height()-m_CommitListOrigRect.Height()+rcLogMsg.Height()));
\r
254 SetSplitterRange();
\r
255 // m_CommitList.Invalidate();
\r
257 // GetDlgItem(IDC_LOGMESSAGE)->Invalidate();
\r
259 this->m_ctrlTabCtrl.Invalidate();
\r
260 this->m_CommitList.Invalidate();
\r
261 this->m_FileListCtrl.Invalidate();
\r
262 this->m_LogMessageCtrl.Invalidate();
\r
266 void CRebaseDlg::SetSplitterRange()
\r
268 if ((m_CommitList)&&(m_ctrlTabCtrl))
\r
271 m_CommitList.GetWindowRect(rcTop);
\r
272 ScreenToClient(rcTop);
\r
274 m_ctrlTabCtrl.GetWindowRect(rcMiddle);
\r
275 ScreenToClient(rcMiddle);
\r
276 if (rcMiddle.Height() && rcMiddle.Width())
\r
277 m_wndSplitter.SetRange(rcTop.top+60, rcMiddle.bottom-80);
\r
281 void CRebaseDlg::OnSize(UINT nType,int cx, int cy)
\r
283 // first, let the resizing take place
\r
284 __super::OnSize(nType, cx, cy);
\r
287 SetSplitterRange();
\r
290 void CRebaseDlg::SaveSplitterPos()
\r
294 CRegDWORD regPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
\r
296 m_wndSplitter.GetWindowRect(&rectSplitter);
\r
297 ScreenToClient(&rectSplitter);
\r
298 regPos = rectSplitter.top;
\r
302 void CRebaseDlg::LoadBranchInfo()
\r
304 m_BranchCtrl.SetMaxHistoryItems(0x7FFFFFFF);
\r
305 m_UpstreamCtrl.SetMaxHistoryItems(0x7FFFFFFF);
\r
307 STRING_VECTOR list;
\r
310 g_Git.GetBranchList(list,¤t,CGit::BRANCH_ALL);
\r
311 m_BranchCtrl.AddString(list);
\r
312 m_UpstreamCtrl.AddString(list);
\r
314 m_BranchCtrl.SetCurSel(current);
\r
316 AddBranchToolTips(&m_BranchCtrl);
\r
317 AddBranchToolTips(&m_UpstreamCtrl);
\r
321 void CRebaseDlg::OnCbnSelchangeBranch()
\r
326 void CRebaseDlg::OnCbnSelchangeUpstream()
\r
331 void CRebaseDlg::FetchLogList()
\r
333 m_CommitList.Clear();
\r
334 this->m_CommitList.FillGitLog(NULL,0,&m_UpstreamCtrl.GetString(),&m_BranchCtrl.GetString());
\r
335 if( m_CommitList.GetItemCount() == 0 )
\r
336 m_CommitList.ShowText(_T("Nothing Rebase"));
\r
338 CString hash=g_Git.GetHash(m_UpstreamCtrl.GetString());
\r
340 if(m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash.size() >=0 )
\r
342 if(hash == m_CommitList.m_logEntries[m_CommitList.m_logEntries.size()-1].m_ParentHash[0])
\r
344 m_CommitList.Clear();
\r
345 m_CommitList.ShowText(_T("Nothing Rebase"));
\r
350 AddBranchToolTips(&this->m_BranchCtrl);
\r
351 AddBranchToolTips(&this->m_UpstreamCtrl);
\r
353 for(int i=0;i<m_CommitList.m_logEntries.size();i++)
\r
355 m_CommitList.m_logEntries[i].m_Action = CTGitPath::LOGACTIONS_REBASE_PICK;
\r
358 m_CommitList.Invalidate();
\r
361 void CRebaseDlg::AddBranchToolTips(CHistoryCombo *pBranch)
\r
365 CString text=pBranch->GetString();
\r
368 g_Git.GetLog(data,text,NULL,1,0);
\r
370 rev.ParserFromLog(data);
\r
371 tooltip.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
\r
374 CAppUtils::FormatDateAndTime(rev.m_AuthorDate,DATE_LONGDATE),
\r
378 pBranch->DisableTooltip();
\r
379 this->m_tooltips.AddTool(pBranch->GetComboBoxCtrl(),tooltip);
\r
383 BOOL CRebaseDlg::PreTranslateMessage(MSG*pMsg)
\r
385 m_tooltips.RelayEvent(pMsg);
\r
386 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
\r