Fixed issue #406: Putty key can't save when clone.
[TortoiseGit.git] / src / TortoiseProc / ChangedDlg.cpp
blob59e434f86a639cea7c56083bfe1e8edef5f29f37
1 // TortoiseSVN - a Windows shell extension for easy version control
3 // Copyright (C) 2003-2008 - TortoiseSVN
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 #include "stdafx.h"
20 #include "TortoiseProc.h"
21 #include "ChangedDlg.h"
22 #include "messagebox.h"
23 #include "cursor.h"
24 #include ".\changeddlg.h"
26 #include "GitStatusListCtrl.h"
28 #include "CommonResource.h"
30 IMPLEMENT_DYNAMIC(CChangedDlg, CResizableStandAloneDialog)
31 CChangedDlg::CChangedDlg(CWnd* pParent /*=NULL*/)
32 : CResizableStandAloneDialog(CChangedDlg::IDD, pParent)
33 , m_bShowUnversioned(FALSE)
34 , m_iShowUnmodified(0)
35 , m_bBlock(FALSE)
36 , m_bCanceled(false)
37 , m_bShowIgnored(FALSE)
38 , m_bShowExternals(TRUE)
39 , m_bShowUserProps(FALSE)
41 m_bRemote = FALSE;
44 CChangedDlg::~CChangedDlg()
48 void CChangedDlg::DoDataExchange(CDataExchange* pDX)
50 CResizableStandAloneDialog::DoDataExchange(pDX);
51 DDX_Control(pDX, IDC_CHANGEDLIST, m_FileListCtrl);
52 DDX_Check(pDX, IDC_SHOWUNVERSIONED, m_bShowUnversioned);
53 DDX_Check(pDX, IDC_SHOWUNMODIFIED, m_iShowUnmodified);
54 DDX_Check(pDX, IDC_SHOWIGNORED, m_bShowIgnored);
55 // DDX_Check(pDX, IDC_SHOWEXTERNALS, m_bShowExternals);
56 // DDX_Check(pDX, IDC_SHOWUSERPROPS, m_bShowUserProps);
60 BEGIN_MESSAGE_MAP(CChangedDlg, CResizableStandAloneDialog)
61 ON_BN_CLICKED(IDC_CHECKREPO, OnBnClickedCheckrepo)
62 ON_BN_CLICKED(IDC_SHOWUNVERSIONED, OnBnClickedShowunversioned)
63 ON_BN_CLICKED(IDC_SHOWUNMODIFIED, OnBnClickedShowUnmodified)
64 // ON_BN_CLICKED(IDC_SHOWUSERPROPS, OnBnClickedShowUserProps)
65 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_NEEDSREFRESH, OnSVNStatusListCtrlNeedsRefresh)
66 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED, OnSVNStatusListCtrlItemCountChanged)
67 ON_BN_CLICKED(IDC_SHOWIGNORED, &CChangedDlg::OnBnClickedShowignored)
68 ON_BN_CLICKED(IDC_REFRESH, &CChangedDlg::OnBnClickedRefresh)
69 // ON_BN_CLICKED(IDC_SHOWEXTERNALS, &CChangedDlg::OnBnClickedShowexternals)
70 END_MESSAGE_MAP()
72 BOOL CChangedDlg::OnInitDialog()
74 CResizableStandAloneDialog::OnInitDialog();
76 GetWindowText(m_sTitle);
78 m_tooltips.Create(this);
80 m_regAddBeforeCommit = CRegDWORD(_T("Software\\TortoiseGit\\AddBeforeCommit"), TRUE);
81 m_bShowUnversioned = m_regAddBeforeCommit;
82 UpdateData(FALSE);
84 m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS, _T("ChangedDlg"),
85 SVNSLC_POPALL, false);
86 m_FileListCtrl.SetCancelBool(&m_bCanceled);
87 m_FileListCtrl.SetBackgroundImage(IDI_CFM_BKG);
88 m_FileListCtrl.SetEmptyString(IDS_REPOSTATUS_EMPTYFILELIST);
90 AdjustControlSize(IDC_SHOWUNVERSIONED);
91 AdjustControlSize(IDC_SHOWUNMODIFIED);
92 AdjustControlSize(IDC_SHOWIGNORED);
93 // AdjustControlSize(IDC_SHOWEXTERNALS);
94 // AdjustControlSize(IDC_SHOWUSERPROPS);
96 AddAnchor(IDC_CHANGEDLIST, TOP_LEFT, BOTTOM_RIGHT);
97 AddAnchor(IDC_SUMMARYTEXT, BOTTOM_LEFT, BOTTOM_RIGHT);
98 AddAnchor(IDC_SHOWUNVERSIONED, BOTTOM_LEFT);
99 AddAnchor(IDC_SHOWUNMODIFIED, BOTTOM_LEFT);
100 AddAnchor(IDC_SHOWIGNORED, BOTTOM_LEFT);
101 // AddAnchor(IDC_SHOWEXTERNALS, BOTTOM_LEFT);
102 // AddAnchor(IDC_SHOWUSERPROPS, BOTTOM_LEFT);
103 AddAnchor(IDC_INFOLABEL, BOTTOM_RIGHT);
104 AddAnchor(IDC_REFRESH, BOTTOM_RIGHT);
105 AddAnchor(IDC_CHECKREPO, BOTTOM_RIGHT);
106 AddAnchor(IDOK, BOTTOM_RIGHT);
107 // SetPromptParentWindow(m_hWnd);
108 if (hWndExplorer)
109 CenterWindow(CWnd::FromHandle(hWndExplorer));
110 EnableSaveRestore(_T("ChangedDlg"));
112 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);
114 // first start a thread to obtain the status without
115 // blocking the dialog
116 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
118 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
121 return TRUE;
124 UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid)
126 return ((CChangedDlg*)pVoid)->ChangedStatusThread();
129 UINT CChangedDlg::ChangedStatusThread()
131 InterlockedExchange(&m_bBlock, TRUE);
133 g_Git.RefreshGitIndex();
135 m_bCanceled = false;
136 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_CANCEL)));
137 DialogEnableWindow(IDC_REFRESH, FALSE);
138 DialogEnableWindow(IDC_CHECKREPO, FALSE);
139 DialogEnableWindow(IDC_SHOWUNVERSIONED, FALSE);
140 DialogEnableWindow(IDC_SHOWUNMODIFIED, FALSE);
141 DialogEnableWindow(IDC_SHOWIGNORED, FALSE);
142 DialogEnableWindow(IDC_SHOWUSERPROPS, FALSE);
143 CString temp;
144 m_FileListCtrl.Clear();
145 if (!m_FileListCtrl.GetStatus(&m_pathList, m_bRemote, m_bShowIgnored != FALSE, m_bShowUnversioned,m_bShowUserProps != FALSE))
147 if (!m_FileListCtrl.GetLastErrorMessage().IsEmpty())
148 m_FileListCtrl.SetEmptyString(m_FileListCtrl.GetLastErrorMessage());
150 DWORD dwShow = SVNSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALS | SVNSLC_SHOWLOCKS | SVNSLC_SHOWSWITCHED | SVNSLC_SHOWINCHANGELIST;
151 dwShow |= m_bShowUnversioned ? SVNSLC_SHOWUNVERSIONED : 0;
152 dwShow |= m_iShowUnmodified ? SVNSLC_SHOWNORMAL : 0;
153 dwShow |= m_bShowIgnored ? SVNSLC_SHOWIGNORED : 0;
154 dwShow |= m_bShowExternals ? SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO : 0;
155 m_FileListCtrl.Show(dwShow);
156 UpdateStatistics();
159 CTGitPath commonDir = m_FileListCtrl.GetCommonDirectory(false);
160 bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsDirectory()));
161 if (bSingleFile)
162 SetWindowText(m_sTitle + _T(" - ") + m_pathList[0].GetWinPathString());
163 else
164 SetWindowText(m_sTitle + _T(" - ") + commonDir.GetWinPathString());
166 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_OK)));
167 DialogEnableWindow(IDC_REFRESH, TRUE);
168 DialogEnableWindow(IDC_CHECKREPO, TRUE);
169 DialogEnableWindow(IDC_SHOWUNVERSIONED, !bSingleFile);
170 DialogEnableWindow(IDC_SHOWUNMODIFIED, !bSingleFile);
171 DialogEnableWindow(IDC_SHOWIGNORED, !bSingleFile);
172 DialogEnableWindow(IDC_SHOWUSERPROPS, TRUE);
173 InterlockedExchange(&m_bBlock, FALSE);
174 // revert the remote flag back to the default
175 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);
176 RefreshCursor();
177 return 0;
180 void CChangedDlg::OnOK()
182 if (m_bBlock)
184 m_bCanceled = true;
185 return;
187 __super::OnOK();
190 void CChangedDlg::OnCancel()
192 if (m_bBlock)
194 m_bCanceled = true;
195 return;
197 __super::OnCancel();
200 void CChangedDlg::OnBnClickedCheckrepo()
202 m_bRemote = TRUE;
203 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
205 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
209 DWORD CChangedDlg::UpdateShowFlags()
211 DWORD dwShow = m_FileListCtrl.GetShowFlags();
212 if (m_bShowUnversioned)
213 dwShow |= SVNSLC_SHOWUNVERSIONED;
214 else
215 dwShow &= ~SVNSLC_SHOWUNVERSIONED;
216 if (m_iShowUnmodified)
217 dwShow |= SVNSLC_SHOWNORMAL;
218 else
219 dwShow &= ~SVNSLC_SHOWNORMAL;
220 if (m_bShowIgnored)
221 dwShow |= SVNSLC_SHOWIGNORED;
222 else
223 dwShow &= ~SVNSLC_SHOWIGNORED;
224 if (m_bShowExternals)
225 dwShow |= SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO;
226 else
227 dwShow &= ~(SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO);
229 return dwShow;
232 void CChangedDlg::OnBnClickedShowunversioned()
234 UpdateData();
235 m_FileListCtrl.Show(UpdateShowFlags());
236 m_regAddBeforeCommit = m_bShowUnversioned;
237 UpdateStatistics();
240 void CChangedDlg::OnBnClickedShowUnmodified()
242 UpdateData();
243 m_FileListCtrl.Show(UpdateShowFlags());
244 m_regAddBeforeCommit = m_bShowUnversioned;
245 UpdateStatistics();
248 void CChangedDlg::OnBnClickedShowignored()
250 UpdateData();
251 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
253 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
257 void CChangedDlg::OnBnClickedShowexternals()
259 UpdateData();
260 m_FileListCtrl.Show(UpdateShowFlags());
261 UpdateStatistics();
264 void CChangedDlg::OnBnClickedShowUserProps()
266 UpdateData();
267 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
269 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
273 LRESULT CChangedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)
275 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
277 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
279 return 0;
282 LRESULT CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)
284 UpdateStatistics();
285 return 0;
288 BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg)
290 m_tooltips.RelayEvent(pMsg);
291 if (pMsg->message == WM_KEYDOWN)
293 switch (pMsg->wParam)
295 case VK_F5:
297 if (m_bBlock)
298 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
299 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
301 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
304 break;
308 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
311 void CChangedDlg::OnBnClickedRefresh()
313 if (!m_bBlock)
315 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
317 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
322 void CChangedDlg::UpdateStatistics()
324 CString temp;
325 #if 0
326 LONG lMin, lMax;
328 m_FileListCtrl.GetMinMaxRevisions(lMin, lMax, true, false);
329 if (LONG(m_FileListCtrl.m_HeadRev) >= 0)
331 temp.Format(IDS_REPOSTATUS_HEADREV, lMin, lMax, LONG(m_FileListCtrl.m_HeadRev));
332 SetDlgItemText(IDC_SUMMARYTEXT, temp);
334 else
336 temp.Format(IDS_REPOSTATUS_WCINFO, lMin, lMax);
337 SetDlgItemText(IDC_SUMMARYTEXT, temp);
339 #endif
340 temp = m_FileListCtrl.GetStatisticsString();
341 temp.Replace(_T(" = "), _T("="));
342 temp.Replace(_T("\n"), _T(", "));
343 SetDlgItemText(IDC_INFOLABEL, temp);