Fixed issue #1264: TortoiseProc might crash if commands are executed w/o a working...
[TortoiseGit.git] / src / TortoiseProc / BranchCombox.h
blob94d979cb46ed1b9317a9df1146fb8f4c0dd239cc
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2009-2012 - 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 "afxwin.h"
21 #include "LogDlg.h"
22 #include "BrowseRefsDlg.h"
23 #include "HistoryCombo.h"
24 #include "HistoryCombo.h"
25 #include "LoglistUtils.h"
26 #include "UnicodeUtils.h"
27 #include "Tooltip.h"
29 class CBranchCombox
31 public:
32 CBranchCombox()
34 m_LocalBranchFilter = gPickRef_Head;
35 m_RemoteBranchFilter = gPickRef_Remote;
36 m_DialogName=_T("sync");
37 m_pTooltip=NULL;
39 protected:
40 CHistoryCombo m_ctrlLocalBranch;
41 CHistoryCombo m_ctrlRemoteBranch;
42 int m_LocalBranchFilter;
43 int m_RemoteBranchFilter;
45 CToolTips *m_pTooltip;
47 CString m_DialogName;
49 CString m_RegKeyRemoteBranch;
51 void CbnSelchangeLocalBranch()
53 //Select pull-remote from current branch
54 CString configName;
55 CString currentBranch=this->m_ctrlLocalBranch.GetString();
56 configName.Format(L"branch.%s.remote", currentBranch);
57 CString pullRemote = g_Git.GetConfigValue(configName);
59 this->SetRemote(pullRemote);
61 //Select pull-branch from current branch
62 configName.Format(L"branch.%s.merge", currentBranch);
63 CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));
65 CString defaultUpstream;
66 defaultUpstream.Format(L"remotes/%s/%s", pullRemote, pullBranch);
67 int found = m_ctrlRemoteBranch.FindStringExact(0, defaultUpstream);
68 if(found >= 0)
70 m_ctrlRemoteBranch.SetCurSel(found);
72 else if(!pullBranch.IsEmpty())
74 int index=m_ctrlRemoteBranch.FindStringExact(0,pullBranch);
75 if( index<0 )
76 m_ctrlRemoteBranch.AddString(pullBranch);
77 else
78 m_ctrlRemoteBranch.SetCurSel(index);
80 else if(!this->m_RegKeyRemoteBranch.IsEmpty())
82 m_ctrlRemoteBranch.SetCurSel(0);
84 else
86 m_ctrlRemoteBranch.SetCurSel(-1);
89 this->AddBranchToolTips(&this->m_ctrlLocalBranch,this->m_pTooltip);
91 LocalBranchChange();
93 void CbnSelchangeRemoteBranch()
95 if(this->m_RegKeyRemoteBranch.IsEmpty())
96 this->AddBranchToolTips(&this->m_ctrlRemoteBranch,this->m_pTooltip);
98 RemoteBranchChange();
100 void BnClickedButtonBrowseLocalBranch()
102 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlLocalBranch, m_LocalBranchFilter))
103 CbnSelchangeLocalBranch();
105 void BnClickedButtonBrowseRemoteBranch()
107 if(!this->m_RegKeyRemoteBranch.IsEmpty())
109 CString remoteBranchName;
110 CString remoteName;
111 this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);
112 //remoteName = m_Remote.GetString();
113 //remoteBranchName = remoteName + '/' + remoteBranchName;
114 remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);
115 if(remoteBranchName.IsEmpty())
116 return; //Canceled
118 remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'
119 int slashPlace = remoteBranchName.Find('/');
120 remoteName = remoteBranchName.Left(slashPlace);
121 remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')
123 //Select remote
124 //int remoteSel = m_Remote.FindStringExact(0,remoteName);
125 //if(remoteSel >= 0)
126 // m_Remote.SetCurSel(remoteSel);
127 this->SetRemote(remoteName);
129 //Select branch
130 m_ctrlRemoteBranch.AddString(remoteBranchName);
131 CbnSelchangeRemoteBranch();
134 else
136 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlRemoteBranch, m_RemoteBranchFilter))
137 CbnSelchangeRemoteBranch();
141 virtual void LocalBranchChange(){};
142 virtual void RemoteBranchChange(){};
143 virtual void SetRemote(CString remote){};
145 void AddBranchToolTips(CHistoryCombo *pBranch, CToolTips *tip)
147 if(pBranch&&tip)
149 CString text=pBranch->GetString();
150 CString tooltip;
151 GitRev rev;
153 if(rev.GetCommit(text))
155 ASSERT(FALSE);
156 return;
159 tooltip.Format(_T("%s: %s\n%s: %s\n%s: %s\n%s:\n<b>%s</b>\n%s"),
160 CString(MAKEINTRESOURCE(IDS_LOG_REVISION)),
161 rev.m_CommitHash.ToString(),
162 CString(MAKEINTRESOURCE(IDS_LOG_AUTHOR)),
163 rev.GetAuthorName(),
164 CString(MAKEINTRESOURCE(IDS_LOG_DATE)),
165 CLoglistUtils::FormatDateAndTime(rev.GetAuthorDate(), DATE_LONGDATE),
166 CString(MAKEINTRESOURCE(IDS_LOG_MESSAGE)),
167 rev.GetSubject(),
168 rev.GetBody());
170 pBranch->DisableTooltip();
172 tip->AddTool(pBranch->GetComboBoxCtrl(),tooltip);
176 void LoadBranchInfo()
178 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);
179 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);
181 STRING_VECTOR list;
182 list.clear();
183 int current=0;
184 m_ctrlLocalBranch.Reset();
185 m_ctrlRemoteBranch.Reset();
187 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL_F);
189 m_ctrlLocalBranch.AddString(list);
191 CString currentBranch = g_Git.GetSymbolicRef();
193 if(this->m_RegKeyRemoteBranch.IsEmpty())
195 list.clear();
196 g_Git.GetBranchList(list,&current,CGit::BRANCH_REMOTE);
198 m_ctrlRemoteBranch.AddString(list);
201 else
203 m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch,_T("sync"));
206 if(!this->m_strLocalBranch.IsEmpty())
208 m_ctrlLocalBranch.AddString(m_strLocalBranch);
209 currentBranch = m_strLocalBranch;
211 else
213 m_ctrlLocalBranch.SetCurSel(current);
216 if(!m_strRemoteBranch.IsEmpty())
218 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
219 m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);
221 else
223 CbnSelchangeLocalBranch();
226 this->LocalBranchChange();
227 this->RemoteBranchChange();
230 public:
231 CString m_strLocalBranch;
232 CString m_strRemoteBranch;
234 void SaveHistory()
236 if(!this->m_RegKeyRemoteBranch.IsEmpty())
238 m_ctrlRemoteBranch.AddString(m_strRemoteBranch);
239 m_ctrlRemoteBranch.SaveHistory();
244 #define BRANCH_COMBOX_DDX \
245 DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH, m_ctrlLocalBranch); \
246 DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH, m_ctrlRemoteBranch); \
248 #define BRANCH_COMBOX_EVENT \
249 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH, OnCbnSelchangeLocalBranch) \
250 ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH, OnCbnSelchangeRemoteBranch) \
251 ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH, OnBnClickedButtonBrowseLocalBranch) \
252 ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH, OnBnClickedButtonBrowseRemoteBranch) \
254 #define BRANCH_COMBOX_ADD_ANCHOR() \
255 AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\
256 AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\
257 AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\
258 AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\
259 AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);
261 #define BRANCH_COMBOX_EVENT_HANDLE() \
262 afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \
263 afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\
264 afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\
265 afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}