Add support for Ctrl+A in BrowseRefsDlg and RepositoryBrowser
[TortoiseGit.git] / src / TortoiseProc / BranchCombox.h
blob11d823cbf9eda8269f101b7b54335e14b9f6cb09
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2009-2019 - 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 "LogDlg.h"
21 #include "BrowseRefsDlg.h"
22 #include "HistoryCombo.h"
23 #include "LoglistUtils.h"
24 #include "UnicodeUtils.h"
25 #include "Tooltip.h"
27 class CBranchCombox
29 public:
30 CBranchCombox()
31 : m_LocalBranchFilter(gPickRef_Head)
32 , m_RemoteBranchFilter(gPickRef_Remote)
33 , m_DialogName(L"sync")
34 , m_pTooltip(nullptr)
37 protected:
38 CHistoryCombo m_ctrlLocalBranch;
39 CHistoryCombo m_ctrlRemoteBranch;
40 int m_LocalBranchFilter;
41 int m_RemoteBranchFilter;
43 CToolTips *m_pTooltip;
45 CString m_DialogName;
47 CString m_RegKeyRemoteBranch;
49 void CbnSelchangeLocalBranch()
51 //Select pull-remote from current branch
52 CString pullRemote, pullBranch;
53 g_Git.GetRemoteTrackedBranch(m_ctrlLocalBranch.GetString(), pullRemote, pullBranch);
55 this->SetRemote(pullRemote);
57 CString defaultUpstream;
58 defaultUpstream.Format(L"remotes/%s/%s", static_cast<LPCWSTR>(pullRemote), static_cast<LPCWSTR>(pullBranch));
59 int found = m_ctrlRemoteBranch.FindStringExact(0, defaultUpstream);
60 if(found >= 0)
61 m_ctrlRemoteBranch.SetCurSel(found);
62 else if(!pullBranch.IsEmpty())
64 int index=m_ctrlRemoteBranch.FindStringExact(0,pullBranch);
65 if( index<0 )
66 m_ctrlRemoteBranch.AddString(pullBranch);
67 else
68 m_ctrlRemoteBranch.SetCurSel(index);
70 else
71 m_ctrlRemoteBranch.SetCurSel(-1);
73 AddBranchToolTips(m_ctrlLocalBranch, m_pTooltip);
75 LocalBranchChange();
77 void CbnSelchangeRemoteBranch()
79 if(this->m_RegKeyRemoteBranch.IsEmpty())
80 AddBranchToolTips(m_ctrlRemoteBranch, m_pTooltip);
82 RemoteBranchChange();
84 void BnClickedButtonBrowseLocalBranch()
86 if (CBrowseRefsDlg::PickRefForCombo(m_ctrlLocalBranch, m_LocalBranchFilter))
87 CbnSelchangeLocalBranch();
89 void BnClickedButtonBrowseRemoteBranch()
91 if(!this->m_RegKeyRemoteBranch.IsEmpty())
93 CString remoteBranchName;
94 CString remoteName;
95 this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);
96 //remoteName = m_Remote.GetString();
97 //remoteBranchName = remoteName + '/' + remoteBranchName;
98 remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);
99 if(remoteBranchName.IsEmpty())
100 return; //Canceled
102 remoteBranchName = remoteBranchName.Mid(static_cast<int>(wcslen(L"refs/remotes/"))); //Strip 'refs/remotes/'
103 int slashPlace = remoteBranchName.Find('/');
104 remoteName = remoteBranchName.Left(slashPlace);
105 remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')
107 //Select remote
108 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
109 //if(remoteSel >= 0)
110 // m_Remote.SetCurSel(remoteSel);
111 this->SetRemote(remoteName);
113 //Select branch
114 m_ctrlRemoteBranch.AddString(remoteBranchName);
115 CbnSelchangeRemoteBranch();
118 else
120 if (CBrowseRefsDlg::PickRefForCombo(m_ctrlRemoteBranch, m_RemoteBranchFilter))
121 CbnSelchangeRemoteBranch();
125 virtual void LocalBranchChange(){};
126 virtual void RemoteBranchChange(){};
127 virtual void SetRemote(CString remote){};
129 void AddBranchToolTips(CHistoryCombo& pBranch, CToolTips* tip)
131 pBranch.DisableTooltip();
133 if (!tip)
134 return;
136 CString text = pBranch.GetString();
137 if (text.IsEmpty())
138 return;
140 GitRev rev;
141 if (rev.GetCommit(text))
143 MessageBox(nullptr, rev.GetLastErr(), L"TortoiseGit", MB_ICONERROR);
144 return;
146 rev.ApplyMailmap();
148 CString tooltip;
149 tooltip.Format(L"%s: %s\n%s: %s <%s>\n%s: %s\n%s:\n%s\n%s",
150 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_REVISION))),
151 static_cast<LPCWSTR>(rev.m_CommitHash.ToString()),
152 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_AUTHOR))),
153 static_cast<LPCWSTR>(rev.GetAuthorName()),
154 static_cast<LPCWSTR>(rev.GetAuthorEmail()),
155 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_DATE))),
156 static_cast<LPCWSTR>(CLoglistUtils::FormatDateAndTime(rev.GetAuthorDate(), DATE_LONGDATE)),
157 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_MESSAGE))),
158 static_cast<LPCWSTR>(rev.GetSubject()),
159 static_cast<LPCWSTR>(rev.GetBody()));
161 if (tooltip.GetLength() > 8000)
163 tooltip.Truncate(8000);
164 tooltip += L"...";
167 tip->AddTool(pBranch.GetComboBoxCtrl(), tooltip);
170 void LoadBranchInfo()
172 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);
173 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);
175 STRING_VECTOR list;
176 list.clear();
177 int current=0;
179 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL_F);
181 m_ctrlLocalBranch.SetList(list);
183 if(this->m_RegKeyRemoteBranch.IsEmpty())
185 list.clear();
186 g_Git.GetBranchList(list, nullptr, CGit::BRANCH_REMOTE);
188 m_ctrlRemoteBranch.SetList(list);
190 else
192 m_ctrlRemoteBranch.Reset();
193 m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch, L"sync");
196 if(!this->m_strLocalBranch.IsEmpty())
197 m_ctrlLocalBranch.AddString(m_strLocalBranch);
198 else
199 m_ctrlLocalBranch.SetCurSel(current);
201 if(!m_strRemoteBranch.IsEmpty())
203 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
204 m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);
206 else
207 CbnSelchangeLocalBranch();
209 this->LocalBranchChange();
210 this->RemoteBranchChange();
213 public:
214 CString m_strLocalBranch;
215 CString m_strRemoteBranch;
217 void SaveHistory()
219 if(!this->m_RegKeyRemoteBranch.IsEmpty())
221 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
222 m_ctrlRemoteBranch.SaveHistory();
227 #define BRANCH_COMBOX_DDX \
228 DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH, m_ctrlLocalBranch); \
229 DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH, m_ctrlRemoteBranch); \
231 #define BRANCH_COMBOX_EVENT \
232 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH, OnCbnSelchangeLocalBranch) \
233 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH, OnCbnSelchangeRemoteBranch) \
234 ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH, OnBnClickedButtonBrowseLocalBranch) \
235 ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH, OnBnClickedButtonBrowseRemoteBranch) \
237 #define BRANCH_COMBOX_ADD_ANCHOR() \
238 AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\
239 AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\
240 AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\
241 AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\
242 AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);
244 #define BRANCH_COMBOX_EVENT_HANDLE() \
245 afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \
246 afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\
247 afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\
248 afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}