TortoiseSVN -> TortoiseGit
[TortoiseGit.git] / src / TortoiseProc / BranchCombox.h
blobf1490d50e783847de406de3f8bd6c3dcd6b56a1e
1 #pragma once
2 #include "afxwin.h"
3 #include "LogDlg.h"
4 #include "BrowseRefsDlg.h"
5 #include "HistoryCombo.h"
6 #include "Balloon.h"
7 #include "HistoryCombo.h"
8 #include "AppUtils.h"
9 #include "UnicodeUtils.h"
11 class CBranchCombox
13 public:
14 CBranchCombox()
16 m_LocalBranchFilter = gPickRef_Head;
17 m_RemoteBranchFilter = gPickRef_Remote;
18 m_DialogName=_T("sync");
19 m_pTooltip=NULL;
22 protected:
23 CHistoryCombo m_ctrlLocalBranch;
24 CHistoryCombo m_ctrlRemoteBranch;
25 int m_LocalBranchFilter;
26 int m_RemoteBranchFilter;
28 CBalloon *m_pTooltip;
30 CString m_DialogName;
32 CString m_RegKeyRemoteBranch;
34 void CbnSelchangeLocalBranch()
36 //Select pull-remote from current branch
37 CString configName;
38 CString currentBranch=this->m_ctrlLocalBranch.GetString();
39 configName.Format(L"branch.%s.remote", currentBranch);
40 CString pullRemote = g_Git.GetConfigValue(configName);
42 this->SetRemote(pullRemote);
44 //Select pull-branch from current branch
45 configName.Format(L"branch.%s.merge", currentBranch);
46 CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));
48 CString defaultUpstream;
49 defaultUpstream.Format(L"remotes/%s/%s", pullRemote, pullBranch);
50 int found = m_ctrlRemoteBranch.FindStringExact(0, defaultUpstream);
51 if(found >= 0)
53 m_ctrlRemoteBranch.SetCurSel(found);
55 else if(!pullBranch.IsEmpty())
57 int index=m_ctrlRemoteBranch.FindStringExact(0,pullBranch);
58 if( index<0 )
59 m_ctrlRemoteBranch.AddString(pullBranch);
60 else
61 m_ctrlRemoteBranch.SetCurSel(index);
63 //else if(!this->m_RegKeyRemoteBranch.IsEmpty())
64 else
66 m_ctrlRemoteBranch.SetCurSel(-1);
69 this->AddBranchToolTips(&this->m_ctrlLocalBranch,this->m_pTooltip);
71 LocalBranchChange();
73 void CbnSelchangeRemoteBranch()
75 if(this->m_RegKeyRemoteBranch.IsEmpty())
76 this->AddBranchToolTips(&this->m_ctrlRemoteBranch,this->m_pTooltip);
78 RemoteBranchChange();
80 void BnClickedButtonBrowseLocalBranch()
82 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlLocalBranch, m_LocalBranchFilter))
83 CbnSelchangeLocalBranch();
85 void BnClickedButtonBrowseRemoteBranch()
87 if(!this->m_RegKeyRemoteBranch.IsEmpty())
89 CString remoteBranchName;
90 CString remoteName;
91 this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);
92 //remoteName = m_Remote.GetString();
93 //remoteBranchName = remoteName + '/' + remoteBranchName;
94 remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);
95 if(remoteBranchName.IsEmpty())
96 return; //Canceled
98 remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'
99 int slashPlace = remoteBranchName.Find('/');
100 remoteName = remoteBranchName.Left(slashPlace);
101 remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')
103 //Select remote
104 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
105 //if(remoteSel >= 0)
106 // m_Remote.SetCurSel(remoteSel);
107 this->SetRemote(remoteName);
109 //Select branch
110 m_ctrlRemoteBranch.AddString(remoteBranchName);
111 CbnSelchangeRemoteBranch();
113 }else
115 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlRemoteBranch, m_RemoteBranchFilter))
116 CbnSelchangeRemoteBranch();
120 virtual void LocalBranchChange(){};
121 virtual void RemoteBranchChange(){};
122 virtual void SetRemote(CString remote){};
124 void AddBranchToolTips(CHistoryCombo *pBranch,CBalloon *tip)
126 if(pBranch&&tip)
128 CString text=pBranch->GetString();
129 CString tooltip;
130 GitRev rev;
132 if(rev.GetCommit(text))
134 ASSERT(FALSE);
135 return;
138 tooltip.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
139 rev.m_CommitHash.ToString(),
140 rev.GetAuthorName(),
141 CAppUtils::FormatDateAndTime(rev.GetAuthorDate(),DATE_LONGDATE),
142 rev.GetSubject(),
143 rev.GetBody());
145 pBranch->DisableTooltip();
147 tip->AddTool(pBranch->GetComboBoxCtrl(),tooltip);
151 void LoadBranchInfo()
153 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);
154 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);
156 STRING_VECTOR list;
157 list.clear();
158 int current=0;
159 m_ctrlLocalBranch.Reset();
160 m_ctrlRemoteBranch.Reset();
162 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL_F);
164 m_ctrlLocalBranch.AddString(list);
166 CString currentBranch = g_Git.GetSymbolicRef();
168 if(this->m_RegKeyRemoteBranch.IsEmpty())
170 list.clear();
171 g_Git.GetBranchList(list,&current,CGit::BRANCH_REMOTE);
173 m_ctrlRemoteBranch.AddString(list);
175 }else
177 m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch,_T("sync"));
180 if(!this->m_strLocalBranch.IsEmpty())
182 m_ctrlLocalBranch.AddString(m_strLocalBranch);
183 currentBranch = m_strLocalBranch;
185 else
187 m_ctrlLocalBranch.SetCurSel(current);
190 if(!m_strRemoteBranch.IsEmpty())
192 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
193 m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);
195 else
197 CbnSelchangeLocalBranch();
200 this->LocalBranchChange();
201 this->RemoteBranchChange();
204 public:
205 CString m_strLocalBranch;
206 CString m_strRemoteBranch;
208 void SaveHistory()
210 if(!this->m_RegKeyRemoteBranch.IsEmpty())
212 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
213 m_ctrlRemoteBranch.SaveHistory();
218 #define BRANCH_COMBOX_DDX \
219 DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH, m_ctrlLocalBranch); \
220 DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH, m_ctrlRemoteBranch); \
222 #define BRANCH_COMBOX_EVENT \
223 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH, OnCbnSelchangeLocalBranch) \
224 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH, OnCbnSelchangeRemoteBranch) \
225 ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH, OnBnClickedButtonBrowseLocalBranch) \
226 ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH, OnBnClickedButtonBrowseRemoteBranch) \
228 #define BRANCH_COMBOX_ADD_ANCHOR() \
229 AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\
230 AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\
231 AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\
232 AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\
233 AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);
235 #define BRANCH_COMBOX_EVENT_HANDLE() \
236 afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \
237 afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\
238 afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\
239 afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}