OSDN Git Service

Git log basic work but graph tree is wrong when scroll
[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                         int index=m_ctrlRemoteBranch.FindStringExact(0,pullBranch);\r
57                         if( index<0 )\r
58                                 m_ctrlRemoteBranch.AddString(pullBranch);\r
59                         else\r
60                                 m_ctrlRemoteBranch.SetCurSel(index);\r
61                 }\r
62                 //else if(!this->m_RegKeyRemoteBranch.IsEmpty())\r
63                 else\r
64                 {\r
65                         m_ctrlRemoteBranch.SetCurSel(-1);\r
66                 }\r
67                 \r
68                 this->AddBranchToolTips(&this->m_ctrlLocalBranch,this->m_pTooltip);\r
69 \r
70                 LocalBranchChange();\r
71         };\r
72         void  CbnSelchangeRemoteBranch()\r
73         {\r
74                 if(this->m_RegKeyRemoteBranch.IsEmpty())\r
75                         this->AddBranchToolTips(&this->m_ctrlRemoteBranch,this->m_pTooltip);\r
76 \r
77                 RemoteBranchChange();\r
78         }\r
79         void  BnClickedButtonBrowseLocalBranch()\r
80         {\r
81                 if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlLocalBranch, m_LocalBranchFilter))    \r
82                         CbnSelchangeLocalBranch();\r
83         }\r
84         void  BnClickedButtonBrowseRemoteBranch()\r
85         {\r
86                 if(!this->m_RegKeyRemoteBranch.IsEmpty())\r
87                 {\r
88                         CString remoteBranchName;\r
89                         CString remoteName;\r
90                         this->m_ctrlRemoteBranch.GetWindowText(remoteBranchName);\r
91                         //remoteName = m_Remote.GetString();\r
92                         //remoteBranchName = remoteName + '/' + remoteBranchName;\r
93                         remoteBranchName = CBrowseRefsDlg::PickRef(false, remoteBranchName, gPickRef_Remote);\r
94                         if(remoteBranchName.IsEmpty())\r
95                                 return; //Canceled\r
96 \r
97                         remoteBranchName = remoteBranchName.Mid(13);//Strip 'refs/remotes/'\r
98                         int slashPlace = remoteBranchName.Find('/');\r
99                         remoteName = remoteBranchName.Left(slashPlace);\r
100                         remoteBranchName = remoteBranchName.Mid(slashPlace + 1); //Strip remote name (for example 'origin/')\r
101 \r
102                         //Select remote\r
103                         //int remoteSel = m_Remote.FindStringExact(0,remoteName);\r
104                         //if(remoteSel >= 0)\r
105                         //      m_Remote.SetCurSel(remoteSel);\r
106                         this->SetRemote(remoteName);\r
107 \r
108                         //Select branch\r
109                         m_ctrlRemoteBranch.AddString(remoteBranchName);\r
110                         CbnSelchangeRemoteBranch();\r
111 \r
112                 }else\r
113                 {\r
114                         if(CBrowseRefsDlg::PickRefForCombo(&m_ctrlRemoteBranch, m_RemoteBranchFilter))  \r
115                                 CbnSelchangeRemoteBranch();\r
116                 }\r
117         }\r
118 \r
119         virtual void LocalBranchChange(){};\r
120         virtual void RemoteBranchChange(){};\r
121         virtual void SetRemote(CString remote){};\r
122 \r
123         void AddBranchToolTips(CHistoryCombo *pBranch,CBalloon *tip)\r
124         {\r
125                 if(pBranch&&tip)\r
126                 {\r
127                         CString text=pBranch->GetString();\r
128                         CString tooltip;\r
129                         BYTE_VECTOR data;\r
130                         g_Git.GetLog(data,text,NULL,1,0);\r
131                         GitRev rev;\r
132                         rev.ParserFromLog(data);\r
133                         tooltip.Format(_T("CommitHash:%s\nCommit by: %s  %s\n <b>%s</b> \n %s"),\r
134                                 rev.m_CommitHash,\r
135                                 rev.m_AuthorName,\r
136                                 CAppUtils::FormatDateAndTime(rev.m_AuthorDate,DATE_LONGDATE),\r
137                                 rev.m_Subject,\r
138                                 rev.m_Body);\r
139 \r
140                         pBranch->DisableTooltip();\r
141                         \r
142                         tip->AddTool(pBranch->GetComboBoxCtrl(),tooltip);\r
143                 }\r
144         }\r
145                 \r
146         void LoadBranchInfo()\r
147         {\r
148                 m_ctrlLocalBranch.SetMaxHistoryItems(0x0FFFFFFF);\r
149                 m_ctrlRemoteBranch.SetMaxHistoryItems(0x0FFFFFFF);\r
150 \r
151                 STRING_VECTOR list;\r
152                 list.clear();\r
153                 int current;\r
154                 g_Git.GetBranchList(list,&current,CGit::BRANCH_LOCAL);\r
155                 m_ctrlLocalBranch.AddString(list);\r
156 \r
157                 CString currentBranch = g_Git.GetSymbolicRef();\r
158                 \r
159                 if(this->m_RegKeyRemoteBranch.IsEmpty())\r
160                 {\r
161                         list.clear();\r
162                         g_Git.GetBranchList(list,&current,CGit::BRANCH_REMOTE);\r
163                 \r
164                         m_ctrlRemoteBranch.AddString(list);\r
165 \r
166                 }else\r
167                 {\r
168                         m_ctrlRemoteBranch.LoadHistory(m_RegKeyRemoteBranch,_T("sync"));\r
169                 }\r
170 \r
171                 if(!this->m_strLocalBranch.IsEmpty())\r
172                 {\r
173                         m_ctrlLocalBranch.AddString(m_strLocalBranch);\r
174                         currentBranch = m_strLocalBranch;\r
175                 }\r
176                 else\r
177                 {\r
178                         m_ctrlLocalBranch.SetCurSel(current);\r
179                 }\r
180 \r
181                 if(!m_strRemoteBranch.IsEmpty())\r
182                 {\r
183                         m_ctrlRemoteBranch.AddString(m_strRemoteBranch);\r
184                         m_ctrlRemoteBranch.SetCurSel(m_ctrlRemoteBranch.GetCount()-1);\r
185                 }\r
186                 else\r
187                 {\r
188                         CbnSelchangeLocalBranch();\r
189                 }\r
190 \r
191                 this->LocalBranchChange();\r
192                 this->RemoteBranchChange();\r
193         }\r
194         \r
195 public:\r
196         CString m_strLocalBranch;\r
197         CString m_strRemoteBranch;\r
198 \r
199         void SaveHistory()\r
200         {\r
201                 if(!this->m_RegKeyRemoteBranch.IsEmpty())\r
202                 {\r
203                         m_ctrlRemoteBranch.AddString(m_strRemoteBranch);\r
204                         m_ctrlRemoteBranch.SaveHistory();\r
205                 }\r
206         }\r
207 };\r
208 \r
209 #define BRANCH_COMBOX_DDX \\r
210         DDX_Control(pDX, IDC_COMBOBOXEX_LOCAL_BRANCH,           m_ctrlLocalBranch);      \\r
211         DDX_Control(pDX, IDC_COMBOBOXEX_REMOTE_BRANCH,          m_ctrlRemoteBranch);     \\r
212 \r
213 #define BRANCH_COMBOX_EVENT \\r
214         ON_CBN_SELCHANGE(IDC_COMBOBOXEX_LOCAL_BRANCH,   OnCbnSelchangeLocalBranch)      \\r
215         ON_CBN_SELCHANGE(IDC_COMBOBOXEX_REMOTE_BRANCH,  OnCbnSelchangeRemoteBranch)     \\r
216         ON_BN_CLICKED(IDC_BUTTON_LOCAL_BRANCH,                  OnBnClickedButtonBrowseLocalBranch) \\r
217         ON_BN_CLICKED(IDC_BUTTON_REMOTE_BRANCH,                 OnBnClickedButtonBrowseRemoteBranch) \\r
218 \r
219 #define BRANCH_COMBOX_ADD_ANCHOR() \\r
220         AddAnchor(IDC_COMBOBOXEX_LOCAL_BRANCH,TOP_LEFT);\\r
221         AddAnchor(IDC_COMBOBOXEX_REMOTE_BRANCH,TOP_RIGHT);\\r
222         AddAnchor(IDC_BUTTON_LOCAL_BRANCH,TOP_LEFT);\\r
223         AddAnchor(IDC_BUTTON_REMOTE_BRANCH,TOP_RIGHT);\\r
224         AddAnchor(IDC_STATIC_REMOTE_BRANCH,TOP_RIGHT);\r
225 \r
226 #define BRANCH_COMBOX_EVENT_HANDLE() \\r
227         afx_msg void OnCbnSelchangeLocalBranch(){CbnSelchangeLocalBranch();} \\r
228         afx_msg void OnCbnSelchangeRemoteBranch(){CbnSelchangeRemoteBranch();}\\r
229         afx_msg void OnBnClickedButtonBrowseLocalBranch(){BnClickedButtonBrowseLocalBranch();}\\r
230         afx_msg void OnBnClickedButtonBrowseRemoteBranch(){BnClickedButtonBrowseRemoteBranch();}\r
231 \r