xj qian
2024-12-05 bd09edf1b441dcc6ab098f277bea86a72c009879
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;
   }