// 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;im_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); // // 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; }