#include <wobject/xstring.hpp>
|
#include <wobject/xwin.hpp>
|
#include <wobject/xaserver.hpp>
|
#include <wobject/xaserverarg.hpp>
|
#include <xcontrol/xtreeview.hpp>
|
#include <xcontrol/xlayersheet.hpp>
|
#include <xcontrol/xtreeview.hpp>
|
#include <xcontrol/xlayersheet.hpp>
|
#include <xcontrol/xsedit.hpp>
|
#include <xcontrol/xdwgrid.hpp>
|
#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"<group guid='" + guid + L"' name='" + name + L"'";
|
if (flag.mid(5,7) == L".table.")
|
{
|
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"<root>";
|
memu += L"<Item>н¨±í</Item>";
|
memu += L"<Item>н¨·Ö×é</Item>";
|
memu += L"<Item>-</Item>";
|
memu += L"<Item>Ë¢ÐÂ</Item>";
|
memu += L"</root>";
|
xstring str = tv_db.PopupMenu(memu);
|
popup = str;
|
}
|
else if (data.left(6) == L"table@" && data.find(L"@",7) < 0)
|
{
|
xstring memu = L"<root>";
|
memu += L"<Item>н¨±í</Item>";
|
memu += L"<Item>Éè¼Æ</Item>";
|
memu += L"<Item>-</Item>";
|
memu += L"<Item>´ò¿ªÇ°500ÐÐ</Item>";
|
memu += L"<Item>±à¼Ç°200ÐÐ</Item>";
|
memu += L"<Item>-</Item>";
|
memu += L"<Item>ÖØÃüÃû</Item>";
|
memu += L"<Item>Ë¢ÐÂ</Item>";
|
memu += L"<Item>ɾ³ý</Item>";
|
memu += L"</root>";
|
xstring str = tv_db.PopupMenu(memu);
|
popup = str;
|
}
|
else if (data.left(6) == L"group@")
|
{
|
xstring memu = L"<root>";
|
memu += L"<Item>ÖØÃüÃû</Item>";
|
memu += L"<Item>Ë¢ÐÂ</Item>";
|
memu += L"<Item>ɾ³ý</Item>";
|
memu += L"</root>";
|
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"<root>";
|
memu += L"<Item>ÖØÃüÃû</Item>";
|
memu += L"<Item>ÐÞ¸Ä</Item>";
|
memu += L"<Item>ɾ³ý</Item>";
|
memu += L"</root>";
|
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;
|
}
|
};
|