From bd09edf1b441dcc6ab098f277bea86a72c009879 Mon Sep 17 00:00:00 2001
From: xj qian <qianxj15@sina.com>
Date: 星期四, 05 十二月 2024 17:30:21 +0800
Subject: [PATCH] update

---
 jrj/xframe/devloper/XDevEditPage.hpp      |   17 
 jrj/xframe/devloper/XDevEditXApp.cpp      |  553 +++++
 jrj/xframe/devloper/XDevEditXLayer.cpp    |  569 ----
 jrj/xframe/devloper/XDevEditXOffice.cpp   |  613 +----
 jrj/xframe/devloper/XDevEditFlow.cpp      |  513 ++++
 jrj/xframe/devloper/XDevEditXRuler.cpp    |  577 ----
 jrj/xframe/devloper/XDevEditXMSSQL.cpp    |  981 ++++----
 jrj/xframe/devloper/XDevEditXWKDlg.cpp    |  577 ----
 /dev/null                                 |  561 -----
 jrj/xframe/devloper/XDevEditXPage.cpp     |    7 
 jrj/xframe/devloper/XDevEditXQuery.cpp    |   11 
 jrj/xframe/wobject/xutil.hpp              |   28 
 jrj/project/business/QuoteFile.cpp        |  323 +-
 jrj/xframe/devloper/XDevEditXWorkNode.cpp |  577 ----
 jrj/xframe/devloper/XDevEditHtml.cpp      |  109 +
 jrj/xframe/xcontrol/xdwgrid.hpp           |   18 
 jrj/xframe/xcontrol/xdwtable.hpp          |    7 
 jrj/ext-jrj/ext-jrj.vcxproj               |   16 
 jrj/xframe/devloper/XDevEditXFile.cpp     |   25 
 jrj/xframe/kobject/kutil.hpp              |    5 
 jrj/xframe/xcontrol/xcell.hpp             |    6 
 jrj/xframe/devloper/XDevEditCode.cpp      |  122 +
 22 files changed, 2,544 insertions(+), 3,671 deletions(-)

diff --git a/jrj/ext-jrj/ext-jrj.vcxproj b/jrj/ext-jrj/ext-jrj.vcxproj
index 063c9ef..44b75f9 100644
--- a/jrj/ext-jrj/ext-jrj.vcxproj
+++ b/jrj/ext-jrj/ext-jrj.vcxproj
@@ -193,9 +193,9 @@
     <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">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
+    <ClInclude Include="..\xframe\devloper\XDevEditPage.hpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClInclude>
     <ClInclude Include="..\xframe\kobject\kapp.hpp" />
     <ClInclude Include="..\xframe\kobject\kbase.hpp" />
@@ -1171,6 +1171,10 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
     </ClCompile>
+    <ClCompile Include="..\xframe\devloper\XDevEditCode.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
+    </ClCompile>
     <ClCompile Include="..\xframe\devloper\XDevEditDbmap.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
@@ -1179,7 +1183,7 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
-    <ClCompile Include="..\xframe\devloper\XDevEditXCode.cpp">
+    <ClCompile Include="..\xframe\devloper\XDevEditXApp.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
@@ -1191,11 +1195,11 @@
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
-    <ClCompile Include="..\xframe\devloper\XDevEditXFlow.cpp">
+    <ClCompile Include="..\xframe\devloper\XDevEditFlow.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
-    <ClCompile Include="..\xframe\devloper\XDevEditXHtml.cpp">
+    <ClCompile Include="..\xframe\devloper\XDevEditHtml.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
     </ClCompile>
diff --git a/jrj/project/business/QuoteFile.cpp b/jrj/project/business/QuoteFile.cpp
index eb32a9e..bb78ecd 100644
--- a/jrj/project/business/QuoteFile.cpp
+++ b/jrj/project/business/QuoteFile.cpp
@@ -254,10 +254,10 @@
 	{
 		xstring content = L"";
 		xstring base = L"";
-		base += L"<QuoteNo>" + getBaseItem(cell, L"报价单号:") + L"</QuoteNo>";
-		base += L"<ExpDate>" + getBaseItem(cell, L"报价截止日期:") + L"</ExpDate>";
-		base += L"<PrjName>" + getBaseItem(cell, L"项目名称:") + L"</PrjName>";
-		base += L"<QuoteDate>" + dw_base.GetItemString(1, L"QuoteDate") + L"</QuoteDate>";
+		base += L"<QuoteNo>" + getBaseXmlItem(cell, L"报价单号:") + L"</QuoteNo>";
+		base += L"<ExpDate>" + getBaseXmlItem(cell, L"报价截止日期:") + L"</ExpDate>";
+		base += L"<PrjName>" + getBaseXmlItem(cell, L"项目名称:") + L"</PrjName>";
+		base += L"<QuoteDate>" + dw_base.GetItemXmlString(1, L"QuoteDate") + L"</QuoteDate>";
 
 		int startRow = getItemHeadRow(cell);
 
@@ -313,34 +313,34 @@
 			xstring itemStr = L"";
 			rowid = getRowID(cell, row);
 			itemStr += L"<RowID>" + getRowID(cell, row) + L"</RowID>";
-			itemStr += L"<SKUID>" + cell.GetItemString(row, colSKUID) + L"</SKUID>";
+			itemStr += L"<SKUID>" + cell.GetItemXmlString(row, colSKUID) + L"</SKUID>";
 			itemStr += L"<customer-photo>" + getRowTerm(cell, row, L"customer-photo") + L"</customer-photo>";
 			itemStr += L"<supplier-photo>" + getRowTerm(cell, row, L"supplier-photo") + L"</supplier-photo>";
 			itemStr += L"<customer-photo-url>" + getImageList(getRowTerm(cell, row, L"customer-photo")) + L"</customer-photo-url>";
 			itemStr += L"<supplier-photo-url>" + getImageList(getRowTerm(cell, row, L"supplier-photo")) + L"</supplier-photo-url>";
-			itemStr += L"<ItemNo>" + cell.GetItemString(row, colItemNo) + L"</ItemNo>";
-			itemStr += L"<CustomItemNo>" + cell.GetItemString(row, colCustomerItemNo) + L"</CustomItemNo>";
-			itemStr += L"<ItemName>" + cell.GetItemString(row, colItemName) + L"</ItemName>";
-			itemStr += L"<ItemCName>" + cell.GetItemString(row, colItemCName) + L"</ItemCName>";
-			itemStr += L"<ItemSpec>" + cell.GetItemString(row, colItemSpec) + L"</ItemSpec>";
-			itemStr += L"<CustomerImage>" + cell.GetItemString(row, colCustomerImage) + L"</CustomerImage>";
-			itemStr += L"<BuyerPrice>" + cell.GetItemString(row, colBuyerPrice) + L"</BuyerPrice>";
-			itemStr += L"<SaleRemark>" + cell.GetItemString(row, colSaleRemark) + L"</SaleRemark>";
+			itemStr += L"<ItemNo>" + cell.GetItemXmlString(row, colItemNo) + L"</ItemNo>";
+			itemStr += L"<CustomItemNo>" + cell.GetItemXmlString(row, colCustomerItemNo) + L"</CustomItemNo>";
+			itemStr += L"<ItemName>" + cell.GetItemXmlString(row, colItemName) + L"</ItemName>";
+			itemStr += L"<ItemCName>" + cell.GetItemXmlString(row, colItemCName) + L"</ItemCName>";
+			itemStr += L"<ItemSpec>" + cell.GetItemXmlString(row, colItemSpec) + L"</ItemSpec>";
+			itemStr += L"<CustomerImage>" + cell.GetItemXmlString(row, colCustomerImage) + L"</CustomerImage>";
+			itemStr += L"<BuyerPrice>" + cell.GetItemXmlString(row, colBuyerPrice) + L"</BuyerPrice>";
+			itemStr += L"<SaleRemark>" + cell.GetItemXmlString(row, colSaleRemark) + L"</SaleRemark>";
 
-			itemStr += L"<BuyerMOQ>" + cell.GetItemString(row, colBuyerMOQ) + L"</BuyerMOQ>";
-			itemStr += L"<BuyerRemark>" + cell.GetItemString(row, colBuyerRemark) + L"</BuyerRemark>";
-			itemStr += L"<FactoryImage>" + cell.GetItemString(row, colFactoryImage) + L"</FactoryImage>";
-			itemStr += L"<GWT>" + cell.GetItemString(row, colGWT) + L"</GWT>";
-			itemStr += L"<NWT>" + cell.GetItemString(row, colNWT) + L"</NWT>";
-			itemStr += L"<VolDesc>" + cell.GetItemString(row, colVolDesc) + L"</VolDesc>";
-			itemStr += L"<Vol>" + cell.GetItemString(row, colVol) + L"</Vol>";
-			itemStr += L"<F40HQ>" + cell.GetItemString(row, col40HQ) + L"</F40HQ>";
-			itemStr += L"<Packing>" + cell.GetItemString(row, colInnerOuter) + L"</Packing>";
-			itemStr += L"<Quantity>" + cell.GetItemString(row, colItemQty) + L"</Quantity>";
-			itemStr += L"<Package>" + cell.GetItemString(row, colPackage) + L"</Package>";
-			itemStr += L"<Buyer>" + cell.GetItemString(row, colBuyer) + L"</Buyer>";
-			itemStr += L"<RemarkS>" + cell.GetItemString(row, colRemark) + L"</RemarkS>";
-			itemStr += L"<FOBPrice>" + cell.GetItemString(row, colFOBPrice) + L"</FOBPrice>";
+			itemStr += L"<BuyerMOQ>" + cell.GetItemXmlString(row, colBuyerMOQ) + L"</BuyerMOQ>";
+			itemStr += L"<BuyerRemark>" + cell.GetItemXmlString(row, colBuyerRemark) + L"</BuyerRemark>";
+			itemStr += L"<FactoryImage>" + cell.GetItemXmlString(row, colFactoryImage) + L"</FactoryImage>";
+			itemStr += L"<GWT>" + cell.GetItemXmlString(row, colGWT)+ L"</GWT>";
+			itemStr += L"<NWT>" + cell.GetItemXmlString(row, colNWT) + L"</NWT>";
+			itemStr += L"<VolDesc>" + cell.GetItemXmlString(row, colVolDesc) + L"</VolDesc>";
+			itemStr += L"<Vol>" + cell.GetItemXmlString(row, colVol) + L"</Vol>";
+			itemStr += L"<F40HQ>" + cell.GetItemXmlString(row, col40HQ) + L"</F40HQ>";
+			itemStr += L"<Packing>" + cell.GetItemXmlString(row, colInnerOuter) + L"</Packing>";
+			itemStr += L"<Quantity>" + cell.GetItemXmlString(row, colItemQty) + L"</Quantity>";
+			itemStr += L"<Package>" + cell.GetItemXmlString(row, colPackage) + L"</Package>";
+			itemStr += L"<Buyer>" + cell.GetItemXmlString(row, colBuyer) + L"</Buyer>";
+			itemStr += L"<RemarkS>" + cell.GetItemXmlString(row, colRemark) + L"</RemarkS>";
+			itemStr += L"<FOBPrice>" + cell.GetItemXmlString(row, colFOBPrice) + L"</FOBPrice>";
 
 
 			itemStr += L"<PurchedDate>" + sdate + L"</PurchedDate>";
@@ -356,10 +356,10 @@
 	{
 		xstring content = L"";
 		xstring base = L"";
-		base += L"<QuoteNo>" + getBaseItem(cell, L"报价单号:") + L"</QuoteNo>";
-		base += L"<ExpDate>" + getBaseItem(cell, L"报价截止日期:") + L"</ExpDate>";
-		base += L"<PrjName>" + getBaseItem(cell, L"项目名称:") + L"</PrjName>";
-		base += L"<QuoteDate>" + dw_base.GetItemString(1, L"QuoteDate") + L"</QuoteDate>";
+		base += L"<QuoteNo>" + getBaseXmlItem(cell, L"报价单号:") + L"</QuoteNo>";
+		base += L"<ExpDate>" + getBaseXmlItem(cell, L"报价截止日期:") + L"</ExpDate>";
+		base += L"<PrjName>" + getBaseXmlItem(cell, L"项目名称:") + L"</PrjName>";
+		base += L"<QuoteDate>" + dw_base.GetItemXmlString(1, L"QuoteDate") + L"</QuoteDate>";
 
 		int startRow = getItemHeadRow(cell);
 
@@ -423,46 +423,46 @@
 
 			xstring itemStr = L"";
 			itemStr += L"<RowID>" + getRowID(cell, row) + L"</RowID>";
-			itemStr += L"<SKUID>" + cell.GetItemString(row, colSKUID) + L"</SKUID>";
+			itemStr += L"<SKUID>" + cell.GetItemXmlString(row, colSKUID) + L"</SKUID>";
 			itemStr += L"<customer-photo>" + getRowTerm(cell, row, L"customer-photo") + L"</customer-photo>";
 			itemStr += L"<supplier-photo>" + getRowTerm(cell, row, L"supplier-photo") + L"</supplier-photo>";
-			itemStr += L"<ItemNo>" + cell.GetItemString(row, colItemNo) + L"</ItemNo>";
-			itemStr += L"<CustomItemNo>" + cell.GetItemString(row, colCustomerItemNo) + L"</CustomItemNo>";
-			itemStr += L"<ItemName>" + cell.GetItemString(row, colItemName) + L"</ItemName>";
-			itemStr += L"<ItemCName>" + cell.GetItemString(row, colItemCName) + L"</ItemCName>";
-			itemStr += L"<ItemSpec>" + cell.GetItemString(row, colItemSpec) + L"</ItemSpec>";
-			itemStr += L"<CustomerImage>" + cell.GetItemString(row, colCustomerImage) + L"</CustomerImage>";
-			itemStr += L"<BuyerPrice>" + cell.GetItemString(row, colBuyerPrice) + L"</BuyerPrice>";
-			itemStr += L"<SaleRemark>" + cell.GetItemString(row, colSaleRemark) + L"</SaleRemark>";
+			itemStr += L"<ItemNo>" + cell.GetItemXmlString(row, colItemNo) + L"</ItemNo>";
+			itemStr += L"<CustomItemNo>" + cell.GetItemXmlString(row, colCustomerItemNo) + L"</CustomItemNo>";
+			itemStr += L"<ItemName>" + cell.GetItemXmlString(row, colItemName) + L"</ItemName>";
+			itemStr += L"<ItemCName>" + cell.GetItemXmlString(row, colItemCName) + L"</ItemCName>";
+			itemStr += L"<ItemSpec>" + cell.GetItemXmlString(row, colItemSpec) + L"</ItemSpec>";
+			itemStr += L"<CustomerImage>" + cell.GetItemXmlString(row, colCustomerImage) + L"</CustomerImage>";
+			itemStr += L"<BuyerPrice>" + cell.GetItemXmlString(row, colBuyerPrice) + L"</BuyerPrice>";
+			itemStr += L"<SaleRemark>" + cell.GetItemXmlString(row, colSaleRemark) + L"</SaleRemark>";
 
-			itemStr += L"<BuyerMOQ>" + cell.GetItemString(row, colBuyerMOQ) + L"</BuyerMOQ>";
-			itemStr += L"<BuyerRemark>" + cell.GetItemString(row, colBuyerRemark) + L"</BuyerRemark>";
-			itemStr += L"<FactoryImage>" + cell.GetItemString(row, colFactoryImage) + L"</FactoryImage>";
-			itemStr += L"<GWT>" + cell.GetItemString(row, colGWT) + L"</GWT>";
-			itemStr += L"<NWT>" + cell.GetItemString(row, colNWT) + L"</NWT>";
-			itemStr += L"<VolDesc>" + cell.GetItemString(row, colVolDesc) + L"</VolDesc>";
-			itemStr += L"<Vol>" + cell.GetItemString(row, colVol) + L"</Vol>";
-			itemStr += L"<F40HQ>" + cell.GetItemString(row, col40HQ) + L"</F40HQ>";
-			itemStr += L"<Packing>" + cell.GetItemString(row, colInnerOuter) + L"</Packing>";
-			itemStr += L"<Quantity>" + cell.GetItemString(row, colItemQty) + L"</Quantity>";
-			itemStr += L"<Package>" + cell.GetItemString(row, colPackage) + L"</Package>";
-			itemStr += L"<Buyer>" + cell.GetItemString(row, colBuyer) + L"</Buyer>";
-			itemStr += L"<RemarkS>" + cell.GetItemString(row, colRemark) + L"</RemarkS>";
-			itemStr += L"<FOBPrice>" + cell.GetItemString(row, colFOBPrice) + L"</FOBPrice>";
+			itemStr += L"<BuyerMOQ>" + cell.GetItemXmlString(row, colBuyerMOQ) + L"</BuyerMOQ>";
+			itemStr += L"<BuyerRemark>" + cell.GetItemXmlString(row, colBuyerRemark) + L"</BuyerRemark>";
+			itemStr += L"<FactoryImage>" + cell.GetItemXmlString(row, colFactoryImage) + L"</FactoryImage>";
+			itemStr += L"<GWT>" + cell.GetItemXmlString(row, colGWT) + L"</GWT>";
+			itemStr += L"<NWT>" + cell.GetItemXmlString(row, colNWT) + L"</NWT>";
+			itemStr += L"<VolDesc>" + cell.GetItemXmlString(row, colVolDesc) + L"</VolDesc>";
+			itemStr += L"<Vol>" + cell.GetItemXmlString(row, colVol) + L"</Vol>";
+			itemStr += L"<F40HQ>" + cell.GetItemXmlString(row, col40HQ) + L"</F40HQ>";
+			itemStr += L"<Packing>" + cell.GetItemXmlString(row, colInnerOuter) + L"</Packing>";
+			itemStr += L"<Quantity>" + cell.GetItemXmlString(row, colItemQty) + L"</Quantity>";
+			itemStr += L"<Package>" + cell.GetItemXmlString(row, colPackage) + L"</Package>";
+			itemStr += L"<Buyer>" + cell.GetItemXmlString(row, colBuyer) + L"</Buyer>";
+			itemStr += L"<RemarkS>" + cell.GetItemXmlString(row, colRemark) + L"</RemarkS>";
+			itemStr += L"<FOBPrice>" + cell.GetItemXmlString(row, colFOBPrice) + L"</FOBPrice>";
 
-			itemStr += L"<Supplier>" + cell.GetItemString(row, colSupplier) + L"</Supplier>";
-			itemStr += L"<Supplier1>" + cell.GetItemString(row, colSupplier1) + L"</Supplier1>";
-			itemStr += L"<Supplier2>" + cell.GetItemString(row, colSupplier2) + L"</Supplier2>";
-			itemStr += L"<Supplier3>" + cell.GetItemString(row, colSupplier3) + L"</Supplier3>";
-			itemStr += L"<POPrice>" + cell.GetItemString(row, colPOPrice) + L"</POPrice>";
-			itemStr += L"<POPrice1>" + cell.GetItemString(row, colPOPrice1) + L"</POPrice1>";
-			itemStr += L"<POPrice2>" + cell.GetItemString(row, colPOPrice2) + L"</POPrice2>";
-			itemStr += L"<POPrice3>" + cell.GetItemString(row, colPOPrice3) + L"</POPrice3>";
+			itemStr += L"<Supplier>" + cell.GetItemXmlString(row, colSupplier) + L"</Supplier>";
+			itemStr += L"<Supplier1>" + cell.GetItemXmlString(row, colSupplier1) + L"</Supplier1>";
+			itemStr += L"<Supplier2>" + cell.GetItemXmlString(row, colSupplier2) + L"</Supplier2>";
+			itemStr += L"<Supplier3>" + cell.GetItemXmlString(row, colSupplier3) + L"</Supplier3>";
+			itemStr += L"<POPrice>" + cell.GetItemXmlString(row, colPOPrice) + L"</POPrice>";
+			itemStr += L"<POPrice1>" + cell.GetItemXmlString(row, colPOPrice1) + L"</POPrice1>";
+			itemStr += L"<POPrice2>" + cell.GetItemXmlString(row, colPOPrice2) + L"</POPrice2>";
+			itemStr += L"<POPrice3>" + cell.GetItemXmlString(row, colPOPrice3) + L"</POPrice3>";
 
-			itemStr += L"<BOMType>" + cell.GetItemString(row, colBOMType) + L"</BOMType>";
-			itemStr += L"<BOMType1>" + cell.GetItemString(row, colBOMType1) + L"</BOMType1>";
-			itemStr += L"<BOMType2>" + cell.GetItemString(row, colBOMType2) + L"</BOMType2>";
-			itemStr += L"<BOMType3>" + cell.GetItemString(row, colBOMType2) + L"</BOMType3>";
+			itemStr += L"<BOMType>" + cell.GetItemXmlString(row, colBOMType) + L"</BOMType>";
+			itemStr += L"<BOMType1>" + cell.GetItemXmlString(row, colBOMType1) + L"</BOMType1>";
+			itemStr += L"<BOMType2>" + cell.GetItemXmlString(row, colBOMType2) + L"</BOMType2>";
+			itemStr += L"<BOMType3>" + cell.GetItemXmlString(row, colBOMType2) + L"</BOMType3>";
 			itemStr += L"<PurchedDate>" + sdate + L"</PurchedDate>";
 			itemStr += L"<EnquiryLineID>" + getRowTerm(cell, row, L"EnquiryLineID") + L"</EnquiryLineID>";
 
@@ -474,19 +474,19 @@
 				if (cell.GetItemString(row, colItemName) != L"" || cell.GetItemString(row, colItemSpec) != L"") break;
 				if (cell.GetItemString(row, colSupplier) == L"")break;
 				xstring extStr = L"";
-				extStr += L"<Supplier>" + cell.GetItemString(row, colSupplier) + L"</Supplier>";
-				extStr += L"<Supplier1>" + cell.GetItemString(row, colSupplier1) + L"</Supplier1>";
-				extStr += L"<Supplier2>" + cell.GetItemString(row, colSupplier2) + L"</Supplier2>";
-				extStr += L"<Supplier3>" + cell.GetItemString(row, colSupplier3) + L"</Supplier3>";
-				extStr += L"<POPrice>" + cell.GetItemString(row, colPOPrice) + L"</POPrice>";
-				extStr += L"<POPrice1>" + cell.GetItemString(row, colPOPrice1) + L"</POPrice1>";
-				extStr += L"<POPrice2>" + cell.GetItemString(row, colPOPrice2) + L"</POPrice2>";
-				extStr += L"<POPrice3>" + cell.GetItemString(row, colPOPrice3) + L"</POPrice3>";
+				extStr += L"<Supplier>" + cell.GetItemXmlString(row, colSupplier) + L"</Supplier>";
+				extStr += L"<Supplier1>" + cell.GetItemXmlString(row, colSupplier1) + L"</Supplier1>";
+				extStr += L"<Supplier2>" + cell.GetItemXmlString(row, colSupplier2) + L"</Supplier2>";
+				extStr += L"<Supplier3>" + cell.GetItemXmlString(row, colSupplier3) + L"</Supplier3>";
+				extStr += L"<POPrice>" + cell.GetItemXmlString(row, colPOPrice) + L"</POPrice>";
+				extStr += L"<POPrice1>" + cell.GetItemXmlString(row, colPOPrice1) + L"</POPrice1>";
+				extStr += L"<POPrice2>" + cell.GetItemXmlString(row, colPOPrice2) + L"</POPrice2>";
+				extStr += L"<POPrice3>" + cell.GetItemXmlString(row, colPOPrice3) + L"</POPrice3>";
 
-				extStr += L"<BOMType>" + cell.GetItemString(row, colBOMType) + L"</BOMType>";
-				extStr += L"<BOMType1>" + cell.GetItemString(row, colBOMType1) + L"</BOMType1>";
-				extStr += L"<BOMType2>" + cell.GetItemString(row, colBOMType2) + L"</BOMType2>";
-				extStr += L"<BOMType3>" + cell.GetItemString(row, colBOMType2) + L"</BOMType3>";
+				extStr += L"<BOMType>" + cell.GetItemXmlString(row, colBOMType) + L"</BOMType>";
+				extStr += L"<BOMType1>" + cell.GetItemXmlString(row, colBOMType1) + L"</BOMType1>";
+				extStr += L"<BOMType2>" + cell.GetItemXmlString(row, colBOMType2) + L"</BOMType2>";
+				extStr += L"<BOMType3>" + cell.GetItemXmlString(row, colBOMType2) + L"</BOMType3>";
 
 				itemStr += L"<ExtItem>" + extStr + L"</ExtItem>"; //备用采购信息
 				xstring eid = GetGuid();
@@ -567,6 +567,11 @@
 		im.Redraw();
 
 		return 1;
+	}
+
+	xstring getBaseXmlItem(xcell dw_cell, xstring colname)
+	{
+		return xutil::ToXmlText(getBaseItem(dw_cell, colname));
 	}
 
 	xstring getBaseItem(xcell dw_cell, xstring colname)
@@ -858,14 +863,14 @@
 
 			xstring itemStr = L"";
 			itemStr += L"<RowID>" + getRowID(dw_cell, row) + L"</RowID>";
-			itemStr += L"<ItemNo>" + dw_cell.GetItemString(row, colItemNo) + L"</ItemNo>";
-			itemStr += L"<CustomerItemNo>" + dw_cell.GetItemString(row, colCustomerItemNo) + L"</CustomerItemNo>";
-			itemStr += L"<ItemName>" + dw_cell.GetItemString(row, colItemName) + L"</ItemName>";
-			itemStr += L"<ItemCName>" + dw_cell.GetItemString(row, colItemCName) + L"</ItemCName>";
-			itemStr += L"<ItemSpec>" + dw_cell.GetItemString(row, colItemSpec) + L"</ItemSpec>";
-			itemStr += L"<BuyerPrice>" + dw_cell.GetItemString(row, colBuyerPrice) + L"</BuyerPrice>";
-			itemStr += L"<ProductInfo>" + dw_cell.GetItemString(row, colProductInfo) + L"</ProductInfo>";
-			itemStr += L"<ProductInfo1>" + dw_cell.GetItemString(row, colProductInfo1) + L"</ProductInfo1>";
+			itemStr += L"<ItemNo>" + dw_cell.GetItemXmlString(row, colItemNo) + L"</ItemNo>";
+			itemStr += L"<CustomerItemNo>" + dw_cell.GetItemXmlString(row, colCustomerItemNo) + L"</CustomerItemNo>";
+			itemStr += L"<ItemName>" + dw_cell.GetItemXmlString(row, colItemName) + L"</ItemName>";
+			itemStr += L"<ItemCName>" + dw_cell.GetItemXmlString(row, colItemCName) + L"</ItemCName>";
+			itemStr += L"<ItemSpec>" + dw_cell.GetItemXmlString(row, colItemSpec) + L"</ItemSpec>";
+			itemStr += L"<BuyerPrice>" + dw_cell.GetItemXmlString(row, colBuyerPrice) + L"</BuyerPrice>";
+			itemStr += L"<ProductInfo>" + dw_cell.GetItemXmlString(row, colProductInfo) + L"</ProductInfo>";
+			itemStr += L"<ProductInfo1>" + dw_cell.GetItemXmlString(row, colProductInfo1) + L"</ProductInfo1>";
 
 			if (dw_cell.GetItemString(row, colBuyerPrice) == L"") return L"采购价格没有录入";
 			if (dw_cell.GetItemString(row, colGWT) == L"") return L"毛重没有录入";
@@ -884,14 +889,14 @@
 			{
 				if (dw_cell.GetItemString(row, colPOPrice1) == L"") return L"采购价格1没有录入";
 			}
-			itemStr += L"<BuyerMOQ>" + dw_cell.GetItemString(row, colBuyerMOQ) + L"</BuyerMOQ>";
-			itemStr += L"<BuyerRemark>" + dw_cell.GetItemString(row, colBuyerRemark) + L"</BuyerRemark>";
-			itemStr += L"<FactoryImage>" + dw_cell.GetItemString(row, colFactoryImage) + L"</FactoryImage>";
-			itemStr += L"<GWT>" + dw_cell.GetItemString(row, colGWT) + L"</GWT>";
-			itemStr += L"<NWT>" + dw_cell.GetItemString(row, colNWT) + L"</NWT>";
-			itemStr += L"<VolDesc>" + dw_cell.GetItemString(row, colVolDesc) + L"</VolDesc>";
-			itemStr += L"<Vol>" + dw_cell.GetItemString(row, colVol) + L"</Vol>";
-			itemStr += L"<F40HQ>" + dw_cell.GetItemString(row, col40HQ) + L"</F40HQ>";
+			itemStr += L"<BuyerMOQ>" + dw_cell.GetItemXmlString(row, colBuyerMOQ) + L"</BuyerMOQ>";
+			itemStr += L"<BuyerRemark>" + dw_cell.GetItemXmlString(row, colBuyerRemark) + L"</BuyerRemark>";
+			itemStr += L"<FactoryImage>" + dw_cell.GetItemXmlString(row, colFactoryImage) + L"</FactoryImage>";
+			itemStr += L"<GWT>" + dw_cell.GetItemXmlString(row, colGWT) + L"</GWT>";
+			itemStr += L"<NWT>" + dw_cell.GetItemXmlString(row, colNWT) + L"</NWT>";
+			itemStr += L"<VolDesc>" + dw_cell.GetItemXmlString(row, colVolDesc) + L"</VolDesc>";
+			itemStr += L"<Vol>" + dw_cell.GetItemXmlString(row, colVol) + L"</Vol>";
+			itemStr += L"<F40HQ>" + dw_cell.GetItemXmlString(row, col40HQ) + L"</F40HQ>";
 
 			itemStr += L"<PurchedDate>" + sdate + L"</PurchedDate>";
 			itemStr += L"<EnquiryLineID>" + getRowTerm(dw_cell, row, L"EnquiryLineID") + L"</EnquiryLineID>";
@@ -1057,25 +1062,25 @@
 			xstring itemStr = L"";
 			xstring issend = L"1";
 			itemStr += L"<RowID>" + getRowID(dw_cell, row) + L"</RowID>";
-			itemStr += L"<ItemNo>" + dw_cell.GetItemString(row, colItemNo) + L"</ItemNo>";
-			itemStr += L"<ItemName>" + dw_cell.GetItemString(row, colItemName) + L"</ItemName>";
-			itemStr += L"<ItemCName>" + dw_cell.GetItemString(row, colItemCName) + L"</ItemCName>";
-			itemStr += L"<ItemSpec>" + dw_cell.GetItemString(row, colItemSpec) + L"</ItemSpec>";
+			itemStr += L"<ItemNo>" + dw_cell.GetItemXmlString(row, colItemNo) + L"</ItemNo>";
+			itemStr += L"<ItemName>" + dw_cell.GetItemXmlString(row, colItemName) + L"</ItemName>";
+			itemStr += L"<ItemCName>" + dw_cell.GetItemXmlString(row, colItemCName) + L"</ItemCName>";
+			itemStr += L"<ItemSpec>" + dw_cell.GetItemXmlString(row, colItemSpec) + L"</ItemSpec>";
 			itemStr += L"<RowNo>" + xstring(row - startRow + 1) + L"</RowNo>";
-			itemStr += L"<Purchor>" + dw_cell.GetItemString(row, colBuyer) + L"</Purchor>";
-			itemStr += L"<Package>" + dw_cell.GetItemString(row, colPackage) + L"</Package>";
-			itemStr += L"<NWT>" + dw_cell.GetItemString(row, colNW) + L"</NWT>";
-			itemStr += L"<GWT>" + dw_cell.GetItemString(row, colGW) + L"</GWT>";
-			itemStr += L"<VolDesc>" + dw_cell.GetItemString(row, colVolDesc) + L"</VolDesc>";
-			itemStr += L"<Supplier>" + dw_cell.GetItemString(row, colSupplier) + L"</Supplier>";
-			itemStr += L"<BuyPrice>" + dw_cell.GetItemString(row, colPOPrice) + L"</BuyPrice>";
-			itemStr += L"<Supplier1>" + dw_cell.GetItemString(row, colSupplier1) + L"</Supplier1>";
-			itemStr += L"<BuyPrice1>" + dw_cell.GetItemString(row, colPOPrice1) + L"</BuyPrice1>";
-			itemStr += L"<BOMType1>" + dw_cell.GetItemString(row, colBOMType1) + L"</BOMType1>";
-			itemStr += L"<BOMType>" + dw_cell.GetItemString(row, colBOMType) + L"</BOMType>";
-			itemStr += L"<POPrice>" + dw_cell.GetItemString(row, colPrice) + L"</POPrice>";
-			itemStr += L"<ProductInfo>" + dw_cell.GetItemString(row, colProductInfo) + L"</ProductInfo>";
-			itemStr += L"<ProductInfo1>" + dw_cell.GetItemString(row, colProductInfo1) + L"</ProductInfo1>";
+			itemStr += L"<Purchor>" + dw_cell.GetItemXmlString(row, colBuyer) + L"</Purchor>";
+			itemStr += L"<Package>" + dw_cell.GetItemXmlString(row, colPackage) + L"</Package>";
+			itemStr += L"<NWT>" + dw_cell.GetItemXmlString(row, colNW) + L"</NWT>";
+			itemStr += L"<GWT>" + dw_cell.GetItemXmlString(row, colGW) + L"</GWT>";
+			itemStr += L"<VolDesc>" + dw_cell.GetItemXmlString(row, colVolDesc) + L"</VolDesc>";
+			itemStr += L"<Supplier>" + dw_cell.GetItemXmlString(row, colSupplier) + L"</Supplier>";
+			itemStr += L"<BuyPrice>" + dw_cell.GetItemXmlString(row, colPOPrice) + L"</BuyPrice>";
+			itemStr += L"<Supplier1>" + dw_cell.GetItemXmlString(row, colSupplier1) + L"</Supplier1>";
+			itemStr += L"<BuyPrice1>" + dw_cell.GetItemXmlString(row, colPOPrice1) + L"</BuyPrice1>";
+			itemStr += L"<BOMType1>" + dw_cell.GetItemXmlString(row, colBOMType1) + L"</BOMType1>";
+			itemStr += L"<BOMType>" + dw_cell.GetItemXmlString(row, colBOMType) + L"</BOMType>";
+			itemStr += L"<POPrice>" + dw_cell.GetItemXmlString(row, colPrice) + L"</POPrice>";
+			itemStr += L"<ProductInfo>" + dw_cell.GetItemXmlString(row, colProductInfo) + L"</ProductInfo>";
+			itemStr += L"<ProductInfo1>" + dw_cell.GetItemXmlString(row, colProductInfo1) + L"</ProductInfo1>";
 
 			if (dw_cell.GetItemString(row, colBuyer) == L"")issend = L"0";
 			itemStr += L"<IsSend>" + issend + L"</IsSend>";
@@ -1123,19 +1128,19 @@
 			xstring itemStr = L"";
 			xstring issend = L"1";
 			itemStr += L"<RowID>" + getRowID(dw_cell, row) + L"</RowID>";
-			itemStr += L"<ItemNo>" + dw_cell.GetItemString(row, colItemNo) + L"</ItemNo>";
-			itemStr += L"<CustomerItemNo>" + dw_cell.GetItemString(row, colCustomerItemNo) + L"</CustomerItemNo>";
-			itemStr += L"<ItemName>" + dw_cell.GetItemString(row, colItemName) + L"</ItemName>";
-			itemStr += L"<ItemCName>" + dw_cell.GetItemString(row, colItemCName) + L"</ItemCName>";
-			itemStr += L"<ItemSpec>" + dw_cell.GetItemString(row, colItemSpec) + L"</ItemSpec>";
+			itemStr += L"<ItemNo>" + dw_cell.GetItemXmlString(row, colItemNo) + L"</ItemNo>";
+			itemStr += L"<CustomerItemNo>" + dw_cell.GetItemXmlString(row, colCustomerItemNo) + L"</CustomerItemNo>";
+			itemStr += L"<ItemName>" + dw_cell.GetItemXmlString(row, colItemName) + L"</ItemName>";
+			itemStr += L"<ItemCName>" + dw_cell.GetItemXmlString(row, colItemCName) + L"</ItemCName>";
+			itemStr += L"<ItemSpec>" + dw_cell.GetItemXmlString(row, colItemSpec) + L"</ItemSpec>";
 			itemStr += L"<RowNo>" + xstring(row - startRow + 1) + L"</RowNo>";
-			itemStr += L"<Purchor>" + dw_cell.GetItemString(row, colBuyer) + L"</Purchor>";
-			itemStr += L"<Package>" + dw_cell.GetItemString(row, colPackage) + L"</Package>";
-			itemStr += L"<NWT>" + dw_cell.GetItemString(row, colNW) + L"</NWT>";
-			itemStr += L"<GWT>" + dw_cell.GetItemString(row, colGW) + L"</GWT>";
-			itemStr += L"<VolDesc>" + dw_cell.GetItemString(row, colVolDesc) + L"</VolDesc>";
-			itemStr += L"<ProductInfo>" + dw_cell.GetItemString(row, colProductInfo) + L"</ProductInfo>";
-			itemStr += L"<ProductInfo1>" + dw_cell.GetItemString(row, colProductInfo1) + L"</ProductInfo1>";
+			itemStr += L"<Purchor>" + dw_cell.GetItemXmlString(row, colBuyer) + L"</Purchor>";
+			itemStr += L"<Package>" + dw_cell.GetItemXmlString(row, colPackage) + L"</Package>";
+			itemStr += L"<NWT>" + dw_cell.GetItemXmlString(row, colNW) + L"</NWT>";
+			itemStr += L"<GWT>" + dw_cell.GetItemXmlString(row, colGW) + L"</GWT>";
+			itemStr += L"<VolDesc>" + dw_cell.GetItemXmlString(row, colVolDesc) + L"</VolDesc>";
+			itemStr += L"<ProductInfo>" + dw_cell.GetItemXmlString(row, colProductInfo) + L"</ProductInfo>";
+			itemStr += L"<ProductInfo1>" + dw_cell.GetItemXmlString(row, colProductInfo1) + L"</ProductInfo1>";
 			if (dw_cell.GetItemString(row, colBuyer) == L"")issend = L"0";
 			itemStr += L"<IsSend>" + issend + L"</IsSend>";
 
@@ -1177,14 +1182,14 @@
 			xstring itemStr = L"";
 			xstring issend=L"1";
 			itemStr += L"<RowID>"+getRowID(dw_cell,row)+L"</RowID>";
-			itemStr += L"<ItemNo>"+dw_cell.GetItemString(row, colItemNo)+L"</ItemNo>";
-			itemStr += L"<ItemName>"+dw_cell.GetItemString(row, colItemName)+L"</ItemName>";
-			itemStr += L"<ItemCName>"+dw_cell.GetItemString(row, colItemCName)+L"</ItemCName>";
-			itemStr += L"<ItemSpec>"+dw_cell.GetItemString(row, colItemSpec)+L"</ItemSpec>";
+			itemStr += L"<ItemNo>"+dw_cell.GetItemXmlString(row, colItemNo)+L"</ItemNo>";
+			itemStr += L"<ItemName>"+dw_cell.GetItemXmlString(row, colItemName)+L"</ItemName>";
+			itemStr += L"<ItemCName>"+dw_cell.GetItemXmlString(row, colItemCName)+L"</ItemCName>";
+			itemStr += L"<ItemSpec>"+dw_cell.GetItemXmlString(row, colItemSpec)+L"</ItemSpec>";
 			itemStr += L"<RowNo>"+(row - startRow +1).toString()+L"</RowNo>";
-			itemStr += L"<Purchor>"+dw_cell.GetItemString(row, colBuyer)+L"</Purchor>";
-			itemStr += L"<Package>"+dw_cell.GetItemString(row, colPackage)+L"</Package>";
-			if(dw_cell.GetItemString(row, colBuyer) ==L"")issend=L"0";
+			itemStr += L"<Purchor>"+dw_cell.GetItemXmlString(row, colBuyer)+L"</Purchor>";
+			itemStr += L"<Package>"+dw_cell.GetItemXmlString(row, colPackage)+L"</Package>";
+			if(dw_cell.GetItemXmlString(row, colBuyer) ==L"")issend=L"0";
 			itemStr += L"<IsSend>"+issend+L"</IsSend>";
 
 			items += L"<Item>"+itemStr+L"</Item>";
@@ -1397,14 +1402,14 @@
 			//if(dw_cell.GetItemString(row, colItemName)==L"")continue;
 			xstring itemStr = L"";
 			itemStr += L"<RowID>" + getRowID(dw_cell, row) + L"</RowID>";
-			itemStr += L"<ItemNo>" + dw_cell.GetItemString(row, colItemNo) + L"</ItemNo>";
-			itemStr += L"<ItemName>" + dw_cell.GetItemString(row, colItemName) + L"</ItemName>";
-			itemStr += L"<ItemCName>" + dw_cell.GetItemString(row, colItemCName) + L"</ItemCName>";
-			itemStr += L"<ItemSpec>" + dw_cell.GetItemString(row, colItemSpec) + L"</ItemSpec>";
-			itemStr += L"<BuyerPrice>" + dw_cell.GetItemString(row, colBuyerPrice) + L"</BuyerPrice>";
-			itemStr += L"<ProductInfo>" + dw_cell.GetItemString(row, colProductInfo) + L"</ProductInfo>";
-			itemStr += L"<ProductInfo1>" + dw_cell.GetItemString(row, colProductInfo1) + L"</ProductInfo1>";
-			itemStr += L"<Buyer>" + dw_cell.GetItemString(row, colPurchor) + L"</Buyer>";
+			itemStr += L"<ItemNo>" + dw_cell.GetItemXmlString(row, colItemNo) + L"</ItemNo>";
+			itemStr += L"<ItemName>" + dw_cell.GetItemXmlString(row, colItemName) + L"</ItemName>";
+			itemStr += L"<ItemCName>" + dw_cell.GetItemXmlString(row, colItemCName) + L"</ItemCName>";
+			itemStr += L"<ItemSpec>" + dw_cell.GetItemXmlString(row, colItemSpec) + L"</ItemSpec>";
+			itemStr += L"<BuyerPrice>" + dw_cell.GetItemXmlString(row, colBuyerPrice) + L"</BuyerPrice>";
+			itemStr += L"<ProductInfo>" + dw_cell.GetItemXmlString(row, colProductInfo) + L"</ProductInfo>";
+			itemStr += L"<ProductInfo1>" + dw_cell.GetItemXmlString(row, colProductInfo1) + L"</ProductInfo1>";
+			itemStr += L"<Buyer>" + dw_cell.GetItemXmlString(row, colPurchor) + L"</Buyer>";
 
 			/*
 			if(dw_cell.GetItemString(row, colBuyerPrice)==L"") return L"采购价格没有录入";
@@ -1437,14 +1442,14 @@
 				if(dw_cell.GetItemString(row, colVolDesc)==L"") return L"体积信息没有录入";
 			}
 			*/
-			itemStr += L"<BuyerMOQ>" + dw_cell.GetItemString(row, colBuyerMOQ) + L"</BuyerMOQ>";
-			itemStr += L"<BuyerRemark>" + dw_cell.GetItemString(row, colBuyerRemark) + L"</BuyerRemark>";
-			itemStr += L"<FactoryImage>" + dw_cell.GetItemString(row, colFactoryImage) + L"</FactoryImage>";
-			itemStr += L"<GWT>" + dw_cell.GetItemString(row, colGWT) + L"</GWT>";
-			itemStr += L"<NWT>" + dw_cell.GetItemString(row, colNWT) + L"</NWT>";
-			itemStr += L"<VolDesc>" + dw_cell.GetItemString(row, colVolDesc) + L"</VolDesc>";
-			itemStr += L"<Vol>" + dw_cell.GetItemString(row, colVol) + L"</Vol>";
-			itemStr += L"<F40HQ>" + dw_cell.GetItemString(row, col40HQ) + L"</F40HQ>";
+			itemStr += L"<BuyerMOQ>" + dw_cell.GetItemXmlString(row, colBuyerMOQ) + L"</BuyerMOQ>";
+			itemStr += L"<BuyerRemark>" + dw_cell.GetItemXmlString(row, colBuyerRemark) + L"</BuyerRemark>";
+			itemStr += L"<FactoryImage>" + dw_cell.GetItemXmlString(row, colFactoryImage) + L"</FactoryImage>";
+			itemStr += L"<GWT>" + dw_cell.GetItemXmlString(row, colGWT) + L"</GWT>";
+			itemStr += L"<NWT>" + dw_cell.GetItemXmlString(row, colNWT) + L"</NWT>";
+			itemStr += L"<VolDesc>" + dw_cell.GetItemXmlString(row, colVolDesc) + L"</VolDesc>";
+			itemStr += L"<Vol>" + dw_cell.GetItemXmlString(row, colVol) + L"</Vol>";
+			itemStr += L"<F40HQ>" + dw_cell.GetItemXmlString(row, col40HQ) + L"</F40HQ>";
 
 			itemStr += L"<PurchedDate>" + sdate + L"</PurchedDate>";
 			itemStr += L"<supplier-photo>" + getRowTerm(dw_cell, row, L"supplier-photo") + L"</supplier-photo>";
@@ -3882,7 +3887,7 @@
 				dw_goods.SetItemString(i, L"ItemID", ItemID);
 				xstring Item = L"<Item update.new='1' update.modify='1' guid='" + ItemID + L"'>";
 				Item += L"<SKUID>" + ItemID + L"</SKUID>";
-				Item += L"<GoodsNo>" + dw_goods.GetItemString(i, L"GoodsNo") + L"</GoodsNo>";
+				Item += L"<GoodsNo>" + dw_goods.GetItemXmlString(i, L"GoodsNo") + L"</GoodsNo>";
 				xstring SKUNo = GetNo();
 				dw_goods.SetItemString(i, L"SKUNo", SKUNo);
 				dw_goods.Redraw();
@@ -3893,9 +3898,9 @@
 
 				Item += L"<No>" + SKUNo + L"</No>";
 				Item += L"<SKUNo>" + SKUNo + L"</SKUNo>";
-				Item += L"<CName>" + dw_goods.GetItemString(i, L"CName") + L"</CName>";
-				Item += L"<EName>" + dw_goods.GetItemString(i, L"ItemName") + L"</EName>";
-				Item += L"<Packing>" + dw_goods.GetItemString(i, L"Packing") + L"</Packing>";
+				Item += L"<CName>" + dw_goods.GetItemXmlString(i, L"CName") + L"</CName>";
+				Item += L"<EName>" + dw_goods.GetItemXmlString(i, L"ItemName") + L"</EName>";
+				Item += L"<Packing>" + dw_goods.GetItemXmlString(i, L"Packing") + L"</Packing>";
 
 				Item += L"<CategoryID>" + categoryID + L"</CategoryID>";
 				Item += L"<FolderID>" + folderID + L"</FolderID>";
@@ -5344,8 +5349,8 @@
 					if (hasParty(dw_cell.GetItemString(row, colSupplier)) == false)
 					{
 						itemStr += L"<Item update.new='1' update.modify='1'>";
-						itemStr += L"<Name>" + dw_cell.GetItemString(row, colSupplier) + L"</Name>";
-						itemStr += L"<ShortName>" + dw_cell.GetItemString(row, colSupplier) + L"</ShortName>";
+						itemStr += L"<Name>" + dw_cell.GetItemXmlString(row, colSupplier) + L"</Name>";
+						itemStr += L"<ShortName>" + dw_cell.GetItemXmlString(row, colSupplier) + L"</ShortName>";
 						itemStr += L"</Item>";
 					}
 				}
@@ -5357,8 +5362,8 @@
 					if (hasParty(dw_cell.GetItemString(row, colSupplier1)) == false)
 					{
 						itemStr += L"<Item update.new='1' update.modify='1'>";
-						itemStr += L"<Name>" + dw_cell.GetItemString(row, colSupplier1) + L"</Name>";
-						itemStr += L"<ShortName>" + dw_cell.GetItemString(row, colSupplier1) + L"</ShortName>";
+						itemStr += L"<Name>" + dw_cell.GetItemXmlString(row, colSupplier1) + L"</Name>";
+						itemStr += L"<ShortName>" + dw_cell.GetItemXmlString(row, colSupplier1) + L"</ShortName>";
 						itemStr += L"</Item>";
 					}
 				}
@@ -5370,8 +5375,8 @@
 					if (hasParty(dw_cell.GetItemString(row, colSupplier2)) == false)
 					{
 						itemStr += L"<Item update.new='1' update.modify='1'>";
-						itemStr += L"<Name>" + dw_cell.GetItemString(row, colSupplier2) + L"</Name>";
-						itemStr += L"<ShortName>" + dw_cell.GetItemString(row, colSupplier2) + L"</ShortName>";
+						itemStr += L"<Name>" + dw_cell.GetItemXmlString(row, colSupplier2) + L"</Name>";
+						itemStr += L"<ShortName>" + dw_cell.GetItemXmlString(row, colSupplier2) + L"</ShortName>";
 						itemStr += L"</Item>";
 					}
 				}
@@ -5383,8 +5388,8 @@
 					if (hasParty(dw_cell.GetItemString(row, colSupplier3)) == false)
 					{
 						itemStr += L"<Item update.new='1' update.modify='1'>";
-						itemStr += L"<Name>" + dw_cell.GetItemString(row, colSupplier3) + L"</Name>";
-						itemStr += L"<ShortName>" + dw_cell.GetItemString(row, colSupplier3) + L"</ShortName>";
+						itemStr += L"<Name>" + dw_cell.GetItemXmlString(row, colSupplier3) + L"</Name>";
+						itemStr += L"<ShortName>" + dw_cell.GetItemXmlString(row, colSupplier3) + L"</ShortName>";
 						itemStr += L"</Item>";
 					}
 				}
diff --git a/jrj/xframe/devloper/XDevEditCode.cpp b/jrj/xframe/devloper/XDevEditCode.cpp
new file mode 100644
index 0000000..1e8dc56
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditCode.cpp
@@ -0,0 +1,122 @@
+#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 XDevEditCode : public xwin
+{
+	public:
+	XDevEditCode(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+public:
+	static XDevEditCode* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditCode* pWin = new XDevEditCode(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+	xnode	m_agentNode;	//Agent Condition
+	string	m_agentCond;	//Agent Node
+	int SetAgent()
+	{
+		/*
+		string xfNodeAgentArea  = "agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		var xframeElement =  GetElement();
+		var agent = xframeElement.selectSingleNode("agent/"+xfNodeAgentArea+"[1]/*");
+		if(agent)
+		{
+			string s = agent.xml;
+			m_agentNode =  SetAgentNodeContent (anode,s);
+		}
+		*/
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(ref TEvent evt,int param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(string comdid)
+	{
+		if (comdid == "xmFileSaveEx")
+		{
+			xsedit xc = this.GetControl("codecontent");
+
+			int hCursor = xutil::SetCursorWait();
+
+			string code;
+			//save tpp content
+			xc.GetContent(code);
+			this.SaveContent(code);
+			//
+			xutil::RestoreCursor(hCursor);
+
+			return 1;
+		}
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(ref TXCommandEvent evt,int param)
+	{
+		return OnCmdDispatch(evt.pStrID);
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent("WM_XCOMMAND",OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent("WM_SETFOCUS",OnSetFocus);
+	}
+
+	int LoadData()
+	{
+		if (!this.GetParam()) return 1;
+
+		xwin w = GetFrameWindow();
+		xtree tv_folder = w.GetControl("DevExplorer");
+		int hItem = this.GetParam();
+		IXMLDOMElement e = tv_folder.GetItemData(hItem);
+		string caption = e.getAttribute("caption");
+
+		xsedit xc = this.GetControl("codecontent");
+		string code = this.GetData();
+		if (code == "")code == " ";
+	   if (caption.find(".vl",0) >= 0 || caption.find(".vm",0) >= 0 || caption.find(".vf",0) >= 0 || caption.find("voc",0) >= 0 || caption.find("vc",0) >= 0)
+	  {
+		  xc.LoadContent(code,".vl");
+	   }
+	   else if (caption.find(".scm",0) >= 0)
+		  xc.LoadContent(code,".scm");
+	   else
+		  xc.LoadContent(code,".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/XDevEditFlow.cpp b/jrj/xframe/devloper/XDevEditFlow.cpp
new file mode 100644
index 0000000..9b664c3
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditFlow.cpp
@@ -0,0 +1,513 @@
+#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>
+#include <xcontrol/xflowchart.hpp>
+#include "XDevEditPage.hpp"
+
+
+using xml = KXMLDOMDocument;
+class export XDevEditFlow : public XDevEditPage
+{
+	public:
+	XDevEditFlow(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
+public:
+	static XDevEditFlow* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditFlow* pWin = new XDevEditFlow(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+	xdwgrid	dw_role;
+	xdwgrid	dw_node;
+	xdwgrid	dw_data;
+	xdwgrid	dw_action;
+	xdwgrid	dw_stategraph;
+	xdwgrid	dw_billaction;
+
+	xdwgrid	dw_roles;
+	//xdwgrid	dw_nodes;
+	//xdwgrid	dw_actions;
+	xdwgrid	dw_do;
+
+	xdwgrid	dw_bills;
+	xdwgrid	dw_scenes;
+	xdwgrid	dw_states;
+	xdwgrid	dw_events;
+	xdwgrid	dw_conds;
+
+	xdwgrid	dw_datainterface;
+	xdwgrid	dw_dataarg;
+
+	xdwgrid dw_templates;
+	xdwgrid dw_pages;
+	xdwgrid dw_pageconfigs;
+
+	KXMLDOMElement ele;
+
+	xnode	m_agentNode;	//Agent Condition
+	xstring		m_agentCond;	//Agent Node
+
+	xstring 	m_config;  //配置类型
+
+	int SetAgent()
+	{
+		xstring xfNodeAgentArea = L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		auto xframeElement = GetElement();
+		auto agent = xframeElement.selectSingleNode(L"agent/" + xfNodeAgentArea + L"/*[" + m_agentCond + L"]");
+		if (agent)
+		{
+			xstring s = agent.xml();
+			m_agentNode = SetAgentNode(anode,s);
+		}
+		return 1;
+	}
+
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
+	}
+
+	int SetFlowChart(KXMLDOMElement e)
+	{
+		xstring flowUrl = e.getAttribute(L"flowchart");
+		xflowchart flowchart = GetControl(L"flowchart");
+		if (flowUrl != L"")
+		{
+			xml f;
+			if (xaserver::FetchXml(GetServerUrl(),flowUrl,L"",f) == 1)
+			{
+				flowchart.Load(f.documentElement());
+			}
+		}
+		return 1;
+	}
+
+	int FillFlowChart(KXMLDOMElement e)
+	{
+		xstring cid = e.getAttribute(L"id");
+		auto fn = e.selectNodes(L"//flows//flow");
+		int lenf = fn.length();
+
+		int i = 0;
+		xstring sp = L"";
+		xcombobox xc = GetControl(L"flowlist");
+
+		for (i = 0; i < lenf; i++)
+		{
+			sp = L"";
+			KXMLDOMElement fe = fn.item(i);
+			KXMLDOMElement p = fe.parentNode();
+			while ((xstring)p.tagName() == L"flow")
+			{
+				sp += L"   ";
+				p = p.parentNode();
+			}
+
+			xstring name = fe.getAttribute(L"name");
+			xstring d = fe.getAttribute(L"id");
+			xc.AddItem(sp + name);
+			if (cid == d)
+			{
+				xc.SetText(name);
+				SetFlowChart(fe);
+			}
+		}
+		return  1;
+	}
+
+	int OnRetrieve(KXMLDOMElement ele)
+	{
+		KXMLDOMNode  node = ele.selectSingleNode(L"//stategraph");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_stategraph.Retrieve(e);
+			dw_stategraph.Redraw();
+		}
+		else
+		{
+			dw_stategraph.Reset();
+			dw_stategraph.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//bill.actions");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_billaction.Retrieve(e);
+			dw_billaction.Redraw();
+		}
+		else
+		{
+			dw_billaction.Reset();
+			dw_billaction.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//roles");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_role.Retrieve(e);
+			dw_role.Redraw();
+		}
+		else
+		{
+			dw_role.Reset();
+			dw_role.Redraw();
+		}
+
+		xstring id = ele.getAttribute(L"id");
+		node = ele.selectSingleNode(L"//nodes[@for='" + id + L"']");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_node.Retrieve(e);
+			dw_node.Redraw();
+		}
+		else
+		{
+			dw_node.Reset();
+			dw_node.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//actions");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_action.Retrieve(e);
+			dw_action.Redraw();
+		}
+		else
+		{
+			dw_action.Reset();
+			dw_action.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//datas");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_data.Retrieve(e);
+			dw_data.Redraw();
+		}
+		else
+		{
+			dw_data.Reset();
+			dw_data.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//right");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_roles.Retrieve(e);
+			dw_roles.Redraw();
+		}
+		else
+		{
+			dw_roles.Reset();
+			dw_roles.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//bills");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_bills.Retrieve(e);
+			dw_bills.Redraw();
+		}
+		else
+		{
+			dw_bills.Reset();
+			dw_bills.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//events");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_events.Retrieve(e);
+			dw_events.Redraw();
+		}
+		else
+		{
+			dw_events.Reset();
+			dw_events.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//conds");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_conds.Retrieve(e);
+			dw_conds.Redraw();
+		}
+		else
+		{
+			dw_conds.Reset();
+			dw_conds.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//states");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_states.Retrieve(e);
+			dw_states.Redraw();
+		}
+		else
+		{
+			dw_states.Reset();
+			dw_states.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//scenes");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_scenes.Retrieve(e);
+			dw_scenes.Redraw();
+		}
+		else
+		{
+			dw_scenes.Reset();
+			dw_scenes.Redraw();
+		}
+
+		node = ele.selectSingleNode(L"//datainterface");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_datainterface.Retrieve(e);
+			dw_datainterface.Redraw();
+		}
+		else
+		{
+			dw_datainterface.Reset();
+			dw_datainterface.Redraw();
+		}
+		if (dw_datainterface.GetRowCount() > 0)
+		{
+			KXMLDOMElement e = dw_datainterface.GetRowElement(1);
+			node = ele.selectSingleNode(L"//args");
+			if (node)
+			{
+				KXMLDOMElement e = node;
+				dw_dataarg.Retrieve(e);
+				dw_dataarg.Redraw();
+			}
+		else
+		{
+			dw_dataarg.Reset();
+			dw_dataarg.Redraw();
+		}
+		}
+
+		node = ele.selectSingleNode(L"//does");
+		if (node)
+		{
+			KXMLDOMElement e = node;
+			dw_do.Retrieve(e);
+			dw_do.Redraw();
+		}
+		else
+		{
+			dw_do.Reset();
+			dw_do.Redraw();
+		}
+		if (dw_do.GetRowCount() > 0)
+		{
+			KXMLDOMElement e = dw_do.GetRowElement(1);
+			xstring content = e.text();
+
+			xsedit xs = GetControl(L"content");
+			xs.SetContent(content,L".cpp");
+		}
+		FillFlowChart(ele);
+
+		return 1;
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		if (comdid == L"xmFileSave")
+		{
+			xsedit xs = GetControl(L"xcontent");
+			xstring content;
+			HCURSOR hCursor = xutil::SetCursorWait();
+			//save xml content
+			xs.GetContent(content);
+			SaveContent(content);
+			xutil::RestoreCursor(hCursor);
+		}
+		else if (comdid == L"flowdef")
+		{
+			xsedit xs = GetControl(L"xcontent");
+			xstring content;
+			//save xml content
+			xs.GetContent(content);
+			xml x = new xml;
+			if (x.loadXML(content))
+			{
+				ele = x.documentElement();
+				KXMLDOMElement e = x.selectSingleNode(L"//flows/flow");
+				if (e) OnRetrieve(e);
+			}
+		}
+
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,LPARAM param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnFlowSelected(TEvent* evt,LPARAM param)
+	{
+		//xtree tv_folder = GetControl(L"tv_folder");
+		xcombobox cb = GetControl(L"flowlist");
+		int nIndex = cb.GetCurSel();
+		if (nIndex < 1) nIndex = 1;
+
+		//int hItem = tv_folder.GetCaretItem();
+
+		//KXMLDOMElement ele = tv_folder.GetItemData(hItem);
+		KXMLDOMElement e = ele.selectSingleNode(L"(//flows//flow)[" + xstring(nIndex) + L"]");
+		SetFlowChart(e);
+
+		return 1;
+	}
+
+	int OnRowClickedDo(TEvent* evt,LPARAM param)
+	{
+		DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
+		int row = hdr.row;
+		KXMLDOMElement e = dw_do.GetRowElement(row);
+		xstring content = e.text();
+
+		xsedit xs = GetControl(L"content");
+		xs.SetContent(content,L".cpp");
+
+		return 1;
+	}
+
+	int OnRowClicked(TEvent* evt,LPARAM param)
+	{
+		return 1;
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditFlow::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditFlow::OnSetFocus);
+
+		AttachEvent(L"flowlist",L"CBN_SELCHANGE", (FEvent)&XDevEditFlow::OnFlowSelected);
+		AttachEvent(L"dw_do",L"DWV_ROWFOCUSCHANGED", (FEvent)&XDevEditFlow::OnRowClickedDo);
+	}
+
+	int OnInitial()
+	{
+		m_agentCond = L"1";
+		SetAgent();
+
+		OnAttachEvent();
+
+		return 1;
+	}
+
+	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 onload()
+	{
+		dw_stategraph = GetControl(L"dw_stategraph");
+		dw_stategraph.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/状态图]");
+		dw_billaction = GetControl(L"dw_billaction");
+		dw_billaction.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/单据操作]");
+
+		dw_role = GetControl(L"dw_role");
+		dw_role.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/角色定义]");
+		dw_node = GetControl(L"dw_node");
+		dw_node.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/工作节点]");
+		dw_data = GetControl(L"dw_data");
+		dw_data.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/数据集]");
+		dw_action = GetControl(L"dw_action");
+		dw_action.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/操作]");
+
+		dw_roles = GetControl(L"dw_roles");
+		dw_roles.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/角色权限]");
+		//dw_nodes = GetControl(L"dw_nodes");
+		//dw_nodes.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/操作数据集]");
+		//dw_actions = GetControl(L"dw_actions");
+		//dw_actions.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/节点数据集]");
+
+		dw_bills = GetControl(L"dw_bills");
+		dw_bills.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/单据]");
+		dw_scenes = GetControl(L"dw_scenes");
+		dw_scenes.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/场景]");
+		dw_states = GetControl(L"dw_states");
+		dw_states.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/状态]");
+		dw_events = GetControl(L"dw_events");
+		dw_events.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/事件]");
+		dw_conds = GetControl(L"dw_conds");
+		dw_conds.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/条件]");
+
+		dw_datainterface = GetControl(L"dw_datainterface");
+		dw_datainterface.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/数据接口]");
+		dw_dataarg = GetControl(L"dw_dataarg");
+		dw_dataarg.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/数据接口参数]");
+
+		dw_templates = GetControl(L"dw_templates");
+		dw_templates.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/模板文件]");;
+		dw_pages = GetControl(L"dw_pages");
+		dw_pages.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/页面文件]");;
+		dw_pageconfigs = GetControl(L"dw_pageconfigs");
+		dw_pageconfigs.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/客户端配置]");
+
+
+		dw_do = GetControl(L"dw_do");
+		dw_do.SetDataObject(GetServerUrl(),L"dev:sheet[XRight.tpl/动作定义]");
+
+		dw_role.SetReadOnly(true);
+		dw_node.SetReadOnly(true);
+		dw_data.SetReadOnly(true);
+		dw_action.SetReadOnly(true);
+		dw_do.SetReadOnly(true);
+
+		OnInitial();
+
+		xsedit xs = GetControl(L"content");
+		xs.SetContent(L"",L".cpp");
+
+		LoadData();
+
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditHtml.cpp b/jrj/xframe/devloper/XDevEditHtml.cpp
new file mode 100644
index 0000000..35a0706
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditHtml.cpp
@@ -0,0 +1,109 @@
+#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>
+#include "XDevEditPage.hpp"
+
+using xml = KXMLDOMDocument;
+class export XDevEditXHtml : public XDevEditPage
+{
+	public:
+	XDevEditXHtml(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
+public:
+	static XDevEditPage* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditPage* pWin = new XDevEditPage(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 OnCmdDispatch(xstring comdid)
+	{
+		if (comdid == L"xmFileSave")
+		{
+			xstring content;
+			xsedit xs = GetControl(L"xcontent");
+			HCURSOR hCursor = xutil::SetCursorWait();
+			//save xml content
+			xs.GetContent(content);
+			SaveContent(content);
+			xutil::RestoreCursor(hCursor);
+		}
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,LPARAM param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditXHtml::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXHtml::OnSetFocus);
+
+		return 1;
+	}
+
+	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();
+		LoadData();
+
+		return 1;
+	} 
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditPage.cpp b/jrj/xframe/devloper/XDevEditPage.hpp
similarity index 91%
rename from jrj/xframe/devloper/XDevEditPage.cpp
rename to jrj/xframe/devloper/XDevEditPage.hpp
index f45f2db..0eec9ee 100644
--- a/jrj/xframe/devloper/XDevEditPage.cpp
+++ b/jrj/xframe/devloper/XDevEditPage.hpp
@@ -5,10 +5,14 @@
 #include <xcontrol/xtreeview.hpp>
 #include <xcontrol/xlayersheet.hpp>
 #include <xcontrol/xcombobox.hpp>
+#include <vbusiness/vutil/publiccode.vutil.vbusiness.hpp>
 
 using xml = KXMLDOMDocument;
 class export XDevEditPage : public xwin
 {
+public:
+	XDevEditPage(void* implPtr,HWND hWnd) :xwin(implPtr,hWnd) {}
+public:
 	xstring ProcessDevCmd(xstring cmd, xstring ext)
 	{
 		//trace(ext);
@@ -33,7 +37,7 @@
 			typ = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).tagName();
 			if (typ == L"project")break;
 			pitem = tv_folder.GetParentItem(pitem);
-			if (pitem <= 0)break;
+			if (!pitem)break;
 		}
 		return pitem;
 	}
@@ -45,7 +49,7 @@
 		while (true)
 		{
 			hDomainItem = tv_folder.GetParentItem(hP2Item);
-			if (tv_folder.GetParentItem(hDomainItem) <= 0)break;
+			if (!tv_folder.GetParentItem(hDomainItem))break;
 			hP2Item = hDomainItem;
 		}
 		return hP2Item;
@@ -65,7 +69,7 @@
 
 			HTREEITEM hP2Item = 0;
 			HTREEITEM hDomainItem = 0;
-			if (tv_folder.GetParentItem(hItem) <= 0)
+			if (!tv_folder.GetParentItem(hItem))
 			{
 				hDomainItem = hItem;
 			}
@@ -122,7 +126,7 @@
 		{
 			HTREEITEM hP2Item = 0;
 			HTREEITEM hDomainItem = 0;
-			if (tv_folder.GetParentItem(hItem) <= 0)
+			if (!tv_folder.GetParentItem(hItem))
 			{
 				hDomainItem = hItem;
 			}
@@ -167,4 +171,9 @@
 	{
 		return SaveContentEx(content, 0);
 	}
+
+	xstring GetGuid()
+	{
+		return publiccode::GetGuid();
+	}
 };
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXApp.cpp b/jrj/xframe/devloper/XDevEditXApp.cpp
new file mode 100644
index 0000000..d7f0152
--- /dev/null
+++ b/jrj/xframe/devloper/XDevEditXApp.cpp
@@ -0,0 +1,553 @@
+#include <wobject/xstring.hpp>
+#include <wobject/xwin.hpp>
+#include <wobject/xaserver.hpp>
+#include <wobject/xaserverarg.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xdwgrid.hpp>
+#include <xcontrol/xreport.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xcombobox.hpp>
+#include "XDevEditPage.hpp"
+
+using xml = KXMLDOMDocument;
+class export XDevEditXApp : public XDevEditPage
+{
+	public:
+	XDevEditXApp(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
+public:
+	static XDevEditXApp* CreateInstance(void* implPtr, void* hWnd)
+	{
+		XDevEditXApp* pWin = new XDevEditXApp(implPtr, (HWND)hWnd);
+		return pWin;
+	}
+private:	//
+	xreport dw_param;
+	xstring m_type;
+	xstring m_mode;
+	xtreeview tv_folder;
+
+	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;
+	}
+
+	xstring getComboboxData(xcontrol xc)
+	{
+		int j = SendMessage(xc.GetHWND(),0x0147,0,0);
+		if (j > -1)
+		{
+			xstring s = (wchar_t*)SendMessage(xc.GetHWND(),0x0150,j,0);
+			return  xstring(s);
+		}
+		return L"";
+	}
+
+	int OnCombSelChanged()
+	{
+		xcontrol xc = GetControl(L"image");
+		int j = SendMessage(xc.GetHWND(),0x0147,0,0);
+		if (j > -1)
+		{
+			//param s = SendMessage(xc.GetHWND(),0x0150,j,0);			
+			xnode anode = GetAgentNode(L"image_view");
+			xstring p = L"<box name='image_view' width='22'><xtoolbutton caption='' image='" + xstring(j) + L"'/></box>";
+			SetAgentNode(anode,p);
+		}
+	}
+
+	int onClare()
+	{
+		xcontrol xc = GetControl(L"caption");
+		xc.SetText(L"");
+
+		if (m_type == L"file")
+		{
+			xc = GetControl(L"xpage");
+			xc.SetText(L"");
+
+			xc = GetControl(L"image");
+			SendMessage(xc.GetHWND(), 0x014E, 16, 0);
+
+			xreport dw_param = GetControl(L"dw_param");
+			xml x ;
+			xstring str = L"<params>";
+			str += L"<param seq='1' name='' value=''></param>";
+			str += L"<param seq='2' name='' value=''></param>";
+			str += L"<param seq='3' name='' value=''></param>";
+			str += L"<param seq='4' name='' value=''></param>";
+			str += L"<param seq='5' name='' value=''></param>";
+			str += L"<param seq='6' name='' value=''></param>";
+			str += L"<param seq='7' name='' value=''></param>";
+			str += L"<param seq='8' name='' value=''></param>";
+			str += L"</params>";
+			x.loadXML(str);
+			dw_param.Retrieve(x);
+			dw_param.SetReadOnly(false);
+			dw_param.Redraw();
+		}
+		else
+		{
+			xc = GetControl(L"image");
+			SendMessage(xc.GetHWND(), 0x014E, 15, 0);
+		}
+
+		xc = GetControl(L"index");
+		xc.SetText(L"");
+
+		xc = GetControl(L"code");
+		xc.SetText(L"");
+
+		xc = GetControl(L"name");
+		xc.SetText(L"");
+
+		xc = GetControl(L"status");
+		SendMessage(xc.GetHWND(), 0x014E, 0, 0);
+
+		OnCombSelChanged();
+	}
+
+	xstring getTVData(HTREEITEM hitem)
+	{
+		xstring result = L"";
+		HTREEITEM citem = tv_folder.GetChildItem(hitem);
+		while (citem > 0)
+		{
+			xstring str = (wchar_t*)tv_folder.GetItemData(citem);
+			xstring name = str.mid(1,str.find(L" ",0));
+			result += str.mid(0,str.length() - 2) + L">";
+			/*xml x;
+			x.loadXML(IXMLDOMElement(ele).xml);
+			IXMLDOMElement e = x.documentElement;
+			xstring name=e.tagName;
+			result += e.xml;
+			result = result.mid(0,result.length() - 2)+L">";*/
+			xstring tmp = getTVData(citem);
+			result += tmp;
+			result += L"</" + name + L">";
+			citem = tv_folder.GetNextItem(citem);
+		}
+		return result;
+	}
+
+	int onsave()
+	{
+		HTREEITEM root = tv_folder.GetRootItem();
+		xstring str = getTVData(root);
+		xstring content = L"<?xml version='1.0' encoding='utf-16'?><favorites guid='" + GetGuid() + L"' caption='' image='17'>" + str + L"</favorites>";
+		//trace(content);//
+		SaveContent(content);
+		onClare();
+		m_mode = L"new";
+		return 1;
+	}
+
+	HTREEITEM getInsertItem(HTREEITEM hitem,xstring s)
+	{
+		if (tv_folder.GetChildItem(hitem) == 0 || s == L"")
+			return 0;
+		else
+		{
+			int index = s.toInt();
+			HTREEITEM h = tv_folder.GetChildItem(hitem);
+			while (h > 0)
+			{
+				xstring p = (wchar_t*)tv_folder.GetItemData(h);
+				xml x ;
+				x.loadXML(p);
+				KXMLDOMElement e = x.documentElement();
+				xstring str = e.getAttribute(L"index");
+				str = L"" + str;
+				if (str == L"" && h == tv_folder.GetChildItem(hitem))
+					return h;
+				if (str != L"")
+				{
+					if (index < str.toInt())
+						return h;
+				}
+				else
+					return h;
+				h = tv_folder.GetNextItem(h);
+			}
+			return 0;
+		}
+	}
+
+	int copyNode(HTREEITEM olditem, HTREEITEM newitem)
+	{
+		HTREEITEM citem = tv_folder.GetChildItem(olditem);
+		while (citem)
+		{
+			xstring str = (wchar_t*)tv_folder.GetItemData(citem);
+			xstring name = tv_folder.GetItemLabel(citem);
+			int image = tv_folder.GetItemImage(citem);
+			HTREEITEM h = tv_folder.InsertChildItem(newitem,name, (LPARAM)str.c_str(true), image);
+			copyNode(citem,h);
+			citem = tv_folder.GetNextItem(citem);
+		}
+	}
+
+	//命令发布函数
+	int OnCmdDispatch(xstring comdid)
+	{
+		int LayerFlow_UnLayer_ = 0x00000100;
+		int LayerFlow_NS_ = 0x00000004;
+		HCURSOR hCursor = xutil::SetCursorWait();
+
+		if (comdid == L"NewFolder")
+		{
+			m_type = L"folder";
+			xnode anode = GetAgentNode(L"file");
+			SetAgentNode(anode,L"<vbox/>");
+			anode.SetLayerFlow(LayerFlow_UnLayer);
+			xcontrol xc = GetControl(L"image");
+			SendMessage(xc.GetHWND(), 0x014E, 15, 0);
+			m_mode = L"new";
+			onClare();
+		}
+		else if (comdid == L"NewFile")
+		{
+			m_type = L"file";
+			xnode anode = GetAgentNode(L"file");
+			anode.SetLayerFlow(LayerFlow_NS);
+			KXMLDOMElement e = GetElement().selectSingleNode(L"//vbox[@name='file']");
+			SetAgentNode(anode,e.xml());
+			xcontrol xc = GetControl(L"image");
+			SendMessage(xc.GetHWND(), 0x014E, 16, 0);
+			m_mode = L"new";
+			onClare();
+		}
+		else if (comdid == L"param_add")
+		{
+			//dw_param.InsertRow(0);
+		}
+		else if (comdid == L"param_del")
+		{
+			//int row = dw_param.GetRow();
+			//if(row<0) return 0;
+			//dw_param.DeleteRow(row);
+		}
+		else if (comdid == L"selectxpage")
+		{
+			xaserverarg arg;
+			//OpenWindow(L"/developer/XDevXWKDlg.xpage",arg);
+			OpenWindow(L"dev:xpage[XDevXWKDlg.xpage]",arg);
+			xcontrol xc = GetControl(L"xpage");
+			xc.SetText(arg.GetArgString(L"caption"));
+			xc = GetControl(L"xpageguid");
+			xc.SetText(arg.GetArgString(L"guid"));
+		}
+		else if (comdid == L"delete")
+		{
+			HTREEITEM hitem = tv_folder.GetSelectedItem();
+			if (!hitem) return 0;
+			if (hitem == tv_folder.GetRootItem()) return 0;
+			if (tv_folder.GetChildItem(hitem)) return 0;
+			tv_folder.DeleteItem(hitem);
+			onsave();
+		}
+		else if (comdid == L"save")
+		{
+			//xstring str=L"<"+m_type+L" ";
+
+			xml x ;
+			x.loadXML(L"<" + m_type + L"/>");
+			auto r = x.documentElement();
+
+			xcontrol xc = GetControl(L"caption");
+			xstring name = xc.GetText();
+			if (name == L"")
+			{
+				alert(L"请填写名称!");
+				return 0;
+			}
+			//str += L"caption='"+name+L"' ";
+			r.setAttribute(L"caption",name);
+
+			xstring tmp = GetGuid();
+			//str += L"guid='"+tmp+L"' ";
+			r.setAttribute(L"guid",tmp);
+
+			if (m_type == L"file")
+			{
+				xc = GetControl(L"xpage");
+				tmp = xc.GetText();
+				xstring tmp1 = L"" + tmp + L"?";
+				xreport dw_param = GetControl(L"dw_param");
+				int i = 1;
+				xstring ss = L"";
+				for (i = 1; i <= dw_param.GetRowCount(); i++)
+				{
+					xstring name1 = dw_param.GetItemString(i,1);
+					xstring value1 = dw_param.GetItemString(i,2);
+					if (name != L"")
+					{
+						xstring s = name1 + L"=" + value1 + L"&";
+						ss += s;
+					}
+				}
+				ss = ss.mid(0, ss.length() - 1);
+				tmp1 += ss;
+				//trace(tmp1);
+				//str += L"url='worknode:"+tmp+L"/open#1' ";
+				r.setAttribute(L"url",L"" + tmp1);
+			}
+
+			xc = GetControl(L"index");
+			xstring index = xc.GetText();
+			r.setAttribute(L"index",index);
+
+			xc = GetControl(L"name");
+			tmp = xc.GetText();
+			r.setAttribute(L"name",tmp);
+
+			xc = GetControl(L"code");
+			tmp = xc.GetText();
+			r.setAttribute(L"code",tmp);
+
+
+			xc = GetControl(L"name");
+			tmp = xc.GetText();
+			r.setAttribute(L"name",tmp);
+			xc = GetControl(L"status");
+			//tmp=getComboboxData(xc);
+			tmp = xc.GetText();
+			//str += L"status='"+tmp+L"' ";
+			r.setAttribute(L"status",tmp);
+
+			xc = GetControl(L"image");
+			//tmp=getComboboxData(xc);
+			tmp = xc.GetText();
+			//str += L"image='"+tmp+L"' ";
+			r.setAttribute(L"image",tmp);
+
+			//str += L"/>";
+			//param p =str;
+			//trace(r.xml);
+			xstring p = r.xml();
+
+			//tv_folder.InsertChildItem(hitem,name,x.documentElement,tmp.toInt());
+			HTREEITEM hitem = tv_folder.GetSelectedItem();
+			if (hitem == 0) hitem = tv_folder.GetRootItem();
+			HTREEITEM ditem = hitem;
+			if (m_mode == L"edit")
+				hitem = tv_folder.GetParentItem(ditem);
+			HTREEITEM bitem = getInsertItem(hitem,L"" + index);
+			HTREEITEM h;
+			if (!bitem)
+				h = tv_folder.InsertChildItem(hitem,name,p,tmp.toInt());
+			else
+				h = tv_folder.InsertItem(hitem,bitem,name,p,tmp.toInt());
+			if (m_mode == L"edit")
+			{
+				copyNode(ditem,h);
+				tv_folder.DeleteItem(ditem);
+			}
+			tv_folder.ExpandItemEx(hitem);
+			onsave();
+		}
+		xutil::RestoreCursor(hCursor);
+		return 0;
+	}
+
+	//命令处理事件
+	int OnXCommand(TEvent* evt,LPARAM param)
+	{
+		return OnCmdDispatch(evt->xcommand.pStrID);
+	}
+
+	int OnTreeDrag(TEvent* evt, LPARAM param)
+	{
+		TVNNMHDR& nmtv = *(TVNNMHDR*)evt->notify.pnmh;
+		HTREEITEM hItem = nmtv.FromItem;
+		tv_folder.DeleteItem(hItem);
+		onsave();
+		return 1;
+	}
+
+	int setXpage(KXMLDOMElement e)
+	{
+		xcontrol xc = GetControl(L"caption");
+		xstring str = e.getAttribute(L"caption");
+		xc.SetText(L"" + str);
+
+		if (m_type == L"file")
+		{
+			xstring str = e.getAttribute(L"url");
+			str = L"" + str;
+			if (str.find(L"?",0) < 0)
+				str = str + L"?";
+
+			xc = GetControl(L"xpage");
+			xstring t = str.mid(0,str.find(L"?",0));
+			xc.SetText(L"" + t);
+
+			xstring p = str.mid(str.find(L"?",0) + 1, str.length());
+			if (p != L"")
+			{
+				p += L"&";
+				int i = 1;
+				while (p.find(L"=L",0) > 0)
+				{
+					xstring name = p.mid(0, p.find(L"=L",0));
+					xstring value = p.mid(p.find(L"=L",0) + 1, p.find(L"&",0) - p.find(L"=L",0) - 1);
+					xreport dw_param = GetControl(L"dw_param");
+					dw_param.SetItemString(i, 1, L"" + name);
+					dw_param.SetItemString(i, 2, L"" + value);
+					i += 1;
+					p = p.mid(p.find(L"&",0) + 1, p.length());
+				}
+			}
+		}
+		xc = GetControl(L"image");
+		xstring str = e.getAttribute(L"image");
+		//xc.SetText(L""+str);
+		SendMessage(xc.GetHWND(), 0x014E, str.toInt(), 0);
+
+		xc = GetControl(L"index");
+		xstring str = e.getAttribute(L"index");
+		xc.SetText(L"" + str);
+
+		xc = GetControl(L"code");
+		xstring str = e.getAttribute(L"code");
+		xc.SetText(L"" + str);
+
+		xc = GetControl(L"name");
+		xstring str = e.getAttribute(L"name");
+		xc.SetText(L"" + str);
+
+		xc = GetControl(L"status");
+		xstring str = e.getAttribute(L"status");
+		xc.SetText(L"" + str);
+
+		OnCombSelChanged();
+	}
+
+	int OnTreeSelChanged(ref TNotifyEvent evt,int param)
+	{
+		ref NMTREEVIEW nmtv = evt.pnmh;
+		int hitem = nmtv.itemNew.hItem;
+
+		onClare();
+		m_mode = L"new";
+		if (hitem == tv_folder.GetRootItem()) return 0;
+		//IXMLDOMElement e = tv_folder.GetItemData(hitem);
+		//trace(e.xml);
+		param p = tv_folder.GetItemData(hitem);
+		xml x ;
+		x.loadXML(L"" + xstring(p));
+		IXMLDOMElement e = x.documentElement;
+		m_type = e.tagName;
+		if (m_type == L"file")
+			OnCmdDispatch(L"NewFile");
+		else
+			OnCmdDispatch(L"NewFolder");
+		setXpage(e);
+		m_mode = L"edit";
+	}
+
+	int OnAttachEvent()
+	{
+		//绑定工具条点击事件
+		AttachEvent(L"WM_XCOMMAND",OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS",OnSetFocus);
+		AttachEvent(L"image", L"CBN_SELCHANGE",OnCombSelChanged);
+		AttachEvent(L"tv_folder", L"TVN_ENDDRAG",OnTreeDrag);
+		AttachEvent(L"tv_folder", L"TVN_SELCHANGED",OnTreeSelChanged);
+	}
+
+	int OnInitial()
+	{
+		SetAgent();
+
+		OnAttachEvent();
+
+		xcontrol xc = GetControl(L"image");
+		int i;
+		for (i = 0; i < 35; i++)
+		{
+			SendMessage(xc.GetHWND(), 0x0143, 0, i.toString());
+			//param p=i.toString();
+			//SendMessage(xc.GetHWND(), 0x0151, i, p);
+		}
+		SendMessage(xc.GetHWND(), 0x014E, 15, 0);
+
+		return 1;
+	}
+
+	int OnTreeAdd(int hitem, IXMLDOMElement e)
+	{
+		auto list = e.selectNodes(L"*");
+		int i;
+		int s = list.length;
+		for (i = 0; i < s; i++)
+		{
+			IXMLDOMElement ele = list.item(i);
+			xstring name = ele.getAttribute(L"caption");
+			xstring image = ele.getAttribute(L"image");
+			image = L"" + image;
+			xstring data = ele.xml;
+			data = data.mid(0,data.find(L">",1)) + L"/>";
+			param p = data;
+			int j = tv_folder.InsertChildItem(hitem,name,p,image.toInt());
+			OnTreeAdd(j,ele);
+		}
+		return 1;
+	}
+
+	int onload()
+	{
+		dw_param = GetControl(L"dw_param");
+		dw_param.SetReadOnly(false);
+
+		tv_folder = GetControl(L"tv_folder");
+
+		OnInitial();
+
+		m_type = L"folder";
+		OnCmdDispatch(L"NewFolder");
+		m_mode = L"new";
+
+		if (!GetParam()) return 1;
+		xwin w = GetFrameWindow();
+		xtree tv = w.GetControl(L"DevExplorer");
+		int hItem = GetParam();
+		IXMLDOMElement e = tv.GetItemData(hItem);
+		xstring name = e.getAttribute(L"caption");
+		int root = tv_folder.InsertItem(L"" + name,e,17);
+		xstring content = GetData();
+		if (content != L"")
+		{
+			//trace(content);
+			xml x ;
+			if (x.loadXML(content))
+			{
+				OnTreeAdd(root,x.documentElement);
+				tv_folder.ExpandItemEx(root);
+			}
+		}
+
+		return 1;
+	}
+};
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXCode.cpp b/jrj/xframe/devloper/XDevEditXCode.cpp
deleted file mode 100644
index f26ab17..0000000
--- a/jrj/xframe/devloper/XDevEditXCode.cpp
+++ /dev/null
@@ -1,561 +0,0 @@
-#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/XDevEditXFile.cpp b/jrj/xframe/devloper/XDevEditXFile.cpp
index 50e0dea..8ec2265 100644
--- a/jrj/xframe/devloper/XDevEditXFile.cpp
+++ b/jrj/xframe/devloper/XDevEditXFile.cpp
@@ -8,12 +8,13 @@
 #include <xcontrol/xsedit.hpp>
 #include <xcontrol/xcombobox.hpp>
 #include <xcontrol/xreport.hpp>
+#include "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDevEditXFile : public xwin
+class export XDevEditXFile : public XDevEditPage
 {
 	public:
-	XDevEditXFile(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+	XDevEditXFile(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
 public:
 	static XDevEditXFile* CreateInstance(void* implPtr, void* hWnd)
 	{
@@ -156,7 +157,7 @@
 			xml x;
 			if (!x.loadXML(content))
 			{
-				KXMLDOMParseError pError = x.parseError;
+				KXMLDOMParseError pError = x.parseError();
 				if (pError)
 				{
 					xstring str = pError.srcText();
@@ -255,7 +256,7 @@
 
 				//find project folder
 				xstring prjguid = L"";
-				int pitem = GetProjectItem(tv_folder,hItem);
+				HTREEITEM pitem = GetProjectItem(tv_folder,hItem);
 				if (pitem)
 					prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
 
@@ -267,13 +268,13 @@
 					{
 						auto f = e.selectSingleNode(L"//*[@uri='" + name + L"']");
 						if (f) {
-							xstring guid = KXMLDOMElement(f).selectSingleNode(L"@guid").text;//.getAttribute(L"guid");
+							xstring guid = f.selectSingleNode(L"@guid").text();//.getAttribute(L"guid");
 							if (guid == L"")
-								return "";
+								return L"";
 							arg.AddArg(L"guid",guid);
 						}
 	else
-	   return "";
+	   return L"";
 	}
 	KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
 	xstring guid = p.getAttribute(L"guid");
@@ -291,9 +292,9 @@
 		return L"";
 	}
 
-int OnDoubleClicked(ref TNotifyEvent evt,int param)
+int OnDoubleClicked(TEvent* evt,LPARAM param)
 {
-	ref DWNMHDR  hdr = evt.pnmh;
+	DWNMHDR&  hdr = *(DWNMHDR*)evt->notify.pnmh;
 	int row = hdr.row;
 	KXMLDOMElement e = xp.GetRowElement(row);
 	xstring filename = e.getAttribute(L"type");
@@ -332,10 +333,10 @@
 	int OnAttachEvent()
 	{
 		//绑定工具条点击事件
-		AttachEvent(L"WM_XCOMMAND",OnXCommand);
+		AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditXFile::OnXCommand);
 		//获取焦点事件,用于重置工具条
-		AttachEvent(L"WM_SETFOCUS",OnSetFocus);
-		AttachEvent(L"xreport",L"DWV_DOUBLECLICKED",OnDoubleClicked);
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXFile::OnSetFocus);
+		AttachEvent(L"xreport",L"DWV_DOUBLECLICKED", (FEvent)&XDevEditXFile::OnDoubleClicked);
 	}
 
 	int LoadData()
diff --git a/jrj/xframe/devloper/XDevEditXFlow.cpp b/jrj/xframe/devloper/XDevEditXFlow.cpp
deleted file mode 100644
index f26ab17..0000000
--- a/jrj/xframe/devloper/XDevEditXFlow.cpp
+++ /dev/null
@@ -1,561 +0,0 @@
-#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
deleted file mode 100644
index f26ab17..0000000
--- a/jrj/xframe/devloper/XDevEditXHtml.cpp
+++ /dev/null
@@ -1,561 +0,0 @@
-#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
index f26ab17..6ce69da 100644
--- a/jrj/xframe/devloper/XDevEditXLayer.cpp
+++ b/jrj/xframe/devloper/XDevEditXLayer.cpp
@@ -4,544 +4,118 @@
 #include <wobject/xaserverarg.hpp>
 #include <xcontrol/xtreeview.hpp>
 #include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xsedit.hpp>
+#include "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDeveloper : public xwin
+class export XDevEditXLayer : public XDevEditPage
 {
 	public:
-	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+	XDevEditXLayer(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
 public:
-	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	static XDevEditXLayer* CreateInstance(void* implPtr, void* hWnd)
 	{
-		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		XDevEditXLayer* pWin = new XDevEditXLayer(implPtr, (HWND)hWnd);
 		return pWin;
 	}
 private:	//
-	xtreeview tv_folder;
-	xcontrol mle_output;
-	int sheet_Count;
-public:
-	int trace(xstring msg)
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
 	{
-		xstring t = mle_output.GetText();
-		mle_output.SetText(t + msg);
+		/*
+		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 OnProcessUrl(xstring kind, xstring url)
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
 	{
-		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;
-	}
+		SetAgent();
 
-	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")
+		if (comdid == L"xmFileSaveEx")
 		{
-			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;
+			xsedit xs = GetControl(L"xpagecontent");
+			xsedit xc = GetControl(L"xcodecontent");
 
+			HCURSOR hCursor = xutil::SetCursorWait();
 
-			//find project folder
-			xstring prjguid = L"";
-			HTREEITEM pitem = GetProjectItem(hItem);
-			if (pitem)
-				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
+			xstring content;
+			//save xml content
+			xs.GetContent(content);
+			SaveContent(content);
 
-			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);
-			}
+			xstring code;
+			//save tpp content
+			xc.GetContent(code);
+			SaveContentEx(code,1);
+			//
+			xutil::RestoreCursor(hCursor);
 
 			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)
+	int OnXCommand(TEvent* evt,LPARAM 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);
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditXLayer::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXLayer::OnSetFocus);
+
+		return 1;
+	}
+
+	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".cpp");
+		}
 
 		return 1;
 	}
 
 	int OnInitial()
 	{
+		SetAgent();
+
 		OnAttachEvent();
 
 		return 1;
@@ -549,13 +123,8 @@
 
 	int onload()
 	{
-		sheet_Count = -1;
 		OnInitial();
-
-		tv_folder = GetControl(L"DevExplorer");
-		mle_output = GetControl(L"output");
-		SetAgent(L"projects");
-
+		LoadData();
 		return 1;
-	}
+	} 
 };
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXMSSQL.cpp b/jrj/xframe/devloper/XDevEditXMSSQL.cpp
index f26ab17..d17d8bc 100644
--- a/jrj/xframe/devloper/XDevEditXMSSQL.cpp
+++ b/jrj/xframe/devloper/XDevEditXMSSQL.cpp
@@ -4,187 +4,177 @@
 #include <wobject/xaserverarg.hpp>
 #include <xcontrol/xtreeview.hpp>
 #include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xdwgrid.hpp>
+#include "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDeveloper : public xwin
+class export XDevEditXMSSQL : public XDevEditPage
 {
-	public:
-	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
 public:
-	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	XDevEditXMSSQL(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
+public:
+	static XDevEditXMSSQL* CreateInstance(void* implPtr, void* hWnd)
 	{
-		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		XDevEditXMSSQL* pWin = new XDevEditXMSSQL(implPtr, (HWND)hWnd);
 		return pWin;
 	}
 private:	//
-	xtreeview tv_folder;
-	xcontrol mle_output;
-	int sheet_Count;
-public:
-	int trace(xstring msg)
+	xtreeview tv_db;
+	xlayersheet list;
+
+	//xnode	m_agentNode;	//Agent Condition
+	//xstring	m_agentCond;	//Agent Node
+	int SetAgent()
 	{
-		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 xfNodeAgentArea  = L"agentarea";
+				xnode anode = GetAgentNode(xfNodeAgentArea);
+				var xframeElement =  GetElement();
+				var agent = xframeElement.selectSingleNode(L"agent/"+xfNodeAgentArea+L"[1]/*");
+				if(agent)
 				{
-					xstring guid = e.getAttribute(L"guid");
-					arg.AddArg(L"guid", guid);
+					xstring s = agent.xml;
+					m_agentNode =  SetAgentNodeContent (anode,s);
 				}
-				KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
-				xstring guid = p.getAttribute(L"guid");
-				arg.AddArg(L"root.guid", guid);
+		*/		return 1;
 			}
-			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 OnSetFocus(TEvent* evt,LPARAM param)
+	{
+		SetAgent();
+
+		//重置工具条
+		return 1;
 	}
 
-	int OnTreeDblClick(TEvent* evt, int param)
+	xstring getLink(HTREEITEM item)
 	{
-		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++)
+		HTREEITEM p = tv_db.GetParentItem(item);
+		while (tv_db.GetParentItem(p) > 0)
 		{
-			if (hItem == layer.GetParam(i))break;
+			item = tv_db.GetParentItem(item);
+			p = tv_db.GetParentItem(item);
 		}
-		if (i < nIndex)
+		xstring link = tv_db.GetItemData(item);
+		return link;
+	}
+
+	KXMLDOMElement OnXQuery(xstring data)
+	{
+		HTREEITEM item = tv_db.GetSelectedItem();
+		xstring link = getLink(item);
+		xml x ;
+		xaserverarg arg;
+		arg.AddArg(L"type",data);
+		arg.AddArg(L"link",link);
+		if (xaserver::ExecXQuery(GetServerUrl(),L"[MSSQL.list.xq]",arg.GetString(),x) != 1)
 		{
-			layer.SelectSheet(i);
+			trace(x.xml());
 			return 1;
 		}
-		KXMLDOMElement e = tv_folder.GetItemData(hItem);
-		xstring node = e.tagName();
-		if (node == L"File" || node == L"file")
+		return x.documentElement();
+	}
+
+	int setGrid(KXMLDOMElement e,xstring caption)
+	{
+		xml x;
+		xdwgrid grid = GetControl(caption);
+		if (!e.selectSingleNode(L"grid/sheet")) return 0;
+		x.loadXML(e.selectSingleNode(L"grid/sheet").xml());
+		grid.SetDataObject(x);
+		if (!e.selectSingleNode(L"datas")) return 0;
+		x.loadXML(e.selectSingleNode(L"datas").xml());
+		grid.Retrieve(x);
+		grid.Redraw();
+		return 1;
+	}
+
+	xstring replace(xstring a, xstring b, xstring c, int s=0)
+	{
+		int k = a.find(b,s);
+		if (k > -1)
 		{
-			//xstring str =  ProcessDevCmd(L"getobject",arg.GetString());
-			xstring typ = e.getAttribute(L"type");
+			xstring str;
+			if (k == 0)
+				str = L"" + c + a.right(a.length() - k - b.length());
+			else if (k + b.length() == a.length())
+				str = L"" + a.left(k) + c;
+			else
+				str = L"" + a.left(k) + c + a.right(a.length() - k - b.length());
+			replace(str, b, c, k + b.length() + 1);
+		}
+		else
+			return a;
+	}
 
-			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);
-			}
+	int OnOpen(xstring caption,xstring node)
+	{
+		int s = list.GetSheetCount();
+		int i;
+		xstring pa = node + L"." + caption;
+		for (i = 0; i < s; i++)
+		{
+			xstring p = (wchar_t*)list.GetParam(i);
+			if (pa == p)
+				break;
+		}
+		if (i < s)
+		{
+			list.SelectSheet(i);
+			return 0;
+		}
+		KXMLDOMElement xframeElement = GetElement();
+		KXMLDOMElement agent = xframeElement.selectSingleNode(L"agent/" + node + L"/*");
+		xstring str = replace(agent.xml(), L"{#1}", caption);
+		xml x ;
+		x.loadXML(str);
+		int k = list.InsertSheet(-1,(LPTSTR)caption.c_str(), x.documentElement());
+		list.SelectSheet(k);
+		list.SetParam(k,(void*)pa.c_str(true));
+		return 1;
+	}
 
+	int onShow()
+	{
+		while (tv_db.GetRootItem() > 0)
+			tv_db.DeleteItem(tv_db.GetRootItem());
+		xsedit xs = GetControl(L"xcontent");
+		xstring content;
+		xs.GetContent(content);
+		xml x ;
+		x.loadXML(content);
+		KXMLDOMElement e = x.documentElement();
+		xstring name = e.getAttribute(L"name");
+		HTREEITEM root = tv_db.InsertItem(name.c_str(), NULL, 16);
+		auto lists = e.selectNodes(L"*");
+		int i;
+		int s = lists.length();
+		for (i = 0; i < s; i++)
+		{
+			KXMLDOMElement ele = lists.item(i);
+			xstring name = ele.getAttribute(L"name");
+			xstring link = ele.getAttribute(L"link");
+			HTREEITEM k = tv_db.InsertChildItem(root,L"" + name,L"" + link,15);
+			HTREEITEM j = tv_db.InsertChildItem(k,L"表",L"table",22);
+			tv_db.SetItemChild1(j,1);
+			j = tv_db.InsertChildItem(k,L"视图",L"view",23);
+			tv_db.SetItemChild1(j,1);
+			j = tv_db.InsertChildItem(k,L"存储过程",L"procedure",24);
+			tv_db.SetItemChild1(j,1);
+			j = tv_db.InsertChildItem(k,L"自定义函数",L"function",25);
+			tv_db.SetItemChild1(j,1);
+		}
+		tv_db.ExpandItem(root);
+
+		if (list.GetSheetCount() < 1)
+		{
+			xstring caption = L"Query";
+			if (OnOpen(caption,L"query") == 0) return 0;
+			xsedit xs = GetControl(L"sql_" + caption);
+			xs.LoadContent(L"",L".sql");
 		}
 		return 1;
 	}
@@ -192,356 +182,411 @@
 	//命令发布函数
 	int OnCmdDispatch(xstring comdid)
 	{
-		//
-		if (comdid == L"xmSqlWatch")
+		HCURSOR hCursor = xutil::SetCursorWait();
+		xsedit xs = GetControl(L"xcontent");
+		xstring content;
+		xs.GetContent(content);
+
+		if (comdid == L"xmFileSave")
 		{
-			OpenWindow(L"dev:xpage[sqlWatch.vx]");
-			return 1;
+			//save xml content
+			SaveContent(content);
 		}
-		if (comdid == L"xmCheckUrl")
+		else if (comdid == L"xmValid")
 		{
-			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))
+			xml x ;
+			if (!x.loadXML(content))
 			{
-				hDomainItem = hItem;
-			}
-			else
-			{
-				hP2Item = GetP2Item(hItem);
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-			}
-
-			e = tv_folder.GetItemData(hItem);
-			if (hP2Item)
-			{
-				if (hP2Item != hItem)
+				KXMLDOMParseError pError = x.parseError();
+				if (pError)
 				{
-					xstring guid = e.getAttribute(L"guid");
-					arg.AddArg(L"parent.guid", guid);
+					xstring str = pError.srcText();
+					xstring sError = L"\r\nMSSQL错误: " + 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);
 				}
-				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")
+				else
 				{
-					if (arg.GetArgString(L"image") == L"")
-						arg.AddArg(L"image", L"15");
-					arg.AddArg(L"folder", L"folder");
-					arg.AddArg(L"type", L"folder");
+					trace(L"XML 错误");
 				}
+				return -1;
 			}
-			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")
+		else if (comdid == L"show")
 		{
-			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;
+			if (OnCmdDispatch(L"xmValid") == -1)
+				return -1;
+			onShow();
 		}
-		else if (comdid == L"xmUpdateProject")
+		else if (comdid == L"xmQuery")
 		{
-			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;
+			xstring guid = win32::GetGuid();
+			xstring caption = L"Query_" + guid.mid(1,8);
+			if (OnOpen(caption,L"query") == 0) return 0;
+			xsedit xs = GetControl(L"sql_" + caption);
+			xs.LoadContent(L"",L".sql");
 		}
-		else if (comdid == L"xmEditObject")
+		else if (comdid.left(8) == L"xmClose_")
 		{
-			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);
-				}
-
-			}
-
+			list.DeleteSheet(list.GetSheetIndex());
 		}
+		else if (comdid.left(6) == L"xmRun_")
+		{
+			xstring table = comdid.mid(6,comdid.length());
+			xsedit xs = GetControl(L"sql_" + table);
+			xstring content;
+			xs.GetContent(content);
+			xstring sql = L"xquery@" + content + L" for xml path('data'),root('datas'),type";
+			KXMLDOMElement e = OnXQuery(sql);
+			if (e)
+				setGrid(e,L"grid_" + table);
+		}
+		xutil::RestoreCursor(hCursor);
 		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)
+	int OnXCommand(TEvent* evt,LPARAM param)
 	{
 		return OnCmdDispatch(evt->xcommand.pStrID);
 	}
 
-	int OnSelChanged(TEvent* evt, int param)
+	int OnTreeAdd(HTREEITEM item, xstring data,KXMLDOMElement e)
 	{
-		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))
+		auto list = e.selectNodes(L"*");
+		int i;
+		int s = list.length();
+		for (i = 0; i < s; i++)
 		{
-			hitem = tv_folder.GetParentItem(hitem);
-			xstring p = L"" + tv_folder.GetItemLabel(hitem);
-			path = p + L"\\" + path;
+			KXMLDOMElement ele = list.item(i);
+			xstring name = ele.getAttribute(L"name");
+			xstring image = ele.getAttribute(L"image");
+			xstring d = ele.getAttribute(L"data");
+			image = L"" + image;
+			if (d == L"")
+				d = data + L"@" + name;
+			HTREEITEM j = tv_db.InsertChildItem(item,(LPTSTR)name.c_str(), (LPARAM)d.c_str(true), image.toInt());
+			if (image.toInt() > 9)
+				tv_db.SetItemChild1(j,1);
+			OnTreeAdd(j,d,ele);
 		}
-		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)
+
+	int OnTreeExpand(HTREEITEM item)
 	{
-		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)
+		xstring data = tv_db.GetItemData(item);
+		xstring link = getLink(item);
+		xml x ;
+		xaserverarg arg;
+		arg.AddArg(L"type",data);
+		arg.AddArg(L"link",link);
+		if (xaserver::ExecXQuery(GetServerUrl(),L"[MSSQL.list.xq]",arg.GetString(),x) != 1)
 		{
-			void* p = nullptr;
-			layer.SetParam(s - 1, p);
+			trace(x.xml());
+			return 0;
 		}
-		sheet_Count = s;
+		KXMLDOMElement e = x.documentElement();
+		OnTreeAdd(item,data,e);
 		return 1;
 	}
+
+	int OnTreeExpanding(TEvent* evt,LPARAM param)
+	{
+		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
+		HTREEITEM item = nmtv.itemNew.hItem;
+		if (tv_db.GetChildItem(item) > 0) return 0;
+		OnTreeExpand(item);
+		return 1;
+	}
+
+	int OnGroupAction(xstring guid,xstring name,xstring flag)
+	{
+		xaserverarg arg;
+		arg.AddArg(L"type",flag);
+		HTREEITEM item = tv_db.GetSelectedItem();
+		xstring str = L"<group guid='" + guid + L"' name='" + name + L"'";
+		if (flag.mid(5,7) == L".table.")
+		{
+			str += L"/>";
+		}
+		else
+		{
+			xstring link = getLink(item);
+			str += L" link='" + link + L"'/>";
+		}
+		//trace(str);
+		arg.AddArg(L"context",str);
+		return xaserver::ExecXAction(GetServerUrl(),L"[MSSQL.action.xa]",arg.GetString());
+	}
+
+	int OnNewGroup(HTREEITEM item)
+	{
+		tv_db.ExpandItemEx(item);
+		HTREEITEM gitem = tv_db.GetChildItem(item);
+		while (gitem > 0)
+		{
+			xstring data = L"" + tv_db.GetItemData(gitem);
+			if (data.left(6) != L"group@") break;
+			gitem = tv_db.GetNextItem(gitem);
+		}
+		xstring guid = win32::GetGuid();
+		if (OnGroupAction(guid,L"",L"group.update") != 1) return 0;
+		HTREEITEM j = tv_db.InsertItem(item,gitem,L"",L"group@" + guid,25);
+		tv_db.ItemEdit(j);
+		return 1;
+	}
+
+	int OnDel(HTREEITEM item)
+	{
+		xstring data = tv_db.GetItemData(item);
+		if (data.left(6) == L"group@")
+		{
+			xstring guid = data.mid(6,data.length());
+			if (OnGroupAction(guid,L"",L"group.del") != 1) return 0;
+			tv_db.DeleteItem(item);
+		}
+		else if (data.left(6) == L"table@")
+		{
+			HTREEITEM pitem = tv_db.GetParentItem(item);
+			xstring pdata = tv_db.GetItemData(pitem);
+			if (pdata.left(6) == L"group@")
+			{
+				xstring guid = pdata.mid(6,pdata.length());
+				xstring table = data.mid(6,data.length());
+				if (OnGroupAction(guid,table,L"group.table.del") != 1) return 0;
+				tv_db.DeleteItem(item);
+			}
+		}
+		return 1;
+	}
+
+	int OnRefresh(HTREEITEM item)
+	{
+		while (tv_db.GetChildItem(item) > 0)
+			tv_db.DeleteItem(tv_db.GetChildItem(item));
+		OnTreeExpand(item);
+		return 1;
+	}
+
+	int OnQuery(xstring caption)
+	{
+		if (OnOpen(caption,L"query") == 0) return 0;
+		KXMLDOMElement e = OnXQuery(L"column@" + caption);
+		if (!e) return 0;
+		auto list = e.selectNodes(L"columns/column");
+		int i;
+		int s = list.length();
+		xstring str;
+		str = L"SELECT TOP 500 \r\n";
+		for (i = 0; i < s; i++)
+		{
+			KXMLDOMElement ele = list.item(i);
+			xstring tmp = ele.getAttribute(L"name");
+			if (i < s - 1) tmp = tmp + L",L";
+			str += L"\t" + tmp + L"\r\n";
+		}
+		str += L"FROM " + caption;
+		xsedit xs = GetControl(L"sql_" + caption);
+		xs.LoadContent(str,L".sql");
+		setGrid(e,L"grid_" + caption);
+		return 1;
+	}
+
+	int OnEdit(xstring caption)
+	{
+		if (OnOpen(caption,L"edit") == 0) return 0;
+		KXMLDOMElement e = OnXQuery(L"edit@" + caption);
+		if (!e) return 0;
+		setGrid(e,L"editgrid_" + caption);
+		return 1;
+	}
+
+	int OnDesign(xstring caption)
+	{
+		if (OnOpen(caption,L"design") == 0) return 0;
+		KXMLDOMElement e = OnXQuery(L"design@" + caption);
+		if (!e) return 0;
+		setGrid(e,L"designgrid_" + caption);
+		return 1;
+	}
+
+	xstring getCaption(xstring str)
+	{
+		while (str.find(L"@", 0) > 0)
+		{
+			xstring tmp = str.mid(str.find(L"@", 0) + 1, str.length());
+			str = tmp;
+		}
+		return str;
+	}
+
+	int OnTreeRClick(TEvent* evt,int param)
+	{
+		TVNNMHDR& nmtv = *(TVNNMHDR*)evt->notify.pnmh;
+		HTREEITEM item = nmtv.FromItem;
+		xstring data = tv_db.GetItemData(item);
+		xstring popup;
+		if (data == L"table")
+		{
+			xstring memu = L"<root>";
+			memu += L"<Item>新建表</Item>";
+			memu += L"<Item>新建分组</Item>";
+			memu += L"<Item>-</Item>";
+			memu += L"<Item>刷新</Item>";
+			memu += L"</root>";
+			xstring str = tv_db.PopupMenu(memu);
+			popup = str;
+		}
+		else if (data.left(6) == L"table@" && data.find(L"@",7) < 0)
+		{
+			xstring memu = L"<root>";
+			memu += L"<Item>新建表</Item>";
+			memu += L"<Item>设计</Item>";
+			memu += L"<Item>-</Item>";
+			memu += L"<Item>打开前500行</Item>";
+			memu += L"<Item>编辑前200行</Item>";
+			memu += L"<Item>-</Item>";
+			memu += L"<Item>重命名</Item>";
+			memu += L"<Item>刷新</Item>";
+			memu += L"<Item>删除</Item>";
+			memu += L"</root>";
+			xstring str = tv_db.PopupMenu(memu);
+			popup = str;
+		}
+		else if (data.left(6) == L"group@")
+		{
+			xstring memu = L"<root>";
+			memu += L"<Item>重命名</Item>";
+			memu += L"<Item>刷新</Item>";
+			memu += L"<Item>删除</Item>";
+			memu += L"</root>";
+			xstring str = tv_db.PopupMenu(memu);
+			popup = str;
+		}
+		else if (data.left(5) == L"view@" || data.left(10) == L"procedure@" || data.left(9) == L"function@")
+		{
+			xstring memu = L"<root>";
+			memu += L"<Item>重命名</Item>";
+			memu += L"<Item>修改</Item>";
+			memu += L"<Item>删除</Item>";
+			memu += L"</root>";
+			xstring str = tv_db.PopupMenu(memu);
+			popup = str;
+		}
+
+		//trace(L"   "+data+L"-->"+getCaption(data));
+		xstring caption = getCaption(data);//data.mid(6,data.length());		
+		if (popup == L"新建分组")
+			OnNewGroup(item);
+		else if (popup == L"删除")
+			OnDel(item);
+		else if (popup == L"刷新")
+			OnRefresh(item);
+		else if (popup == L"打开前500行")
+			OnQuery(caption);
+		else if (popup == L"编辑前200行")
+			OnEdit(caption);
+		else if (popup == L"设计")
+			OnDesign(caption);
+		else if (popup == L"新建表")
+		{
+			xstring guid = win32::GetGuid();
+			xstring text = L"Table_" + guid.mid(1,8);
+			OnDesign(text);
+		}
+		else if (popup == L"修改")
+			OnOpen(caption,L"query");
+		return 1;
+	}
+
+	int OnTreeBeginDrag(TEvent* evt,LPARAM param)
+	{
+		NMTREEVIEW& nmtv =*(NMTREEVIEW*) evt->notify.pnmh;
+		HTREEITEM item = nmtv.itemNew.hItem;
+		xstring data = tv_db.GetItemData(item);
+		if (data.left(6) != L"table@" || data.find(L"@",7) > 0)
+		{
+			int WM_LBUTTONUP = 0x0202;
+			SendMessage(tv_db.GetHWND(),WM_LBUTTONUP,0,0);
+		}
+		return 1;
+	}
+
+	int OnTreeEndDrag(TEvent* evt, LPARAM param)
+	{
+		TVNNMHDR& nmtv = *(TVNNMHDR*)evt->notify.pnmh;
+		HTREEITEM fitem = nmtv.FromItem;
+		HTREEITEM titem = nmtv.ToItem;
+		xstring fdata = tv_db.GetItemData(fitem);
+		xstring tdata = tv_db.GetItemData(titem);
+		if (fdata.left(6) == L"table@" && tdata.left(6) == L"group@")
+		{
+			xstring table = fdata.mid(6,fdata.length());
+			xstring guid = tdata.mid(6,tdata.length());
+			if (OnGroupAction(guid,table,L"group.table.update") != 1) return 0;
+			tv_db.DeleteItem(fitem);
+		}
+		return 1;
+	}
+
+	int OnTreeEndEdit(TEvent* evt, LPARAM param)
+	{
+		NMTVDISPINFO& nmtv = *(NMTVDISPINFO*)evt->notify.pnmh;
+		HTREEITEM item = nmtv.item.hItem;
+		xstring pszText = nmtv.item.pszText;
+		if (pszText != L"")
+		{
+			xstring data = tv_db.GetItemData(item);
+			if (data.left(6) == L"group@")
+			{
+				xstring guid = data.mid(6,data.length());
+				if (OnGroupAction(guid,pszText,L"group.update") != 1) return 0;
+			}
+			tv_db.SetItemLabel(item,pszText);
+		}
+		return 1;
+	}
+
 	int OnAttachEvent()
 	{
 		//绑定工具条点击事件
-		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDeveloper::OnXCommand);
-		AttachEvent(L"DevExplorer", L"NM_DBLCLK", (FEvent)&XDeveloper::OnTreeDblClick);
+		AttachEvent(L"WM_XCOMMAND",(FEvent)XDevEditXMSSQL::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)XDevEditXMSSQL::OnSetFocus);
 		//获得树的展开事件
-		//AttachEvent(L"DevExplorer", L"TVN_ITEMEXPANDING",(FEvent)&XDeveloper::OnTreeExpanding);
+		AttachEvent(L"tv_db", L"TVN_ITEMEXPANDING", (FEvent)XDevEditXMSSQL::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);
+		//AttachEvent(L"tv_db", L"TVN_SELCHANGED",(FEvent)XDevEditXMSSQL::OnTreeSelChanged);		
+		AttachEvent(L"tv_db", L"TVN_RCLICK", (FEvent)XDevEditXMSSQL::OnTreeRClick);
+		AttachEvent(L"tv_db", L"TVN_BEGINDRAG", (FEvent)XDevEditXMSSQL::OnTreeBeginDrag);
+		AttachEvent(L"tv_db", L"TVN_ENDDRAG", (FEvent)XDevEditXMSSQL::OnTreeEndDrag);
+		AttachEvent(L"tv_db", L"TVN_ENDLABELEDIT", (FEvent)XDevEditXMSSQL::OnTreeEndEdit);
+	}
 
+	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;
@@ -549,13 +594,13 @@
 
 	int onload()
 	{
-		sheet_Count = -1;
+		tv_db = GetControl(L"tv_db");
+		list = GetControl(L"list");
+
 		OnInitial();
 
-		tv_folder = GetControl(L"DevExplorer");
-		mle_output = GetControl(L"output");
-		SetAgent(L"projects");
-
+		LoadData();
+		//OnCmdDispatch(L"xmQuery");
 		return 1;
 	}
 };
\ No newline at end of file
diff --git a/jrj/xframe/devloper/XDevEditXOffice.cpp b/jrj/xframe/devloper/XDevEditXOffice.cpp
index f26ab17..da7288b 100644
--- a/jrj/xframe/devloper/XDevEditXOffice.cpp
+++ b/jrj/xframe/devloper/XDevEditXOffice.cpp
@@ -4,544 +4,174 @@
 #include <wobject/xaserverarg.hpp>
 #include <xcontrol/xtreeview.hpp>
 #include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xsedit.hpp>
+#include <xcontrol/xdwgrid.hpp>
+#include <xcontrol/xoffice.hpp>
+#include "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDeveloper : public xwin
+class export XDevEditXOffice : public XDevEditPage
 {
 	public:
-	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+	XDevEditXOffice(void* implPtr, HWND hWnd) : XDevEditPage(implPtr, hWnd) {}
 public:
-	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	static XDevEditXOffice* CreateInstance(void* implPtr, void* hWnd)
 	{
-		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		XDevEditXOffice* pWin = new XDevEditXOffice(implPtr, (HWND)hWnd);
 		return pWin;
 	}
 private:	//
-	xtreeview tv_folder;
-	xcontrol mle_output;
-	int sheet_Count;
-public:
-	int trace(xstring msg)
+	//xdwgrid	dw_list;
+	xoffice m_xdoc;
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
 	{
-		xstring t = mle_output.GetText();
-		mle_output.SetText(t + msg);
+		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 OnProcessUrl(xstring kind, xstring url)
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
 	{
-		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;
-	}
+		SetAgent();
 
-	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")
+		xml x ;
+		m_xdoc.GetData(x);
+		xstring content = x.xml();
+		if (comdid == L"xmFileSave")
 		{
-			OpenWindow(L"dev:xpage[sqlWatch.vx]");
+			//save xml content
+			SaveContent(content);
 			return 1;
 		}
-		if (comdid == L"xmCheckUrl")
+		else if (comdid == L"xmDevPreview")
 		{
-			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;
-
+			xml x;
+			m_xdoc.GetData(x,m_xdoc.GetSelectedSheetIndex());
 			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);
-			}
-
+			arg.AddArg(L"xml", x.xml());
+			OpenWindow(L"dev:xpage[XDevOfficePreview.xpage]", arg);
 			return 1;
 		}
-		else if (comdid == L"xmDeleteObject")
+		else if (comdid == L"content")
 		{
-			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;
+			xsedit xs = GetControl(L"rptcontent");
+			xs.LoadContent(content,L".txt");
+			//xs.SetText(content);
 			return 1;
 		}
-		else if (comdid == L"xmUpdateProject")
+		else if (comdid == L"content1")
 		{
-			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);
-
+			xcontrol xs = GetControl(L"rptcontent1");
+			SendMessage(xs.GetHWND(), 0x400 + 53,0,4096 * 4096);
+			xs.SetText(content);
+			return 1;
+		}
+		else if (comdid == L"design")
+		{
+			xsedit xs = GetControl(L"rptcontent");
 			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"));
-
+			xs.GetContent(str);
+			if (str != L"" && str != content)
+			{
+				m_xdoc.LoadTemplate(str,0);
+				xs.LoadContent(L"",L".txt");
+			}
+			/*
+			xcontrol xs = GetControl(L"rptcontent1");
+			xstring str ;
+			xstring str = xs.GetText();
+			if(str !=L"" && str != content)
+			{
+				m_xdoc.LoadTemplate(str,0);
+				//xs.LoadContent(L"",L".txt");
+			}*/
 			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)
+	int OnXCommand(TEvent* evt,LPARAM 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);
+		AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditXOffice::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXOffice::OnSetFocus);
+
+		return 1;
+	}
+
+	/*
+	int  OnRetrieve()
+	{
+		xstring query=L"[xxx]";
+		xml x = new xml;
+		xaserverarg arg = new xaserverarg;
+		arg.AddArg(L"xxx",L"xxx");
+		if (xaserver::ExecXQuery(GetServerUrl(),query,arg.GetString(),x)!=1)
+		{
+			trace(x.GetXmlDoc().text);
+			return -1;
+		}else
+		{
+			dw_list.Retrieve(x);
+			dw_list.Redraw();
+		}
+		return 1;
+	}
+	*/
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+
+		m_xdoc = GetControl(L"rpt");
+		xstring content = GetData();
+		if (content != L"")
+		{
+			m_xdoc.LoadTemplate(content,0);
+		}
+		else
+		{
+			KXMLDOMElement pElement;
+			xml x ;
+			auto xdoc = x;
+			xdoc.loadXML(L"<root/>");
+			m_xdoc.LoadTemplate(x,0);
+		}
 
 		return 1;
 	}
 
 	int OnInitial()
 	{
+		SetAgent();
+
 		OnAttachEvent();
 
 		return 1;
@@ -549,12 +179,13 @@
 
 	int onload()
 	{
-		sheet_Count = -1;
-		OnInitial();
+		//dw_list = GetControl(L"dw_list");
+		//dw_list.SetDataObject(GetServerUrl(),L"dev:sheet[xxx.tpl/List]");
 
-		tv_folder = GetControl(L"DevExplorer");
-		mle_output = GetControl(L"output");
-		SetAgent(L"projects");
+		OnInitial();
+		LoadData();
+
+		//OnRetrieve();
 
 		return 1;
 	}
diff --git a/jrj/xframe/devloper/XDevEditXPage.cpp b/jrj/xframe/devloper/XDevEditXPage.cpp
index 0e63798..874d0f0 100644
--- a/jrj/xframe/devloper/XDevEditXPage.cpp
+++ b/jrj/xframe/devloper/XDevEditXPage.cpp
@@ -5,12 +5,13 @@
 #include <xcontrol/xtreeview.hpp>
 #include <xcontrol/xlayersheet.hpp>
 #include <xcontrol/xsedit.hpp>
+#include "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDevEditXPage : public xwin
+class export XDevEditXPage : public XDevEditPage
 {
 	public:
-	XDevEditXPage(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd){}
+	XDevEditXPage(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd){}
 public:
 	static XDevEditXPage* CreateInstance(void* implPtr, void* hWnd)
 	{
@@ -87,6 +88,8 @@
 		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditXPage::OnXCommand);
 		//获取焦点事件,用于重置工具条
 		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXPage::OnSetFocus);
+
+		return 1;
 	}
 
 	int LoadData()
diff --git a/jrj/xframe/devloper/XDevEditXQuery.cpp b/jrj/xframe/devloper/XDevEditXQuery.cpp
index 9d50fc8..634d674 100644
--- a/jrj/xframe/devloper/XDevEditXQuery.cpp
+++ b/jrj/xframe/devloper/XDevEditXQuery.cpp
@@ -7,12 +7,13 @@
 #include <xcontrol/xdwgrid.hpp>
 #include <xcontrol/xsedit.hpp>
 #include <xcontrol/xcombobox.hpp>
+#include "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDevEditXQuery : public xwin
+class export XDevEditXQuery : public XDevEditPage
 {
 	public:
-	XDevEditXQuery(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
+	XDevEditXQuery(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
 public:
 	static XDevEditXQuery* CreateInstance(void* implPtr, void* hWnd)
 	{
@@ -68,7 +69,7 @@
 			xstring v = e1.getAttribute(L"source");
 			xc.SetText(L"" + v);
 			xc = GetControl(L"linkname");
-			xstring v = e1.getAttribute(L"link");
+			v = e1.getAttribute(L"link");
 			xc.SetText(L"" + v);
 
 			KXMLDOMElement e2 = e.selectSingleNode(L"paras");
@@ -125,7 +126,7 @@
 		e.appendChild(e1);
 		root.documentElement().appendChild(e);
 
-		xml y ();
+		xml y;
 		dw_list.DwUpdateTo(y);
 		root.documentElement().appendChild(y.documentElement());
 		//trace(y.xml());
@@ -249,6 +250,8 @@
 	AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditXQuery::OnXCommand);
 	//获取焦点事件,用于重置工具条
 	AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXQuery::OnSetFocus);
+
+	return 1;
 }
 
 int OnInitial()
diff --git a/jrj/xframe/devloper/XDevEditXRuler.cpp b/jrj/xframe/devloper/XDevEditXRuler.cpp
index f26ab17..a62cce0 100644
--- a/jrj/xframe/devloper/XDevEditXRuler.cpp
+++ b/jrj/xframe/devloper/XDevEditXRuler.cpp
@@ -4,544 +4,149 @@
 #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 "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDeveloper : public xwin
+class export XDevEditXRuler : public XDevEditPage
 {
 	public:
-	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+	XDevEditXRuler(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
 public:
-	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	static XDevEditXRuler* CreateInstance(void* implPtr, void* hWnd)
 	{
-		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		XDevEditXRuler* pWin = new XDevEditXRuler(implPtr, (HWND)hWnd);
 		return pWin;
 	}
 private:	//
-	xtreeview tv_folder;
-	xcontrol mle_output;
-	int sheet_Count;
-public:
-	int trace(xstring msg)
+	//xdwgrid	dw_list;
+
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
 	{
-		xstring t = mle_output.GetText();
-		mle_output.SetText(t + msg);
+		/*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 OnProcessUrl(xstring kind, xstring url)
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
 	{
-		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());
+		SetAgent();
+
+		//重置工具条
 		return 1;
 	}
 
-	xstring ProcessDevCmd(xstring cmd, xstring ext)
+	int LoadData()
 	{
-		int nlen = 0;
-		BYTE* pdata=nullptr;
-		xaserver::ProcessCmd(GetServerUrl(),( L"uri.hxsoft.com/xaserver/developer " + cmd).c_str(), ext.c_str(), pdata, nlen);
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		if (content != L"")
+		{
+			xsedit xs = GetControl(L"xcontent");
+			xs.LoadContent(content,L".xml");
+		}
+		return 1;
+	}
 
-		xstring str = ((LPARAM)pdata) + L"";
+	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 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")
+		xstring content;
+		xsedit xs = GetControl(L"xcontent");
+		xs.GetContent(content);
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+		if (comdid == L"xmFileSave")
 		{
-			OpenWindow(L"dev:xpage[sqlWatch.vx]");
-			return 1;
+			//save xml content
+			SaveContent(content);
 		}
-		if (comdid == L"xmCheckUrl")
+		else if (comdid == L"xmValid")
 		{
-			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))
+			xml x ;
+			if (!x.loadXML(content))
 			{
-				hDomainItem = hItem;
-			}
-			else
-			{
-				hP2Item = GetP2Item(hItem);
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-			}
-
-			e = tv_folder.GetItemData(hItem);
-			if (hP2Item)
-			{
-				if (hP2Item != hItem)
+				KXMLDOMParseError pError = x.parseError();
+				if (pError)
 				{
-					xstring guid = e.getAttribute(L"guid");
-					arg.AddArg(L"parent.guid", guid);
+					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);
 				}
-				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")
+				else
 				{
-					if (arg.GetArgString(L"image") == L"")
-						arg.AddArg(L"image", L"15");
-					arg.AddArg(L"folder", L"folder");
-					arg.AddArg(L"type", L"folder");
+					trace(L"XML 错误");
 				}
+				return -1;
 			}
-			else
+			/*xstring sType = OnGetType();
+			if (sType == L"xml.xsd")
 			{
-				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;
+				xstring sError;
+				x.ValidSchema(content, &sError);
+				trace(sError);
+			}*/
 		}
-		else if (comdid == L"xmDeleteObject")
+		else if (comdid == L"xmEditFind")
 		{
-			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;
+			OpenWindow(L"dev:xpage[xcode.finddlg]");
 		}
-		else if (comdid == L"xmUpdateProject")
+		else if (comdid == L"xmEditReplace")
 		{
-			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;
+			OpenWindow(L"dev:xpage[xcode.replacedlg]");
 		}
-		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);
-				}
-
-			}
-
-		}
+		xutil::RestoreCursor(hCursor);
 		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)
+	int OnXCommand(TEvent* evt,LPARAM 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;
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditXRuler::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXRuler::OnSetFocus);
 	}
 
 	int OnInitial()
 	{
+		SetAgent();
+
 		OnAttachEvent();
 
 		return 1;
@@ -549,12 +154,8 @@
 
 	int onload()
 	{
-		sheet_Count = -1;
 		OnInitial();
-
-		tv_folder = GetControl(L"DevExplorer");
-		mle_output = GetControl(L"output");
-		SetAgent(L"projects");
+		LoadData();
 
 		return 1;
 	}
diff --git a/jrj/xframe/devloper/XDevEditXWKDlg.cpp b/jrj/xframe/devloper/XDevEditXWKDlg.cpp
index f26ab17..a62cce0 100644
--- a/jrj/xframe/devloper/XDevEditXWKDlg.cpp
+++ b/jrj/xframe/devloper/XDevEditXWKDlg.cpp
@@ -4,544 +4,149 @@
 #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 "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDeveloper : public xwin
+class export XDevEditXRuler : public XDevEditPage
 {
 	public:
-	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+	XDevEditXRuler(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
 public:
-	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	static XDevEditXRuler* CreateInstance(void* implPtr, void* hWnd)
 	{
-		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		XDevEditXRuler* pWin = new XDevEditXRuler(implPtr, (HWND)hWnd);
 		return pWin;
 	}
 private:	//
-	xtreeview tv_folder;
-	xcontrol mle_output;
-	int sheet_Count;
-public:
-	int trace(xstring msg)
+	//xdwgrid	dw_list;
+
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
 	{
-		xstring t = mle_output.GetText();
-		mle_output.SetText(t + msg);
+		/*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 OnProcessUrl(xstring kind, xstring url)
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
 	{
-		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());
+		SetAgent();
+
+		//重置工具条
 		return 1;
 	}
 
-	xstring ProcessDevCmd(xstring cmd, xstring ext)
+	int LoadData()
 	{
-		int nlen = 0;
-		BYTE* pdata=nullptr;
-		xaserver::ProcessCmd(GetServerUrl(),( L"uri.hxsoft.com/xaserver/developer " + cmd).c_str(), ext.c_str(), pdata, nlen);
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		if (content != L"")
+		{
+			xsedit xs = GetControl(L"xcontent");
+			xs.LoadContent(content,L".xml");
+		}
+		return 1;
+	}
 
-		xstring str = ((LPARAM)pdata) + L"";
+	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 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")
+		xstring content;
+		xsedit xs = GetControl(L"xcontent");
+		xs.GetContent(content);
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+		if (comdid == L"xmFileSave")
 		{
-			OpenWindow(L"dev:xpage[sqlWatch.vx]");
-			return 1;
+			//save xml content
+			SaveContent(content);
 		}
-		if (comdid == L"xmCheckUrl")
+		else if (comdid == L"xmValid")
 		{
-			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))
+			xml x ;
+			if (!x.loadXML(content))
 			{
-				hDomainItem = hItem;
-			}
-			else
-			{
-				hP2Item = GetP2Item(hItem);
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-			}
-
-			e = tv_folder.GetItemData(hItem);
-			if (hP2Item)
-			{
-				if (hP2Item != hItem)
+				KXMLDOMParseError pError = x.parseError();
+				if (pError)
 				{
-					xstring guid = e.getAttribute(L"guid");
-					arg.AddArg(L"parent.guid", guid);
+					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);
 				}
-				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")
+				else
 				{
-					if (arg.GetArgString(L"image") == L"")
-						arg.AddArg(L"image", L"15");
-					arg.AddArg(L"folder", L"folder");
-					arg.AddArg(L"type", L"folder");
+					trace(L"XML 错误");
 				}
+				return -1;
 			}
-			else
+			/*xstring sType = OnGetType();
+			if (sType == L"xml.xsd")
 			{
-				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;
+				xstring sError;
+				x.ValidSchema(content, &sError);
+				trace(sError);
+			}*/
 		}
-		else if (comdid == L"xmDeleteObject")
+		else if (comdid == L"xmEditFind")
 		{
-			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;
+			OpenWindow(L"dev:xpage[xcode.finddlg]");
 		}
-		else if (comdid == L"xmUpdateProject")
+		else if (comdid == L"xmEditReplace")
 		{
-			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;
+			OpenWindow(L"dev:xpage[xcode.replacedlg]");
 		}
-		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);
-				}
-
-			}
-
-		}
+		xutil::RestoreCursor(hCursor);
 		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)
+	int OnXCommand(TEvent* evt,LPARAM 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;
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditXRuler::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXRuler::OnSetFocus);
 	}
 
 	int OnInitial()
 	{
+		SetAgent();
+
 		OnAttachEvent();
 
 		return 1;
@@ -549,12 +154,8 @@
 
 	int onload()
 	{
-		sheet_Count = -1;
 		OnInitial();
-
-		tv_folder = GetControl(L"DevExplorer");
-		mle_output = GetControl(L"output");
-		SetAgent(L"projects");
+		LoadData();
 
 		return 1;
 	}
diff --git a/jrj/xframe/devloper/XDevEditXWorkNode.cpp b/jrj/xframe/devloper/XDevEditXWorkNode.cpp
index f26ab17..a62cce0 100644
--- a/jrj/xframe/devloper/XDevEditXWorkNode.cpp
+++ b/jrj/xframe/devloper/XDevEditXWorkNode.cpp
@@ -4,544 +4,149 @@
 #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 "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDeveloper : public xwin
+class export XDevEditXRuler : public XDevEditPage
 {
 	public:
-	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+	XDevEditXRuler(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {}
 public:
-	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	static XDevEditXRuler* CreateInstance(void* implPtr, void* hWnd)
 	{
-		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		XDevEditXRuler* pWin = new XDevEditXRuler(implPtr, (HWND)hWnd);
 		return pWin;
 	}
 private:	//
-	xtreeview tv_folder;
-	xcontrol mle_output;
-	int sheet_Count;
-public:
-	int trace(xstring msg)
+	//xdwgrid	dw_list;
+
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
 	{
-		xstring t = mle_output.GetText();
-		mle_output.SetText(t + msg);
+		/*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 OnProcessUrl(xstring kind, xstring url)
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
 	{
-		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());
+		SetAgent();
+
+		//重置工具条
 		return 1;
 	}
 
-	xstring ProcessDevCmd(xstring cmd, xstring ext)
+	int LoadData()
 	{
-		int nlen = 0;
-		BYTE* pdata=nullptr;
-		xaserver::ProcessCmd(GetServerUrl(),( L"uri.hxsoft.com/xaserver/developer " + cmd).c_str(), ext.c_str(), pdata, nlen);
+		if (!GetWinParam()) return 1;
+		xstring content = GetData();
+		if (content != L"")
+		{
+			xsedit xs = GetControl(L"xcontent");
+			xs.LoadContent(content,L".xml");
+		}
+		return 1;
+	}
 
-		xstring str = ((LPARAM)pdata) + L"";
+	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 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")
+		xstring content;
+		xsedit xs = GetControl(L"xcontent");
+		xs.GetContent(content);
+
+		HCURSOR hCursor = xutil::SetCursorWait();
+		if (comdid == L"xmFileSave")
 		{
-			OpenWindow(L"dev:xpage[sqlWatch.vx]");
-			return 1;
+			//save xml content
+			SaveContent(content);
 		}
-		if (comdid == L"xmCheckUrl")
+		else if (comdid == L"xmValid")
 		{
-			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))
+			xml x ;
+			if (!x.loadXML(content))
 			{
-				hDomainItem = hItem;
-			}
-			else
-			{
-				hP2Item = GetP2Item(hItem);
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-			}
-
-			e = tv_folder.GetItemData(hItem);
-			if (hP2Item)
-			{
-				if (hP2Item != hItem)
+				KXMLDOMParseError pError = x.parseError();
+				if (pError)
 				{
-					xstring guid = e.getAttribute(L"guid");
-					arg.AddArg(L"parent.guid", guid);
+					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);
 				}
-				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")
+				else
 				{
-					if (arg.GetArgString(L"image") == L"")
-						arg.AddArg(L"image", L"15");
-					arg.AddArg(L"folder", L"folder");
-					arg.AddArg(L"type", L"folder");
+					trace(L"XML 错误");
 				}
+				return -1;
 			}
-			else
+			/*xstring sType = OnGetType();
+			if (sType == L"xml.xsd")
 			{
-				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;
+				xstring sError;
+				x.ValidSchema(content, &sError);
+				trace(sError);
+			}*/
 		}
-		else if (comdid == L"xmDeleteObject")
+		else if (comdid == L"xmEditFind")
 		{
-			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;
+			OpenWindow(L"dev:xpage[xcode.finddlg]");
 		}
-		else if (comdid == L"xmUpdateProject")
+		else if (comdid == L"xmEditReplace")
 		{
-			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;
+			OpenWindow(L"dev:xpage[xcode.replacedlg]");
 		}
-		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);
-				}
-
-			}
-
-		}
+		xutil::RestoreCursor(hCursor);
 		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)
+	int OnXCommand(TEvent* evt,LPARAM 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;
+		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDevEditXRuler::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXRuler::OnSetFocus);
 	}
 
 	int OnInitial()
 	{
+		SetAgent();
+
 		OnAttachEvent();
 
 		return 1;
@@ -549,12 +154,8 @@
 
 	int onload()
 	{
-		sheet_Count = -1;
 		OnInitial();
-
-		tv_folder = GetControl(L"DevExplorer");
-		mle_output = GetControl(L"output");
-		SetAgent(L"projects");
+		LoadData();
 
 		return 1;
 	}
diff --git a/jrj/xframe/kobject/kutil.hpp b/jrj/xframe/kobject/kutil.hpp
index 3dfc512..7df58f2 100644
--- a/jrj/xframe/kobject/kutil.hpp
+++ b/jrj/xframe/kobject/kutil.hpp
@@ -30,4 +30,9 @@
 
 namespace Hxsoft { namespace XUtil{
 	LPTSTR FormatDecimalString(LPTSTR  str, LPTSTR format, bool& bfree);
+	LPTSTR ToXmlTextAndStartSpace(LPCTSTR str);
+	LPTSTR ToHtmlTextAndStartSpace(LPCTSTR str);
+	LPTSTR ToXmlText(LPCTSTR str);
+	LPTSTR ToHtmlText(LPCTSTR str);
+	LPTSTR UnXMLText(LPCTSTR str);
 }}
\ No newline at end of file
diff --git a/jrj/xframe/wobject/xutil.hpp b/jrj/xframe/wobject/xutil.hpp
index 5a702e7..7d2a7ad 100644
--- a/jrj/xframe/wobject/xutil.hpp
+++ b/jrj/xframe/wobject/xutil.hpp
@@ -58,6 +58,34 @@
         return Hxsoft::XUtil::FormatDecimalString(str, format, bfree);
     }
 
+    static  xstring ToXmlTextAndStartSpace(xstring str)
+    {
+        wchar_t* xmlStr = Hxsoft::XUtil::ToXmlTextAndStartSpace(str.c_str());
+        return xmlStr ? xmlStr : str;
+    }
+
+    static  xstring ToHtmlTextAndStartSpace(xstring str)
+    {
+        wchar_t* htmlStr = Hxsoft::XUtil::ToHtmlTextAndStartSpace(str.c_str());
+        return htmlStr ? htmlStr : str;
+    }
+
+    static  xstring ToXmlText(xstring str)
+    {
+        wchar_t* xmlStr = Hxsoft::XUtil::ToXmlText(str.c_str());
+        return xmlStr? xmlStr : str;
+    }
+    static  xstring ToHtmlText(xstring str)
+    {
+        wchar_t* htmlStr = Hxsoft::XUtil::ToHtmlText(str.c_str());
+        return htmlStr? htmlStr : str;
+    }
+    static  xstring UnXMLText(xstring str)
+    {
+        wchar_t* xmlStr = Hxsoft::XUtil::UnXMLText(str.c_str());
+        return xmlStr? xmlStr:str;
+    }
+
 public:
     static xstring GetModulePath()
     {
diff --git a/jrj/xframe/xcontrol/xcell.hpp b/jrj/xframe/xcontrol/xcell.hpp
index 92911c7..f3dd1e9 100644
--- a/jrj/xframe/xcontrol/xcell.hpp
+++ b/jrj/xframe/xcontrol/xcell.hpp
@@ -3,6 +3,7 @@
 #include "wobject/xcontrol.hpp"
 #include "kobject/kcell.hpp"
 #include "wobject/xurl.hpp"
+#include "wobject/xutil.hpp"
 
 using kcell = Hxsoft::XFrame::XOffice::XCell::IXCell;
 class xcell : public xcontrol
@@ -300,6 +301,11 @@
 	{
 		return GetKCell()->SetFixedCols(value);
 	}
+
+	xstring GetItemXmlString(int ARow, int ACol) 
+	{
+		return xutil::ToXmlText(GetKCell()->GetItemString(ARow, ACol));
+	}
 };
 
 
diff --git a/jrj/xframe/xcontrol/xdwgrid.hpp b/jrj/xframe/xcontrol/xdwgrid.hpp
index f2c0d3b..16c97b0 100644
--- a/jrj/xframe/xcontrol/xdwgrid.hpp
+++ b/jrj/xframe/xcontrol/xdwgrid.hpp
@@ -572,6 +572,24 @@
 		DwRetrieve(ServerUrl, src, arg.GetString());
 		return 1;
 	}
+
+	xstring GetItemDisplayXmlString(int nRow, int nColumn, kdwgrid::DWBuffer dwBuffer = kdwgrid::dbuf_normal)
+	{
+		return xutil::ToXmlText(getKReport()->GetItemDisplayString(nRow, nColumn, dwBuffer));
+	}
+	xstring GetItemDisplayXmlString(int nRow, xstring ColumnName, kdwgrid::DWBuffer dwBuffer = kdwgrid::dbuf_normal)
+	{
+		return xutil::ToXmlText(getKReport()->GetItemDisplayString(nRow, ColumnName.c_str(), dwBuffer));
+	}
+	xstring GetItemXmlString(int nRow, int nColumn, kdwgrid::DWBuffer dwBuffer = kdwgrid::dbuf_normal)
+	{
+		return xutil::ToXmlText(getKReport()->GetItemString_(nRow, nColumn, dwBuffer));
+	}
+	xstring GetItemXmlString(int nRow, xstring ColumnName, kdwgrid::DWBuffer dwBuffer = kdwgrid::dbuf_normal)
+	{
+		return xutil::ToXmlText(getKReport()->GetItemString_(nRow, ColumnName.c_str(), dwBuffer));
+	}
+
 };
 
 
diff --git a/jrj/xframe/xcontrol/xdwtable.hpp b/jrj/xframe/xcontrol/xdwtable.hpp
index 78c4ca5..d28d1ce 100644
--- a/jrj/xframe/xcontrol/xdwtable.hpp
+++ b/jrj/xframe/xcontrol/xdwtable.hpp
@@ -559,6 +559,13 @@
 		return 0;
 	}
 
+	xstring GetItemXmlString(int nRow, int nColumn, kdwtable::DWBuffer dwBuffer = kdwtable::dbuf_normal) { 
+		return xutil::ToXmlText(GetDwTable()->GetItemString_(nRow, nColumn, dwBuffer));
+	}
+	xstring GetItemXmlString(int nRow, LPCTSTR ColumnName, kdwtable::DWBuffer dwBuffer = kdwtable::dbuf_normal) { 
+		return xutil::ToXmlText(GetDwTable()->GetItemString_(nRow, ColumnName, dwBuffer));
+	}
+
 };
 
 

--
Gitblit v1.9.3