From 9e213f03833e59a37306a7a7195d005ab5384d74 Mon Sep 17 00:00:00 2001
From: xj qian <qianxj15@sina.com>
Date: 星期三, 21 八月 2024 14:35:48 +0800
Subject: [PATCH] update devloper

---
 jrj/xframe/devloper/devloper.cpp     |  553 ++++++++++++++++++++++++++++++++++++
 jrj/xframe/devloper/XDevEditPage.cpp |  170 +++++++++++
 jrj/project/vindexform.cpp           |   10 
 jrj/xframe/devloper/XDevItemDlg.cpp  |  145 +++++++++
 jrj/xframe/wobject/xwin.hpp          |    1 
 jrj/ext-jrj/ext-jrj.vcxproj          |    3 
 jrj/ext-jrj/ext-jrj.vcxproj.filters  |   12 
 7 files changed, 894 insertions(+), 0 deletions(-)

diff --git a/jrj/ext-jrj/ext-jrj.vcxproj b/jrj/ext-jrj/ext-jrj.vcxproj
index a5b384d..c621bcb 100644
--- a/jrj/ext-jrj/ext-jrj.vcxproj
+++ b/jrj/ext-jrj/ext-jrj.vcxproj
@@ -172,6 +172,7 @@
     <ClInclude Include="..\project\viewobject\shoppingcart.view.hpp" />
     <ClInclude Include="..\project\viewobject\supplier.view.hpp" />
     <ClInclude Include="..\xframe\adt\xarray.hpp" />
+    <ClInclude Include="..\xframe\devloper\XDevEditPage.cpp" />
     <ClInclude Include="..\xframe\kobject\kapp.hpp" />
     <ClInclude Include="..\xframe\kobject\kbase.hpp" />
     <ClInclude Include="..\xframe\kobject\kcachemgr.hpp" />
@@ -1084,6 +1085,8 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="..\xframe\devloper\devloper.cpp" />
+    <ClCompile Include="..\xframe\devloper\XDevItemDlg.cpp" />
     <ClCompile Include="..\xframe\src\nmemory.cpp" />
     <ClCompile Include="..\xframe\src\nstring.cpp" />
     <ClCompile Include="..\xframe\src\xstring.cpp" />
diff --git a/jrj/ext-jrj/ext-jrj.vcxproj.filters b/jrj/ext-jrj/ext-jrj.vcxproj.filters
index 1280bd9..71a8754 100644
--- a/jrj/ext-jrj/ext-jrj.vcxproj.filters
+++ b/jrj/ext-jrj/ext-jrj.vcxproj.filters
@@ -127,6 +127,9 @@
     <Filter Include="project\business\Customer">
       <UniqueIdentifier>{1a6cab16-6910-4b7a-a805-80b24ceac7ac}</UniqueIdentifier>
     </Filter>
+    <Filter Include="devloper">
+      <UniqueIdentifier>{3df44a8b-be7b-441e-8310-dba7612e94e3}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="framework.h">
@@ -377,6 +380,9 @@
     </ClInclude>
     <ClInclude Include="..\project\business\SystemSettings\SysUser.hpp">
       <Filter>project\business\SystemSettings</Filter>
+    </ClInclude>
+    <ClInclude Include="..\xframe\devloper\XDevEditPage.cpp">
+      <Filter>devloper</Filter>
     </ClInclude>
   </ItemGroup>
   <ItemGroup>
@@ -1271,5 +1277,11 @@
     <ClCompile Include="..\project\business\AP\list.manageSupplierID.ap.cpp">
       <Filter>project\business\AP</Filter>
     </ClCompile>
+    <ClCompile Include="..\xframe\devloper\devloper.cpp">
+      <Filter>devloper</Filter>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevItemDlg.cpp">
+      <Filter>devloper</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/jrj/project/vindexform.cpp b/jrj/project/vindexform.cpp
index f6b9c8b..b8bf763 100644
--- a/jrj/project/vindexform.cpp
+++ b/jrj/project/vindexform.cpp
@@ -642,6 +642,16 @@
 	int Initial()
 	{
 		SetUserID();
+		xstring userno = xaserver::GetUserNo();
+		if (userno == L"admin")
+		{
+			xnode anode = GetAgentNode(L"dev");
+			int LayerFlow_WE_ = 0x00000002;
+			int LayerFlow_Control_ = 0x00000010;
+			anode.SetLayerFlow(LayerFlow_WE_ | LayerFlow_Control_);
+		}
+		m_Assignment = L"";
+
 		return 1;
 	}
 	int onload()
diff --git a/jrj/xframe/devloper/XDevEditPage.cpp b/jrj/xframe/devloper/XDevEditPage.cpp
new file mode 100644
index 0000000..f45f2db
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditPage.cpp
@@ -0,0 +1,170 @@
+#include <wobject/xstring.hpp>
+#include <wobject/xwin.hpp>
+#include <wobject/xaserver.hpp>
+#include <wobject/xaserverarg.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xcombobox.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevEditPage : public xwin
+{
+	xstring ProcessDevCmd(xstring cmd, xstring ext)
+	{
+		//trace(ext);
+		int nlen = 0;
+		BYTE* pdata;
+		xaserver::ProcessCmd(GetServerUrl(), (L"uri.hxsoft.com/xaserver/developer " + cmd).c_str(), ext, pdata, nlen);
+		if (nlen > 0)
+		{
+			xstring str = ((LPARAM)pdata);
+			return str.mid(1, 9999999);
+		}
+		else
+			return L"";
+	}
+
+	HTREEITEM GetProjectItem(xtreeview tv_folder, HTREEITEM hItem )
+	{
+		HTREEITEM pitem  = hItem;
+		xstring typ;
+		while (true)
+		{
+			typ = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).tagName();
+			if (typ == L"project")break;
+			pitem = tv_folder.GetParentItem(pitem);
+			if (pitem <= 0)break;
+		}
+		return pitem;
+	}
+
+	HTREEITEM GetP2Item(xtreeview tv_folder, HTREEITEM hItem )
+	{
+		HTREEITEM hDomainItem;
+		HTREEITEM hP2Item = hItem;
+		while (true)
+		{
+			hDomainItem = tv_folder.GetParentItem(hP2Item);
+			if (tv_folder.GetParentItem(hDomainItem) <= 0)break;
+			hP2Item = hDomainItem;
+		}
+		return hP2Item;
+	}
+
+	xstring GetData(int bcode)
+	{
+		xwin w = GetFrameWindow();
+		xtreeview tv_folder = w.GetControl(L"DevExplorer");
+		HTREEITEM hItem  = (HTREEITEM)GetWinParam();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring node = e.tagName();
+		if (node == L"File" || node == L"file")
+		{
+			xstring caption = e.getAttribute(L"caption");
+			SetWindowText(GetHWND(), caption);
+
+			HTREEITEM hP2Item = 0;
+			HTREEITEM hDomainItem = 0;
+			if (tv_folder.GetParentItem(hItem) <= 0)
+			{
+				hDomainItem = hItem;
+			}
+			else
+			{
+				hP2Item = GetP2Item(tv_folder, hItem);
+				hDomainItem = tv_folder.GetParentItem(hP2Item);
+			}
+
+			//find project folder
+			xstring prjguid = L"";
+			HTREEITEM pitem  = GetProjectItem(tv_folder, hItem);
+			if (pitem)
+				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
+
+			xaserverarg arg;
+			arg.AddArg(L"project.guid", prjguid);
+			if (hP2Item)
+			{
+				if (hP2Item != hItem)
+				{
+					xstring guid = e.getAttribute(L"guid");
+					arg.AddArg(L"guid", guid);
+				}
+				KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
+				xstring guid = p.getAttribute(L"guid");
+				arg.AddArg(L"root.guid", guid);
+			}
+			else if (hDomainItem)
+			{
+				KXMLDOMElement d = tv_folder.GetItemData(hDomainItem);
+				xstring guid = d.getAttribute(L"guid");
+				arg.AddArg(L"domain.guid", guid);
+			}
+			if (bcode)arg.AddArg(L"iscode", L"yes");
+			return ProcessDevCmd(L"getobject", arg.GetString());
+		}
+		else
+			return L"";
+	}
+	xstring GetData()
+	{
+		return GetData(0);
+	}
+
+	int SaveContentEx(xstring content, int bcode)
+	{
+		xwin w = GetFrameWindow();
+		xtreeview tv_folder = w.GetControl(L"DevExplorer");
+		HTREEITEM hItem  = (HTREEITEM)GetWinParam();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring node = e.tagName();
+		if (node == L"File" || node == L"file")
+		{
+			HTREEITEM hP2Item = 0;
+			HTREEITEM hDomainItem = 0;
+			if (tv_folder.GetParentItem(hItem) <= 0)
+			{
+				hDomainItem = hItem;
+			}
+			else
+			{
+				hP2Item = GetP2Item(tv_folder, hItem);
+				hDomainItem = tv_folder.GetParentItem(hP2Item);
+			}
+
+			//find project folder
+			xstring prjguid = L"";
+			HTREEITEM pitem  = GetProjectItem(tv_folder, hItem);
+			if (pitem)
+				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
+
+			xaserverarg arg;
+			arg.AddArg(L"project.guid", prjguid);
+			if (hP2Item)
+			{
+				if (hP2Item != hItem)
+				{
+					xstring guid = e.getAttribute(L"guid");
+					arg.AddArg(L"guid", guid);
+				}
+				KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
+				xstring guid = p.getAttribute(L"guid");
+				arg.AddArg(L"root.guid", guid);
+			}
+			else if (hDomainItem)
+			{
+				KXMLDOMElement d = tv_folder.GetItemData(hDomainItem);
+				xstring guid = d.getAttribute(L"guid");
+				arg.AddArg(L"domain.guid", guid);
+			}
+			arg.AddArg(L"content", content);
+			if (bcode)arg.AddArg(L"iscode", L"yes");
+			ProcessDevCmd(L"saveobject", arg.GetString());
+		}
+		return 1;
+	}
+	int SaveContent(xstring content)
+	{
+		return SaveContentEx(content, 0);
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevItemDlg.cpp b/jrj/xframe/devloper/XDevItemDlg.cpp
new file mode 100644
index 0000000..1ae19fa
--- /dev/null
+++ b/jrj/xframe/devloper/XDevItemDlg.cpp
@@ -0,0 +1,145 @@
+#include <wobject/xstring.hpp>
+#include <wobject/xwin.hpp>
+#include <wobject/xaserver.hpp>
+#include <wobject/xaserverarg.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xcombobox.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevItemDlg : public xwin
+{
+private:
+	xaserverarg arg;
+	KXMLDOMElement pr;
+public:
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		if (comdid == L"xmDevCancel")
+		{
+			CloseWindow();
+			return 1;
+		}
+		if (comdid == L"xmDevOk")
+		{
+			if (arg)
+			{
+				xcontrol xc= GetControl(L"xmDevType");
+				arg.SetArg(L"typename", xc.GetText());
+				KXMLDOMElement o = pr.selectSingleNode(L"//folder[@caption='" + xc.GetText() + L"']");
+				if (o)
+				{
+					xstring image = o.getAttribute(L"image");
+					//alert(image);
+					arg.SetArg(L"image", image);
+				}
+
+				xc = GetControl(L"xmDevName");
+				arg.SetArg(L"name", xc.GetText());
+				xc = GetControl(L"xmDevDesc");
+				arg.SetArg(L"desc", xc.GetText());
+				xc = GetControl(L"xmDevUri");
+				arg.SetArg(L"uri", xc.GetText());
+				arg.SetArg(L"__process",L"true");
+				arg.SetArg(L"folder",L"folder");
+			}
+			CloseWindow();
+
+			return 1;
+		}
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,LPARAM param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnCombSelChanged()
+	{
+		xcontrol xc = GetControl(L"xmDevType");
+		LPARAM j = SendMessage(xc.GetHWND(),0x0147,0,0);
+		if (j > 0)
+		{
+			wchar_t str[255];
+			SendMessage(xc.GetHWND(),0x0148,j,(LPARAM)str);
+			//trace(str);
+			xc = GetControl(L"xmDevName");
+			xc.SetText(str);
+			xc = GetControl(L"xmDevUri");
+			xc.SetText(str);
+		}
+		return 1;
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevItemDlg::OnXCommand);
+		//AttachEvent(L"xmDevType", L"CBN_SELCHANGE",(FEvent)&XDevItemDlg::OnCombSelChanged);
+		return 1;
+	}
+
+	int OnInitial()
+	{
+		OnAttachEvent();
+
+		xml project;
+		xaserver::FetchXml(GetServerUrl(),L"dev:xpage[XDevProject.xml]",L"",project);
+		auto list = project.selectNodes(L"//folder");
+		pr = project.documentElement();
+
+		long nlen = list.length();
+		int i = 0;
+		for (i = 0; i < nlen; i++)
+		{
+			KXMLDOMElement e = list.item(i);
+			xstring name = e.getAttribute(L"caption");
+			xcombobox b = GetControl(L"xmDevType");
+			b.AddItem(name);
+		}
+
+		return 1;
+	}
+
+	int onload()
+	{
+		SetArg();
+		OnInitial();
+		arg = GetArg();
+		if (arg)
+		{
+			xstring val;
+			xcontrol xc(nullptr);
+			val = arg.GetArgString(L"typename");
+			xc = GetControl(L"xmDevType");
+			if (val)xc.SetText(val);
+			val = arg.GetArgString(L"name");
+			xc = GetControl(L"xmDevName");
+			if (val)xc.SetText(val);
+			val = arg.GetArgString(L"desc");
+			xc = GetControl(L"xmDevDesc");
+			if (val)xc.SetText(val);
+			val = arg.GetArgString(L"uri");
+			xc = GetControl(L"xmDevUri");
+			if (val)xc.SetText(val);
+			val = arg.GetArgString(L"src");
+			xc = GetControl(L"xmDevPath");
+			if (val)xc.SetText(val);
+			val = arg.GetArgString(L"guid");
+			xc = GetControl(L"xmDevGuid");
+			if (val)xc.SetText(val);
+			val = arg.GetArgString(L"type");
+			//xml project = new xml;
+			//xaserver::FetchXml(GetServerUrl(),L"dev:xpage[XDevProject.xml]",L"",project);
+			//var list = project.GetXmlDoc().selectNodes(L"//folder");
+			//trace(val);
+			xc = GetControl(L"xmDevType");
+			if (val)xc.SetText(val);
+		}
+
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/devloper.cpp b/jrj/xframe/devloper/devloper.cpp
new file mode 100644
index 0000000..b586ae3
--- /dev/null
+++ b/jrj/xframe/devloper/devloper.cpp
@@ -0,0 +1,553 @@
+#include <wobject/xstring.hpp>
+#include <wobject/xwin.hpp>
+#include <wobject/xaserver.hpp>
+#include <wobject/xaserverarg.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xlayersheet.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDeveloper : public xwin
+{
+private:	//
+	xtreeview tv_folder;
+	xcontrol mle_output;
+	int sheet_Count;
+public:
+	int trace(xstring msg)
+	{
+		xstring t = mle_output.GetText();
+		mle_output.SetText(t + msg);
+		return 1;
+	}
+
+	int OnProcessUrl(xstring kind, xstring url)
+	{
+		xml x ;
+		xaserverarg xarg;
+		xarg.AddArg(L"url", url);
+		xarg.AddArg(L"kind", kind);
+		xaserver::ExecXQuery(GetServerUrl(), L"[service.url.info.xq]", xarg.GetString(), x);
+		alert(x.xml());
+		return 1;
+	}
+
+	xstring ProcessDevCmd(xstring cmd, xstring ext)
+	{
+		int nlen = 0;
+		BYTE* pdata=nullptr;
+		xaserver::ProcessCmd(GetServerUrl(),( L"uri.hxsoft.com/xaserver/developer " + cmd).c_str(), ext.c_str(), pdata, nlen);
+
+		xstring str = ((LPARAM)pdata) + L"";
+		return str;
+	}
+
+	int SetAgent(xstring node)
+	{
+		auto n = GetElement().selectSingleNode(L"agent/projects/node()[1]");
+		if (n)
+		{
+			xstring agent = n.xml();
+			xstring xfNodeAgentArea = L"agentarea";
+			xnode anode = GetAgentNode(xfNodeAgentArea);
+			SetAgentNode(anode, agent);
+		}
+
+		return 1;
+	}
+
+	HTREEITEM GetProjectItem(HTREEITEM hItem)
+	{
+		HTREEITEM pitem = hItem;
+		xstring typ;
+		while (true)
+		{
+			typ = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).tagName();
+			if (typ == L"project")break;
+			pitem = tv_folder.GetParentItem(pitem);
+			if (!pitem )break;
+		}
+		return pitem;
+	}
+
+	HTREEITEM GetP2Item(HTREEITEM hItem)
+	{
+		HTREEITEM hDomainItem;
+		HTREEITEM hP2Item = hItem;
+		while (true)
+		{
+			hDomainItem = tv_folder.GetParentItem(hP2Item);
+			if (!tv_folder.GetParentItem(hDomainItem))break;
+			hP2Item = hDomainItem;
+		}
+		return hP2Item;
+	}
+
+	//树展开事件
+	int OnTreeExpanding(TEvent* evt, HTREEITEM param)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+
+		return 1;
+	}
+
+	xstring GetData(HTREEITEM hItem)
+	{
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring node = e.tagName();
+		if (node == L"File" || node == L"file")
+		{
+			HTREEITEM hP2Item = 0;
+			HTREEITEM hDomainItem = 0;
+			if (!tv_folder.GetParentItem(hItem))
+			{
+				hDomainItem = hItem;
+			}
+			else
+			{
+				hP2Item = GetP2Item(hItem);
+				hDomainItem = tv_folder.GetParentItem(hP2Item);
+			}
+
+			//find project folder
+			xstring prjguid = L"";
+			HTREEITEM pitem = GetProjectItem(hItem);
+			if (pitem)
+				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
+
+			xaserverarg arg;
+			arg.AddArg(L"project.guid", prjguid);
+			if (hP2Item)
+			{
+				if (hP2Item != hItem)
+				{
+					xstring guid = e.getAttribute(L"guid");
+					arg.AddArg(L"guid", guid);
+				}
+				KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
+				xstring guid = p.getAttribute(L"guid");
+				arg.AddArg(L"root.guid", guid);
+			}
+			else if (hDomainItem)
+			{
+				KXMLDOMElement d = tv_folder.GetItemData(hDomainItem);
+				xstring guid = d.getAttribute(L"guid");
+				arg.AddArg(L"domain.guid", guid);
+			}
+			xstring str = ProcessDevCmd(L"getobject", arg.GetString());
+			return str + L"";
+		}
+		else
+			return L"";
+	}
+
+	int OnTreeDblClick(TEvent* evt, int param)
+	{
+		HTREEITEM hItem = tv_folder.GetSelectedItem();
+		if (!hItem) return 0;
+
+		xlayersheet layer = GetControl(L"mdilayer");
+		int i = 0;
+		int nIndex = layer.GetSheetCount();
+		for (i = 0; i < nIndex; i++)
+		{
+			if (hItem == layer.GetParam(i))break;
+		}
+		if (i < nIndex)
+		{
+			layer.SelectSheet(i);
+			return 1;
+		}
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring node = e.tagName();
+		if (node == L"File" || node == L"file")
+		{
+			//xstring str =  ProcessDevCmd(L"getobject",arg.GetString());
+			xstring typ = e.getAttribute(L"type");
+
+			xml x ;
+			xaserver::FetchXml(GetServerUrl(), L"dev:xpage[XDevEdit.xml]", L"", x);
+			auto n = x.selectSingleNode(L"//editor[@filetype='" + typ + L"']/@xpage");
+			if (n)
+			{
+				xstring xpage = n.text();
+				OpenWindow(L"dev:xpage[" + xpage + L"]", (LPARAM)hItem);
+				//layer. 
+				if (nIndex < layer.GetSheetCount())
+					layer.SetParam(nIndex, hItem);
+			}
+
+		}
+		return 1;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		//
+		if (comdid == L"xmSqlWatch")
+		{
+			OpenWindow(L"dev:xpage[sqlWatch.vx]");
+			return 1;
+		}
+		if (comdid == L"xmCheckUrl")
+		{
+			xcontrol xc = GetControl(L"url");
+			xstring url = xc.GetText();
+			return OnProcessUrl(L"info", url);
+		}
+		else if (comdid == L"xmClearBuffer")
+		{
+			xcontrol xc = GetControl(L"url");
+			xstring url = xc.GetText();
+			return OnProcessUrl(L"clearbuffer", url);
+		}
+		if (comdid == L"xmNewFolder" || comdid == L"xmNewProject" || comdid == L"xmNewFile")
+		{
+			HTREEITEM hItem = tv_folder.GetSelectedItem();
+			if (!hItem) return 1;
+
+
+			//find project folder
+			xstring prjguid = L"";
+			HTREEITEM pitem = GetProjectItem(hItem);
+			if (pitem)
+				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
+
+			if (comdid == L"xmNewProject" && prjguid != L"") return 1;
+			if (comdid == L"xmNewFile" && !tv_folder.GetParentItem(hItem)) return 1;
+
+			xaserverarg arg;
+			if (comdid == L"xmNewProject")
+				OpenWindow(L"dev:xpage[XDevProjectDlg.xpage]", arg);
+			else if (comdid == L"xmNewFolder")
+				OpenWindow(L"dev:xpage[XDevItemDlg.xpage]", arg);
+			else
+				OpenWindow(L"dev:xpage[XDevFileDlg.xpage]", arg);
+			if (arg.GetArgString(L"__process") != L"true") return 1;
+
+			arg.SetArg(L"project.guid", prjguid);
+
+			HTREEITEM hP2Item = 0;
+			HTREEITEM hDomainItem = 0;
+			KXMLDOMElement e;
+			if (!tv_folder.GetParentItem(hItem))
+			{
+				hDomainItem = hItem;
+			}
+			else
+			{
+				hP2Item = GetP2Item(hItem);
+				hDomainItem = tv_folder.GetParentItem(hP2Item);
+			}
+
+			e = tv_folder.GetItemData(hItem);
+			if (hP2Item)
+			{
+				if (hP2Item != hItem)
+				{
+					xstring guid = e.getAttribute(L"guid");
+					arg.AddArg(L"parent.guid", guid);
+				}
+				KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
+				xstring guid = p.getAttribute(L"guid");
+				arg.AddArg(L"root.guid", guid);
+			}
+			else if (hDomainItem)
+			{
+				KXMLDOMElement d = tv_folder.GetItemData(hDomainItem);
+				xstring guid = d.getAttribute(L"guid");
+				arg.AddArg(L"domain.guid", guid);
+			}
+
+
+			if (hP2Item)
+			{
+				if (comdid == L"xmNewFolder")
+				{
+					if (arg.GetArgString(L"image") == L"")
+						arg.AddArg(L"image", L"15");
+					arg.AddArg(L"folder", L"folder");
+					arg.AddArg(L"type", L"folder");
+				}
+			}
+			else
+			{
+				if (comdid == L"xmNewFolder")
+				{
+					if (arg.GetArgString(L"image") == L"")
+						arg.AddArg(L"image", L"17");
+					arg.AddArg(L"folder", L"folder");
+					arg.AddArg(L"type", L"folder");
+				}
+			}
+
+			xstring str = ProcessDevCmd(L"addfolder", arg.GetString());
+			if (str != L"")
+			{
+				xml x;
+				x.loadXML(str);
+				auto e1 = x.documentElement();
+				e.appendChild(e1);
+				int himage = xstring(e1.getAttribute(L"image")).toInt();
+				tv_folder.InsertChildItem(hItem, arg.GetArgString(L"name"), e1, himage);
+			}
+
+			return 1;
+		}
+		else if (comdid == L"xmDeleteObject")
+		{
+			HTREEITEM hItem = tv_folder.GetSelectedItem();
+			if (!hItem) return 1;
+
+			//find project folder
+			xstring prjguid = L"";
+			HTREEITEM pitem = GetProjectItem(hItem);
+			if (pitem)
+				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
+
+			HTREEITEM hP2Item = 0;
+			HTREEITEM hDomainItem = 0;
+			KXMLDOMElement e;
+			if (!tv_folder.GetParentItem(hItem) ) return 1;
+
+			hP2Item = hItem;
+			while (true)
+			{
+				hDomainItem = tv_folder.GetParentItem(hP2Item);
+				if (!tv_folder.GetParentItem(hDomainItem))break;
+				hP2Item = hDomainItem;
+			}
+
+			e = tv_folder.GetItemData(hItem);
+			xstring guid = e.getAttribute(L"guid");
+			xaserverarg arg;
+
+			arg.SetArg(L"project.guid", prjguid);
+			arg.AddArg(L"guid", guid);
+
+			KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
+			guid = p.getAttribute(L"guid");
+			arg.AddArg(L"root.guid", guid);
+
+			int MB_YESNO = 0x00000004;
+			int IDYES = 6;
+
+			if (MessageBox(GetHWND(), L"确认删除指定的项", L"提示", MB_YESNO) != IDYES) return 1;
+			ProcessDevCmd(L"deletefolder", arg.GetString());
+			tv_folder.DeleteItem(hItem);
+
+			return 1;
+		}
+		else if (comdid == L"xmUpdateProject")
+		{
+			HTREEITEM hItem = tv_folder.GetSelectedItem();
+			if (!hItem) return 1;
+
+			//find project folder
+			xstring prjguid = L"";
+			HTREEITEM pitem = GetProjectItem(hItem);
+			if (pitem && pitem != hItem)
+				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
+
+			HTREEITEM hP2Item = 0;
+			HTREEITEM hDomainItem = 0;
+			KXMLDOMElement e;
+			if (!tv_folder.GetParentItem(hItem) ) return 1;
+
+			hP2Item = hItem;
+			while (true)
+			{
+				hDomainItem = tv_folder.GetParentItem(hP2Item);
+				if (!tv_folder.GetParentItem(hDomainItem))break;
+				hP2Item = hDomainItem;
+			}
+
+			e = tv_folder.GetItemData(hItem);
+			xstring guid = e.getAttribute(L"guid");
+			xaserverarg arg;
+
+			arg.SetArg(L"project.guid", prjguid);
+			arg.AddArg(L"guid", guid);
+
+			KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
+			//trace(p.xml);
+			guid = p.getAttribute(L"guid");
+			arg.AddArg(L"root.guid", guid);
+
+			xstring str;
+			str = e.getAttribute(L"caption");
+			arg.AddArg(L"name", str);
+
+			str = e.getAttribute(L"desc");
+			arg.AddArg(L"desc", str);
+
+			str = e.getAttribute(L"uri");
+			arg.AddArg(L"uri", str);
+
+			str = e.getAttribute(L"guid");
+			arg.AddArg(L"guid", str);
+
+			str = e.getAttribute(L"src");
+			arg.AddArg(L"src", str);
+
+			str = e.getAttribute(L"type");
+			arg.AddArg(L"type", str);
+
+			OpenWindow(L"dev:xpage[XDevItemDlg.xpage]", arg);
+			if (arg.GetArgString(L"__process") != L"true") return 1;
+
+			ProcessDevCmd(L"updatefolder", arg.GetString());
+			str = arg.GetArgString(L"name");
+			e.setAttribute(L"caption", str);
+
+			str = arg.GetArgString(L"desc");
+			e.setAttribute(L"desc", str);
+
+			str = arg.GetArgString(L"uri");
+			e.setAttribute(L"uri", str);
+
+			tv_folder.SetItemLabel(hItem, arg.GetArgString(L"name"));
+
+			return 1;
+		}
+		else if (comdid == L"xmEditObject")
+		{
+			HTREEITEM hItem = tv_folder.GetSelectedItem();
+			if (!hItem) return 1;
+
+			xlayersheet layer = GetControl(L"mdilayer");
+			int i = 0;
+			int nIndex = layer.GetSheetCount();
+			for (i = 0; i < nIndex; i++)
+			{
+				if (hItem == layer.GetParam(i))break;
+			}
+			if (i < nIndex)
+			{
+				layer.SelectSheet(i);
+				return 1;
+			}
+			KXMLDOMElement e = tv_folder.GetItemData(hItem);
+			xstring node = e.tagName();
+			if (node == L"File" || node == L"file")
+			{
+				//xstring str =  ProcessDevCmd(L"getobject",arg.GetString());
+				xstring typ = e.getAttribute(L"type");
+
+				xml x ;
+				xaserver::FetchXml(GetServerUrl(), L"dev:xpage[XDevEdit.xml]", L"", x);
+				auto n = x.selectSingleNode((xstring)L"//editor[@filetype='" + L"xml" + L"']/@xpage");
+				if (n)
+				{
+					xstring xpage = n.text();
+					OpenWindow(L"dev:xpage[" + xpage + L"]", (LPARAM)hItem);
+					//layer. 
+					if (nIndex < layer.GetSheetCount())
+						layer.SetParam(nIndex, hItem);
+				}
+
+			}
+
+		}
+		return 0;
+	}
+
+	//树选择事件
+	int OnTreeSelChanged(TEvent* evt, LPARAM param)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.itemNew.hItem;
+
+		//root node
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		SetAgent(L"projects");
+
+		return 1;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt, int param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnSelChanged(TEvent* evt, int param)
+	{
+		xlayersheet layer = GetControl(L"mdilayer");
+		LYSNMHDR& nmtv = *(LYSNMHDR*)evt->notify.pnmh;
+		int sheet = nmtv.nSheet;
+		int s = layer.GetSheetCount();
+
+		//状态栏显示完成路径
+		HTREEITEM hitem = tv_folder.GetSelectedItem();
+		xstring path = L"" + tv_folder.GetItemLabel(hitem);
+		while (tv_folder.GetParentItem(hitem))
+		{
+			hitem = tv_folder.GetParentItem(hitem);
+			xstring p = L"" + tv_folder.GetItemLabel(hitem);
+			path = p + L"\\" + path;
+		}
+		xcontrol xc = GetControl(L"statusbar");
+		xc.SetText(L"" + path);
+		/*
+				if(sheet<s)
+				{
+					param p=layer.GetParam(sheet);
+					int hitem = p;
+					onPrintPath(hitem);
+				}
+		*/
+
+		return 1;
+	}
+	int OnSelChangedEx(TEvent* evt, int param)
+	{
+		xlayersheet layer = GetControl(L"mdilayer");
+		LYSNMHDR& nmtv = *(LYSNMHDR*)evt->notify.pnmh;
+		int sheet = nmtv.nSheet;
+		int s = layer.GetSheetCount();
+		int k = sheet_Count;
+		if (k < s)
+		{
+			void* p = nullptr;
+			layer.SetParam(s - 1, p);
+		}
+		sheet_Count = s;
+		return 1;
+	}
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDeveloper::OnXCommand);
+		AttachEvent(L"DevExplorer", L"NM_DBLCLK", (FEvent)&XDeveloper::OnTreeDblClick);
+		//获得树的展开事件
+		//AttachEvent(L"DevExplorer", L"TVN_ITEMEXPANDING",(FEvent)&XDeveloper::OnTreeExpanding);
+		//获得树的选择事件
+		AttachEvent(L"DevExplorer", L"TVN_SELCHANGED", (FEvent)&XDeveloper::OnTreeSelChanged);
+		//改变页签
+		//AttachEvent(L"mdilayer", L"LYSN_SELECTEDSHEET",(FEvent)&XDeveloper::OnSelChanged);
+		AttachEvent(L"mdilayer", L"LYSN_SELECTEDSHEET", (FEvent)&XDeveloper::OnSelChangedEx);
+
+		return 1;
+	}
+
+	int OnInitial()
+	{
+		OnAttachEvent();
+
+		return 1;
+	}
+
+	int onload()
+	{
+		sheet_Count = -1;
+		OnInitial();
+
+		tv_folder = GetControl(L"DevExplorer");
+		mle_output = GetControl(L"output");
+		SetAgent(L"projects");
+
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/wobject/xwin.hpp b/jrj/xframe/wobject/xwin.hpp
index 011b1d2..4afb28e 100644
--- a/jrj/xframe/wobject/xwin.hpp
+++ b/jrj/xframe/wobject/xwin.hpp
@@ -11,6 +11,7 @@
 using kcontrol = Hxsoft::XFrame::IXFControl;
 using knode = Hxsoft::XFrame::IXNode;
 
+#define export __declspec(dllexport) 
 #define DeclWinObject_(ty,pty) class __declspec(dllexport) ty :  public pty
 #define CreateWinObject_(ty,pty) \
 public:\

--
Gitblit v1.9.3