OSDN Git Service

Fix Issue 85: Installer: warns of downgrade when running 0.6.2.0 on top of 0.6.1.0
[tortoisegit/TortoiseGitJp.git] / src / TortoiseProc / EditPropertyValueDlg.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 "SVNProperties.h"\r
22 #include "UnicodeUtils.h"\r
23 #include "AppUtils.h"\r
24 #include "StringUtils.h"\r
25 #include "EditPropertyValueDlg.h"\r
26 \r
27 \r
28 IMPLEMENT_DYNAMIC(CEditPropertyValueDlg, CResizableStandAloneDialog)\r
29 \r
30 CEditPropertyValueDlg::CEditPropertyValueDlg(CWnd* pParent /*=NULL*/)\r
31         : CResizableStandAloneDialog(CEditPropertyValueDlg::IDD, pParent)\r
32         , m_sPropValue(_T(""))\r
33         , m_bRecursive(FALSE)\r
34         , m_bFolder(false)\r
35         , m_bMultiple(false)\r
36         , m_bIsBinary(false)\r
37         , m_bRevProps(false)\r
38 {\r
39 }\r
40 \r
41 CEditPropertyValueDlg::~CEditPropertyValueDlg()\r
42 {\r
43 }\r
44 \r
45 void CEditPropertyValueDlg::DoDataExchange(CDataExchange* pDX)\r
46 {\r
47         CResizableStandAloneDialog::DoDataExchange(pDX);\r
48         DDX_Control(pDX, IDC_PROPNAMECOMBO, m_PropNames);\r
49         DDX_Text(pDX, IDC_PROPVALUE, m_sPropValue);\r
50         DDX_Check(pDX, IDC_PROPRECURSIVE, m_bRecursive);\r
51 }\r
52 \r
53 \r
54 BEGIN_MESSAGE_MAP(CEditPropertyValueDlg, CResizableStandAloneDialog)\r
55         ON_BN_CLICKED(IDHELP, &CEditPropertyValueDlg::OnBnClickedHelp)\r
56         ON_CBN_SELCHANGE(IDC_PROPNAMECOMBO, &CEditPropertyValueDlg::CheckRecursive)\r
57         ON_CBN_EDITCHANGE(IDC_PROPNAMECOMBO, &CEditPropertyValueDlg::CheckRecursive)\r
58         ON_BN_CLICKED(IDC_LOADPROP, &CEditPropertyValueDlg::OnBnClickedLoadprop)\r
59         ON_EN_CHANGE(IDC_PROPVALUE, &CEditPropertyValueDlg::OnEnChangePropvalue)\r
60 END_MESSAGE_MAP()\r
61 \r
62 BOOL CEditPropertyValueDlg::OnInitDialog()\r
63 {\r
64         CResizableStandAloneDialog::OnInitDialog();\r
65         CString resToken;\r
66         int curPos = 0;\r
67 \r
68         // get the property values for user defined property files\r
69         m_ProjectProperties.ReadPropsPathList(m_pathList);\r
70 \r
71         bool bFound = false;\r
72 \r
73         // fill the combobox control with all the\r
74         // known properties\r
75         if (!m_bRevProps)\r
76         {\r
77                 m_PropNames.AddString(_T("svn:eol-style"));\r
78                 m_PropNames.AddString(_T("svn:executable"));\r
79                 if ((m_bFolder)||(m_bMultiple))\r
80                         m_PropNames.AddString(_T("svn:externals"));\r
81                 if ((m_bFolder)||(m_bMultiple))\r
82                         m_PropNames.AddString(_T("svn:ignore"));\r
83                 m_PropNames.AddString(_T("svn:keywords"));\r
84                 m_PropNames.AddString(_T("svn:needs-lock"));\r
85                 m_PropNames.AddString(_T("svn:mime-type"));\r
86                 if ((m_bFolder)||(m_bMultiple))\r
87                         m_PropNames.AddString(_T("svn:mergeinfo"));\r
88                 if (!m_ProjectProperties.sFPPath.IsEmpty())\r
89                 {\r
90                         resToken = m_ProjectProperties.sFPPath.Tokenize(_T("\n"),curPos);\r
91                         while (resToken != "")\r
92                         {\r
93                                 m_PropNames.AddString(resToken);\r
94                                 resToken = m_ProjectProperties.sFPPath.Tokenize(_T("\n"),curPos);\r
95                         }\r
96                 }\r
97 \r
98                 if ((m_bFolder)||(m_bMultiple))\r
99                 {\r
100                         m_PropNames.AddString(_T("bugtraq:url"));\r
101                         m_PropNames.AddString(_T("bugtraq:logregex"));\r
102                         m_PropNames.AddString(_T("bugtraq:label"));\r
103                         m_PropNames.AddString(_T("bugtraq:message"));\r
104                         m_PropNames.AddString(_T("bugtraq:number"));\r
105                         m_PropNames.AddString(_T("bugtraq:warnifnoissue"));\r
106                         m_PropNames.AddString(_T("bugtraq:append"));\r
107 \r
108                         m_PropNames.AddString(_T("tsvn:logtemplate"));\r
109                         m_PropNames.AddString(_T("tsvn:logwidthmarker"));\r
110                         m_PropNames.AddString(_T("tsvn:logminsize"));\r
111                         m_PropNames.AddString(_T("tsvn:lockmsgminsize"));\r
112                         m_PropNames.AddString(_T("tsvn:logfilelistenglish"));\r
113                         m_PropNames.AddString(_T("tsvn:logsummary"));\r
114                         m_PropNames.AddString(_T("tsvn:projectlanguage"));\r
115                         m_PropNames.AddString(_T("tsvn:userfileproperties"));\r
116                         m_PropNames.AddString(_T("tsvn:userdirproperties"));\r
117                         m_PropNames.AddString(_T("tsvn:autoprops"));\r
118 \r
119                         m_PropNames.AddString(_T("webviewer:revision"));\r
120                         m_PropNames.AddString(_T("webviewer:pathrevision"));\r
121 \r
122                         if (!m_ProjectProperties.sDPPath.IsEmpty())\r
123                         {\r
124                                 curPos = 0;\r
125                                 resToken = m_ProjectProperties.sDPPath.Tokenize(_T("\n"),curPos);\r
126 \r
127                                 while (resToken != "")\r
128                                 {\r
129                                         m_PropNames.AddString(resToken);\r
130                                         resToken = m_ProjectProperties.sDPPath.Tokenize(_T("\n"),curPos);\r
131                                 }\r
132                         }\r
133                 }\r
134                 else\r
135                         GetDlgItem(IDC_PROPRECURSIVE)->EnableWindow(FALSE);\r
136 \r
137                 // select the pre-set property in the combobox\r
138                 for (int i=0; i<m_PropNames.GetCount(); ++i)\r
139                 {\r
140                         CString sText;\r
141                         m_PropNames.GetLBText(i, sText);\r
142                         if (m_sPropName.Compare(sText)==0)\r
143                         {\r
144                                 m_PropNames.SetCurSel(i);\r
145                                 bFound = true;\r
146                                 break;\r
147                         }\r
148                 }\r
149         }\r
150         if (!bFound)\r
151         {\r
152                 m_PropNames.SetWindowText(m_sPropName);\r
153         }\r
154 \r
155         GetDlgItem(IDC_PROPNAMECOMBO)->EnableToolTips();\r
156 \r
157         m_tooltips.Create(this);\r
158 \r
159         UpdateData(FALSE);\r
160         CheckRecursive();\r
161 \r
162         if (!m_sTitle.IsEmpty())\r
163                 SetWindowText(m_sTitle);\r
164 \r
165         AdjustControlSize(IDC_PROPRECURSIVE);\r
166 \r
167         GetDlgItem(IDC_PROPRECURSIVE)->ShowWindow(m_bRevProps ? SW_HIDE : SW_SHOW);\r
168 \r
169         AddAnchor(IDC_PROPNAME, TOP_LEFT, TOP_CENTER);\r
170         AddAnchor(IDC_PROPNAMECOMBO, TOP_CENTER, TOP_RIGHT);\r
171         AddAnchor(IDC_PROPVALUEGROUP, TOP_LEFT, BOTTOM_RIGHT);\r
172         AddAnchor(IDC_PROPVALUE, TOP_LEFT, BOTTOM_RIGHT);\r
173         AddAnchor(IDC_LOADPROP, BOTTOM_RIGHT);\r
174         AddAnchor(IDC_PROPRECURSIVE, BOTTOM_LEFT);\r
175         AddAnchor(IDOK, BOTTOM_RIGHT);\r
176         AddAnchor(IDCANCEL, BOTTOM_RIGHT);\r
177         AddAnchor(IDHELP, BOTTOM_RIGHT);\r
178         EnableSaveRestore(_T("EditPropertyValueDlg"));\r
179         return TRUE;\r
180 }\r
181 \r
182 void CEditPropertyValueDlg::SetPropertyValue(const std::string& sValue)\r
183 {\r
184         if (SVNProperties::IsBinary(sValue))\r
185         {\r
186                 m_bIsBinary = true;\r
187                 m_sPropValue.LoadString(IDS_EDITPROPS_BINVALUE);\r
188         }\r
189         else\r
190         {\r
191                 m_bIsBinary = false;\r
192                 m_sPropValue = MultibyteToWide(sValue.c_str()).c_str();\r
193         }\r
194 }\r
195 \r
196 void CEditPropertyValueDlg::OnBnClickedHelp()\r
197 {\r
198         OnHelp();\r
199 }\r
200 \r
201 void CEditPropertyValueDlg::OnCancel()\r
202 {\r
203         m_sPropName.Empty();\r
204         CDialog::OnCancel();\r
205 }\r
206 \r
207 void CEditPropertyValueDlg::OnOK()\r
208 {\r
209         UpdateData();\r
210         if (!m_bIsBinary)\r
211         {\r
212                 m_PropValue = WideToMultibyte((LPCTSTR)m_sPropValue);\r
213         }\r
214         m_PropNames.GetWindowText(m_sPropName);\r
215         CDialog::OnOK();\r
216 }\r
217 \r
218 void CEditPropertyValueDlg::CheckRecursive()\r
219 {\r
220         // some properties can only be applied to files\r
221         // if the properties are edited for a folder or\r
222         // multiple items, then such properties must be\r
223         // applied recursively.\r
224         // Here, we check the property the user selected\r
225         // and check the "recursive" checkbox automatically\r
226         // if it needs to be set.\r
227         int idx = m_PropNames.GetCurSel();\r
228         if (idx >= 0)\r
229         {\r
230                 CString sName;\r
231                 m_PropNames.GetLBText(idx, sName);\r
232                 if ((m_bFolder)||(m_bMultiple))\r
233                 {\r
234                         // folder or multiple, now check for file-only props\r
235                         if (sName.Compare(_T("svn:eol-style"))==0)\r
236                                 m_bRecursive = TRUE;\r
237                         if (sName.Compare(_T("svn:executable"))==0)\r
238                                 m_bRecursive = TRUE;\r
239                         if (sName.Compare(_T("svn:keywords"))==0)\r
240                                 m_bRecursive = TRUE;\r
241                         if (sName.Compare(_T("svn:needs-lock"))==0)\r
242                                 m_bRecursive = TRUE;\r
243                         if (sName.Compare(_T("svn:mime-type"))==0)\r
244                                 m_bRecursive = TRUE;\r
245                 }\r
246                 UINT nText = 0;\r
247                 if (sName.Compare(_T("svn:externals"))==0)\r
248                         nText = IDS_PROP_TT_EXTERNALS;\r
249                 if (sName.Compare(_T("svn:executable"))==0)\r
250                         nText = IDS_PROP_TT_EXECUTABLE;\r
251                 if (sName.Compare(_T("svn:needs-lock"))==0)\r
252                         nText = IDS_PROP_TT_NEEDSLOCK;\r
253                 if (sName.Compare(_T("svn:mime-type"))==0)\r
254                         nText = IDS_PROP_TT_MIMETYPE;\r
255                 if (sName.Compare(_T("svn:ignore"))==0)\r
256                         nText = IDS_PROP_TT_IGNORE;\r
257                 if (sName.Compare(_T("svn:keywords"))==0)\r
258                         nText = IDS_PROP_TT_KEYWORDS;\r
259                 if (sName.Compare(_T("svn:eol-style"))==0)\r
260                         nText = IDS_PROP_TT_EOLSTYLE;\r
261                 if (sName.Compare(_T("svn:mergeinfo"))==0)\r
262                         nText = IDS_PROP_TT_MERGEINFO;\r
263 \r
264                 if (sName.Compare(_T("bugtraq:label"))==0)\r
265                         nText = IDS_PROP_TT_BQLABEL;\r
266                 if (sName.Compare(_T("bugtraq:logregex"))==0)\r
267                         nText = IDS_PROP_TT_BQLOGREGEX;\r
268                 if (sName.Compare(_T("bugtraq:message"))==0)\r
269                         nText = IDS_PROP_TT_BQMESSAGE;\r
270                 if (sName.Compare(_T("bugtraq:number"))==0)\r
271                         nText = IDS_PROP_TT_BQNUMBER;\r
272                 if (sName.Compare(_T("bugtraq:url"))==0)\r
273                         nText = IDS_PROP_TT_BQURL;\r
274                 if (sName.Compare(_T("bugtraq:warnifnoissue"))==0)\r
275                         nText = IDS_PROP_TT_BQWARNNOISSUE;\r
276                 if (sName.Compare(_T("bugtraq:append"))==0)\r
277                         nText = IDS_PROP_TT_BQAPPEND;\r
278 \r
279                 if (sName.Compare(_T("tsvn:logtemplate"))==0)\r
280                         nText = IDS_PROP_TT_TSVNLOGTEMPLATE;\r
281                 if (sName.Compare(_T("tsvn:logwidthmarker"))==0)\r
282                         nText = IDS_PROP_TT_TSVNLOGWIDTHMARKER;\r
283                 if (sName.Compare(_T("tsvn:logminsize"))==0)\r
284                         nText = IDS_PROP_TT_TSVNLOGMINSIZE;\r
285                 if (sName.Compare(_T("tsvn:lockmsgminsize"))==0)\r
286                         nText = IDS_PROP_TT_TSVNLOCKMSGMINSIZE;\r
287                 if (sName.Compare(_T("tsvn:logfilelistenglish"))==0)\r
288                         nText = IDS_PROP_TT_TSVNLOGFILELISTENGLISH;\r
289                 if (sName.Compare(_T("tsvn:logsummary"))==0)\r
290                         nText = IDS_PROP_TT_TSVNLOGSUMMARY;\r
291                 if (sName.Compare(_T("tsvn:projectlanguage"))==0)\r
292                         nText = IDS_PROP_TT_TSVNPROJECTLANGUAGE;\r
293                 if (sName.Compare(_T("tsvn:userfileproperties"))==0)\r
294                         nText = IDS_PROP_TT_TSVNUSERFILEPROPERTIES;\r
295                 if (sName.Compare(_T("tsvn:userfolderproperties"))==0)\r
296                         nText = IDS_PROP_TT_TSVNUSERFOLDERPROPERTIES;\r
297                 if (sName.Compare(_T("tsvn:autoprops"))==0)\r
298                         nText = IDS_PROP_TT_TSVNAUTOPROPS;\r
299 \r
300                 if (sName.Compare(_T("webviewer:revision"))==0)\r
301                         nText = IDS_PROP_TT_WEBVIEWERREVISION;\r
302                 if (sName.Compare(_T("webviewer:pathrevision"))==0)\r
303                         nText = IDS_PROP_TT_WEBVIEWERPATHREVISION;\r
304 \r
305                 if (nText)\r
306                 {\r
307                         m_tooltips.AddTool(GetDlgItem(IDC_PROPNAMECOMBO), nText);\r
308                         m_tooltips.AddTool(GetDlgItem(IDC_PROPNAMECOMBO)->GetWindow(GW_CHILD), nText);\r
309                         m_tooltips.AddTool(GetDlgItem(IDC_PROPVALUE), nText);\r
310                 }\r
311                 else\r
312                 {\r
313                         // if no match is found then remove the tool tip so that the last tooltip is not wrongly shown\r
314                         m_tooltips.DelTool(GetDlgItem(IDC_PROPNAMECOMBO)->GetWindow(GW_CHILD));\r
315                 }\r
316         }\r
317 }\r
318 \r
319 BOOL CEditPropertyValueDlg::PreTranslateMessage(MSG* pMsg)\r
320 {\r
321         if (pMsg->message == WM_KEYDOWN)\r
322         {\r
323                 switch (pMsg->wParam)\r
324                 {\r
325                 case VK_RETURN:\r
326                         {\r
327                                 if (GetAsyncKeyState(VK_CONTROL)&0x8000)\r
328                                 {\r
329                                         if ( GetDlgItem(IDOK)->IsWindowEnabled() )\r
330                                         {\r
331                                                 PostMessage(WM_COMMAND, IDOK);\r
332                                         }\r
333                                 }\r
334                         }\r
335                         break;\r
336                 default:\r
337                         break;\r
338                 }\r
339         }\r
340 \r
341         m_tooltips.RelayEvent(pMsg);\r
342         return __super::PreTranslateMessage(pMsg);\r
343 }\r
344 \r
345 void CEditPropertyValueDlg::OnBnClickedLoadprop()\r
346 {\r
347         CString openPath;\r
348         if (!CAppUtils::FileOpenSave(openPath, NULL, IDS_REPOBROWSE_OPEN, IDS_COMMONFILEFILTER, true, m_hWnd))\r
349         {\r
350                 return;\r
351         }\r
352         // first check the size of the file\r
353         HANDLE hFile = CreateFile(openPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\r
354         if (hFile != INVALID_HANDLE_VALUE)\r
355         {\r
356                 DWORD size = GetFileSize(hFile, NULL);\r
357                 FILE * stream;\r
358                 _tfopen_s(&stream, openPath, _T("rbS"));\r
359                 char * buf = new char[size];\r
360                 if (fread(buf, sizeof(char), size, stream)==size)\r
361                 {\r
362                         m_PropValue.assign(buf, size);\r
363                 }\r
364                 delete [] buf;\r
365                 fclose(stream);\r
366                 // see if the loaded file contents are binary\r
367                 SetPropertyValue(m_PropValue);\r
368                 UpdateData(FALSE);\r
369                 CloseHandle(hFile);\r
370         }\r
371 \r
372 }\r
373 \r
374 void CEditPropertyValueDlg::OnEnChangePropvalue()\r
375 {\r
376         UpdateData();\r
377         CString sTemp;\r
378         sTemp.LoadString(IDS_EDITPROPS_BINVALUE);\r
379         if ((m_bIsBinary)&&(m_sPropValue.CompareNoCase(sTemp)!=0))\r
380         {\r
381                 m_sPropValue.Empty();\r
382                 m_PropValue.clear();\r
383                 UpdateData(FALSE);\r
384                 m_bIsBinary = false;\r
385         }\r
386 }\r
387 \r
388 \r
389 \r