1 // RebaseDlg.cpp : implementation file
\r
5 #include "TortoiseProc.h"
\r
6 #include "RebaseDlg.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
50 void CRebaseDlg::AddRebaseAnchor()
\r
52 AddAnchor(IDC_REBASE_TAB,TOP_LEFT,BOTTOM_RIGHT);
\r
53 AddAnchor(IDC_COMMIT_LIST,TOP_LEFT, TOP_RIGHT);
\r
54 AddAnchor(IDC_REBASE_SPLIT,TOP_LEFT, TOP_RIGHT);
\r
55 AddAnchor(IDC_STATUS_STATIC, BOTTOM_LEFT,BOTTOM_RIGHT);
\r
56 AddAnchor(IDC_REBASE_CONTINUE,BOTTOM_RIGHT);
\r
57 AddAnchor(IDC_REBASE_ABORT, BOTTOM_RIGHT);
\r
58 AddAnchor(IDC_REBASE_PROGRESS,BOTTOM_LEFT, BOTTOM_RIGHT);
\r
59 AddAnchor(IDC_PICK_ALL,TOP_LEFT);
\r
60 AddAnchor(IDC_SQUASH_ALL,TOP_LEFT);
\r
61 AddAnchor(IDC_EDIT_ALL,TOP_LEFT);
\r
62 AddAnchor(IDC_REBASE_COMBOXEX_UPSTREAM,TOP_LEFT);
\r
63 AddAnchor(IDC_REBASE_COMBOXEX_BRANCH,TOP_LEFT);
\r
64 AddAnchor(IDC_REBASE_STATIC_UPSTREAM,TOP_LEFT);
\r
65 AddAnchor(IDC_REBASE_STATIC_BRANCH,TOP_LEFT);
\r
69 BOOL CRebaseDlg::OnInitDialog()
\r
71 CResizableStandAloneDialog::OnInitDialog();
\r
74 //IDC_REBASE_DUMY_TAB
\r
76 GetClientRect(m_DlgOrigRect);
\r
77 m_CommitList.GetClientRect(m_CommitListOrigRect);
\r
79 CWnd *pwnd=this->GetDlgItem(IDC_REBASE_DUMY_TAB);
\r
80 pwnd->GetWindowRect(&rectDummy);
\r
83 rectDummy.bottom-=20;
\r
88 if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_REBASE_TAB))
\r
90 TRACE0("Failed to create output tab window\n");
\r
91 return FALSE; // fail to create
\r
93 m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);
\r
94 // Create output panes:
\r
95 //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
\r
96 const DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;
\r
98 if (! this->m_FileListCtrl.Create(dwStyle,rectDummy,&this->m_ctrlTabCtrl,0) )
\r
100 TRACE0("Failed to create output windows\n");
\r
101 return FALSE; // fail to create
\r
104 if( ! this->m_LogMessageCtrl.Create(_T("Scintilla"),_T("source"),0,rectDummy,&m_ctrlTabCtrl,0,0) )
\r
106 TRACE0("Failed to create log message control");
\r
110 m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS , _T("RebaseDlg"));
\r
112 m_ctrlTabCtrl.AddTab(&m_FileListCtrl,_T("Modified File"));
\r
113 m_ctrlTabCtrl.AddTab(&m_LogMessageCtrl,_T("Log Message"),1);
\r
117 EnableSaveRestore(_T("RebaseDlg"));
\r
119 DWORD yPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
\r
120 RECT rcDlg, rcLogMsg, rcFileList;
\r
121 GetClientRect(&rcDlg);
\r
122 m_CommitList.GetWindowRect(&rcLogMsg);
\r
123 ScreenToClient(&rcLogMsg);
\r
124 this->m_ctrlTabCtrl.GetWindowRect(&rcFileList);
\r
125 ScreenToClient(&rcFileList);
\r
129 m_wndSplitter.GetWindowRect(&rectSplitter);
\r
130 ScreenToClient(&rectSplitter);
\r
131 int delta = yPos - rectSplitter.top;
\r
132 if ((rcLogMsg.bottom + delta > rcLogMsg.top)&&(rcLogMsg.bottom + delta < rcFileList.bottom - 30))
\r
134 m_wndSplitter.SetWindowPos(NULL, 0, yPos, 0, 0, SWP_NOSIZE);
\r
139 if( this->m_RebaseStage == CHOOSE_BRANCH)
\r
141 this->LoadBranchInfo();
\r
145 this->m_BranchCtrl.EnableWindow(FALSE);
\r
146 this->m_UpstreamCtrl.EnableWindow(FALSE);
\r
151 // CRebaseDlg message handlers
\r
153 void CRebaseDlg::OnBnClickedPickAll()
\r
155 // TODO: Add your control notification handler code here
\r
158 void CRebaseDlg::OnBnClickedSquashAll()
\r
160 // TODO: Add your control notification handler code here
\r
163 void CRebaseDlg::OnBnClickedEditAll()
\r
165 // TODO: Add your control notification handler code here
\r
168 void CRebaseDlg::OnBnClickedRebaseSplit()
\r
170 // TODO: Add your control notification handler code here
\r
173 LRESULT CRebaseDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
\r
177 if (wParam == IDC_REBASE_SPLIT)
\r
179 SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
\r
180 DoSize(pHdr->delta);
\r
185 return __super::DefWindowProc(message, wParam, lParam);
\r
188 void CRebaseDlg::DoSize(int delta)
\r
191 this->RemoveAllAnchors();
\r
193 CSplitterControl::ChangeHeight(GetDlgItem(IDC_COMMIT_LIST), delta, CW_TOPALIGN);
\r
194 //CSplitterControl::ChangeHeight(GetDlgItem(), delta, CW_TOPALIGN);
\r
195 CSplitterControl::ChangeHeight(GetDlgItem(IDC_REBASE_TAB), -delta, CW_BOTTOMALIGN);
\r
196 //CSplitterControl::ChangeHeight(GetDlgItem(), -delta, CW_BOTTOMALIGN);
\r
197 CSplitterControl::ChangePos(GetDlgItem(IDC_SQUASH_ALL),0,delta);
\r
198 CSplitterControl::ChangePos(GetDlgItem(IDC_PICK_ALL),0,delta);
\r
199 CSplitterControl::ChangePos(GetDlgItem(IDC_EDIT_ALL),0,delta);
\r
201 this->AddRebaseAnchor();
\r
202 // adjust the minimum size of the dialog to prevent the resizing from
\r
203 // moving the list control too far down.
\r
205 m_CommitList.GetClientRect(rcLogMsg);
\r
206 SetMinTrackSize(CSize(m_DlgOrigRect.Width(), m_DlgOrigRect.Height()-m_CommitListOrigRect.Height()+rcLogMsg.Height()));
\r
208 SetSplitterRange();
\r
209 // m_CommitList.Invalidate();
\r
211 // GetDlgItem(IDC_LOGMESSAGE)->Invalidate();
\r
213 this->m_ctrlTabCtrl.Invalidate();
\r
214 this->m_CommitList.Invalidate();
\r
215 this->m_FileListCtrl.Invalidate();
\r
216 this->m_LogMessageCtrl.Invalidate();
\r
220 void CRebaseDlg::SetSplitterRange()
\r
222 if ((m_CommitList)&&(m_ctrlTabCtrl))
\r
225 m_CommitList.GetWindowRect(rcTop);
\r
226 ScreenToClient(rcTop);
\r
228 m_ctrlTabCtrl.GetWindowRect(rcMiddle);
\r
229 ScreenToClient(rcMiddle);
\r
230 if (rcMiddle.Height() && rcMiddle.Width())
\r
231 m_wndSplitter.SetRange(rcTop.top+60, rcMiddle.bottom-80);
\r
235 void CRebaseDlg::OnSize(UINT nType,int cx, int cy)
\r
237 // first, let the resizing take place
\r
238 __super::OnSize(nType, cx, cy);
\r
241 SetSplitterRange();
\r
244 void CRebaseDlg::SaveSplitterPos()
\r
248 CRegDWORD regPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RebaseDlgSizer"));
\r
250 m_wndSplitter.GetWindowRect(&rectSplitter);
\r
251 ScreenToClient(&rectSplitter);
\r
252 regPos = rectSplitter.top;
\r
256 void CRebaseDlg::LoadBranchInfo()
\r
258 m_BranchCtrl.SetMaxHistoryItems(0x7FFFFFFF);
\r
259 m_UpstreamCtrl.SetMaxHistoryItems(0x7FFFFFFF);
\r
261 STRING_VECTOR list;
\r
264 g_Git.GetBranchList(list,¤t,CGit::BRANCH_ALL);
\r
265 m_BranchCtrl.AddString(list);
\r
266 m_UpstreamCtrl.AddString(list);
\r
268 m_BranchCtrl.SetCurSel(current);
\r