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.
21 #include "BrowseRefsDlg.h"
22 #include "HistoryCombo.h"
23 #include "LoglistUtils.h"
24 #include "UnicodeUtils.h"
31 : m_LocalBranchFilter(gPickRef_Head
)
32 , m_RemoteBranchFilter(gPickRef_Remote
)
33 , m_DialogName(L
"sync")
38 CHistoryCombo m_ctrlLocalBranch
;
39 CHistoryCombo m_ctrlRemoteBranch
;
40 int m_LocalBranchFilter
;
41 int m_RemoteBranchFilter
;
43 CToolTips
*m_pTooltip
;
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
);
61 m_ctrlRemoteBranch
.SetCurSel(found
);
62 else if(!pullBranch
.IsEmpty())
64 int index
=m_ctrlRemoteBranch
.FindStringExact(0,pullBranch
);
66 m_ctrlRemoteBranch
.AddString(pullBranch
);
68 m_ctrlRemoteBranch
.SetCurSel(index
);
71 m_ctrlRemoteBranch
.SetCurSel(-1);
73 AddBranchToolTips(m_ctrlLocalBranch
, m_pTooltip
);
77 void CbnSelchangeRemoteBranch()
79 if(this->m_RegKeyRemoteBranch
.IsEmpty())
80 AddBranchToolTips(m_ctrlRemoteBranch
, m_pTooltip
);
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
;
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())
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/')
108 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
110 // m_Remote.SetCurSel(remoteSel);
111 this->SetRemote(remoteName
);
114 m_ctrlRemoteBranch
.AddString(remoteBranchName
);
115 CbnSelchangeRemoteBranch();
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();
136 CString text
= pBranch
.GetString();
141 if (rev
.GetCommit(text
))
143 MessageBox(nullptr, rev
.GetLastErr(), L
"TortoiseGit", MB_ICONERROR
);
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);
167 tip
->AddTool(pBranch
.GetComboBoxCtrl(), tooltip
);
170 void LoadBranchInfo()
172 m_ctrlLocalBranch
.SetMaxHistoryItems(0x0FFFFFFF);
173 m_ctrlRemoteBranch
.SetMaxHistoryItems(0x0FFFFFFF);
179 g_Git
.GetBranchList(list
,¤t
,CGit::BRANCH_LOCAL_F
);
181 m_ctrlLocalBranch
.SetList(list
);
183 if(this->m_RegKeyRemoteBranch
.IsEmpty())
186 g_Git
.GetBranchList(list
, nullptr, CGit::BRANCH_REMOTE
);
188 m_ctrlRemoteBranch
.SetList(list
);
192 m_ctrlRemoteBranch
.Reset();
193 m_ctrlRemoteBranch
.LoadHistory(m_RegKeyRemoteBranch
, L
"sync");
196 if(!this->m_strLocalBranch
.IsEmpty())
197 m_ctrlLocalBranch
.AddString(m_strLocalBranch
);
199 m_ctrlLocalBranch
.SetCurSel(current
);
201 if(!m_strRemoteBranch
.IsEmpty())
203 m_ctrlRemoteBranch
.AddString(m_strRemoteBranch
);
204 m_ctrlRemoteBranch
.SetCurSel(m_ctrlRemoteBranch
.GetCount()-1);
207 CbnSelchangeLocalBranch();
209 this->LocalBranchChange();
210 this->RemoteBranchChange();
214 CString m_strLocalBranch
;
215 CString m_strRemoteBranch
;
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();}