OSDN Git Service

f5be9947ca941dfe707a3f02182b8cfdec916057
[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         this->SwitchToRun();\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 void CSyncDlg::ShowProgressCtrl(bool bShow)\r
97 {\r
98         int b=bShow?SW_NORMAL:SW_HIDE;\r
99         this->m_ctrlAnimate.ShowWindow(b);\r
100         this->m_ctrlProgress.ShowWindow(b);\r
101         this->m_ctrlAnimate.Open(IDR_DOWNLOAD);\r
102         if(b == SW_NORMAL)\r
103                 this->m_ctrlAnimate.Play(0,-1,-1);\r
104         else\r
105                 this->m_ctrlAnimate.Stop();\r
106 }\r
107 void CSyncDlg::ShowInputCtrl(bool bShow)\r
108 {\r
109         int b=bShow?SW_NORMAL:SW_HIDE;\r
110         this->m_ctrlURL.ShowWindow(b);\r
111         this->m_ctrlLocalBranch.ShowWindow(b);\r
112         this->m_ctrlRemoteBranch.ShowWindow(b);\r
113         this->GetDlgItem(IDC_BUTTON_LOCAL_BRANCH)->ShowWindow(b);\r
114         this->GetDlgItem(IDC_BUTTON_REMOTE_BRANCH)->ShowWindow(b);\r
115         this->GetDlgItem(IDC_STATIC_LOCAL_BRANCH)->ShowWindow(b);\r
116         this->GetDlgItem(IDC_STATIC_REMOTE_BRANCH)->ShowWindow(b);\r
117         this->GetDlgItem(IDC_BUTTON_MANAGE)->ShowWindow(b);\r
118         this->GetDlgItem(IDC_CHECK_PUTTY_KEY)->ShowWindow(b);\r
119         this->GetDlgItem(IDC_CHECK_FORCE)->ShowWindow(b);\r
120         this->GetDlgItem(IDC_STATIC_REMOTE_URL)->ShowWindow(b);\r
121         \r
122 }\r
123 BOOL CSyncDlg::OnInitDialog()\r
124 {\r
125         CResizableStandAloneDialog::OnInitDialog();\r
126 \r
127         /*\r
128         this->m_ctrlAnimate.ShowWindow(SW_NORMAL);\r
129         this->m_ctrlAnimate.Open(IDR_DOWNLOAD);\r
130         this->m_ctrlAnimate.Play(0,-1,-1);\r
131     */\r
132 \r
133         //Create Tabctrl\r
134         CWnd *pwnd=this->GetDlgItem(IDC_BUTTON_TABCTRL);\r
135         CRect rectDummy;\r
136         pwnd->GetWindowRect(&rectDummy);\r
137         this->ScreenToClient(rectDummy);\r
138 \r
139         if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_SYNC_TAB))\r
140         {\r
141                 TRACE0("Failed to create output tab window\n");\r
142                 return FALSE;      // fail to create\r
143         }\r
144         m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);\r
145 \r
146         DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP;\r
147 \r
148         if( !m_OutLogList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_LOGLIST))\r
149         {\r
150                 TRACE0("Failed to create output commits window\n");\r
151                 return FALSE;      // fail to create\r
152 \r
153         }\r
154         m_ctrlTabCtrl.InsertTab(&m_OutLogList,_T("Out Commits"),0);\r
155 \r
156         m_OutLogList.InsertGitColumn();\r
157 \r
158         dwStyle = LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;\r
159         \r
160         if( !m_OutChangeFileList.Create(dwStyle,rectDummy,&m_ctrlTabCtrl,IDC_OUT_CHANGELIST))\r
161         {\r
162                 TRACE0("Failed to create output change files window\n");\r
163                 return FALSE;      // fail to create\r
164         }\r
165         m_ctrlTabCtrl.InsertTab(&m_OutChangeFileList,_T("Out ChangeList"),1);\r
166 \r
167         m_OutChangeFileList.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS |SVNSLC_COLADD|SVNSLC_COLDEL , _T("OutSyncDlg"),\r
168                                     (CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_COMPARETWO)|\r
169                                                         CGitStatusListCtrl::GetContextMenuBit(CGitStatusListCtrl::IDSVNLC_GNUDIFF2)),false);\r
170 \r
171         this->m_tooltips.Create(this);\r
172 \r
173         AddAnchor(IDC_SYNC_TAB,TOP_LEFT,BOTTOM_RIGHT);\r
174 \r
175         AddAnchor(IDC_GROUP_INFO,TOP_LEFT,TOP_RIGHT);\r
176         AddAnchor(IDC_COMBOBOXEX_URL,TOP_LEFT,TOP_RIGHT);\r
177         AddAnchor(IDC_BUTTON_MANAGE,TOP_RIGHT);\r
178         AddAnchor(IDC_BUTTON_PULL,BOTTOM_LEFT);\r
179         AddAnchor(IDC_BUTTON_PUSH,BOTTOM_LEFT);\r
180         AddAnchor(IDC_BUTTON_APPLY,BOTTOM_LEFT);\r
181         AddAnchor(IDC_BUTTON_EMAIL,BOTTOM_LEFT);\r
182         AddAnchor(IDC_PROGRESS_SYNC,TOP_LEFT,TOP_RIGHT);\r
183         AddAnchor(IDOK,BOTTOM_RIGHT);\r
184         AddAnchor(IDHELP,BOTTOM_RIGHT);\r
185         AddAnchor(IDC_STATIC_STATUS,BOTTOM_LEFT);\r
186         AddAnchor(IDC_ANIMATE_SYNC,TOP_LEFT);\r
187         \r
188         BRANCH_COMBOX_ADD_ANCHOR();\r
189 \r
190         CString WorkingDir=g_Git.m_CurrentDir;\r
191         WorkingDir.Replace(_T(':'),_T('_'));\r
192         m_RegKeyRemoteBranch = CString(_T("Software\\TortoiseGit\\History\\SyncBranch\\"))+WorkingDir;\r
193 \r
194 \r
195         this->AddOthersToAnchor();\r
196         // TODO:  Add extra initialization here\r
197 \r
198         this->m_ctrlPush.AddEntry(CString(_T("Push")));\r
199         this->m_ctrlPush.AddEntry(CString(_T("Push tags")));\r
200         this->m_ctrlPush.AddEntry(CString(_T("Push All")));\r
201 \r
202         this->m_ctrlPull.AddEntry(CString(_T("&Pull")));\r
203         this->m_ctrlPull.AddEntry(CString(_T("&Fetch")));\r
204         this->m_ctrlPull.AddEntry(CString(_T("Fetch&&Rebase")));\r
205 \r
206         \r
207         WorkingDir.Replace(_T(':'),_T('_'));\r
208 \r
209         CString regkey ;\r
210         regkey.Format(_T("Software\\TortoiseGit\\TortoiseProc\\Sync\\%s"),WorkingDir);\r
211 \r
212         this->m_regPullButton = CRegDWORD(regkey+_T("\\Pull"),0);\r
213         this->m_regPushButton = CRegDWORD(regkey+_T("\\Push"),0);\r
214 \r
215         this->m_ctrlPull.SetCurrentEntry(this->m_regPullButton);\r
216         this->m_ctrlPush.SetCurrentEntry(this->m_regPushButton);\r
217 \r
218         CString str;\r
219         this->GetWindowText(str);\r
220         str += _T(" - ") + g_Git.m_CurrentDir;\r
221         this->SetWindowText(str);\r
222 \r
223         EnableSaveRestore(_T("SyncDlg"));\r
224 \r
225         this->LoadBranchInfo();\r
226 \r
227         this->m_bInited=true;\r
228         FetchOutList();\r
229         \r
230         return TRUE;  // return TRUE unless you set the focus to a control\r
231         // EXCEPTION: OCX Property Pages should return FALSE\r
232 }\r
233 \r
234 void CSyncDlg::OnBnClickedButtonManage()\r
235 {\r
236         // TODO: Add your control notification handler code here\r
237         CAppUtils::LaunchRemoteSetting();\r
238 }\r
239 \r
240 BOOL CSyncDlg::PreTranslateMessage(MSG* pMsg)\r
241 {\r
242         // TODO: Add your specialized code here and/or call the base class\r
243         m_tooltips.RelayEvent(pMsg);\r
244         return __super::PreTranslateMessage(pMsg);\r
245 }\r
246 void CSyncDlg::FetchOutList()\r
247 {\r
248         if(!m_bInited)\r
249                 return;\r
250         m_OutChangeFileList.Clear();\r
251         this->m_OutLogList.Clear();\r
252 \r
253         CString remote;\r
254         this->m_ctrlURL.GetWindowText(remote);\r
255         CString remotebranch;\r
256         this->m_ctrlRemoteBranch.GetWindowText(remotebranch);\r
257         remotebranch=remote+_T("/")+remotebranch;\r
258 \r
259         if(IsURL())\r
260         {\r
261                 CString str;\r
262                 str=_T("Don't know what will push befause you enter URL");\r
263                 m_OutLogList.ShowText(str);\r
264                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
265                 m_OutLocalBranch.Empty();\r
266                 m_OutRemoteBranch.Empty();\r
267                 return ;\r
268         \r
269         }else if(g_Git.GetHash(remotebranch).GetLength()<40)\r
270         {\r
271                 CString str;\r
272                 str.Format(_T("Don't know what will push befause unkown \"%s\""),remotebranch);\r
273                 m_OutLogList.ShowText(str);\r
274                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
275                 m_OutLocalBranch.Empty();\r
276                 m_OutRemoteBranch.Empty();\r
277                 return ;\r
278         }\r
279         else\r
280         {\r
281                 CString localbranch;\r
282                 localbranch=this->m_ctrlLocalBranch.GetString();\r
283 \r
284                 if(localbranch != m_OutLocalBranch || m_OutRemoteBranch != remotebranch)\r
285                 {\r
286                         m_OutLogList.ClearText();\r
287                         m_OutLogList.FillGitLog(NULL,CGit::     LOG_INFO_STAT| CGit::LOG_INFO_FILESTATE | CGit::LOG_INFO_SHOW_MERGEDFILE,\r
288                                 &remotebranch,&localbranch);\r
289                         \r
290                         CString str;\r
291                         if(m_OutLogList.GetItemCount() == 0)\r
292                         {                       \r
293                                 str.Format(_T("No commits ahead \"%s\""),remotebranch);\r
294                                 m_OutLogList.ShowText(str);\r
295                                 this->m_ctrlStatus.SetWindowText(str);\r
296                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,FALSE);\r
297                         }\r
298                         else\r
299                         {\r
300                                 str.Format(_T("%d commits ahead \"%s\""),m_OutLogList.GetItemCount(),remotebranch);\r
301                                 this->m_ctrlStatus.SetWindowText(str);\r
302                                 g_Git.GetCommitDiffList(localbranch,remotebranch,m_arOutChangeList);\r
303                                 m_OutChangeFileList.m_Rev1=localbranch;\r
304                                 m_OutChangeFileList.m_Rev2=remotebranch;\r
305                                 m_OutChangeFileList.Show(0,this->m_arOutChangeList);\r
306                                 m_OutChangeFileList.SetEmptyString(CString(_T("No changed file")));\r
307                                 this->m_ctrlTabCtrl.ShowTab(m_OutChangeFileList.GetDlgCtrlID()-1,TRUE);\r
308                         }\r
309                 }\r
310                 this->m_OutLocalBranch=localbranch;\r
311                 this->m_OutRemoteBranch=remotebranch;\r
312         }\r
313 \r
314 }\r
315 \r
316 bool CSyncDlg::IsURL()\r
317 {\r
318         CString str;\r
319         this->m_ctrlURL.GetWindowText(str);\r
320         if(str.Find(_T('\\'))>=0 || str.Find(_T('/'))>=0)\r
321                 return true;\r
322         else\r
323                 return false;\r
324 }\r
325 void CSyncDlg::OnCbenEndeditComboboxexUrl(NMHDR *pNMHDR, LRESULT *pResult)\r
326 {\r
327         // TODO: Add your control notification handler code here\r
328         *pResult = 0;\r
329 }\r
330 \r
331 void CSyncDlg::OnCbnEditchangeComboboxexUrl()\r
332 {\r
333         this->FetchOutList();\r
334         // TODO: Add your control notification handler code here\r
335 }\r