From b1d01ea6fa62ce12c2e592b3315186f6b3c8359d Mon Sep 17 00:00:00 2001
From: xj qian <qianxj15@sina.com>
Date: 星期三, 17 七月 2024 15:20:38 +0800
Subject: [PATCH] Merge branch 'master' of http://116.62.18.175:6699/r/mis-prj

---
 jrj/project/business/SystemSettings/Developer.Synch.cpp |  432 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 432 insertions(+), 0 deletions(-)

diff --git a/jrj/project/business/SystemSettings/Developer.Synch.cpp b/jrj/project/business/SystemSettings/Developer.Synch.cpp
new file mode 100644
index 0000000..8789e6e
--- /dev/null
+++ b/jrj/project/business/SystemSettings/Developer.Synch.cpp
@@ -0,0 +1,432 @@
+#include <wobject/xstring.hpp>
+#include <xcontrol/xtreeview.hpp>
+#include <xcontrol/xdwgrid.hpp>
+#include <wobject/xdouble.hpp>
+#include <xcontrol/xlayersheet.hpp>
+#include <xcontrol/xdatetimepick.hpp>
+
+
+#include "vbusiness/vframe/listwin.vframe.vbusiness.hpp"
+#include "viewobject/view.base.hpp"
+
+using xml = KXMLDOMDocument;
+	class  __declspec(dllexport) DeveloperSynch :  public xframe
+	{
+	public:
+		xtreeview	tv_gs;
+		xsedit dw_log;
+	
+		int nItems;
+		int nCount;
+	
+		xstring sContent;
+	public:
+		DeveloperSynch(void* implPtr, HWND hWnd) :xframe(implPtr, hWnd) {}
+	public:
+		static DeveloperSynch* CreateInstance(void* implPtr, void* hWnd)
+		{
+			DeveloperSynch* pWin = new DeveloperSynch(implPtr, (HWND)hWnd);
+			return pWin;
+		}
+		xstring ProcessDevCmd(xstring cmd,xstring ext, xstring aurl=L"", bool needlogin=false)
+		{
+			if(aurl == L"") aurl = GetServerUrl();
+			//alert(aurl);
+			xstring d = xaserver::ProcessCmd(aurl,L"uri.hxsoft.com/xaserver/developer "+cmd,ext,needlogin);
+			return d;
+		}
+	
+		xstring ProcessDevCmd2(xstring cmd,xstring ext, xstring aurl=L"", bool needlogin=false)
+		{
+			if(aurl == L"") aurl = GetServerUrl();
+			//alert(aurl);
+			xstring d = xaserver::ProcessCmd(aurl,L"uri.hxsoft.com/xaserver/dev:"+cmd,ext,needlogin);
+			return d;
+		}
+
+		int GetProjectItem(int hItem)
+		{
+			int pitem = hItem;
+			xstring typ;
+			while(true)
+			{
+				int h =tv_gs.GetItemData(tv_gs.GetId(), pitem);
+				KXMLDOMElement e = trust(h as KXMLDOMElement);
+				typ = GetEleString(e, L"@tagname");
+				if(typ==L"project")break;
+				pitem =tv_gs.GetParentItem(tv_gs.GetId(), pitem);
+				if(pitem<=0)break;
+			}
+			return pitem;
+		}
+		
+		int GetP2Item(int hItem)
+		{
+			int hDomainItem;
+			int hP2Item = hItem;
+			while(true)
+			{
+				hDomainItem =tv_gs.GetParentItem(tv_gs.GetId(), hP2Item);
+				if(xtreeview::GetParentItem(tv_gs.GetId(), hDomainItem)<=0)break;
+				hP2Item = hDomainItem;
+			}
+			return hP2Item;
+		}
+			
+		xstring GetItemGuid(int hItem)
+		{
+			int h =tv_gs.GetItemData(tv_gs.GetId(), hItem);
+			KXMLDOMElement e = trust(h as KXMLDOMElement);
+			xstring guid = e.GetAttribute(L"guid");
+			return guid;
+		}
+			
+		xaserverarg GetDataArg(int hItem, xaserverarg arg)
+		{
+			int h =tv_gs.GetItemData(tv_gs.GetId(), hItem);
+			KXMLDOMElement e = trust(h as KXMLDOMElement);
+			xstring node = GetEleString(e, L"@tagname");
+			//WriteLog(e.xml);
+			if(node==L"File" || node==L"file")
+			{
+				xstring caption = e.getAttribute(L"caption");
+				
+				int hP2Item = 0;
+				int hDomainItem = 0;
+				if(xtreeview::GetParentItem(tv_gs.GetId(), hItem)<=0)
+				{
+					hDomainItem = hItem;
+				}else
+				{
+					hP2Item = GetP2Item(hItem);
+					hDomainItem =tv_gs.GetParentItem(tv_gs.GetId(), hP2Item);
+				}	
+
+				//find project folder
+				xstring prjguid=L"";
+				int pitem = GetProjectItem(hItem);
+				if(pitem > 0)
+					prjguid = GetItemGuid(pitem);
+
+				//xaserverarg arg ;
+				//;
+				arg.AddArg(L"project.guid",prjguid);
+				if(hP2Item)
+				{
+					if(hP2Item != hItem)
+					{
+						xstring guid = e.getAttribute(L"guid");
+						arg.AddArg(L"guid",guid);
+					}
+					xstring guid2 = GetItemGuid(hP2Item);
+					arg.AddArg(L"root.guid",guid2);
+				}else if(hDomainItem > 0)
+				{
+					xstring guid3 = GetItemGuid(hDomainItem);
+					arg.AddArg(L"domain.guid",guid3);
+				}
+				return 1;
+			}
+			else if(node==L"folder" || node==L"project")
+				return 2;
+			else
+				return 0;			
+		}
+
+		int SaveData(int hItem)
+		{
+			xcontrol xc = GetControl(L"surl");
+			xstring surl = xc.GetText();
+			if(surl == L"")
+			{
+				alert(L"请输入同步服务器地址");
+				return 1;
+			}
+			
+			xstring name =tv_gs.GetItemLabel(hItem);
+			xaserverarg arg ;
+			;
+			int ret = GetDataArg(hItem, arg);
+			//alert(arg.GetString());
+			if(ret == 0) 
+			{
+				WriteLog(name+L" 失败, 原因:获取工程或文件夹失败!");
+				return -1;
+			}
+			else if(ret == 2) 
+			{
+				ret = SynchFolder(hItem);
+				if(ret == -1)
+					WriteLog(name+L" 失败, 原因:获取文件数据失败!");
+				else if(ret == 0)
+					WriteLog(name+L" 失败, 原因:复制文件失败!");
+				else
+					WriteLog(name);
+				return -1;
+			}
+			SynchFolder(hItem);
+			arg.AddArg(L"__name",name);
+			arg.AddArg(L"__url",surl);
+			synchServer(arg);
+			if(name.right(3) == L".vx" || name.right(5) == L".xpage")
+			{
+				arg.AddArg(L"__name",name + L"[Code]");
+				arg.AddArg(L"iscode",L"yes");
+				synchServer(arg);
+			}
+			return 1;
+		}
+			
+		xstring GetFolderPath(int hItem)
+		{
+			int k = hItem;
+			if(k == 0) return L"";
+			xstring src = L"";
+			//xstring name = L"";
+			while(k > 0)
+			{
+				int h =tv_gs.GetItemData(tv_gs.GetId(), k);
+				k =tv_gs.GetParentItem(tv_gs.GetId(), k);
+				KXMLDOMElement e = trust(h as KXMLDOMElement);
+				xstring node = GetEleString(e, L"@tagname");
+				if(node != L"File" && node != L"file")
+				{
+					xstring tmp = GetEleString(e, L"@src");
+					//if(name == L"") name = GetEleString(e, L"@caption");
+					if(tmp != L"")
+					{
+						SynchFolder(k);
+						if(src == L"") src = tmp;
+						else
+						{
+							int j = 1;
+							int s =  tmp.length()();
+							xstring t = tmp.right(j).left(1);
+							while(t != L"\\" && j < s)
+							{
+								//WriteLog(t);
+								j++;
+								t = tmp.right(j).left(1);
+							}
+							if(j >= s)
+								src = tmp+ L"\\" + src; 
+							else
+								src = tmp.left(s - j)+ L"\\" + src;
+						}
+					}
+				}
+			}
+			if(src == L"")
+			{
+				//WriteLog(name+L" 同步失败, 原因:获取文件数据失败0!");
+				return L"";
+			}
+			//if(src.left(9) ==L"Projects\\") src = src.mid(9, src.length()());
+			src = L"\\" + src;//.replace(L"Projects\\",L"");
+			//WriteLog(src);
+			return src;
+		}
+			
+		int SynchFolder(int hItem)
+		{
+			xstring src =  GetFolderPath(hItem);
+			if(src== L"") return -1;
+			if(xaserver::FileCopy(L"devfolder8001", src, L"devfolder5001", src) != 1)
+				return 0;
+			//WriteLog(src);
+			return 1;
+		}
+			
+		int synchServer(xaserverarg arg)
+		{
+			xstring name = arg.GetArgString(L"__name");
+			xstring surl = arg.GetArgString(L"__url");
+			xstring d =  ProcessDevCmd(L"getobject",arg.GetString());
+			if(d == L"") 
+			{
+				WriteLog(name+L" 失败, 原因:获取文件数据失败!");
+				return -1;
+			}
+			//WriteLog(d);
+			arg.AddArg(L"content",d);
+			ProcessDevCmd(L"saveobject",arg.GetString(), surl,true);
+			WriteLog(name);
+			return 1;
+		}
+			
+		int WriteLog(xstring str)
+		{
+			if(sContent == L"")
+				sContent = str;
+			else
+				sContent += L"\r\n" + str;
+			//alert(sContent);
+			dw_log.SetContent(sContent, L"");
+			return 1;
+		}
+	
+		//焦点激活处理函数
+		int OnSetFocus(TEvent* evt, LPARAM param)
+		{
+			//重置工具条
+			SetAgent();
+			return 1;
+		}
+	
+		int Add(int hItem)
+		{	
+			if(nCount >99)
+			{
+				alert(L"同时同步的数量不能大于100个!");
+				return 1;
+			}
+			nItems[nCount] = hItem; 
+			nCount++;
+			return 1;
+		}
+			
+		int Del(int hItem)
+		{	
+			for(int i=0; i<nCount; i++)
+			{
+				int p = nItems[i];
+				if(p == hItem) break;
+			}
+			if(i<nCount)
+			{
+				for(int j=i; j<nCount - 1; j++)
+				{
+					int k = nItems[j + 1];
+					nItems[j] = k;
+				}
+				nCount --;
+			}
+			return 1;
+		}
+
+		//命令发布函数
+		int OnCmdDispatch(xstring comdid)
+		{
+			if(comdid != L"synch") return 1;
+			
+			HCURSOR hCursor = xutil::SetCursorWait();
+			sContent = L"";
+			for(int i=0; i<nCount; i++)
+			{
+				int p = nItems[i];
+				//int h =tv_gs.GetItemData(tv_gs.GetId(), p);
+				//KXMLDOMElement e = trust(h as KXMLDOMElement);
+				//alert(e.xml);
+				SaveData(p);
+				xtreeview::SetChecked(tv_gs.GetId(), p,0);
+			}
+			xutil::RestoreCursor(hCursor);
+			nCount = 0;
+			return 0;
+		}
+	
+		int OnTreeCheckBoxSel(TEvent* evt, LPARAM p)
+		{
+			TVNNMHDR* nmtv = (TVNNMHDR*)evt->notify.pnmh;
+
+			int hItem = nmtv.FromItem;
+
+			HCURSOR hCursor = xutil::SetCursorWait();
+			int hwnd = nmtv.hwndFrom;
+
+			int c = 1 -tv_gs.GetChecked(hwnd, hItem);
+			if(c == 1)
+				Add(hItem);
+			else
+				Del(hItem);
+			xutil::RestoreCursor(hCursor);
+			return 1;
+		}	
+		
+		//命令处理事件
+		int OnXCommand(TEvent* evt, LPARAM param)
+		{
+			return OnCmdDispatch(evt->xcommand.pStrID);
+		}
+		
+		int OnAttachEvent()
+		{
+			//绑定工具条点击事件
+			AttachEvent(L"WM_XCOMMAND", (FEvent)&DeveloperSynch::OnXCommand);
+			//获取焦点事件,用于重置工具条
+			//AttachEvent(L"WM_SETFOCUS",OnSetFocus);
+			AttachEvent(L"DevExplorer",L"TVN_CHECKBOXSEL", (FEvent)&DeveloperSynch::OnTreeCheckBoxSel);
+			AttachEvent(L"DevExplorer", L"TVN_ITEMEXPANDING", (FEvent)&DeveloperSynch::OnTreeExpanding);
+			return 1;
+		}
+		
+		int OnTreeExpanding(TEvent* evt, LPARAM lparam)
+		{
+			TVNNMHDR* nmtv = (TVNNMHDR*)evt->notify.pnmh;
+			int hItem = nmtv.itemNew.hItem;
+			int cItem=xtreeview::GetChildItem(tv_gs.GetId(), hItem);
+			if(cItem > 0) return 1;
+			int p =tv_gs.GetItemData(tv_gs.GetId(), hItem);
+			KXMLDOMElement ele = trust(p as KXMLDOMElement);
+			xstring src =GetEleString(ele, L"@src");
+			xstring tagname =GetEleString(ele, L"@tagname");
+			if (src == L"" || tagname == L"file" || tagname == L"File") return 1;
+			OnSetTree(hItem, GetFolderPath(hItem));
+			
+			return 1;
+		}		
+			
+		int OnSetTree(int pItem, KXMLDOMElement e)
+		{
+			KXMLDOMNodeList li=e.selectNodes(L"*");
+			int i=0;
+			int s=li.length();
+			for (i=0;i<s;i++){
+				KXMLDOMElement  ele= li.item(s - i - 1);
+				xstring caption = GetEleString(ele, L"@caption");
+				xstring src =GetEleString(ele, L"@src");
+				xstring image =GetEleString(ele, L"@image");
+				int p = trust(ele as int);
+				int hItem=xtreeview::InsertItem(tv_gs.GetId(), pItem,0,caption,p,image.toInt());
+				xstring tagname =GetEleString(ele, L"@tagname");
+				if (src != L"" && tagname != L"file" && tagname != L"File")
+					xtreeview::SetItemChild1(tv_gs.GetId(), hItem,1);
+				OnSetTree(hItem, ele);
+			}
+		
+			return 1;
+		}
+			
+		int OnSetTree(int hItem, xstring src)
+		{
+			xml x=new xml;
+			
+			xaserverarg arg;
+			;	
+			arg.AddArg(L"src",src);
+			if(xaserver::ExecXQuery(GetServerUrl(),L"[Developer.Tree.xq]",arg.GetString(),x)!=1)
+			{
+				alert(L"读取节点失败!");
+				return 1;
+			}
+			KXMLDOMElement e = x.documentElement();
+			OnSetTree(hItem, e);
+			return 1;
+		}
+		
+		int onload()
+		{
+			nCount = 0;
+			tv_gs = GetControl(L"DevExplorer");			
+			dw_log = GetControl(L"xlog");
+			OnAttachEvent();	
+			
+			return 1;
+		}
+		
+		int onloaded()
+		{
+			OnSetTree(0, L"Projects/projects.xhw");
+			return 1;
+		}		
+	};
\ No newline at end of file

--
Gitblit v1.9.3