windows-nt/Source/XPSP1/NT/enduser/stuff/hhctrl/highlite.cpp
2020-09-26 16:20:57 +08:00

344 lines
7.9 KiB
C++

// HIGHLITE.CPP : implementation file
//
// by DougO
//
#include "header.h"
#include "stdio.h"
#include "string.h"
#include "TCHAR.h"
//#include "cprint.h"
#include "secwin.h"
#include "contain.h"
#include "collect.h"
#include "hhtypes.h"
#include "toc.h"
#include "fts.h"
#include "highlite.h"
#include "hhctrl.h"
#define HIGHLIGHT_TIMEOUT 6000
/////////////////////////////////////////////////////////////////////////////
// CSearchHighlight HighlightTerm
//
BOOL CSearchHighlight::HighlightTerm(IHTMLDocument2* pHTMLDocument2, WCHAR *pTerm)
{
HRESULT hr;
if(!pTerm || !*pTerm)
return FALSE;
BSTR pSearchTerm = SysAllocString(pTerm);
IHTMLBodyElement* pBodyElement;
IHTMLElement *pElement;
// get the document element from the document
//
if(FAILED(hr = pHTMLDocument2->get_body(&pElement)))
return FALSE;
if(FAILED(hr = pElement->QueryInterface(IID_IHTMLBodyElement, (void **)&pBodyElement)))
{
pElement->Release();
return FALSE;
}
IHTMLTxtRange *pBeginRange = NULL;
// Create the initial text range
//
if(FAILED(hr = pBodyElement->createTextRange(&pBeginRange)))
{
pBodyElement->Release();
pElement->Release();
return FALSE;
}
VARIANT_BOOL vbRet = VARIANT_TRUE;
VARIANT_BOOL bUI = VARIANT_FALSE;
VARIANT vBackColor, vForeColor;
BSTR bstrCmd = SysAllocString(L"BackColor");
BSTR bstrCmd2 = SysAllocString(L"ForeColor");
vBackColor.vt = vForeColor.vt = VT_I4;
vForeColor.lVal = GetSysColor(COLOR_HIGHLIGHTTEXT);
vBackColor.lVal = GetSysColor(COLOR_HIGHLIGHT);
long lret = 0;
DWORD dwRet = TRUE;
DWORD dwStartTickCount = GetTickCount();
while(vbRet == VARIANT_TRUE)
{
if(FAILED(hr = pBeginRange->findText(pSearchTerm,1000000,2,&vbRet)))
break;
if(vbRet == VARIANT_TRUE)
{
if(FAILED(hr = pBeginRange->execCommand(bstrCmd2, VARIANT_FALSE, vForeColor, &bUI)))
{
dwRet = FALSE;
break;
}
if(GetTickCount() > (dwStartTickCount + HIGHLIGHT_TIMEOUT))
{
dwRet = FALSE;
break;
}
if(FAILED(hr = pBeginRange->execCommand(bstrCmd, VARIANT_FALSE, vBackColor, &bUI)))
{
dwRet = FALSE;
break;
}
if(GetTickCount() > (dwStartTickCount + HIGHLIGHT_TIMEOUT))
{
dwRet = FALSE;
break;
}
if(FAILED(hr = pBeginRange->collapse(FALSE)))
{
dwRet = FALSE;
break;
}
if(GetTickCount() > (dwStartTickCount + HIGHLIGHT_TIMEOUT))
{
dwRet = FALSE;
break;
}
}
}
SysFreeString(bstrCmd);
SysFreeString(bstrCmd2);
SysFreeString(pSearchTerm);
pBodyElement->Release();
pElement->Release();
pBeginRange->Release();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchHighlight
//
CSearchHighlight::CSearchHighlight(CExCollection *pTitleCollection)
{
m_pTitleCollection = pTitleCollection;
m_iJumpIndex = 0;
m_pTermList = NULL;
m_bHighlightEnabled = !g_fIE3;
m_Initialized = TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchHighlight constructor
//
CSearchHighlight::~CSearchHighlight()
{
}
/////////////////////////////////////////////////////////////////////////////
// CSearchHighlight HighlightDocument
//
int CSearchHighlight::HighlightDocument(LPDISPATCH lpDispatch)
{
CHourGlass wait;
if(!m_bHighlightEnabled)
return FALSE;
if ( lpDispatch != NULL )
{
// request the "document" object from the object
//
IHTMLDocument2* pHTMLDocument2;
// If this fails, then we are probably running on IE3
//
if(FAILED(lpDispatch->QueryInterface(IID_IHTMLDocument2, (void **)&pHTMLDocument2)))
return FALSE;
int i, cTerms = m_pTitleCollection->m_pFullTextSearch->GetHLTermCount();
DWORD dwStartTickCount = GetTickCount();
for(i=0;i<cTerms;++i)
{
if(!HighlightTerm(pHTMLDocument2,m_pTitleCollection->m_pFullTextSearch->GetHLTermAt(i)))
{
pHTMLDocument2->Release();
return TRUE;
}
if(GetTickCount() > (dwStartTickCount + HIGHLIGHT_TIMEOUT))
break;
}
pHTMLDocument2->Release();
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchHighlight enable highlight
//
// bStatus:
// TRUE = Highlighting Enabled
// FALSE = Highlighting Disabled
//
void CSearchHighlight::EnableHighlight(BOOL bStatus)
{
m_bHighlightEnabled = bStatus;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchHighlight jump to first highlight term
//
HRESULT CSearchHighlight::JumpFirst(void)
{
// DOUG TODO
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchHighlight jump to next highlight term
//
HRESULT CSearchHighlight::JumpNext(void)
{
// DOUG TODO
return S_OK;
}
// DoF1Lookup
//
// Get current selection in mshtml and perform a F1 lookup
//
void DoF1Lookup(IWebBrowserAppImpl* pWBApp)
{
LPDISPATCH lpDispatch;
if ( pWBApp && (lpDispatch = pWBApp->GetDocument()) )
{
WCHAR *pText = GetSelectionText(lpDispatch);
if(pText)
{
char szTerm[512] = "";
WideCharToMultiByte(CP_ACP, 0, pText, -1, szTerm, sizeof(szTerm), NULL, NULL);
SysFreeString(pText);
//
// <mc> Find a CExCollection pointer...
//
CExCollection* pExCollection = NULL;
CStr cstr;
pWBApp->GetLocationURL(&cstr);
pExCollection = GetCurrentCollection(NULL, (PCSTR)cstr);
OnWordWheelLookup(szTerm, pExCollection);
}
lpDispatch->Release();
}
}
WCHAR * GetSelectionText(LPDISPATCH lpDispatch)
{
if(lpDispatch)
{
HRESULT hr;
IHTMLSelectionObject *pSelection;
// request the "document" object from the object
//
IHTMLDocument2* pHTMLDocument2;
// If this fails, then we are probably running on IE3
//
if(FAILED(lpDispatch->QueryInterface(IID_IHTMLDocument2, (void **)&pHTMLDocument2)))
return NULL;
if(FAILED(hr = pHTMLDocument2->get_selection(&pSelection)))
{
pHTMLDocument2->Release();
return NULL;
}
IHTMLTxtRange *pBeginRange = NULL;
LPDISPATCH lpRangeDispatch;
BSTR bstr = NULL;
if ( (hr = pSelection->get_type( &bstr )) != S_OK )
{
pHTMLDocument2->Release();
pSelection->Release();
return NULL;
}
if( (bstr == NULL) || wcscmp(bstr,L"Text") )
{
pHTMLDocument2->Release();
pSelection->Release();
SysFreeString( bstr );
return NULL;
}
SysFreeString( bstr );
// Create the initial text range
//
if(FAILED(hr = pSelection->createRange(&lpRangeDispatch)))
{
pSelection->Release();
pHTMLDocument2->Release();
return NULL;
}
if(FAILED(lpRangeDispatch->QueryInterface(IID_IHTMLTxtRange, (void **)&pBeginRange)))
{
pSelection->Release();
pHTMLDocument2->Release();
return NULL;
}
BSTR pSelectedText;
pBeginRange->get_text(&pSelectedText);
pSelection->Release();
pHTMLDocument2->Release();
pBeginRange->Release();
if(!pSelectedText)
return NULL;
if(*pSelectedText == NULL)
{
SysFreeString(pSelectedText);
return NULL;
}
return pSelectedText;
}
else
return NULL;
}