#include #include #include #include #include #include #include #include #include #include #include "XDevEditPage.hpp" using xml = KXMLDOMDocument; class export XDevEditXFile : public XDevEditPage { public: XDevEditXFile(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {} public: static XDevEditXFile* CreateInstance(void* implPtr, void* hWnd) { XDevEditXFile* pWin = new XDevEditXFile(implPtr, (HWND)hWnd); return pWin; } private: // xreport xp; xnode m_agentNode; //Agent Condition xstring m_agentCond; //Agent Node public: 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 = SetAgentNodeContent (anode,s); } */ return 1; } //½¹µã¼¤»î´¦Àíº¯Êý int OnSetFocus(TEvent* evt,LPARAM param) { SetAgent(); //ÖØÖù¤¾ßÌõ return 1; } 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; } KXMLDOMElement OnRetrieve(KXMLDOMElement ele) { xml doc; doc.loadXML(L""); auto docroot = doc.documentElement(); auto list = ele.selectNodes(L"*"); int i; int s = list.length(); for (i = 0; i < s; i++) { KXMLDOMElement e = list.item(i); xstring name = e.getAttribute(L"name"); xstring id = e.getAttribute(L"id"); xstring sechma = e.getAttribute(L"sechma"); xstring et = e.getAttribute(L"et"); xml x; x.loadXML(L""); auto root = x.documentElement(); root.setAttribute(L"colname",id); root.setAttribute(L"name",name); root.setAttribute(L"type",sechma); root.setAttribute(L"note",et); if (e.hasChildNodes()) { KXMLDOMElement e1 = OnRetrieve(e); KXMLDOMNodeList e2 = e1.selectNodes(L"item"); int k; int l = e2.length(); for (k = 0; k < l; k++) root.appendChild(e2.item(k)); } docroot.appendChild(root); } return docroot; } //ÃüÁî·¢²¼º¯Êý int OnCmdDispatch(xstring comdid) { xsedit xs = GetControl(L"xcontent"); xstring content; xs.GetContent(content); HCURSOR hCursor = xutil::SetCursorWait(); if (comdid == L"xmFileSave") { //save xml content SaveContent(content); } else if (comdid == L"xmTable") { xml x; xaserverarg arg; arg.AddArg(L"content",content); if (xaserver::ExecXQuery(GetServerUrl(),L"[GenTableSchema.xq]",arg.GetString(),x) != 1) { return 1; } //trace(x.text); xsedit xs1 = GetControl(L"gncontent"); xs1.LoadContent(x.xml(),L".sql"); } else if (comdid == L"xmDDL") { xml x; xaserverarg arg; arg.AddArg(L"content",content); if (xaserver::ExecXQuery(GetServerUrl(),L"[GenDLLBySchema.xq]",arg.GetString(),x) != 1) { return 1; } xsedit xs1 = GetControl(L"gncontent"); xs1.LoadContent(x.xml(),L".sql"); //trace(x.text); } else if (comdid == L"xmDbmap") { xml x; xaserverarg arg; arg.AddArg(L"content",content); if (xaserver::ExecXQuery(GetServerUrl(),L"[GenDbmapBySchema.xq]",arg.GetString(),x) != 1) { return 1; } xsedit xs1 = GetControl(L"gncontent"); xs1.LoadContent(x.xml(),L".xml"); //trace(x.xml()); } else if (comdid == L"xmValid") { if (L"" + content == L"") return 0; xml x; if (!x.loadXML(content)) { KXMLDOMParseError pError = x.parseError(); if (pError) { xstring str = pError.srcText(); xstring sError = L"\r\nXMLaa´íÎó: " + 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); } else { trace(L"XML ´íÎó"); } return -1; } xstring sType = OnGetType(); if (sType == L"xml.xsd") { BSTR sError= nullptr; x.ValidSchema((const wchar_t* )content.c_str(), sError); trace(sError); } } else if (comdid == L"xview") { if (L"" + content == L"") return 0; if (OnCmdDispatch(L"xmValid") != -1) { xml x; if (x.loadXML(content)) { xp.Reset(); /* xp.ResetEx(); while(xp.GetRowCount() > 0) xp.DeleteRow(1); */ xp.Redraw(); xstring sType = OnGetType(); if (sType == L"iface") { auto e = x.selectSingleNode(L"interface"); if (e) { KXMLDOMElement ele = OnRetrieve(e); xp.Retrieve(ele); } } else if (sType == L"xml.xsd") { xml doc; x.GetSchemaXml((LPTSTR)content.c_str(), doc); //trace(doc.xml()); auto e = doc.selectSingleNode(L"root/schema"); if (e) { xp.Retrieve(e); } } xp.CreateTree(L"node()", 1, 15, 16); xp.Redraw(); } } } xutil::RestoreCursor(hCursor); return 0; } //ÃüÁî´¦Àíʼþ int OnXCommand(TEvent* evt,int param) { return OnCmdDispatch(evt->xcommand.pStrID); } xstring GetXSD(xstring name) { xwin w = GetFrameWindow(); xtreeview tv_folder = w.GetControl(L"DevExplorer"); HTREEITEM hItem = (HTREEITEM)GetWinParam(); 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(tv_folder,hItem); hDomainItem = tv_folder.GetParentItem(hP2Item); } //find project folder xstring prjguid = L""; HTREEITEM pitem = GetProjectItem(tv_folder,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) { auto f = e.selectSingleNode(L"//*[@uri='" + name + L"']"); if (f) { xstring guid = f.selectSingleNode(L"@guid").text();//.getAttribute(L"guid"); if (guid == L"") return L""; arg.AddArg(L"guid",guid); } else return L""; } 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); } return ProcessDevCmd(L"getobject",arg.GetString()); } else return L""; } int OnDoubleClicked(TEvent* evt,LPARAM param) { DWNMHDR& hdr = *(DWNMHDR*)evt->notify.pnmh; int row = hdr.row; KXMLDOMElement e = xp.GetRowElement(row); xstring filename = e.getAttribute(L"type"); if (filename.right(4) == L".xsd") { xstring xsd = GetXSD(L"" + filename); xml x; x.GetSchemaXml((LPTSTR)xsd.c_str(), x); trace(x.xml()); /* xml x = new xml; xaserver::FetchXml(GetServerUrl(),L"dev:xpage[XDevEdit.xml]",L"",x); auto n = x.selectSingleNode(L"//editor[@filetype='xml.xsd']/@xpage"); if(n) { xstring xpage = n.text; xwin w = GetFrameWindow(); xlayersheet layer = w.GetControl(L"mdilayer"); int i = 0; int nIndex = layer.GetSheetCount(); for(i=0;i