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/XDevEditXMSSQL.cpp |  981 ++++++++++++++++++++++++++++++---------------------------
 1 files changed, 513 insertions(+), 468 deletions(-)

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

--
Gitblit v1.9.3