Fixed issue #4141: Cannot remove remote: "usage: git remote remove <name>"
[TortoiseGit.git] / src / TortoiseProc / BranchCombox.h
blobe78af659d11e180b1d2ec8bdabefcb936878c9c1
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2009-2019, 2023 - 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(CString dialogName)
32 : m_DialogName(dialogName)
36 protected:
37 CHistoryCombo m_ctrlLocalBranch;
38 CHistoryCombo m_ctrlRemoteBranch;
39 int m_LocalBranchFilter = gPickRef_Head;
40 int m_RemoteBranchFilter = gPickRef_Remote;
42 CToolTips* m_pTooltip = nullptr;
44 CString m_DialogName;
46 CString m_RegKeyRemoteBranch;
48 void CbnSelchangeLocalBranch()
50 //Select pull-remote from current branch
51 CString pullRemote, pullBranch;
52 g_Git.GetRemoteTrackedBranch(m_ctrlLocalBranch.GetString(), pullRemote, pullBranch);
54 this->SetRemote(pullRemote);
56 CString defaultUpstream;
57 defaultUpstream.Format(L"remotes/%s/%s", static_cast<LPCWSTR>(pullRemote), static_cast<LPCWSTR>(pullBranch));
58 int found = m_ctrlRemoteBranch.FindStringExact(0, defaultUpstream);
59 if(found >= 0)
60 m_ctrlRemoteBranch.SetCurSel(found);
61 else if(!pullBranch.IsEmpty())
63 int index=m_ctrlRemoteBranch.FindStringExact(0,pullBranch);
64 if( index<0 )
65 m_ctrlRemoteBranch.AddString(pullBranch);
66 else
67 m_ctrlRemoteBranch.SetCurSel(index);
69 else
70 m_ctrlRemoteBranch.SetCurSel(-1);
72 AddBranchToolTips(m_ctrlLocalBranch, m_pTooltip);
74 LocalBranchChange();
76 void CbnSelchangeRemoteBranch()
78 if(this->m_RegKeyRemoteBranch.IsEmpty())
79 AddBranchToolTips(m_ctrlRemoteBranch, m_pTooltip);
81 RemoteBranchChange();
83 void BnClickedButtonBrowseLocalBranch()
85 if (CBrowseRefsDlg::PickRefForCombo(m_ctrlLocalBranch, m_LocalBranchFilter))
86 CbnSelchangeLocalBranch();
88 void BnClickedButtonBrowseRemoteBranch()
90 if(!this->m_RegKeyRemoteBranch.IsEmpty())
92 CString remoteBranchName;
93 CString remoteName;
94 this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);
95 //remoteName = m_Remote.GetString();
96 //remoteBranchName = remoteName + '/' + remoteBranchName;
97 remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);
98 if(remoteBranchName.IsEmpty())
99 return; //Canceled
101 remoteBranchName = remoteBranchName.Mid(static_cast<int>(wcslen(L"refs/remotes/"))); //Strip 'refs/remotes/'
102 int slashPlace = remoteBranchName.Find('/');
103 remoteName = remoteBranchName.Left(slashPlace);
104 remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')
106 //Select remote
107 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
108 //if(remoteSel >= 0)
109 // m_Remote.SetCurSel(remoteSel);
110 this->SetRemote(remoteName);
112 //Select branch
113 m_ctrlRemoteBranch.AddString(remoteBranchName);
114 CbnSelchangeRemoteBranch();
117 else
119 if (CBrowseRefsDlg::PickRefForCombo(m_ctrlRemoteBranch, m_RemoteBranchFilter))
120 CbnSelchangeRemoteBranch();
124 virtual void LocalBranchChange(){};
125 virtual void RemoteBranchChange(){};
126 virtual void SetRemote(CString remote){};
128 void AddBranchToolTips(CHistoryCombo& pBranch, CToolTips* tip)
130 pBranch.DisableTooltip();
132 if (!tip)
133 return;
135 CString text = pBranch.GetString();
136 if (text.IsEmpty())
137 return;
139 GitRev rev;
140 if (rev.GetCommit(text))
142 MessageBox(nullptr, rev.GetLastErr(), L"TortoiseGit", MB_ICONERROR);
143 return;
145 rev.ApplyMailmap();
147 CString tooltip;
148 tooltip.Format(L"%s: %s\n%s: %s <%s>\n%s: %s\n%s:\n%s\n%s",
149 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_REVISION))),
150 static_cast<LPCWSTR>(rev.m_CommitHash.ToString()),
151 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_AUTHOR))),
152 static_cast<LPCWSTR>(rev.GetAuthorName()),
153 static_cast<LPCWSTR>(rev.GetAuthorEmail()),
154 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_DATE))),
155 static_cast<LPCWSTR>(CLoglistUtils::FormatDateAndTime(rev.GetAuthorDate(), DATE_LONGDATE)),
156 static_cast<LPCWSTR>(CString(MAKEINTRESOURCE(IDS_LOG_MESSAGE))),
157 static_cast<LPCWSTR>(rev.GetSubject()),
158 static_cast<LPCWSTR>(rev.GetBody()));
160 if (tooltip.GetLength() > 8000)
162 tooltip.Truncate(8000);
163 tooltip += L"...";
166 tip->AddTool(pBranch.GetComboBoxCtrl(), tooltip);
169 void LoadBranchInfo()
171 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);
172 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);
174 STRING_VECTOR list;
175 list.clear();
176 int current=0;
178 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL_F);
180 m_ctrlLocalBranch.SetList(list);
182 if(this->m_RegKeyRemoteBranch.IsEmpty())
184 list.clear();
185 g_Git.GetBranchList(list, nullptr, CGit::BRANCH_REMOTE);
187 m_ctrlRemoteBranch.SetList(list);
189 else
191 m_ctrlRemoteBranch.Reset();
192 m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch, m_DialogName);
195 if(!this->m_strLocalBranch.IsEmpty())
196 m_ctrlLocalBranch.AddString(m_strLocalBranch);
197 else
198 m_ctrlLocalBranch.SetCurSel(current);
200 if(!m_strRemoteBranch.IsEmpty())
202 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
203 m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);
205 else
206 CbnSelchangeLocalBranch();
208 this->LocalBranchChange();
209 this->RemoteBranchChange();
212 public:
213 CString m_strLocalBranch;
214 CString m_strRemoteBranch;
216 void SaveHistory()
218 if(!this->m_RegKeyRemoteBranch.IsEmpty())
220 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
221 m_ctrlRemoteBranch.SaveHistory();
226 #define BRANCH_COMBOX_DDX \
227 DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH, m_ctrlLocalBranch); \
228 DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH, m_ctrlRemoteBranch); \
230 #define BRANCH_COMBOX_EVENT \
231 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH, OnCbnSelchangeLocalBranch) \
232 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH, OnCbnSelchangeRemoteBranch) \
233 ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH, OnBnClickedButtonBrowseLocalBranch) \
234 ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH, OnBnClickedButtonBrowseRemoteBranch) \
236 #define BRANCH_COMBOX_ADD_ANCHOR() \
237 AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\
238 AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\
239 AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\
240 AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\
241 AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);
243 #define BRANCH_COMBOX_EVENT_HANDLE() \
244 afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \
245 afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\
246 afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\
247 afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}