// Compont.cpp : Implementation of CComponent #include "stdafx.h" #include "BOMSnap.h" #include "ScopeNode.h" #include "CompData.h" #include "Compont.h" #include "qryitem.h" #include #include // Toolbar button data (must match bitmap order in res\toolbar.bmp) static struct { int iMenuID; int iTextID; int iTipTextID; } ToolbarBtns[] = { { MID_EDITQUERY, BTN_EDITQUERY, TIP_EDITQUERY }, { MID_STOPQUERY, BTN_STOPQUERY, TIP_STOPQUERY } }; ///////////////////////////////////////////////////////////////////////////// // CComponent STDMETHODIMP CComponent::Initialize(LPCONSOLE lpConsole) { VALIDATE_POINTER(lpConsole); ASSERT(lpConsole != NULL); if (lpConsole == NULL) return E_INVALIDARG; m_spConsole = lpConsole; m_spResultData = lpConsole; m_spHeaderCtrl = lpConsole; ASSERT(m_spHeaderCtrl != NULL); ASSERT(m_spResultData != NULL); return S_OK; } STDMETHODIMP CComponent::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param) { IBOMObjectPtr spObj = lpDataObject; if (spObj == NULL) { // until special notifications handled return S_FALSE; } HRESULT hr = S_OK; if (event == MMCN_SHOW) { // if selecting node if (arg) { m_spCurScopeNode = static_cast((IBOMObject*)spObj); hr = m_spCurScopeNode->AttachComponent(this); } else { if (m_spCurScopeNode != NULL) { m_spCurScopeNode->DetachComponent(this); m_spCurScopeNode = NULL; } m_vRowItems.clear(); } } else { hr = spObj->Notify(m_spConsole, event, arg, param); } return hr; } HRESULT CComponent::AddMenuItems(LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK pCallback, long* plAllowed) { IBOMObjectPtr spObj = pDataObject; if (spObj == NULL) return E_INVALIDARG; return spObj->AddMenuItems(pCallback, plAllowed); } HRESULT CComponent::Command(long lCommand, LPDATAOBJECT pDataObject) { IBOMObjectPtr spObj = pDataObject; if (spObj == NULL) return E_INVALIDARG; return spObj->MenuCommand(m_spConsole, lCommand); } HRESULT CComponent::QueryPagesFor(LPDATAOBJECT pDataObject) { IBOMObjectPtr spObj = pDataObject; if (spObj == NULL) return E_INVALIDARG; return spObj->QueryPagesFor(); } HRESULT CComponent::CreatePropertyPages(LPPROPERTYSHEETCALLBACK pProvider, LONG_PTR handle, LPDATAOBJECT pDataObject) { IBOMObjectPtr spObj = pDataObject; if (spObj == NULL) return E_INVALIDARG; return spObj->CreatePropertyPages(pProvider, handle); } HRESULT CComponent::GetWatermarks(LPDATAOBJECT pDataObject, HBITMAP* phWatermark, HBITMAP* phHeader, HPALETTE* phPalette, BOOL* bStreach) { IBOMObjectPtr spObj = pDataObject; if (spObj == NULL) return E_INVALIDARG; return spObj->GetWatermarks(phWatermark, phHeader, phPalette, bStreach); } HRESULT CComponent::SetControlbar(LPCONTROLBAR pControlbar) { HRESULT hr; if (pControlbar != NULL) { m_spControlbar = pControlbar; if (m_spToolbar == NULL) { hr = pControlbar->Create(TOOLBAR, this, (LPUNKNOWN*)&m_spToolbar); ASSERT(SUCCEEDED(hr)); if (m_spToolbar != NULL) { CBitmap bmpToolbar; bmpToolbar.LoadBitmap(IDB_TOOLBAR); ASSERT(bmpToolbar); if (bmpToolbar) { hr = m_spToolbar->AddBitmap(lengthof(ToolbarBtns), bmpToolbar, 16, 16, RGB(255,0,255)); ASSERT(SUCCEEDED(hr)); if (SUCCEEDED(hr)) { MMCBUTTON btn; btn.fsState = 0; btn.fsType = TBSTYLE_BUTTON; for (int iBtn=0; iBtn < lengthof(ToolbarBtns); iBtn++) { CString strBtnText; strBtnText.LoadString(ToolbarBtns[iBtn].iTextID); CString strTipText; strTipText.LoadString(ToolbarBtns[iBtn].iTipTextID); btn.nBitmap = iBtn; btn.idCommand = ToolbarBtns[iBtn].iMenuID; btn.lpButtonText = const_cast((LPCWSTR)strBtnText); btn.lpTooltipText = const_cast((LPCWSTR)strTipText); hr = m_spToolbar->InsertButton(iBtn, &btn); ASSERT(SUCCEEDED(hr)); } } } } } } else { if (m_spControlbar != NULL && m_spToolbar != NULL) m_spControlbar->Detach(m_spToolbar); } return S_OK; } HRESULT CComponent::ControlbarNotify (MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param) { HRESULT hr = S_FALSE; switch(event) { case MMCN_SELECT: // if selecting, update toolbar if (HIWORD(arg)) { IBOMObjectPtr spObj = reinterpret_cast(param); if (spObj == NULL) break; ASSERT(m_spControlbar != NULL && m_spToolbar != NULL); // Let selected object set buttons // Show/hide toolbar based on return value m_spControlbar->Attach(TOOLBAR, m_spToolbar); if (spObj->SetToolButtons(m_spToolbar) != S_OK) m_spControlbar->Detach(m_spToolbar); } hr = S_OK; break; case MMCN_BTN_CLICK: IBOMObjectPtr spObj = reinterpret_cast(arg); if (spObj == NULL) break; // treat button click as corresponding menu item hr = spObj->MenuCommand(m_spConsole, param); break; } return hr; } HRESULT CComponent::Destroy(MMC_COOKIE cookie) { m_spConsole = NULL; m_spResultData = NULL; m_spControlbar = NULL; m_spHeaderCtrl = NULL; m_spToolbar = NULL; m_spCurScopeNode = NULL; return S_OK; } STDMETHODIMP CComponent::GetResultViewType(MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions) { CScopeNode* pNode = m_pCompData->CookieToScopeNode(cookie); if (pNode == NULL) return E_INVALIDARG; return pNode->GetResultViewType(ppViewType, pViewOptions); } STDMETHODIMP CComponent::QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject) { if (type == CCT_RESULT) { if ( (m_spCurScopeNode == NULL) || (cookie < 0) || (cookie >= m_vRowItems.size()) ) { return E_INVALIDARG; } CQueryableNode* pQNode = dynamic_cast(m_spCurScopeNode.p); if (pQNode == NULL) return E_UNEXPECTED; CComObject* pItem; HRESULT hr = CComObject::CreateInstance(&pItem); if( SUCCEEDED(hr) ) { hr = pItem->Initialize(pQNode, &m_vRowItems[cookie]); } if( SUCCEEDED(hr) ) { hr = pItem->QueryInterface(IID_IDataObject, (void**)ppDataObject); } if( FAILED(hr) ) { delete pItem; } return hr; } else { ASSERT(m_pCompData != NULL); return m_pCompData->QueryDataObject(cookie, type, ppDataObject); } } STDMETHODIMP CComponent::GetDisplayInfo(RESULTDATAITEM* pRDI) { VALIDATE_POINTER( pRDI ); HRESULT hr = S_OK; if (pRDI->bScopeItem) { CScopeNode* pnode = reinterpret_cast(pRDI->lParam); hr = pnode->GetDisplayInfo(pRDI); } else { if (pRDI->nIndex >= 0 && pRDI->nIndex < m_vRowItems.size()) { if (pRDI->mask & RDI_STR) pRDI->str = const_cast(m_vRowItems[pRDI->nIndex][pRDI->nCol]); if (pRDI->mask & RDI_IMAGE) pRDI->nImage = m_vRowItems[pRDI->nIndex].GetIconIndex(); } else { hr = E_INVALIDARG; } } return hr; } STDMETHODIMP CComponent::CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB) { IUnknownPtr pUnkA= lpDataObjectA; IUnknownPtr pUnkB = lpDataObjectB; return (pUnkA == pUnkB) ? S_OK : S_FALSE; } STDMETHODIMP CComponent::SortItems(int nColumn, DWORD dwSortOptions, LPARAM lUserParam) { if( m_vRowItems.empty() ) return S_FALSE; CRowCompare rc(nColumn, dwSortOptions & RSI_DESCENDING); std::sort(m_vRowItems.begin(), m_vRowItems.end(), rc); return S_OK; } void CComponent::ClearRowItems() { m_vRowItems.clear(); m_spResultData->SetItemCount(0,0); } void CComponent::AddRowItems(RowItemVector& vRowItems) { m_vRowItems.insert(m_vRowItems.end(), vRowItems.begin(), vRowItems.end()); CRowCompare rc(0, 0); std::sort(m_vRowItems.begin(), m_vRowItems.end(), rc); m_spResultData->SetItemCount(m_vRowItems.size(), 0); }