Fixed Issue #138: "Format patch" in "Show log" dialog doesn't work
[TortoiseGit.git] / src / TortoiseProc / BranchCombox.h
blobd1d933939c95e77cdd66e0d00d1c38d898595c37
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"
10 class CBranchCombox
12 public:
13 CBranchCombox()
15 m_LocalBranchFilter = gPickRef_Head;
16 m_RemoteBranchFilter = gPickRef_Remote;
17 m_DialogName=_T("sync");
18 m_pTooltip=NULL;
21 protected:
22 CHistoryCombo m_ctrlLocalBranch;
23 CHistoryCombo m_ctrlRemoteBranch;
24 int m_LocalBranchFilter;
25 int m_RemoteBranchFilter;
27 CBalloon *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 m_ctrlRemoteBranch.AddString(pullBranch);
58 else if(!this->m_RegKeyRemoteBranch.IsEmpty())
60 m_ctrlRemoteBranch.AddString(currentBranch);
63 this->AddBranchToolTips(&this->m_ctrlLocalBranch,this->m_pTooltip);
65 LocalBranchChange();
67 void CbnSelchangeRemoteBranch()
69 if(this->m_RegKeyRemoteBranch.IsEmpty())
70 this->AddBranchToolTips(&this->m_ctrlRemoteBranch,this->m_pTooltip);
72 RemoteBranchChange();
74 void BnClickedButtonBrowseLocalBranch()
76 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlLocalBranch, m_LocalBranchFilter))
77 CbnSelchangeLocalBranch();
79 void BnClickedButtonBrowseRemoteBranch()
81 if(!this->m_RegKeyRemoteBranch.IsEmpty())
83 CString remoteBranchName;
84 CString remoteName;
85 this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);
86 //remoteName = m_Remote.GetString();
87 //remoteBranchName = remoteName + '/' + remoteBranchName;
88 remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);
89 if(remoteBranchName.IsEmpty())
90 return; //Canceled
92 remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'
93 int slashPlace = remoteBranchName.Find('/');
94 remoteName = remoteBranchName.Left(slashPlace);
95 remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')
97 //Select remote
98 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
99 //if(remoteSel >= 0)
100 // m_Remote.SetCurSel(remoteSel);
101 this->SetRemote(remoteName);
103 //Select branch
104 m_ctrlRemoteBranch.AddString(remoteBranchName);
105 CbnSelchangeRemoteBranch();
107 }else
109 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlRemoteBranch, m_RemoteBranchFilter))
110 CbnSelchangeRemoteBranch();
114 virtual void LocalBranchChange(){};
115 virtual void RemoteBranchChange(){};
116 virtual void SetRemote(CString remote){};
118 void AddBranchToolTips(CHistoryCombo *pBranch,CBalloon *tip)
120 if(pBranch&&tip)
122 CString text=pBranch->GetString();
123 CString tooltip;
124 BYTE_VECTOR data;
125 g_Git.GetLog(data,text,NULL,1,0);
126 GitRev rev;
127 rev.ParserFromLog(data);
128 tooltip.Format(_T("CommitHash:%s\nCommit by: %s %s\n <b>%s</b> \n %s"),
129 rev.m_CommitHash,
130 rev.m_AuthorName,
131 CAppUtils::FormatDateAndTime(rev.m_AuthorDate,DATE_LONGDATE),
132 rev.m_Subject,
133 rev.m_Body);
135 pBranch->DisableTooltip();
137 tip->AddTool(pBranch->GetComboBoxCtrl(),tooltip);
141 void LoadBranchInfo()
143 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);
144 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);
146 STRING_VECTOR list;
147 list.clear();
148 int current;
149 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL);
150 m_ctrlLocalBranch.AddString(list);
152 CString currentBranch = g_Git.GetSymbolicRef();
154 if(this->m_RegKeyRemoteBranch.IsEmpty())
156 list.clear();
157 g_Git.GetBranchList(list,&current,CGit::BRANCH_REMOTE);
159 m_ctrlRemoteBranch.AddString(list);
161 }else
163 m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch,_T("sync"));
166 if(!this->m_strLocalBranch.IsEmpty())
168 m_ctrlLocalBranch.AddString(m_strLocalBranch);
169 currentBranch = m_strLocalBranch;
171 else
173 m_ctrlLocalBranch.SetCurSel(current);
176 if(!m_strRemoteBranch.IsEmpty())
178 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
179 m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);
181 else
183 CbnSelchangeLocalBranch();
186 this->LocalBranchChange();
187 this->RemoteBranchChange();
190 public:
191 CString m_strLocalBranch;
192 CString m_strRemoteBranch;
194 void SaveHistory()
196 if(!this->m_RegKeyRemoteBranch.IsEmpty())
198 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
199 m_ctrlRemoteBranch.SaveHistory();
204 #define BRANCH_COMBOX_DDX \
205 DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH, m_ctrlLocalBranch); \
206 DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH, m_ctrlRemoteBranch); \
208 #define BRANCH_COMBOX_EVENT \
209 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH, OnCbnSelchangeLocalBranch) \
210 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH, OnCbnSelchangeRemoteBranch) \
211 ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH, OnBnClickedButtonBrowseLocalBranch) \
212 ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH, OnBnClickedButtonBrowseRemoteBranch) \
214 #define BRANCH_COMBOX_ADD_ANCHOR() \
215 AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\
216 AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\
217 AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\
218 AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\
219 AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);
221 #define BRANCH_COMBOX_EVENT_HANDLE() \
222 afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \
223 afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\
224 afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\
225 afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}