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.
20 #include "TortoiseMerge.h"
21 #include "BrowseFolder.h"
22 #include ".\opendlg.h"
27 IMPLEMENT_DYNAMIC(COpenDlg
, CDialog
)
28 COpenDlg::COpenDlg(CWnd
* pParent
/*=NULL*/)
29 : CDialog(COpenDlg::IDD
, pParent
)
31 , m_sTheirFile(_T(""))
33 , m_sUnifiedDiffFile(_T(""))
34 , m_sPatchDirectory(_T(""))
35 , m_bFromClipboard(FALSE
)
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
)
73 ON_BN_CLICKED(IDC_PATCHFROMCLIPBOARD
, &COpenDlg::OnBnClickedPatchfromclipboard
)
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
86 GetDlgItem(IDC_BASEFILEEDIT
, &hwndEdit
);
88 SHAutoComplete(hwndEdit
, SHACF_AUTOSUGGEST_FORCE_ON
| SHACF_AUTOAPPEND_FORCE_ON
| SHACF_FILESYSTEM
);
89 GetDlgItem(IDC_THEIRFILEEDIT
, &hwndEdit
);
91 SHAutoComplete(hwndEdit
, SHACF_AUTOSUGGEST_FORCE_ON
| SHACF_AUTOAPPEND_FORCE_ON
| SHACF_FILESYSTEM
);
92 GetDlgItem(IDC_YOURFILEEDIT
, &hwndEdit
);
94 SHAutoComplete(hwndEdit
, SHACF_AUTOSUGGEST_FORCE_ON
| SHACF_AUTOAPPEND_FORCE_ON
| SHACF_FILESYSTEM
);
95 GetDlgItem(IDC_DIFFFILEEDIT
, &hwndEdit
);
97 SHAutoComplete(hwndEdit
, SHACF_AUTOSUGGEST_FORCE_ON
| SHACF_AUTOAPPEND_FORCE_ON
| SHACF_FILESYSTEM
);
98 GetDlgItem(IDC_DIRECTORYEDIT
, &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()
115 temp
.LoadString(IDS_SELECTFILE
);
116 BrowseForFile(m_sBaseFile
, temp
);
120 void COpenDlg::OnBnClickedTheirfilebrowse()
124 temp
.LoadString(IDS_SELECTFILE
);
125 BrowseForFile(m_sTheirFile
, temp
);
129 void COpenDlg::OnBnClickedYourfilebrowse()
133 temp
.LoadString(IDS_SELECTFILE
);
134 BrowseForFile(m_sYourFile
, temp
);
138 void COpenDlg::OnBnClickedHelp()
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
);
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
)
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
;
184 delete [] pszFilters
;
185 return FALSE
; //user canceled the dialog
188 void COpenDlg::OnBnClickedDifffilebrowse()
192 temp
.LoadString(IDS_SELECTFILE
);
193 BrowseForFile(m_sUnifiedDiffFile
, temp
, IDS_PATCHFILEFILTER
);
197 void COpenDlg::OnBnClickedDirectorybrowse()
199 CBrowseFolder folderBrowser
;
201 folderBrowser
.m_style
= BIF_EDITBOX
| BIF_NEWDIALOGSTYLE
| BIF_RETURNFSANCESTORS
| BIF_RETURNONLYFSDIRS
;
202 folderBrowser
.Show(GetSafeHwnd(), m_sPatchDirectory
, m_sPatchDirectory
);
206 void COpenDlg::OnBnClickedMergeradio()
208 GroupRadio(IDC_MERGERADIO
);
211 void COpenDlg::OnBnClickedApplyradio()
213 GroupRadio(IDC_APPLYRADIO
);
216 void COpenDlg::GroupRadio(UINT nID
)
219 BOOL bUnified
= FALSE
;
220 if (nID
== IDC_MERGERADIO
)
222 if (nID
== IDC_APPLYRADIO
)
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()
244 bool bUDiffOnClipboard
= false;
250 if (enumFormat
== m_cFormat
)
252 bUDiffOnClipboard
= true;
254 } while((enumFormat
= EnumClipboardFormats(enumFormat
))!=0);
258 if (GetDlgItem(IDC_BASEFILEEDIT
)->IsWindowEnabled())
260 m_sUnifiedDiffFile
.Empty();
261 m_sPatchDirectory
.Empty();
267 m_sTheirFile
.Empty();
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
))
280 if (!m_sYourFile
.IsEmpty())
281 if (!PathFileExists(m_sYourFile
))
283 if (!m_sTheirFile
.IsEmpty())
284 if (!PathFileExists(m_sTheirFile
))
285 sFile
= m_sTheirFile
;
287 if (bUDiffOnClipboard
&& m_bFromClipboard
)
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
);
304 size_t patchlen
= strlen(lpstr
);
305 _tfopen_s(&outFile
, sTempFile
, _T("wb"));
308 size_t size
= fwrite(lpstr
, sizeof(char), patchlen
, outFile
);
310 bUDiffOnClipboard
= false;
313 m_sUnifiedDiffFile
= sTempFile
;
325 if (!sFile
.IsEmpty())
328 sErr
.Format(IDS_ERR_PATCH_INVALIDPATCHFILE
, (LPCTSTR
)sFile
);
329 MessageBox(sErr
, NULL
, MB_ICONERROR
);
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
)
351 if (enumFormat
== m_cFormat
)
353 bUDiffOnClipboard
= true;
355 } while((enumFormat
= EnumClipboardFormats(enumFormat
))!=0);
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
)
382 return pwndDlgItem
->EnableWindow(bEnable
);
383 if (GetFocus() == pwndDlgItem
)
385 SendMessage(WM_NEXTDLGCTL
, 0, FALSE
);
387 return pwndDlgItem
->EnableWindow(bEnable
);
390 void COpenDlg::OnBnClickedPatchfromclipboard()
393 DialogEnableWindow(IDC_DIFFFILEEDIT
, !m_bFromClipboard
);
394 DialogEnableWindow(IDC_DIFFFILEBROWSE
, !m_bFromClipboard
);