OSDN Git Service

Del RefLog work.
[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 #include "GitStatusListCtrl.h"\r
27 \r
28 #include "CommonResource.h"\r
29 \r
30 IMPLEMENT_DYNAMIC(CChangedDlg, CResizableStandAloneDialog)\r
31 CChangedDlg::CChangedDlg(CWnd* pParent /*=NULL*/)\r
32         : CResizableStandAloneDialog(CChangedDlg::IDD, pParent)\r
33         , m_bShowUnversioned(FALSE)\r
34         , m_iShowUnmodified(0)\r
35         , m_bBlock(FALSE)\r
36         , m_bCanceled(false)\r
37         , m_bShowIgnored(FALSE)\r
38         , m_bShowExternals(TRUE)\r
39     , m_bShowUserProps(FALSE)\r
40 {\r
41         m_bRemote = FALSE;\r
42 }\r
43 \r
44 CChangedDlg::~CChangedDlg()\r
45 {\r
46 }\r
47 \r
48 void CChangedDlg::DoDataExchange(CDataExchange* pDX)\r
49 {\r
50         CResizableStandAloneDialog::DoDataExchange(pDX);\r
51         DDX_Control(pDX, IDC_CHANGEDLIST, m_FileListCtrl);\r
52         DDX_Check(pDX, IDC_SHOWUNVERSIONED, m_bShowUnversioned);\r
53         DDX_Check(pDX, IDC_SHOWUNMODIFIED, m_iShowUnmodified);\r
54         DDX_Check(pDX, IDC_SHOWIGNORED, m_bShowIgnored);\r
55 //      DDX_Check(pDX, IDC_SHOWEXTERNALS, m_bShowExternals);\r
56 //      DDX_Check(pDX, IDC_SHOWUSERPROPS, m_bShowUserProps);\r
57 }\r
58 \r
59 \r
60 BEGIN_MESSAGE_MAP(CChangedDlg, CResizableStandAloneDialog)\r
61         ON_BN_CLICKED(IDC_CHECKREPO, OnBnClickedCheckrepo)\r
62         ON_BN_CLICKED(IDC_SHOWUNVERSIONED, OnBnClickedShowunversioned)\r
63         ON_BN_CLICKED(IDC_SHOWUNMODIFIED, OnBnClickedShowUnmodified)\r
64 //    ON_BN_CLICKED(IDC_SHOWUSERPROPS, OnBnClickedShowUserProps)\r
65         ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_NEEDSREFRESH, OnSVNStatusListCtrlNeedsRefresh)\r
66         ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED, OnSVNStatusListCtrlItemCountChanged)\r
67         ON_BN_CLICKED(IDC_SHOWIGNORED, &CChangedDlg::OnBnClickedShowignored)\r
68         ON_BN_CLICKED(IDC_REFRESH, &CChangedDlg::OnBnClickedRefresh)\r
69 //      ON_BN_CLICKED(IDC_SHOWEXTERNALS, &CChangedDlg::OnBnClickedShowexternals)\r
70 END_MESSAGE_MAP()\r
71 \r
72 BOOL CChangedDlg::OnInitDialog()\r
73 {\r
74         CResizableStandAloneDialog::OnInitDialog();\r
75         \r
76         GetWindowText(m_sTitle);\r
77 \r
78         m_tooltips.Create(this);\r
79 \r
80         m_regAddBeforeCommit = CRegDWORD(_T("Software\\TortoiseGit\\AddBeforeCommit"), TRUE);\r
81         m_bShowUnversioned = m_regAddBeforeCommit;\r
82         UpdateData(FALSE);\r
83 \r
84         m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS, _T("ChangedDlg"),\r
85                                                 SVNSLC_POPALL, false);\r
86         m_FileListCtrl.SetCancelBool(&m_bCanceled);\r
87         m_FileListCtrl.SetBackgroundImage(IDI_CFM_BKG);\r
88         m_FileListCtrl.SetEmptyString(IDS_REPOSTATUS_EMPTYFILELIST);\r
89         \r
90         AdjustControlSize(IDC_SHOWUNVERSIONED);\r
91         AdjustControlSize(IDC_SHOWUNMODIFIED);\r
92         AdjustControlSize(IDC_SHOWIGNORED);\r
93 //      AdjustControlSize(IDC_SHOWEXTERNALS);\r
94 //    AdjustControlSize(IDC_SHOWUSERPROPS);\r
95 \r
96         AddAnchor(IDC_CHANGEDLIST, TOP_LEFT, BOTTOM_RIGHT);\r
97         AddAnchor(IDC_SUMMARYTEXT, BOTTOM_LEFT, BOTTOM_RIGHT);\r
98         AddAnchor(IDC_SHOWUNVERSIONED, BOTTOM_LEFT);\r
99         AddAnchor(IDC_SHOWUNMODIFIED, BOTTOM_LEFT);\r
100         AddAnchor(IDC_SHOWIGNORED, BOTTOM_LEFT);\r
101 //      AddAnchor(IDC_SHOWEXTERNALS, BOTTOM_LEFT);\r
102 //      AddAnchor(IDC_SHOWUSERPROPS, BOTTOM_LEFT);\r
103         AddAnchor(IDC_INFOLABEL, BOTTOM_RIGHT);\r
104         AddAnchor(IDC_REFRESH, BOTTOM_RIGHT);\r
105         AddAnchor(IDC_CHECKREPO, BOTTOM_RIGHT);\r
106         AddAnchor(IDOK, BOTTOM_RIGHT);\r
107 //      SetPromptParentWindow(m_hWnd);\r
108         if (hWndExplorer)\r
109                 CenterWindow(CWnd::FromHandle(hWndExplorer));\r
110         EnableSaveRestore(_T("ChangedDlg"));\r
111 \r
112         m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);\r
113         \r
114         // first start a thread to obtain the status without\r
115         // blocking the dialog\r
116         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
117         {\r
118                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
119         }\r
120 \r
121         return TRUE;\r
122 }\r
123 \r
124 UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid)\r
125 {\r
126         return ((CChangedDlg*)pVoid)->ChangedStatusThread();\r
127 }\r
128 \r
129 UINT CChangedDlg::ChangedStatusThread()\r
130 {\r
131         InterlockedExchange(&m_bBlock, TRUE);\r
132         m_bCanceled = false;\r
133         SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_CANCEL)));\r
134         DialogEnableWindow(IDC_REFRESH, FALSE);\r
135         DialogEnableWindow(IDC_CHECKREPO, FALSE);\r
136         DialogEnableWindow(IDC_SHOWUNVERSIONED, FALSE);\r
137         DialogEnableWindow(IDC_SHOWUNMODIFIED, FALSE);\r
138         DialogEnableWindow(IDC_SHOWIGNORED, FALSE);\r
139     DialogEnableWindow(IDC_SHOWUSERPROPS, FALSE);\r
140         CString temp;\r
141         m_FileListCtrl.Clear();\r
142         if (!m_FileListCtrl.GetStatus(&m_pathList, m_bRemote, m_bShowIgnored != FALSE, m_bShowUnversioned,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 \r
156         CTGitPath commonDir = m_FileListCtrl.GetCommonDirectory(false);\r
157         bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsDirectory()));\r
158         if (bSingleFile)\r
159                 SetWindowText(m_sTitle + _T(" - ") + m_pathList[0].GetWinPathString());\r
160         else\r
161                 SetWindowText(m_sTitle + _T(" - ") + commonDir.GetWinPathString());\r
162 \r
163         SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_OK)));\r
164         DialogEnableWindow(IDC_REFRESH, TRUE);\r
165         DialogEnableWindow(IDC_CHECKREPO, TRUE);\r
166         DialogEnableWindow(IDC_SHOWUNVERSIONED, !bSingleFile);\r
167         DialogEnableWindow(IDC_SHOWUNMODIFIED, !bSingleFile);\r
168         DialogEnableWindow(IDC_SHOWIGNORED, !bSingleFile);\r
169     DialogEnableWindow(IDC_SHOWUSERPROPS, TRUE);\r
170         InterlockedExchange(&m_bBlock, FALSE);\r
171         // revert the remote flag back to the default\r
172         m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);\r
173         RefreshCursor();\r
174         return 0;\r
175 }\r
176 \r
177 void CChangedDlg::OnOK()\r
178 {\r
179         if (m_bBlock)\r
180         {\r
181                 m_bCanceled = true;\r
182                 return;\r
183         }\r
184         __super::OnOK();\r
185 }\r
186 \r
187 void CChangedDlg::OnCancel()\r
188 {\r
189         if (m_bBlock)\r
190         {\r
191                 m_bCanceled = true;\r
192                 return;\r
193         }\r
194         __super::OnCancel();\r
195 }\r
196 \r
197 void CChangedDlg::OnBnClickedCheckrepo()\r
198 {\r
199         m_bRemote = TRUE;\r
200         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
201         {\r
202                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
203         }\r
204 }\r
205 \r
206 DWORD CChangedDlg::UpdateShowFlags()\r
207 {\r
208         DWORD dwShow = m_FileListCtrl.GetShowFlags();\r
209         if (m_bShowUnversioned)\r
210                 dwShow |= SVNSLC_SHOWUNVERSIONED;\r
211         else\r
212                 dwShow &= ~SVNSLC_SHOWUNVERSIONED;\r
213         if (m_iShowUnmodified)\r
214                 dwShow |= SVNSLC_SHOWNORMAL;\r
215         else\r
216                 dwShow &= ~SVNSLC_SHOWNORMAL;\r
217         if (m_bShowIgnored)\r
218                 dwShow |= SVNSLC_SHOWIGNORED;\r
219         else\r
220                 dwShow &= ~SVNSLC_SHOWIGNORED;\r
221         if (m_bShowExternals)\r
222                 dwShow |= SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO;\r
223         else\r
224                 dwShow &= ~(SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO);\r
225 \r
226         return dwShow;\r
227 }\r
228 \r
229 void CChangedDlg::OnBnClickedShowunversioned()\r
230 {\r
231         UpdateData();\r
232         m_FileListCtrl.Show(UpdateShowFlags());\r
233         m_regAddBeforeCommit = m_bShowUnversioned;\r
234         UpdateStatistics();\r
235 }\r
236 \r
237 void CChangedDlg::OnBnClickedShowUnmodified()\r
238 {\r
239         UpdateData();\r
240         m_FileListCtrl.Show(UpdateShowFlags());\r
241         m_regAddBeforeCommit = m_bShowUnversioned;\r
242         UpdateStatistics();\r
243 }\r
244 \r
245 void CChangedDlg::OnBnClickedShowignored()\r
246 {\r
247         UpdateData();\r
248         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
249         {\r
250                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
251         }\r
252 }\r
253 \r
254 void CChangedDlg::OnBnClickedShowexternals()\r
255 {\r
256         UpdateData();\r
257         m_FileListCtrl.Show(UpdateShowFlags());\r
258         UpdateStatistics();\r
259 }\r
260 \r
261 void CChangedDlg::OnBnClickedShowUserProps()\r
262 {\r
263         UpdateData();\r
264         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
265         {\r
266                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
267         }\r
268 }\r
269 \r
270 LRESULT CChangedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)\r
271 {\r
272         if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
273         {\r
274                 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
275         }\r
276         return 0;\r
277 }\r
278 \r
279 LRESULT CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)\r
280 {\r
281         UpdateStatistics();\r
282         return 0;\r
283 }\r
284 \r
285 BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg)\r
286 {\r
287         m_tooltips.RelayEvent(pMsg);\r
288         if (pMsg->message == WM_KEYDOWN)\r
289         {\r
290                 switch (pMsg->wParam)\r
291                 {\r
292                 case VK_F5:\r
293                         {\r
294                                 if (m_bBlock)\r
295                                         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
296                                 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
297                                 {\r
298                                         CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
299                                 }\r
300                         }\r
301                         break;\r
302                 }\r
303         }\r
304 \r
305         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
306 }\r
307 \r
308 void CChangedDlg::OnBnClickedRefresh()\r
309 {\r
310         if (!m_bBlock)\r
311         {\r
312                 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)\r
313                 {\r
314                         CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
315                 }\r
316         }\r
317 }\r
318 \r
319 void CChangedDlg::UpdateStatistics()\r
320 {\r
321         CString temp;\r
322 #if 0\r
323         LONG lMin, lMax;\r
324         \r
325         m_FileListCtrl.GetMinMaxRevisions(lMin, lMax, true, false);\r
326         if (LONG(m_FileListCtrl.m_HeadRev) >= 0)\r
327         {\r
328                 temp.Format(IDS_REPOSTATUS_HEADREV, lMin, lMax, LONG(m_FileListCtrl.m_HeadRev));\r
329                 SetDlgItemText(IDC_SUMMARYTEXT, temp);\r
330         }\r
331         else\r
332         {\r
333                 temp.Format(IDS_REPOSTATUS_WCINFO, lMin, lMax);\r
334                 SetDlgItemText(IDC_SUMMARYTEXT, temp);\r
335         }\r
336 #endif\r
337         temp = m_FileListCtrl.GetStatisticsString();\r
338         temp.Replace(_T(" = "), _T("="));\r
339         temp.Replace(_T("\n"), _T(", "));\r
340         SetDlgItemText(IDC_INFOLABEL, temp);\r
341 \r
342 }\r
343 \r
344 \r