From 90e3cd57d7cf80588608b28b1301824b40f677ca Mon Sep 17 00:00:00 2001
From: xj qian <qianxj15@sina.com>
Date: 星期三, 04 十二月 2024 08:30:31 +0800
Subject: [PATCH] update

---
 jrj/xframe/devloper/XDevEditDbmap.cpp     |  317 ++
 jrj/xframe/devloper/XDevEditXHtml.cpp     |  561 ++++
 jrj/xframe/devloper/XDevEditXCode.cpp     |  561 ++++
 jrj/xframe/devloper/XDevEditXLayer.cpp    |  561 ++++
 jrj/xframe/devloper/XDevEditXOffice.cpp   |  561 ++++
 jrj/xframe/devloper/XDevEditXRuler.cpp    |  561 ++++
 jrj/xframe/devloper/XDevEditXMSSQL.cpp    |  561 ++++
 jrj/xframe/kobject/kxml.hpp               |   18 
 jrj/xframe/devloper/XDevEditXFlow.cpp     |  561 ++++
 jrj/xframe/devloper/XDevEditXWKDlg.cpp    |  561 ++++
 jrj/xframe/devloper/XDevEditXPage.cpp     |  130 +
 jrj/xframe/devloper/devloper.cpp          |    8 
 jrj/xframe/devloper/XDevEditXQuery.cpp    |  272 ++
 jrj/xframe/devloper/XDevEditXDV.cpp       |  184 +
 jrj/xframe/devloper/XDevFileDlg.cpp       |  561 ++++
 jrj/xframe/devloper/XDevEditXWorkNode.cpp |  561 ++++
 jrj/xframe/devloper/XDevEditXAction.cpp   |  199 +
 jrj/ext-jrj/ext-jrj.vcxproj               |   69 
 jrj/xframe/devloper/XDevEditXFile.cpp     |  371 ++
 jrj/xframe/devloper/XDevEditXML.cpp       |  248 ++
 20 files changed, 7,420 insertions(+), 6 deletions(-)

diff --git a/jrj/ext-jrj/ext-jrj.vcxproj b/jrj/ext-jrj/ext-jrj.vcxproj
index f37cf40..063c9ef 100644
--- a/jrj/ext-jrj/ext-jrj.vcxproj
+++ b/jrj/ext-jrj/ext-jrj.vcxproj
@@ -193,7 +193,10 @@
     <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\devloper\XDevEditPage.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
+    </ClInclude>
     <ClInclude Include="..\xframe\kobject\kapp.hpp" />
     <ClInclude Include="..\xframe\kobject\kbase.hpp" />
     <ClInclude Include="..\xframe\kobject\kcachemgr.hpp" />
@@ -1168,6 +1171,70 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditDbmap.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXAction.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXCode.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXDV.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXFile.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXFlow.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXHtml.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXLayer.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXML.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXMSSQL.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXOffice.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXPage.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXQuery.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXRuler.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXWKDlg.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditXWorkNode.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="..\xframe\devloper\XDevItemDlg.cpp" />
     <ClCompile Include="..\xframe\src\nmemory.cpp" />
     <ClCompile Include="..\xframe\src\nstring.cpp" />
diff --git a/jrj/xframe/devloper/XDevEditDbmap.cpp b/jrj/xframe/devloper/XDevEditDbmap.cpp
new file mode 100644
index 0000000..3b3cd2d
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditDbmap.cpp
@@ -0,0 +1,317 @@
+#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/xsedit.hpp>
+
+
+using xml = KXMLDOMDocument;
+class export XDevEditDbmap : public xwin
+{
+	public:
+	XDevEditDbmap(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+public:
+	static XDevEditDbmap* CreateInstance(void* implPtr, void* hWnd)
+	{
+		return new XDevEditDbmap(implPtr, (HWND)hWnd);
+	}
+private:	//
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		/*xstring xfNodeAgentArea  =L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		var xframeElement =  GetElement();
+		var agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
+		if(agent)
+		{
+			xstring s = agent.xml;
+			m_agentNode =  SetAgentNodeContent (anode,s);
+		}*/
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		//trace(content);
+		xsedit xs = GetControl(L"content");
+		if (content != L"")
+		{
+			xs.LoadContent(content,L".xml");
+		}
+	else
+	   xs.LoadContent(L"",L".xml");
+
+	xsedit xs1 = GetControl(L"xmlcontent");
+	xs1.LoadContent(L"",L".xml");
+
+	return 1;
+	}
+
+	xstring OnGetType()
+	{
+		xwin w = GetFrameWindow();
+		xtreeview tv_folder = w.GetControl(L"DevExplorer");
+		HTREEITEM hItem = (HTREEITEM)GetWinParam();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring str = e.getAttribute(L"type");
+		return str;
+	}
+
+	xstring OnGetUri()
+	{
+		xwin w = GetFrameWindow();
+		xtreeview tv_folder = w.GetControl(L"DevExplorer");
+		HTREEITEM hItem = (HTREEITEM)GetWinParam();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring str = e.getAttribute(L"uri");
+		return str;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		xstring content;
+		xsedit xs = GetControl(L"content");
+		xs.GetContent(content);
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+		if (comdid == L"xmFileSave")
+		{
+			//save xml content
+			SaveContent(content);
+		}
+		else if (comdid == L"xmRunTest")
+		{
+			xstring xmlcontent;
+			xsedit xs1 = GetControl(L"xmlcontent");
+			xs1.GetContent(xmlcontent);
+			xaserverarg arg;
+
+			arg.AddArg(L"dbmap",OnGetUri());
+			arg.AddArg(L"content",xmlcontent);
+			xml x ;
+			if (xaserver::ExecXQuery(GetServerUrl(),L"[ObjectSave.xq]",arg.GetString(),x) != 1)
+			{
+				trace(x.xml());
+				return 1;
+			}
+			xsedit xs2 = GetControl(L"sqlcontent");
+			xs2.LoadContent(x.xml(), L".xml");
+			trace(x.xml());
+		}
+		else if (comdid == L"xmTransGetSql")
+		{
+			xstring xmlcontent;
+			xsedit xs1 = GetControl(L"content");
+			xs1.GetContent(xmlcontent);
+			xaserverarg arg ;
+
+			arg.AddArg(L"content",xmlcontent);
+			xml x ;
+			if (xaserver::ExecXQuery(GetServerUrl(),L"[GenTransSql.xq]",arg.GetString(),x) != 1)
+			{
+				trace(x.xml());
+				return 1;
+			}
+			xsedit xs2 = GetControl(L"xmlTransSql");
+			xs2.LoadContent(x.text(), L".xml");
+			//trace(x.xml());
+		}
+
+		else if (comdid == L"xmGetSql")
+		{
+			xstring xmlcontent;
+			xsedit xs1 = GetControl(L"xmlcontent");
+			xs1.GetContent(xmlcontent);
+			xaserverarg arg ;
+
+			arg.AddArg(L"dbmap",OnGetUri());
+			arg.AddArg(L"content",xmlcontent);
+			xml x ;
+			if (xaserver::ExecXQuery(GetServerUrl(),L"[ObjectSaveSql.xq]",arg.GetString(),x) != 1)
+			{
+				trace(x.xml());
+				return 1;
+			}
+			xsedit xs2 = GetControl(L"sqlcontent");
+			xs2.LoadContent(x.text(), L".sql");
+		}
+		else if (comdid == L"xmRun")
+		{
+			xml x ;
+			x.loadXML(content);
+			KXMLDOMElement e = x.documentElement();
+			if (e.selectSingleNode(L"test[1]/@xpage"))
+			{
+				xstring xpage = e.selectSingleNode(L"test/@xpage").text();
+				xaserverarg arg;
+				arg.AddArg(L"configxml", content);
+				//arg.AddArg(L"config",L"");
+				if (e.selectSingleNode(L"test/@EntityID"))
+					arg.AddArg(L"EntityID", e.selectSingleNode(L"test/@EntityID").text());
+				OpenWindow(xpage +L"native=true", arg);
+			}
+		}
+		else if (comdid ==L"xmValid")
+		{
+			xml x;
+			if (!x.loadXML(content))
+			{
+				KXMLDOMParseError pError = x.parseError;
+				if (pError)
+				{
+					xstring str = pError.srcText();
+					xstring sError =L"\r\nXML错误: " + str.trim() +L"\r\n";
+					int s = pError.errorCode();
+					sError +=L"   代码: " + xstring(s) + L"\r\n";
+					s = pError.line();
+					sError +=L"   位置: 第" + xstring(s) +L"行,L";
+					s = pError.linepos();
+					sError +=L"第" + xstring(s) +L"列" +L"\r\n";
+					str = pError.reason();
+					sError +=L"   原因: " + str;
+					trace(sError);
+				}
+				else
+				{
+					trace(L"XML 错误");
+				}
+				xutil::RestoreCursor(hCursor);
+				return -1;
+			}
+			xstring sType = OnGetType();
+			if (sType ==L"xml.xsd")
+			{
+				xstring sError;
+				x.ValidSchema(content, &sError);
+				trace(sError);
+			}
+		}
+		else if (comdid ==L"xmEditFind")
+		{
+			xutil::RestoreCursor(hCursor);
+			xsedit xs = GetControl(L"content");
+			xs.OnFindDlg();
+			return 1;
+		}
+		else if (comdid ==L"xmEditReplace")
+		{
+			xutil::RestoreCursor(hCursor);
+			xsedit xs = GetControl(L"content");
+			xs.OnReplaceDlg();
+			return 1;
+		}
+		xutil::RestoreCursor(hCursor);
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,LPARAM param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnLButtonDown(TNotifyEvent* evt,LPARAM p)
+	{
+		xsedit edit_1 = GetControl(L"content");
+		int sPos = edit_1.GetSelectionStart();
+		int ePos = edit_1.GetSelectionEnd();
+		xstring content = edit_1.GetText();
+		content = content.mid(sPos, ePos - sPos);
+		//trace(content);
+		if (content ==L"") return -1;
+		xwin w = GetFrameWindow();
+		xtreeview tv_folder = w.GetControl(L"DevExplorer");
+		HTREEITEM hItem = GetWinParam();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		//trace(e.xml);
+		xstring str = e.getAttribute(L"type");
+		xstring uri = e.getAttribute(L"uri");
+		//trace(str);
+		xml xl ;
+		xstring xtype =L"";
+		if (str ==L"iface")
+			//xaserver::LoadUrl(GetServerUrl(),L"dev:xml[sale.data.url.xml]",L"",xl);
+			xtype =L"data";
+		else if (str ==L"vface")
+			//xaserver::LoadUrl(GetServerUrl(),L"dev:xml[sale.view.url.xml]",L"",xl);
+			xtype =L"view";
+		else
+			return 0;
+		xaserver::LoadUrl(GetServerUrl(),L"dev:xml[sale." + xtype +L".url.xml]",L"",xl);
+		//trace(xl.xml());
+		auto doc = xl;
+		auto n = doc.selectSingleNode(L"//item[@src='dev:" + str +L"[" + uri +L"]']/@url");
+		//trace(n.xml);
+		xstring aurl =L"";
+		if (n)
+		{
+			xstring tmp =L"" + n.text();
+			aurl =L"/sale/" + xtype +L"/" + tmp +L"/" + content;
+		}
+		else
+			return -1;
+		trace(aurl);
+		xml x;
+		xaserverarg arg;
+		arg.AddArg(L"url",aurl +L"?node");
+		if (xaserver::ExecXQuery(GetServerUrl(),L"[service.url.xq]",arg.GetString(),x) != 1)
+		{
+			trace((xstring)L"error:" + x.xml());
+			return 0;
+		}
+		trace(x.xml());
+		xaserver::FetchXml(GetServerUrl(),L"dev:xpage[XDevEdit.xml]",L"",xl);
+		//trace(xl.xml());
+		auto n1 = xl.selectSingleNode(L"//editor[@filetype='" + str +L"']/@xpage");
+		if (n1)
+		{
+			xstring xpage = n1.text();
+			trace(xpage);
+			xstring pa =x.xml();
+			OpenWindow(L"dev:xpage[" + xpage +L"]", 0);
+		}
+
+		return 1;
+	}
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditDbmap::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditDbmap::OnSetFocus);
+		//AttachEvent(L"content",L"WM_LBUTTONDOWN", (FEvent)&XDeveloper::OnLButtonDown);
+	}
+
+	int OnInitial()
+	{
+		SetAgent();
+
+		OnAttachEvent();
+
+		return 1;
+	}
+
+	int onload()
+	{
+		OnInitial();
+		LoadData();
+
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXAction.cpp b/jrj/xframe/devloper/XDevEditXAction.cpp
new file mode 100644
index 0000000..2d29c07
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXAction.cpp
@@ -0,0 +1,199 @@
+#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/xdwgrid.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xcombobox.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevEditAction : public xwin
+{
+	public:
+	XDevEditAction(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+public:
+	static XDevEditAction* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditAction* pWin = new XDevEditAction(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+	xdwgrid	dw_list;
+
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		/*
+		xstring xfNodeAgentArea  = L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		auto xframeElement =  GetElement();
+		auto agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
+		if(agent)
+		{
+			xstring s = agent.xml;
+			m_agentNode =  SetAgentNodeContent (anode,s);
+		}
+		*/
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,int param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		if (content != L"")
+		{
+			xsedit xs = GetControl(L"sqlcontent");
+			xml x ;
+			x.loadXML(content);
+			KXMLDOMElement e = x.documentElement();
+			auto ele = e.selectSingleNode(L"datasource/sql");
+			if (ele)
+				xs.LoadContent(ele.text(), L".sql");
+
+			KXMLDOMElement e1 = e.selectSingleNode(L"datasource");
+			xcontrol xc = GetControl(L"datasource");
+			xstring v = e1.getAttribute(L"source");
+			xc.SetText(L"" + v);
+			xc = GetControl(L"linkname");
+			xstring v = e1.getAttribute(L"link");
+			xc.SetText(L"" + v);
+
+			KXMLDOMElement e2 = e.selectSingleNode(L"paras");
+			xml y ;
+			y.loadXML(e2.xml());
+			dw_list.Retrieve(y);
+		}
+		return 1;
+	}
+
+	xstring ProcessDevCmdEx(xstring cmd)
+	{
+		int nlen = 0;
+		BYTE* pdata;
+		xaserver::ProcessCmd(GetServerUrl(),L"uri.hxsoft.com/xaserver/xaction:" + cmd,0,pdata,nlen);
+		if (nlen > 0)
+		{
+			xstring str = ((WCHAR*)pdata);
+			return str.mid(0,9999999);
+		}
+else
+   return L"";
+}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		if (comdid == L"xmFileSave")
+		{
+			HCURSOR hCursor = xutil::SetCursorWait();
+
+			xstring content;
+			xsedit xs = GetControl(L"sqlcontent");
+			xs.GetContent(content);
+
+			xml x ;
+			x.loadXML(L"<xquery/>");
+			auto root = x;
+			KXMLDOMElement e = root.createElement(L"datasource");
+			xcontrol xc = GetControl(L"datasource");
+			xstring v = xc.GetText();
+			e.setAttribute(L"source", L"" + v);
+			xc = GetControl(L"linkname");
+			v = xc.GetText();
+			e.setAttribute(L"link", L"" + v);
+			KXMLDOMElement e1 = root.createElement(L"sql");
+			e1.settext(content);
+			e.appendChild(e1);
+			root.documentElement().appendChild(e);
+
+			xml y ;
+			dw_list.DwUpdateTo(y);
+			root.documentElement().appendChild(y.documentElement());
+			//trace(y.xml());
+
+			//trace(x.xml());
+			SaveContent(x.xml());
+
+			xutil::RestoreCursor(hCursor);
+		}
+		else if (comdid == L"xmFilePreview")
+		{
+			xstring content;
+			xsedit xs = GetControl(L"sqlcontent");
+			xs.GetContent(content);
+
+			xwin w = GetFrameWindow();
+			xtreeview tv_folder = w.GetControl(L"DevExplorer");
+			HTREEITEM hItem = (HTREEITEM)GetWinParam();
+			KXMLDOMElement e = tv_folder.GetItemData(hItem);
+			xstring guid = e.getAttribute(L"guid");
+
+			//uri.hxsoft.com/xaserver/xquery:{70CFB15C-7722-4134-9842-0DE692F4B4FC}
+			xstring data = ProcessDevCmdEx(guid);
+			//trace(data);
+
+			//xlayersheet tab = GetControl(L"detailArea");
+			//tab.SelectSheet(1);
+
+			xsedit xc = GetControl(L"resultcontent");
+			xc.LoadContent(L"" + data,L".xml");
+		}
+		else if (comdid == L"argadd")
+		{
+			dw_list.InsertRow(0);
+		}
+		else if (comdid == L"argdelete")
+		{
+			int row = dw_list.GetRow();
+			if (row < 1) return 0;
+			dw_list.DeleteRow(row);
+		}
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,LPARAM param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND", (FEvent) & XDevEditAction::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditAction::OnSetFocus);
+	}
+
+	int OnInitial()
+	{
+		SetAgent();
+
+		OnAttachEvent();
+
+		return 1;
+	}
+
+	int onload()
+	{
+		dw_list = GetControl(L"parasgrid");
+
+		OnInitial();
+		LoadData();
+
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXCode.cpp b/jrj/xframe/devloper/XDevEditXCode.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXCode.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXDV.cpp b/jrj/xframe/devloper/XDevEditXDV.cpp
new file mode 100644
index 0000000..621b492
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXDV.cpp
@@ -0,0 +1,184 @@
+#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/xdwgrid.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xcombobox.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevEditXDV : public xwin
+{
+	public:
+	XDevEditXDV(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+public:
+	static XDevEditXDV* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditXDV* pWin = new XDevEditXDV(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		xstring xfNodeAgentArea = L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		auto xframeElement = GetElement();
+		auto agent = xframeElement.selectSingleNode(L"agent/" + xfNodeAgentArea + L"[1]/*");
+		if (agent)
+		{
+			xstring s = agent.xml();
+			m_agentNode = SetAgentNode(anode,s);
+		}
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		if (content != L"")
+		{
+			xsedit xs = GetControl(L"xcontent");
+			xs.LoadContent(content,L".xml");
+		}
+		return 1;
+	}
+
+	xstring OnGetType()
+	{
+		xwin w = GetFrameWindow();
+		xtreeview tv_folder = w.GetControl(L"DevExplorer");
+		HTREEITEM hItem = (HTREEITEM)GetWinParam();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring str = e.getAttribute(L"type");
+		return str;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		xstring content;
+		xsedit xs = GetControl(L"xcontent");
+		xs.GetContent(content);
+		HCURSOR hCursor = xutil::SetCursorWait();
+		if (comdid == L"xmFileSaveEx")
+		{
+			//save xml content
+			SaveContent(content);
+			xutil::RestoreCursor(hCursor);
+			return 1;
+		}
+		else if (comdid == L"xmValidEx")
+		{
+			xml x;
+			if (!x.loadXML(content))
+			{
+				KXMLDOMParseError pError = x.parseError;
+				if (pError)
+				{
+					xstring str = pError.srcText();
+					xstring sError = L"\r\nXML错误: " + str.trim() + L"\r\n";
+					int s = pError.errorCode();
+					sError += L"   代码: " + xstring(s) + L"\r\n";
+					s = pError.line();
+					sError += L"   位置: 第" + xstring(s) + L"行,L";
+					s = pError.linepos();
+					sError += L"第" + xstring(s) + L"列" + L"\r\n";
+					str = pError.reason();
+					sError += L"   原因: " + str;
+					trace(sError);
+				}
+				else
+				{
+					trace(L"XML 错误");
+				}
+				xutil::RestoreCursor(hCursor);
+				return -1;
+			}
+			xstring sType = OnGetType();
+			if (sType == L"xml.xsd")
+			{
+				xstring sError;
+				x.ValidSchema(content, &sError);
+				trace(sError);
+			}
+			xutil::RestoreCursor(hCursor);
+			return 1;
+		}
+		else if (comdid == L"xmEditFind")
+		{
+			OpenWindow(L"dev:xpage[xcode.finddlg]");
+		}
+		else if (comdid == L"xmEditReplace")
+		{
+			OpenWindow(L"dev:xpage[xcode.replacedlg]");
+		}
+		xutil::RestoreCursor(hCursor);
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,int param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditXDV::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXDV::OnSetFocus);
+	}
+
+	/*
+	int  OnRetrieve()
+	{
+		xstring query=L"[xxx]";
+		xml x = new xml;
+		xaserverarg arg;
+		arg.AddArg(L"xxx",L"xxx");
+		if (xaserver::ExecXQuery(GetServerUrl(),query,arg.Getxstring(),x)!=1)
+		{
+			trace(x.text);
+			return -1;
+		}else
+		{
+			dw_list.Retrieve(x);
+			dw_list.Redraw();
+		}
+		return 1;
+	}
+	*/
+
+	int OnInitial()
+	{
+		SetAgent();
+
+		OnAttachEvent();
+
+		return 1;
+	}
+
+	int onload()
+	{
+
+		OnInitial();
+		LoadData();
+
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXFile.cpp b/jrj/xframe/devloper/XDevEditXFile.cpp
new file mode 100644
index 0000000..50e0dea
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXFile.cpp
@@ -0,0 +1,371 @@
+#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/xdwgrid.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xcombobox.hpp>
+#include <xcontrol/xreport.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevEditXFile : public xwin
+{
+	public:
+	XDevEditXFile(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+public:
+	static XDevEditXFile* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditXFile* pWin = new XDevEditXFile(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+	xreport xp;
+
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		/*		xstring xfNodeAgentArea  = L"agentarea";
+				xnode anode = GetAgentNode(xfNodeAgentArea);
+				auto xframeElement =  GetElement();
+				auto agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
+				if(agent)
+				{
+					xstring s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
+				}
+		*/		return 1;
+			}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	xstring OnGetType()
+	{
+		xwin w = GetFrameWindow();
+		xtreeview tv_folder = w.GetControl(L"DevExplorer");
+		HTREEITEM hItem = (HTREEITEM)GetWinParam();
+		KXMLDOMElement e = tv_folder.GetItemData(hItem);
+		xstring str = e.getAttribute(L"type");
+		return str;
+	}
+
+	KXMLDOMElement OnRetrieve(KXMLDOMElement ele)
+	{
+		xml doc;
+		doc.loadXML(L"<schema/>");
+		auto docroot = doc.documentElement();
+
+		auto list = ele.selectNodes(L"*");
+		int i;
+		int s = list.length();
+		for (i = 0; i < s; i++)
+		{
+			KXMLDOMElement e = list.item(i);
+			xstring name = e.getAttribute(L"name");
+			xstring id = e.getAttribute(L"id");
+			xstring sechma = e.getAttribute(L"sechma");
+			xstring et = e.getAttribute(L"et");
+
+			xml x;
+			x.loadXML(L"<item/>");
+			auto root = x.documentElement();
+			root.setAttribute(L"colname",id);
+			root.setAttribute(L"name",name);
+			root.setAttribute(L"type",sechma);
+			root.setAttribute(L"note",et);
+
+			if (e.hasChildNodes())
+			{
+				KXMLDOMElement e1 = OnRetrieve(e);
+				KXMLDOMNodeList e2 = e1.selectNodes(L"item");
+				int k;
+				int l = e2.length();
+				for (k = 0; k < l; k++)
+					root.appendChild(e2.item(k));
+			}
+
+			docroot.appendChild(root);
+		}
+		return docroot;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		xsedit xs = GetControl(L"xcontent");
+		xstring content;
+		xs.GetContent(content);
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+		if (comdid == L"xmFileSave")
+		{
+			//save xml content
+			SaveContent(content);
+		}
+		else if (comdid == L"xmTable")
+		{
+			xml x;
+			xaserverarg arg;
+			arg.AddArg(L"content",content);
+			if (xaserver::ExecXQuery(GetServerUrl(),L"[GenTableSchema.xq]",arg.GetString(),x) != 1)
+			{
+				return 1;
+			}
+			//trace(x.text);
+			xsedit xs1 = GetControl(L"gncontent");
+			xs1.LoadContent(x.xml(),L".sql");
+		}
+		else if (comdid == L"xmDDL")
+		{
+			xml x;
+			xaserverarg arg;
+			arg.AddArg(L"content",content);
+			if (xaserver::ExecXQuery(GetServerUrl(),L"[GenDLLBySchema.xq]",arg.GetString(),x) != 1)
+			{
+				return 1;
+			}
+			xsedit xs1 = GetControl(L"gncontent");
+			xs1.LoadContent(x.xml(),L".sql");
+			//trace(x.text);
+		}
+		else if (comdid == L"xmDbmap")
+		{
+			xml x;
+			xaserverarg arg;
+			arg.AddArg(L"content",content);
+			if (xaserver::ExecXQuery(GetServerUrl(),L"[GenDbmapBySchema.xq]",arg.GetString(),x) != 1)
+			{
+				return 1;
+			}
+			xsedit xs1 = GetControl(L"gncontent");
+			xs1.LoadContent(x.xml(),L".xml");
+			//trace(x.xml());
+		}
+		else if (comdid == L"xmValid")
+		{
+			if (L"" + content == L"") return 0;
+			xml x;
+			if (!x.loadXML(content))
+			{
+				KXMLDOMParseError pError = x.parseError;
+				if (pError)
+				{
+					xstring str = pError.srcText();
+					xstring sError = L"\r\nXMLaa错误: " + str.trim() + L"\r\n";
+					int s = pError.errorCode();
+					sError += L"   代码: " + xstring(s) + L"\r\n";
+					s = pError.line();
+					sError += L"   位置: 第" + xstring(s) + L"行,L";
+					s = pError.linepos();
+					sError += L"第" + xstring(s) + L"列" + L"\r\n";
+					str = pError.reason();
+					sError += L"   原因: " + str;
+					trace(sError);
+				}
+				else
+				{
+					trace(L"XML 错误");
+				}
+				return -1;
+			}
+			xstring sType = OnGetType();
+			if (sType == L"xml.xsd")
+			{
+				xstring sError;
+				x.ValidSchema(content, &sError);
+				trace(sError);
+			}
+		}
+		else if (comdid == L"xview")
+		{
+			if (L"" + content == L"") return 0;
+			if (OnCmdDispatch(L"xmValid") != -1)
+			{
+				xml x;
+				if (x.loadXML(content))
+				{
+					xp.Reset();
+					/*					xp.ResetEx();
+										while(xp.GetRowCount() > 0)
+											xp.DeleteRow(1);
+					*/					xp.Redraw();
+										xstring sType = OnGetType();
+										if (sType == L"iface")
+										{
+											auto e = x.selectSingleNode(L"interface");
+											if (e) {
+												KXMLDOMElement ele = OnRetrieve(e);
+												xp.Retrieve(ele);
+											}
+										}
+										else if (sType == L"xml.xsd")
+										{
+											xml doc;
+											x.GetSchemaXml(content,doc);
+											//trace(doc.xml());
+											auto e = doc.selectSingleNode(L"root/schema");
+											if (e) {
+												xp.Retrieve(e);
+											}
+										}
+										xp.CreateTree(L"node()", 1, 15, 16);
+										xp.Redraw();
+									}
+								}
+							}
+							xutil::RestoreCursor(hCursor);
+							return 0;
+						}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,int param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	xstring GetXSD(xstring name)
+	{
+		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"";
+				int 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)
+					{
+						auto f = e.selectSingleNode(L"//*[@uri='" + name + L"']");
+						if (f) {
+							xstring guid = KXMLDOMElement(f).selectSingleNode(L"@guid").text;//.getAttribute(L"guid");
+							if (guid == L"")
+								return "";
+							arg.AddArg(L"guid",guid);
+						}
+	else
+	   return "";
+	}
+	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);
+	}
+	return ProcessDevCmd(L"getobject",arg.GetString());
+	}
+	else
+		return L"";
+	}
+
+int OnDoubleClicked(ref TNotifyEvent evt,int param)
+{
+	ref DWNMHDR  hdr = evt.pnmh;
+	int row = hdr.row;
+	KXMLDOMElement e = xp.GetRowElement(row);
+	xstring filename = e.getAttribute(L"type");
+	if (filename.right(4) == L".xsd")
+	{
+		xstring xsd = GetXSD(L"" + filename);
+		xml x;
+		x.GetSchemaXml(xsd,x);
+		trace(x.xml());
+
+		/*			xml x = new xml;
+					xaserver::FetchXml(GetServerUrl(),L"dev:xpage[XDevEdit.xml]",L"",x);
+					auto n = x.selectSingleNode(L"//editor[@filetype='xml.xsd']/@xpage");
+					if(n)
+					{
+						xstring xpage = n.text;
+						xwin w = GetFrameWindow();
+						xlayersheet layer = w.GetControl(L"mdilayer");
+						int i = 0;
+						int nIndex = layer.GetSheetCount();
+						for(i=0;i<nIndex;i++)
+						{
+							if(hItem == layer.GetWinParam(i))break;
+						}
+						if(i<nIndex)return 1;
+
+						OpenWindow(L"dev:xpage["+xpage+L"]",hItem);
+						if(nIndex < layer.GetSheetCount())
+							layer.SetParam(nIndex,hItem);
+					}
+		*/
+				}
+		return 1;
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND",OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS",OnSetFocus);
+		AttachEvent(L"xreport",L"DWV_DOUBLECLICKED",OnDoubleClicked);
+	}
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+		xsedit xs = GetControl(L"xcontent");
+		xstring content = GetData();
+		if (content != L"")
+		{
+			xs.LoadContent(content,L".xml");
+		}
+		return 1;
+	}
+
+	int OnInitial()
+	{
+		SetAgent();
+
+		OnAttachEvent();
+
+		return 1;
+	}
+
+	int onload()
+	{
+		OnInitial();
+
+		xp = GetControl(L"xreport");
+
+		LoadData();
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXFlow.cpp b/jrj/xframe/devloper/XDevEditXFlow.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXFlow.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXHtml.cpp b/jrj/xframe/devloper/XDevEditXHtml.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXHtml.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXLayer.cpp b/jrj/xframe/devloper/XDevEditXLayer.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXLayer.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXML.cpp b/jrj/xframe/devloper/XDevEditXML.cpp
new file mode 100644
index 0000000..1467847
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXML.cpp
@@ -0,0 +1,248 @@
+#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/xdwgrid.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xcombobox.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevEditXML : public xwin
+{
+	public:
+	XDevEditXML(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+public:
+	static XDevEditXML* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditXML* pWin = new XDevEditXML(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		/*xstring xfNodeAgentArea  = L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		auto xframeElement =  GetElement();
+		auto agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
+		if(agent)
+		{
+			xstring s = agent.xml;
+			m_agentNode =  SetAgentNodeContent (anode,s);
+		}*/
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		//trace(content);
+		xsedit xs = GetControl(L"content");
+		if (content != L"")
+		{
+			xs.LoadContent(content,L".xml");
+		}
+else
+   xs.LoadContent(L"",L".xml");
+return 1;
+}
+
+xstring OnGetType()
+{
+	xwin w = GetFrameWindow();
+	xtreeview tv_folder = w.GetControl(L"DevExplorer");
+	HTREEITEM hItem = (HTREEITEM)GetWinParam();
+	KXMLDOMElement e = tv_folder.GetItemData(hItem);
+	xstring str = e.getAttribute(L"type");
+	return str;
+}
+
+//命令发布函数
+int OnCmdDispatch(xstring comdid)
+{
+	xstring content;
+	xsedit xs = GetControl(L"content");
+	xs.GetContent(content);
+
+	HCURSOR hCursor = xutil::SetCursorWait();
+	if (comdid == L"xmFileSave")
+	{
+		//save xml content
+		SaveContent(content);
+	}
+	else if (comdid == L"xmRun")
+	{
+		xml x = new xml;
+		x.loadXML(content);
+		KXMLDOMElement e = x.documentElement();
+		if (e.selectSingleNode(L"test[1]/@xpage"))
+		{
+			xstring xpage = e.selectSingleNode(L"test/@xpage").text();
+			xaserverarg arg;
+			arg.AddArg(L"configxml", content);
+			//arg.AddArg(L"config", L"");
+			if (e.selectSingleNode(L"test/@EntityID"))
+				arg.AddArg(L"EntityID", e.selectSingleNode(L"test/@EntityID").text());
+			OpenWindow(xpage + L"native=true", arg);
+		}
+	}
+	else if (comdid == L"xmValid")
+	{
+		xml x;
+		if (!x.loadXML(content))
+		{
+			KXMLDOMParseError pError = x.parseError();
+			if (pError)
+			{
+				xstring str = pError.srcText();
+				xstring sError = L"\r\nXML错误: " + str.trim() + L"\r\n";
+				int s = pError.errorCode();
+				sError += L"   代码: " + xstring(s) + L"\r\n";
+				s = pError.line();
+				sError += L"   位置: 第" + xstring(s) + L"行,L";
+				s = pError.linepos();
+				sError += L"第" + xstring(s) + L"列" + L"\r\n";
+				str = pError.reason();
+				sError += L"   原因: " + str;
+				trace(sError);
+			}
+			else
+			{
+				trace(L"XML 错误");
+			}
+			xutil::RestoreCursor(hCursor);
+			return -1;
+		}
+		xstring sType = OnGetType();
+		if (sType == L"xml.xsd")
+		{
+			xstring sError;
+			x.ValidSchema(content, &sError);
+			trace(sError);
+		}
+	}
+	else if (comdid == L"xmEditFind")
+	{
+		xutil::RestoreCursor(hCursor);
+		xsedit xs = GetControl(L"content");
+		xs.OnFindDlg();
+		return 1;
+	}
+	else if (comdid == L"xmEditReplace")
+	{
+		xutil::RestoreCursor(hCursor);
+		xsedit xs = GetControl(L"content");
+		xs.OnReplaceDlg();
+		return 1;
+	}
+	xutil::RestoreCursor(hCursor);
+	return 0;
+}
+
+//命令处理事件
+int OnXCommand(TEvent* evt,LPARAM param)
+{
+	return OnCmdDispatch(evt->xcommand.pStrID);
+}
+
+int OnLButtonDown(TEvent* evt,LPARAM p)
+{
+	xsedit edit_1 = GetControl(L"content");
+	int sPos = edit_1.GetSelectionStart();
+	int ePos = edit_1.GetSelectionEnd();
+	xstring content = edit_1.GetText();
+	content = content.mid(sPos, ePos - sPos);
+	//trace(content);
+	if (content == L"") return -1;
+	xwin w = GetFrameWindow();
+	xtreeview tv_folder = w.GetControl(L"DevExplorer");
+	HTREEITEM hItem = (HTREEITEM)GetWinParam();
+	KXMLDOMElement e = tv_folder.GetItemData(hItem);
+	//trace(e.xml);
+	xstring str = e.getAttribute(L"type");
+	xstring uri = e.getAttribute(L"uri");
+	//trace(str);
+	xml xl = new xml;
+	xstring xtype = L"";
+	if (str == L"iface")
+		//xaserver::LoadUrl(GetServerUrl(),L"dev:xml[sale.data.url.xml]",L"",xl);
+		xtype = L"data";
+	else if (str == L"vface")
+		//xaserver::LoadUrl(GetServerUrl(),L"dev:xml[sale.view.url.xml]",L"",xl);
+		xtype = L"view";
+	else
+		return 0;
+	xaserver::LoadUrl(GetServerUrl(),L"dev:xml[sale." + xtype + L".url.xml]",L"",xl);
+	//trace(xl.xml());
+	auto doc = xl;
+	auto n = doc.selectSingleNode(L"//item[@src='dev:" + str + L"[" + uri + L"]']/@url");
+	//trace(n.xml);
+	xstring aurl = L"";
+	if (n)
+	{
+		xstring tmp = n.text();
+		aurl = L"/sale/" + xtype + L"/" + tmp + L"/" + content;
+	}
+	else
+		return -1;
+	trace(aurl);
+	xml x = new xml;
+	xaserverarg arg;
+	arg.AddArg(L"url",aurl + L"?node");
+	if (xaserver::ExecXQuery(GetServerUrl(),L"[service.url.xq]",arg.GetString(),x) != 1)
+	{
+		trace((xstring)L"error:" + x.xml());
+		return 0;
+	}
+	trace(x.xml());
+	xaserver::FetchXml(GetServerUrl(),L"dev:xpage[XDevEdit.xml]",L"",xl);
+	//trace(xl.xml());
+	auto n1 = xl.selectSingleNode(L"//editor[@filetype='" + str + L"']/@xpage");
+	if (n1)
+	{
+		xstring xpage = n1.text();
+		trace(xpage);
+		OpenWindow(L"dev:xpage[" + xpage + L"]", 0);
+	}
+
+	return 1;
+}
+int OnAttachEvent()
+{
+	//绑定工具条点击事件
+	AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditXML::OnXCommand);
+	//获取焦点事件,用于重置工具条
+	AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXML::OnSetFocus);
+	//AttachEvent(L"content",L"WM_LBUTTONDOWN", ,(FEvent)&XDevEditXML::OnLButtonDown);
+}
+
+int OnInitial()
+{
+	SetAgent();
+
+	OnAttachEvent();
+
+	return 1;
+}
+
+int onload()
+{
+	OnInitial();
+	LoadData();
+
+	return 1;
+}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXMSSQL.cpp b/jrj/xframe/devloper/XDevEditXMSSQL.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXMSSQL.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXOffice.cpp b/jrj/xframe/devloper/XDevEditXOffice.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXOffice.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXPage.cpp b/jrj/xframe/devloper/XDevEditXPage.cpp
new file mode 100644
index 0000000..0e63798
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXPage.cpp
@@ -0,0 +1,130 @@
+#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/xsedit.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevEditXPage : public xwin
+{
+	public:
+	XDevEditXPage(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd){}
+public:
+	static XDevEditXPage* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditXPage* pWin = new XDevEditXPage(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		/*
+		xstring xfNodeAgentArea  = L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		var xframeElement =  GetElement();
+		var agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
+		if(agent)
+		{
+			xstring s = agent.xml;
+			m_agentNode =  SetAgentNodeContent (anode,s);
+		}
+		*/
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		if (comdid == L"xmPreview")
+		{
+		}
+		else if (comdid == L"xmFileSaveEx")
+		{
+			xsedit xs = GetControl(L"xpagecontent");
+			xsedit xc = GetControl(L"xcodecontent");
+
+			HCURSOR hCursor = xutil::SetCursorWait();
+
+			xstring content;
+			//save xml content
+			xs.GetContent(content);
+			SaveContent(content);
+
+			xstring code;
+			//save tpp content
+			xc.GetContent(code);
+			SaveContentEx(code,1);
+			//
+			xutil::RestoreCursor(hCursor);
+
+			return 1;
+		}
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,LPARAM param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditXPage::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXPage::OnSetFocus);
+	}
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+
+		xsedit xs = GetControl(L"xpagecontent");
+		xsedit xc = GetControl(L"xcodecontent");
+
+		xstring content = GetData();
+		if (content != L"")
+		{
+			xs.LoadContent(content,L".xml");
+		}
+		xstring code = GetData(1);
+		if (code != L"")
+		{
+
+			xc.LoadContent(code,L".vl");
+			//xc.LoadContent(code,L".cpp");
+		}
+
+		return 1;
+	}
+
+	int OnInitial()
+	{
+		SetAgent();
+
+		OnAttachEvent();
+
+		return 1;
+	}
+
+	int onload()
+	{
+		OnInitial();
+		LoadData();
+		return 1;
+	}
+}; 
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXQuery.cpp b/jrj/xframe/devloper/XDevEditXQuery.cpp
new file mode 100644
index 0000000..9d50fc8
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXQuery.cpp
@@ -0,0 +1,272 @@
+#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/xdwgrid.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xcombobox.hpp>
+
+using xml = KXMLDOMDocument;
+class export XDevEditXQuery : public xwin
+{
+	public:
+	XDevEditXQuery(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+public:
+	static XDevEditXQuery* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditXQuery* pWin = new XDevEditXQuery(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+	xdwgrid	dw_list;
+
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		/*
+		xstring xfNodeAgentArea  = L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		auto xframeElement =  GetElement();
+		auto agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
+		if(agent)
+		{
+			xstring s = agent.xml;
+			m_agentNode =  SetAgentNodeContent (anode,s);
+		}
+		*/
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		xsedit xs = GetControl(L"sqlcontent");
+		if (content != L"")
+		{
+			xml x;
+			x.loadXML(content);
+			KXMLDOMElement e = x.documentElement();
+			auto ele = e.selectSingleNode(L"datasource/sql");
+			if (ele)
+				xs.LoadContent(ele.text(), L".sql");
+
+			KXMLDOMElement e1 = e.selectSingleNode(L"datasource");
+			xcontrol xc = GetControl(L"datasource");
+			xstring v = e1.getAttribute(L"source");
+			xc.SetText(L"" + v);
+			xc = GetControl(L"linkname");
+			xstring v = e1.getAttribute(L"link");
+			xc.SetText(L"" + v);
+
+			KXMLDOMElement e2 = e.selectSingleNode(L"paras");
+			xml y;
+			y.loadXML(e2.xml());
+			dw_list.Retrieve(y);
+		}
+else
+{
+	xs.LoadContent(L"import 'qx.object.xq'",L".sql");
+}
+
+return 1;
+}
+
+xstring ProcessDevCmdEx(xstring cmd)
+{
+	int nlen = 0;
+	BYTE* pdata;
+	xaserver::ProcessCmd(GetServerUrl(),L"uri.hxsoft.com/xaserver/xquery:" + cmd,0,pdata,nlen);
+	if (nlen > 0)
+	{
+		xstring str = ((WCHAR*)pdata);;
+		return str.mid(0,99999999);
+	}
+else
+   return L"";
+}
+
+//命令发布函数
+int OnCmdDispatch(xstring comdid)
+{
+	HCURSOR hCursor = xutil::SetCursorWait();
+	if (comdid == L"xmFileSaveEx")
+	{
+		HCURSOR hCursor = xutil::SetCursorWait();
+
+		xstring content;
+		xsedit xs = GetControl(L"sqlcontent");
+		xs.GetContent(content);
+
+		xml x;
+		x.loadXML(L"<xquery/>");
+		auto root = x;
+		KXMLDOMElement e = root.createElement(L"datasource");
+		xcontrol xc = GetControl(L"datasource");
+		xstring v = xc.GetText();
+		e.setAttribute(L"source", L"" + v);
+		xc = GetControl(L"linkname");
+		v = xc.GetText();
+		e.setAttribute(L"link", L"" + v);
+		KXMLDOMElement e1 = root.createElement(L"sql");
+		e1.settext(content);
+		e.appendChild(e1);
+		root.documentElement().appendChild(e);
+
+		xml y ();
+		dw_list.DwUpdateTo(y);
+		root.documentElement().appendChild(y.documentElement());
+		//trace(y.xml());
+
+		//trace(x.xml());
+		SaveContent(x.xml());
+
+		xutil::RestoreCursor(hCursor);
+		return 1;
+	}
+	else if (comdid == L"xmFilePreviewEx")
+	{
+		xstring content;
+		xsedit xs = GetControl(L"sqlcontent");
+		xs.GetContent(content);
+
+		xcombobox ddlb = GetControl(L"datasource");
+		xstring ddlbStr = ddlb.GetText();
+		if (ddlbStr == L"VSQLEx")
+		{
+			xml x ;
+			xaserverarg arg ;
+			arg.AddArg(L"sql", content);
+			xaserver::ExecXQuery(GetServerUrl(), L"[test1.xq]", arg.GetString(), x);
+			xstring data = x.xml();
+			//xsedit xc = GetControl(L"resultcontent");
+			//xc.LoadContent(L""+data,L".xml");
+			xsedit xc1 = GetControl(L"frame:vdata");
+			xc1.LoadContent(L"" + data,L".xml");
+		}
+		else
+		{
+
+			xwin w = GetFrameWindow();
+			xtreeview tv_folder = w.GetControl(L"DevExplorer");
+			HTREEITEM hItem = (HTREEITEM)GetWinParam();
+			KXMLDOMElement e = tv_folder.GetItemData(hItem);
+			xstring guid = e.getAttribute(L"guid");
+
+			xstring data;
+			if (ddlbStr == L"XQUERY")
+			{
+				data = ProcessDevCmdEx(L"" + guid);
+			}
+else
+{
+	data = ProcessDevCmdEx(L"" + guid);
+	xml x ;
+	xaserver::ExecXQuery(GetServerUrl(),guid,L"",x);
+	data = x.xml();
+}
+
+			//xsedit xc = GetControl(L"resultcontent");
+			///*if(data != L"")*/ xc.LoadContent(L""+data,L".xml");
+
+			//xwin xw = GetFrameWindow();
+			xsedit xc1 = GetControl(L"frame:vdata");
+			trace(data.left(16384));
+			//if(data.length() > 16000)
+			/*if(data!=L"")
+				xc1.LoadContent(L""+data,L".xml");
+			else
+				xc1.LoadContent(L" ",L".xml");*/
+			xc1.SetText(data);
+
+		}
+		xutil::RestoreCursor(hCursor);
+		return 1;
+	}
+	else if (comdid == L"argaddEx")
+	{
+		dw_list.InsertRow(0);
+		xutil::RestoreCursor(hCursor);
+		return 1;
+	}
+	else if (comdid == L"argdeleteEx")
+	{
+		int row = dw_list.GetRow();
+		if (row < 1) return 0;
+		dw_list.DeleteRow(row);
+		xutil::RestoreCursor(hCursor);
+		return 1;
+	}
+else if (comdid == L"xmEntitySel")
+{
+	xaserverarg arg ;
+	OpenWindow(L"dev:xpage[XEntityColumnSelDlg.xpage]",arg);
+	xstring str = arg.GetArgString(L"select");
+	if (str != L"") trace(L"\r\n---------------------\r\n" + str);
+	xutil::RestoreCursor(hCursor);
+	return 1;
+}
+else if (comdid == L"xmEditFind")
+{
+	xutil::RestoreCursor(hCursor);
+	xsedit xs = GetControl(L"sqlcontent");
+	xs.OnFindDlg();
+	return 1;
+}
+else if (comdid == L"xmEditReplace")
+{
+	xutil::RestoreCursor(hCursor);
+	xsedit xs = GetControl(L"sqlcontent");
+	xs.OnReplaceDlg();
+	return 1;
+}
+
+xutil::RestoreCursor(hCursor);
+return 0;
+}
+
+//命令处理事件
+int OnXCommand(TEvent* evt,LPARAM param)
+{
+	return OnCmdDispatch(evt->xcommand.pStrID);
+}
+
+int OnAttachEvent()
+{
+	//绑定工具条点击事件
+	AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditXQuery::OnXCommand);
+	//获取焦点事件,用于重置工具条
+	AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXQuery::OnSetFocus);
+}
+
+int OnInitial()
+{
+	SetAgent();
+
+	OnAttachEvent();
+
+	return 1;
+}
+
+int onload()
+{
+	dw_list = GetControl(L"parasgrid");
+
+	OnInitial();
+	LoadData();
+
+	return 1;
+}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXRuler.cpp b/jrj/xframe/devloper/XDevEditXRuler.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXRuler.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXWKDlg.cpp b/jrj/xframe/devloper/XDevEditXWKDlg.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXWKDlg.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevEditXWorkNode.cpp b/jrj/xframe/devloper/XDevEditXWorkNode.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXWorkNode.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/XDevFileDlg.cpp b/jrj/xframe/devloper/XDevFileDlg.cpp
new file mode 100644
index 0000000..f26ab17
--- /dev/null
+++ b/jrj/xframe/devloper/XDevFileDlg.cpp
@@ -0,0 +1,561 @@
+#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
+{
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+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/devloper/devloper.cpp b/jrj/xframe/devloper/devloper.cpp
index b586ae3..f26ab17 100644
--- a/jrj/xframe/devloper/devloper.cpp
+++ b/jrj/xframe/devloper/devloper.cpp
@@ -8,6 +8,14 @@
 using xml = KXMLDOMDocument;
 class export XDeveloper : public xwin
 {
+	public:
+	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		return pWin;
+	}
 private:	//
 	xtreeview tv_folder;
 	xcontrol mle_output;
diff --git a/jrj/xframe/kobject/kxml.hpp b/jrj/xframe/kobject/kxml.hpp
index 00fcbb1..8606072 100644
--- a/jrj/xframe/kobject/kxml.hpp
+++ b/jrj/xframe/kobject/kxml.hpp
@@ -13,7 +13,7 @@
 	class KXMLDOMTextNode;
 	class KXMLDOMProcessingInstruction;
 	class KXMLDOMNodeList;
-	class KXMLParseError;
+	class KXMLDOMParseError;
 
 	enum  KDOMNodeType
 	{
@@ -212,7 +212,7 @@
 
 		wchar_t* transformNode(KXMLDOMNode);
 		KXMLDOMNode transformNodeToObject(KXMLDOMNode);
-		KXMLParseError validate();
+		KXMLDOMParseError validate();
 		//bool validateNode();
 	public:
 		KXMLDOMDocument(void* impl);
@@ -284,11 +284,19 @@
 using KXMLDOMElement=Hxsoft::XFrame::KXMLDOMElement;
 using KXMLDOMNodeList = Hxsoft::XFrame::KXMLDOMNodeList;
 
-class KXMLParseError : public KXMLDOMNode
+class KXMLDOMParseError : public KXMLDOMNode
 {
 public:
-	KXMLParseError(KXMLDOMNode& v);
-	KXMLParseError(void* impl) :KXMLDOMNode(impl) {}
+	KXMLDOMParseError(KXMLDOMNode& v);
+	KXMLDOMParseError(void* impl) :KXMLDOMNode(impl) {}
+public:
+	int errorCode();
+	int filepos();
+	int line();
+	int linepos();
+	BSTR reason();
+	BSTR srcText();
+	BSTR url();
 };
 
 class KXMLDOMElementPtr

--
Gitblit v1.9.3