//********************************************************************* //* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1999 ** //********************************************************************* // // STATUSPN.CPP - Implementation of CIFrmStatusPane // // HISTORY: // // 9/11/99 vyung Created. // // Class which will handle the creation of an Iframe which is hosted in the mainpane. // #include #include "STATUSPN.h" #include "appdefs.h" #include "dispids.h" #include #define IMG_ITEM L"imgStatus%s" #define IMG_ACTIVE L"active.gif" #define IMG_INACTIVE L"inactive.gif" #define IMG_ACTIVE_TOP L"act_top.gif" #define IMG_INACTIVE_TOP L"inact_top.gif" //Statuspane script functions #define SCRIPTFN_ADDSTATUSITEM L"AddStatusItem(\"%s\", %i)" #define SCRIPTFN_REDRAWFORNEWCURITEM L"RedrawForNewCurrentItem(%i)" /////////////////////////////////////////////////////////// // // Creation function used by CIFrmStatusPane. // CIFrmStatusPane::CIFrmStatusPane() : m_hStatusWnd (NULL), m_pObWebBrowser (NULL), m_pDispEvent (NULL) { m_iCurrentSelection = 0; m_iTotalItems = 0; } /////////////////////////////////////////////////////////// // ~CIFrmStatusPane // CIFrmStatusPane::~CIFrmStatusPane() { } /////////////////////////////////////////////////////////// // InitStatusPane // HRESULT CIFrmStatusPane::InitStatusPane(IObWebBrowser* pObWebBrowser) { HRESULT hr = E_FAIL; if (pObWebBrowser) { m_pObWebBrowser = pObWebBrowser; } return S_OK; } /////////////////////////////////////////////////////////// // GetFrame // HRESULT CIFrmStatusPane::GetFrame(IHTMLWindow2** pFrWin) { HRESULT hr = E_FAIL; IDispatch* pDisp = NULL; IHTMLDocument2* pDoc = NULL; IHTMLDocument2* pParentDoc = NULL; IHTMLFramesCollection2* pFrColl = NULL; IHTMLWindow2* pParentWin = NULL; if (m_pObWebBrowser) { if(SUCCEEDED(m_pObWebBrowser->get_WebBrowserDoc(&pDisp)) && pDisp) { if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc)) && pDoc) { if(SUCCEEDED(pDoc->get_parentWindow(&pParentWin)) && pParentWin) { if(SUCCEEDED(pParentWin->get_document(&pParentDoc))&& pParentDoc) { if(SUCCEEDED(pParentDoc->get_frames(&pFrColl)) && pFrColl) { VARIANT varRet; VARIANTARG varg; VariantInit(&varg); V_VT(&varg) = VT_BSTR; varg.bstrVal= SysAllocString(IFRMSTATUSPANE); if(SUCCEEDED(pFrColl->item(&varg, &varRet)) && varRet.pdispVal) { if(SUCCEEDED(varRet.pdispVal->QueryInterface(IID_IHTMLWindow2, (void**)pFrWin)) && *pFrWin) { VARIANT varExec; VariantInit(&varExec); hr = S_OK; } varRet.pdispVal->Release(); varRet.pdispVal = NULL; } pFrColl->Release(); pFrColl = NULL; } pParentDoc->Release(); pParentDoc = NULL; } pParentWin->Release(); pParentWin = NULL; } pDoc->Release(); pDoc = NULL; } pDisp->Release(); pDisp = NULL; } } return hr; } /////////////////////////////////////////////////////////// // GetElement // HRESULT CIFrmStatusPane::GetElement(WCHAR* szHTMLId, IHTMLElement** lpElem) { IHTMLWindow2* pFrWin = NULL; IHTMLDocument2* pFrDoc = NULL; IHTMLElementCollection* pColl = NULL; HRESULT hr = E_FAIL; if(SUCCEEDED(GetFrame(&pFrWin)) && pFrWin) { VARIANT varExec; VariantInit(&varExec); if(SUCCEEDED(pFrWin->get_document(&pFrDoc)) && pFrDoc) { if(SUCCEEDED(pFrDoc->get_all(&pColl)) && pColl) { if (SUCCEEDED(GetElementFromCollection(pColl, szHTMLId, lpElem)) && *lpElem) { hr = S_OK; } pColl->Release(); pColl = NULL; } pFrDoc->Release(); pFrDoc = NULL; } pFrWin->Release(); pFrWin = NULL; } return hr; } /////////////////////////////////////////////////////////// // SetImageSrc // HRESULT CIFrmStatusPane::SetImageSrc(WCHAR* szID, BSTR bstrPath) { IHTMLElement* pElement = NULL; IHTMLImgElement* pImage = NULL; if(SUCCEEDED(GetElement(szID, &pElement)) && pElement) { if(SUCCEEDED(pElement->QueryInterface(IID_IHTMLImgElement, (void**)&pImage)) && pImage) { pImage->put_src(bstrPath); pImage->Release(); pImage = NULL; } pElement->Release(); pElement = NULL; } return S_OK; } /////////////////////////////////////////////////////////// // GetElementFromCollection // HRESULT CIFrmStatusPane::GetElementFromCollection(IHTMLElementCollection* pColl, WCHAR* szHTMLId, IHTMLElement** lpElem) { VARIANT varName; VARIANT varIdx; IDispatch* pDisp = NULL; HRESULT hr = E_FAIL; VariantInit(&varName); V_VT(&varName) = VT_BSTR; varIdx.vt = VT_UINT; varIdx.lVal = 0; varName.bstrVal = SysAllocString(szHTMLId); if (SUCCEEDED(pColl->item(varName, varIdx, &pDisp)) && pDisp) { if(SUCCEEDED(pDisp->QueryInterface(IID_IHTMLElement, (void**)lpElem)) && *lpElem) { hr = S_OK; } pDisp->Release(); } return hr; } /////////////////////////////////////////////////////////// // SetSelectionAttributes // HRESULT CIFrmStatusPane::SetSelectionAttributes(int iIndex, BOOL bActive) { WCHAR szimgStatus [20] = L"\0"; WCHAR szIndex [3] = L"\0"; _itow(iIndex, szIndex, 10); wsprintf(szimgStatus, IMG_ITEM, szIndex); if (1 == iIndex) { if (bActive) { SetImageSrc(szimgStatus, IMG_ACTIVE_TOP); } else { SetImageSrc(szimgStatus, IMG_INACTIVE_TOP); } } else { if (bActive) { SetImageSrc(szimgStatus, IMG_ACTIVE); } else { SetImageSrc(szimgStatus, IMG_INACTIVE); } } return S_OK; } /////////////////////////////////////////////////////////// // SelectItem // HRESULT CIFrmStatusPane::SelectItem(int iIndex) { if ((iIndex <= m_iTotalItems) && (iIndex >= OBSHEL_STATUSPANE_MINITEM)) { if (iIndex > m_iCurrentSelection) { for (int i = m_iCurrentSelection + 1; i <= iIndex; i++) { // To make the status go from Bottom to top use: // SetSelectionAttributes(m_iTotalItems - i + 1, 1); // Status goes from Top to Bottom: SetSelectionAttributes(i, 1); } } else if(iIndex < m_iCurrentSelection) { for (int i = m_iCurrentSelection; i > iIndex; i--) { // To make the status go from Bottom to top use: // SetSelectionAttributes(m_iTotalItems - i + 1, 0); // Status goes from Top to Bottom: SetSelectionAttributes(i, 0); } } // reset text colors, current item marker ptr. easier to do this in script. VARIANT varRet; WCHAR szScriptFn [MAX_PATH] = L"\0"; wsprintf(szScriptFn, SCRIPTFN_REDRAWFORNEWCURITEM, iIndex); BSTR bstrScriptFn = SysAllocString(szScriptFn); if (NULL == bstrScriptFn) { return E_OUTOFMEMORY; } ExecScriptFn(bstrScriptFn, &varRet); m_iCurrentSelection = iIndex; } return S_OK; } /////////////////////////////////////////////////////////// // AddItem // HRESULT CIFrmStatusPane::AddItem(BSTR bstrText, int iIndex) { m_iTotalItems++; VARIANT varRet; WCHAR szScriptFn [MAX_PATH] = L"\0"; wsprintf(szScriptFn, SCRIPTFN_ADDSTATUSITEM, bstrText, iIndex); BSTR bstrScriptFn = SysAllocString(szScriptFn); if (NULL == bstrScriptFn) { return E_OUTOFMEMORY; } ExecScriptFn(bstrScriptFn, &varRet); SysFreeString(bstrScriptFn); return S_OK; } /////////////////////////////////////////////////////////// // ExecScriptFn // HRESULT CIFrmStatusPane::ExecScriptFn(BSTR bstrScriptFn, VARIANT* pvarRet) { IHTMLWindow2* pFrWin = NULL; HRESULT hr = E_FAIL; if(SUCCEEDED(GetFrame(&pFrWin)) && pFrWin) { VariantInit(pvarRet); hr = pFrWin->execScript(bstrScriptFn, NULL, pvarRet); pFrWin->Release(); pFrWin = NULL; } return hr; }