/*++ Copyright (c) 1990-1998, Microsoft Corporation All rights reserved. Module Name: filenew.h Abstract: This module contains the header information for the new Win32 fileopen dialogs. Revision History: --*/ #undef StrCpy #undef StrCat #include "d32tlog.h" //////////////////////////////////////////////////////////////////////////// // // TEMPMEM class // //////////////////////////////////////////////////////////////////////////// class TEMPMEM { public: TEMPMEM(UINT cb) { m_uSize = cb; m_pMem = cb ? LocalAlloc(LPTR, cb) : NULL; } ~TEMPMEM() { if (m_pMem) { LocalFree(m_pMem); } } operator LPBYTE() const { return ((LPBYTE)m_pMem); } BOOL Resize(UINT cb); private: LPVOID m_pMem; protected: UINT m_uSize; }; //////////////////////////////////////////////////////////////////////////// // // TEMPSTR class // //////////////////////////////////////////////////////////////////////////// class TEMPSTR : public TEMPMEM { public: TEMPSTR(UINT cc = 0) : TEMPMEM(cc * sizeof(TCHAR)) { } operator LPTSTR() const { return ((LPTSTR)(LPBYTE) * (TEMPMEM *)this); } BOOL StrCpy(LPCTSTR pszText); BOOL StrCat(LPCTSTR pszText); BOOL StrSize(UINT cb) { return (TEMPMEM::Resize(cb * sizeof(TCHAR))); } }; //////////////////////////////////////////////////////////////////////////// // // MYLISTBOXITEM class // // One object of this class exists for each item in the location dropdown. // // Data members: // psfSub - instance of IShellFolder bound to this container // pidlThis - IDL of this container, relative to its parent // pidlFull - IDL of this container, relative to the desktop // cIndent - indent level (0-based) // dwFlags - // MLBI_PERMANENT - item is an "information source" and should // always remain // dwAttrs - attributes of this container as reported by GetAttributesOf() // iImage, iSelectedImage - indices into the system image list for this // object // // Member functions: // ShouldInclude() - returns whether item belongs in the location dropdown // IsShared() - returns whether an item is shared or not // SwitchCurrentDirectory() - changes the Win32 current directory to the // directory indicated by this item // //////////////////////////////////////////////////////////////////////////// class MYLISTBOXITEM { public: IShellFolder *psfSub; IShellFolder *psfParent; LPITEMIDLIST pidlThis; LPITEMIDLIST pidlFull; DWORD cIndent; DWORD dwFlags; DWORD dwAttrs; int iImage; int iSelectedImage; HWND _hwndCmb; MYLISTBOXITEM(); ULONG AddRef(); ULONG Release(); BOOL Init( HWND hwndCmb, MYLISTBOXITEM *pParentItem, IShellFolder *psf, LPCITEMIDLIST pidl, DWORD c, DWORD f, IShellTaskScheduler* pScheduler); //This function is used to initialize all members directly. BOOL Init(HWND hwndCmb, IShellFolder *psf, LPCITEMIDLIST pidl, DWORD c, DWORD f, DWORD dwAttrs, int iImage, int iSelectedImage); inline BOOL ShouldInclude() { return (dwAttrs & (SFGAO_FILESYSANCESTOR | SFGAO_FILESYSTEM)); } inline BOOL IsShared() { return (dwAttrs & SFGAO_SHARE); } void SwitchCurrentDirectory(ICurrentWorkingDirectory * pcwd); IShellFolder* GetShellFolder(); static void CALLBACK _AsyncIconTaskCallback(LPCITEMIDLIST pidl, LPVOID pvData, LPVOID pvHint, INT iIconIndex, INT iOpenIconIndex); private: ~MYLISTBOXITEM(); LONG _cRef; }; //////////////////////////////////////////////////////////////////////////// // // CFileOpenBrowser class // //////////////////////////////////////////////////////////////////////////// typedef BOOL (*EIOCALLBACK)(class CFileOpenBrowser*that, LPCITEMIDLIST pidl, LPARAM lParam); typedef enum { ECODE_S_OK = 0, ECODE_BADDRIVE = 1, ECODE_BADPATH = 2, } ECODE; typedef enum { OKBUTTON_NONE = 0x0000, OKBUTTON_NODEFEXT = 0x0001, OKBUTTON_QUOTED = 0x0002, } OKBUTTON_FLAGS; typedef UINT OKBUTTONFLAGS; typedef struct _SHTCUTINFO { BOOL fReSolve; //[IN] Should we resolve the shortcut DWORD dwAttr; //[IN/OUT] Attributes of the target pointed by shortcut LPTSTR pszLinkFile; //[OUT] Target file name UINT cchFile; //[IN] size of buffer pointed to by pszLinkFile LPITEMIDLIST * ppidl; //[OUT] pidl of the target pointed to by shortcut }SHTCUTINFO, *PSHTCUTINFO; typedef enum { LOCTYPE_RECENT_FOLDER = 1, LOCTYPE_MYPICTURES_FOLDER = 2, LOCTYPE_OTHERS = 3, LOCTYPE_WIA_FOLDER = 4 }LOCTYPE; class CFileOpenBrowser : public IShellBrowser , public ICommDlgBrowser2 , public IServiceProvider { public: // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj); STDMETHOD_(ULONG,AddRef) (THIS); STDMETHOD_(ULONG,Release) (THIS); // *** IOleWindow methods *** STDMETHOD(GetWindow) (THIS_ HWND *lphwnd); STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL fEnterMode); // *** IShellBrowser methods *** (same as IOleInPlaceFrame) STDMETHOD(InsertMenusSB) (THIS_ HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); STDMETHOD(SetMenuSB) (THIS_ HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject); STDMETHOD(RemoveMenusSB) (THIS_ HMENU hmenuShared); STDMETHOD(SetStatusTextSB) (THIS_ LPCOLESTR lpszStatusText); STDMETHOD(EnableModelessSB) (THIS_ BOOL fEnable); STDMETHOD(TranslateAcceleratorSB) (THIS_ LPMSG lpmsg, WORD wID); // *** IShellBrowser methods *** STDMETHOD(BrowseObject)(THIS_ LPCITEMIDLIST pidl, UINT wFlags); STDMETHOD(GetViewStateStream)(THIS_ DWORD grfMode, LPSTREAM *pStrm); STDMETHOD(GetControlWindow)(THIS_ UINT id, HWND *lphwnd); STDMETHOD(SendControlMsg)(THIS_ UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret); STDMETHOD(QueryActiveShellView)(THIS_ struct IShellView **ppshv); STDMETHOD(OnViewWindowActive)(THIS_ struct IShellView *pshv); STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags); // *** ICommDlgBrowser methods *** STDMETHOD(OnDefaultCommand) (THIS_ struct IShellView *ppshv); STDMETHOD(OnStateChange) (THIS_ struct IShellView *ppshv, ULONG uChange); STDMETHOD(IncludeObject) (THIS_ struct IShellView *ppshv, LPCITEMIDLIST lpItem); // *** ICommDlgBrowser2 methods *** STDMETHOD(Notify) (THIS_ struct IShellView *ppshv, DWORD dwNotifyType); STDMETHOD(GetDefaultMenuText) (THIS_ struct IShellView *ppshv, WCHAR *pszText, INT cchMax); STDMETHOD(GetViewFlags)(THIS_ DWORD *pdwFlags); // *** IServiceProvider methods *** STDMETHOD(QueryService)(THIS_ REFGUID guidService, REFIID riid, LPVOID* ppvObj); // *** Our own methods *** CFileOpenBrowser(HWND hDlg, BOOL fIsSaveAs); ~CFileOpenBrowser(); HRESULT SwitchView(struct IShellFolder *psfNew, LPCITEMIDLIST pidlNew, FOLDERSETTINGS *pfs, SHELLVIEWID const *pvid, BOOL fUseDefultView); void OnDblClick(BOOL bFromOKButton); LRESULT OnNotify(LPNMHDR lpnmhdr); BOOL OnSetCursor(void); void ViewCommand(UINT uIndex); void PaintDriveLine(DRAWITEMSTRUCT *lpdis); void GetFullPath(LPTSTR pszBuf); BOOL OnSelChange(int iItem = -1, BOOL bForceUpdate = FALSE); void OnDotDot(); void RefreshFilter(HWND hwndFilter); BOOL JumpToPath(LPCTSTR pszDirectory, BOOL bTranslate = FALSE); BOOL JumpToIDList(LPCITEMIDLIST pidlNew, BOOL bTranslate = FALSE, BOOL bAddToNavStack = TRUE); BOOL SetDirRetry(LPTSTR pszDir, BOOL bNoValidate = FALSE); BOOL MultiSelectOKButton(LPCTSTR pszFiles, OKBUTTONFLAGS Flags); BOOL OKButtonPressed(LPCTSTR pszFile, OKBUTTONFLAGS Flags); UINT GetDirectoryFromLB(LPTSTR szBuffer, int *pichRoot); void SetCurrentFilter(LPCTSTR pszFilter, OKBUTTONFLAGS Flags = OKBUTTON_QUOTED); UINT GetFullEditName(LPTSTR pszBuf, UINT cLen, TEMPSTR *pTempStr = NULL, BOOL *pbNoDefExt = NULL); void ProcessEdit(); LRESULT OnCommandMessage(WPARAM wParam, LPARAM lParam); BOOL OnCDMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); void RemoveOldPath(int *piNewSel); BOOL LinkMatchSpec(LPCITEMIDLIST pidl, LPCTSTR szSpec); BOOL GetLinkStatus(LPCITEMIDLIST pidl,PSHTCUTINFO pinfo); HRESULT ResolveLink(LPCITEMIDLIST pidl, PSHTCUTINFO pinfo, IShellFolder *psf = NULL); void SelFocusChange(BOOL bSelChange); void SelRename(void); void SetSaveButton(UINT idSaveButton); void RealSetSaveButton(UINT idSaveButton); void SetEditFile(LPCTSTR pszFile, LPCTSTR pszFileFriendly, BOOL bShowExt, BOOL bSaveNullExt = TRUE); BOOL EnumItemObjects(UINT uItem, EIOCALLBACK pfnCallBack, LPARAM lParam); BOOL IsKnownExtension(LPCTSTR pszExtension); UINT FindNameInView(LPTSTR pszFile, OKBUTTONFLAGS Flags, LPTSTR pszPathName, int nFileOffset, int nExtOffset, int *pnErrCode, BOOL bTryAsDir = TRUE); void UpdateLevel(HWND hwndLB, int iInsert, MYLISTBOXITEM *pParentItem); void InitializeDropDown(HWND hwndCtl); BOOL FSChange(LONG lNotification, LPCITEMIDLIST *ppidl); int GetNodeFromIDList(LPCITEMIDLIST pidl); void Timer(WPARAM wID); BOOL CreateHookDialog(POINT *pPtSize); void OnGetMinMax(LPMINMAXINFO pmmi); void OnSize(int, int); void VerifyListViewPosition(void); BOOL CreateToolbar(); // Creates the file open toolbar void EnableFileMRU(BOOL fEnable); // Enable/Disable File MRU based on the flag passed void UpdateNavigation(); // Updates the Navigation by adding the current pidl // to the navigation stack void UpdateUI(LPITEMIDLIST pidlNew); // Updates the back navigation button and the hot item on the places bar LPCTSTR JumpToInitialLocation(LPCTSTR pszDir, LPTSTR pszFile); BOOL InitLookIn(HWND hDlg); //Initializes the look in drop down. int _CopyFileNameToOFN(LPTSTR pszFile, DWORD *pdwError); void _CopyTitleToOFN(LPCTSTR pszTitle); BOOL _IsNoDereferenceLinks(LPCWSTR pszFile, IShellItem *psi); BOOL _OpenAsContainer(IShellItem *psi, SFGAOF sfgao); HRESULT _ParseName(LPCITEMIDLIST pidlParent, IShellFolder *psf, IBindCtx *pbc, LPCOLESTR psz, IShellItem **ppsi); HRESULT _ParseNameAndTest(LPCOLESTR pszIn, IBindCtx *pbc, IShellItem **ppsi, BOOL fAllowJump); HRESULT _ParseShellItem(LPCOLESTR pszIn, IShellItem **ppsi, BOOL fAllowJump); HRESULT _TestShellItem(IShellItem *psi, BOOL fAllowJump, IShellItem **ppsiReal); #ifdef RETURN_SHELLITEMS HRESULT _ItemOKButtonPressed(LPCTSTR pszFile, OKBUTTONFLAGS Flags); HRESULT _ProcessShellItem(IShellItem *psi); #endif RETURN_SHELLITEMS HRESULT _MakeFakeCopy(IShellItem *psi, LPWSTR *ppszPath); BOOL CheckForRestrictedFolder(LPCTSTR lpszPath, int nFileOffset); //Checks to see whether a file can be saved in the given path. void ResetDialogHeight(HWND hDlg, HWND hwndExclude, HWND hwndGrip, int nCtlsBottom); void ReAdjustDialog(); // if help and open as read only is hidden then this function readjusts the dialog // to reclaim the space occupied by these controls //Places Bar Related Functions HWND CreatePlacesbar(HWND hDlg); // Creates places bar void _RecreatePlacesbar(); void _CleanupPlacesbar(); void _FillPlacesbar(HWND hwndPlacesbar); BOOL _EnumPlacesBarItem(HKEY hkey, int i , SHFILEINFO *psfi, LPITEMIDLIST *ppidl); BOOL _GetPlacesBarItemToolTip(int idCmd, LPTSTR pText, DWORD dwSize); BOOL _GetPBItemFromTokenStrings(LPTSTR lpszPath, SHFILEINFO * psfi, LPITEMIDLIST *ppidl); BOOL _GetPBItemFromCSIDL(DWORD csidl, SHFILEINFO * psfi, LPITEMIDLIST *ppidl); BOOL _GetPBItemFromPath(LPTSTR lpszPath, SHFILEINFO * psfi, LPITEMIDLIST *ppidl); //Pidl Processing Functions BOOL _ProcessPidlSelection(); //Processes the selection pidl if any. HRESULT _ProcessItemAsFile(IShellItem *psi); //General Utility Functions BOOL _ValidateSelectedFile(LPCTSTR pszFile, int *pErrCode); BOOL _PostProcess(LPTSTR pszFile); BOOL _IsThumbnailFolder(LPCITEMIDLIST pidl); BOOL _IsWIAFolder(IShellFolder *psf); LOCTYPE _GetLocationType(MYLISTBOXITEM *pLocation); void _WaitCursor(BOOL fWait); BOOL CFileOpenBrowser::_IsRestrictedDrive(LPCTSTR pszPath, LPCITEMIDLIST pidl); void CFileOpenBrowser::JumpToLocationIfUnrestricted(LPCTSTR pszPath, LPCITEMIDLIST pidl, BOOL bTranslate); BOOL CFileOpenBrowser::_SaveAccessDenied(LPCTSTR pszFile); void _CleanupDialog(BOOL fRet); void OnThemeActive(HWND hwndDlg, BOOL bActive); //Member Variables LONG _cRef; // compobj refcount int _iCurrentLocation; // index of curr selection in location dropdown int _iVersion; // Which version of dialog are we showing MYLISTBOXITEM *_pCurrentLocation; // ptr to object for same HWND _hwndDlg; // handle of this dialog HWND _hSubDlg; // handle of the hook dialog IShellView *_psv; // current view object IShellFolder *_psfCurrent; // current shellfolder object TravelLog *_ptlog; // ptr to travel log HWND _hwndView; // current view window HWND _hwndToolbar; // toolbar window HWND _hwndPlacesbar; // places bar window HWND _hwndLastFocus; // ctrl that had focus before OK button HIMAGELIST _himl; // system imagelist (small images) TEMPSTR _pszHideExt; // saved file with extension TEMPSTR _tszDefSave; // saved file with extension TEMPSTR _pszDefExt; // writable version of the DefExt TEMPSTR _pszObjectPath; // full object path TEMPSTR _pszObjectCurDir; // object current directory (folder) UINT _uRegister; int _iComboIndex; int _iNodeDrives; // location of my computer in drop down int _iNodeDesktop; // location of Desktop in drop down int _iCommandID; // Next command id to use for a Placebar Item int _iCheckedButton; // if > 0 tells which places bar button is checked BOOL _bEnableSizing; // if sizing is enabled BOOL _bUseCombo; // Use the edit window instead of comboxex for app compatibility POINT _ptLastSize; // last known size of dialog POINT _ptMinTrack; // initial size of view SIZE _sizeView; // last known size of view HWND _hwndGrip; // window handle of sizing grip DWORD _dwPlacesbarPadding; // default placesbar toolbar padding LPOPENFILENAME _pOFN; // caller's OPENFILENAME struct BOOL _bSave : 1; // whether this is a save-as dialog BOOL _fShowExtensions : 1; // whether to show extensions BOOL _bUseHideExt : 1; // whether pszHideExt is valid BOOL _bDropped : 1; BOOL _bNoInferDefExt : 1; // don't get defext from combo BOOL _fSelChangedPending : 1; // we have a selchanging message pending BOOL _bSelIsObject : 1; // the last selected object is an object, not a file BOOL _bUseSizeView : 1; // only use cached size after failure to create view... BOOL _bAppRedrawn : 1; // Did app call RedrawWindow? - see ResetDialogHeight BOOL _bDestroyPlacesbarImageList : 1; // Free placesbar imagelist first time only HWND _hwndTips; // hWnd of tooltip control for this window LPOPENFILEINFO _pOFI; // info for thunking (ansi callers only) ICurrentWorkingDirectory * _pcwd; // Interface to AutoComplete COM Object that sets CurrentWorkingDir UINT _CachedViewMode; // we force Some folders into specific views. this caches the users choice UINT _fCachedViewFlags; // we also need to cache the view flags. // Apphack for Borland JBuilder Professional - see ResetDialogHeight int _topOrig; // original window top LPITEMIDLIST _pidlSelection; // This is currently selected items pidl. IShellTaskScheduler* _pScheduler; // This TaskScheduler is used to do delayed Icon extractions. int _cWaitCursor; LONG _cRefCannotNavigate; HWND _hwndModelessFocus; WNDPROC _lpOKProc; // Perf: Big structures go at the end TCHAR _szLastFilter[MAX_PATH + 1]; // last filter chosen by the user TCHAR _szStartDir[MAX_PATH + 1]; // saved starting directory TCHAR _szCurDir[MAX_PATH + 1]; // currently viewed dir (if FS) TCHAR _szBuf[MAX_PATH + 4]; // scratch buffer TCHAR _szTipBuf[MAX_PATH + 1]; // tool tip buffer //////////////////////////////////////////////////////////////////////////// // // WAIT_CURSOR class // //////////////////////////////////////////////////////////////////////////// class WAIT_CURSOR { private: CFileOpenBrowser *_that; public: WAIT_CURSOR(CFileOpenBrowser *that) : _that(that) { _that->_WaitCursor(TRUE); } ~WAIT_CURSOR() { _that->_WaitCursor(FALSE); } }; }; #define VIEW_JUMPDESKTOP (VIEW_NEWFOLDER + 1)