OSDN Git Service

Show Ignore Sub Menu
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / ChangedDlg.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2008 - TortoiseSVN\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 #include "stdafx.h"\r
20 #include "TortoiseProc.h"\r
21 #include "ChangedDlg.h"\r
22 #include "messagebox.h"\r
23 #include "cursor.h"\r
24 #include ".\changeddlg.h"\r
25 \r
26 \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
32         , m_bBlock(FALSE)\r
33         , m_bCanceled(false)\r
34         , m_bShowIgnored(FALSE)\r
35         , m_bShowExternals(TRUE)\r
36     , m_bShowUserProps(FALSE)\r
37 {\r
38         m_bRemote = FALSE;\r
39 }\r
40 \r
41 CChangedDlg::~CChangedDlg()\r
42 {\r
43 }\r
44 \r
45 void CChangedDlg::DoDataExchange(CDataExchange* pDX)\r
46 {\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
54 }\r
55 \r
56 \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
67 END_MESSAGE_MAP()\r
68 \r
69 BOOL CChangedDlg::OnInitDialog()\r
70 {\r
71         CResizableStandAloneDialog::OnInitDialog();\r
72         \r
73         GetWindowText(m_sTitle);\r
74 \r
75         m_tooltips.Create(this);\r
76 \r
77         m_regAddBeforeCommit = CRegDWORD(_T("Software\\TortoiseSVN\\AddBeforeCommit"), TRUE);\r
78         m_bShowUnversioned = m_regAddBeforeCommit;\r
79         UpdateData(FALSE);\r
80 \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
90         \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
96 \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
109         if (hWndExplorer)\r
110                 CenterWindow(CWnd::FromHandle(hWndExplorer));\r
111         EnableSaveRestore(_T("ChangedDlg"));\r
112 \r
113         m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseSVN\\CheckRepo"), FALSE);\r
114         \r
115         // first start a thread to obtain the status without\r
116         // blocking the dialog\r
117         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
118         {\r
119                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
120         }\r
121 \r
122         return TRUE;\r
123 }\r
124 \r
125 UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid)\r
126 {\r
127         return ((CChangedDlg*)pVoid)->ChangedStatusThread();\r
128 }\r
129 \r
130 UINT CChangedDlg::ChangedStatusThread()\r
131 {\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
141         CString temp;\r
142         if (!m_FileListCtrl.GetStatus(m_pathList, m_bRemote, m_bShowIgnored != FALSE, m_bShowUserProps != FALSE))\r
143         {\r
144                 if (!m_FileListCtrl.GetLastErrorMessage().IsEmpty())\r
145                         m_FileListCtrl.SetEmptyString(m_FileListCtrl.GetLastErrorMessage());\r
146         }\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
154 \r
155         CTSVNPath commonDir = m_FileListCtrl.GetCommonDirectory(false);\r
156         bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsDirectory()));\r
157         if (bSingleFile)\r
158                 SetWindowText(m_sTitle + _T(" - ") + m_pathList[0].GetWinPathString());\r
159         else\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
171         RefreshCursor();\r
172         return 0;\r
173 }\r
174 \r
175 void CChangedDlg::OnOK()\r
176 {\r
177         if (m_bBlock)\r
178         {\r
179                 m_bCanceled = true;\r
180                 return;\r
181         }\r
182         __super::OnOK();\r
183 }\r
184 \r
185 void CChangedDlg::OnCancel()\r
186 {\r
187         if (m_bBlock)\r
188         {\r
189                 m_bCanceled = true;\r
190                 return;\r
191         }\r
192         __super::OnCancel();\r
193 }\r
194 \r
195 void CChangedDlg::OnBnClickedCheckrepo()\r
196 {\r
197         m_bRemote = TRUE;\r
198         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
199         {\r
200                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
201         }\r
202 }\r
203 \r
204 DWORD CChangedDlg::UpdateShowFlags()\r
205 {\r
206         DWORD dwShow = m_FileListCtrl.GetShowFlags();\r
207         if (m_bShowUnversioned)\r
208                 dwShow |= SVNSLC_SHOWUNVERSIONED;\r
209         else\r
210                 dwShow &= ~SVNSLC_SHOWUNVERSIONED;\r
211         if (m_iShowUnmodified)\r
212                 dwShow |= SVNSLC_SHOWNORMAL;\r
213         else\r
214                 dwShow &= ~SVNSLC_SHOWNORMAL;\r
215         if (m_bShowIgnored)\r
216                 dwShow |= SVNSLC_SHOWIGNORED;\r
217         else\r
218                 dwShow &= ~SVNSLC_SHOWIGNORED;\r
219         if (m_bShowExternals)\r
220                 dwShow |= SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO;\r
221         else\r
222                 dwShow &= ~(SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO);\r
223 \r
224         return dwShow;\r
225 }\r
226 \r
227 void CChangedDlg::OnBnClickedShowunversioned()\r
228 {\r
229         UpdateData();\r
230         m_FileListCtrl.Show(UpdateShowFlags());\r
231         m_regAddBeforeCommit = m_bShowUnversioned;\r
232         UpdateStatistics();\r
233 }\r
234 \r
235 void CChangedDlg::OnBnClickedShowUnmodified()\r
236 {\r
237         UpdateData();\r
238         m_FileListCtrl.Show(UpdateShowFlags());\r
239         m_regAddBeforeCommit = m_bShowUnversioned;\r
240         UpdateStatistics();\r
241 }\r
242 \r
243 void CChangedDlg::OnBnClickedShowignored()\r
244 {\r
245         UpdateData();\r
246         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
247         {\r
248                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
249         }\r
250 }\r
251 \r
252 void CChangedDlg::OnBnClickedShowexternals()\r
253 {\r
254         UpdateData();\r
255         m_FileListCtrl.Show(UpdateShowFlags());\r
256         UpdateStatistics();\r
257 }\r
258 \r
259 void CChangedDlg::OnBnClickedShowUserProps()\r
260 {\r
261         UpdateData();\r
262         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
263         {\r
264                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
265         }\r
266 }\r
267 \r
268 LRESULT CChangedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)\r
269 {\r
270         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
271         {\r
272                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
273         }\r
274         return 0;\r
275 }\r
276 \r
277 LRESULT CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)\r
278 {\r
279         UpdateStatistics();\r
280         return 0;\r
281 }\r
282 \r
283 BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg)\r
284 {\r
285         m_tooltips.RelayEvent(pMsg);\r
286         if (pMsg->message == WM_KEYDOWN)\r
287         {\r
288                 switch (pMsg->wParam)\r
289                 {\r
290                 case VK_F5:\r
291                         {\r
292                                 if (m_bBlock)\r
293                                         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
294                                 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
295                                 {\r
296                                         CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
297                                 }\r
298                         }\r
299                         break;\r
300                 }\r
301         }\r
302 \r
303         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
304 }\r
305 \r
306 void CChangedDlg::OnBnClickedRefresh()\r
307 {\r
308         if (!m_bBlock)\r
309         {\r
310                 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
311                 {\r
312                         CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
313                 }\r
314         }\r
315 }\r
316 \r
317 void CChangedDlg::UpdateStatistics()\r
318 {\r
319         LONG lMin, lMax;\r
320         CString temp;\r
321         m_FileListCtrl.GetMinMaxRevisions(lMin, lMax, true, false);\r
322         if (LONG(m_FileListCtrl.m_HeadRev) >= 0)\r
323         {\r
324                 temp.Format(IDS_REPOSTATUS_HEADREV, lMin, lMax, LONG(m_FileListCtrl.m_HeadRev));\r
325                 SetDlgItemText(IDC_SUMMARYTEXT, temp);\r
326         }\r
327         else\r
328         {\r
329                 temp.Format(IDS_REPOSTATUS_WCINFO, lMin, lMax);\r
330                 SetDlgItemText(IDC_SUMMARYTEXT, temp);\r
331         }\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
336 }\r
337 \r
338 \r