OSDN Git Service

Fixed Issue #208: During push (from context menu), branches missing from drop down...
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / PushDlg.cpp
1 // PushDlg.cpp : implementation file\r
2 //\r
3 \r
4 #include "stdafx.h"\r
5 #include "TortoiseProc.h"\r
6 #include "PushDlg.h"\r
7 \r
8 #include "Git.h"\r
9 #include "registry.h"\r
10 #include "AppUtils.h"\r
11 #include "BrowseRefsDlg.h"\r
12 \r
13 // CPushDlg dialog\r
14 \r
15 IMPLEMENT_DYNAMIC(CPushDlg, CResizableStandAloneDialog)\r
16 \r
17 CPushDlg::CPushDlg(CWnd* pParent /*=NULL*/)\r
18         : CResizableStandAloneDialog(CPushDlg::IDD, pParent)\r
19 {\r
20     m_bAutoLoad = CAppUtils::IsSSHPutty();\r
21 }\r
22 \r
23 CPushDlg::~CPushDlg()\r
24 {\r
25 }\r
26 \r
27 void CPushDlg::DoDataExchange(CDataExchange* pDX)\r
28 {\r
29         CResizableStandAloneDialog::DoDataExchange(pDX);\r
30         DDX_Control(pDX, IDC_BRANCH_REMOTE, this->m_BranchRemote);\r
31         DDX_Control(pDX, IDC_BRANCH_SOURCE, this->m_BranchSource);\r
32         DDX_Control(pDX, IDC_REMOTE, this->m_Remote);\r
33         DDX_Control(pDX, IDC_URL, this->m_RemoteURL);\r
34         DDX_Check(pDX,IDC_FORCE,this->m_bForce);\r
35         DDX_Check(pDX,IDC_PACK,this->m_bPack);\r
36         DDX_Check(pDX,IDC_TAGS,this->m_bTags);\r
37     DDX_Check(pDX,IDC_PUTTYKEY_AUTOLOAD,this->m_bAutoLoad);\r
38 \r
39 }\r
40 \r
41 \r
42 BEGIN_MESSAGE_MAP(CPushDlg, CResizableStandAloneDialog)\r
43         ON_BN_CLICKED(IDC_RD_REMOTE, &CPushDlg::OnBnClickedRd)\r
44         ON_BN_CLICKED(IDC_RD_URL, &CPushDlg::OnBnClickedRd)\r
45         ON_CBN_SELCHANGE(IDC_BRANCH_SOURCE, &CPushDlg::OnCbnSelchangeBranchSource)\r
46         ON_BN_CLICKED(IDOK, &CPushDlg::OnBnClickedOk)\r
47     ON_BN_CLICKED(IDC_REMOTE_MANAGE, &CPushDlg::OnBnClickedRemoteManage)\r
48         ON_BN_CLICKED(IDC_BUTTON_BROWSE_SOURCE_BRANCH, &CPushDlg::OnBnClickedButtonBrowseSourceBranch)\r
49         ON_BN_CLICKED(IDC_BUTTON_BROWSE_DEST_BRANCH, &CPushDlg::OnBnClickedButtonBrowseDestBranch)\r
50 END_MESSAGE_MAP()\r
51 \r
52 BOOL CPushDlg::OnInitDialog()\r
53 {\r
54         CResizableStandAloneDialog::OnInitDialog();\r
55         \r
56         AddAnchor(IDOK,BOTTOM_RIGHT);\r
57         AddAnchor(IDCANCEL,BOTTOM_RIGHT);\r
58         AddAnchor(IDC_BRANCH_GROUP, TOP_LEFT,TOP_RIGHT);\r
59         AddAnchor(IDC_STATIC_REMOTE, TOP_RIGHT);\r
60         AddAnchor(IDC_STATIC_SOURCE, TOP_LEFT);\r
61 \r
62         AddAnchor(IDC_BRANCH_REMOTE, TOP_RIGHT);\r
63         AddAnchor(IDC_BUTTON_BROWSE_DEST_BRANCH, TOP_RIGHT);\r
64         AddAnchor(IDC_BRANCH_SOURCE, TOP_LEFT);\r
65         AddAnchor(IDC_BUTTON_BROWSE_SOURCE_BRANCH, TOP_LEFT);\r
66 \r
67         AddAnchor(IDC_URL_GROUP, TOP_LEFT,TOP_RIGHT);\r
68         AddAnchor(IDC_RD_REMOTE, TOP_LEFT);\r
69         AddAnchor(IDC_RD_URL, TOP_LEFT);\r
70 \r
71         AddAnchor(IDC_REMOTE, TOP_LEFT, TOP_RIGHT);\r
72         \r
73         AddAnchor(IDC_URL, TOP_LEFT,TOP_RIGHT);\r
74 \r
75         AddAnchor(IDC_OPTION_GROUP, TOP_LEFT,TOP_RIGHT);\r
76         \r
77         AddAnchor(IDC_FORCE, TOP_LEFT);\r
78         AddAnchor(IDC_PACK, TOP_LEFT);\r
79         AddAnchor(IDC_TAGS, TOP_LEFT);\r
80     AddAnchor(IDC_PUTTYKEY_AUTOLOAD,TOP_LEFT);\r
81 \r
82     AddAnchor(IDC_REMOTE_MANAGE,TOP_RIGHT);\r
83         AddAnchor(IDHELP, BOTTOM_RIGHT);\r
84 \r
85         AddOthersToAnchor();\r
86 \r
87     this->GetDlgItem(IDC_PUTTYKEY_AUTOLOAD)->EnableWindow(m_bAutoLoad);\r
88 \r
89         EnableSaveRestore(_T("PushDlg"));\r
90 \r
91         m_RemoteURL.SetURLHistory(TRUE);\r
92         \r
93         CString WorkingDir=g_Git.m_CurrentDir;\r
94         WorkingDir.Replace(_T(':'),_T('_'));\r
95         m_RemoteURL.LoadHistory(CString(_T("Software\\TortoiseGit\\History\\PushURLS\\"))+WorkingDir, _T("url"));\r
96         CString clippath=CAppUtils::GetClipboardLink();\r
97         if(clippath.IsEmpty())\r
98                 m_RemoteURL.SetCurSel(0);\r
99         else\r
100                 m_RemoteURL.SetWindowText(clippath);\r
101 \r
102         m_RemoteURL.EnableWindow(FALSE);\r
103         CheckRadioButton(IDC_RD_REMOTE,IDC_RD_URL,IDC_RD_REMOTE);\r
104 \r
105 \r
106         Refresh();\r
107 \r
108 \r
109         //m_BranchRemote.SetWindowTextW(m_BranchSource.GetString());\r
110 \r
111         \r
112         return TRUE;\r
113 }\r
114 \r
115 void CPushDlg::Refresh()\r
116 {\r
117         CString WorkingDir=g_Git.m_CurrentDir;\r
118         WorkingDir.Replace(_T(':'),_T('_'));\r
119 \r
120         CRegString remote(CString(_T("Software\\TortoiseGit\\History\\PushRemote\\")+WorkingDir));\r
121         m_RemoteReg = remote;\r
122         int sel=0;\r
123 \r
124         CString currentBranch = g_Git.GetSymbolicRef();\r
125         CString configName;\r
126 \r
127         configName.Format(L"branch.%s.pushremote", currentBranch);\r
128         CString pushRemote = g_Git.GetConfigValue(configName);\r
129         if( pushRemote.IsEmpty() )\r
130         {\r
131                 configName.Format(L"branch.%s.remote", currentBranch);\r
132                 pushRemote = g_Git.GetConfigValue(configName);\r
133         }\r
134 \r
135         if( !pushRemote.IsEmpty() )\r
136                 remote=pushRemote;\r
137 \r
138         //Select pull-branch from current branch\r
139         configName.Format(L"branch.%s.pushbranch", currentBranch);\r
140         CString pushBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));\r
141         if( pushBranch.IsEmpty() )\r
142         {\r
143                 configName.Format(L"branch.%s.merge", currentBranch);\r
144                 pushBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));              \r
145         }\r
146 \r
147         STRING_VECTOR list;\r
148         m_Remote.Reset();\r
149 \r
150         if(!g_Git.GetRemoteList(list))\r
151         {       \r
152                 for(unsigned int i=0;i<list.size();i++)\r
153                 {\r
154                         m_Remote.AddString(list[i]);\r
155                         if(list[i] == remote)\r
156                                 sel = i;\r
157                 }\r
158         }\r
159         m_Remote.SetCurSel(sel);\r
160 \r
161         int current=0;\r
162         list.clear();\r
163         m_BranchSource.Reset();\r
164         m_BranchSource.SetMaxHistoryItems(0x7FFFFFFF);\r
165         if(!g_Git.GetBranchList(list,&current))\r
166         {\r
167                 for(unsigned int i=0;i<list.size();i++)\r
168                         m_BranchSource.AddString(list[i]);\r
169         }\r
170         m_BranchSource.SetCurSel(current);\r
171 \r
172         m_BranchRemote.LoadHistory(CString(_T("Software\\TortoiseGit\\History\\RemoteBranch\\"))+WorkingDir, _T("branch"));\r
173         if( !pushBranch.IsEmpty() )\r
174         {\r
175                 m_BranchRemote.AddString(pushBranch);\r
176                 m_BranchRemote.SetCurSel(0);    \r
177         }\r
178         else\r
179                 m_BranchRemote.SetCurSel(-1);\r
180 \r
181 }\r
182 // CPushDlg message handlers\r
183 \r
184 void CPushDlg::OnBnClickedRd()\r
185 {\r
186         // TODO: Add your control notification handler code here\r
187         // TODO: Add your control notification handler code here\r
188         if( GetCheckedRadioButton(IDC_RD_REMOTE,IDC_RD_URL) == IDC_RD_REMOTE)\r
189         {\r
190                 m_Remote.EnableWindow(TRUE);\r
191                 m_RemoteURL.EnableWindow(FALSE);;\r
192         }\r
193         if( GetCheckedRadioButton(IDC_RD_REMOTE,IDC_RD_URL) == IDC_RD_URL)\r
194         {\r
195                 m_Remote.EnableWindow(FALSE);\r
196                 m_RemoteURL.EnableWindow(TRUE);\r
197         }\r
198 }\r
199 \r
200 \r
201 void CPushDlg::OnCbnSelchangeBranchSource()\r
202 {\r
203         // TODO: Add your control notification handler code here\r
204         m_BranchRemote.AddString(m_BranchSource.GetString());\r
205 }\r
206 \r
207 void CPushDlg::OnBnClickedOk()\r
208 {\r
209         // TODO: Add your control notification handler code here\r
210         CResizableStandAloneDialog::UpdateData(TRUE);\r
211 \r
212         if( GetCheckedRadioButton(IDC_RD_REMOTE,IDC_RD_URL) == IDC_RD_REMOTE)\r
213         {\r
214                 m_URL=m_Remote.GetString();\r
215         }\r
216         if( GetCheckedRadioButton(IDC_RD_REMOTE,IDC_RD_URL) == IDC_RD_URL)\r
217         {\r
218                 m_URL=m_RemoteURL.GetString();\r
219         }\r
220 \r
221         this->m_BranchRemoteName=m_BranchRemote.GetString();\r
222         this->m_BranchSourceName=m_BranchSource.GetString();\r
223 \r
224         this->m_RemoteURL.SaveHistory();\r
225         this->m_BranchRemote.SaveHistory();\r
226         \r
227         m_RemoteReg = m_Remote.GetString();\r
228 \r
229         CResizableStandAloneDialog::OnOK();\r
230 }\r
231 \r
232 void CPushDlg::OnBnClickedRemoteManage()\r
233 {\r
234     // TODO: Add your control notification handler code here\r
235     CAppUtils::LaunchRemoteSetting();\r
236 }\r
237 \r
238 void CPushDlg::OnBnClickedButtonBrowseSourceBranch()\r
239 {\r
240         if(CBrowseRefsDlg::PickRefForCombo(&m_BranchSource, gPickRef_Head))\r
241                 OnCbnSelchangeBranchSource();\r
242 }\r
243 \r
244 void CPushDlg::OnBnClickedButtonBrowseDestBranch()\r
245 {\r
246         CString remoteBranchName;\r
247         CString remoteName;\r
248         m_BranchRemote.GetWindowText(remoteBranchName);\r
249         remoteName = m_Remote.GetString();\r
250         remoteBranchName = remoteName + '/' + remoteBranchName;\r
251         remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);\r
252         if(remoteBranchName.IsEmpty())\r
253                 return; //Canceled\r
254         remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'\r
255         int slashPlace = remoteBranchName.Find('/');\r
256         remoteName = remoteBranchName.Left(slashPlace);\r
257         remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')\r
258 \r
259         //Select remote\r
260         int remoteSel = m_Remote.FindStringExact(0,remoteName);\r
261         if(remoteSel >= 0)\r
262                 m_Remote.SetCurSel(remoteSel);\r
263 \r
264         //Select branch\r
265         m_BranchRemote.AddString(remoteBranchName);\r
266 }\r
267 \r
268 BOOL CPushDlg::PreTranslateMessage(MSG* pMsg)\r
269 {\r
270         if (pMsg->message == WM_KEYDOWN)\r
271         {\r
272                 switch (pMsg->wParam)\r
273                 {\r
274                 case VK_F5:\r
275                         {\r
276                                 Refresh();\r
277                         }\r
278                         break;\r
279                 }\r
280         }\r
281 \r
282         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
283 }\r