Пример #1
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;
}
Пример #2
0
 //CNodeWnd message handlers
BOOL CNodeWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
	m_pWndNode = theApp.m_pWndNode;
	m_pWndNode -> m_nID = nID;
	m_pWndNode -> m_pHostWnd = this;

	if(m_pWndNode->m_strID.CompareNoCase(_T("HostView"))==0)
	{
		CWndFrame* pWnd = m_pWndNode->m_pFrame;
		pWnd->m_pBindingNode = m_pWndNode;

		m_pWndNode->m_pFrame->m_pWorkNode->m_pHostClientView = this;

		HWND hWnd = CreateWindow(L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, pParentWnd->m_hWnd, (HMENU)nID, AfxGetInstanceHandle(), NULL);
		BOOL bRet = SubclassWindow(hWnd);
		if(m_pWndNode->m_pParentObj&&m_pWndNode->m_pParentObj->m_nViewType==Splitter)
			ModifyStyleEx(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, 0);

		BSTR bstrVal = ::SysAllocString(L"");
		m_pWndNode->get_Attribute(CComBSTR(_T("mdiclient")), &bstrVal);
		CString strVal = OLE2T(bstrVal);
		if (strVal.CompareNoCase(_T("true")) == 0)
		{
			BOOL bEnableBK = false;
			LRESULT lRes = ::SendMessage(m_pWndNode->m_pFrame->m_hWnd,WM_TANGRAMMSG,0,1992);//Query Support BK WebPage
			bEnableBK = (lRes==0);
			if(bEnableBK)
			{
				BSTR bstrURL = ::SysAllocString(L"");
				m_pWndNode->get_Attribute(CComBSTR(_T("url")), &bstrURL);
				CString strURL = OLE2T(bstrURL);
				::SysFreeString(bstrURL);
				if (strURL != _T(""))
				{
					if (strURL.Find(_T("//")) == -1 && ::PathFileExists(strURL) == false)
					{
						CString strPath = theApp.m_strAppPath + _T("TangramWebPage\\") + strURL;
						if (::PathFileExists(strPath))
							strURL = strPath;
					}

					m_bBKWnd = true;
					if (pWnd->m_pBKWnd == nullptr)
					{
						pWnd->m_pBKWnd = new CBKWnd();
						pWnd->m_pBKWnd->m_pWndNode = m_pWndNode;
						CComPtr<IDispatch> pDisp2;
						HRESULT hr = pDisp2.CoCreateInstance(CComBSTR(_T("shell.explorer.2")));
						CAxWindow m_wnd;
						m_wnd.Attach(pWnd->m_hWnd);
						CComPtr<IUnknown> pUnk;
						m_wnd.AttachControl(pDisp2, &pUnk);
						theApp._addObject(this, pUnk.Detach());
						pWnd->m_pBKWnd->SubclassWindow(::FindWindowEx(pWnd->m_hWnd, NULL, _T("Shell Embedding"), NULL));
						theApp.m_pMDIClientBKWnd = pWnd->m_pBKWnd;
						m_pWndNode->m_pDisp = pDisp2.Detach();
						CComQIPtr<IWebBrowser2> pWebDisp(m_pWndNode->m_pDisp);
						if (pWebDisp)
						{
							CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pWndNode->m_pDisp);
							if (pIOleInPlaceActiveObject)
								m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach();
							CComPtr<IAxWinAmbientDispatch> spHost;
							hr = m_wnd.QueryHost(&spHost);
							if (SUCCEEDED(hr))
							{
								hr = spHost->put_DocHostFlags(DOCHOSTUIFLAG_DIALOG  | DOCHOSTUIFLAG_DISABLE_HELP_MENU| DOCHOSTUIFLAG_SCROLL_NO | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_ENABLE_FORMS_AUTOCOMPLETE | DOCHOSTUIFLAG_THEME);
								spHost->put_AllowContextMenu(false);
							}
							pWebDisp->Navigate2(&CComVariant(strURL), &CComVariant(navNoReadFromCache | navNoWriteToCache), nullptr, nullptr, nullptr);
							CWndPage* pPage = m_pWndNode->m_pFrame->m_pPage;
							if (pPage)
								pPage->m_nWebViewCount++;

							m_pWndNode->m_pTangramNodeWBEvent = new CWndNodeWBEvent(m_pWndNode);
						}
						m_wnd.Detach();
					}
				}
			}
		}
		::SysFreeString(bstrVal);
		return bRet ;
	}

	return theApp.Create(m_pWndNode,lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
Пример #3
0
HWND CTangramNode::CreateView(HWND hParentWnd, CString strTag)
{
	BOOL bWebCtrl = false;
	CString strURL = _T("");
	CString strID = strTag;
	auto hWnd = ::CreateWindowEx(NULL,L"Tangram Window Class", NULL, WS_CHILD | WS_VISIBLE| WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 0, 0, hParentWnd, NULL, AfxGetInstanceHandle(), NULL);
	//if (::IsWindow(this->m_pHostWnd->m_hWnd) == false)
	//	 = m_pHostWnd->SubclassWindow(hWnd);
	CComBSTR bstr2;
	get_Attribute(CComBSTR("Name"), &bstr2);
	CString strName = OLE2T(bstr2);
	switch (m_nViewType)
	{
	case ActiveX:
		{
			strID.MakeLower();
			auto nPos = strID.Find(_T("http:"));
			if (nPos == -1)
				nPos = strID.Find(_T("https:"));
			if (m_pFrame)
			{
				CComBSTR bstr;
				get_Attribute(CComBSTR("InitInfo"), &bstr);
				CString str = _T("");
				str += bstr;
				if (str != _T("") && m_pTangram)
				{
					LRESULT hr = ::SendMessage(m_pTangram->m_hWnd, WM_GETNODEINFO, (WPARAM)OLE2T(bstr), (LPARAM)hParentWnd);
					if (hr)
					{
						CString strInfo = _T("");
						CWindow m_wnd;
						m_wnd.Attach(hParentWnd);
						m_wnd.GetWindowText(strInfo);
						strID += strInfo;
						m_wnd.Detach();
					}
				}
			}

			if (strID.Find(_T("http://")) != -1 || strID.Find(_T("https://")) != -1)
			{
				bWebCtrl = true;
				strURL = strID;
				strID = _T("shell.explorer.2");
			}

			if (strID.Find(_T("res://")) != -1 || ::PathFileExists(strID))
			{
				bWebCtrl = true;
				strURL = strID;
				strID = _T("shell.explorer.2");
			}

			if (strID.CompareNoCase(_T("about:blank")) ==0 )
			{
				bWebCtrl = true;
				strURL = strID;
				strID = _T("shell.explorer.2");
			}

			if (m_pDisp == NULL)
			{
				CComPtr<IDispatch> pDisp;
				HRESULT hr = pDisp.CoCreateInstance(CComBSTR(strID));
				if (hr == S_OK)
				{
					m_pDisp = pDisp.Detach();
					//CAxWindow m_Wnd;
					//m_Wnd.Attach(hWnd);
					//CComPtr<IUnknown> pUnk;
					//m_Wnd.AttachControl(m_pDisp, &pUnk);
					//m_Wnd.Detach();
				}
			}
		}
		break;
	case CLRCtrl:
		{
			if (theApp.m_pTangramCLRProxy)
				m_pDisp = theApp.m_pTangramCLRProxy->TangramCreateObject(strTag.AllocSysString(), (LONGLONG)hParentWnd, this);
		}
		break;
	}
	if (m_pDisp)
	{
		CAxWindow m_Wnd;
		m_Wnd.Attach(hWnd);
		CComPtr<IUnknown> pUnk;
		m_Wnd.AttachControl(m_pDisp, &pUnk);
		if (m_nViewType == ActiveX)
		{
			CComQIPtr<IWebBrowser2> pWebDisp(m_pDisp);
			if (pWebDisp)
			{
				bWebCtrl = true;
				m_strURL = strURL;
				if (m_strURL == _T(""))
					m_strURL = strID;
				if (m_pFrame)
				{
					if (m_pTangram)
						m_pTangram->m_nWebViewCount++;

					m_pTangramNodeWBEvent = new CTangramNodeWBEvent(this);
				}
				CComPtr<IAxWinAmbientDispatch> spHost;
				LRESULT hr = m_Wnd.QueryHost(&spHost);
				if (SUCCEEDED(hr))
				{
					CComBSTR bstr;
					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_strURL != _T(""))
					{
						pWebDisp->Navigate2(&CComVariant(m_strURL), &CComVariant(navNoReadFromCache | navNoWriteToCache), NULL, NULL, NULL);
						m_bWebInit = true;
					}
				}
			}
		}
		CComQIPtr<IOleInPlaceActiveObject> pIOleInPlaceActiveObject(m_pDisp);
		if (pIOleInPlaceActiveObject)
			((CTangramWnd*)m_pHostWnd)->m_pOleInPlaceActiveObject = pIOleInPlaceActiveObject.Detach();
		m_Wnd.Detach();
	}

	return hWnd;
}