LRESULT CTangramWordPlusDocWnd::OOpenDoc(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& ) { map<LONG, Office::_CustomTaskPane*>::iterator it = m_pWordAddin->m_mapTaskPaneMap.find((LONG)m_hWnd); if (it != m_pWordAddin->m_mapTaskPaneMap.end()) { it->second->put_Visible(false); m_pWordAddin->m_mapTaskPaneMap.erase(it); } if(m_pWordAddin->m_pCurWordPlusDocWnd==NULL) return 0; CTangramWordPlusDocWnd* pWnd = m_pWordAddin->m_pCurWordPlusDocWnd; pWnd->m_pWordPlusDoc = (CTangramWordPlusDoc*)wParam; if(lParam==1&& pWnd) { CComBSTR bstrXml(L""); m_pWordAddin->GetTangramXml(pWnd->m_pWordPlusDoc->m_pDoc,CComBSTR(L"Tangrams"),&bstrXml); CString strTemplateXml = OLE2T(bstrXml); pWnd->m_pWordPlusDoc->m_strDocXml = strTemplateXml; if (strTemplateXml != _T("")) { CTangramXmlParse m_Parse; if (m_Parse.LoadXml(strTemplateXml) || m_Parse.LoadFile(strTemplateXml)) { CTangramXmlParse* pParse = m_Parse.GetChild(_T("TaskPaneUI")); if (pParse) pWnd->m_pWordPlusDoc->m_strTaskPaneXml = pParse->xml(); pParse = m_Parse.GetChild(_T("DocumentUI")); if (pParse) { CTangramWordPlusDoc* pWordDocument = pWnd->m_pWordPlusDoc; theApp.m_pTangramCore->CreateTangram((LONGLONG)pWnd->m_hWnd, &pWordDocument->m_pTangram); if (pWordDocument->m_pTangram) { pWordDocument->m_pTangram->put_External(pWordDocument->m_pDoc); pWordDocument->m_pTangram->CreateFrame(CComVariant(0), CComVariant((LONGLONG)m_pWordAddin->m_pCurWordPlusDocWnd->m_hDocWnd), CComBSTR(L"Document"), &pWordDocument->m_pFrame); if (pWordDocument->m_pFrame) { CString strXml = pParse->xml(); CComPtr<ITangramNode> pNode; pWordDocument->m_pFrame->Extend(CComBSTR(L"Default"), strXml.AllocSysString(), &pNode); } } } pParse = m_Parse.GetChild(_T("UserForms")); if (pParse) { int nCount = pParse->GetCount(); if (nCount) { for (int i = 0; i < nCount; i++) { CTangramXmlParse* pParse2 = pParse->GetChild(i); m_pWordPlusDoc->m_mapUserFormScript[pParse2->name()] = pParse2->xml(); } } } } } } return 0; }
LRESULT CNodeWnd::OnTangramMsg(WPARAM wParam, LPARAM lParam) { if (wParam == 0 && lParam)//Create CLRCtrl Node { CString strCnnID = (LPCTSTR)lParam; if (strCnnID.Find(_T(","))!=-1&&theApp.m_pCloudAddinCLRProxy) { m_pWndNode->m_pDisp = theApp.m_pCloudAddinCLRProxy->TangramCreateObject(strCnnID.AllocSysString(), (long)::GetParent(m_hWnd), m_pWndNode); if (m_pWndNode->m_pDisp) { CString strName = theApp.m_pCloudAddinCLRProxy->m_strObjTypeName; CWndNode* pNode = m_pWndNode->m_pRootObj; CWndNode* pParent = m_pWndNode->m_pParentObj; if (pParent) { strName = pParent->m_strName + _T("_") + strName; } auto it = pNode->m_mapLayoutNodes.find(strName); if (it != pNode->m_mapLayoutNodes.end()) { BOOL bGetNew = false; int nIndex = 0; while (bGetNew == false) { CString strNewName = _T(""); strNewName.Format(_T("%s%d"), strName, nIndex); it = pNode->m_mapLayoutNodes.find(strNewName); if (it == pNode->m_mapLayoutNodes.end()) { strName = strNewName; break; } nIndex++; } } m_pWndNode->put_Attribute(CComBSTR(L"name"), strName.AllocSysString()); m_pWndNode->m_strName = strName; m_pWndNode->m_pRootObj->m_mapLayoutNodes[strName] = m_pWndNode; m_pWndNode->m_nViewType = CLRCtrl; CAxWindow m_Wnd; m_Wnd.Attach(m_hWnd); CComPtr<IUnknown> pUnk; m_Wnd.AttachControl(m_pWndNode->m_pDisp, &pUnk); CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pWndNode->m_pDisp); if (pIOleInPlaceActiveObject) m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach(); m_Wnd.Detach(); } } else { BOOL bWebCtrl = false; CString strURL = _T(""); strCnnID.MakeLower(); auto nPos = strCnnID.Find(_T("http:")); if (nPos == -1) nPos = strCnnID.Find(_T("https:")); if (m_pWndNode->m_pFrame) { CComBSTR bstr; m_pWndNode->get_Attribute(CComBSTR("InitInfo"), &bstr); CString str = _T(""); str += bstr; if (str != _T("") && m_pWndNode->m_pPage) { LRESULT hr = ::SendMessage(m_pWndNode->m_pPage->m_hWnd, WM_GETNODEINFO, (WPARAM)OLE2T(bstr), (LPARAM)::GetParent(m_hWnd)); if (hr) { CString strInfo = _T(""); CWindow m_wnd; m_wnd.Attach(::GetParent(m_hWnd)); m_wnd.GetWindowText(strInfo); strCnnID += strInfo; m_wnd.Detach(); } } } if (strCnnID.Find(_T("http://")) != -1 || strCnnID.Find(_T("https://")) != -1) { bWebCtrl = true; strURL = strCnnID; strCnnID = _T("shell.explorer.2"); } if (strCnnID.Find(_T("res://")) != -1 || ::PathFileExists(strCnnID)) { bWebCtrl = true; strURL = strCnnID; strCnnID = _T("shell.explorer.2"); } if (strCnnID.CompareNoCase(_T("about:blank")) == 0) { bWebCtrl = true; strURL = strCnnID; strCnnID = _T("shell.explorer.2"); } if (m_pWndNode->m_pDisp == NULL) { CComPtr<IDispatch> pDisp; HRESULT hr = pDisp.CoCreateInstance(CComBSTR(strCnnID)); if (hr == S_OK) { m_pWndNode->m_pDisp = pDisp.Detach(); } } if (m_pWndNode->m_pDisp) { m_pWndNode->m_pRootObj->m_mapLayoutNodes[m_pWndNode->m_strName] = m_pWndNode; m_pWndNode->m_nViewType = ActiveX; CAxWindow m_Wnd; m_Wnd.Attach(m_hWnd); CComPtr<IUnknown> pUnk; m_Wnd.AttachControl(m_pWndNode->m_pDisp, &pUnk); CComQIPtr<IWebBrowser2> pWebDisp(m_pWndNode->m_pDisp); if (pWebDisp) { bWebCtrl = true; m_pWndNode->m_strURL = strURL; if (m_pWndNode->m_strURL == _T("")) m_pWndNode->m_strURL = strCnnID; if (m_pWndNode->m_pFrame) { if (m_pWndNode->m_pPage) m_pWndNode->m_pPage->m_nWebViewCount++; m_pWndNode->m_pTangramNodeWBEvent = new CWndNodeWBEvent(m_pWndNode); } CComPtr<IAxWinAmbientDispatch> spHost; LRESULT hr = m_Wnd.QueryHost(&spHost); if (SUCCEEDED(hr)) { CComBSTR bstr; m_pWndNode->get_Attribute(CComBSTR("scrollbar"), &bstr); CString str = OLE2T(bstr); if (str == _T("1")) spHost->put_DocHostFlags(DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME);//DOCHOSTUIFLAG_DIALOG| else spHost->put_DocHostFlags(/*DOCHOSTUIFLAG_DIALOG|*/DOCHOSTUIFLAG_SCROLL_NO | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME); if (m_pWndNode->m_strURL != _T("")) { pWebDisp->Navigate2(&CComVariant(m_pWndNode->m_strURL), &CComVariant(navNoReadFromCache | navNoWriteToCache), NULL, NULL, NULL); m_pWndNode->m_bWebInit = true; } } } CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pWndNode->m_pDisp); if (pIOleInPlaceActiveObject) m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach(); m_Wnd.Detach(); } } return 0; } CTangramXmlParse* pNewNXmlode = (CTangramXmlParse*)wParam; if (pNewNXmlode == nullptr) { return 0; } CString str = (LPCTSTR)lParam; CString strID = pNewNXmlode->attr(_T("id"), _T("")); IWndNode* _pNode = nullptr; CWndNode* pOldNode = (CWndNode*)m_pWndNode; if (m_pWndNode->m_hHostWnd == 0) { RECT rc; ::GetClientRect(m_hWnd, &rc); m_pWndNode->m_hHostWnd = ::CreateWindowEx(NULL, L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, rc.right, rc.bottom, m_hWnd, NULL, AfxGetInstanceHandle(), NULL); m_pWndNode->m_hChildHostWnd = ::CreateWindowEx(NULL, L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, rc.right, rc.bottom, m_pWndNode->m_hHostWnd, NULL, AfxGetInstanceHandle(), NULL); IWndFrame* pFrame = nullptr; CString strName = pNewNXmlode->attr(_T("name"), _T(""))+_T("frame"); m_pWndNode->m_pPage->CreateFrame(CComVariant(0), CComVariant((long)pOldNode->m_hChildHostWnd), strName.AllocSysString(), &pFrame); IWndNode* pNode = nullptr; pFrame->Extend(CComBSTR(L""),str.AllocSysString(),&pNode); m_bEraseBkgnd = false; ((CWndNode*)pNode)->m_pRootObj = m_pWndNode->m_pRootObj; ((CWndNode*)pNode)->m_pParentObj = m_pWndNode->m_pParentObj; m_pWndNode->m_pRootObj->m_mapLayoutNodes[((CWndNode*)pNode)->m_strName] = (CWndNode*)pNode; CString strXml = ((CWndNode*)pNode)->m_pHostParse->xml(); CTangramXmlParse* pNew = ((CWndNode*)pNode)->m_pHostParse; CTangramXmlParse* pOld = pOldNode->m_pHostParse; CTangramXmlParse* pParent = m_pWndNode->m_pHostParse->m_pParentParse; CTangramXmlParse* pRet = nullptr; if (pParent) { pRet = pParent->ReplaceNode(pOld, pNew, _T("")); CString str = pRet->xml(); int nCount = pRet->GetCount(); ((CWndNode*)pNode)->m_pHostParse = pRet; m_pWndNode->m_pHostParse = pRet; CWndNode* pChildNode = nullptr; for (auto it2 : ((CWndNode*)pNode)->m_vChildNodes) { pChildNode = it2; pChildNode->m_pRootObj = m_pWndNode->m_pRootObj; CString strName = pChildNode->m_strName; for (int i = 0; i < nCount; i++) { CTangramXmlParse* child = pRet->GetChild(i); CString _strName = child->attr(_T("name"),_T("")); if (_strName.CompareNoCase(strName) == 0) { pChildNode->m_pHostParse = child; break; } } } m_pWndNode->m_vChildNodes.push_back(((CWndNode*)pNode)); } strXml = m_pWndNode->m_pRootObj->m_pTangramParse->xml(); theApp.m_pHostDesignUINode = m_pWndNode->m_pRootObj; if (theApp.m_pHostDesignUINode) { CTangramHtmlTreeWnd* pTreeCtrl = theApp.m_pDocDOMTree; pTreeCtrl->DeleteItem(theApp.m_pDocDOMTree->m_hFirstRoot); if (pTreeCtrl->m_pHostXmlParse) { delete pTreeCtrl->m_pHostXmlParse; } pTreeCtrl->m_pHostXmlParse = new CTangramXmlParse(); pTreeCtrl->m_pHostXmlParse->LoadXml(strXml); pTreeCtrl->m_hFirstRoot = pTreeCtrl->LoadXmlFromXmlParse(pTreeCtrl->m_pHostXmlParse); pTreeCtrl->ExpandAll(); } } return -1; }