1 // TortoiseMerge - a Diff/Patch program
\r
3 // Copyright (C) 2006-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 "TortoiseMerge.h"
\r
21 #include "BrowseFolder.h"
\r
22 #include ".\opendlg.h"
\r
27 IMPLEMENT_DYNAMIC(COpenDlg, CDialog)
\r
28 COpenDlg::COpenDlg(CWnd* pParent /*=NULL*/)
\r
29 : CDialog(COpenDlg::IDD, pParent)
\r
30 , m_sBaseFile(_T(""))
\r
31 , m_sTheirFile(_T(""))
\r
32 , m_sYourFile(_T(""))
\r
33 , m_sUnifiedDiffFile(_T(""))
\r
34 , m_sPatchDirectory(_T(""))
\r
35 , m_bFromClipboard(FALSE)
\r
37 , m_nextViewer(NULL)
\r
41 COpenDlg::~COpenDlg()
\r
45 void COpenDlg::DoDataExchange(CDataExchange* pDX)
\r
47 CDialog::DoDataExchange(pDX);
\r
48 DDX_Text(pDX, IDC_BASEFILEEDIT, m_sBaseFile);
\r
49 DDX_Text(pDX, IDC_THEIRFILEEDIT, m_sTheirFile);
\r
50 DDX_Text(pDX, IDC_YOURFILEEDIT, m_sYourFile);
\r
51 DDX_Text(pDX, IDC_DIFFFILEEDIT, m_sUnifiedDiffFile);
\r
52 DDX_Text(pDX, IDC_DIRECTORYEDIT, m_sPatchDirectory);
\r
53 DDX_Control(pDX, IDC_BASEFILEEDIT, m_cBaseFileEdit);
\r
54 DDX_Control(pDX, IDC_THEIRFILEEDIT, m_cTheirFileEdit);
\r
55 DDX_Control(pDX, IDC_YOURFILEEDIT, m_cYourFileEdit);
\r
56 DDX_Control(pDX, IDC_DIFFFILEEDIT, m_cDiffFileEdit);
\r
57 DDX_Control(pDX, IDC_DIRECTORYEDIT, m_cDirEdit);
\r
58 DDX_Check(pDX, IDC_PATCHFROMCLIPBOARD, m_bFromClipboard);
\r
61 BEGIN_MESSAGE_MAP(COpenDlg, CDialog)
\r
62 ON_BN_CLICKED(IDC_BASEFILEBROWSE, OnBnClickedBasefilebrowse)
\r
63 ON_BN_CLICKED(IDC_THEIRFILEBROWSE, OnBnClickedTheirfilebrowse)
\r
64 ON_BN_CLICKED(IDC_YOURFILEBROWSE, OnBnClickedYourfilebrowse)
\r
65 ON_BN_CLICKED(IDC_HELPBUTTON, OnBnClickedHelp)
\r
66 ON_BN_CLICKED(IDC_DIFFFILEBROWSE, OnBnClickedDifffilebrowse)
\r
67 ON_BN_CLICKED(IDC_DIRECTORYBROWSE, OnBnClickedDirectorybrowse)
\r
68 ON_BN_CLICKED(IDC_MERGERADIO, OnBnClickedMergeradio)
\r
69 ON_BN_CLICKED(IDC_APPLYRADIO, OnBnClickedApplyradio)
\r
70 ON_WM_CHANGECBCHAIN()
\r
71 ON_WM_DRAWCLIPBOARD()
\r
73 ON_BN_CLICKED(IDC_PATCHFROMCLIPBOARD, &COpenDlg::OnBnClickedPatchfromclipboard)
\r
76 BOOL COpenDlg::OnInitDialog()
\r
78 CDialog::OnInitDialog();
\r
80 GroupRadio(IDC_MERGERADIO);
\r
82 CheckRadioButton(IDC_MERGERADIO, IDC_APPLYRADIO, IDC_MERGERADIO);
\r
84 // turn on auto completion for the edit controls
\r
86 GetDlgItem(IDC_BASEFILEEDIT, &hwndEdit);
\r
88 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
\r
89 GetDlgItem(IDC_THEIRFILEEDIT, &hwndEdit);
\r
91 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
\r
92 GetDlgItem(IDC_YOURFILEEDIT, &hwndEdit);
\r
94 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
\r
95 GetDlgItem(IDC_DIFFFILEEDIT, &hwndEdit);
\r
97 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
\r
98 GetDlgItem(IDC_DIRECTORYEDIT, &hwndEdit);
\r
100 SHAutoComplete(hwndEdit, SHACF_AUTOSUGGEST_FORCE_ON | SHACF_AUTOAPPEND_FORCE_ON | SHACF_FILESYSTEM);
\r
102 m_cFormat = RegisterClipboardFormat(_T("TSVN_UNIFIEDDIFF"));
\r
103 m_nextViewer = SetClipboardViewer();
\r
105 return TRUE; // return TRUE unless you set the focus to a control
\r
106 // EXCEPTION: OCX Property Pages should return FALSE
\r
109 // COpenDlg message handlers
\r
111 void COpenDlg::OnBnClickedBasefilebrowse()
\r
115 temp.LoadString(IDS_SELECTFILE);
\r
116 BrowseForFile(m_sBaseFile, temp);
\r
120 void COpenDlg::OnBnClickedTheirfilebrowse()
\r
124 temp.LoadString(IDS_SELECTFILE);
\r
125 BrowseForFile(m_sTheirFile, temp);
\r
129 void COpenDlg::OnBnClickedYourfilebrowse()
\r
133 temp.LoadString(IDS_SELECTFILE);
\r
134 BrowseForFile(m_sYourFile, temp);
\r
138 void COpenDlg::OnBnClickedHelp()
\r
143 BOOL COpenDlg::BrowseForFile(CString& filepath, CString title, UINT nFileFilter)
\r
145 OPENFILENAME ofn = {0}; // common dialog box structure
\r
146 TCHAR szFile[MAX_PATH] = {0}; // buffer for file name
\r
147 if (!filepath.IsEmpty())
\r
149 _tcscpy_s(szFile, filepath);
\r
151 // Initialize OPENFILENAME
\r
152 ofn.lStructSize = sizeof(OPENFILENAME);
\r
153 ofn.hwndOwner = this->m_hWnd;
\r
154 ofn.lpstrFile = szFile;
\r
155 ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);
\r
157 sFilter.LoadString(nFileFilter);
\r
158 TCHAR * pszFilters = new TCHAR[sFilter.GetLength()+4];
\r
159 _tcscpy_s (pszFilters, sFilter.GetLength()+4, sFilter);
\r
160 // Replace '|' delimiters with '\0's
\r
161 TCHAR *ptr = pszFilters + _tcslen(pszFilters); //set ptr at the NULL
\r
162 while (ptr != pszFilters)
\r
168 ofn.lpstrFilter = pszFilters;
\r
169 ofn.nFilterIndex = 1;
\r
170 ofn.lpstrFileTitle = NULL;
\r
171 ofn.nMaxFileTitle = 0;
\r
172 ofn.lpstrInitialDir = NULL;
\r
173 ofn.lpstrTitle = title;
\r
174 ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
\r
176 // Display the Open dialog box.
\r
178 if (GetOpenFileName(&ofn)==TRUE)
\r
180 filepath = CString(ofn.lpstrFile);
\r
181 delete [] pszFilters;
\r
184 delete [] pszFilters;
\r
185 return FALSE; //user canceled the dialog
\r
188 void COpenDlg::OnBnClickedDifffilebrowse()
\r
192 temp.LoadString(IDS_SELECTFILE);
\r
193 BrowseForFile(m_sUnifiedDiffFile, temp, IDS_PATCHFILEFILTER);
\r
197 void COpenDlg::OnBnClickedDirectorybrowse()
\r
199 CBrowseFolder folderBrowser;
\r
201 folderBrowser.m_style = BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
\r
202 folderBrowser.Show(GetSafeHwnd(), m_sPatchDirectory, m_sPatchDirectory);
\r
206 void COpenDlg::OnBnClickedMergeradio()
\r
208 GroupRadio(IDC_MERGERADIO);
\r
211 void COpenDlg::OnBnClickedApplyradio()
\r
213 GroupRadio(IDC_APPLYRADIO);
\r
216 void COpenDlg::GroupRadio(UINT nID)
\r
218 BOOL bMerge = FALSE;
\r
219 BOOL bUnified = FALSE;
\r
220 if (nID == IDC_MERGERADIO)
\r
222 if (nID == IDC_APPLYRADIO)
\r
225 GetDlgItem(IDC_BASEFILEEDIT)->EnableWindow(bMerge);
\r
226 GetDlgItem(IDC_BASEFILEBROWSE)->EnableWindow(bMerge);
\r
227 GetDlgItem(IDC_THEIRFILEEDIT)->EnableWindow(bMerge);
\r
228 GetDlgItem(IDC_THEIRFILEBROWSE)->EnableWindow(bMerge);
\r
229 GetDlgItem(IDC_YOURFILEEDIT)->EnableWindow(bMerge);
\r
230 GetDlgItem(IDC_YOURFILEBROWSE)->EnableWindow(bMerge);
\r
232 GetDlgItem(IDC_DIFFFILEEDIT)->EnableWindow(bUnified);
\r
233 GetDlgItem(IDC_DIFFFILEBROWSE)->EnableWindow(bUnified);
\r
234 GetDlgItem(IDC_DIRECTORYEDIT)->EnableWindow(bUnified);
\r
235 GetDlgItem(IDC_DIRECTORYBROWSE)->EnableWindow(bUnified);
\r
237 CheckAndEnableClipboardChecker();
\r
240 void COpenDlg::OnOK()
\r
244 bool bUDiffOnClipboard = false;
\r
245 if (OpenClipboard())
\r
247 UINT enumFormat = 0;
\r
250 if (enumFormat == m_cFormat)
\r
252 bUDiffOnClipboard = true;
\r
254 } while((enumFormat = EnumClipboardFormats(enumFormat))!=0);
\r
258 if (GetDlgItem(IDC_BASEFILEEDIT)->IsWindowEnabled())
\r
260 m_sUnifiedDiffFile.Empty();
\r
261 m_sPatchDirectory.Empty();
\r
265 m_sBaseFile.Empty();
\r
266 m_sYourFile.Empty();
\r
267 m_sTheirFile.Empty();
\r
271 if (!m_sUnifiedDiffFile.IsEmpty())
\r
272 if (!PathFileExists(m_sUnifiedDiffFile))
\r
273 sFile = m_sUnifiedDiffFile;
\r
274 if (!m_sPatchDirectory.IsEmpty())
\r
275 if (!PathFileExists(m_sPatchDirectory))
\r
276 sFile = m_sPatchDirectory;
\r
277 if (!m_sBaseFile.IsEmpty())
\r
278 if (!PathFileExists(m_sBaseFile))
\r
279 sFile = m_sBaseFile;
\r
280 if (!m_sYourFile.IsEmpty())
\r
281 if (!PathFileExists(m_sYourFile))
\r
282 sFile = m_sYourFile;
\r
283 if (!m_sTheirFile.IsEmpty())
\r
284 if (!PathFileExists(m_sTheirFile))
\r
285 sFile = m_sTheirFile;
\r
287 if (bUDiffOnClipboard && m_bFromClipboard)
\r
289 if (OpenClipboard())
\r
291 HGLOBAL hglb = GetClipboardData(m_cFormat);
\r
292 LPCSTR lpstr = (LPCSTR)GlobalLock(hglb);
\r
294 DWORD len = GetTempPath(0, NULL);
\r
295 TCHAR * path = new TCHAR[len+1];
\r
296 TCHAR * tempF = new TCHAR[len+100];
\r
297 GetTempPath (len+1, path);
\r
298 GetTempFileName (path, TEXT("tsm"), 0, tempF);
\r
299 CString sTempFile = CString(tempF);
\r
304 size_t patchlen = strlen(lpstr);
\r
305 _tfopen_s(&outFile, sTempFile, _T("wb"));
\r
308 size_t size = fwrite(lpstr, sizeof(char), patchlen, outFile);
\r
309 if (size < patchlen)
\r
310 bUDiffOnClipboard = false;
\r
313 m_sUnifiedDiffFile = sTempFile;
\r
319 GlobalUnlock(hglb);
\r
325 if (!sFile.IsEmpty())
\r
328 sErr.Format(IDS_ERR_PATCH_INVALIDPATCHFILE, (LPCTSTR)sFile);
\r
329 MessageBox(sErr, NULL, MB_ICONERROR);
\r
335 void COpenDlg::OnChangeCbChain(HWND hWndRemove, HWND hWndAfter)
\r
337 CDialog::OnChangeCbChain(hWndRemove, hWndAfter);
\r
340 bool COpenDlg::CheckAndEnableClipboardChecker()
\r
342 int radio = GetCheckedRadioButton(IDC_MERGERADIO, IDC_APPLYRADIO);
\r
343 bool bUDiffOnClipboard = false;
\r
344 if (radio == IDC_APPLYRADIO)
\r
346 if (OpenClipboard())
\r
348 UINT enumFormat = 0;
\r
351 if (enumFormat == m_cFormat)
\r
353 bUDiffOnClipboard = true;
\r
355 } while((enumFormat = EnumClipboardFormats(enumFormat))!=0);
\r
360 DialogEnableWindow(IDC_PATCHFROMCLIPBOARD, bUDiffOnClipboard);
\r
361 return bUDiffOnClipboard;
\r
364 void COpenDlg::OnDrawClipboard()
\r
366 CheckAndEnableClipboardChecker();
\r
367 CDialog::OnDrawClipboard();
\r
370 void COpenDlg::OnDestroy()
\r
372 ChangeClipboardChain(m_nextViewer);
\r
373 CDialog::OnDestroy();
\r
376 BOOL COpenDlg::DialogEnableWindow(UINT nID, BOOL bEnable)
\r
378 CWnd * pwndDlgItem = GetDlgItem(nID);
\r
379 if (pwndDlgItem == NULL)
\r
382 return pwndDlgItem->EnableWindow(bEnable);
\r
383 if (GetFocus() == pwndDlgItem)
\r
385 SendMessage(WM_NEXTDLGCTL, 0, FALSE);
\r
387 return pwndDlgItem->EnableWindow(bEnable);
\r
390 void COpenDlg::OnBnClickedPatchfromclipboard()
\r
393 DialogEnableWindow(IDC_DIFFFILEEDIT, !m_bFromClipboard);
\r
394 DialogEnableWindow(IDC_DIFFFILEBROWSE, !m_bFromClipboard);
\r