/*****************************************************************/ /** 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 } #include #include // get SLE_FONT #include // get HIER_LISTBOX #include // get MRUCOMBO #include // 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_