/**
* @file XTPBrowseDialog.h
*
* @copyright
* (c) 1998-2025 Codejock Software, All Rights Reserved.
*
* This source file is the property of Codejock Software and must not be
* redistributed by any means without the explicit written permission of
* Codejock Software.
*
* The use of this source code is governed by the terms and conditions specified
* in the Toolkit Pro license agreement. Codejock Software grants you, as a
* single software developer, the limited right to use this software on one
* computer only.
*
* Contact Information:
* support@codejock.com
* http://www.codejock.com
*
*/
/** @cond */
#if !defined(__XTPBROWSEDIALOG_H__)
# define __XTPBROWSEDIALOG_H__
/** @endcond */
# if _MSC_VER > 1000
# pragma once
# endif // _MSC_VER > 1000
# include "Common/Base/Diagnostic/XTPDisableNoisyWarnings.h"
/**
* @brief
* CXTPBrowseDialog is derived from the BROWSEINFO structure. It is used
* to display a directory chooser dialog using shell extensions.
* @details
* The CXTPBrowseDialog class allows you to configure various options,
* including setting the dialog's title or assigning a callback
* function for defining the folder display and file filtering styles.
*/
class _XTP_EXT_CLASS CXTPBrowseDialog : public CCommonDialog
{
public:
/**
* @brief
* Constructs a CXTPBrowseDialog object.
* @param pParent [in] Pointer to a CWnd object that represents the parent
* window for the browse dialog.
*/
CXTPBrowseDialog(CWnd* pParent = NULL);
/**
* @brief
* Destroys a CXTPBrowseDialog object, handles cleanup and deallocation.
*/
virtual ~CXTPBrowseDialog();
public:
/**
* @brief
* Call this member function to invoke the browse dialog box and to
* return the dialog box result when done.
* @return
* IDOK if the OK button was pressed, otherwise IDCANCEL.
*/
INT_PTR DoModal();
/**
* @brief
* Call this member function to set the owner window for the dialog box.
* @param hWnd [in] Handle to the owner window for the dialog box.
*/
void SetOwner(HWND hWnd);
/**
* @brief
* Call this member function to get an HWND handle to the owner
* window for the dialog box.
* @return
* An HWND handle.
*/
HWND GetOwner();
/**
* @brief
* Call this member function to set the address of an ITEMIDLIST
* structure which specifies the location of the root folder to
* browse from.
* @param pidl [in] Address of an ITEMIDLIST structure specifying the location
* of the root folder to browse from. Only the specified folder and
* its subfolders appear in the dialog box. This member can be
* NULL, in which case, the namespace root (the desktop folder) is
* used.
*/
void SetPidlRoot(LPCITEMIDLIST pidl);
/**
* @brief
* Call this member function to return the address of the ITEMIDLIST
* structure that was specified for the location of the root folder.
* @return
* The address of the ITEMIDLIST structure that was specified for the
* location of the root folder.
*/
LPCITEMIDLIST GetPidlRoot();
/**
* @brief
* Call this member function to set the address for the display name
* that the dialog box will use.
* @param szDisplayName [in] Address of a buffer to receive the display name of the
* folder selected by the user. The size of this buffer is
* assumed to be MAX_PATH bytes.
*/
void SetDisplayName(LPCTSTR szDisplayName);
/**
* @brief
* Call this member function to return the display name that is used
* by the browse dialog box.
* @return
* The display name that is used by the browse dialog box.
*/
LPCTSTR GetDisplayName();
/**
* @brief
* Call this member function to set the title for the browse dialog box.
* @param szTitle [in] Address of a NULL-terminated string that is displayed above
* the tree view control in the dialog box. This string can be
* used to specify instructions to the user.
*/
void SetTitle(LPCTSTR szTitle);
/**
* @brief
* Call this member function to return a NULL-terminated string that
* represents the title that was set for the dialog box.
* @return
* A NULL-terminated string that represents the title that was set
* for the dialog box.
*/
LPCTSTR GetTitle();
/**
* @brief
* Call this member function to set the flags for specifying the
* options for the browse dialog box.
* @param uf [in] Flags specifying the options for the dialog box. See the
* Remarks section below for a list of available styles.
* @details
* Styles to be added or removed can be combined by using the bitwise
* OR (|) operator. It can be one or more of the following:
* BIF_BROWSEFORCOMPUTER: Only return computers. If the user
* selects anything other than a computer,
* then the OK button is grayed.
* BIF_BROWSEFORPRINTER: Only allow the selection of printers.
* If the user selects anything other than
* a printer, then the OK button is grayed.
* In Microsoft Windows XP, the best practice
* is to use an XP-style dialog, setting the
* root of the dialog to the Printers and Faxes
* folder (CSIDL_PRINTERS).
* BIF_BROWSEINCLUDEFILES: Version 4.71. The browse dialog box will
* display files as well as folders.
* BIF_BROWSEINCLUDEURLS: Version 5.0. The browse dialog box can
* display URLs. The BIF_USENEWUI and
* BIF_BROWSEINCLUDEFILES flags must also be
* set. If these three flags are not set,
* then the browser dialog box will reject
* URLs. Even when these flags are set, the
* browse dialog box will only display URLs
* if the folder that contains the selected
* item supports them. When the folder's
* IShellFolder::GetAttributesOf method is
* called to request the selected item's
* attributes, the folder must set the
* SFGAO_FOLDER attribute flag. Otherwise,
* the browse dialog box will not display
* the URL.
* BIF_DONTGOBELOWDOMAIN: Do not include network folders below the
* domain level in the dialog box's tree view
* control.
* BIF_EDITBOX: Version 4.71. Include an edit control in the browse
* dialog box that allows the user to type the name of
* an item.
* BIF_NEWDIALOGSTYLE: Version 5.0. Use the new user interface.
* Setting this flag provides the user with a
* larger dialog box that can be resized. The
* dialog box has several new capabilities
* including: drag-and-drop capability within
* the dialog box, reordering, shortcut menus,
* new folders, delete, and other shortcut menu
* commands. To use this flag, you must call
* OleInitialize or CoInitialize before calling
* SHBrowseForFolder.
* BIF_NONEWFOLDERBUTTON: Version 6.0. Do not include the New
* Folder button in the browse dialog box.
* BIF_NOTRANSLATETARGETS: Version 6.0. When the selected item is a
* shortcut, return the PIDL of the shortcut
* itself rather than its target.
* BIF_RETURNFSANCESTORS: Only return file system ancestors. An
* ancestor is a subfolder that is beneath
* the root folder in the namespace hierarchy.
* If the user selects an ancestor of the
* root folder that is not a part of the file
* system, then the OK button is grayed.
* BIF_RETURNONLYFSDIRS: Only return file system directories. If the
* user selects folders that are not a part of
* the file system, then the OK button is grayed.
* BIF_SHAREABLE: Version 5.0. The browse dialog box can display
* shareable resources on remote systems. It is intended
* for applications that want to expose remote shares
* on a local system. The BIF_NEWDIALOGSTYLE flag must
* also be set.
* BIF_STATUSTEXT: Include a status area in the dialog box. The callback
* function can set the status text by sending messages
* to the dialog box. This flag is not supported when
* BIF_NEWDIALOGSTYLE is specified.
* BIF_UAHINT: Version 6.0. When combined with BIF_NEWDIALOGSTYLE, adds
* a usage hint to the dialog box in place of the edit box.
* BIF_EDITBOX overrides this flag.
* BIF_USENEWUI: Version 5.0. Use the new user interface, including
* an edit box. This flag is equivalent to BIF_EDITBOX
* | BIF_NEWDIALOGSTYLE. To use BIF_USENEWUI, you must
* call OleInitialize or CoInitialize before calling
* SHBrowseForFolder.
* BIF_VALIDATE: Version 4.71. If the user types an invalid name
* into the edit box, then the browse dialog box will
* call the application's BrowseCallbackProc with the
* BFFM_VALIDATEFAILED message. This flag is ignored
* if BIF_EDITBOX is not specified.
*/
void SetOptions(UINT uf);
/**
* @brief
* Call this member function to return the flags specifying the options
* that have been set for the dialog box.
* @return
* The flags specifying the options that have been set for the dialog box.
*/
UINT GetOptions();
/**
* @brief
* Call this member function to define the address for the
* BrowseCallbackProc function that is to be called when an event
* occurs.
* @param pf [in] Address of an application-defined function that the dialog
* box calls when an event occurs. For more information, see the
* BrowseCallbackProc function. This member can be NULL.
*/
void SetCallback(BFFCALLBACK pf);
/**
* @brief
* Call this member function to return the address for the BrowseCallbackProc
* function that is called when an event occurs.
* @return
* The address for the BrowseCallbackProc function that is called
* when an event occurs.
*/
BFFCALLBACK GetCallback();
/**
* @brief
* Call this member function to set the application data that is
* passed to the callback function.
* @param lp [in] Application-defined value that the dialog box passes to
* the callback function, if one is specified.
*/
void SetData(LPARAM lp);
/**
* @brief
* Retrieves application data that was set to be passed to the
* callback function.
* @return
* The application data that was set to be passed to the callback function,
* if one is specified.
*/
LPARAM GetData();
/**
* @brief
* Call this member function to set the initial path to select when
* the browse dialog is first opened.
* @param szSelPath [in] A NULL-terminated string that represents the directory that
* is selected when the dialog is initially opened. If not set,
* GetCurrentDirectory is called to set the directory.
*/
void SetSelPath(LPCTSTR szSelPath);
/**
* @brief
* Call this member function to get a NULL-terminated string that
* represents the currently selected directory.
* @return
* A NULL-terminated string that represents the selected directory.
*/
LPCTSTR GetSelPath();
/**
* @brief
* Call this member function to get the index to the system image
* list of the image associated with the selected folder.
* @return
* The index to the system image list.
*/
int GetImage();
/**
* @brief
* Application defined callback.
* @param hwnd A handle to a window.
* @param uMsg The message that is sent to the window.
* @param lParam Specifies the application-defined data passed by the
* BrowseCtrlCallback function.
* @param lpData Data that is passed into the function.
* @details
* Application defined callback function used with the SHBrowseForFolder
* function. The browse dialog box calls this function to notify
* it about events. You can define your own callback function by
* using the SetCallback method.
* @return
* An integer value.
*/
static int CALLBACK BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
protected:
/**
* @brief
* NULL-terminated string that represents the selected directory.
*/
TCHAR m_szSelPath[MAX_PATH];
BROWSEINFO m_bi;
private:
CString m_strTitle; /**< Default dialog title. */
};
/////////////////////////////////////////////////////////////////////////////
/** @cond */
AFX_INLINE void CXTPBrowseDialog::SetOwner(HWND hWnd)
{
m_bi.hwndOwner = hWnd;
}
AFX_INLINE HWND CXTPBrowseDialog::GetOwner()
{
return m_bi.hwndOwner;
}
AFX_INLINE void CXTPBrowseDialog::SetPidlRoot(LPCITEMIDLIST pidl)
{
m_bi.pidlRoot = pidl;
}
AFX_INLINE LPCITEMIDLIST CXTPBrowseDialog::GetPidlRoot()
{
return m_bi.pidlRoot;
}
AFX_INLINE void CXTPBrowseDialog::SetDisplayName(LPCTSTR szDisplayName)
{
m_bi.pszDisplayName = (LPTSTR)szDisplayName;
}
AFX_INLINE LPCTSTR CXTPBrowseDialog::GetDisplayName()
{
return m_bi.pszDisplayName;
}
AFX_INLINE void CXTPBrowseDialog::SetTitle(LPCTSTR szTitle)
{
m_bi.lpszTitle = szTitle;
}
AFX_INLINE LPCTSTR CXTPBrowseDialog::GetTitle()
{
return m_bi.lpszTitle;
}
AFX_INLINE void CXTPBrowseDialog::SetOptions(UINT uf)
{
m_bi.ulFlags = uf;
}
AFX_INLINE UINT CXTPBrowseDialog::GetOptions()
{
return m_bi.ulFlags;
}
AFX_INLINE void CXTPBrowseDialog::SetCallback(BFFCALLBACK pf)
{
m_bi.lpfn = pf;
}
AFX_INLINE BFFCALLBACK CXTPBrowseDialog::GetCallback()
{
return m_bi.lpfn;
}
AFX_INLINE void CXTPBrowseDialog::SetData(LPARAM lp)
{
m_bi.lParam = lp;
}
AFX_INLINE LPARAM CXTPBrowseDialog::GetData()
{
return m_bi.lParam;
}
AFX_INLINE LPCTSTR CXTPBrowseDialog::GetSelPath()
{
return m_szSelPath;
}
AFX_INLINE int CXTPBrowseDialog::GetImage()
{
return m_bi.iImage;
}
/** @endcond */
/** @cond */
# ifndef BIF_BROWSEINCLUDEURLS
# define BIF_BROWSEINCLUDEURLS \
0x0080 // Allow URLs to be displayed or entered. (Requires BIF_USENEWUI)
# endif
# ifndef BIF_NEWDIALOGSTYLE
# define BIF_NEWDIALOGSTYLE 0x0040 // Use the new dialog layout with the ability to resize
# endif
# ifndef BIF_NONEWFOLDERBUTTON
# define BIF_NONEWFOLDERBUTTON \
0x0200 // Do not add the "New Folder" button to the dialog. Only applicable with
// BIF_NEWDIALOGSTYLE.
# endif
# ifndef BIF_NOTRANSLATETARGETS
# define BIF_NOTRANSLATETARGETS 0x0400 // don't traverse target as shortcut
# endif
# ifndef BIF_SHAREABLE
# define BIF_SHAREABLE \
0x8000 // sharable resources displayed (remote shares, requires BIF_USENEWUI)
# endif
# ifndef BIF_UAHINT
# define BIF_UAHINT \
0x0100 // Add a UA hint to the dialog, in place of the edit box. May not be combined
// with BIF_EDITBOX
# endif
# ifndef BIF_USENEWUI
# define BIF_USENEWUI (BIF_NEWDIALOGSTYLE | BIF_EDITBOX)
# endif
/** @endcond */
# include "Common/Base/Diagnostic/XTPEnableNoisyWarnings.h"
/** @cond */
#endif // !defined(__XTPBROWSEDIALOG_H__)
/** @endcond */