//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1998 // // File: browser.h // //-------------------------------------------------------------------------- #ifndef _BROWSER_H #define _BROWSER_H /////////////////////////////////////////////////////////////////////////////// // FORWARD DECLARATIONS class CTreeNode; class CDNSBrowseItem; class CDNSFilterCombo; class CDNSBrowserDlg; class CDNSCurrContainerCombo; class CDNSChildrenListView; class CPropertyPageHolderBase; //////////////////////////////////////////////////////////////////////// // CDNSComboBoxEx : simple C++/MFC wrapper for ComboBoxEx32 control class CDNSComboBoxEx : public CWnd { public: BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID); // simple inlines CImageList* SetImageList(CImageList* pImageList); int GetCount() const; int GetCurSel() const; int SetCurSel(int nSelect); int InsertItem(const COMBOBOXEXITEM* pItem); LPARAM GetItemData(int nIndex) const; BOOL SetItemData(int nIndex, LPARAM lParam); void ResetContent(); DWORD GetExtendedStyle() const; DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle); }; ////////////////////////////////////////////////////////////////////////// // CDNSBrowseItem : proxy items for the nodes in the snapin typedef CList< CDNSBrowseItem*, CDNSBrowseItem* > CDNSBrowseItemList; class CDNSBrowseItem { public: CDNSBrowseItem() { m_nIndex = -1; m_pParent = NULL; m_pTreeNode = NULL; } ~CDNSBrowseItem() { RemoveChildren(); if (m_pTreeNode != NULL) m_pTreeNode->DecrementSheetLockCount(); } BOOL AddChild(CDNSBrowseItem* pChildBrowseItem); BOOL RemoveChildren(CDNSBrowseItem* pNotThisItem = NULL); // manipulation of CTreeNode pointer void SetTreeNode(CTreeNode* pTreeNode) { ASSERT(pTreeNode != NULL); pTreeNode->IncrementSheetLockCount(); m_pTreeNode = pTreeNode; } CTreeNode* GetTreeNode() { return m_pTreeNode;} LPCTSTR GetSelectionString(); // proxies for the CTreeNode functions int GetImageIndex(BOOL bOpenImage); LPCWSTR GetString(int nCol); BOOL IsContainer(); // Master tree manipulation routines void AddTreeNodeChildren(CDNSFilterCombo* pFilter, CComponentDataObject* pComponentDataObject); private: void AddToContainerCombo(CDNSCurrContainerCombo* pCtrl, CDNSBrowseItem* pSelectedBrowseItem, int nIndent,int* pNCurrIndex); // DATA public: int m_nIndex; // index in the container combobox, for direct lookup CDNSBrowseItem* m_pParent; // parent in the browse tree private: CTreeNode* m_pTreeNode; // pointer to the node in the snapin master tree CDNSBrowseItemList m_childList; // list if children of the current node friend class CDNSChildrenListView; friend class CDNSCurrContainerCombo; }; ////////////////////////////////////////////////////////////////////////// // CDNSFilterCombo : dropdown list with filtering options and logic // NOTICE: the ordering will be the same as the strings in the filter combobox typedef enum { // these options are for containers SERVER = 0 , ZONE_FWD, ZONE_REV, // these options are for records (leaves) RECORD_A, RECORD_CNAME, RECORD_A_AND_CNAME, RECORD_RP, RECORD_TEXT, RECORD_MB, RECORD_ALL, LAST // dummy item, just to know how many there are } DNSBrowseFilterOptionType; class CDNSFilterCombo : public CComboBox { public: CDNSFilterCombo() { m_option = LAST; } BOOL Initialize(UINT nCtrlID, UINT nIDFilterString, CDNSBrowserDlg* pDlg); void Set(DNSBrowseFilterOptionType option, LPCTSTR lpszExcludeServerName) { m_option = option; m_szExcludeServerName = lpszExcludeServerName; } DNSBrowseFilterOptionType Get() { return m_option;} void OnSelectionChange(); BOOL CanAddToUIString(UINT n); BOOL IsValidTreeNode(CTreeNode* pTreeNode); BOOL IsValidResult(CDNSBrowseItem* pBrowseItem); void GetStringOf(CDNSBrowseItem* pBrowseItem, CString& szResult); private: DNSBrowseFilterOptionType m_option; CString m_szExcludeServerName; }; ////////////////////////////////////////////////////////////////////////// // CDNSCurrContainerCombo : deals with the selection of the current container class CDNSCurrContainerCombo : public CDNSComboBoxEx { public: BOOL Initialize(UINT nCtrlID, UINT nBitmapID, CDNSBrowserDlg* pDlg); CDNSBrowseItem* GetSelection(); void InsertBrowseItem(CDNSBrowseItem* pBrowseItem, int nIndex, int nIndent); void SetTree(CDNSBrowseItem* pRootBrowseItem, CDNSBrowseItem* pSelectedBrowseItem); private: CImageList m_imageList; }; ////////////////////////////////////////////////////////////////////////// // CDNSChildrenListView : displays the list of childern for the current container class CDNSChildrenListView : public CListCtrl { public: CDNSChildrenListView() { m_pDlg = NULL;} BOOL Initialize(UINT nCtrlID, UINT nBitmapID, CDNSBrowserDlg* pDlg); void SetChildren(CDNSBrowseItem* pBrowseItem); CDNSBrowseItem* GetSelection(); private: CImageList m_imageList; CDNSBrowserDlg* m_pDlg; }; /////////////////////////////////////////////////////////////////////////////// // CDNSBrowserDlg : the browser itself class CBrowseExecContext; // fwd decl class CDNSBrowserDlg : public CHelpDialog { // Construction public: CDNSBrowserDlg(CComponentDataObject* pComponentDataObject, CPropertyPageHolderBase* pHolder, DNSBrowseFilterOptionType option, BOOL bEnableEdit = FALSE, LPCTSTR lpszExcludeServerName = NULL); ~CDNSBrowserDlg(); virtual INT_PTR DoModal(); // API's CTreeNode* GetSelection(); LPCTSTR GetSelectionString(); // Implementation protected: // message handlers and MFC overrides virtual BOOL OnInitDialog(); afx_msg void OnButtonUp(); afx_msg BOOL OnTooltip(UINT, NMHDR* pHdr, LRESULT* plRes); afx_msg void OnSelchangeComboSelNode(); afx_msg void OnDblclkListNodeItems(NMHDR* pNMHDR, LRESULT* pResult); virtual void OnOK(); virtual void OnCancel(); afx_msg void OnItemchangedListNodeItems(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnSelchangeComboFilter(); afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); DECLARE_MESSAGE_MAP() private: // internal helper functions CEdit* GetSelectionEdit(); void InitializeControls(); void InitializeToolbar(); void EnableOkButton(BOOL bEnable); void HandleOkOrDblClick(); void UpdateSelectionEdit(CDNSBrowseItem* pBrowseItem); // browse tree manipulation void InitBrowseTree(); void ReEnumerateChildren(); void ExpandBrowseTree(CDNSBrowseItem* pCurrBrowseItem, CDNSBrowseItem* pChildBrowseItem); void ContractBrowseTree(CDNSBrowseItem* pParentBrowseItem); void MoveUpHelper(CDNSBrowseItem* pNewBrowseItem); void MoveDownHelper(); void AddTreeNodeChildrenHelper(CDNSBrowseItem* pBrowseItem, CDNSFilterCombo* pFilter, BOOL bExpand = TRUE); // dialog controls CDNSCurrContainerCombo m_currContainer; CToolBarCtrl m_toolbar; CDNSChildrenListView m_childrenList; CDNSFilterCombo m_filter; // dialog data BOOL m_bEnableEdit; // enable editbox CContainerNode* m_pMasterRootNode; // root of master browsable tree CDNSBrowseItem* m_pBrowseRootItem; // root of proxy tree CDNSBrowseItem* m_pCurrSelContainer; // current container selection // final item selection CDNSBrowseItem* m_pFinalSelection; CString m_szSelectionString; // component data object pointer CComponentDataObject* m_pComponentDataObject; // porperty page holder pointer, if needed CPropertyPageHolderBase* m_pHolder; friend class CDNSChildrenListView; friend class CBrowseExecContext; friend class CDNSFilterCombo; }; #endif // _BROWSER_H