#include #include #include #include #include #include #include #include #include #include #include "XDevEditPage.hpp" using xml = KXMLDOMDocument; class export XDevEditXMSSQL : public XDevEditPage { public: XDevEditXMSSQL(void* implPtr, HWND hWnd) :XDevEditPage(implPtr, hWnd) {} public: static XDevEditXMSSQL* CreateInstance(void* implPtr, void* hWnd) { XDevEditXMSSQL* pWin = new XDevEditXMSSQL(implPtr, (HWND)hWnd); return pWin; } private: // xtreeview tv_db; xlayersheet list; //xnode m_agentNode; //Agent Condition //xstring m_agentCond; //Agent Node public: int SetAgent() { /* 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 OnSetFocus(TEvent* evt,LPARAM param) { SetAgent(); //ÖØÖù¤¾ßÌõ return 1; } xstring getLink(HTREEITEM item) { HTREEITEM p = tv_db.GetParentItem(item); while (tv_db.GetParentItem(p)) { item = tv_db.GetParentItem(item); p = tv_db.GetParentItem(item); } 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) { trace(x.xml()); return 1; } 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; 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; } 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()) 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"±í",(LPARAM)L"table",22); tv_db.SetItemChild1(j,1); j = tv_db.InsertChildItem(k,L"ÊÓͼ", (LPARAM)L"view",23); tv_db.SetItemChild1(j,1); j = tv_db.InsertChildItem(k,L"´æ´¢¹ý³Ì", (LPARAM)L"procedure",24); tv_db.SetItemChild1(j,1); j = tv_db.InsertChildItem(k,L"×Ô¶¨Ò庯Êý", (LPARAM)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; } //ÃüÁî·¢²¼º¯Êý int OnCmdDispatch(xstring comdid) { HCURSOR hCursor = xutil::SetCursorWait(); xsedit xs = GetControl(L"xcontent"); xstring content; xs.GetContent(content); if (comdid == L"xmFileSave") { //save xml content SaveContent(content); } else if (comdid == L"xmValid") { xml x ; if (!x.loadXML(content)) { KXMLDOMParseError pError = x.parseError(); if (pError) { 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); } else { trace(L"XML ´íÎó"); } return -1; } } else if (comdid == L"show") { if (OnCmdDispatch(L"xmValid") == -1) return -1; onShow(); } else if (comdid == L"xmQuery") { xstring guid = publiccode::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.left(8) == L"xmClose_") { 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 OnXCommand(TEvent* evt,LPARAM param) { return OnCmdDispatch(evt->xcommand.pStrID); } int OnTreeAdd(HTREEITEM item, xstring data,KXMLDOMElement e) { auto list = e.selectNodes(L"*"); int i; int s = list.length(); for (i = 0; i < s; i++) { 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); } return 1; } int OnTreeExpand(HTREEITEM item) { 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) { trace(x.xml()); return 0; } 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)) 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""; } 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) { xstring data = L"" + tv_db.GetItemData(gitem); if (data.left(6) != L"group@") break; gitem = tv_db.GetNextItem(gitem); } xstring guid = publiccode::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)) 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""; memu += L"н¨±í"; memu += L"н¨·Ö×é"; memu += L"-"; memu += L"Ë¢ÐÂ"; memu += L""; xstring str = tv_db.PopupMenu(memu); popup = str; } else if (data.left(6) == L"table@" && data.find(L"@",7) < 0) { xstring memu = L""; memu += L"н¨±í"; memu += L"Éè¼Æ"; memu += L"-"; memu += L"´ò¿ªÇ°500ÐÐ"; memu += L"±à¼­Ç°200ÐÐ"; memu += L"-"; memu += L"ÖØÃüÃû"; memu += L"Ë¢ÐÂ"; memu += L"ɾ³ý"; memu += L""; xstring str = tv_db.PopupMenu(memu); popup = str; } else if (data.left(6) == L"group@") { xstring memu = L""; memu += L"ÖØÃüÃû"; memu += L"Ë¢ÐÂ"; memu += L"ɾ³ý"; memu += L""; 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""; memu += L"ÖØÃüÃû"; memu += L"ÐÞ¸Ä"; memu += L"ɾ³ý"; memu += L""; 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 = publiccode::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)&XDevEditXMSSQL::OnXCommand); //»ñÈ¡½¹µãʼþ£¬ÓÃÓÚÖØÖù¤¾ßÌõ AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXMSSQL::OnSetFocus); //»ñµÃÊ÷µÄÕ¹¿ªÊ¼þ AttachEvent(L"tv_db", L"TVN_ITEMEXPANDING", (FEvent)&XDevEditXMSSQL::OnTreeExpanding); //»ñµÃÊ÷µÄÑ¡Ôñʼþ //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); return 1; } 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; } int onload() { tv_db = GetControl(L"tv_db"); list = GetControl(L"list"); OnInitial(); LoadData(); //OnCmdDispatch(L"xmQuery"); return 1; } };