OSDN Git Service

Fix Show Log boundary show more than 1 log item when using --boundary & -n1
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / DeleteUnversionedDlg.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 "messagebox.h"\r
22 #include "SVN.h"\r
23 #include "Registry.h"\r
24 #include "DeleteUnversionedDlg.h"\r
25 \r
26 IMPLEMENT_DYNAMIC(CDeleteUnversionedDlg, CResizableStandAloneDialog)\r
27 CDeleteUnversionedDlg::CDeleteUnversionedDlg(CWnd* pParent /*=NULL*/)\r
28 : CResizableStandAloneDialog(CDeleteUnversionedDlg::IDD, pParent)\r
29 , m_bSelectAll(TRUE)\r
30 , m_bThreadRunning(FALSE)\r
31 , m_bCancelled(false)\r
32 {\r
33 }\r
34 \r
35 CDeleteUnversionedDlg::~CDeleteUnversionedDlg()\r
36 {\r
37 }\r
38 \r
39 void CDeleteUnversionedDlg::DoDataExchange(CDataExchange* pDX)\r
40 {\r
41         CResizableStandAloneDialog::DoDataExchange(pDX);\r
42         DDX_Control(pDX, IDC_ITEMLIST, m_StatusList);\r
43         DDX_Check(pDX, IDC_SELECTALL, m_bSelectAll);\r
44         DDX_Control(pDX, IDC_SELECTALL, m_SelectAll);\r
45 }\r
46 \r
47 \r
48 BEGIN_MESSAGE_MAP(CDeleteUnversionedDlg, CResizableStandAloneDialog)\r
49         ON_BN_CLICKED(IDC_SELECTALL, OnBnClickedSelectall)\r
50         ON_REGISTERED_MESSAGE(CSVNStatusListCtrl::SVNSLNM_NEEDSREFRESH, OnSVNStatusListCtrlNeedsRefresh)\r
51 END_MESSAGE_MAP()\r
52 \r
53 \r
54 \r
55 BOOL CDeleteUnversionedDlg::OnInitDialog()\r
56 {\r
57         CResizableStandAloneDialog::OnInitDialog();\r
58 \r
59         m_StatusList.Init(SVNSLC_COLEXT | SVNSLC_COLSTATUS, _T("DeleteUnversionedDlg"), 0, true);\r
60         m_StatusList.SetUnversionedRecurse(true);\r
61         m_StatusList.PutUnversionedLast(false);\r
62         m_StatusList.CheckChildrenWithParent(true);\r
63         m_StatusList.SetConfirmButton((CButton*)GetDlgItem(IDOK));\r
64         m_StatusList.SetSelectButton(&m_SelectAll);\r
65         m_StatusList.SetCancelBool(&m_bCancelled);\r
66         m_StatusList.SetBackgroundImage(IDI_DELUNVERSIONED_BKG);\r
67 \r
68         GetWindowText(m_sWindowTitle);\r
69 \r
70         AdjustControlSize(IDC_SELECTALL);\r
71 \r
72         AddAnchor(IDC_ITEMLIST, TOP_LEFT, BOTTOM_RIGHT);\r
73         AddAnchor(IDC_SELECTALL, BOTTOM_LEFT);\r
74         AddAnchor(IDOK, BOTTOM_RIGHT);\r
75         AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
76         if (hWndExplorer)\r
77                 CenterWindow(CWnd::FromHandle(hWndExplorer));\r
78         EnableSaveRestore(_T("DeleteUnversionedDlg"));\r
79 \r
80         // first start a thread to obtain the file list with the status without\r
81         // blocking the dialog\r
82         if (AfxBeginThread(StatusThreadEntry, this)==0)\r
83         {\r
84                 CMessageBox::Show(this->m_hWnd, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
85         }\r
86         InterlockedExchange(&m_bThreadRunning, TRUE);\r
87 \r
88         return TRUE;\r
89 }\r
90 \r
91 UINT CDeleteUnversionedDlg::StatusThreadEntry(LPVOID pVoid)\r
92 {\r
93         return ((CDeleteUnversionedDlg*)pVoid)->StatusThread();\r
94 }\r
95 \r
96 UINT CDeleteUnversionedDlg::StatusThread()\r
97 {\r
98         // get the status of all selected file/folders recursively\r
99         // and show the ones which are unversioned/ignored to the user\r
100         // in a list control. \r
101         DialogEnableWindow(IDOK, false);\r
102         m_bCancelled = false;\r
103 \r
104         if (!m_StatusList.GetStatus(m_pathList, false, true))\r
105         {\r
106                 m_StatusList.SetEmptyString(m_StatusList.GetLastErrorMessage());\r
107         }\r
108         m_StatusList.Show(SVNSLC_SHOWUNVERSIONED | SVNSLC_SHOWIGNORED, \r
109                 SVNSLC_SHOWUNVERSIONED | SVNSLC_SHOWIGNORED);\r
110 \r
111         CTSVNPath commonDir = m_StatusList.GetCommonDirectory(false);\r
112         SetWindowText(m_sWindowTitle + _T(" - ") + commonDir.GetWinPathString());\r
113 \r
114         InterlockedExchange(&m_bThreadRunning, FALSE);\r
115         RefreshCursor();\r
116 \r
117         return 0;\r
118 }\r
119 \r
120 void CDeleteUnversionedDlg::OnOK()\r
121 {\r
122         if (m_bThreadRunning)\r
123                 return;\r
124         // save only the files the user has selected into the temporary file\r
125         m_StatusList.WriteCheckedNamesToPathList(m_pathList);\r
126 \r
127         CResizableStandAloneDialog::OnOK();\r
128 }\r
129 \r
130 void CDeleteUnversionedDlg::OnCancel()\r
131 {\r
132         m_bCancelled = true;\r
133         if (m_bThreadRunning)\r
134                 return;\r
135 \r
136         CResizableStandAloneDialog::OnCancel();\r
137 }\r
138 \r
139 void CDeleteUnversionedDlg::OnBnClickedSelectall()\r
140 {\r
141         UINT state = (m_SelectAll.GetState() & 0x0003);\r
142         if (state == BST_INDETERMINATE)\r
143         {\r
144                 // It is not at all useful to manually place the checkbox into the indeterminate state...\r
145                 // We will force this on to the unchecked state\r
146                 state = BST_UNCHECKED;\r
147                 m_SelectAll.SetCheck(state);\r
148         }\r
149         theApp.DoWaitCursor(1);\r
150         m_StatusList.SelectAll(state == BST_CHECKED);\r
151         theApp.DoWaitCursor(-1);\r
152 }\r
153 \r
154 BOOL CDeleteUnversionedDlg::PreTranslateMessage(MSG* pMsg)\r
155 {\r
156         if (pMsg->message == WM_KEYDOWN)\r
157         {\r
158                 switch (pMsg->wParam)\r
159                 {\r
160                 case VK_RETURN:\r
161                         {\r
162                                 if (GetAsyncKeyState(VK_CONTROL)&0x8000)\r
163                                 {\r
164                                         if ( GetDlgItem(IDOK)->IsWindowEnabled() )\r
165                                         {\r
166                                                 PostMessage(WM_COMMAND, IDOK);\r
167                                         }\r
168                                         return TRUE;\r
169                                 }\r
170                         }\r
171                         break;\r
172                 case VK_F5:\r
173                         {\r
174                                 if (!m_bThreadRunning)\r
175                                 {\r
176                                         if (AfxBeginThread(StatusThreadEntry, this)==0)\r
177                                         {\r
178                                                 CMessageBox::Show(this->m_hWnd, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
179                                         }\r
180                                         else\r
181                                                 InterlockedExchange(&m_bThreadRunning, TRUE);\r
182                                 }\r
183                         }\r
184                         break;\r
185                 }\r
186         }\r
187 \r
188         return CResizableStandAloneDialog::PreTranslateMessage(pMsg);\r
189 }\r
190 \r
191 LRESULT CDeleteUnversionedDlg::OnSVNStatusListCtrlNeedsRefresh(WPARAM, LPARAM)\r
192 {\r
193         if (AfxBeginThread(StatusThreadEntry, this)==0)\r
194         {\r
195                 CMessageBox::Show(this->m_hWnd, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);\r
196         }\r
197         return 0;\r
198 }\r