windows-nt/Source/XPSP1/NT/admin/netui/mprui/h/mprbrows.hxx
2020-09-26 16:20:57 +08:00

545 lines
15 KiB
C++

/*****************************************************************/
/** Microsoft Windows NT **/
/** Copyright(c) Microsoft Corp., 1991, 1992 **/
/*****************************************************************/
/*
* mprbrows.hxx
*
* History:
* Yi-HsinS 09-Nov-1992 Created
* Yi-HsinS 01-Mar-1993 Added support for multithreading
*
*/
#ifndef _MPRBROWS_HXX_
#define _MPRBROWS_HXX_
extern "C" {
#include <mpr.h>
}
#include <mprdev.hxx>
#include <fontedit.hxx> // get SLE_FONT
#include <hierlb.hxx> // get HIER_LISTBOX
#include <mrucombo.hxx> // get MRUCOMBO
#include <mprthred.hxx> // get MPR_ENUM_THREAD
class MPR_HIER_LISTBOX;
class MPR_LBI_CACHE;
/*************************************************************************
NAME: MPR_LBI
SYNOPSIS: Hierarchical listbox LBI
INTERFACE:
PARENT: HIER_LBI
USES: NLS_STR
CAVEATS:
NOTES:
HISTORY:
Johnl 21-Jan-1992 Commented, cleaned up
beng 22-Apr-1992 Change in LBI::Paint protocol
Yi-HsinS 09-Nov-1992 Added _fRefreshNeeded and methods
**************************************************************************/
class MPR_LBI : public HIER_LBI
{
private:
NETRESOURCE _netres;
NLS_STR _nlsDisplayName; // Name formatted by the provider
BOOL _fRefreshNeeded;
protected:
virtual VOID Paint( LISTBOX * plb, HDC hdc, const RECT * prect,
GUILTT_INFO * pGUILTT ) const ;
virtual WCHAR QueryLeadingChar() const;
public:
MPR_LBI( LPNETRESOURCE lpnetresource );
~MPR_LBI();
LPNETRESOURCE QueryLPNETRESOURCE( void )
{ return &_netres; }
const TCHAR * QueryRemoteName( void ) const
{ return _netres.lpRemoteName; }
const TCHAR * QueryLocalName( void ) const
{ return _netres.lpLocalName; }
const TCHAR * QueryComment( void ) const
{ return _netres.lpComment ; }
const TCHAR * QueryDisplayName( void ) const
{ return _nlsDisplayName.QueryPch() ; }
const DWORD QueryDisplayType( void ) const
{ return _netres.dwDisplayType ; }
UINT QueryType( void ) const
{ return _netres.dwType; }
BOOL IsSearchDialogSupported( void ) const ;
BOOL IsContainer( void ) const ;
BOOL IsConnectable( void ) const ;
BOOL IsProvider( VOID ) const;
BOOL IsRefreshNeeded( VOID ) const
{ return _fRefreshNeeded; }
VOID SetRefreshNeeded( BOOL fRefreshNeeded )
{ _fRefreshNeeded = fRefreshNeeded; }
virtual INT Compare( const LBI * plbi ) const;
}; // class MPR_LBI
/*************************************************************************
NAME: MPR_HIER_LISTBOX
SYNOPSIS: MPR specific hierarchical list box. Contains the providers
and containers/connections.
INTERFACE:
PARENT: HIER_LISTBOX
USES: DISPLAY_MAP
CAVEATS:
NOTES:
HISTORY:
Johnl 21-Jan-1992 Commented, cleaned up
Yi-HsinS 09-Nov-1992 Added FindItem, FindNextProvider
**************************************************************************/
class MPR_HIER_LISTBOX : public HIER_LISTBOX
{
private:
DISPLAY_MAP _dmapGeneric ; // ie unexpanded
DISPLAY_MAP _dmapGenericExpanded ;
DISPLAY_MAP _dmapGenericNoExpand ; // cannot expand
DISPLAY_MAP _dmapProvider ; // ie unexpanded
DISPLAY_MAP _dmapProviderExpanded ;
DISPLAY_MAP _dmapDomain ; // ie unexpanded
DISPLAY_MAP _dmapDomainExpanded ;
DISPLAY_MAP _dmapDomainNoExpand ; // cannot expand
DISPLAY_MAP _dmapServer ; // ie unexpanded
DISPLAY_MAP _dmapServerExpanded ;
DISPLAY_MAP _dmapServerNoExpand ; // cannot expand
DISPLAY_MAP _dmapShare ; // ie unexpanded
DISPLAY_MAP _dmapShareExpanded ;
DISPLAY_MAP _dmapShareNoExpand ; // cannot expand
DISPLAY_MAP _dmapFile ; // ie unexpanded
DISPLAY_MAP _dmapFileExpanded ;
DISPLAY_MAP _dmapFileNoExpand ; // cannot expand
DISPLAY_MAP _dmapTree ; // ie unexpanded
DISPLAY_MAP _dmapTreeExpanded ;
DISPLAY_MAP _dmapTreeNoExpand ; // cannot expand
DISPLAY_MAP _dmapGroup ; // ie unexpanded
DISPLAY_MAP _dmapGroupExpanded ;
DISPLAY_MAP _dmapGroupNoExpand ; // cannot expand
/* This is the column width table. When an LBI is requested to be painted,
* it copies this table then adjusts the fields appropriately
* depending on the indentation level of the LBI.
*/
UINT _adxColumns[4] ;
//
// Set by CalcMaxHorizontalExtent, contains the number of pels in the
// offset of the deepest (most indented) node. Need to adjust
// container column width with this so the comments will line up.
//
UINT _nMaxPelIndent ;
/* Indicates whether we are listing printers or drives
*/
UINT _uiType;
/* The average character width
*/
INT _nAveCharWidth;
protected:
virtual APIERR AddChildren( HIER_LBI * phlbi );
void SetMaxPelIndent( UINT nMaxPelIndent )
{ _nMaxPelIndent = nMaxPelIndent ; }
public:
MPR_HIER_LISTBOX( OWNER_WINDOW * powin, CID cid, UINT uiType );
~MPR_HIER_LISTBOX() ;
/* Enumerates the network resources in this listbox using the
* parameters (suitable for passing to WNetOpenEnum) and enumerating
* them under the passed LBI.
*/
DISPLAY_MAP * QueryDisplayMap( BOOL fIsContainer,
BOOL fIsExpanded,
DWORD dwDisplayType,
BOOL fIsProvider) ;
UINT * QueryColWidthArray( void )
{ return _adxColumns ; }
UINT QueryType( VOID ) const
{ return _uiType; }
/* Find an item that is on the given indentation level
* and matches the string.
*/
INT FindItem( const TCHAR *psz, INT nLevel );
/* Find the next top-level item ( provider) starting from the given index
*/
INT FindNextProvider( INT iStart );
/* Return the average char width
*/
INT QueryAveCharWidth( VOID ) const
{ return _nAveCharWidth; }
void CalcMaxHorizontalExtent( void ) ;
UINT QueryMaxPelIndent( void ) const
{ return _nMaxPelIndent ; }
}; // class MPR_HIER_LISTBOX
/*************************************************************************
NAME: MPR_BROWSE_BASE
SYNOPSIS: Base MPR dialog class
INTERFACE:
PARENT: DIALOG_WINDOW
USES: SLT, BLT_LISTBOX, MPR_HIER_LISTBOX
CAVEATS:
NOTES:
HISTORY:
Johnl 21-Jan-1992 Commented, cleaned up, broke into hierarchy
to support separate connection dialogs
Yi-HsinS 09-Nov-1992 Added support for expanding logon domain at
startup
**************************************************************************/
class MPR_BROWSE_BASE : public DIALOG_WINDOW
{
private:
SLT _sltShowLBTitle ;
MPR_HIER_LISTBOX _mprhlbShow; // Server/provider browser
CHECKBOX _boxExpandDomain;
SLE_FONT _sleGetInfo; // Always disabled
PUSH_BUTTON _buttonOK ;
PUSH_BUTTON _buttonSearch ;
// Indicates whether we are listing printers or drives
UINT _uiType;
// Second thread object to retrieve the data
MPR_ENUM_THREAD *_pMprEnumThread;
// Are there any providers that support SearchDialog?
BOOL _fSearchDialogUsed ;
// The name of the Provider to expand
NLS_STR _nlsProviderToExpand;
// The domain the workstation is in
NLS_STR _nlsWkstaDomain;
// help related stuff if passed in
NLS_STR _nlsHelpFile ;
DWORD _nHelpContext ;
//
// As an optimization, the last connectable resource selected by the user
// from the resource listbox is stored here, thus
// when DoConnect is called, the provider information can be provided
// (useful when connecting to non-primary provider). The
// _nlsLastNetPath member must match the resource being connected to,
// else NULL is used for the provider.
//
NLS_STR _nlsLastProvider ;
NLS_STR _nlsLastNetPath ;
protected:
virtual const TCHAR *QueryHelpFile( ULONG nHelpContext );
UINT QueryType( void ) const
{ return _uiType ; }
virtual BOOL OnOK( void ) ;
virtual BOOL OnCommand( const CONTROL_EVENT & event );
virtual BOOL OnUserMessage( const EVENT & event );
virtual BOOL MayRun( VOID );
MPR_HIER_LISTBOX * QueryShowLB( void )
{ return &_mprhlbShow ; }
PUSH_BUTTON * QueryOKButton( void )
{ return &_buttonOK ; }
virtual VOID SetFocusToNetPath( VOID ) = 0;
virtual VOID SetNetPathString( const TCHAR *pszPath ) = 0;
virtual VOID ClearNetPathString( VOID ) = 0;
virtual APIERR OnShowResourcesChange( BOOL fEnumChildren = FALSE );
VOID SetLastProviderInfo( const TCHAR * pszProvider,
const TCHAR * pszNetPath )
{ _nlsLastProvider = pszProvider ; _nlsLastNetPath = pszNetPath ; }
const TCHAR * QueryLastProvider( VOID )
{ return _nlsLastProvider.QueryPch() ; }
const TCHAR * QueryLastNetPath( VOID )
{ return _nlsLastNetPath.QueryPch() ; }
/* Get the user's logged on domain
*/
APIERR QueryWkstaDomain( NLS_STR *pnlsWkstaDomain );
/* Get the name of provider to expand
*/
APIERR QueryProviderToExpand( NLS_STR *pnlsProvider, BOOL *pfIsNT );
/* Expand the item given
*/
BOOL Expand( const TCHAR *psz,
INT nLevel,
MPR_LBI_CACHE *pcache,
BOOL fTopIndex = FALSE );
/* Get and expand the logon domain in the listbox if needed
*/
APIERR InitializeLbShow( VOID );
/*
* Return the supplied helpfile name if any
*/
const TCHAR *QuerySuppliedHelpFile( VOID )
{ return _nlsHelpFile.QueryPch() ; }
/*
* Return the supplied help context if any
*/
DWORD QuerySuppliedHelpContext( VOID )
{ return _nHelpContext ; }
/*
* call a provider's search dialog
*/
void CallSearchDialog( MPR_LBI *pmprlbi ) ;
/*
* Show search dialog on double click if the provider does not support
* WNNC_ENUM_GLOBAL but supports search dialog
*/
BOOL ShowSearchDialogOnDoubleClick( MPR_LBI *pmprlbi );
/*
* Enable and show the listbox
*/
VOID ShowMprListbox( BOOL fShow );
/*
* check and set the ExpandDomain bit in user profile
*/
BOOL IsExpandDomain( VOID );
BOOL SetExpandDomain(BOOL fSave);
/* Protected constructor so only leaf nodes can be constructed.
*/
MPR_BROWSE_BASE( const TCHAR *pszDialogName,
HWND hwndOwner,
DEVICE_TYPE devType,
TCHAR *pszHelpFile,
DWORD nHelpIndex) ;
~MPR_BROWSE_BASE();
}; // class MPR_BROWSE_BASE
/*************************************************************************
NAME: MPR_BROWSE_DIALOG
SYNOPSIS:
INTERFACE:
PARENT: DIALOG_WINDOW
USES:
CAVEATS:
NOTES:
HISTORY:
Yi-HsinS 09-Nov-1992 Created
**************************************************************************/
class MPR_BROWSE_DIALOG : public MPR_BROWSE_BASE
{
private:
SLE _sleNetPath;
NLS_STR *_pnlsPath;
PFUNC_VALIDATION_CALLBACK _pfuncValidation;
protected:
virtual ULONG QueryHelpContext( VOID );
virtual BOOL OnOK( VOID );
public:
MPR_BROWSE_DIALOG( HWND hwndOwner,
DEVICE_TYPE devType,
TCHAR *pszHelpFIle,
DWORD nHelpIndex,
NLS_STR *pnlsPath,
PFUNC_VALIDATION_CALLBACK pfuncValidation );
~MPR_BROWSE_DIALOG();
virtual VOID SetFocusToNetPath( VOID )
{ _sleNetPath.ClaimFocus(); }
virtual VOID SetNetPathString( const TCHAR *pszPath )
{ _sleNetPath.SetText( pszPath ); }
virtual VOID ClearNetPathString( VOID )
{ _sleNetPath.ClearText(); }
};
/*************************************************************************
NAME: MPR_LBI_CACHE
SYNOPSIS: Simple container class for storing and sorting MPR_LBIs
PARENT: BASE
NOTES: Ownership of the LBI's memory is transferred to here, then
to the listbox.
HISTORY:
Johnl 27-Jan-1993 Created
YiHsinS 01-Mar-1993 Added FindItem, DeleteAllItems
**************************************************************************/
class MPR_LBI_CACHE : public BASE
{
private:
INT _cItems ; // Items in array
INT _cMaxItems ; // Size of array
BUFFER _buffArray ; // Memory for the array
static int __cdecl CompareLbis( const void * p0,
const void * p1 ) ;
public:
MPR_LBI_CACHE( INT cInitialItems = 100 ) ;
~MPR_LBI_CACHE() ;
//
// Behaves just like LISTBOX::AddItem
//
APIERR AppendItem( MPR_LBI * plbi ) ;
INT FindItem( const TCHAR *psz ) ;
VOID DeleteAllItems( VOID );
void Sort( void ) ;
INT QueryCount( void ) const
{ return _cItems ; }
MPR_LBI * * QueryPtr( void )
{ return (MPR_LBI**) _buffArray.QueryPtr() ; }
} ;
/* The following are support for multithreading.
* WM_LB_FILLED is the message sent by the worker thread to the dialog.
* MPR_RETURN_CACHE is the structure sent by the worker thread that
* contains the data needed.
*/
#define WM_LB_FILLED (WM_USER + 118)
typedef struct {
MPR_LBI_CACHE *pcacheDomain; // Contains the list of domains
MPR_LBI_CACHE *pcacheServer; // Contains the list of servers
} MPR_RETURN_CACHE;
/* Worker routine that does the actual enumeration. ( WNetOpenEnum,
* WNetEnumResource ). Result are either added into the listbox
* ( if pmprlb is not NULL ) or returned in a buffer MPR_LBI_CACHE
* ( if pmprlb is NULL ).
*/
APIERR EnumerateShow( HWND hwndOwner,
UINT uiScope,
UINT uiType,
UINT uiUsage,
LPNETRESOURCE lpNetResource,
MPR_LBI *pmprlbi,
MPR_HIER_LISTBOX *pmprlb,
BOOL fDeleteChildren = FALSE,
BOOL *pfSearchDialogUsed = NULL,
MPR_LBI_CACHE **ppmprlbicache = NULL );
#endif // _MPRBROWS_HXX_