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.
21 #include "TortoiseProc.h"
22 #include "ChangedDlg.h"
23 #include "messagebox.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)
40 , m_bShowIgnored(FALSE
)
41 , m_bShowExternals(TRUE
)
42 , m_bShowUserProps(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
)
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
;
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);
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
);
127 UINT
CChangedDlg::ChangedStatusThreadEntry(LPVOID pVoid
)
129 return ((CChangedDlg
*)pVoid
)->ChangedStatusThread();
132 UINT
CChangedDlg::ChangedStatusThread()
134 InterlockedExchange(&m_bBlock
, TRUE
);
136 g_Git
.RefreshGitIndex();
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
);
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
);
161 CTGitPath commonDir
= m_FileListCtrl
.GetCommonDirectory(false);
162 bool bSingleFile
= ((m_pathList
.GetCount()==1)&&(!m_pathList
[0].IsEmpty())&&(!m_pathList
[0].IsDirectory()));
164 SetWindowText(m_sTitle
+ _T(" - ") + m_pathList
[0].GetWinPathString());
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
);
181 void CChangedDlg::OnOK()
191 void CChangedDlg::OnCancel()
201 DWORD
CChangedDlg::UpdateShowFlags()
203 DWORD dwShow
= m_FileListCtrl
.GetShowFlags();
204 if (m_bShowUnversioned
)
205 dwShow
|= SVNSLC_SHOWUNVERSIONED
;
207 dwShow
&= ~SVNSLC_SHOWUNVERSIONED
;
208 if (m_iShowUnmodified
)
209 dwShow
|= SVNSLC_SHOWNORMAL
;
211 dwShow
&= ~SVNSLC_SHOWNORMAL
;
213 dwShow
|= SVNSLC_SHOWIGNORED
;
215 dwShow
&= ~SVNSLC_SHOWIGNORED
;
216 if (m_bShowExternals
)
217 dwShow
|= SVNSLC_SHOWEXTERNAL
| SVNSLC_SHOWINEXTERNALS
| SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO
;
219 dwShow
&= ~(SVNSLC_SHOWEXTERNAL
| SVNSLC_SHOWINEXTERNALS
| SVNSLC_SHOWEXTERNALFROMDIFFERENTREPO
);
224 void CChangedDlg::OnBnClickedShowunversioned()
227 if(m_FileListCtrl
.m_FileLoaded
& CGitStatusListCtrl::FILELIST_UNVER
)
229 m_FileListCtrl
.Show(UpdateShowFlags());
230 m_regAddBeforeCommit
= m_bShowUnversioned
;
233 if(m_bShowUnversioned
)
235 if (AfxBeginThread(ChangedStatusThreadEntry
, this)==NULL
)
237 CMessageBox::Show(NULL
, IDS_ERR_THREADSTARTFAILED
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
244 void CChangedDlg::OnBnClickedShowUnmodified()
247 m_FileListCtrl
.Show(UpdateShowFlags());
248 m_regAddBeforeCommit
= m_bShowUnversioned
;
252 void CChangedDlg::OnBnClickedShowignored()
255 if (AfxBeginThread(ChangedStatusThreadEntry
, this)==NULL
)
257 CMessageBox::Show(NULL
, IDS_ERR_THREADSTARTFAILED
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
261 void CChangedDlg::OnBnClickedShowexternals()
264 m_FileListCtrl
.Show(UpdateShowFlags());
268 void CChangedDlg::OnBnClickedShowUserProps()
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
);
286 LRESULT
CChangedDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM
, LPARAM
)
292 BOOL
CChangedDlg::PreTranslateMessage(MSG
* pMsg
)
294 m_tooltips
.RelayEvent(pMsg
);
295 if (pMsg
->message
== WM_KEYDOWN
)
297 switch (pMsg
->wParam
)
302 return CResizableStandAloneDialog::PreTranslateMessage(pMsg
);
303 if (AfxBeginThread(ChangedStatusThreadEntry
, this)==NULL
)
305 CMessageBox::Show(NULL
, IDS_ERR_THREADSTARTFAILED
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
312 return CResizableStandAloneDialog::PreTranslateMessage(pMsg
);
315 void CChangedDlg::OnBnClickedRefresh()
319 if (AfxBeginThread(ChangedStatusThreadEntry
, this)==NULL
)
321 CMessageBox::Show(NULL
, IDS_ERR_THREADSTARTFAILED
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
326 void CChangedDlg::UpdateStatistics()
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
);
340 temp
.Format(IDS_REPOSTATUS_WCINFO
, lMin
, lMax
);
341 SetDlgItemText(IDC_SUMMARYTEXT
, temp
);
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()));
358 proc
+= m_pathList
[0].GetWinPathString();
360 proc
+= m_FileListCtrl
.GetCommonDirectory(false);
362 CAppUtils::LaunchApplication(proc
, IDS_ERROR_CANNON_FIND_TORTOISEPROC
, false);