xref: /AOO41X/main/fpicker/source/win32/filepicker/FileOpenDlg.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_fpicker.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir //------------------------------------------------------------------------
32*cdf0e10cSrcweir // includes
33*cdf0e10cSrcweir //------------------------------------------------------------------------
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir #include <tchar.h>
36*cdf0e10cSrcweir #include <osl/diagnose.h>
37*cdf0e10cSrcweir #include "../misc/WinImplHelper.hxx"
38*cdf0e10cSrcweir #include "FileOpenDlg.hxx"
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir //------------------------------------------------------------------------
41*cdf0e10cSrcweir // constants
42*cdf0e10cSrcweir //------------------------------------------------------------------------
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir namespace /* private */
45*cdf0e10cSrcweir {
46*cdf0e10cSrcweir     // we choose such large buffers because the size of
47*cdf0e10cSrcweir     // an single line edit field can be up to 32k; if
48*cdf0e10cSrcweir     // a user has a multi selection FilePicker and selects
49*cdf0e10cSrcweir     // a lot of files in a large directory we may reach this
50*cdf0e10cSrcweir     // limit and don't want to get out of memory;
51*cdf0e10cSrcweir     // another much more elegant way would be to subclass the
52*cdf0e10cSrcweir     // FileOpen dialog and overload the BM_CLICK event of the
53*cdf0e10cSrcweir     // OK button so that we determine the size of the text
54*cdf0e10cSrcweir     // currently in the edit field and resize our buffer
55*cdf0e10cSrcweir     // appropriately - in the future we will do this
56*cdf0e10cSrcweir     const size_t MAX_FILENAME_BUFF_SIZE  = 32000;
57*cdf0e10cSrcweir     const size_t MAX_FILETITLE_BUFF_SIZE = 32000;
58*cdf0e10cSrcweir     const size_t MAX_FILTER_BUFF_SIZE    = 4096;
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir     const LPTSTR CURRENT_INSTANCE = TEXT("CurrInst");
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir     //------------------------------------------
63*cdf0e10cSrcweir     // find an appropriate parent window
64*cdf0e10cSrcweir     //------------------------------------------
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir     inline bool is_current_process_window(HWND hwnd)
67*cdf0e10cSrcweir     {
68*cdf0e10cSrcweir         DWORD pid;
69*cdf0e10cSrcweir         GetWindowThreadProcessId(hwnd, &pid);
70*cdf0e10cSrcweir         return (pid == GetCurrentProcessId());
71*cdf0e10cSrcweir     }
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir     HWND choose_parent_window()
74*cdf0e10cSrcweir     {
75*cdf0e10cSrcweir         HWND hwnd_parent = GetForegroundWindow();
76*cdf0e10cSrcweir         if (!is_current_process_window(hwnd_parent))
77*cdf0e10cSrcweir             hwnd_parent = GetDesktopWindow();
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir         return hwnd_parent;
80*cdf0e10cSrcweir     }
81*cdf0e10cSrcweir };
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir //------------------------------------------------------------------------
84*cdf0e10cSrcweir //
85*cdf0e10cSrcweir //------------------------------------------------------------------------
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir CFileOpenDialog::CFileOpenDialog(
88*cdf0e10cSrcweir 	bool bFileOpenDialog,
89*cdf0e10cSrcweir 	sal_uInt32 dwFlags,
90*cdf0e10cSrcweir 	sal_uInt32 dwTemplateId,
91*cdf0e10cSrcweir 	HINSTANCE hInstance) :
92*cdf0e10cSrcweir 	m_hwndFileOpenDlg(0),
93*cdf0e10cSrcweir 	m_hwndFileOpenDlgChild(0),
94*cdf0e10cSrcweir 	m_bFileOpenDialog(bFileOpenDialog),
95*cdf0e10cSrcweir 	m_filterBuffer(MAX_FILTER_BUFF_SIZE),
96*cdf0e10cSrcweir 	m_fileTitleBuffer(MAX_FILETITLE_BUFF_SIZE),
97*cdf0e10cSrcweir 	m_helperBuffer(MAX_FILENAME_BUFF_SIZE),
98*cdf0e10cSrcweir 	m_fileNameBuffer(MAX_FILENAME_BUFF_SIZE),
99*cdf0e10cSrcweir 	m_pfnBaseDlgProc(0)
100*cdf0e10cSrcweir {
101*cdf0e10cSrcweir 	// initialize the OPENFILENAME struct
102*cdf0e10cSrcweir 	if (IsWindows2000Platform() || IsWindowsME())
103*cdf0e10cSrcweir 	{
104*cdf0e10cSrcweir 		ZeroMemory(&m_ofn, sizeof(m_ofn));
105*cdf0e10cSrcweir 		m_ofn.lStructSize = sizeof(m_ofn);
106*cdf0e10cSrcweir 	}
107*cdf0e10cSrcweir 	else // OSVER < Win2000
108*cdf0e10cSrcweir 	{
109*cdf0e10cSrcweir         // the size of the OPENFILENAME structure is different
110*cdf0e10cSrcweir         // under windows < win2000
111*cdf0e10cSrcweir 		ZeroMemory(&m_ofn, _OPENFILENAME_SIZE_VERSION_400);
112*cdf0e10cSrcweir 		m_ofn.lStructSize = _OPENFILENAME_SIZE_VERSION_400;
113*cdf0e10cSrcweir 	}
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir     // 0x02000000 for #97681, sfx will make the entry into
116*cdf0e10cSrcweir     // the recent document list
117*cdf0e10cSrcweir 	m_ofn.Flags |= dwFlags |
118*cdf0e10cSrcweir 				   OFN_EXPLORER |
119*cdf0e10cSrcweir 		           OFN_ENABLEHOOK |
120*cdf0e10cSrcweir 		           OFN_HIDEREADONLY |
121*cdf0e10cSrcweir 				   OFN_PATHMUSTEXIST |
122*cdf0e10cSrcweir 				   OFN_FILEMUSTEXIST |
123*cdf0e10cSrcweir                    OFN_OVERWRITEPROMPT |
124*cdf0e10cSrcweir 				   OFN_ENABLESIZING |
125*cdf0e10cSrcweir                    OFN_DONTADDTORECENT; // 0x02000000 -> OFN_DONTADDTORECENT only available with new platform sdk
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir     // it is a little hack but how else could
128*cdf0e10cSrcweir     // we get a parent window (using a vcl window?)
129*cdf0e10cSrcweir     m_ofn.hwndOwner = choose_parent_window();
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir 	m_ofn.lpstrFile = reinterpret_cast<LPTSTR>(const_cast<sal_Unicode*>(m_fileNameBuffer.getStr()));
132*cdf0e10cSrcweir 	m_ofn.nMaxFile  = m_fileNameBuffer.getCapacity();
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir 	m_ofn.lpstrFileTitle = reinterpret_cast<LPTSTR>(const_cast<sal_Unicode*>(m_fileTitleBuffer.getStr()));
135*cdf0e10cSrcweir 	m_ofn.nMaxFileTitle  = m_fileTitleBuffer.getCapacity();
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir 	m_ofn.lpfnHook = CFileOpenDialog::ofnHookProc;
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir 	// set a custom template
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir 	if (dwTemplateId)
142*cdf0e10cSrcweir 	{
143*cdf0e10cSrcweir 		OSL_ASSERT(hInstance);
144*cdf0e10cSrcweir 
145*cdf0e10cSrcweir 		m_ofn.Flags          |= OFN_ENABLETEMPLATE;
146*cdf0e10cSrcweir 		m_ofn.lpTemplateName  = MAKEINTRESOURCE(dwTemplateId);
147*cdf0e10cSrcweir 		m_ofn.hInstance       = hInstance;
148*cdf0e10cSrcweir 	}
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir 	// set a pointer to myself as ofn parameter
151*cdf0e10cSrcweir 	m_ofn.lCustData = reinterpret_cast<long>(this);
152*cdf0e10cSrcweir }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir //------------------------------------------------------------------------
155*cdf0e10cSrcweir //
156*cdf0e10cSrcweir //------------------------------------------------------------------------
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir CFileOpenDialog::~CFileOpenDialog()
159*cdf0e10cSrcweir {
160*cdf0e10cSrcweir }
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir //------------------------------------------------------------------------
163*cdf0e10cSrcweir //
164*cdf0e10cSrcweir //------------------------------------------------------------------------
165*cdf0e10cSrcweir 
166*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::setTitle(const rtl::OUString& aTitle)
167*cdf0e10cSrcweir {
168*cdf0e10cSrcweir 	m_dialogTitle = aTitle;
169*cdf0e10cSrcweir 	m_ofn.lpstrTitle = reinterpret_cast<LPCTSTR>(m_dialogTitle.getStr());
170*cdf0e10cSrcweir }
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir //------------------------------------------------------------------------
173*cdf0e10cSrcweir //
174*cdf0e10cSrcweir //------------------------------------------------------------------------
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir void CFileOpenDialog::setFilter(const rtl::OUString& aFilter)
177*cdf0e10cSrcweir {
178*cdf0e10cSrcweir     // Format is like
179*cdf0e10cSrcweir     // "*.TXT" or multiple separate by ';' like "*.TXT;*.DOC;*.SXW"
180*cdf0e10cSrcweir     // Do not include spaces in the pattern string
181*cdf0e10cSrcweir 	m_filterBuffer.ensureCapacity(aFilter.getLength());
182*cdf0e10cSrcweir 	m_filterBuffer.setLength(0);
183*cdf0e10cSrcweir 	m_filterBuffer.append(aFilter);
184*cdf0e10cSrcweir 	m_ofn.lpstrFilter = reinterpret_cast<LPCTSTR>(m_filterBuffer.getStr());
185*cdf0e10cSrcweir }
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir //------------------------------------------------------------------------
188*cdf0e10cSrcweir //
189*cdf0e10cSrcweir //------------------------------------------------------------------------
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir bool CFileOpenDialog::setFilterIndex(sal_uInt32 aIndex)
192*cdf0e10cSrcweir {
193*cdf0e10cSrcweir 	OSL_ASSERT(aIndex > 0);
194*cdf0e10cSrcweir 	m_ofn.nFilterIndex = aIndex;
195*cdf0e10cSrcweir 	return sal_True;
196*cdf0e10cSrcweir }
197*cdf0e10cSrcweir 
198*cdf0e10cSrcweir //------------------------------------------------------------------------
199*cdf0e10cSrcweir //
200*cdf0e10cSrcweir //------------------------------------------------------------------------
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir sal_uInt32 CFileOpenDialog::getSelectedFilterIndex() const
203*cdf0e10cSrcweir {
204*cdf0e10cSrcweir 	return m_ofn.nFilterIndex;
205*cdf0e10cSrcweir }
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir //------------------------------------------------------------------------
208*cdf0e10cSrcweir //
209*cdf0e10cSrcweir //------------------------------------------------------------------------
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::setDefaultName(const rtl::OUString& aName)
212*cdf0e10cSrcweir {
213*cdf0e10cSrcweir 	m_fileNameBuffer.setLength(0);
214*cdf0e10cSrcweir 	m_fileNameBuffer.append(aName);
215*cdf0e10cSrcweir 	m_ofn.lpstrFile = reinterpret_cast<LPTSTR>(const_cast<sal_Unicode*>(m_fileNameBuffer.getStr()));
216*cdf0e10cSrcweir }
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir //------------------------------------------------------------------------
219*cdf0e10cSrcweir //
220*cdf0e10cSrcweir //------------------------------------------------------------------------
221*cdf0e10cSrcweir 
222*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::setDisplayDirectory(const rtl::OUString& aDirectory)
223*cdf0e10cSrcweir {
224*cdf0e10cSrcweir 	m_displayDirectory = aDirectory;
225*cdf0e10cSrcweir 	m_ofn.lpstrInitialDir = reinterpret_cast<LPCTSTR>(m_displayDirectory.getStr());
226*cdf0e10cSrcweir }
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir //------------------------------------------------------------------------
229*cdf0e10cSrcweir //
230*cdf0e10cSrcweir //------------------------------------------------------------------------
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir rtl::OUString SAL_CALL CFileOpenDialog::getLastDisplayDirectory() const
233*cdf0e10cSrcweir {
234*cdf0e10cSrcweir 	return m_displayDirectory;
235*cdf0e10cSrcweir }
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir //------------------------------------------------------------------------
238*cdf0e10cSrcweir //
239*cdf0e10cSrcweir //------------------------------------------------------------------------
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir rtl::OUString SAL_CALL CFileOpenDialog::getFullFileName() const
242*cdf0e10cSrcweir {
243*cdf0e10cSrcweir 	return rtl::OUString(m_fileNameBuffer.getStr(),
244*cdf0e10cSrcweir 		_wcslenex(m_fileNameBuffer.getStr()));
245*cdf0e10cSrcweir }
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir //------------------------------------------------------------------------
248*cdf0e10cSrcweir //
249*cdf0e10cSrcweir //------------------------------------------------------------------------
250*cdf0e10cSrcweir 
251*cdf0e10cSrcweir rtl::OUString SAL_CALL CFileOpenDialog::getFileName() const
252*cdf0e10cSrcweir {
253*cdf0e10cSrcweir 	return rtl::OUString(m_fileTitleBuffer);
254*cdf0e10cSrcweir }
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir //------------------------------------------------------------------------
257*cdf0e10cSrcweir //
258*cdf0e10cSrcweir //------------------------------------------------------------------------
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir rtl::OUString CFileOpenDialog::getFileExtension()
261*cdf0e10cSrcweir {
262*cdf0e10cSrcweir 	if (m_ofn.nFileExtension)
263*cdf0e10cSrcweir 		return rtl::OUString(m_fileNameBuffer.getStr() + m_ofn.nFileExtension,
264*cdf0e10cSrcweir 			rtl_ustr_getLength(m_fileNameBuffer.getStr() + m_ofn.nFileExtension));
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir 	return rtl::OUString();
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir //------------------------------------------------------------------------
270*cdf0e10cSrcweir //
271*cdf0e10cSrcweir //------------------------------------------------------------------------
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir void CFileOpenDialog::setDefaultFileExtension(const rtl::OUString& aExtension)
274*cdf0e10cSrcweir {
275*cdf0e10cSrcweir 	m_defaultExtension = aExtension;
276*cdf0e10cSrcweir 	m_ofn.lpstrDefExt  = reinterpret_cast<LPCTSTR>(m_defaultExtension.getStr());
277*cdf0e10cSrcweir }
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir //------------------------------------------------------------------------
280*cdf0e10cSrcweir //
281*cdf0e10cSrcweir //------------------------------------------------------------------------
282*cdf0e10cSrcweir 
283*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::setMultiSelectionMode(bool bMode)
284*cdf0e10cSrcweir {
285*cdf0e10cSrcweir 	if (bMode)
286*cdf0e10cSrcweir 		m_ofn.Flags |= OFN_ALLOWMULTISELECT;
287*cdf0e10cSrcweir 	else
288*cdf0e10cSrcweir 		m_ofn.Flags &= ~OFN_ALLOWMULTISELECT;
289*cdf0e10cSrcweir }
290*cdf0e10cSrcweir 
291*cdf0e10cSrcweir //------------------------------------------------------------------------
292*cdf0e10cSrcweir //
293*cdf0e10cSrcweir //------------------------------------------------------------------------
294*cdf0e10cSrcweir 
295*cdf0e10cSrcweir bool SAL_CALL CFileOpenDialog::getMultiSelectionMode() const
296*cdf0e10cSrcweir {
297*cdf0e10cSrcweir 	return ((m_ofn.Flags & OFN_ALLOWMULTISELECT) > 0);
298*cdf0e10cSrcweir }
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir //------------------------------------------------------------------------
301*cdf0e10cSrcweir //
302*cdf0e10cSrcweir //------------------------------------------------------------------------
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir sal_Int16 SAL_CALL CFileOpenDialog::doModal()
305*cdf0e10cSrcweir {
306*cdf0e10cSrcweir 	sal_Int16 nRC = -1;
307*cdf0e10cSrcweir 
308*cdf0e10cSrcweir 	// pre-processing
309*cdf0e10cSrcweir 	if (preModal())
310*cdf0e10cSrcweir 	{
311*cdf0e10cSrcweir 		bool bRet;
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir         if (m_bFileOpenDialog)
314*cdf0e10cSrcweir 	        bRet = m_GetFileNameWrapper.getOpenFileName(
315*cdf0e10cSrcweir 				reinterpret_cast<LPOPENFILENAME>(&m_ofn));
316*cdf0e10cSrcweir         else
317*cdf0e10cSrcweir             bRet = m_GetFileNameWrapper.getSaveFileName(
318*cdf0e10cSrcweir 				reinterpret_cast<LPOPENFILENAME>(&m_ofn));
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir 	    nRC = 1;
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir 		if (!bRet)
323*cdf0e10cSrcweir 			nRC = (0 == m_GetFileNameWrapper.commDlgExtendedError()) ? 0 : -1;
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir 		// post-processing
326*cdf0e10cSrcweir 		postModal(nRC);
327*cdf0e10cSrcweir 	}
328*cdf0e10cSrcweir 
329*cdf0e10cSrcweir 	return nRC;
330*cdf0e10cSrcweir }
331*cdf0e10cSrcweir 
332*cdf0e10cSrcweir //------------------------------------------------------------------------
333*cdf0e10cSrcweir //
334*cdf0e10cSrcweir //------------------------------------------------------------------------
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir sal_uInt32 SAL_CALL CFileOpenDialog::getLastDialogError() const
337*cdf0e10cSrcweir {
338*cdf0e10cSrcweir 	return CommDlgExtendedError();
339*cdf0e10cSrcweir }
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir //------------------------------------------------------------------------
342*cdf0e10cSrcweir //
343*cdf0e10cSrcweir //------------------------------------------------------------------------
344*cdf0e10cSrcweir 
345*cdf0e10cSrcweir bool SAL_CALL CFileOpenDialog::preModal()
346*cdf0e10cSrcweir {
347*cdf0e10cSrcweir 	return sal_True;
348*cdf0e10cSrcweir }
349*cdf0e10cSrcweir 
350*cdf0e10cSrcweir //------------------------------------------------------------------------
351*cdf0e10cSrcweir //
352*cdf0e10cSrcweir //------------------------------------------------------------------------
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::postModal(sal_Int16 nDialogResult)
355*cdf0e10cSrcweir {
356*cdf0e10cSrcweir 	OSL_ASSERT((-1 <= nDialogResult) && (nDialogResult <= 1));
357*cdf0e10cSrcweir 
358*cdf0e10cSrcweir 	if (1 == nDialogResult)
359*cdf0e10cSrcweir 	{
360*cdf0e10cSrcweir 		// Attention: assuming that nFileOffset is always greater 0 because under
361*cdf0e10cSrcweir 		// Windows there is always a drive letter or a server in a complete path
362*cdf0e10cSrcweir 		// the OPENFILENAME docu never says that nFileOffset can be 0
363*cdf0e10cSrcweir 		m_displayDirectory = rtl::OUString(reinterpret_cast<const sal_Unicode*>(m_ofn.lpstrFile),m_ofn.nFileOffset);
364*cdf0e10cSrcweir 	}
365*cdf0e10cSrcweir }
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir //------------------------------------------------------------------------
368*cdf0e10cSrcweir //
369*cdf0e10cSrcweir //------------------------------------------------------------------------
370*cdf0e10cSrcweir 
371*cdf0e10cSrcweir rtl::OUString SAL_CALL CFileOpenDialog::getCurrentFilePath() const
372*cdf0e10cSrcweir {
373*cdf0e10cSrcweir 	OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
374*cdf0e10cSrcweir 
375*cdf0e10cSrcweir 	LPARAM nLen = SendMessage(
376*cdf0e10cSrcweir 		m_hwndFileOpenDlg,
377*cdf0e10cSrcweir 		CDM_GETFILEPATH,
378*cdf0e10cSrcweir 		m_helperBuffer.getCapacity(),
379*cdf0e10cSrcweir 		reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
380*cdf0e10cSrcweir 
381*cdf0e10cSrcweir 	if (nLen > 0)
382*cdf0e10cSrcweir 	{
383*cdf0e10cSrcweir 		m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
384*cdf0e10cSrcweir 		return rtl::OUString(m_helperBuffer);
385*cdf0e10cSrcweir 	}
386*cdf0e10cSrcweir 	return rtl::OUString();
387*cdf0e10cSrcweir }
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir //------------------------------------------------------------------------
390*cdf0e10cSrcweir //
391*cdf0e10cSrcweir //------------------------------------------------------------------------
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir rtl::OUString SAL_CALL CFileOpenDialog::getCurrentFolderPath() const
394*cdf0e10cSrcweir {
395*cdf0e10cSrcweir 	OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir 	LPARAM nLen = SendMessage(
398*cdf0e10cSrcweir 		m_hwndFileOpenDlg,
399*cdf0e10cSrcweir 		CDM_GETFOLDERPATH,
400*cdf0e10cSrcweir 		m_helperBuffer.getCapacity(),
401*cdf0e10cSrcweir 		reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir 	if (nLen > 0)
404*cdf0e10cSrcweir 	{
405*cdf0e10cSrcweir 		m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
406*cdf0e10cSrcweir 		return rtl::OUString(m_helperBuffer);
407*cdf0e10cSrcweir 	}
408*cdf0e10cSrcweir 	return rtl::OUString();
409*cdf0e10cSrcweir }
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir //------------------------------------------------------------------------
412*cdf0e10cSrcweir //
413*cdf0e10cSrcweir //------------------------------------------------------------------------
414*cdf0e10cSrcweir 
415*cdf0e10cSrcweir rtl::OUString SAL_CALL CFileOpenDialog::getCurrentFileName() const
416*cdf0e10cSrcweir {
417*cdf0e10cSrcweir 	OSL_ASSERT(IsWindow(m_hwndFileOpenDlg));
418*cdf0e10cSrcweir 
419*cdf0e10cSrcweir 	LPARAM nLen = SendMessage(
420*cdf0e10cSrcweir 		m_hwndFileOpenDlg,
421*cdf0e10cSrcweir 		CDM_GETSPEC,
422*cdf0e10cSrcweir 		m_helperBuffer.getCapacity(),
423*cdf0e10cSrcweir 		reinterpret_cast<LPARAM>(m_helperBuffer.getStr()));
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir 	if (nLen > 0)
426*cdf0e10cSrcweir 	{
427*cdf0e10cSrcweir 		m_helperBuffer.setLength((nLen * sizeof(sal_Unicode)) - 1);
428*cdf0e10cSrcweir 		return rtl::OUString(m_helperBuffer);
429*cdf0e10cSrcweir 	}
430*cdf0e10cSrcweir 	return rtl::OUString();
431*cdf0e10cSrcweir }
432*cdf0e10cSrcweir 
433*cdf0e10cSrcweir //------------------------------------------------------------------------
434*cdf0e10cSrcweir //
435*cdf0e10cSrcweir //------------------------------------------------------------------------
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir sal_uInt32 SAL_CALL CFileOpenDialog::onShareViolation(const rtl::OUString&)
438*cdf0e10cSrcweir {
439*cdf0e10cSrcweir 	return 0;
440*cdf0e10cSrcweir }
441*cdf0e10cSrcweir 
442*cdf0e10cSrcweir //------------------------------------------------------------------------
443*cdf0e10cSrcweir //
444*cdf0e10cSrcweir //------------------------------------------------------------------------
445*cdf0e10cSrcweir 
446*cdf0e10cSrcweir sal_uInt32 SAL_CALL CFileOpenDialog::onFileOk()
447*cdf0e10cSrcweir {
448*cdf0e10cSrcweir 	return 0;
449*cdf0e10cSrcweir }
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir //------------------------------------------------------------------------
452*cdf0e10cSrcweir //
453*cdf0e10cSrcweir //------------------------------------------------------------------------
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::onSelChanged(HWND)
456*cdf0e10cSrcweir {
457*cdf0e10cSrcweir }
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir //------------------------------------------------------------------------
460*cdf0e10cSrcweir //
461*cdf0e10cSrcweir //------------------------------------------------------------------------
462*cdf0e10cSrcweir 
463*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::onHelp()
464*cdf0e10cSrcweir {
465*cdf0e10cSrcweir }
466*cdf0e10cSrcweir 
467*cdf0e10cSrcweir //------------------------------------------------------------------------
468*cdf0e10cSrcweir //
469*cdf0e10cSrcweir //------------------------------------------------------------------------
470*cdf0e10cSrcweir 
471*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::onInitDone()
472*cdf0e10cSrcweir {
473*cdf0e10cSrcweir     centerPositionToParent();
474*cdf0e10cSrcweir }
475*cdf0e10cSrcweir 
476*cdf0e10cSrcweir //------------------------------------------------------------------------
477*cdf0e10cSrcweir //
478*cdf0e10cSrcweir //------------------------------------------------------------------------
479*cdf0e10cSrcweir 
480*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::onFolderChanged()
481*cdf0e10cSrcweir {
482*cdf0e10cSrcweir }
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir //------------------------------------------------------------------------
485*cdf0e10cSrcweir //
486*cdf0e10cSrcweir //------------------------------------------------------------------------
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::onTypeChanged(sal_uInt32)
489*cdf0e10cSrcweir {
490*cdf0e10cSrcweir }
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir //------------------------------------------------------------------------
493*cdf0e10cSrcweir //
494*cdf0e10cSrcweir //------------------------------------------------------------------------
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir sal_uInt32 SAL_CALL CFileOpenDialog::onCtrlCommand(HWND, sal_uInt16, sal_uInt16)
497*cdf0e10cSrcweir {
498*cdf0e10cSrcweir 	return 0;
499*cdf0e10cSrcweir }
500*cdf0e10cSrcweir 
501*cdf0e10cSrcweir //------------------------------------------------------------------------
502*cdf0e10cSrcweir //
503*cdf0e10cSrcweir //------------------------------------------------------------------------
504*cdf0e10cSrcweir 
505*cdf0e10cSrcweir sal_uInt32 SAL_CALL CFileOpenDialog::onWMNotify( HWND, LPOFNOTIFY lpOfNotify )
506*cdf0e10cSrcweir {
507*cdf0e10cSrcweir 	switch(lpOfNotify->hdr.code)
508*cdf0e10cSrcweir 	{
509*cdf0e10cSrcweir 	case CDN_SHAREVIOLATION:
510*cdf0e10cSrcweir 		return onShareViolation(reinterpret_cast<const sal_Unicode*>(lpOfNotify->pszFile));
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir 	case CDN_FILEOK:
513*cdf0e10cSrcweir 		return onFileOk();
514*cdf0e10cSrcweir 
515*cdf0e10cSrcweir 	case CDN_SELCHANGE:
516*cdf0e10cSrcweir 		onSelChanged(lpOfNotify->hdr.hwndFrom);
517*cdf0e10cSrcweir 		break;
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir 	case CDN_HELP:
520*cdf0e10cSrcweir 		onHelp();
521*cdf0e10cSrcweir 		break;
522*cdf0e10cSrcweir 
523*cdf0e10cSrcweir 	case CDN_INITDONE:
524*cdf0e10cSrcweir 		onInitDone();
525*cdf0e10cSrcweir 		break;
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir 	case CDN_FOLDERCHANGE:
528*cdf0e10cSrcweir 		onFolderChanged();
529*cdf0e10cSrcweir 		break;
530*cdf0e10cSrcweir 
531*cdf0e10cSrcweir 	case CDN_TYPECHANGE:
532*cdf0e10cSrcweir         m_ofn.nFilterIndex = lpOfNotify->lpOFN->nFilterIndex;
533*cdf0e10cSrcweir 		onTypeChanged(lpOfNotify->lpOFN->nFilterIndex);
534*cdf0e10cSrcweir 		break;
535*cdf0e10cSrcweir 	}
536*cdf0e10cSrcweir 
537*cdf0e10cSrcweir 	return 0;
538*cdf0e10cSrcweir }
539*cdf0e10cSrcweir 
540*cdf0e10cSrcweir //------------------------------------------------------------------------
541*cdf0e10cSrcweir //
542*cdf0e10cSrcweir //------------------------------------------------------------------------
543*cdf0e10cSrcweir 
544*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::handleInitDialog(HWND hwndDlg, HWND hwndChild)
545*cdf0e10cSrcweir {
546*cdf0e10cSrcweir 	m_hwndFileOpenDlg      = hwndDlg;
547*cdf0e10cSrcweir 	m_hwndFileOpenDlgChild = hwndChild;
548*cdf0e10cSrcweir 
549*cdf0e10cSrcweir 	OSL_ASSERT(GetParent(hwndChild) == hwndDlg);
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir 	// calling virtual function which the
552*cdf0e10cSrcweir 	// client can overload
553*cdf0e10cSrcweir 	onInitDialog(hwndDlg);
554*cdf0e10cSrcweir }
555*cdf0e10cSrcweir 
556*cdf0e10cSrcweir //------------------------------------------------------------------------
557*cdf0e10cSrcweir //
558*cdf0e10cSrcweir //------------------------------------------------------------------------
559*cdf0e10cSrcweir 
560*cdf0e10cSrcweir unsigned int CALLBACK CFileOpenDialog::ofnHookProc(
561*cdf0e10cSrcweir 	HWND hChildDlg, unsigned int uiMsg, WPARAM wParam, LPARAM lParam)
562*cdf0e10cSrcweir {
563*cdf0e10cSrcweir     HWND hwndDlg = GetParent(hChildDlg);
564*cdf0e10cSrcweir     CFileOpenDialog* pImpl = NULL;
565*cdf0e10cSrcweir 
566*cdf0e10cSrcweir 	switch( uiMsg )
567*cdf0e10cSrcweir 	{
568*cdf0e10cSrcweir 	case WM_INITDIALOG:
569*cdf0e10cSrcweir         {
570*cdf0e10cSrcweir             _LPOPENFILENAME lpofn = reinterpret_cast<_LPOPENFILENAME>(lParam);
571*cdf0e10cSrcweir             pImpl = reinterpret_cast<CFileOpenDialog*>(lpofn->lCustData);
572*cdf0e10cSrcweir             OSL_ASSERT(pImpl);
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir             // subclass the base dialog for WM_NCDESTROY processing
575*cdf0e10cSrcweir             pImpl->m_pfnBaseDlgProc =
576*cdf0e10cSrcweir 		        reinterpret_cast<WNDPROC>(
577*cdf0e10cSrcweir 			        SetWindowLong(
578*cdf0e10cSrcweir 			            hwndDlg,
579*cdf0e10cSrcweir 			            GWL_WNDPROC,
580*cdf0e10cSrcweir                         reinterpret_cast<LONG>(CFileOpenDialog::BaseDlgProc)));
581*cdf0e10cSrcweir             // connect the instance handle to the window
582*cdf0e10cSrcweir             SetProp(hwndDlg, CURRENT_INSTANCE, pImpl);
583*cdf0e10cSrcweir 		    pImpl->handleInitDialog(hwndDlg, hChildDlg);
584*cdf0e10cSrcweir         }
585*cdf0e10cSrcweir 		return 0;
586*cdf0e10cSrcweir 
587*cdf0e10cSrcweir 	case WM_NOTIFY:
588*cdf0e10cSrcweir         {
589*cdf0e10cSrcweir             pImpl = getCurrentInstance(hwndDlg);
590*cdf0e10cSrcweir 		    return pImpl->onWMNotify(
591*cdf0e10cSrcweir 			    hChildDlg, reinterpret_cast<LPOFNOTIFY>(lParam));
592*cdf0e10cSrcweir         }
593*cdf0e10cSrcweir 
594*cdf0e10cSrcweir 	case WM_COMMAND:
595*cdf0e10cSrcweir         {
596*cdf0e10cSrcweir             pImpl = getCurrentInstance(hwndDlg);
597*cdf0e10cSrcweir             OSL_ASSERT(pImpl);
598*cdf0e10cSrcweir 
599*cdf0e10cSrcweir 		    return pImpl->onCtrlCommand(
600*cdf0e10cSrcweir 			    hChildDlg, LOWORD(wParam), HIWORD(lParam));
601*cdf0e10cSrcweir         }
602*cdf0e10cSrcweir 	}
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir 	return 0;
605*cdf0e10cSrcweir }
606*cdf0e10cSrcweir 
607*cdf0e10cSrcweir //------------------------------------------------------------------------
608*cdf0e10cSrcweir //
609*cdf0e10cSrcweir //------------------------------------------------------------------------
610*cdf0e10cSrcweir 
611*cdf0e10cSrcweir LRESULT CALLBACK CFileOpenDialog::BaseDlgProc(
612*cdf0e10cSrcweir     HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam)
613*cdf0e10cSrcweir {
614*cdf0e10cSrcweir 	CFileOpenDialog* pImpl = 0;
615*cdf0e10cSrcweir 
616*cdf0e10cSrcweir 	if (WM_NCDESTROY == wMessage)
617*cdf0e10cSrcweir 	{
618*cdf0e10cSrcweir 		pImpl = reinterpret_cast<CFileOpenDialog*>(
619*cdf0e10cSrcweir 			RemoveProp(hWnd,CURRENT_INSTANCE));
620*cdf0e10cSrcweir 
621*cdf0e10cSrcweir 		SetWindowLong(hWnd, GWL_WNDPROC,
622*cdf0e10cSrcweir 			reinterpret_cast<LONG>(pImpl->m_pfnBaseDlgProc));
623*cdf0e10cSrcweir 	}
624*cdf0e10cSrcweir 	else
625*cdf0e10cSrcweir 	{
626*cdf0e10cSrcweir 		pImpl = getCurrentInstance(hWnd);
627*cdf0e10cSrcweir 	}
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir 	OSL_ASSERT(pImpl);
630*cdf0e10cSrcweir 
631*cdf0e10cSrcweir 	return CallWindowProc(
632*cdf0e10cSrcweir 		reinterpret_cast<WNDPROC>(pImpl->m_pfnBaseDlgProc),
633*cdf0e10cSrcweir 		hWnd,wMessage,wParam,lParam);
634*cdf0e10cSrcweir }
635*cdf0e10cSrcweir 
636*cdf0e10cSrcweir //------------------------------------------------------------------------
637*cdf0e10cSrcweir //
638*cdf0e10cSrcweir //------------------------------------------------------------------------
639*cdf0e10cSrcweir 
640*cdf0e10cSrcweir CFileOpenDialog* SAL_CALL CFileOpenDialog::getCurrentInstance(HWND hwnd)
641*cdf0e10cSrcweir {
642*cdf0e10cSrcweir     OSL_ASSERT(IsWindow( hwnd));
643*cdf0e10cSrcweir     return reinterpret_cast<CFileOpenDialog*>(
644*cdf0e10cSrcweir         GetProp(hwnd, CURRENT_INSTANCE));
645*cdf0e10cSrcweir }
646*cdf0e10cSrcweir 
647*cdf0e10cSrcweir //------------------------------------------------------------------------
648*cdf0e10cSrcweir //
649*cdf0e10cSrcweir //------------------------------------------------------------------------
650*cdf0e10cSrcweir 
651*cdf0e10cSrcweir void SAL_CALL CFileOpenDialog::centerPositionToParent() const
652*cdf0e10cSrcweir {
653*cdf0e10cSrcweir     OSL_PRECOND(IsWindow(m_hwndFileOpenDlg), "no dialog window, call method only after or in onInitDone");
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir     HWND hwndParent = m_ofn.hwndOwner;
656*cdf0e10cSrcweir 
657*cdf0e10cSrcweir     if (!IsWindow(hwndParent))
658*cdf0e10cSrcweir         hwndParent = GetDesktopWindow();
659*cdf0e10cSrcweir 
660*cdf0e10cSrcweir     OSL_ASSERT(IsWindow(hwndParent));
661*cdf0e10cSrcweir 
662*cdf0e10cSrcweir     RECT rcPar;
663*cdf0e10cSrcweir     GetWindowRect(hwndParent, &rcPar);
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir     RECT rcDlg;
666*cdf0e10cSrcweir     GetWindowRect(m_hwndFileOpenDlg, &rcDlg);
667*cdf0e10cSrcweir 
668*cdf0e10cSrcweir     int lDlgW = rcDlg.right  - rcDlg.left;
669*cdf0e10cSrcweir     int lDlgH = rcDlg.bottom - rcDlg.top;
670*cdf0e10cSrcweir 
671*cdf0e10cSrcweir 	int x = (rcPar.left + rcPar.right  - lDlgW) / 2;
672*cdf0e10cSrcweir 	int y = (rcPar.top  + rcPar.bottom - lDlgH) / 2;
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir 	HDC hdc = GetDC(m_hwndFileOpenDlg);
675*cdf0e10cSrcweir 
676*cdf0e10cSrcweir     int hResol = GetDeviceCaps(hdc, HORZRES);
677*cdf0e10cSrcweir     int vResol = GetDeviceCaps(hdc, VERTRES);
678*cdf0e10cSrcweir 
679*cdf0e10cSrcweir 	ReleaseDC(m_hwndFileOpenDlg, hdc);
680*cdf0e10cSrcweir 
681*cdf0e10cSrcweir     if (x < 0)
682*cdf0e10cSrcweir         x = 0;
683*cdf0e10cSrcweir     else if ((x + lDlgW) > hResol)
684*cdf0e10cSrcweir         x = hResol - lDlgW;
685*cdf0e10cSrcweir 
686*cdf0e10cSrcweir     if (y < 0)
687*cdf0e10cSrcweir         y = 0;
688*cdf0e10cSrcweir     else if ((y + lDlgH) > vResol)
689*cdf0e10cSrcweir         y = vResol - lDlgH;
690*cdf0e10cSrcweir 
691*cdf0e10cSrcweir     SetWindowPos(
692*cdf0e10cSrcweir         m_hwndFileOpenDlg,
693*cdf0e10cSrcweir         NULL, x, y, 0, 0,
694*cdf0e10cSrcweir         SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE );
695*cdf0e10cSrcweir }
696