1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseSVN
\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
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
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
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
28 IMPLEMENT_DYNAMIC(CEditPropertyValueDlg, CResizableStandAloneDialog)
\r
30 CEditPropertyValueDlg::CEditPropertyValueDlg(CWnd* pParent /*=NULL*/)
\r
31 : CResizableStandAloneDialog(CEditPropertyValueDlg::IDD, pParent)
\r
32 , m_sPropValue(_T(""))
\r
33 , m_bRecursive(FALSE)
\r
35 , m_bMultiple(false)
\r
36 , m_bIsBinary(false)
\r
37 , m_bRevProps(false)
\r
41 CEditPropertyValueDlg::~CEditPropertyValueDlg()
\r
45 void CEditPropertyValueDlg::DoDataExchange(CDataExchange* pDX)
\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
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
62 BOOL CEditPropertyValueDlg::OnInitDialog()
\r
64 CResizableStandAloneDialog::OnInitDialog();
\r
68 // get the property values for user defined property files
\r
69 m_ProjectProperties.ReadPropsPathList(m_pathList);
\r
71 bool bFound = false;
\r
73 // fill the combobox control with all the
\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
90 resToken = m_ProjectProperties.sFPPath.Tokenize(_T("\n"),curPos);
\r
91 while (resToken != "")
\r
93 m_PropNames.AddString(resToken);
\r
94 resToken = m_ProjectProperties.sFPPath.Tokenize(_T("\n"),curPos);
\r
98 if ((m_bFolder)||(m_bMultiple))
\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
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
119 m_PropNames.AddString(_T("webviewer:revision"));
\r
120 m_PropNames.AddString(_T("webviewer:pathrevision"));
\r
122 if (!m_ProjectProperties.sDPPath.IsEmpty())
\r
125 resToken = m_ProjectProperties.sDPPath.Tokenize(_T("\n"),curPos);
\r
127 while (resToken != "")
\r
129 m_PropNames.AddString(resToken);
\r
130 resToken = m_ProjectProperties.sDPPath.Tokenize(_T("\n"),curPos);
\r
135 GetDlgItem(IDC_PROPRECURSIVE)->EnableWindow(FALSE);
\r
137 // select the pre-set property in the combobox
\r
138 for (int i=0; i<m_PropNames.GetCount(); ++i)
\r
141 m_PropNames.GetLBText(i, sText);
\r
142 if (m_sPropName.Compare(sText)==0)
\r
144 m_PropNames.SetCurSel(i);
\r
152 m_PropNames.SetWindowText(m_sPropName);
\r
155 GetDlgItem(IDC_PROPNAMECOMBO)->EnableToolTips();
\r
157 m_tooltips.Create(this);
\r
162 if (!m_sTitle.IsEmpty())
\r
163 SetWindowText(m_sTitle);
\r
165 AdjustControlSize(IDC_PROPRECURSIVE);
\r
167 GetDlgItem(IDC_PROPRECURSIVE)->ShowWindow(m_bRevProps ? SW_HIDE : SW_SHOW);
\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
182 void CEditPropertyValueDlg::SetPropertyValue(const std::string& sValue)
\r
184 if (SVNProperties::IsBinary(sValue))
\r
186 m_bIsBinary = true;
\r
187 m_sPropValue.LoadString(IDS_EDITPROPS_BINVALUE);
\r
191 m_bIsBinary = false;
\r
192 m_sPropValue = MultibyteToWide(sValue.c_str()).c_str();
\r
196 void CEditPropertyValueDlg::OnBnClickedHelp()
\r
201 void CEditPropertyValueDlg::OnCancel()
\r
203 m_sPropName.Empty();
\r
204 CDialog::OnCancel();
\r
207 void CEditPropertyValueDlg::OnOK()
\r
212 m_PropValue = WideToMultibyte((LPCTSTR)m_sPropValue);
\r
214 m_PropNames.GetWindowText(m_sPropName);
\r
218 void CEditPropertyValueDlg::CheckRecursive()
\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
231 m_PropNames.GetLBText(idx, sName);
\r
232 if ((m_bFolder)||(m_bMultiple))
\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
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
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
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
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
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
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
319 BOOL CEditPropertyValueDlg::PreTranslateMessage(MSG* pMsg)
\r
321 if (pMsg->message == WM_KEYDOWN)
\r
323 switch (pMsg->wParam)
\r
327 if (GetAsyncKeyState(VK_CONTROL)&0x8000)
\r
329 if ( GetDlgItem(IDOK)->IsWindowEnabled() )
\r
331 PostMessage(WM_COMMAND, IDOK);
\r
341 m_tooltips.RelayEvent(pMsg);
\r
342 return __super::PreTranslateMessage(pMsg);
\r
345 void CEditPropertyValueDlg::OnBnClickedLoadprop()
\r
348 if (!CAppUtils::FileOpenSave(openPath, NULL, IDS_REPOBROWSE_OPEN, IDS_COMMONFILEFILTER, true, m_hWnd))
\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
356 DWORD size = GetFileSize(hFile, NULL);
\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
362 m_PropValue.assign(buf, size);
\r
366 // see if the loaded file contents are binary
\r
367 SetPropertyValue(m_PropValue);
\r
369 CloseHandle(hFile);
\r
374 void CEditPropertyValueDlg::OnEnChangePropvalue()
\r
378 sTemp.LoadString(IDS_EDITPROPS_BINVALUE);
\r
379 if ((m_bIsBinary)&&(m_sPropValue.CompareNoCase(sTemp)!=0))
\r
381 m_sPropValue.Empty();
\r
382 m_PropValue.clear();
\r
384 m_bIsBinary = false;
\r