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