OSDN Git Service

7a04f71fd293823bd68f417effe05f3b9dcb5fbc
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / SyncDlg.cpp
1 // TortoiseGit - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2008-2009 - TortoiseGit\r
4 \r
5 // This program is free software; you can redistribute it and/or\r
6 // modify it under the terms of the GNU General Public License\r
7 // as published by the Free Software Foundation; either version 2\r
8 // of the License, or (at your option) any later version.\r
9 \r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 \r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, write to the Free Software Foundation,\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
18 //\r
19 \r
20 // SyncDlg.cpp : implementation file\r
21 //\r
22 \r
23 #include "stdafx.h"\r
24 #include "TortoiseProc.h"\r
25 #include "SyncDlg.h"\r
26 \r
27 \r
28 // CSyncDlg dialog\r
29 \r
30 IMPLEMENT_DYNAMIC(CSyncDlg, CResizableStandAloneDialog)\r
31 \r
32 CSyncDlg::CSyncDlg(CWnd* pParent /*=NULL*/)\r
33         : CResizableStandAloneDialog(CSyncDlg::IDD, pParent)\r
34         , m_bAutoLoadPuttyKey(FALSE)\r
35 {\r
36         m_pTooltip=&this->m_tooltips;\r
37         m_bInited=false;\r
38 }\r
39 \r
40 CSyncDlg::~CSyncDlg()\r
41 {\r
42 }\r
43 \r
44 void CSyncDlg::DoDataExchange(CDataExchange* pDX)\r
45 {\r
46         CDialog::DoDataExchange(pDX);\r
47         DDX_Check(pDX, IDC_CHECK_PUTTY_KEY, m_bAutoLoadPuttyKey);\r
48         DDX_Control(pDX, IDC_COMBOBOXEX_URL, m_ctrlURL);\r
49         DDX_Control(pDX, IDC_BUTTON_TABCTRL, m_ctrlDumyButton);\r
50         DDX_Control(pDX, IDC_BUTTON_PULL, m_ctrlPull);\r
51         DDX_Control(pDX, IDC_BUTTON_PUSH, m_ctrlPush);\r
52         DDX_Control(pDX, IDC_STATIC_STATUS, m_ctrlStatus);\r
53         DDX_Control(pDX, IDC_PROGRESS_SYNC, m_ctrlProgress);\r
54         DDX_Control(pDX, IDC_ANIMATE_SYNC, m_ctrlAnimate);\r
55 \r
56         BRANCH_COMBOX_DDX;\r
57 }\r
58 \r
59 \r
60 BEGIN_MESSAGE_MAP(CSyncDlg, CResizableStandAloneDialog)\r
61         ON_BN_CLICKED(IDC_BUTTON_PULL, &CSyncDlg::OnBnClickedButtonPull)\r
62         ON_BN_CLICKED(IDC_BUTTON_PUSH, &CSyncDlg::OnBnClickedButtonPush)\r
63         ON_BN_CLICKED(IDC_BUTTON_APPLY, &CSyncDlg::OnBnClickedButtonApply)\r
64         ON_BN_CLICKED(IDC_BUTTON_EMAIL, &CSyncDlg::OnBnClickedButtonEmail)\r
65         ON_BN_CLICKED(IDC_BUTTON_MANAGE, &CSyncDlg::OnBnClickedButtonManage)\r
66         BRANCH_COMBOX_EVENT\r
67         ON_NOTIFY(CBEN_ENDEDIT, IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbenEndeditComboboxexUrl)\r
68         ON_CBN_EDITCHANGE(IDC_COMBOBOXEX_URL, &CSyncDlg::OnCbnEditchangeComboboxexUrl)\r
69 END_MESSAGE_MAP()\r
70 \r
71 \r
72 // CSyncDlg message handlers\r
73 \r
74 void CSyncDlg::OnBnClickedButtonPull()\r
75 {\r
76         // TODO: Add your control notification handler code here\r
77         this->m_regPullButton =this->m_ctrlPull.GetCurrentEntry();\r
78 }\r
79 \r
80 void CSyncDlg::OnBnClickedButtonPush()\r
81 {\r
82         // TODO: Add your control notification handler code here\r
83         this->m_regPushButton=this->m_ctrlPush.GetCurrentEntry();\r
84 \r
85 }\r
86 \r
87 void CSyncDlg::OnBnClickedButtonApply()\r
88 {\r
89         // TODO: Add your control notification handler code here\r
90 }\r
91 \r
92 void CSyncDlg::OnBnClickedButtonEmail()\r
93 {\r
94         // TODO: Add your control notification handler code here\r
95 }\r
96 \r
97 BOOL CSyncDlg::OnInitDialog()\r
98 {\r
99         CResizableStandAloneDialog::OnInitDialog();\r
100 \r
101         //Create Tabctrl\r
102         CWnd *pwnd=this->GetDlgItem(IDC_BUTTON_TABCTRL);\r
103         CRect rectDummy;\r
104         pwnd->GetWindowRect(&rectDummy);\r
105         this->ScreenToClient(rectDummy);\r
106 \r
107         if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_SYNC_TAB))\r
108         {\r
109                 TRACE0("Failed to create output tab window\n");\r
110                 return FALSE;      // fail to create\r
111         }\r
112         m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);\r
113 \r
114         DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP;\r
115 \r
116         if( !m_OutLogList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_LOGLIST))\r
117         {\r
118                 TRACE0("Failed to create output commits window\n");\r
119                 return FALSE;      // fail to create\r
120 \r
121         }\r
122         m_ctrlTabCtrl.InsertTab(&m_OutLogList,_T("Out Commits"),0);\r
123 \r
124         m_OutLogList.InsertGitColumn();\r
125 \r
126         dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
127         \r
128         if( !m_OutChangeFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_CHANGELIST))\r
129         {\r
130                 TRACE0("Failed to create output change files window\n");\r
131                 return FALSE;      // fail to create\r
132         }\r
133         m_ctrlTabCtrl.InsertTab(&m_OutChangeFileList,_T("Out ChangeList"),1);\r
134 \r
135         m_OutChangeFileList.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("OutSyncDlg"),\r
136                                     (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_COMPARETWO)|\r
137                                                         CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_GNUDIFF2)),false);\r
138 \r
139         this->m_tooltips.Create(this);\r
140 \r
141         AddAnchor(IDC_SYNC_TAB,TOP_LEFT,BOTTOM_RIGHT);\r
142 \r
143         AddAnchor(IDC_GROUP_INFO,TOP_LEFT,TOP_RIGHT);\r
144         AddAnchor(IDC_COMBOBOXEX_URL,TOP_LEFT,TOP_RIGHT);\r
145         AddAnchor(IDC_BUTTON_MANAGE,TOP_RIGHT);\r
146         AddAnchor(IDC_BUTTON_PULL,BOTTOM_LEFT);\r
147         AddAnchor(IDC_BUTTON_PUSH,BOTTOM_LEFT);\r
148         AddAnchor(IDC_BUTTON_APPLY,BOTTOM_LEFT);\r
149         AddAnchor(IDC_BUTTON_EMAIL,BOTTOM_LEFT);\r
150         AddAnchor(IDC_PROGRESS_SYNC,BOTTOM_LEFT,BOTTOM_RIGHT);\r
151         AddAnchor(IDOK,BOTTOM_RIGHT);\r
152         AddAnchor(IDHELP,BOTTOM_RIGHT);\r
153         AddAnchor(IDC_STATIC_STATUS,BOTTOM_LEFT);\r
154         AddAnchor(IDC_ANIMATE_SYNC,TOP_RIGHT);\r
155         \r
156         BRANCH_COMBOX_ADD_ANCHOR();\r
157 \r
158         CString WorkingDir=g_Git.m_CurrentDir;\r
159         WorkingDir.Replace(_T(':'),_T('_'));\r
160         m_RegKeyRemoteBranch = CString(_T("Software\\TortoiseGit\\History\\SyncBranch\\"))+WorkingDir;\r
161 \r
162 \r
163         this->AddOthersToAnchor();\r
164         // TODO:  Add extra initialization here\r
165 \r
166         this->m_ctrlPush.AddEntry(CString(_T("Push")));\r
167         this->m_ctrlPush.AddEntry(CString(_T("Push tags")));\r
168         this->m_ctrlPush.AddEntry(CString(_T("Push All")));\r
169 \r
170         this->m_ctrlPull.AddEntry(CString(_T("&Pull")));\r
171         this->m_ctrlPull.AddEntry(CString(_T("&Fetch")));\r
172         this->m_ctrlPull.AddEntry(CString(_T("Fetch&&Rebase")));\r
173 \r
174         \r
175         WorkingDir.Replace(_T(':'),_T('_'));\r
176 \r
177         CString regkey ;\r
178         regkey.Format(_T("Software\\TortoiseGit\\TortoiseProc\\Sync\\%s"),WorkingDir);\r
179 \r
180         this->m_regPullButton = CRegDWORD(regkey+_T("\\Pull"),0);\r
181         this->m_regPushButton = CRegDWORD(regkey+_T("\\Push"),0);\r
182 \r
183         this->m_ctrlPull.SetCurrentEntry(this->m_regPullButton);\r
184         this->m_ctrlPush.SetCurrentEntry(this->m_regPushButton);\r
185 \r
186         CString str;\r
187         this->GetWindowText(str);\r
188         str += _T(" - ") + g_Git.m_CurrentDir;\r
189         this->SetWindowText(str);\r
190 \r
191         EnableSaveRestore(_T("SyncDlg"));\r
192 \r
193         this->LoadBranchInfo();\r
194 \r
195         this->m_bInited=true;\r
196         FetchOutList();\r
197         \r
198         return TRUE;  // return TRUE unless you set the focus to a control\r
199         // EXCEPTION: OCX Property Pages should return FALSE\r
200 }\r
201 \r
202 void CSyncDlg::OnBnClickedButtonManage()\r
203 {\r
204         // TODO: Add your control notification handler code here\r
205         CAppUtils::LaunchRemoteSetting();\r
206 }\r
207 \r
208 BOOL CSyncDlg::PreTranslateMessage(MSG* pMsg)\r
209 {\r
210         // TODO: Add your specialized code here and/or call the base class\r
211         m_tooltips.RelayEvent(pMsg);\r
212         return __super::PreTranslateMessage(pMsg);\r
213 }\r
214 void CSyncDlg::FetchOutList()\r
215 {\r
216         if(!m_bInited)\r
217                 return;\r
218         m_OutChangeFileList.Clear();\r
219         this->m_OutLogList.Clear();\r
220 \r
221         CString remote;\r
222         this->m_ctrlURL.GetWindowText(remote);\r
223         CString remotebranch;\r
224         this->m_ctrlRemoteBranch.GetWindowText(remotebranch);\r
225         remotebranch=remote+_T("/")+remotebranch;\r
226 \r
227         if(IsURL())\r
228         {\r
229                 CString str;\r
230                 str=_T("Don't know what will push befause you enter URL");\r
231                 m_OutLogList.ShowText(str);\r
232                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
233                 m_OutLocalBranch.Empty();\r
234                 m_OutRemoteBranch.Empty();\r
235                 return ;\r
236         \r
237         }else if(g_Git.GetHash(remotebranch).GetLength()<40)\r
238         {\r
239                 CString str;\r
240                 str.Format(_T("Don't know what will push befause unkown \"%s\""),remotebranch);\r
241                 m_OutLogList.ShowText(str);\r
242                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
243                 m_OutLocalBranch.Empty();\r
244                 m_OutRemoteBranch.Empty();\r
245                 return ;\r
246         }\r
247         else\r
248         {\r
249                 CString localbranch;\r
250                 localbranch=this->m_ctrlLocalBranch.GetString();\r
251 \r
252                 if(localbranch != m_OutLocalBranch || m_OutRemoteBranch != remotebranch)\r
253                 {\r
254                         m_OutLogList.ClearText();\r
255                         m_OutLogList.FillGitLog(NULL,CGit::     LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,\r
256                                 &remotebranch,&localbranch);\r
257                         \r
258                         CString str;\r
259                         if(m_OutLogList.GetItemCount() == 0)\r
260                         {                       \r
261                                 str.Format(_T("No commits ahead \"%s\""),remotebranch);\r
262                                 m_OutLogList.ShowText(str);\r
263                                 this->m_ctrlStatus.SetWindowText(str);\r
264                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
265                         }\r
266                         else\r
267                         {\r
268                                 str.Format(_T("%d commits ahead \"%s\""),m_OutLogList.GetItemCount(),remotebranch);\r
269                                 this->m_ctrlStatus.SetWindowText(str);\r
270                                 g_Git.GetCommitDiffList(localbranch,remotebranch,m_arOutChangeList);\r
271                                 m_OutChangeFileList.m_Rev1=localbranch;\r
272                                 m_OutChangeFileList.m_Rev2=remotebranch;\r
273                                 m_OutChangeFileList.Show(0,this->m_arOutChangeList);\r
274                                 m_OutChangeFileList.SetEmptyString(CString(_T("No changed file")));\r
275                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,TRUE);\r
276                         }\r
277                 }\r
278                 this->m_OutLocalBranch=localbranch;\r
279                 this->m_OutRemoteBranch=remotebranch;\r
280         }\r
281 \r
282 }\r
283 \r
284 bool CSyncDlg::IsURL()\r
285 {\r
286         CString str;\r
287         this->m_ctrlURL.GetWindowText(str);\r
288         if(str.Find(_T('\\'))>=0 || str.Find(_T('/'))>=0)\r
289                 return true;\r
290         else\r
291                 return false;\r
292 }\r
293 void CSyncDlg::OnCbenEndeditComboboxexUrl(NMHDR *pNMHDR, LRESULT *pResult)\r
294 {\r
295         // TODO: Add your control notification handler code here\r
296         *pResult = 0;\r
297 }\r
298 \r
299 void CSyncDlg::OnCbnEditchangeComboboxexUrl()\r
300 {\r
301         this->FetchOutList();\r
302         // TODO: Add your control notification handler code here\r
303 }\r