replace own balloon implementation with mfc one
[TortoiseGit.git] / src / TortoiseProc / BranchCombox.h
blob64af286a4c70d804cb7229d19acad0dd99e63153
1 #pragma once
2 #include "afxwin.h"
3 #include "LogDlg.h"
4 #include "BrowseRefsDlg.h"
5 #include "HistoryCombo.h"
6 #include "HistoryCombo.h"
7 #include "AppUtils.h"
8 #include "UnicodeUtils.h"
9 #include "Tooltip.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;
21 protected:
22 CHistoryCombo m_ctrlLocalBranch;
23 CHistoryCombo m_ctrlRemoteBranch;
24 int m_LocalBranchFilter;
25 int m_RemoteBranchFilter;
27 CToolTips *m_pTooltip;
29 CString m_DialogName;
31 CString m_RegKeyRemoteBranch;
33 void CbnSelchangeLocalBranch()
35 //Select pull-remote from current branch
36 CString configName;
37 CString currentBranch=this->m_ctrlLocalBranch.GetString();
38 configName.Format(L"branch.%s.remote", currentBranch);
39 CString pullRemote = g_Git.GetConfigValue(configName);
41 this->SetRemote(pullRemote);
43 //Select pull-branch from current branch
44 configName.Format(L"branch.%s.merge", currentBranch);
45 CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));
47 CString defaultUpstream;
48 defaultUpstream.Format(L"remotes/%s/%s", pullRemote, pullBranch);
49 int found = m_ctrlRemoteBranch.FindStringExact(0, defaultUpstream);
50 if(found >= 0)
52 m_ctrlRemoteBranch.SetCurSel(found);
54 else if(!pullBranch.IsEmpty())
56 int index=m_ctrlRemoteBranch.FindStringExact(0,pullBranch);
57 if( index<0 )
58 m_ctrlRemoteBranch.AddString(pullBranch);
59 else
60 m_ctrlRemoteBranch.SetCurSel(index);
62 //else if(!this->m_RegKeyRemoteBranch.IsEmpty())
63 else
65 m_ctrlRemoteBranch.SetCurSel(-1);
68 this->AddBranchToolTips(&this->m_ctrlLocalBranch,this->m_pTooltip);
70 LocalBranchChange();
72 void CbnSelchangeRemoteBranch()
74 if(this->m_RegKeyRemoteBranch.IsEmpty())
75 this->AddBranchToolTips(&this->m_ctrlRemoteBranch,this->m_pTooltip);
77 RemoteBranchChange();
79 void BnClickedButtonBrowseLocalBranch()
81 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlLocalBranch, m_LocalBranchFilter))
82 CbnSelchangeLocalBranch();
84 void BnClickedButtonBrowseRemoteBranch()
86 if(!this->m_RegKeyRemoteBranch.IsEmpty())
88 CString remoteBranchName;
89 CString remoteName;
90 this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);
91 //remoteName = m_Remote.GetString();
92 //remoteBranchName = remoteName + '/' + remoteBranchName;
93 remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);
94 if(remoteBranchName.IsEmpty())
95 return; //Canceled
97 remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'
98 int slashPlace = remoteBranchName.Find('/');
99 remoteName = remoteBranchName.Left(slashPlace);
100 remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')
102 //Select remote
103 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
104 //if(remoteSel >= 0)
105 // m_Remote.SetCurSel(remoteSel);
106 this->SetRemote(remoteName);
108 //Select branch
109 m_ctrlRemoteBranch.AddString(remoteBranchName);
110 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, CToolTips *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);
176 else
178 m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch,_T("sync"));
181 if(!this->m_strLocalBranch.IsEmpty())
183 m_ctrlLocalBranch.AddString(m_strLocalBranch);
184 currentBranch = m_strLocalBranch;
186 else
188 m_ctrlLocalBranch.SetCurSel(current);
191 if(!m_strRemoteBranch.IsEmpty())
193 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
194 m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);
196 else
198 CbnSelchangeLocalBranch();
201 this->LocalBranchChange();
202 this->RemoteBranchChange();
205 public:
206 CString m_strLocalBranch;
207 CString m_strRemoteBranch;
209 void SaveHistory()
211 if(!this->m_RegKeyRemoteBranch.IsEmpty())
213 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
214 m_ctrlRemoteBranch.SaveHistory();
219 #define BRANCH_COMBOX_DDX \
220 DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH, m_ctrlLocalBranch); \
221 DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH, m_ctrlRemoteBranch); \
223 #define BRANCH_COMBOX_EVENT \
224 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH, OnCbnSelchangeLocalBranch) \
225 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH, OnCbnSelchangeRemoteBranch) \
226 ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH, OnBnClickedButtonBrowseLocalBranch) \
227 ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH, OnBnClickedButtonBrowseRemoteBranch) \
229 #define BRANCH_COMBOX_ADD_ANCHOR() \
230 AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\
231 AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\
232 AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\
233 AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\
234 AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);
236 #define BRANCH_COMBOX_EVENT_HANDLE() \
237 afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \
238 afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\
239 afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\
240 afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}