Added a funky tree view of the web page that is built using the IE DOM interfaces

This commit is contained in:
locka%iol.ie 1999-03-28 16:00:23 +00:00
Родитель 17e409b50a
Коммит febc713a8f
4 изменённых файлов: 129 добавлений и 14 удалений

Просмотреть файл

@ -18,6 +18,8 @@ static char THIS_FILE[] = __FILE__;
#include <signal.h>
#include <stack>
void __cdecl fperr(int sig)
{
CString sError;
@ -63,6 +65,7 @@ void CBrowseDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBrowseDlg)
DDX_Control(pDX, IDC_DOMLIST, m_tcDOM);
DDX_Control(pDX, IDC_RUNTEST, m_btnRunTest);
DDX_Control(pDX, IDC_URL, m_cmbURLs);
DDX_Control(pDX, IDC_TESTLIST, m_tcTests);
@ -81,6 +84,7 @@ BEGIN_MESSAGE_MAP(CBrowseDlg, CDialog)
ON_BN_CLICKED(IDC_FORWARD, OnForward)
ON_NOTIFY(TVN_SELCHANGED, IDC_TESTLIST, OnSelchangedTestlist)
ON_NOTIFY(NM_DBLCLK, IDC_TESTLIST, OnDblclkTestlist)
ON_BN_CLICKED(IDC_REFRESHDOM, OnRefreshDOM)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@ -89,6 +93,7 @@ END_MESSAGE_MAP()
#define IL_TEST 2
#define IL_TESTFAILED 3
#define IL_TESTPASSED 4
#define IL_NODE IL_TEST
/////////////////////////////////////////////////////////////////////////////
// CBrowseDlg message handlers
@ -109,6 +114,8 @@ BOOL CBrowseDlg::OnInitDialog()
m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TEST));
m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TESTFAILED));
m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TESTPASSED));
// Create the test tree
m_tcTests.SetImageList(&m_cImageList, TVSIL_NORMAL);
for (int i = 0; i < nTestSets; i++)
{
@ -127,6 +134,9 @@ BOOL CBrowseDlg::OnInitDialog()
}
}
// Create the DOM tree
m_tcDOM.SetImageList(&m_cImageList, TVSIL_NORMAL);
// Set up some URLs. The first couple are internal
m_cmbURLs.AddString(m_szTestURL);
for (i = 0; i < sizeof(aURLs) / sizeof(aURLs[0]); i++)
@ -444,3 +454,98 @@ void CBrowseDlg::OnDblclkTestlist(NMHDR* pNMHDR, LRESULT* pResult)
OnRuntest();
*pResult = 0;
}
struct _ElementPos
{
HTREEITEM m_htiParent;
CIPtr(IHTMLElementCollection) m_cpElementCollection;
int m_nIndex;
_ElementPos(HTREEITEM htiParent, IHTMLElementCollection *pElementCollection, int nIndex)
{
m_htiParent = htiParent;
m_cpElementCollection = pElementCollection;
m_nIndex = nIndex;
}
_ElementPos()
{
}
};
void CBrowseDlg::OnRefreshDOM()
{
m_tcDOM.DeleteAllItems();
std::stack<_ElementPos> cStack;
CComPtr<IUnknown> cpUnkPtr;
m_pControlSite->GetControlUnknown(&cpUnkPtr);
CIPtr(IWebBrowserApp) cpWebBrowser = cpUnkPtr;
if (cpWebBrowser == NULL)
{
return;
}
CIPtr(IDispatch) cpDispDocument;
cpWebBrowser->get_Document(&cpDispDocument);
if (cpDispDocument == NULL)
{
return;
}
// Recurse the DOM, building a tree
CIPtr(IHTMLDocument2) cpDocElement = cpDispDocument;
CIPtr(IHTMLElementCollection) cpColl;
HRESULT hr = cpDocElement->get_all( &cpColl );
cStack.push(_ElementPos(NULL, cpColl, 0));
while (!cStack.empty())
{
// Pop next position from stack
_ElementPos pos = cStack.top();
cStack.pop();
// Iterate through elemenets in collection
LONG nElements = 0;;
pos.m_cpElementCollection->get_length(&nElements);
for (int i = pos.m_nIndex; i < nElements; i++ )
{
CComVariant vName(i);
CComVariant vIndex;
CIPtr(IDispatch) cpDisp;
hr = pos.m_cpElementCollection->item( vName, vIndex, &cpDisp );
if ( hr != S_OK )
{
continue;
}
CIPtr(IHTMLElement) cpElem = cpDisp;
if (cpElem == NULL)
{
continue;
}
// Get tag name
BSTR bstrTagName = NULL;
hr = cpElem->get_tagName(&bstrTagName);
CString szTagName = bstrTagName;
SysFreeString(bstrTagName);
// Add an icon to the tree
HTREEITEM htiParent = m_tcDOM.InsertItem(szTagName, IL_CLOSEDFOLDER, IL_CLOSEDFOLDER, pos.m_htiParent);
CIPtr(IDispatch) cpDispColl;
hr = cpElem->get_children(&cpDispColl);
if (hr == S_OK)
{
CIPtr(IHTMLElementCollection) cpChildColl = cpDispColl;
cStack.push(_ElementPos(pos.m_htiParent, pos.m_cpElementCollection, pos.m_nIndex + 1));
cStack.push(_ElementPos(htiParent, cpChildColl, 0));
break;
}
}
}
}

Просмотреть файл

@ -32,6 +32,7 @@ public:
// Dialog Data
//{{AFX_DATA(CBrowseDlg)
enum { IDD = IDD_CBROWSE_DIALOG };
CTreeCtrl m_tcDOM;
CButton m_btnRunTest;
CComboBox m_cmbURLs;
CTreeCtrl m_tcTests;
@ -62,6 +63,7 @@ protected:
afx_msg void OnForward();
afx_msg void OnSelchangedTestlist(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnDblclkTestlist(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnRefreshDOM();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

Просмотреть файл

@ -96,29 +96,34 @@ END
// Dialog
//
IDD_CBROWSE_DIALOG DIALOGEX 0, 0, 477, 318
IDD_CBROWSE_DIALOG DIALOGEX 0, 0, 507, 318
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "CBrowse"
FONT 8, "MS Sans Serif"
BEGIN
RTEXT "Goto &URL:",IDC_STATIC,6,8,35,10
DEFPUSHBUTTON "&Go",IDC_GO,230,7,25,13
CONTROL "",IDC_BROWSER_MARKER,"Static",SS_BLACKFRAME,7,24,310,
DEFPUSHBUTTON "&Go",IDC_GO,172,7,25,13
CONTROL "",IDC_BROWSER_MARKER,"Static",SS_BLACKFRAME,7,24,252,
205
PUSHBUTTON "Run",IDC_RUNTEST,325,296,50,14,WS_DISABLED
LISTBOX IDC_LISTMESSAGES,7,247,310,63,WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Run",IDC_RUNTEST,271,289,50,14,WS_DISABLED
LISTBOX IDC_LISTMESSAGES,7,247,252,63,WS_VSCROLL | WS_TABSTOP
LTEXT "Messages:",IDC_STATIC,7,233,110,11
CONTROL "Tree1",IDC_TESTLIST,"SysTreeView32",TVS_HASBUTTONS |
TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS |
TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,330,16,134,222
GROUPBOX "Tests",IDC_STATIC,324,7,146,237
COMBOBOX IDC_URL,45,7,180,52,CBS_DROPDOWNLIST | WS_VSCROLL |
TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,271,16,100,211
GROUPBOX "Tests",IDC_STATIC,265,7,112,303
COMBOBOX IDC_URL,45,7,117,52,CBS_DROPDOWNLIST | WS_VSCROLL |
WS_TABSTOP
PUSHBUTTON "<",IDC_BACKWARD,261,7,25,13
PUSHBUTTON ">",IDC_FORWARD,292,7,25,13
GROUPBOX "Test Description",IDC_STATIC,324,246,146,45
LTEXT "",IDC_TESTDESCRIPTION,328,258,137,28
PUSHBUTTON "<",IDC_BACKWARD,203,7,25,13
PUSHBUTTON ">",IDC_FORWARD,234,7,25,13
GROUPBOX "Test Description",IDC_STATIC,271,234,100,49
LTEXT "",IDC_TESTDESCRIPTION,276,245,90,33
GROUPBOX "DOM",IDC_STATIC,388,7,112,303
CONTROL "Tree1",IDC_DOMLIST,"SysTreeView32",TVS_HASBUTTONS |
TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS |
TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,394,16,100,211
PUSHBUTTON "Refresh",IDC_REFRESHDOM,394,289,50,14
END
@ -176,9 +181,10 @@ BEGIN
IDD_CBROWSE_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 470
RIGHTMARGIN, 500
TOPMARGIN, 7
BOTTOMMARGIN, 310
HORZGUIDE, 206
END
END
#endif // APSTUDIO_INVOKED

Просмотреть файл

@ -22,6 +22,8 @@
#define IDC_FORWARD 1009
#define IDC_TESTDESCRIPTION 1010
#define IDC_TESTURL 1011
#define IDC_DOMLIST 1012
#define IDC_REFRESHDOM 1013
// Next default values for new objects
//
@ -29,7 +31,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 135
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1012
#define _APS_NEXT_CONTROL_VALUE 1014
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif