Remove unused variables
[TortoiseGit.git] / src / TortoiseProc / ChangedDlg.cpp
blob80dddfc0bbd3816bff2f9d1668fb891926d2a199
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2016 - 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 "ChangedDlg.h"
27 #include "IconMenu.h"
28 #include "RefLogDlg.h"
30 #include "GitStatusListCtrl.h"
32 IMPLEMENT_DYNAMIC(CChangedDlg, CResizableStandAloneDialog)
33 CChangedDlg::CChangedDlg(CWnd* pParent /*=nullptr*/)
34 : CResizableStandAloneDialog(CChangedDlg::IDD, pParent)
35 , m_bShowUnversioned(FALSE)
36 , m_iShowUnmodified(0)
37 , m_bBlock(FALSE)
38 , m_bCanceled(false)
39 , m_bShowIgnored(FALSE)
40 , m_bShowLocalChangesIgnored(FALSE)
41 , m_bWholeProject(FALSE)
43 m_bRemote = FALSE;
46 CChangedDlg::~CChangedDlg()
50 void CChangedDlg::DoDataExchange(CDataExchange* pDX)
52 CResizableStandAloneDialog::DoDataExchange(pDX);
53 DDX_Control(pDX, IDC_CHANGEDLIST, m_FileListCtrl);
54 DDX_Control(pDX, IDC_BUTTON_STASH, m_ctrlStash);
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_SHOWLOCALCHANGESIGNORED, m_bShowLocalChangesIgnored);
59 DDX_Check(pDX, IDC_WHOLE_PROJECT, m_bWholeProject);
63 BEGIN_MESSAGE_MAP(CChangedDlg, CResizableStandAloneDialog)
64 ON_BN_CLICKED(IDC_SHOWUNVERSIONED, OnBnClickedShowunversioned)
65 ON_BN_CLICKED(IDC_SHOWUNMODIFIED, OnBnClickedShowUnmodified)
66 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::GITSLNM_NEEDSREFRESH, OnSVNStatusListCtrlNeedsRefresh)
67 ON_REGISTERED_MESSAGE(CGitStatusListCtrl::GITSLNM_ITEMCOUNTCHANGED, OnSVNStatusListCtrlItemCountChanged)
68 ON_BN_CLICKED(IDC_SHOWIGNORED, &CChangedDlg::OnBnClickedShowignored)
69 ON_BN_CLICKED(IDC_REFRESH, &CChangedDlg::OnBnClickedRefresh)
70 ON_BN_CLICKED(IDC_COMMIT, &CChangedDlg::OnBnClickedCommit)
71 ON_BN_CLICKED(IDC_BUTTON_STASH, &CChangedDlg::OnBnClickedStash)
72 ON_BN_CLICKED(IDC_BUTTON_UNIFIEDDIFF, &CChangedDlg::OnBnClickedButtonUnifieddiff)
73 ON_BN_CLICKED(IDC_SHOWLOCALCHANGESIGNORED, &CChangedDlg::OnBnClickedShowlocalchangesignored)
74 ON_BN_CLICKED(IDC_WHOLE_PROJECT, OnBnClickedWholeProject)
75 END_MESSAGE_MAP()
77 BOOL CChangedDlg::OnInitDialog()
79 CResizableStandAloneDialog::OnInitDialog();
81 m_regAddBeforeCommit = CRegDWORD(L"Software\\TortoiseGit\\AddBeforeCommit", TRUE);
82 m_bShowUnversioned = m_regAddBeforeCommit;
84 CString regPath(g_Git.m_CurrentDir);
85 regPath.Replace(L':', L'_');
86 m_regShowWholeProject = CRegDWORD(L"Software\\TortoiseGit\\TortoiseProc\\ShowWholeProject\\" + regPath, FALSE);
87 m_bWholeProject = m_regShowWholeProject;
88 SetDlgTitle();
90 UpdateData(FALSE);
92 m_FileListCtrl.Init(GITSLC_COLEXT | GITSLC_COLSTATUS | GITSLC_COLADD| GITSLC_COLDEL | GITSLC_COLMODIFICATIONDATE, L"ChangedDlg", (GITSLC_POPALL ^ (GITSLC_POPSAVEAS | GITSLC_POPRESTORE | GITSLC_PREPAREDIFF)), false);
93 m_FileListCtrl.SetCancelBool(&m_bCanceled);
94 m_FileListCtrl.SetBackgroundImage(IDI_CFM_BKG);
95 m_FileListCtrl.SetEmptyString(IDS_REPOSTATUS_EMPTYFILELIST);
97 AdjustControlSize(IDC_SHOWUNVERSIONED);
98 AdjustControlSize(IDC_SHOWUNMODIFIED);
99 AdjustControlSize(IDC_SHOWLOCALCHANGESIGNORED);
100 AdjustControlSize(IDC_SHOWIGNORED);
101 AdjustControlSize(IDC_WHOLE_PROJECT);
103 AddAnchor(IDC_CHANGEDLIST, TOP_LEFT, BOTTOM_RIGHT);
104 AddAnchor(IDC_SUMMARYTEXT, BOTTOM_LEFT, BOTTOM_RIGHT);
105 AddAnchor(IDC_SHOWUNVERSIONED, BOTTOM_LEFT);
106 AddAnchor(IDC_SHOWUNMODIFIED, BOTTOM_LEFT);
107 AddAnchor(IDC_SHOWLOCALCHANGESIGNORED, BOTTOM_LEFT);
108 AddAnchor(IDC_SHOWIGNORED, BOTTOM_LEFT);
109 AddAnchor(IDC_WHOLE_PROJECT, BOTTOM_LEFT);
110 AddAnchor(IDC_INFOLABEL, BOTTOM_RIGHT);
111 AddAnchor(IDC_BUTTON_STASH, BOTTOM_RIGHT);
112 AddAnchor(IDC_BUTTON_UNIFIEDDIFF, BOTTOM_RIGHT);
113 AddAnchor(IDC_COMMIT, BOTTOM_RIGHT);
114 AddAnchor(IDC_REFRESH, BOTTOM_RIGHT);
115 AddAnchor(IDOK, BOTTOM_RIGHT);
116 // SetPromptParentWindow(m_hWnd);
117 if (hWndExplorer)
118 CenterWindow(CWnd::FromHandle(hWndExplorer));
119 EnableSaveRestore(L"ChangedDlg");
121 m_ctrlStash.m_bAlwaysShowArrow = true;
123 m_bRemote = !!(DWORD)CRegDWORD(L"Software\\TortoiseGit\\CheckRepo", FALSE);
125 // first start a thread to obtain the status without
126 // blocking the dialog
127 if (!AfxBeginThread(ChangedStatusThreadEntry, this))
129 CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
132 return TRUE;
135 UINT CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid)
137 return reinterpret_cast<CChangedDlg*>(pVoid)->ChangedStatusThread();
140 UINT CChangedDlg::ChangedStatusThread()
142 InterlockedExchange(&m_bBlock, TRUE);
144 g_Git.RefreshGitIndex();
146 m_bCanceled = false;
147 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_CANCEL)));
148 DialogEnableWindow(IDC_REFRESH, FALSE);
149 DialogEnableWindow(IDC_SHOWUNVERSIONED, FALSE);
150 DialogEnableWindow(IDC_SHOWUNMODIFIED, FALSE);
151 DialogEnableWindow(IDC_SHOWIGNORED, FALSE);
152 DialogEnableWindow(IDC_SHOWLOCALCHANGESIGNORED, FALSE);
153 m_FileListCtrl.StoreScrollPos();
154 m_FileListCtrl.Clear();
155 if (!m_FileListCtrl.GetStatus(m_bWholeProject ? nullptr : &m_pathList, m_bRemote, m_bShowIgnored != FALSE, m_bShowUnversioned != FALSE, m_bShowLocalChangesIgnored != FALSE))
157 if (!m_FileListCtrl.GetLastErrorMessage().IsEmpty())
158 m_FileListCtrl.SetEmptyString(m_FileListCtrl.GetLastErrorMessage());
160 unsigned int dwShow = GITSLC_SHOWVERSIONEDBUTNORMALANDEXTERNALS | GITSLC_SHOWLOCKS | GITSLC_SHOWSWITCHED | GITSLC_SHOWINCHANGELIST;
161 dwShow |= m_bShowUnversioned ? GITSLC_SHOWUNVERSIONED : 0;
162 dwShow |= m_iShowUnmodified ? GITSLC_SHOWNORMAL : 0;
163 dwShow |= m_bShowIgnored ? GITSLC_SHOWIGNORED : 0;
164 dwShow |= m_bShowLocalChangesIgnored ? GITSLC_SHOWASSUMEVALID | GITSLC_SHOWSKIPWORKTREE : 0;
165 m_FileListCtrl.Show(dwShow);
166 UpdateStatistics();
168 SetDlgTitle();
169 bool bIsDirectory = false;
170 if (m_pathList.GetCount() == 1)
171 bIsDirectory = m_pathList[0].IsDirectory() || m_pathList[0].IsEmpty(); // if it is empty it is g_Git.m_CurrentDir which is a directory
173 SetDlgItemText(IDOK, CString(MAKEINTRESOURCE(IDS_MSGBOX_OK)));
174 DialogEnableWindow(IDC_REFRESH, TRUE);
175 DialogEnableWindow(IDC_SHOWUNVERSIONED, bIsDirectory);
176 //DialogEnableWindow(IDC_SHOWUNMODIFIED, bIsDirectory);
177 DialogEnableWindow(IDC_SHOWIGNORED, bIsDirectory);
178 DialogEnableWindow(IDC_SHOWLOCALCHANGESIGNORED, TRUE);
179 InterlockedExchange(&m_bBlock, FALSE);
180 // revert the remote flag back to the default
181 m_bRemote = !!(DWORD)CRegDWORD(L"Software\\TortoiseGit\\CheckRepo", FALSE);
182 RefreshCursor();
183 return 0;
186 void CChangedDlg::OnOK()
188 if (m_bBlock)
190 m_bCanceled = true;
191 return;
193 __super::OnOK();
196 void CChangedDlg::OnCancel()
198 if (m_bBlock)
200 m_bCanceled = true;
201 return;
203 __super::OnCancel();
206 DWORD CChangedDlg::UpdateShowFlags()
208 DWORD dwShow = m_FileListCtrl.GetShowFlags();
209 if (m_bShowUnversioned)
210 dwShow |= GITSLC_SHOWUNVERSIONED;
211 else
212 dwShow &= ~GITSLC_SHOWUNVERSIONED;
213 if (m_iShowUnmodified)
214 dwShow |= GITSLC_SHOWNORMAL;
215 else
216 dwShow &= ~GITSLC_SHOWNORMAL;
217 if (m_bShowIgnored)
218 dwShow |= GITSLC_SHOWIGNORED;
219 else
220 dwShow &= ~GITSLC_SHOWIGNORED;
221 if (m_bShowLocalChangesIgnored)
222 dwShow |= GITSLC_SHOWASSUMEVALID|GITSLC_SHOWSKIPWORKTREE;
223 else
224 dwShow &= ~(GITSLC_SHOWASSUMEVALID|GITSLC_SHOWSKIPWORKTREE);
226 // old bShowExternals:
227 dwShow &= ~(GITSLC_SHOWEXTERNAL | GITSLC_SHOWINEXTERNALS | GITSLC_SHOWEXTERNALFROMDIFFERENTREPO);
229 return dwShow;
232 void CChangedDlg::SetDlgTitle()
234 if (m_sTitle.IsEmpty())
235 GetWindowText(m_sTitle);
237 if (m_bWholeProject)
238 CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, m_sTitle);
239 else
241 if (m_pathList.GetCount() == 1)
242 CAppUtils::SetWindowTitle(m_hWnd, g_Git.CombinePath(m_pathList[0].GetUIPathString()), m_sTitle);
243 else
244 CAppUtils::SetWindowTitle(m_hWnd, g_Git.CombinePath(m_FileListCtrl.GetCommonDirectory(false)), m_sTitle);
248 void CChangedDlg::OnBnClickedShowunversioned()
250 UpdateData();
251 m_regAddBeforeCommit = m_bShowUnversioned;
252 if(m_FileListCtrl.m_FileLoaded & CGitStatusListCtrl::FILELIST_UNVER)
254 m_FileListCtrl.StoreScrollPos();
255 m_FileListCtrl.Show(UpdateShowFlags());
257 else
259 if(m_bShowUnversioned)
261 if (!AfxBeginThread(ChangedStatusThreadEntry, this))
262 CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
265 UpdateStatistics();
268 void CChangedDlg::OnBnClickedShowUnmodified()
270 UpdateData();
271 m_FileListCtrl.StoreScrollPos();
272 m_FileListCtrl.Show(UpdateShowFlags());
273 m_regAddBeforeCommit = m_bShowUnversioned;
274 UpdateStatistics();
277 void CChangedDlg::OnBnClickedShowignored()
279 UpdateData();
280 m_FileListCtrl.StoreScrollPos();
281 if (m_FileListCtrl.m_FileLoaded & CGitStatusListCtrl::FILELIST_IGNORE)
282 m_FileListCtrl.Show(UpdateShowFlags());
283 else if (m_bShowIgnored)
285 if (!AfxBeginThread(ChangedStatusThreadEntry, this))
286 CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
288 UpdateStatistics();
291 void CChangedDlg::OnBnClickedShowlocalchangesignored()
293 UpdateData();
294 m_FileListCtrl.StoreScrollPos();
295 if (m_FileListCtrl.m_FileLoaded & CGitStatusListCtrl::FILELIST_LOCALCHANGESIGNORED)
296 m_FileListCtrl.Show(UpdateShowFlags());
297 else if (m_bShowLocalChangesIgnored)
299 if (!AfxBeginThread(ChangedStatusThreadEntry, this))
300 CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
302 UpdateStatistics();
305 LRESULT CChangedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)
307 if (!AfxBeginThread(ChangedStatusThreadEntry, this))
308 CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
309 return 0;
312 LRESULT CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)
314 UpdateStatistics();
315 return 0;
318 BOOL CChangedDlg::PreTranslateMessage(MSG* pMsg)
320 if (pMsg->message == WM_KEYDOWN)
322 switch (pMsg->wParam)
324 case VK_F5:
326 if (m_bBlock)
327 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
328 if (!AfxBeginThread(ChangedStatusThreadEntry, this))
330 CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
333 break;
337 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
340 void CChangedDlg::OnBnClickedRefresh()
342 if (!m_bBlock)
344 if (!AfxBeginThread(ChangedStatusThreadEntry, this))
345 CMessageBox::Show(GetSafeHwnd(), IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
349 void CChangedDlg::UpdateStatistics()
351 CString temp;
352 #if 0
353 LONG lMin, lMax;
355 m_FileListCtrl.GetMinMaxRevisions(lMin, lMax, true, false);
356 if (LONG(m_FileListCtrl.m_HeadRev) >= 0)
358 temp.Format(IDS_REPOSTATUS_HEADREV, lMin, lMax, LONG(m_FileListCtrl.m_HeadRev));
359 SetDlgItemText(IDC_SUMMARYTEXT, temp);
361 else
363 temp.Format(IDS_REPOSTATUS_WCINFO, lMin, lMax);
364 SetDlgItemText(IDC_SUMMARYTEXT, temp);
366 #endif
367 temp = m_FileListCtrl.GetStatisticsString();
368 temp.Replace(L" = ", L"=");
369 temp.Replace(L"\n", L", ");
370 SetDlgItemText(IDC_INFOLABEL, temp);
373 void CChangedDlg::OnBnClickedCommit()
375 CTGitPathList pathList;
376 bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsEmpty())&&(!m_pathList[0].IsDirectory()));
377 if (bSingleFile)
378 pathList.AddPath(m_pathList[0]);
379 else
380 pathList.AddPath(m_pathList.GetCommonRoot().GetDirectory());
382 bool bSelectFilesForCommit = !!DWORD(CRegStdDWORD(L"Software\\TortoiseGit\\SelectFilesForCommit", TRUE));
384 CString logmsg;
385 CTGitPathList selected;
386 CAppUtils::Commit(L"",
387 m_bWholeProject,
388 logmsg,
389 pathList,
390 selected,
391 bSelectFilesForCommit);
393 OnBnClickedRefresh();
396 void CChangedDlg::OnBnClickedStash()
398 CIconMenu popup;
400 if (popup.CreatePopupMenu())
402 popup.AppendMenuIcon(ID_STASH_SAVE, IDS_MENUSTASHSAVE, IDI_COMMIT);
404 CTGitPath root = g_Git.m_CurrentDir;
405 if (root.HasStashDir())
407 popup.AppendMenuIcon(ID_STASH_POP, IDS_MENUSTASHPOP, IDI_RELOCATE);
408 popup.AppendMenuIcon(ID_STASH_APPLY, IDS_MENUSTASHAPPLY, IDI_RELOCATE);
409 popup.AppendMenuIcon(ID_STASH_LIST, IDS_MENUSTASHLIST, IDI_LOG);
412 RECT rect;
413 GetDlgItem(IDC_BUTTON_STASH)->GetWindowRect(&rect);
414 int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, rect.left, rect.top, this);
416 switch (cmd & 0xFFFF)
418 case ID_STASH_SAVE:
419 CAppUtils::StashSave();
420 break;
421 case ID_STASH_POP:
422 CAppUtils::StashPop(2);
423 break;
424 case ID_STASH_APPLY:
425 CAppUtils::StashApply(L"", false);
426 break;
427 case ID_STASH_LIST:
429 CRefLogDlg dlg;
430 dlg.m_CurrentBranch = L"refs/stash";
431 dlg.DoModal();
433 break;
434 default:
435 return;
437 OnBnClickedRefresh();
441 void CChangedDlg::OnBnClickedButtonUnifieddiff()
443 CTGitPath commonDirectory;
444 if (!m_bWholeProject)
445 commonDirectory = m_pathList.GetCommonRoot().GetDirectory();
446 bool bSingleFile = ((m_pathList.GetCount()==1)&&(!m_pathList[0].IsEmpty())&&(!m_pathList[0].IsDirectory()));
447 if (bSingleFile)
448 commonDirectory = m_pathList[0];
449 CString sCmd;
450 sCmd.Format(L"/command:showcompare /unified /path:\"%s\" /revision1:HEAD /revision2:%s", (LPCTSTR)g_Git.CombinePath(commonDirectory), (LPCTSTR)GitRev::GetWorkingCopy());
451 if (!!(GetAsyncKeyState(VK_SHIFT) & 0x8000))
452 sCmd += L" /alternative";
453 CAppUtils::RunTortoiseGitProc(sCmd);
456 void CChangedDlg::OnBnClickedWholeProject()
458 UpdateData();
459 m_regShowWholeProject = m_bWholeProject;
460 OnBnClickedRefresh();