OSDN Git Service

Fixed issue #150: When pushing, 'remote' should default to the tracked branch, or...
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / BranchCombox.h
1 #pragma once\r
2 #include "afxwin.h"\r
3 #include "LogDlg.h"\r
4 #include "BrowseRefsDlg.h"\r
5 #include "HistoryCombo.h"\r
6 #include "Balloon.h"\r
7 #include "HistoryCombo.h"\r
8 #include "AppUtils.h"\r
9 \r
10 class CBranchCombox\r
11 {\r
12 public:\r
13         CBranchCombox()\r
14         {\r
15                 m_LocalBranchFilter = gPickRef_Head;\r
16                 m_RemoteBranchFilter = gPickRef_Remote;\r
17                 m_DialogName=_T("sync");\r
18                 m_pTooltip=NULL;\r
19                 \r
20         }\r
21 protected:\r
22         CHistoryCombo m_ctrlLocalBranch;\r
23         CHistoryCombo m_ctrlRemoteBranch;\r
24         int m_LocalBranchFilter;\r
25         int m_RemoteBranchFilter;\r
26 \r
27         CBalloon *m_pTooltip;\r
28         \r
29         CString m_DialogName;\r
30         \r
31         CString m_RegKeyRemoteBranch;\r
32 \r
33         void  CbnSelchangeLocalBranch()\r
34         {\r
35                 //Select pull-remote from current branch\r
36                 CString configName;\r
37                 CString currentBranch=this->m_ctrlLocalBranch.GetString();\r
38                 configName.Format(L"branch.%s.remote", currentBranch);\r
39                 CString pullRemote = g_Git.GetConfigValue(configName);\r
40 \r
41                 this->SetRemote(pullRemote);\r
42 \r
43                 //Select pull-branch from current branch\r
44                 configName.Format(L"branch.%s.merge", currentBranch);\r
45                 CString pullBranch = CGit::StripRefName(g_Git.GetConfigValue(configName));\r
46 \r
47                 CString defaultUpstream;\r
48                 defaultUpstream.Format(L"remotes/%s/%s", pullRemote, pullBranch);\r
49                 int found = m_ctrlRemoteBranch.FindStringExact(0, defaultUpstream);\r
50                 if(found >= 0)\r
51                 {\r
52                         m_ctrlRemoteBranch.SetCurSel(found);\r
53                 }\r
54                 else if(!pullBranch.IsEmpty())\r
55                 {\r
56                         m_ctrlRemoteBranch.AddString(pullBranch);\r
57                 }\r
58                 //else if(!this->m_RegKeyRemoteBranch.IsEmpty())\r
59                 else\r
60                 {\r
61                         m_ctrlRemoteBranch.SetCurSel(-1);\r
62                 }\r
63                 \r
64                 this->AddBranchToolTips(&this->m_ctrlLocalBranch,this->m_pTooltip);\r
65 \r
66                 LocalBranchChange();\r
67         };\r
68         void  CbnSelchangeRemoteBranch()\r
69         {\r
70                 if(this->m_RegKeyRemoteBranch.IsEmpty())\r
71                         this->AddBranchToolTips(&this->m_ctrlRemoteBranch,this->m_pTooltip);\r
72 \r
73                 RemoteBranchChange();\r
74         }\r
75         void  BnClickedButtonBrowseLocalBranch()\r
76         {\r
77                 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlLocalBranch, m_LocalBranchFilter))    \r
78                         CbnSelchangeLocalBranch();\r
79         }\r
80         void  BnClickedButtonBrowseRemoteBranch()\r
81         {\r
82                 if(!this->m_RegKeyRemoteBranch.IsEmpty())\r
83                 {\r
84                         CString remoteBranchName;\r
85                         CString remoteName;\r
86                         this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);\r
87                         //remoteName = m_Remote.GetString();\r
88                         //remoteBranchName = remoteName + '/' + remoteBranchName;\r
89                         remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);\r
90                         if(remoteBranchName.IsEmpty())\r
91                                 return; //Canceled\r
92 \r
93                         remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'\r
94                         int slashPlace = remoteBranchName.Find('/');\r
95                         remoteName = remoteBranchName.Left(slashPlace);\r
96                         remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')\r
97 \r
98                         //Select remote\r
99                         //int remoteSel = m_Remote.FindStringExact(0,remoteName);\r
100                         //if(remoteSel >= 0)\r
101                         //      m_Remote.SetCurSel(remoteSel);\r
102                         this->SetRemote(remoteName);\r
103 \r
104                         //Select branch\r
105                         m_ctrlRemoteBranch.AddString(remoteBranchName);\r
106                         CbnSelchangeRemoteBranch();\r
107 \r
108                 }else\r
109                 {\r
110                         if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlRemoteBranch, m_RemoteBranchFilter))  \r
111                                 CbnSelchangeRemoteBranch();\r
112                 }\r
113         }\r
114 \r
115         virtual void LocalBranchChange(){};\r
116         virtual void RemoteBranchChange(){};\r
117         virtual void SetRemote(CString remote){};\r
118 \r
119         void AddBranchToolTips(CHistoryCombo *pBranch,CBalloon *tip)\r
120         {\r
121                 if(pBranch&&tip)\r
122                 {\r
123                         CString text=pBranch->GetString();\r
124                         CString tooltip;\r
125                         BYTE_VECTOR data;\r
126                         g_Git.GetLog(data,text,NULL,1,0);\r
127                         GitRev rev;\r
128                         rev.ParserFromLog(data);\r
129                         tooltip.Format(_T("CommitHash:%s\nCommit by: %s  %s\n <b>%s</b> \n %s"),\r
130                                 rev.m_CommitHash,\r
131                                 rev.m_AuthorName,\r
132                                 CAppUtils::FormatDateAndTime(rev.m_AuthorDate,DATE_LONGDATE),\r
133                                 rev.m_Subject,\r
134                                 rev.m_Body);\r
135 \r
136                         pBranch->DisableTooltip();\r
137                         \r
138                         tip->AddTool(pBranch->GetComboBoxCtrl(),tooltip);\r
139                 }\r
140         }\r
141                 \r
142         void LoadBranchInfo()\r
143         {\r
144                 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);\r
145                 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);\r
146 \r
147                 STRING_VECTOR list;\r
148                 list.clear();\r
149                 int current;\r
150                 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL);\r
151                 m_ctrlLocalBranch.AddString(list);\r
152 \r
153                 CString currentBranch = g_Git.GetSymbolicRef();\r
154                 \r
155                 if(this->m_RegKeyRemoteBranch.IsEmpty())\r
156                 {\r
157                         list.clear();\r
158                         g_Git.GetBranchList(list,&current,CGit::BRANCH_REMOTE);\r
159                 \r
160                         m_ctrlRemoteBranch.AddString(list);\r
161 \r
162                 }else\r
163                 {\r
164                         m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch,_T("sync"));\r
165                 }\r
166 \r
167                 if(!this->m_strLocalBranch.IsEmpty())\r
168                 {\r
169                         m_ctrlLocalBranch.AddString(m_strLocalBranch);\r
170                         currentBranch = m_strLocalBranch;\r
171                 }\r
172                 else\r
173                 {\r
174                         m_ctrlLocalBranch.SetCurSel(current);\r
175                 }\r
176 \r
177                 if(!m_strRemoteBranch.IsEmpty())\r
178                 {\r
179                         m_ctrlRemoteBranch.AddString(m_strRemoteBranch);\r
180                         m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);\r
181                 }\r
182                 else\r
183                 {\r
184                         CbnSelchangeLocalBranch();\r
185                 }\r
186 \r
187                 this->LocalBranchChange();\r
188                 this->RemoteBranchChange();\r
189         }\r
190         \r
191 public:\r
192         CString m_strLocalBranch;\r
193         CString m_strRemoteBranch;\r
194 \r
195         void SaveHistory()\r
196         {\r
197                 if(!this->m_RegKeyRemoteBranch.IsEmpty())\r
198                 {\r
199                         m_ctrlRemoteBranch.AddString(m_strRemoteBranch);\r
200                         m_ctrlRemoteBranch.SaveHistory();\r
201                 }\r
202         }\r
203 };\r
204 \r
205 #define BRANCH_COMBOX_DDX \\r
206         DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH,           m_ctrlLocalBranch);      \\r
207         DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH,          m_ctrlRemoteBranch);     \\r
208 \r
209 #define BRANCH_COMBOX_EVENT \\r
210         ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH,   OnCbnSelchangeLocalBranch)      \\r
211         ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH,  OnCbnSelchangeRemoteBranch)     \\r
212         ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH,                  OnBnClickedButtonBrowseLocalBranch) \\r
213         ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH,                 OnBnClickedButtonBrowseRemoteBranch) \\r
214 \r
215 #define BRANCH_COMBOX_ADD_ANCHOR() \\r
216         AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\\r
217         AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\\r
218         AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\\r
219         AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\\r
220         AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);\r
221 \r
222 #define BRANCH_COMBOX_EVENT_HANDLE() \\r
223         afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \\r
224         afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\\r
225         afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\\r
226         afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}\r
227 \r