Add Miss file
[TortoiseGit.git] / src / TortoiseMerge / OpenDlg.cpp
blob4a863f1809f70d5321ac73656b8ee0b5e63f9ff0
1 // TortoiseMerge - a Diff/Patch program
3 // Copyright (C) 2006-2008 - TortoiseSVN
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include "stdafx.h"
20 #include "TortoiseMerge.h"
21 #include "BrowseFolder.h"
22 #include ".\opendlg.h"
25 // COpenDlg dialog
27 IMPLEMENT_DYNAMIC(COpenDlg, CDialog)
28 COpenDlg::COpenDlg(CWnd* pParent /*=NULL*/)
29 : CDialog(COpenDlg::IDD, pParent)
30 , m_sBaseFile(_T(""))
31 , m_sTheirFile(_T(""))
32 , m_sYourFile(_T(""))
33 , m_sUnifiedDiffFile(_T(""))
34 , m_sPatchDirectory(_T(""))
35 , m_bFromClipboard(FALSE)
36 , m_cFormat(0)
37 , m_nextViewer(NULL)
41 COpenDlg::~COpenDlg()
45 void COpenDlg::DoDataExchange(CDataExchange* pDX)
47 CDialog::DoDataExchange(pDX);
48 DDX_Text(pDX, IDC_BASEFILEEDIT, m_sBaseFile);
49 DDX_Text(pDX, IDC_THEIRFILEEDIT, m_sTheirFile);
50 DDX_Text(pDX, IDC_YOURFILEEDIT, m_sYourFile);
51 DDX_Text(pDX, IDC_DIFFFILEEDIT, m_sUnifiedDiffFile);
52 DDX_Text(pDX, IDC_DIRECTORYEDIT, m_sPatchDirectory);
53 DDX_Control(pDX, IDC_BASEFILEEDIT, m_cBaseFileEdit);
54 DDX_Control(pDX, IDC_THEIRFILEEDIT, m_cTheirFileEdit);
55 DDX_Control(pDX, IDC_YOURFILEEDIT, m_cYourFileEdit);
56 DDX_Control(pDX, IDC_DIFFFILEEDIT, m_cDiffFileEdit);
57 DDX_Control(pDX, IDC_DIRECTORYEDIT, m_cDirEdit);
58 DDX_Check(pDX, IDC_PATCHFROMCLIPBOARD, m_bFromClipboard);
61 BEGIN_MESSAGE_MAP(COpenDlg, CDialog)
62 ON_BN_CLICKED(IDC_BASEFILEBROWSE, OnBnClickedBasefilebrowse)
63 ON_BN_CLICKED(IDC_THEIRFILEBROWSE, OnBnClickedTheirfilebrowse)
64 ON_BN_CLICKED(IDC_YOURFILEBROWSE, OnBnClickedYourfilebrowse)
65 ON_BN_CLICKED(IDC_HELPBUTTON, OnBnClickedHelp)
66 ON_BN_CLICKED(IDC_DIFFFILEBROWSE, OnBnClickedDifffilebrowse)
67 ON_BN_CLICKED(IDC_DIRECTORYBROWSE, OnBnClickedDirectorybrowse)
68 ON_BN_CLICKED(IDC_MERGERADIO, OnBnClickedMergeradio)
69 ON_BN_CLICKED(IDC_APPLYRADIO, OnBnClickedApplyradio)
70 ON_WM_CHANGECBCHAIN()
71 ON_WM_DRAWCLIPBOARD()
72 ON_WM_DESTROY()
73 ON_BN_CLICKED(IDC_PATCHFROMCLIPBOARD, &COpenDlg::OnBnClickedPatchfromclipboard)
74 END_MESSAGE_MAP()
76 BOOL COpenDlg::OnInitDialog()
78 CDialog::OnInitDialog();
80 GroupRadio(IDC_MERGERADIO);
82 CheckRadioButton(IDC_MERGERADIO, IDC_APPLYRADIO, IDC_MERGERADIO);
84 // turn on auto completion for the edit controls
85 HWND hwndEdit;
86 GetDlgItem(IDC_BASEFILEEDIT, &hwndEdit);
87 if (hwndEdit)
88 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
89 GetDlgItem(IDC_THEIRFILEEDIT, &hwndEdit);
90 if (hwndEdit)
91 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
92 GetDlgItem(IDC_YOURFILEEDIT, &hwndEdit);
93 if (hwndEdit)
94 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
95 GetDlgItem(IDC_DIFFFILEEDIT, &hwndEdit);
96 if (hwndEdit)
97 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
98 GetDlgItem(IDC_DIRECTORYEDIT, &hwndEdit);
99 if (hwndEdit)
100 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
102 m_cFormat = RegisterClipboardFormat(_T("TSVN_UNIFIEDDIFF"));
103 m_nextViewer = SetClipboardViewer();
105 return TRUE; // return TRUE unless you set the focus to a control
106 // EXCEPTION: OCX Property Pages should return FALSE
109 // COpenDlg message handlers
111 void COpenDlg::OnBnClickedBasefilebrowse()
113 CString temp;
114 UpdateData();
115 temp.LoadString(IDS_SELECTFILE);
116 BrowseForFile(m_sBaseFile, temp);
117 UpdateData(FALSE);
120 void COpenDlg::OnBnClickedTheirfilebrowse()
122 CString temp;
123 UpdateData();
124 temp.LoadString(IDS_SELECTFILE);
125 BrowseForFile(m_sTheirFile, temp);
126 UpdateData(FALSE);
129 void COpenDlg::OnBnClickedYourfilebrowse()
131 CString temp;
132 UpdateData();
133 temp.LoadString(IDS_SELECTFILE);
134 BrowseForFile(m_sYourFile, temp);
135 UpdateData(FALSE);
138 void COpenDlg::OnBnClickedHelp()
140 this->OnHelp();
143 BOOL COpenDlg::BrowseForFile(CString& filepath, CString title, UINT nFileFilter)
145 OPENFILENAME ofn = {0}; // common dialog box structure
146 TCHAR szFile[MAX_PATH] = {0}; // buffer for file name
147 if (!filepath.IsEmpty())
149 _tcscpy_s(szFile, filepath);
151 // Initialize OPENFILENAME
152 ofn.lStructSize = sizeof(OPENFILENAME);
153 ofn.hwndOwner = this->m_hWnd;
154 ofn.lpstrFile = szFile;
155 ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
156 CString sFilter;
157 sFilter.LoadString(nFileFilter);
158 TCHAR * pszFilters = new TCHAR[sFilter.GetLength()+4];
159 _tcscpy_s (pszFilters, sFilter.GetLength()+4, sFilter);
160 // Replace '|' delimiters with '\0's
161 TCHAR *ptr = pszFilters + _tcslen(pszFilters); //set ptr at the NULL
162 while (ptr != pszFilters)
164 if (*ptr == '|')
165 *ptr = '\0';
166 ptr--;
168 ofn.lpstrFilter = pszFilters;
169 ofn.nFilterIndex = 1;
170 ofn.lpstrFileTitle = NULL;
171 ofn.nMaxFileTitle = 0;
172 ofn.lpstrInitialDir = NULL;
173 ofn.lpstrTitle = title;
174 ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
176 // Display the Open dialog box.
178 if (GetOpenFileName(&ofn)==TRUE)
180 filepath = CString(ofn.lpstrFile);
181 delete [] pszFilters;
182 return TRUE;
184 delete [] pszFilters;
185 return FALSE; //user canceled the dialog
188 void COpenDlg::OnBnClickedDifffilebrowse()
190 CString temp;
191 UpdateData();
192 temp.LoadString(IDS_SELECTFILE);
193 BrowseForFile(m_sUnifiedDiffFile, temp, IDS_PATCHFILEFILTER);
194 UpdateData(FALSE);
197 void COpenDlg::OnBnClickedDirectorybrowse()
199 CBrowseFolder folderBrowser;
200 UpdateData();
201 folderBrowser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
202 folderBrowser.Show(GetSafeHwnd(), m_sPatchDirectory, m_sPatchDirectory);
203 UpdateData(FALSE);
206 void COpenDlg::OnBnClickedMergeradio()
208 GroupRadio(IDC_MERGERADIO);
211 void COpenDlg::OnBnClickedApplyradio()
213 GroupRadio(IDC_APPLYRADIO);
216 void COpenDlg::GroupRadio(UINT nID)
218 BOOL bMerge = FALSE;
219 BOOL bUnified = FALSE;
220 if (nID == IDC_MERGERADIO)
221 bMerge = TRUE;
222 if (nID == IDC_APPLYRADIO)
223 bUnified = TRUE;
225 GetDlgItem(IDC_BASEFILEEDIT)->EnableWindow(bMerge);
226 GetDlgItem(IDC_BASEFILEBROWSE)->EnableWindow(bMerge);
227 GetDlgItem(IDC_THEIRFILEEDIT)->EnableWindow(bMerge);
228 GetDlgItem(IDC_THEIRFILEBROWSE)->EnableWindow(bMerge);
229 GetDlgItem(IDC_YOURFILEEDIT)->EnableWindow(bMerge);
230 GetDlgItem(IDC_YOURFILEBROWSE)->EnableWindow(bMerge);
232 GetDlgItem(IDC_DIFFFILEEDIT)->EnableWindow(bUnified);
233 GetDlgItem(IDC_DIFFFILEBROWSE)->EnableWindow(bUnified);
234 GetDlgItem(IDC_DIRECTORYEDIT)->EnableWindow(bUnified);
235 GetDlgItem(IDC_DIRECTORYBROWSE)->EnableWindow(bUnified);
237 CheckAndEnableClipboardChecker();
240 void COpenDlg::OnOK()
242 UpdateData(TRUE);
244 bool bUDiffOnClipboard = false;
245 if (OpenClipboard())
247 UINT enumFormat = 0;
250 if (enumFormat == m_cFormat)
252 bUDiffOnClipboard = true;
254 } while((enumFormat = EnumClipboardFormats(enumFormat))!=0);
255 CloseClipboard();
258 if (GetDlgItem(IDC_BASEFILEEDIT)->IsWindowEnabled())
260 m_sUnifiedDiffFile.Empty();
261 m_sPatchDirectory.Empty();
263 else
265 m_sBaseFile.Empty();
266 m_sYourFile.Empty();
267 m_sTheirFile.Empty();
269 UpdateData(FALSE);
270 CString sFile;
271 if (!m_sUnifiedDiffFile.IsEmpty())
272 if (!PathFileExists(m_sUnifiedDiffFile))
273 sFile = m_sUnifiedDiffFile;
274 if (!m_sPatchDirectory.IsEmpty())
275 if (!PathFileExists(m_sPatchDirectory))
276 sFile = m_sPatchDirectory;
277 if (!m_sBaseFile.IsEmpty())
278 if (!PathFileExists(m_sBaseFile))
279 sFile = m_sBaseFile;
280 if (!m_sYourFile.IsEmpty())
281 if (!PathFileExists(m_sYourFile))
282 sFile = m_sYourFile;
283 if (!m_sTheirFile.IsEmpty())
284 if (!PathFileExists(m_sTheirFile))
285 sFile = m_sTheirFile;
287 if (bUDiffOnClipboard && m_bFromClipboard)
289 if (OpenClipboard())
291 HGLOBAL hglb = GetClipboardData(m_cFormat);
292 LPCSTR lpstr = (LPCSTR)GlobalLock(hglb);
294 DWORD len = GetTempPath(0, NULL);
295 TCHAR * path = new TCHAR[len+1];
296 TCHAR * tempF = new TCHAR[len+100];
297 GetTempPath (len+1, path);
298 GetTempFileName (path, TEXT("tsm"), 0, tempF);
299 CString sTempFile = CString(tempF);
300 delete [] path;
301 delete [] tempF;
303 FILE * outFile;
304 size_t patchlen = strlen(lpstr);
305 _tfopen_s(&outFile, sTempFile, _T("wb"));
306 if(outFile)
308 size_t size = fwrite(lpstr, sizeof(char), patchlen, outFile);
309 if (size < patchlen)
310 bUDiffOnClipboard = false;
311 else
313 m_sUnifiedDiffFile = sTempFile;
314 UpdateData(FALSE);
315 sFile.Empty();
317 fclose(outFile);
319 GlobalUnlock(hglb);
320 CloseClipboard();
325 if (!sFile.IsEmpty())
327 CString sErr;
328 sErr.Format(IDS_ERR_PATCH_INVALIDPATCHFILE, (LPCTSTR)sFile);
329 MessageBox(sErr, NULL, MB_ICONERROR);
330 return;
332 CDialog::OnOK();
335 void COpenDlg::OnChangeCbChain(HWND hWndRemove, HWND hWndAfter)
337 CDialog::OnChangeCbChain(hWndRemove, hWndAfter);
340 bool COpenDlg::CheckAndEnableClipboardChecker()
342 int radio = GetCheckedRadioButton(IDC_MERGERADIO, IDC_APPLYRADIO);
343 bool bUDiffOnClipboard = false;
344 if (radio == IDC_APPLYRADIO)
346 if (OpenClipboard())
348 UINT enumFormat = 0;
351 if (enumFormat == m_cFormat)
353 bUDiffOnClipboard = true;
355 } while((enumFormat = EnumClipboardFormats(enumFormat))!=0);
356 CloseClipboard();
360 DialogEnableWindow(IDC_PATCHFROMCLIPBOARD, bUDiffOnClipboard);
361 return bUDiffOnClipboard;
364 void COpenDlg::OnDrawClipboard()
366 CheckAndEnableClipboardChecker();
367 CDialog::OnDrawClipboard();
370 void COpenDlg::OnDestroy()
372 ChangeClipboardChain(m_nextViewer);
373 CDialog::OnDestroy();
376 BOOL COpenDlg::DialogEnableWindow(UINT nID, BOOL bEnable)
378 CWnd * pwndDlgItem = GetDlgItem(nID);
379 if (pwndDlgItem == NULL)
380 return FALSE;
381 if (bEnable)
382 return pwndDlgItem->EnableWindow(bEnable);
383 if (GetFocus() == pwndDlgItem)
385 SendMessage(WM_NEXTDLGCTL, 0, FALSE);
387 return pwndDlgItem->EnableWindow(bEnable);
390 void COpenDlg::OnBnClickedPatchfromclipboard()
392 UpdateData();
393 DialogEnableWindow(IDC_DIFFFILEEDIT, !m_bFromClipboard);
394 DialogEnableWindow(IDC_DIFFFILEBROWSE, !m_bFromClipboard);