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