1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseSVN
\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
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
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
20 #include "TortoiseProc.h"
\r
21 #include "ChangedDlg.h"
\r
22 #include "messagebox.h"
\r
24 #include ".\changeddlg.h"
\r
27 IMPLEMENT_DYNAMIC(CChangedDlg, CResizableStandAloneDialog)
\r
28 CChangedDlg::CChangedDlg(CWnd* pParent /*=NULL*/)
\r
29 : CResizableStandAloneDialog(CChangedDlg::IDD, pParent)
\r
30 , m_bShowUnversioned(FALSE)
\r
31 , m_iShowUnmodified(0)
\r
33 , m_bCanceled(false)
\r
34 , m_bShowIgnored(FALSE)
\r
35 , m_bShowExternals(TRUE)
\r
36 , m_bShowUserProps(FALSE)
\r
41 CChangedDlg::~CChangedDlg()
\r
45 void CChangedDlg::DoDataExchange(CDataExchange* pDX)
\r
47 CResizableStandAloneDialog::DoDataExchange(pDX);
\r
48 DDX_Control(pDX, IDC_CHANGEDLIST, m_FileListCtrl);
\r
49 DDX_Check(pDX, IDC_SHOWUNVERSIONED, m_bShowUnversioned);
\r
50 DDX_Check(pDX, IDC_SHOWUNMODIFIED, m_iShowUnmodified);
\r
51 DDX_Check(pDX, IDC_SHOWIGNORED, m_bShowIgnored);
\r
52 DDX_Check(pDX, IDC_SHOWEXTERNALS, m_bShowExternals);
\r
53 DDX_Check(pDX, IDC_SHOWUSERPROPS, m_bShowUserProps);
\r
57 BEGIN_MESSAGE_MAP(CChangedDlg, CResizableStandAloneDialog)
\r
58 ON_BN_CLICKED(IDC_CHECKREPO, OnBnClickedCheckrepo)
\r
59 ON_BN_CLICKED(IDC_SHOWUNVERSIONED, OnBnClickedShowunversioned)
\r
60 ON_BN_CLICKED(IDC_SHOWUNMODIFIED, OnBnClickedShowUnmodified)
\r
61 ON_BN_CLICKED(IDC_SHOWUSERPROPS, OnBnClickedShowUserProps)
\r
62 ON_REGISTERED_MESSAGE(CSVNStatusListCtrl::SVNSLNM_NEEDSREFRESH, OnSVNStatusListCtrlNeedsRefresh)
\r
63 ON_REGISTERED_MESSAGE(CSVNStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED, OnSVNStatusListCtrlItemCountChanged)
\r
64 ON_BN_CLICKED(IDC_SHOWIGNORED, &CChangedDlg::OnBnClickedShowignored)
\r
65 ON_BN_CLICKED(IDC_REFRESH, &CChangedDlg::OnBnClickedRefresh)
\r
66 ON_BN_CLICKED(IDC_SHOWEXTERNALS, &CChangedDlg::OnBnClickedShowexternals)
\r
69 BOOL CChangedDlg::OnInitDialog()
\r
71 CResizableStandAloneDialog::OnInitDialog();
\r
73 GetWindowText(m_sTitle);
\r
75 m_tooltips.Create(this);
\r
77 m_regAddBeforeCommit = CRegDWORD(_T("Software\\TortoiseSVN\\AddBeforeCommit"), TRUE);
\r
78 m_bShowUnversioned = m_regAddBeforeCommit;
\r
81 m_FileListCtrl.Init(SVNSLC_COLTEXTSTATUS | SVNSLC_COLPROPSTATUS |
\r
82 SVNSLC_COLREMOTETEXT | SVNSLC_COLREMOTEPROP |
\r
83 SVNSLC_COLLOCK | SVNSLC_COLLOCKCOMMENT |
\r
84 SVNSLC_COLAUTHOR | SVNSLC_COLAUTHOR |
\r
85 SVNSLC_COLREVISION | SVNSLC_COLDATE, _T("ChangedDlg"),
\r
86 SVNSLC_POPALL, false);
\r
87 m_FileListCtrl.SetCancelBool(&m_bCanceled);
\r
88 m_FileListCtrl.SetBackgroundImage(IDI_CFM_BKG);
\r
89 m_FileListCtrl.SetEmptyString(IDS_REPOSTATUS_EMPTYFILELIST);
\r
91 AdjustControlSize(IDC_SHOWUNVERSIONED);
\r
92 AdjustControlSize(IDC_SHOWUNMODIFIED);
\r
93 AdjustControlSize(IDC_SHOWIGNORED);
\r
94 AdjustControlSize(IDC_SHOWEXTERNALS);
\r
95 AdjustControlSize(IDC_SHOWUSERPROPS);
\r
97 AddAnchor(IDC_CHANGEDLIST, TOP_LEFT, BOTTOM_RIGHT);
\r
98 AddAnchor(IDC_SUMMARYTEXT, BOTTOM_LEFT, BOTTOM_RIGHT);
\r
99 AddAnchor(IDC_SHOWUNVERSIONED, BOTTOM_LEFT);
\r
100 AddAnchor(IDC_SHOWUNMODIFIED, BOTTOM_LEFT);
\r
101 AddAnchor(IDC_SHOWIGNORED, BOTTOM_LEFT);
\r
102 AddAnchor(IDC_SHOWEXTERNALS, BOTTOM_LEFT);
\r
103 AddAnchor(IDC_SHOWUSERPROPS, BOTTOM_LEFT);
\r
104 AddAnchor(IDC_INFOLABEL, BOTTOM_RIGHT);
\r
105 AddAnchor(IDC_REFRESH, BOTTOM_RIGHT);
\r
106 AddAnchor(IDC_CHECKREPO, BOTTOM_RIGHT);
\r
107 AddAnchor(IDOK, BOTTOM_RIGHT);
\r
108 SetPromptParentWindow(m_hWnd);
\r
110 CenterWindow(CWnd::FromHandle(hWndExplorer));
\r
111 EnableSaveRestore(_T("ChangedDlg"));
\r
113 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseSVN\\CheckRepo"), FALSE);
\r
115 // first start a thread to obtain the status without
\r
116 // blocking the dialog
\r
117 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
\r
119 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
\r
125 UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid)
\r
127 return ((CChangedDlg*)pVoid)->ChangedStatusThread();
\r
130 UINT CChangedDlg::ChangedStatusThread()
\r
132 InterlockedExchange(&m_bBlock, TRUE);
\r
133 m_bCanceled = false;
\r
134 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_CANCEL)));
\r
135 DialogEnableWindow(IDC_REFRESH, FALSE);
\r
136 DialogEnableWindow(IDC_CHECKREPO, FALSE);
\r
137 DialogEnableWindow(IDC_SHOWUNVERSIONED, FALSE);
\r
138 DialogEnableWindow(IDC_SHOWUNMODIFIED, FALSE);
\r
139 DialogEnableWindow(IDC_SHOWIGNORED, FALSE);
\r
140 DialogEnableWindow(IDC_SHOWUSERPROPS, FALSE);
\r
142 if (!m_FileListCtrl.GetStatus(m_pathList, m_bRemote, m_bShowIgnored != FALSE, m_bShowUserProps != FALSE))
\r
144 if (!m_FileListCtrl.GetLastErrorMessage().IsEmpty())
\r
145 m_FileListCtrl.SetEmptyString(m_FileListCtrl.GetLastErrorMessage());
\r
147 DWORD dwShow = SVNSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALS | SVNSLC_SHOWLOCKS | SVNSLC_SHOWSWITCHED | SVNSLC_SHOWINCHANGELIST;
\r
148 dwShow |= m_bShowUnversioned ? SVNSLC_SHOWUNVERSIONED : 0;
\r
149 dwShow |= m_iShowUnmodified ? SVNSLC_SHOWNORMAL : 0;
\r
150 dwShow |= m_bShowIgnored ? SVNSLC_SHOWIGNORED : 0;
\r
151 dwShow |= m_bShowExternals ? SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO : 0;
\r
152 m_FileListCtrl.Show(dwShow);
\r
153 UpdateStatistics();
\r
155 CTSVNPath commonDir = m_FileListCtrl.GetCommonDirectory(false);
\r
156 bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsDirectory()));
\r
158 SetWindowText(m_sTitle + _T(" - ") + m_pathList[0].GetWinPathString());
\r
160 SetWindowText(m_sTitle + _T(" - ") + commonDir.GetWinPathString());
\r
161 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_OK)));
\r
162 DialogEnableWindow(IDC_REFRESH, TRUE);
\r
163 DialogEnableWindow(IDC_CHECKREPO, TRUE);
\r
164 DialogEnableWindow(IDC_SHOWUNVERSIONED, !bSingleFile);
\r
165 DialogEnableWindow(IDC_SHOWUNMODIFIED, !bSingleFile);
\r
166 DialogEnableWindow(IDC_SHOWIGNORED, !bSingleFile);
\r
167 DialogEnableWindow(IDC_SHOWUSERPROPS, TRUE);
\r
168 InterlockedExchange(&m_bBlock, FALSE);
\r
169 // revert the remote flag back to the default
\r
170 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseSVN\\CheckRepo"), FALSE);
\r
175 void CChangedDlg::OnOK()
\r
179 m_bCanceled = true;
\r
185 void CChangedDlg::OnCancel()
\r
189 m_bCanceled = true;
\r
192 __super::OnCancel();
\r
195 void CChangedDlg::OnBnClickedCheckrepo()
\r
198 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
\r
200 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
\r
204 DWORD CChangedDlg::UpdateShowFlags()
\r
206 DWORD dwShow = m_FileListCtrl.GetShowFlags();
\r
207 if (m_bShowUnversioned)
\r
208 dwShow |= SVNSLC_SHOWUNVERSIONED;
\r
210 dwShow &= ~SVNSLC_SHOWUNVERSIONED;
\r
211 if (m_iShowUnmodified)
\r
212 dwShow |= SVNSLC_SHOWNORMAL;
\r
214 dwShow &= ~SVNSLC_SHOWNORMAL;
\r
215 if (m_bShowIgnored)
\r
216 dwShow |= SVNSLC_SHOWIGNORED;
\r
218 dwShow &= ~SVNSLC_SHOWIGNORED;
\r
219 if (m_bShowExternals)
\r
220 dwShow |= SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO;
\r
222 dwShow &= ~(SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO);
\r
227 void CChangedDlg::OnBnClickedShowunversioned()
\r
230 m_FileListCtrl.Show(UpdateShowFlags());
\r
231 m_regAddBeforeCommit = m_bShowUnversioned;
\r
232 UpdateStatistics();
\r
235 void CChangedDlg::OnBnClickedShowUnmodified()
\r
238 m_FileListCtrl.Show(UpdateShowFlags());
\r
239 m_regAddBeforeCommit = m_bShowUnversioned;
\r
240 UpdateStatistics();
\r
243 void CChangedDlg::OnBnClickedShowignored()
\r
246 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
\r
248 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
\r
252 void CChangedDlg::OnBnClickedShowexternals()
\r
255 m_FileListCtrl.Show(UpdateShowFlags());
\r
256 UpdateStatistics();
\r
259 void CChangedDlg::OnBnClickedShowUserProps()
\r
262 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
\r
264 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
\r
268 LRESULT CChangedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)
\r
270 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
\r
272 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
\r
277 LRESULT CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)
\r
279 UpdateStatistics();
\r
283 BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg)
\r
285 m_tooltips.RelayEvent(pMsg);
\r
286 if (pMsg->message == WM_KEYDOWN)
\r
288 switch (pMsg->wParam)
\r
293 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
\r
294 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
\r
296 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
\r
303 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
\r
306 void CChangedDlg::OnBnClickedRefresh()
\r
310 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
\r
312 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
\r
317 void CChangedDlg::UpdateStatistics()
\r
321 m_FileListCtrl.GetMinMaxRevisions(lMin, lMax, true, false);
\r
322 if (LONG(m_FileListCtrl.m_HeadRev) >= 0)
\r
324 temp.Format(IDS_REPOSTATUS_HEADREV, lMin, lMax, LONG(m_FileListCtrl.m_HeadRev));
\r
325 SetDlgItemText(IDC_SUMMARYTEXT, temp);
\r
329 temp.Format(IDS_REPOSTATUS_WCINFO, lMin, lMax);
\r
330 SetDlgItemText(IDC_SUMMARYTEXT, temp);
\r
332 temp = m_FileListCtrl.GetStatisticsString();
\r
333 temp.Replace(_T(" = "), _T("="));
\r
334 temp.Replace(_T("\n"), _T(", "));
\r
335 SetDlgItemText(IDC_INFOLABEL, temp);
\r