enable "Show ignored files"-checkbox on repository status dialog
[TortoiseGit.git] / src / TortoiseProc / ChangedDlg.cpp
blob5cb77dea925369bcacfc08616dc80b3075d18385
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2011 - TortoiseGit
4 // Copyright (C) 2003-2008 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "TortoiseProc.h"
22 #include "ChangedDlg.h"
23 #include "messagebox.h"
24 #include "cursor.h"
25 #include "AppUtils.h"
26 #include "PathUtils.h"
27 #include ".\changeddlg.h"
29 #include "GitStatusListCtrl.h"
31 #include "CommonResource.h"
33 IMPLEMENT_DYNAMIC(CChangedDlg, CResizableStandAloneDialog)
34 CChangedDlg::CChangedDlg(CWnd* pParent /*=NULL*/)
35 : CResizableStandAloneDialog(CChangedDlg::IDD, pParent)
36 , m_bShowUnversioned(FALSE)
37 , m_iShowUnmodified(0)
38 , m_bBlock(FALSE)
39 , m_bCanceled(false)
40 , m_bShowIgnored(FALSE)
41 , m_bShowExternals(TRUE)
42 , m_bShowUserProps(FALSE)
44 m_bRemote = FALSE;
47 CChangedDlg::~CChangedDlg()
51 void CChangedDlg::DoDataExchange(CDataExchange* pDX)
53 CResizableStandAloneDialog::DoDataExchange(pDX);
54 DDX_Control(pDX, IDC_CHANGEDLIST, m_FileListCtrl);
55 DDX_Check(pDX, IDC_SHOWUNVERSIONED, m_bShowUnversioned);
56 DDX_Check(pDX, IDC_SHOWUNMODIFIED, m_iShowUnmodified);
57 DDX_Check(pDX, IDC_SHOWIGNORED, m_bShowIgnored);
58 // DDX_Check(pDX, IDC_SHOWEXTERNALS, m_bShowExternals);
59 // DDX_Check(pDX, IDC_SHOWUSERPROPS, m_bShowUserProps);
63 BEGIN_MESSAGE_MAP(CChangedDlg, CResizableStandAloneDialog)
64 ON_BN_CLICKED(IDC_SHOWUNVERSIONED, OnBnClickedShowunversioned)
65 ON_BN_CLICKED(IDC_SHOWUNMODIFIED, OnBnClickedShowUnmodified)
66 // ON_BN_CLICKED(IDC_SHOWUSERPROPS, OnBnClickedShowUserProps)
67 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_NEEDSREFRESH, OnSVNStatusListCtrlNeedsRefresh)
68 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED, OnSVNStatusListCtrlItemCountChanged)
69 ON_BN_CLICKED(IDC_SHOWIGNORED, &CChangedDlg::OnBnClickedShowignored)
70 ON_BN_CLICKED(IDC_REFRESH, &CChangedDlg::OnBnClickedRefresh)
71 // ON_BN_CLICKED(IDC_SHOWEXTERNALS, &CChangedDlg::OnBnClickedShowexternals)
72 ON_BN_CLICKED(IDC_COMMIT, &CChangedDlg::OnBnClickedCommit)
73 END_MESSAGE_MAP()
75 BOOL CChangedDlg::OnInitDialog()
77 CResizableStandAloneDialog::OnInitDialog();
79 GetWindowText(m_sTitle);
81 m_tooltips.Create(this);
83 m_regAddBeforeCommit = CRegDWORD(_T("Software\\TortoiseGit\\AddBeforeCommit"), TRUE);
84 m_bShowUnversioned = m_regAddBeforeCommit;
85 UpdateData(FALSE);
87 m_FileListCtrl.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS, _T("ChangedDlg"),
88 (SVNSLC_POPALL ^ SVNSLC_POPSAVEAS), false);
89 m_FileListCtrl.SetCancelBool(&m_bCanceled);
90 m_FileListCtrl.SetBackgroundImage(IDI_CFM_BKG);
91 m_FileListCtrl.SetEmptyString(IDS_REPOSTATUS_EMPTYFILELIST);
93 AdjustControlSize(IDC_SHOWUNVERSIONED);
94 AdjustControlSize(IDC_SHOWUNMODIFIED);
95 AdjustControlSize(IDC_SHOWIGNORED);
96 // AdjustControlSize(IDC_SHOWEXTERNALS);
97 // AdjustControlSize(IDC_SHOWUSERPROPS);
99 AddAnchor(IDC_CHANGEDLIST, TOP_LEFT, BOTTOM_RIGHT);
100 AddAnchor(IDC_SUMMARYTEXT, BOTTOM_LEFT, BOTTOM_RIGHT);
101 AddAnchor(IDC_SHOWUNVERSIONED, BOTTOM_LEFT);
102 AddAnchor(IDC_SHOWUNMODIFIED, BOTTOM_LEFT);
103 AddAnchor(IDC_SHOWIGNORED, BOTTOM_LEFT);
104 // AddAnchor(IDC_SHOWEXTERNALS, BOTTOM_LEFT);
105 // AddAnchor(IDC_SHOWUSERPROPS, BOTTOM_LEFT);
106 AddAnchor(IDC_INFOLABEL, BOTTOM_RIGHT);
107 AddAnchor(IDC_COMMIT, BOTTOM_RIGHT);
108 AddAnchor(IDC_REFRESH, BOTTOM_RIGHT);
109 AddAnchor(IDOK, BOTTOM_RIGHT);
110 // SetPromptParentWindow(m_hWnd);
111 if (hWndExplorer)
112 CenterWindow(CWnd::FromHandle(hWndExplorer));
113 EnableSaveRestore(_T("ChangedDlg"));
115 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);
117 // first start a thread to obtain the status without
118 // blocking the dialog
119 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
121 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
124 return TRUE;
127 UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid)
129 return ((CChangedDlg*)pVoid)->ChangedStatusThread();
132 UINT CChangedDlg::ChangedStatusThread()
134 InterlockedExchange(&m_bBlock, TRUE);
136 g_Git.RefreshGitIndex();
138 m_bCanceled = false;
139 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_CANCEL)));
140 DialogEnableWindow(IDC_REFRESH, FALSE);
141 DialogEnableWindow(IDC_SHOWUNVERSIONED, FALSE);
142 DialogEnableWindow(IDC_SHOWUNMODIFIED, FALSE);
143 DialogEnableWindow(IDC_SHOWIGNORED, FALSE);
144 DialogEnableWindow(IDC_SHOWUSERPROPS, FALSE);
145 CString temp;
146 m_FileListCtrl.Clear();
147 if (!m_FileListCtrl.GetStatus(&m_pathList, m_bRemote, m_bShowIgnored != FALSE, m_bShowUnversioned != FALSE,m_bShowUserProps != FALSE))
149 if (!m_FileListCtrl.GetLastErrorMessage().IsEmpty())
150 m_FileListCtrl.SetEmptyString(m_FileListCtrl.GetLastErrorMessage());
152 unsigned int dwShow = SVNSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALS | SVNSLC_SHOWLOCKS | SVNSLC_SHOWSWITCHED | SVNSLC_SHOWINCHANGELIST;
153 dwShow |= m_bShowUnversioned ? SVNSLC_SHOWUNVERSIONED : 0;
154 dwShow |= m_iShowUnmodified ? SVNSLC_SHOWNORMAL : 0;
155 dwShow |= m_bShowIgnored ? SVNSLC_SHOWIGNORED : 0;
156 dwShow |= m_bShowExternals ? SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO : 0;
157 m_FileListCtrl.Show(dwShow);
158 UpdateStatistics();
161 CTGitPath commonDir = m_FileListCtrl.GetCommonDirectory(false);
162 bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsEmpty())&&(!m_pathList[0].IsDirectory()));
163 if (bSingleFile)
164 SetWindowText(m_sTitle + _T(" - ") + m_pathList[0].GetWinPathString());
165 else
166 SetWindowText(m_sTitle + _T(" - ") + commonDir.GetWinPathString());
168 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_OK)));
169 DialogEnableWindow(IDC_REFRESH, TRUE);
170 DialogEnableWindow(IDC_SHOWUNVERSIONED, !bSingleFile);
171 //DialogEnableWindow(IDC_SHOWUNMODIFIED, !bSingleFile);
172 DialogEnableWindow(IDC_SHOWIGNORED, !bSingleFile);
173 DialogEnableWindow(IDC_SHOWUSERPROPS, TRUE);
174 InterlockedExchange(&m_bBlock, FALSE);
175 // revert the remote flag back to the default
176 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);
177 RefreshCursor();
178 return 0;
181 void CChangedDlg::OnOK()
183 if (m_bBlock)
185 m_bCanceled = true;
186 return;
188 __super::OnOK();
191 void CChangedDlg::OnCancel()
193 if (m_bBlock)
195 m_bCanceled = true;
196 return;
198 __super::OnCancel();
201 DWORD CChangedDlg::UpdateShowFlags()
203 DWORD dwShow = m_FileListCtrl.GetShowFlags();
204 if (m_bShowUnversioned)
205 dwShow |= SVNSLC_SHOWUNVERSIONED;
206 else
207 dwShow &= ~SVNSLC_SHOWUNVERSIONED;
208 if (m_iShowUnmodified)
209 dwShow |= SVNSLC_SHOWNORMAL;
210 else
211 dwShow &= ~SVNSLC_SHOWNORMAL;
212 if (m_bShowIgnored)
213 dwShow |= SVNSLC_SHOWIGNORED;
214 else
215 dwShow &= ~SVNSLC_SHOWIGNORED;
216 if (m_bShowExternals)
217 dwShow |= SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO;
218 else
219 dwShow &= ~(SVNSLC_SHOWEXTERNAL | SVNSLC_SHOWINEXTERNALS | SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO);
221 return dwShow;
224 void CChangedDlg::OnBnClickedShowunversioned()
226 UpdateData();
227 if(m_FileListCtrl.m_FileLoaded & CGitStatusListCtrl::FILELIST_UNVER)
229 m_FileListCtrl.Show(UpdateShowFlags());
230 m_regAddBeforeCommit = m_bShowUnversioned;
231 }else
233 if(m_bShowUnversioned)
235 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
237 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
241 UpdateStatistics();
244 void CChangedDlg::OnBnClickedShowUnmodified()
246 UpdateData();
247 m_FileListCtrl.Show(UpdateShowFlags());
248 m_regAddBeforeCommit = m_bShowUnversioned;
249 UpdateStatistics();
252 void CChangedDlg::OnBnClickedShowignored()
254 UpdateData();
255 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
257 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
261 void CChangedDlg::OnBnClickedShowexternals()
263 UpdateData();
264 m_FileListCtrl.Show(UpdateShowFlags());
265 UpdateStatistics();
268 void CChangedDlg::OnBnClickedShowUserProps()
270 UpdateData();
271 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
273 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
277 LRESULT CChangedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)
279 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
281 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
283 return 0;
286 LRESULT CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)
288 UpdateStatistics();
289 return 0;
292 BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg)
294 m_tooltips.RelayEvent(pMsg);
295 if (pMsg->message == WM_KEYDOWN)
297 switch (pMsg->wParam)
299 case VK_F5:
301 if (m_bBlock)
302 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
303 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
305 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
308 break;
312 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
315 void CChangedDlg::OnBnClickedRefresh()
317 if (!m_bBlock)
319 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
321 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
326 void CChangedDlg::UpdateStatistics()
328 CString temp;
329 #if 0
330 LONG lMin, lMax;
332 m_FileListCtrl.GetMinMaxRevisions(lMin, lMax, true, false);
333 if (LONG(m_FileListCtrl.m_HeadRev) >= 0)
335 temp.Format(IDS_REPOSTATUS_HEADREV, lMin, lMax, LONG(m_FileListCtrl.m_HeadRev));
336 SetDlgItemText(IDC_SUMMARYTEXT, temp);
338 else
340 temp.Format(IDS_REPOSTATUS_WCINFO, lMin, lMax);
341 SetDlgItemText(IDC_SUMMARYTEXT, temp);
343 #endif
344 temp = m_FileListCtrl.GetStatisticsString();
345 temp.Replace(_T(" = "), _T("="));
346 temp.Replace(_T("\n"), _T(", "));
347 SetDlgItemText(IDC_INFOLABEL, temp);
351 void CChangedDlg::OnBnClickedCommit()
353 CString proc = CPathUtils::GetAppDirectory();
354 proc += _T("TortoiseProc.exe /command:commit");
355 proc += _T(" /path:\"");
356 bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsEmpty())&&(!m_pathList[0].IsDirectory()));
357 if (bSingleFile)
358 proc += m_pathList[0].GetWinPathString();
359 else
360 proc += m_FileListCtrl.GetCommonDirectory(false);
362 CAppUtils::LaunchApplication(proc, IDS_ERROR_CANNON_FIND_TORTOISEPROC, false);