Add support for "project" config level
[TortoiseGit.git] / src / TortoiseProc / BranchCombox.h
blobee6e830b97a1f6dbd052980260f1147445f0c89e
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2009-2012 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #pragma once
20 #include "afxwin.h"
21 #include "LogDlg.h"
22 #include "BrowseRefsDlg.h"
23 #include "HistoryCombo.h"
24 #include "LoglistUtils.h"
25 #include "UnicodeUtils.h"
26 #include "Tooltip.h"
28 class CBranchCombox
30 public:
31 CBranchCombox()
33 m_LocalBranchFilter = gPickRef_Head;
34 m_RemoteBranchFilter = gPickRef_Remote;
35 m_DialogName=_T("sync");
36 m_pTooltip=NULL;
38 protected:
39 CHistoryCombo m_ctrlLocalBranch;
40 CHistoryCombo m_ctrlRemoteBranch;
41 int m_LocalBranchFilter;
42 int m_RemoteBranchFilter;
44 CToolTips *m_pTooltip;
46 CString m_DialogName;
48 CString m_RegKeyRemoteBranch;
50 void CbnSelchangeLocalBranch()
52 //Select pull-remote from current branch
53 CString configName;
54 CString currentBranch=this->m_ctrlLocalBranch.GetString();
55 configName.Format(L"branch.%s.remote", currentBranch);
56 CString pullRemote = g_Git.GetConfigValue(configName);
58 this->SetRemote(pullRemote);
60 //Select pull-branch from current branch
61 configName.Format(L"branch.%s.merge", currentBranch);
62 CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));
64 CString defaultUpstream;
65 defaultUpstream.Format(L"remotes/%s/%s", pullRemote, pullBranch);
66 int found = m_ctrlRemoteBranch.FindStringExact(0, defaultUpstream);
67 if(found >= 0)
69 m_ctrlRemoteBranch.SetCurSel(found);
71 else if(!pullBranch.IsEmpty())
73 int index=m_ctrlRemoteBranch.FindStringExact(0,pullBranch);
74 if( index<0 )
75 m_ctrlRemoteBranch.AddString(pullBranch);
76 else
77 m_ctrlRemoteBranch.SetCurSel(index);
79 else
81 m_ctrlRemoteBranch.SetCurSel(-1);
84 this->AddBranchToolTips(&this->m_ctrlLocalBranch,this->m_pTooltip);
86 LocalBranchChange();
88 void CbnSelchangeRemoteBranch()
90 if(this->m_RegKeyRemoteBranch.IsEmpty())
91 this->AddBranchToolTips(&this->m_ctrlRemoteBranch,this->m_pTooltip);
93 RemoteBranchChange();
95 void BnClickedButtonBrowseLocalBranch()
97 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlLocalBranch, m_LocalBranchFilter))
98 CbnSelchangeLocalBranch();
100 void BnClickedButtonBrowseRemoteBranch()
102 if(!this->m_RegKeyRemoteBranch.IsEmpty())
104 CString remoteBranchName;
105 CString remoteName;
106 this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);
107 //remoteName = m_Remote.GetString();
108 //remoteBranchName = remoteName + '/' + remoteBranchName;
109 remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);
110 if(remoteBranchName.IsEmpty())
111 return; //Canceled
113 remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'
114 int slashPlace = remoteBranchName.Find('/');
115 remoteName = remoteBranchName.Left(slashPlace);
116 remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')
118 //Select remote
119 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
120 //if(remoteSel >= 0)
121 // m_Remote.SetCurSel(remoteSel);
122 this->SetRemote(remoteName);
124 //Select branch
125 m_ctrlRemoteBranch.AddString(remoteBranchName);
126 CbnSelchangeRemoteBranch();
129 else
131 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlRemoteBranch, m_RemoteBranchFilter))
132 CbnSelchangeRemoteBranch();
136 virtual void LocalBranchChange(){};
137 virtual void RemoteBranchChange(){};
138 virtual void SetRemote(CString remote){};
140 void AddBranchToolTips(CHistoryCombo *pBranch, CToolTips *tip)
142 if(pBranch&&tip)
144 CString text=pBranch->GetString();
145 CString tooltip;
146 GitRev rev;
150 if (rev.GetCommit(text))
152 ASSERT(FALSE);
153 return;
156 catch (char* msg)
158 CString err(msg);
159 MessageBox(NULL, _T("Could not get commit \"") + text + _T("\".\nlibgit reports:\n") + err, _T("TortoiseGit"), MB_ICONERROR);
160 return;
163 tooltip.Format(_T("%s: %s\n%s: %s <%s>\n%s: %s\n%s:\n%s\n%s"),
164 CString(MAKEINTRESOURCE(IDS_LOG_REVISION)),
165 rev.m_CommitHash.ToString(),
166 CString(MAKEINTRESOURCE(IDS_LOG_AUTHOR)),
167 rev.GetAuthorName(),
168 rev.GetAuthorEmail(),
169 CString(MAKEINTRESOURCE(IDS_LOG_DATE)),
170 CLoglistUtils::FormatDateAndTime(rev.GetAuthorDate(), DATE_LONGDATE),
171 CString(MAKEINTRESOURCE(IDS_LOG_MESSAGE)),
172 rev.GetSubject(),
173 rev.GetBody());
175 pBranch->DisableTooltip();
177 tip->AddTool(pBranch->GetComboBoxCtrl(),tooltip);
181 void LoadBranchInfo()
183 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);
184 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);
186 STRING_VECTOR list;
187 list.clear();
188 int current=0;
189 m_ctrlLocalBranch.Reset();
190 m_ctrlRemoteBranch.Reset();
192 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL_F);
194 m_ctrlLocalBranch.AddString(list);
196 if(this->m_RegKeyRemoteBranch.IsEmpty())
198 list.clear();
199 g_Git.GetBranchList(list, NULL, CGit::BRANCH_REMOTE);
201 m_ctrlRemoteBranch.AddString(list);
204 else
206 m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch,_T("sync"));
209 if(!this->m_strLocalBranch.IsEmpty())
211 m_ctrlLocalBranch.AddString(m_strLocalBranch);
213 else
215 m_ctrlLocalBranch.SetCurSel(current);
218 if(!m_strRemoteBranch.IsEmpty())
220 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
221 m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);
223 else
225 CbnSelchangeLocalBranch();
228 this->LocalBranchChange();
229 this->RemoteBranchChange();
232 public:
233 CString m_strLocalBranch;
234 CString m_strRemoteBranch;
236 void SaveHistory()
238 if(!this->m_RegKeyRemoteBranch.IsEmpty())
240 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
241 m_ctrlRemoteBranch.SaveHistory();
246 #define BRANCH_COMBOX_DDX \
247 DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH, m_ctrlLocalBranch); \
248 DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH, m_ctrlRemoteBranch); \
250 #define BRANCH_COMBOX_EVENT \
251 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH, OnCbnSelchangeLocalBranch) \
252 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH, OnCbnSelchangeRemoteBranch) \
253 ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH, OnBnClickedButtonBrowseLocalBranch) \
254 ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH, OnBnClickedButtonBrowseRemoteBranch) \
256 #define BRANCH_COMBOX_ADD_ANCHOR() \
257 AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\
258 AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\
259 AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\
260 AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\
261 AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);
263 #define BRANCH_COMBOX_EVENT_HANDLE() \
264 afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \
265 afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\
266 afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\
267 afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}