#include #include #include #include #include #include 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(sheetnotify.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; } };