RebaseDlg: Show Commit Info at tooltip for branch and upstream branch.
[TortoiseGit.git] / src / TortoiseProc / RebaseDlg.cpp
blobf029ae1e63669f66e617291d7e6adfa118df429d
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("Modified File"));
117 m_ctrlTabCtrl.AddTab(&m_LogMessageCtrl,_T("Log 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 return TRUE;
155 // CRebaseDlg message handlers
157 void CRebaseDlg::OnBnClickedPickAll()
159 // TODO: Add your control notification handler code here
162 void CRebaseDlg::OnBnClickedSquashAll()
164 // TODO: Add your control notification handler code here
167 void CRebaseDlg::OnBnClickedEditAll()
169 // TODO: Add your control notification handler code here
172 void CRebaseDlg::OnBnClickedRebaseSplit()
174 // TODO: Add your control notification handler code here
177 LRESULT CRebaseDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
179 switch (message) {
180 case WM_NOTIFY:
181 if (wParam == IDC_REBASE_SPLIT)
183 SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
184 DoSize(pHdr->delta);
186 break;
189 return __super::DefWindowProc(message, wParam, lParam);
192 void CRebaseDlg::DoSize(int delta)
195 this->RemoveAllAnchors();
197 CSplitterControl::ChangeHeight(GetDlgItem(IDC_COMMIT_LIST), delta, CW_TOPALIGN);
198 //CSplitterControl::ChangeHeight(GetDlgItem(), delta, CW_TOPALIGN);
199 CSplitterControl::ChangeHeight(GetDlgItem(IDC_REBASE_TAB), -delta, CW_BOTTOMALIGN);
200 //CSplitterControl::ChangeHeight(GetDlgItem(), -delta, CW_BOTTOMALIGN);
201 CSplitterControl::ChangePos(GetDlgItem(IDC_SQUASH_ALL),0,delta);
202 CSplitterControl::ChangePos(GetDlgItem(IDC_PICK_ALL),0,delta);
203 CSplitterControl::ChangePos(GetDlgItem(IDC_EDIT_ALL),0,delta);
205 this->AddRebaseAnchor();
206 // adjust the minimum size of the dialog to prevent the resizing from
207 // moving the list control too far down.
208 CRect rcLogMsg;
209 m_CommitList.GetClientRect(rcLogMsg);
210 SetMinTrackSize(CSize(m_DlgOrigRect.Width(), m_DlgOrigRect.Height()-m_CommitListOrigRect.Height()+rcLogMsg.Height()));
212 SetSplitterRange();
213 // m_CommitList.Invalidate();
215 // GetDlgItem(IDC_LOGMESSAGE)->Invalidate();
217 this->m_ctrlTabCtrl.Invalidate();
218 this->m_CommitList.Invalidate();
219 this->m_FileListCtrl.Invalidate();
220 this->m_LogMessageCtrl.Invalidate();
224 void CRebaseDlg::SetSplitterRange()
226 if ((m_CommitList)&&(m_ctrlTabCtrl))
228 CRect rcTop;
229 m_CommitList.GetWindowRect(rcTop);
230 ScreenToClient(rcTop);
231 CRect rcMiddle;
232 m_ctrlTabCtrl.GetWindowRect(rcMiddle);
233 ScreenToClient(rcMiddle);
234 if (rcMiddle.Height() && rcMiddle.Width())
235 m_wndSplitter.SetRange(rcTop.top+60, rcMiddle.bottom-80);
239 void CRebaseDlg::OnSize(UINT nType,int cx, int cy)
241 // first, let the resizing take place
242 __super::OnSize(nType, cx, cy);
244 //set range
245 SetSplitterRange();
248 void CRebaseDlg::SaveSplitterPos()
250 if (!IsIconic())
252 CRegDWORD regPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
253 RECT rectSplitter;
254 m_wndSplitter.GetWindowRect(&rectSplitter);
255 ScreenToClient(&rectSplitter);
256 regPos = rectSplitter.top;
260 void CRebaseDlg::LoadBranchInfo()
262 m_BranchCtrl.SetMaxHistoryItems(0x7FFFFFFF);
263 m_UpstreamCtrl.SetMaxHistoryItems(0x7FFFFFFF);
265 STRING_VECTOR list;
266 list.clear();
267 int current;
268 g_Git.GetBranchList(list,&current,CGit::BRANCH_ALL);
269 m_BranchCtrl.AddString(list);
270 m_UpstreamCtrl.AddString(list);
272 m_BranchCtrl.SetCurSel(current);
274 AddBranchToolTips(&m_BranchCtrl);
275 AddBranchToolTips(&m_UpstreamCtrl);
279 void CRebaseDlg::OnCbnSelchangeBranch()
284 void CRebaseDlg::OnCbnSelchangeUpstream()
289 void CRebaseDlg::AddBranchToolTips(CHistoryCombo *pBranch)
291 if(pBranch)
293 CString text=pBranch->GetString();
294 CString tooltip;
295 BYTE_VECTOR data;
296 g_Git.GetLog(data,text,NULL,1,0);
297 GitRev rev;
298 rev.ParserFromLog(data);
299 tooltip.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
300 rev.m_CommitHash,
301 rev.m_AuthorName,
302 CAppUtils::FormatDateAndTime(rev.m_AuthorDate,DATE_LONGDATE),
303 rev.m_Subject,
304 rev.m_Body);
306 pBranch->DisableTooltip();
307 this->m_tooltips.AddTool(pBranch->GetComboBoxCtrl(),tooltip);
311 BOOL CRebaseDlg::PreTranslateMessage(MSG*pMsg)
313 m_tooltips.RelayEvent(pMsg);
314 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);