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 #ifndef _FILEOPENDLG_HXX_
25*b1cdbd2cSJim Jagielski #define _FILEOPENDLG_HXX_
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
28*b1cdbd2cSJim Jagielski // includes
29*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <sal/types.h>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #ifndef _RTL_USTRING_HXX_
34*b1cdbd2cSJim Jagielski #include <rtl/ustring>
35*b1cdbd2cSJim Jagielski #endif
36*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include "platform_xp.h"
39*b1cdbd2cSJim Jagielski #include "getfilenamewrapper.hxx"
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski // because we don't want to import the new W2k platform skd
42*b1cdbd2cSJim Jagielski // into our build environment if have stolen the definition
43*b1cdbd2cSJim Jagielski // for the new OPENFILENAME structure from the new headers
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #ifndef _CDSIZEOF_STRUCT
46*b1cdbd2cSJim Jagielski #define _CDSIZEOF_STRUCT(structname, member)  (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member))
47*b1cdbd2cSJim Jagielski #endif
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski typedef struct _tagOFNA {
50*b1cdbd2cSJim Jagielski    DWORD        lStructSize;
51*b1cdbd2cSJim Jagielski    HWND         hwndOwner;
52*b1cdbd2cSJim Jagielski    HINSTANCE    hInstance;
53*b1cdbd2cSJim Jagielski    LPCSTR       lpstrFilter;
54*b1cdbd2cSJim Jagielski    LPSTR        lpstrCustomFilter;
55*b1cdbd2cSJim Jagielski    DWORD        nMaxCustFilter;
56*b1cdbd2cSJim Jagielski    DWORD        nFilterIndex;
57*b1cdbd2cSJim Jagielski    LPSTR        lpstrFile;
58*b1cdbd2cSJim Jagielski    DWORD        nMaxFile;
59*b1cdbd2cSJim Jagielski    LPSTR        lpstrFileTitle;
60*b1cdbd2cSJim Jagielski    DWORD        nMaxFileTitle;
61*b1cdbd2cSJim Jagielski    LPCSTR       lpstrInitialDir;
62*b1cdbd2cSJim Jagielski    LPCSTR       lpstrTitle;
63*b1cdbd2cSJim Jagielski    DWORD        Flags;
64*b1cdbd2cSJim Jagielski    WORD         nFileOffset;
65*b1cdbd2cSJim Jagielski    WORD         nFileExtension;
66*b1cdbd2cSJim Jagielski    LPCSTR       lpstrDefExt;
67*b1cdbd2cSJim Jagielski    LPARAM       lCustData;
68*b1cdbd2cSJim Jagielski    LPOFNHOOKPROC lpfnHook;
69*b1cdbd2cSJim Jagielski    LPCSTR       lpTemplateName;
70*b1cdbd2cSJim Jagielski #ifdef _MAC
71*b1cdbd2cSJim Jagielski    LPEDITMENU   lpEditInfo;
72*b1cdbd2cSJim Jagielski    LPCSTR       lpstrPrompt;
73*b1cdbd2cSJim Jagielski #endif
74*b1cdbd2cSJim Jagielski #if (_WIN32_WINNT >= 0x0500)
75*b1cdbd2cSJim Jagielski    void *		pvReserved;
76*b1cdbd2cSJim Jagielski    DWORD        dwReserved;
77*b1cdbd2cSJim Jagielski    DWORD        FlagsEx;
78*b1cdbd2cSJim Jagielski #endif // (_WIN32_WINNT >= 0x0500)
79*b1cdbd2cSJim Jagielski } _OPENFILENAMEA, *_LPOPENFILENAMEA;
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski typedef struct _tagOFNW {
82*b1cdbd2cSJim Jagielski    DWORD        lStructSize;
83*b1cdbd2cSJim Jagielski    HWND         hwndOwner;
84*b1cdbd2cSJim Jagielski    HINSTANCE    hInstance;
85*b1cdbd2cSJim Jagielski    LPCWSTR      lpstrFilter;
86*b1cdbd2cSJim Jagielski    LPWSTR       lpstrCustomFilter;
87*b1cdbd2cSJim Jagielski    DWORD        nMaxCustFilter;
88*b1cdbd2cSJim Jagielski    DWORD        nFilterIndex;
89*b1cdbd2cSJim Jagielski    LPWSTR       lpstrFile;
90*b1cdbd2cSJim Jagielski    DWORD        nMaxFile;
91*b1cdbd2cSJim Jagielski    LPWSTR       lpstrFileTitle;
92*b1cdbd2cSJim Jagielski    DWORD        nMaxFileTitle;
93*b1cdbd2cSJim Jagielski    LPCWSTR      lpstrInitialDir;
94*b1cdbd2cSJim Jagielski    LPCWSTR      lpstrTitle;
95*b1cdbd2cSJim Jagielski    DWORD        Flags;
96*b1cdbd2cSJim Jagielski    WORD         nFileOffset;
97*b1cdbd2cSJim Jagielski    WORD         nFileExtension;
98*b1cdbd2cSJim Jagielski    LPCWSTR      lpstrDefExt;
99*b1cdbd2cSJim Jagielski    LPARAM       lCustData;
100*b1cdbd2cSJim Jagielski    LPOFNHOOKPROC lpfnHook;
101*b1cdbd2cSJim Jagielski    LPCWSTR      lpTemplateName;
102*b1cdbd2cSJim Jagielski #if (_WIN32_WINNT >= 0x0500)
103*b1cdbd2cSJim Jagielski    void *       pvReserved;
104*b1cdbd2cSJim Jagielski    DWORD        dwReserved;
105*b1cdbd2cSJim Jagielski    DWORD        FlagsEx;
106*b1cdbd2cSJim Jagielski #endif // (_WIN32_WINNT >= 0x0500)
107*b1cdbd2cSJim Jagielski } _OPENFILENAMEW, *_LPOPENFILENAMEW;
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski #ifdef UNICODE
110*b1cdbd2cSJim Jagielski typedef _OPENFILENAMEW _OPENFILENAME;
111*b1cdbd2cSJim Jagielski typedef _LPOPENFILENAMEW _LPOPENFILENAME;
112*b1cdbd2cSJim Jagielski #else
113*b1cdbd2cSJim Jagielski typedef _OPENFILENAMEA _OPENFILENAME;
114*b1cdbd2cSJim Jagielski typedef _LPOPENFILENAMEA _LPOPENFILENAME;
115*b1cdbd2cSJim Jagielski #endif // UNICODE
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski #if (_WIN32_WINNT >= 0x0500)
118*b1cdbd2cSJim Jagielski     #define _OPENFILENAME_SIZE_VERSION_400A  _CDSIZEOF_STRUCT(_OPENFILENAMEA,lpTemplateName)
119*b1cdbd2cSJim Jagielski     #define _OPENFILENAME_SIZE_VERSION_400W  _CDSIZEOF_STRUCT(_OPENFILENAMEW,lpTemplateName)
120*b1cdbd2cSJim Jagielski     #ifdef UNICODE
121*b1cdbd2cSJim Jagielski         #define _OPENFILENAME_SIZE_VERSION_400  _OPENFILENAME_SIZE_VERSION_400W
122*b1cdbd2cSJim Jagielski     #else
123*b1cdbd2cSJim Jagielski         #define _OPENFILENAME_SIZE_VERSION_400  _OPENFILENAME_SIZE_VERSION_400A
124*b1cdbd2cSJim Jagielski     #endif // !UNICODE
125*b1cdbd2cSJim Jagielski #else
126*b1cdbd2cSJim Jagielski     #error _WIN32_WINNT seams not to be valid.
127*b1cdbd2cSJim Jagielski #endif // (_WIN32_WINNT >= 0x0500)
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski //-------------------------------------------------------------
131*b1cdbd2cSJim Jagielski // A simple wrapper class around the Win32 GetOpenFileName API.
132*b1cdbd2cSJim Jagielski // This class is not thread-safe and only one instance at a
133*b1cdbd2cSJim Jagielski // time is allowed
134*b1cdbd2cSJim Jagielski //-------------------------------------------------------------
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski class CFileOpenDialog
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski public:
139*b1cdbd2cSJim Jagielski 	// ctor
140*b1cdbd2cSJim Jagielski 	// bFileOpenDialog idicates if we want a FileOpen or FileSave
141*b1cdbd2cSJim Jagielski 	// dialog
142*b1cdbd2cSJim Jagielski 	// dwFlags see OPENFILENAME
143*b1cdbd2cSJim Jagielski 	// dwTemplateId - an ID for custom templates
144*b1cdbd2cSJim Jagielski 	// hInstance    - an instance handle for the module
145*b1cdbd2cSJim Jagielski 	// which provides the custom template, unused if dwTemplateId
146*b1cdbd2cSJim Jagielski 	// is 0
147*b1cdbd2cSJim Jagielski 	CFileOpenDialog(
148*b1cdbd2cSJim Jagielski 		bool bFileOpenDialog = sal_True,
149*b1cdbd2cSJim Jagielski 		sal_uInt32 dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
150*b1cdbd2cSJim Jagielski 		sal_uInt32 dwTemplateId = 0,
151*b1cdbd2cSJim Jagielski 		HINSTANCE hInstance = 0);
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 	virtual ~CFileOpenDialog();
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL setTitle(const rtl::OUString& aTitle);
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 	// to set a filter string using the M$ format
158*b1cdbd2cSJim Jagielski 	// e.g. FltName\0*.txt;*.rtf\0...\0\0
159*b1cdbd2cSJim Jagielski 	void SAL_CALL setFilter(const rtl::OUString& aFilter);
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	// set the index of the current filter when the
162*b1cdbd2cSJim Jagielski 	// dialog is about to shown, the index starts with 1
163*b1cdbd2cSJim Jagielski 	// the function succeeded if the given filter index
164*b1cdbd2cSJim Jagielski 	// is greater than zero and is a valid position
165*b1cdbd2cSJim Jagielski 	// within filter string that was previously set
166*b1cdbd2cSJim Jagielski 	bool SAL_CALL setFilterIndex(sal_uInt32 aIndex);
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 	// get the index of the currently selected filter
169*b1cdbd2cSJim Jagielski 	// the index of the returned filter starts with 1
170*b1cdbd2cSJim Jagielski 	sal_uInt32 SAL_CALL getSelectedFilterIndex() const;
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 	// set the name and optional the path of the
173*b1cdbd2cSJim Jagielski 	// file that will be initially be shown when
174*b1cdbd2cSJim Jagielski 	// the dialog will be displayed
175*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL setDefaultName(const rtl::OUString& aName);
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 	// set the initial directory
178*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL setDisplayDirectory(const rtl::OUString& aDirectory);
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 	// returns only the path of the selected file
181*b1cdbd2cSJim Jagielski 	virtual rtl::OUString SAL_CALL getLastDisplayDirectory() const;
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 	// returns the full file name including drive letter, path
184*b1cdbd2cSJim Jagielski 	// file name and file extension
185*b1cdbd2cSJim Jagielski 	virtual rtl::OUString SAL_CALL getFullFileName() const;
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 	// returns the file name and the file extension without
188*b1cdbd2cSJim Jagielski 	// drive letter and path
189*b1cdbd2cSJim Jagielski 	rtl::OUString SAL_CALL getFileName() const;
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	// returns the file extension of the selected file
192*b1cdbd2cSJim Jagielski 	rtl::OUString SAL_CALL getFileExtension();
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 	// set a default extension, only the first three letters of
195*b1cdbd2cSJim Jagielski 	// the given extension will be used; the given extension
196*b1cdbd2cSJim Jagielski 	// should not contain a '.'
197*b1cdbd2cSJim Jagielski 	void SAL_CALL setDefaultFileExtension(const rtl::OUString& aExtension);
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 	// enables or disables the multiselection mode for
200*b1cdbd2cSJim Jagielski 	// the FileOpen/FileSave dialog
201*b1cdbd2cSJim Jagielski 	void SAL_CALL setMultiSelectionMode(bool bMode);
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 	// returns whether multi-selection mode is enabled or not
204*b1cdbd2cSJim Jagielski 	bool SAL_CALL getMultiSelectionMode() const;
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 	// shows the dialog, calls preModal before
207*b1cdbd2cSJim Jagielski 	// showing the dialog and postModal after
208*b1cdbd2cSJim Jagielski 	// showing the dialog
209*b1cdbd2cSJim Jagielski 	// the method returns:
210*b1cdbd2cSJim Jagielski 	//  0 - when the dialog was canceled by the user
211*b1cdbd2cSJim Jagielski 	//  1 - when the dialog was closed with ok
212*b1cdbd2cSJim Jagielski 	// -1 - when an error occured
213*b1cdbd2cSJim Jagielski 	sal_Int16 SAL_CALL doModal();
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	// returns the last dialog error that occured
216*b1cdbd2cSJim Jagielski 	sal_uInt32 SAL_CALL getLastDialogError() const;
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 	// retrievs the currently selected file
219*b1cdbd2cSJim Jagielski 	// including path and drive information
220*b1cdbd2cSJim Jagielski 	// can be called only if the dialog is
221*b1cdbd2cSJim Jagielski 	// already displayed
222*b1cdbd2cSJim Jagielski 	rtl::OUString SAL_CALL getCurrentFilePath() const;
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 	// retrievs the currently selected folder
225*b1cdbd2cSJim Jagielski 	rtl::OUString SAL_CALL getCurrentFolderPath() const;
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 	// retrievs the currently selected file name
228*b1cdbd2cSJim Jagielski 	// without drive and path
229*b1cdbd2cSJim Jagielski 	rtl::OUString SAL_CALL getCurrentFileName() const;
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski protected:
232*b1cdbd2cSJim Jagielski 	// have to be overwritten when subclasses
233*b1cdbd2cSJim Jagielski 	// want to do special pre- and post-modal
234*b1cdbd2cSJim Jagielski 	// processing
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 	// if preModal return true processing will
237*b1cdbd2cSJim Jagielski 	// continue else doModal exit without showing
238*b1cdbd2cSJim Jagielski 	// a dialog and returns -1
239*b1cdbd2cSJim Jagielski 	virtual bool SAL_CALL preModal();
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 	// post modal processing
242*b1cdbd2cSJim Jagielski 	// the function should accept only values returned from
243*b1cdbd2cSJim Jagielski 	// doModal and act appropriately
244*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL postModal(sal_Int16 nDialogResult);
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 	// message handler, to be overwritten by subclasses
247*b1cdbd2cSJim Jagielski 	virtual sal_uInt32 SAL_CALL onShareViolation(const rtl::OUString& aPathName);
248*b1cdbd2cSJim Jagielski 	virtual sal_uInt32 SAL_CALL onFileOk();
249*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL onSelChanged(HWND hwndListBox);
250*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL onHelp();
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	// only called back if OFN_EXPLORER is set
253*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL onInitDone();
254*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL onFolderChanged();
255*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL onTypeChanged(sal_uInt32 nFilterIndex);
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL onInitDialog(HWND hwndDlg) = 0;
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski 	virtual sal_uInt32 SAL_CALL onCtrlCommand(HWND hwndDlg, sal_uInt16 ctrlId, sal_uInt16 notifyCode);
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 	sal_uInt32 SAL_CALL onWMNotify(HWND hwndChild, LPOFNOTIFYW lpOfNotify);
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski 	// we use non-virtual functions to do necessary work before
264*b1cdbd2cSJim Jagielski 	// calling the virtual funtions (see Gamma: Template method)
265*b1cdbd2cSJim Jagielski 	void SAL_CALL handleInitDialog(HWND hwndDlg, HWND hwndChild);
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski protected:
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 	// handle to the window of the
270*b1cdbd2cSJim Jagielski 	// FileOpen/FileSave dialog
271*b1cdbd2cSJim Jagielski 	// will be set on message
272*b1cdbd2cSJim Jagielski 	// WM_INITDIALOG, before this
273*b1cdbd2cSJim Jagielski 	// value is undefined
274*b1cdbd2cSJim Jagielski 	HWND	m_hwndFileOpenDlg;
275*b1cdbd2cSJim Jagielski 	HWND	m_hwndFileOpenDlgChild;
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 	_OPENFILENAME	m_ofn;
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     // we connect the instance with the dialog window using
280*b1cdbd2cSJim Jagielski     // SetProp, with this function we can reconnect from
281*b1cdbd2cSJim Jagielski     // callback functions to this instance
282*b1cdbd2cSJim Jagielski     static CFileOpenDialog* SAL_CALL getCurrentInstance(HWND hwnd);
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski     void SAL_CALL centerPositionToParent() const;
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski private:
287*b1cdbd2cSJim Jagielski 	// FileOpen or FileSaveDialog
288*b1cdbd2cSJim Jagielski 	bool			m_bFileOpenDialog;
289*b1cdbd2cSJim Jagielski 	rtl::OUString	m_dialogTitle;
290*b1cdbd2cSJim Jagielski 	rtl::OUString	m_displayDirectory;
291*b1cdbd2cSJim Jagielski 	rtl::OUString	m_defaultExtension;
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 	mutable	rtl::OUStringBuffer m_filterBuffer;
294*b1cdbd2cSJim Jagielski 	mutable	rtl::OUStringBuffer m_fileTitleBuffer;
295*b1cdbd2cSJim Jagielski 	mutable rtl::OUStringBuffer	m_helperBuffer;
296*b1cdbd2cSJim Jagielski 	mutable rtl::OUStringBuffer m_fileNameBuffer;
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski     CGetFileNameWrapper m_GetFileNameWrapper;
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski     WNDPROC	    		m_pfnBaseDlgProc;
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 	// callback function
303*b1cdbd2cSJim Jagielski 	static unsigned int CALLBACK ofnHookProc(
304*b1cdbd2cSJim Jagielski 		HWND hChildDlg, // handle to child dialog box
305*b1cdbd2cSJim Jagielski 		unsigned int uiMsg,     // message identifier
306*b1cdbd2cSJim Jagielski 		WPARAM wParam,  // message parameter
307*b1cdbd2cSJim Jagielski 		LPARAM lParam   // message parameter
308*b1cdbd2cSJim Jagielski 	);
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     // we have to subclass the dialog in order
311*b1cdbd2cSJim Jagielski     // to clean up the window property we are
312*b1cdbd2cSJim Jagielski     // using to connect the window with a class
313*b1cdbd2cSJim Jagielski     // instance in WM_NCDESTROY
314*b1cdbd2cSJim Jagielski     static LRESULT CALLBACK BaseDlgProc(
315*b1cdbd2cSJim Jagielski         HWND hWnd, UINT wMessage, WPARAM wParam, LPARAM lParam );
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski private:
318*b1cdbd2cSJim Jagielski 	// avoid copy and assignment
319*b1cdbd2cSJim Jagielski 	CFileOpenDialog(const CFileOpenDialog&);
320*b1cdbd2cSJim Jagielski 	CFileOpenDialog& operator=(const CFileOpenDialog&);
321*b1cdbd2cSJim Jagielski };
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski #endif
324