344 lines
7.9 KiB
C++
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;
|
||
|
}
|