OSDN Git Service

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