545 lines
15 KiB
C++
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_
|