Fixed issue #933: implement git stash --include-untracked
[TortoiseGit.git] / src / TortoiseProc / ChangedDlg.cpp
blob0387e81f20e751a76155198dd8a4ccf2624441ab
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"
32 #include "AppUtils.h"
34 IMPLEMENT_DYNAMIC(CChangedDlg, CResizableStandAloneDialog)
35 CChangedDlg::CChangedDlg(CWnd* pParent /*=NULL*/)
36 : CResizableStandAloneDialog(CChangedDlg::IDD, pParent)
37 , m_bShowUnversioned(FALSE)
38 , m_iShowUnmodified(0)
39 , m_bBlock(FALSE)
40 , m_bCanceled(false)
41 , m_bShowIgnored(FALSE)
42 , m_bShowExternals(TRUE)
43 , m_bShowUserProps(FALSE)
45 m_bRemote = FALSE;
48 CChangedDlg::~CChangedDlg()
52 void CChangedDlg::DoDataExchange(CDataExchange* pDX)
54 CResizableStandAloneDialog::DoDataExchange(pDX);
55 DDX_Control(pDX, IDC_CHANGEDLIST, m_FileListCtrl);
56 DDX_Check(pDX, IDC_SHOWUNVERSIONED, m_bShowUnversioned);
57 DDX_Check(pDX, IDC_SHOWUNMODIFIED, m_iShowUnmodified);
58 DDX_Check(pDX, IDC_SHOWIGNORED, m_bShowIgnored);
59 // DDX_Check(pDX, IDC_SHOWEXTERNALS, m_bShowExternals);
60 // DDX_Check(pDX, IDC_SHOWUSERPROPS, m_bShowUserProps);
64 BEGIN_MESSAGE_MAP(CChangedDlg, CResizableStandAloneDialog)
65 ON_BN_CLICKED(IDC_SHOWUNVERSIONED, OnBnClickedShowunversioned)
66 ON_BN_CLICKED(IDC_SHOWUNMODIFIED, OnBnClickedShowUnmodified)
67 // ON_BN_CLICKED(IDC_SHOWUSERPROPS, OnBnClickedShowUserProps)
68 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::GITSLNM_NEEDSREFRESH, OnSVNStatusListCtrlNeedsRefresh)
69 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::GITSLNM_ITEMCOUNTCHANGED, OnSVNStatusListCtrlItemCountChanged)
70 ON_BN_CLICKED(IDC_SHOWIGNORED, &CChangedDlg::OnBnClickedShowignored)
71 ON_BN_CLICKED(IDC_REFRESH, &CChangedDlg::OnBnClickedRefresh)
72 // ON_BN_CLICKED(IDC_SHOWEXTERNALS, &CChangedDlg::OnBnClickedShowexternals)
73 ON_BN_CLICKED(IDC_COMMIT, &CChangedDlg::OnBnClickedCommit)
74 END_MESSAGE_MAP()
76 BOOL CChangedDlg::OnInitDialog()
78 CResizableStandAloneDialog::OnInitDialog();
80 GetWindowText(m_sTitle);
82 m_tooltips.Create(this);
84 m_regAddBeforeCommit = CRegDWORD(_T("Software\\TortoiseGit\\AddBeforeCommit"), TRUE);
85 m_bShowUnversioned = m_regAddBeforeCommit;
86 UpdateData(FALSE);
88 m_FileListCtrl.Init(GITSLC_COLEXT | GITSLC_COLSTATUS, _T("ChangedDlg"),
89 (GITSLC_POPALL ^ GITSLC_POPSAVEAS), false);
90 m_FileListCtrl.SetCancelBool(&m_bCanceled);
91 m_FileListCtrl.SetBackgroundImage(IDI_CFM_BKG);
92 m_FileListCtrl.SetEmptyString(IDS_REPOSTATUS_EMPTYFILELIST);
94 AdjustControlSize(IDC_SHOWUNVERSIONED);
95 AdjustControlSize(IDC_SHOWUNMODIFIED);
96 AdjustControlSize(IDC_SHOWIGNORED);
97 // AdjustControlSize(IDC_SHOWEXTERNALS);
98 // AdjustControlSize(IDC_SHOWUSERPROPS);
100 AddAnchor(IDC_CHANGEDLIST, TOP_LEFT, BOTTOM_RIGHT);
101 AddAnchor(IDC_SUMMARYTEXT, BOTTOM_LEFT, BOTTOM_RIGHT);
102 AddAnchor(IDC_SHOWUNVERSIONED, BOTTOM_LEFT);
103 AddAnchor(IDC_SHOWUNMODIFIED, BOTTOM_LEFT);
104 AddAnchor(IDC_SHOWIGNORED, BOTTOM_LEFT);
105 // AddAnchor(IDC_SHOWEXTERNALS, BOTTOM_LEFT);
106 // AddAnchor(IDC_SHOWUSERPROPS, BOTTOM_LEFT);
107 AddAnchor(IDC_INFOLABEL, BOTTOM_RIGHT);
108 AddAnchor(IDC_COMMIT, BOTTOM_RIGHT);
109 AddAnchor(IDC_REFRESH, BOTTOM_RIGHT);
110 AddAnchor(IDOK, BOTTOM_RIGHT);
111 // SetPromptParentWindow(m_hWnd);
112 if (hWndExplorer)
113 CenterWindow(CWnd::FromHandle(hWndExplorer));
114 EnableSaveRestore(_T("ChangedDlg"));
116 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);
118 // first start a thread to obtain the status without
119 // blocking the dialog
120 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
122 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
125 return TRUE;
128 UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid)
130 return ((CChangedDlg*)pVoid)->ChangedStatusThread();
133 UINT CChangedDlg::ChangedStatusThread()
135 InterlockedExchange(&m_bBlock, TRUE);
137 g_Git.RefreshGitIndex();
139 m_bCanceled = false;
140 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_CANCEL)));
141 DialogEnableWindow(IDC_REFRESH, FALSE);
142 DialogEnableWindow(IDC_SHOWUNVERSIONED, FALSE);
143 DialogEnableWindow(IDC_SHOWUNMODIFIED, FALSE);
144 DialogEnableWindow(IDC_SHOWIGNORED, FALSE);
145 DialogEnableWindow(IDC_SHOWUSERPROPS, FALSE);
146 CString temp;
147 m_FileListCtrl.Clear();
148 if (!m_FileListCtrl.GetStatus(&m_pathList, m_bRemote, m_bShowIgnored != FALSE, m_bShowUnversioned != FALSE,m_bShowUserProps != FALSE))
150 if (!m_FileListCtrl.GetLastErrorMessage().IsEmpty())
151 m_FileListCtrl.SetEmptyString(m_FileListCtrl.GetLastErrorMessage());
153 unsigned int dwShow = GITSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALS | GITSLC_SHOWLOCKS | GITSLC_SHOWSWITCHED | GITSLC_SHOWINCHANGELIST;
154 dwShow |= m_bShowUnversioned ? GITSLC_SHOWUNVERSIONED : 0;
155 dwShow |= m_iShowUnmodified ? GITSLC_SHOWNORMAL : 0;
156 dwShow |= m_bShowIgnored ? GITSLC_SHOWIGNORED : 0;
157 dwShow |= m_bShowExternals ? GITSLC_SHOWEXTERNAL | GITSLC_SHOWINEXTERNALS | GITSLC_SHOWEXTERNALFROMDIFFERENTREPO : 0;
158 m_FileListCtrl.Show(dwShow);
159 UpdateStatistics();
161 bool bIsDirectory = false;
163 CTGitPath commonDir = m_FileListCtrl.GetCommonDirectory(false);
164 if (m_pathList.GetCount() == 1)
166 if (m_pathList[0].IsEmpty())
167 CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, m_sTitle);
168 else
169 CAppUtils::SetWindowTitle(m_hWnd, (g_Git.m_CurrentDir + _T("\\") + m_pathList[0].GetWinPathString()).TrimRight('\\'), m_sTitle);
170 bIsDirectory = m_pathList[0].IsDirectory() || m_pathList[0].IsEmpty(); // if it is empty it is g_Git.m_CurrentDir which is a directory
172 else
173 CAppUtils::SetWindowTitle(m_hWnd, commonDir.GetWinPathString(), m_sTitle);
175 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_OK)));
176 DialogEnableWindow(IDC_REFRESH, TRUE);
177 DialogEnableWindow(IDC_SHOWUNVERSIONED, bIsDirectory);
178 //DialogEnableWindow(IDC_SHOWUNMODIFIED, bIsDirectory);
179 DialogEnableWindow(IDC_SHOWIGNORED, bIsDirectory);
180 DialogEnableWindow(IDC_SHOWUSERPROPS, TRUE);
181 InterlockedExchange(&m_bBlock, FALSE);
182 // revert the remote flag back to the default
183 m_bRemote = !!(DWORD)CRegDWORD(_T("Software\\TortoiseGit\\CheckRepo"), FALSE);
184 RefreshCursor();
185 return 0;
188 void CChangedDlg::OnOK()
190 if (m_bBlock)
192 m_bCanceled = true;
193 return;
195 __super::OnOK();
198 void CChangedDlg::OnCancel()
200 if (m_bBlock)
202 m_bCanceled = true;
203 return;
205 __super::OnCancel();
208 DWORD CChangedDlg::UpdateShowFlags()
210 DWORD dwShow = m_FileListCtrl.GetShowFlags();
211 if (m_bShowUnversioned)
212 dwShow |= GITSLC_SHOWUNVERSIONED;
213 else
214 dwShow &= ~GITSLC_SHOWUNVERSIONED;
215 if (m_iShowUnmodified)
216 dwShow |= GITSLC_SHOWNORMAL;
217 else
218 dwShow &= ~GITSLC_SHOWNORMAL;
219 if (m_bShowIgnored)
220 dwShow |= GITSLC_SHOWIGNORED;
221 else
222 dwShow &= ~GITSLC_SHOWIGNORED;
223 if (m_bShowExternals)
224 dwShow |= GITSLC_SHOWEXTERNAL | GITSLC_SHOWINEXTERNALS | GITSLC_SHOWEXTERNALFROMDIFFERENTREPO;
225 else
226 dwShow &= ~(GITSLC_SHOWEXTERNAL | GITSLC_SHOWINEXTERNALS | GITSLC_SHOWEXTERNALFROMDIFFERENTREPO);
228 return dwShow;
231 void CChangedDlg::OnBnClickedShowunversioned()
233 UpdateData();
234 if(m_FileListCtrl.m_FileLoaded & CGitStatusListCtrl::FILELIST_UNVER)
236 m_FileListCtrl.Show(UpdateShowFlags());
237 m_regAddBeforeCommit = m_bShowUnversioned;
239 else
241 if(m_bShowUnversioned)
243 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
245 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
249 UpdateStatistics();
252 void CChangedDlg::OnBnClickedShowUnmodified()
254 UpdateData();
255 m_FileListCtrl.Show(UpdateShowFlags());
256 m_regAddBeforeCommit = m_bShowUnversioned;
257 UpdateStatistics();
260 void CChangedDlg::OnBnClickedShowignored()
262 UpdateData();
263 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
265 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
269 void CChangedDlg::OnBnClickedShowexternals()
271 UpdateData();
272 m_FileListCtrl.Show(UpdateShowFlags());
273 UpdateStatistics();
276 void CChangedDlg::OnBnClickedShowUserProps()
278 UpdateData();
279 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
281 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
285 LRESULT CChangedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)
287 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
289 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
291 return 0;
294 LRESULT CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)
296 UpdateStatistics();
297 return 0;
300 BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg)
302 m_tooltips.RelayEvent(pMsg);
303 if (pMsg->message == WM_KEYDOWN)
305 switch (pMsg->wParam)
307 case VK_F5:
309 if (m_bBlock)
310 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
311 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
313 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
316 break;
320 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
323 void CChangedDlg::OnBnClickedRefresh()
325 if (!m_bBlock)
327 if (AfxBeginThread(ChangedStatusThreadEntry, this)==NULL)
329 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
334 void CChangedDlg::UpdateStatistics()
336 CString temp;
337 #if 0
338 LONG lMin, lMax;
340 m_FileListCtrl.GetMinMaxRevisions(lMin, lMax, true, false);
341 if (LONG(m_FileListCtrl.m_HeadRev) >= 0)
343 temp.Format(IDS_REPOSTATUS_HEADREV, lMin, lMax, LONG(m_FileListCtrl.m_HeadRev));
344 SetDlgItemText(IDC_SUMMARYTEXT, temp);
346 else
348 temp.Format(IDS_REPOSTATUS_WCINFO, lMin, lMax);
349 SetDlgItemText(IDC_SUMMARYTEXT, temp);
351 #endif
352 temp = m_FileListCtrl.GetStatisticsString();
353 temp.Replace(_T(" = "), _T("="));
354 temp.Replace(_T("\n"), _T(", "));
355 SetDlgItemText(IDC_INFOLABEL, temp);
359 void CChangedDlg::OnBnClickedCommit()
361 CString proc = CPathUtils::GetAppDirectory();
362 proc += _T("TortoiseProc.exe /command:commit");
363 proc += _T(" /path:\"");
364 bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsEmpty())&&(!m_pathList[0].IsDirectory()));
365 if (bSingleFile)
366 proc += m_pathList[0].GetWinPathString();
367 else
368 proc += m_FileListCtrl.GetCommonDirectory(false);
370 CAppUtils::LaunchApplication(proc, IDS_ERROR_CANNON_FIND_TORTOISEPROC, false);