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("Modified File"));
117 m_ctrlTabCtrl
.AddTab(&m_LogMessageCtrl
,_T("Log 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
);
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
)
181 if (wParam
== IDC_REBASE_SPLIT
)
183 SPC_NMHDR
* pHdr
= (SPC_NMHDR
*) lParam
;
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.
209 m_CommitList
.GetClientRect(rcLogMsg
);
210 SetMinTrackSize(CSize(m_DlgOrigRect
.Width(), m_DlgOrigRect
.Height()-m_CommitListOrigRect
.Height()+rcLogMsg
.Height()));
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
))
229 m_CommitList
.GetWindowRect(rcTop
);
230 ScreenToClient(rcTop
);
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
);
248 void CRebaseDlg::SaveSplitterPos()
252 CRegDWORD regPos
= CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
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);
268 g_Git
.GetBranchList(list
,¤t
,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
)
293 CString text
=pBranch
->GetString();
296 g_Git
.GetLog(data
,text
,NULL
,1,0);
298 rev
.ParserFromLog(data
);
299 tooltip
.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
302 CAppUtils::FormatDateAndTime(rev
.m_AuthorDate
,DATE_LONGDATE
),
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
);