1 // RebaseDlg.cpp : implementation file
5 #include "TortoiseProc.h"
11 IMPLEMENT_DYNAMIC(CRebaseDlg
, CResizableStandAloneDialog
)
13 CRebaseDlg::CRebaseDlg(CWnd
* pParent
/*=NULL*/)
14 : CResizableStandAloneDialog(CRebaseDlg::IDD
, pParent
)
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
)
48 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_BRANCH
, &CRebaseDlg::OnCbnSelchangeBranch
)
49 ON_CBN_SELCHANGE(IDC_REBASE_COMBOXEX_UPSTREAM
, &CRebaseDlg::OnCbnSelchangeUpstream
)
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();
78 GetClientRect(m_DlgOrigRect
);
79 m_CommitList
.GetClientRect(m_CommitListOrigRect
);
81 CWnd
*pwnd
=this->GetDlgItem(IDC_REBASE_DUMY_TAB
);
82 pwnd
->GetWindowRect(&rectDummy
);
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");
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);
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
);
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
);
143 if( this->m_RebaseStage
== CHOOSE_BRANCH
)
145 this->LoadBranchInfo();
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();
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
)
188 if (wParam
== IDC_REBASE_SPLIT
)
190 SPC_NMHDR
* pHdr
= (SPC_NMHDR
*) lParam
;
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.
216 m_CommitList
.GetClientRect(rcLogMsg
);
217 SetMinTrackSize(CSize(m_DlgOrigRect
.Width(), m_DlgOrigRect
.Height()-m_CommitListOrigRect
.Height()+rcLogMsg
.Height()));
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
))
236 m_CommitList
.GetWindowRect(rcTop
);
237 ScreenToClient(rcTop
);
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
);
255 void CRebaseDlg::SaveSplitterPos()
259 CRegDWORD regPos
= CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
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);
275 g_Git
.GetBranchList(list
,¤t
,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()
291 void CRebaseDlg::OnCbnSelchangeUpstream()
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();
317 AddBranchToolTips(&this->m_BranchCtrl
);
318 AddBranchToolTips(&this->m_UpstreamCtrl
);
322 void CRebaseDlg::AddBranchToolTips(CHistoryCombo
*pBranch
)
326 CString text
=pBranch
->GetString();
329 g_Git
.GetLog(data
,text
,NULL
,1,0);
331 rev
.ParserFromLog(data
);
332 tooltip
.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
335 CAppUtils::FormatDateAndTime(rev
.m_AuthorDate
,DATE_LONGDATE
),
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
);