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