xj qian
2024-10-18 918cf2c844f524641396e72c6ecebcc620c57813
update
已添加3个文件
已修改5个文件
1770 ■■■■■ 文件已修改
jrj/ext-jrj/ext-jrj.vcxproj 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/ext-jrj/ext-jrj.vcxproj.filters 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/project/business/QuoteFile.cpp 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/xframe/devloper/sqlwatch.cpp 1226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/xframe/kobject/kxsedit.hpp 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/xframe/win32/win.hpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/xframe/xcontrol/xsedit.hpp 356 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/xframe/xcontrol/xtreeview.hpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jrj/ext-jrj/ext-jrj.vcxproj
@@ -216,6 +216,7 @@
    <ClInclude Include="..\xframe\kobject\kwin.hpp" />
    <ClInclude Include="..\xframe\kobject\kxaserver.hpp" />
    <ClInclude Include="..\xframe\kobject\kxml.hpp" />
    <ClInclude Include="..\xframe\kobject\kxsedit.hpp" />
    <ClInclude Include="..\xframe\platform\nmemory.hpp" />
    <ClInclude Include="..\xframe\platform\nstring.hpp" />
    <ClInclude Include="..\xframe\system\base.hpp" />
@@ -263,6 +264,7 @@
    <ClInclude Include="..\xframe\xcontrol\xlistview.hpp" />
    <ClInclude Include="..\xframe\xcontrol\xoffice.hpp" />
    <ClInclude Include="..\xframe\xcontrol\xreport.hpp" />
    <ClInclude Include="..\xframe\xcontrol\xsedit.hpp" />
    <ClInclude Include="..\xframe\xcontrol\xshtml.hpp" />
    <ClInclude Include="..\xframe\xcontrol\xtreeview.hpp" />
    <ClInclude Include="framework.h" />
@@ -1135,6 +1137,10 @@
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
    </ClCompile>
    <ClCompile Include="..\xframe\devloper\devloper.cpp" />
    <ClCompile Include="..\xframe\devloper\sqlwatch.cpp">
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
    </ClCompile>
    <ClCompile Include="..\xframe\devloper\XDevItemDlg.cpp" />
    <ClCompile Include="..\xframe\src\nmemory.cpp" />
    <ClCompile Include="..\xframe\src\nstring.cpp" />
jrj/ext-jrj/ext-jrj.vcxproj.filters
@@ -465,6 +465,12 @@
    <ClInclude Include="JGui.hpp">
      <Filter>jarch</Filter>
    </ClInclude>
    <ClInclude Include="..\xframe\kobject\kxsedit.hpp">
      <Filter>xframe\kobject</Filter>
    </ClInclude>
    <ClInclude Include="..\xframe\xcontrol\xsedit.hpp">
      <Filter>xframe\xcontrol</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="dllmain.cpp">
@@ -1421,12 +1427,18 @@
    <ClCompile Include="..\project\business\SO\select.gdnitem.so.cpp">
      <Filter>project\business\SO</Filter>
    </ClCompile>
    <ClCompile Include="..\project\business\PO\paymentmethod.cpp">
      <Filter>源文件</Filter>
    </ClCompile>
    <ClCompile Include="..\project\business\Expense\maint.Document.Test.v3.cpp">
      <Filter>project\business\Expense</Filter>
    </ClCompile>
    <ClCompile Include="..\xframe\devloper\sqlwatch.cpp">
      <Filter>devloper</Filter>
    </ClCompile>
    <ClCompile Include="..\project\business\Quote\QuoteFilePurch2Select.cpp">
      <Filter>project\business\Quote</Filter>
    </ClCompile>
    <ClCompile Include="..\project\business\PO\paymentmethod.cpp">
      <Filter>project\business\PO</Filter>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <None Include="ext-jrj.def">
jrj/project/business/QuoteFile.cpp
@@ -4235,6 +4235,8 @@
            else if (col == colTyp1 || col == colTyp || col == colTyp2 || col == colTyp3)
            {
                xstring pitems1 = L"";
                pitems1 += (xstring)L"&lt;row&gt;&lt;显示列&gt;&lt;/显示列&gt;&lt;数据列&gt;"
                    + L"&lt;/数据列&gt;&lt;/row&gt;";
                pitems1 += (xstring)L"&lt;row&gt;&lt;显示列&gt;成品&lt;/显示列&gt;&lt;数据列&gt;"
                    + L"成品&lt;/数据列&gt;&lt;/row&gt;";
                pitems1 += (xstring)L"&lt;row&gt;&lt;显示列&gt;散货&lt;/显示列&gt;&lt;数据列&gt;"
@@ -4489,6 +4491,8 @@
            else if (col == colTyp1 || col == colTyp)
            {
                xstring pitems1 = L"";
                pitems1 += (xstring)L"&lt;row&gt;&lt;显示列&gt;&lt;/显示列&gt;&lt;数据列&gt;"
                    + L"&lt;/数据列&gt;&lt;/row&gt;";
                pitems1 += (xstring)L"&lt;row&gt;&lt;显示列&gt;成品&lt;/显示列&gt;&lt;数据列&gt;"
                    + L"成品&lt;/数据列&gt;&lt;/row&gt;";
                pitems1 += (xstring)L"&lt;row&gt;&lt;显示列&gt;散货&lt;/显示列&gt;&lt;数据列&gt;"
jrj/xframe/devloper/sqlwatch.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1226 @@
#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/xsedit.hpp>
#include <xcontrol/xdwgrid.hpp>
using xml = KXMLDOMDocument;
class __declspec(dllexport) SqlWatchWin : public xwin
{
public:    //xdwgrid    dw_list;
    xnode    m_agentNode;    //Agent Condition
    xtreeview m_exploer;
    KXMLDOMElement toEle;
    xml toXml;
public:
    SqlWatchWin(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd) {}
public:
    static SqlWatchWin* CreateInstance(void* implPtr, void* hWnd)
    {
        SqlWatchWin* pWin = new SqlWatchWin(implPtr, (HWND)hWnd);
        return pWin;
    }
    int trace(xstring info)
    {
#define EM_SETSEL               0x00B1
#define EM_REPLACESEL           0x00C2
#define EM_SCROLL               0x00B5
#define SB_LINEDOWN         1
        xcontrol xc = GetControl(L"output");
        SendMessage(xc.GetHWND(), EM_SETSEL, -1, 0);
        SendMessage(xc.GetHWND(), EM_REPLACESEL, false, (LPARAM)info.c_str());
        SendMessage(xc.GetHWND(), EM_SCROLL, SB_LINEDOWN, 0);
        return 1;
    }
    int SetAgent()
    {
        xstring xfNodeAgentArea = L"agentarea";
        xnode anode = GetAgentNode(xfNodeAgentArea);
        if (m_agentNode)
        {
            SetAgentNode(anode, m_agentNode);
        }
        else
        {
            KXMLDOMElement xframeElement = GetElement();
            KXMLDOMElement agent = xframeElement.selectSingleNode(L"agent/" + xfNodeAgentArea + L"[1]/*");
            if (agent)
            {
                xstring s = agent.xml();
                m_agentNode = SetAgentNode(anode, s);
            }
        }
        return 1;
    }
    //焦点激活处理函数
    int OnSetFocus(TEvent* evt, LPARAM param)
    {
        //重置工具条
        SetAgent();
        return 1;
    }
    xstring getLink(HTREEITEM hItem)
    {
        return L"hxerp";
    }
    xstring makeSheet(xstring labels, xstring datas)
    {
        xstring ls_sheet = L"<sheet ver='10315'  editer='xcell' version='3.0' report='true'>";
        //style
        ls_sheet += L"\r\n<stylesheet>";
        ls_sheet += L"\r\n\t<item name='f0'>font-facename:宋体;font-style:normal;font-weight:400;font-size:-21.000000px</item>";
        ls_sheet += L"\r\n\t<item name='f1'>font-facename:宋体;font-style:normal;font-weight:bold;font-size:-21.000000px</item>";
        ls_sheet += L"\r\n</stylesheet>";
        //axis
        ls_sheet += L"\r\n<axis>";
        ls_sheet += L"\r\n\t<col>";
        ls_sheet += L"\r\n\t\t<item width='28' colend='0'/>";
        ls_sheet += L"\r\n\t\t<item width='90' colend='64'/>";
        ls_sheet += L"\r\n\t</col>";
        ls_sheet += L"\r\n\t<row>";
        ls_sheet += L"\r\n\t\t<item height='1' rowend='0'/>";
        ls_sheet += L"\r\n\t\t<item height='24' rowend='64'/>";
        ls_sheet += L"\r\n\t</row>";
        ls_sheet += L"\r\n</axis>";
        //cell
        ls_sheet += L"\r\n<cells>";
        ls_sheet += L"\r\n\t<row><cell colindex='0'><prestr>data/Item</prestr></cell></row>";
        ls_sheet += L"\r\n\t<row rowindex='3'>" + labels + L"\r\n\t</row>";
        ls_sheet += L"\r\n\t<row rowindex='5'>" + datas + L"\r\n\t</row>";
        ls_sheet += L"\r\n</cells>";
        //report
        ls_sheet += L"\r\n<report right='0' left='0'>";
        ls_sheet += L"\r\n\t<PageHeader endRow='1' startRow='1'/>";
        ls_sheet += L"\r\n\t<Header endRow='2' startRow='2'/>";
        ls_sheet += L"\r\n\t<Title endRow='4' startRow='3'/>";
        ls_sheet += L"\r\n\t<Detail endRow='6' startRow='5'/>";
        ls_sheet += L"\r\n\t<Summury endRow='7' startRow='7'/>";
        ls_sheet += L"\r\n\t<Footer endRow='8' startRow='8'/>";
        ls_sheet += L"\r\n\t<PageFooter endRow='9' startRow='9'/>";
        ls_sheet += L"\r\n</report>";
        ls_sheet += L"\r\n</sheet>";
        return ls_sheet;
    }
    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;
    }
    int FetchVSql()
    {
        xsedit xs;
        xstring content = L"";
        xs = GetControl(L"sqlcontent");
        int start = xs.GetSelectionStart();
        int end = xs.GetSelectionEnd();
        xs.GetContent(content);
        if (start != end)
        {
            content = content.mid(start, end - start);
        }
        xml x;
        xaserverarg xarg ;
        xarg.AddArg(L"func", L"fetch-vsql");
        xarg.AddArg(L"sql", content.c_str());
        xarg.AddArg(L"xquery", L"");
        xaserver::ExecXQuery(GetServerUrl(), L"[sqlExec.xq]", xarg.GetString(), x);
        if (x)
        {
            trace(x.text());
        }
        else
            trace(L"have a error");
        return 1;
    }
    int FetchSql()
    {
        xsedit xs;
        xstring content = L"";
        xs = GetControl(L"sqlcontent");
        int start = xs.GetSelectionStart();
        int end = xs.GetSelectionEnd();
        xs.GetContent(content);
        if (start != end)
        {
            content = content.mid(start, end - start);
        }
        xml x ;
        xaserverarg xarg;
        xarg.AddArg(L"func", L"fetch-sql");
        xarg.AddArg(L"sql", content);
        xarg.AddArg(L"xquery", L"");
        xaserver::ExecXQuery(GetServerUrl(), L"[sqlExec.xq]", xarg.GetString(), x);
        if (x)
        {
            trace(x.text());
        }
        else
            trace(L"have a error");
        return 1;
    }
    xstring GetFolder(xstring file)
    {
        int pos = 0;
        int pos1 = 0;
        pos = file.find(L"/", pos);
        while (pos)
        {
            pos1 = file.find(L"/", pos + 1);
            if (pos1 < 0) break;
            pos = pos1;
        }
        if (pos > 0)
            return file.left(pos);
        else
            return L"";
    }
    int surePath(xstring base, xstring file)
    {
        CreateDirectory(base, nullptr);
        if (file == L"") return 1;
        xstring src = file;
        int pos = src.find(L"/");
        while (pos >= 0)
        {
            xstring folder = src.left(pos);
            pos = src.find(L"/", pos + 1);
            if(src.left(1)==L"/")
                CreateDirectory(base + folder, __nullptr);
            else
                CreateDirectory(base + L"/" + folder, nullptr);
        }
        return 1;
    }
    int processhxw(xstring base, xstring sfile)
    {
        surePath(base, sfile);
        int ret = DownLoadFile2(sfile, base + sfile);
        if (ret < 0)
        {
            trace(L"\r\n error load:" + sfile + L" " + base + L"/" + sfile);
            return -1;
        }
        xml x ;
        x.load(base + L"/" + sfile);
        KXMLDOMNodeList items = x.selectNodes(L"/category/domain/folder[count(@deleted)=0]");
        int len = items.length();
        for (int i = 0; i < len; i++)
        {
            KXMLDOMNode node = items.item(i);
            xstring src = node.selectSingleNode(L"@src").text();
            if (src.find(L"mh.com") < 0)
            {
                src = src.replace(L"\\", L"/");
                processhxd(base + L"/developer", src);
            }
        }
    }
    int reconnect()
    {
        SendMessage(GetFrameWindow().GetHWND(), 0x401, (LPARAM)L"xmAuth", 0);
        return 1;
    }
    int DownLoadFile2(xstring src, xstring dest)
    {
        int ret = xaserver::DownLoadFile(GetServerUrl(), src, L"", dest);
        if (ret < 0)
        {
            reconnect();
            ret = xaserver::DownLoadFile(GetServerUrl(), src, L"", dest);
        }
        if (ret < 0)reconnect();
        return ret;
    }
    int processprj1(xstring base, xstring path, xstring src, bool processItem)
    {
        //xcontrol xc = GetControl(L"frame:output");
        //xc.SetText(L"\r\n process: "+path+L"/"+src);
        trace(L"\r\n base:" + base);
        surePath(base + L"/" + path, src);
        int ret = DownLoadFile2(L"/developer/" + path + L"/" + src, base + L"/" + path + L"/" + src);
        if (ret < 0)
        {
            trace(L"\r\nerror load /developer/" + path + L"/" + src + L" " + base + L"/" + path + L"/" + src);
            reconnect();
            return 1;
        }
        trace(L"\r\n prj /developer/" + path + L"/" + src + L" " + base + L"/" + path + L"/" + src);
        xml x;
        if (!x.load(base + L"/" + path + L"/" + src))
        {
            trace(L"\r\nerror load:" + base + L"/" + path + L"/" + src);
            return 1;
        }
        KXMLDOMNodeList items = x.selectNodes(L"//file[count(@deleted)=0]");
        xstring caption = x.documentElement().getAttribute(L"caption");;
        xstring srcpath = GetFolder(src);
        if (caption == L"")
        {
            trace(L"\r\nerror caption:" + base + L"/" + path + L"/" + src);
            return 1;
        }
        xstring spath = L"/developer/" + path + L"/" + srcpath + L"/" + caption;
        xstring dpath = base + L"/" + path + L"/" + srcpath + L"/" + caption;
        surePath(dpath, L"");
        int len = items.length();
        for (int i = 0; i < len; i++)
        {
            KXMLDOMNode node = items.item(i);
            xstring srcItem = L"";
            xstring id = L"";
            if (node.selectSingleNode(L"@guid")) id = node.selectSingleNode(L"@guid").text();
            if (node.selectSingleNode(L"@src")) srcItem = node.selectSingleNode(L"@src").text();
            xstring typ = L"";
            if (node.selectSingleNode(L"@type")) typ = node.selectSingleNode(L"@type").text();
            xstring values = L"";
            if (srcItem != L"" && typ != L"")
            {
                ret = DownLoadFile2(L"dev:" + typ + L"[" + srcItem + L"]", dpath + L"/" + srcItem);
                if (ret < 0)
                {
                    trace(L"\r\nerror load dev:" + typ + L"[" + srcItem + L"]" + L" " + dpath + L"/" + srcItem);
                    continue;
                    //return 1;
                }
                CreateDirectory(base + L"/working", nullptr);
                CreateDirectory(base + L"/working/code", nullptr);
                CreateDirectory(base + L"/working/sheets", nullptr);
                if (id != L"")
                {
                    if (typ == L"xruler")
                    {
                        CreateDirectory(base + L"/working/" + typ + L"s", nullptr);
                        DownLoadFile2(L"dev:" + typ + L"[" + srcItem + L"]", base + L"/working" + L"/" + typ + L"s/" + id + L".xrl");
                    }
                    else if (typ == L"serialize")
                    {
                        CreateDirectory(base + L"/working/" + typ, nullptr);
                        DownLoadFile2(L"dev:" + typ + L"[" + srcItem + L"]", base + L"/working" + L"/" + typ + L"/" + id + L".xml");
                    }
                    else if (typ == L"workflow" || typ == L"worknode" || typ == L"xaction" || typ == L"template" || typ == L"xfile"
                        || typ == L"xquery" || typ == L"entity" || typ == L"xpage")
                    {
                        CreateDirectory(base + L"/working/" + typ + L"s", nullptr);
                        DownLoadFile2(L"dev:" + typ + L"[" + srcItem + L"]", base + L"/working" + L"/" + typ + L"s/" + id + L".xml");
                    }
                    else
                    {
                        CreateDirectory(base + L"/working/" + typ, nullptr);
                        DownLoadFile2(L"dev:" + typ + L"[" + srcItem + L"]", base + L"/working" + L"/" + typ + L"/" + id);
                    }
                    values = L"";
                    if (xutil::HasCacheData(L"object-types"))values = xutil::GetUrlData(L"object-types");
                    if (values.find(L",L" + typ + L",L") < 0) values += L",L" + typ + L",L";
                    xutil::CacheUrlData(L"object-types", values);
                    values = L"";
                    if (xutil::HasCacheData(typ))values = xutil::GetUrlData(typ);
                    if (values != L"")  values += L"\r\n";
                    values += L"T(\"" + srcItem + L"\",\"" + id + L"\",\"" + spath + L"/" + srcItem + L"\")";
                    xutil::CacheUrlData(typ, values);
                }
                if (typ == L"template")
                {
                    xml xtempl;
                    if (xtempl.load(base + L"/working" + L"/" + typ + L"s/" + id + L".xml"))
                    {
                        KXMLDOMNodeList nodes = xtempl.selectNodes(L"/xdoc/sheet");
                        int count = nodes.length();
                        for (int k = 0; k < count; k++)
                        {
                            KXMLDOMNode tnode = nodes.item(k);
                            xstring content = tnode.xml();
                            xstring sheetid = L"";
                            xstring sheetcaption = L"";
                            if (node.selectSingleNode(L"@guid")) sheetid = tnode.selectSingleNode(L"@guid").text();
                            if (node.selectSingleNode(L"@caption")) sheetcaption = tnode.selectSingleNode(L"@caption").text();
                            xutil::SaveToFile(base + L"/working/sheets/" + sheetid + L".xml", content, L"", L"", (LPTSTR)L"");
                            tnode.Release();
                            values = L"";
                            if (xutil::HasCacheData(L"object-types"))values = xutil::GetUrlData(L"object-types");
                            if (values.find(L",sheet,L") < 0) values += L",sheet,L";
                            xutil::CacheUrlData(L"object-types", values);
                            values = L"";
                            xstring str = L"";
                            if (xutil::HasCacheData(L"sheet"))values = xutil::GetUrlData(L"sheet");
                            str = L"\r\n";
                            if (id != L"")str += L"T(\"" + srcItem + L"/" + id + L"\",\"" + id + L"\")";
                            str += L"\r\n";
                            if (sheetcaption != L"")str += L"T(\"" + srcItem + L"/" + sheetcaption + L"\",\"" + id + L"\")";
                            values += str;
                            xutil::CacheUrlData(L"sheet", values);
                        }
                    }
                }
                if (typ == L"xpage")
                {
                    xstring srccode = srcItem.replace(L".xpage", L".xss");
                    srccode = srccode.replace(L".vx", L".xss");
                    ret = DownLoadFile2(L"dev:code[" + srcItem + L"]", dpath + L"/" + srccode);
                    if (ret < 0)
                    {
                        trace(L"\r\nerror load dev:code[" + srcItem + L"]" + L" " + dpath + L"/" + srccode);
                        continue;
                        //return 1;
                    }
                    if (id != L"") DownLoadFile2(L"dev:code[" + srcItem + L"]", base + L"/working" + L"/code/" + id + L".xss");
                    values = L"";
                    if (xutil::HasCacheData(L"object-types"))values = xutil::GetUrlData(L"object-types");
                    if (values.find(L",code,L") < 0) values += L",code,L";
                    xutil::CacheUrlData(L"object-types", values);
                    values = L"";
                    if (xutil::HasCacheData(typ))values = xutil::GetUrlData(typ);
                    if (values != L"")  values += L"\r\n";
                    values += L"T(\"" + srcItem + L"\",\"" + id + L"\",\"" + spath + L"\"" + srcItem + L"\")";
                    xutil::CacheUrlData(L"code", values);
                }
            }
        }
        trace(L" -- finished");
        return 1;
    }
    int processprj_xml(xstring base, xstring path, xstring src, bool processItem)
    {
        //xcontrol xc = GetControl(L"frame:output");
        //xc.SetText(L"\r\n process: "+path+L"/"+src);
        trace(L"\r\n base:" + base);
        surePath(base + L"/" + path, src);
        int ret = DownLoadFile2(L"/developer/" + path + L"/" + src, base + L"/" + path + L"/" + src);
        if (ret < 0)
        {
            trace(L"\r\nerror load /developer/" + path + L"/" + src + L" " + base + L"/" + path + L"/" + src);
            return 1;
        }
        trace(L"\r\n prj /developer/" + path + L"/" + src + L" " + base + L"/" + path + L"/" + src);
        xml x;
        if (!x.load(base + L"/" + path + L"/" + src))
        {
            trace(L"\r\nerror load:" + base + L"/" + path + L"/" + src);
            return 1;
        }
        KXMLDOMNodeList items = x.selectNodes(L"//file[count(@deleted)=0]");
        xstring caption = x.documentElement().getAttribute(L"caption");;
        xstring srcpath = GetFolder(src);
        if (caption == L"")
        {
            trace(L"\r\nerror caption:" + base + L"/" + path + L"/" + src);
            return 1;
        }
        xstring spath = L"/developer/" + path + L"/" + srcpath + L"/" + caption;
        xstring dpath = base + L"/" + path + L"/" + srcpath + L"/" + caption;
        surePath(dpath, L"");
        int len = items.length();
        for (int i = 0; i < len; i++)
        {
            KXMLDOMNode node = items.item(i);
            trace(L".");
            xstring srcItem = L"";
            xstring id = L"";
            if (node.selectSingleNode(L"@guid")) id = node.selectSingleNode(L"@guid").text();
            if (node.selectSingleNode(L"@src")) srcItem = node.selectSingleNode(L"@src").text();
            xstring typ = L"";
            if (node.selectSingleNode(L"@type")) typ = node.selectSingleNode(L"@type").text();
            xstring values = L"";
            if (srcItem != L"" && typ != L"")
            {
                ret = DownLoadFile2(L"dev:" + typ + L"[" + srcItem + L"]", dpath + L"/" + srcItem);
                if (ret < 0)
                {
                    trace(L"\r\nerror load dev:" + typ + L"[" + srcItem + L"]" + L" " + dpath + L"/" + srcItem);
                    continue;
                    //return 1;
                }
                CreateDirectory(base + L"/working", nullptr);
                CreateDirectory(base + L"/working/code", nullptr);
                CreateDirectory(base + L"/working/sheets", nullptr);
                if (id != L"")
                {
                    if (typ == L"xruler")
                    {
                        CreateDirectory(base + L"/working/" + typ + L"s", nullptr);
                        //DownLoadFile2(L"dev:"+typ+L"["+srcItem+L"]",base+L"/working"+L"/"+typ+L"s/"+id+L".xrl");
                        DownLoadFile2(L"dev:" + typ + id, base + L"/working" + L"/" + typ + L"s/" + id + L".xrl");
                    }
                    else if (typ == L"serialize")
                    {
                        CreateDirectory(base + L"/working/" + typ, nullptr);
                        //DownLoadFile2(L"dev:"+typ+L"["+srcItem+L"]",base+L"/working"+L"/"+typ+L"/"+id+L".xml");
                        DownLoadFile2(L"dev:" + typ + id, base + L"/working" + L"/" + typ + L"/" + id + L".xml");
                    }
                    else if (typ == L"workflow" || typ == L"worknode" || typ == L"xaction" || typ == L"template" || typ == L"xfile"
                        || typ == L"xquery" || typ == L"entity" || typ == L"xpage")
                    {
                        CreateDirectory(base + L"/working/" + typ + L"s", nullptr);
                        //DownLoadFile2(L"dev:"+typ+L"["+srcItem+L"]",base+L"/working"+L"/"+typ+L"s/"+id+L".xml");
                        DownLoadFile2(L"dev:" + typ + id, base + L"/working" + L"/" + typ + L"s/" + id + L".xml");
                    }
                    else
                    {
                        CreateDirectory(base + L"/working/" + typ, nullptr);
                        //DownLoadFile2(L"dev:"+typ+L"["+srcItem+L"]",base+L"/working"+L"/"+typ+L"/"+id);
                        DownLoadFile2(L"dev:" + typ + id, base + L"/working" + L"/" + typ + L"/" + id);
                    }
                    appendto(typ, L"T(\"" + srcItem + L"\",\"" + id + L"\",\"" + spath + L"/" + srcItem + L"\")[ln]");
                }
                if (typ == L"template")
                {
                    xml xtempl;
                    if (xtempl.load(base + L"/working" + L"/" + typ + L"s/" + id + L".xml"))
                    {
                        KXMLDOMNodeList nodes = xtempl.selectNodes(L"/xdoc/sheet");
                        int count = nodes.length();
                        for (int k = 0; k < count; k++)
                        {
                            KXMLDOMNode tnode = nodes.item(k);
                            xstring content = tnode.xml();
                            xstring sheetid = L"";
                            xstring sheetcaption = L"";
                            if (node.selectSingleNode(L"@guid")) sheetid = tnode.selectSingleNode(L"@guid").text();
                            if (node.selectSingleNode(L"@caption")) sheetcaption = tnode.selectSingleNode(L"@caption").text();
                            xutil::SaveToFile(base + L"/working/sheets/" + sheetid + L".xml", content, L"", L"", (LPTSTR)L"");
                            appendto(L"sheet", L"T(\"" + srcItem + L"/" + sheetid + L"\",\"" + sheetid + L"\")[ln]");
                            appendto(L"sheet", L"T(\"" + srcItem + L"/" + sheetcaption + L"\",\"" + sheetid + L"\")[ln]");
                        }
                    }
                }
                if (typ == L"xpage")
                {
                    xstring srccode = srcItem.replace(L".xpage", L".xss");
                    srccode = srccode.replace(L".vx", L".xss");
                    ret = DownLoadFile2(L"dev:code[" + srcItem + L"]", dpath + L"/" + srccode);
                    if (ret < 0)
                    {
                        trace(L"\r\nerror load dev:code[" + srcItem + L"]" + L" " + dpath + L"/" + srccode);
                        continue;
                        //return 1;
                    }
                    if (id != L"")
                    {
                        DownLoadFile2(L"dev:code[" + srcItem + L"]", base + L"/working" + L"/code/" + id + L".xss");
                        //DownLoadFile2(L"dev:code"+id,base+L"/working"+L"/code/"+id+L".xss");
                        appendto(L"code", L"T(\"" + srcItem + L"\",\"" + id + L"\",\"" + spath + L"\"" + srcItem + L"\")[ln]");
                    }
                }
            }
        }
        trace(L" -- finished");
        return 1;
    }
    int processhxd(xstring base, xstring sfile)
    {
        surePath(base, sfile);
        trace(L"\r\n" + base + L"/" + sfile);
        int ret = DownLoadFile2(L"/developer/" + sfile, base + L"/" + sfile);
        if (ret < 0)
        {
            trace((xstring)L"\r\n error load:" + L"/developer/" + sfile + L" " + base + L"/" + sfile);
            return -1;
        }
        xml xhd ;
        xhd.load(base + L"/" + sfile);
        KXMLDOMNodeList items = xhd.selectNodes(L"//project[count(@deleted)=0]");
        int len = items.length();
        for (int i = 0; i < len; i++)
        {
            KXMLDOMNode node = items.item(i);
            xstring src = L"";
            if (node.selectSingleNode(L"@src")) src = node.selectSingleNode(L"@src").text();
            if (src != L"")
            {
                xstring path = GetFolder(sfile);
                src = src.replace(L"\\", L"/");
                processprj_xml(base, path, src, true);
            }
        }
        return 1;
    }
    int Initenv()
    {
        xstring values = L"";
        if (xutil::HasCacheData(L"object-types"))values = xutil::GetUrlData(L"object-types");
        values = values.replace(L",,L", L",L");
        if (values != L"")
        {
            int pos = values.find(L",L", 0);
            xstring typ = L"";
            while (pos >= 0)
            {
                int pos1 = values.find(L",L", pos + 1);
                if (pos1 < 0) break;
                typ = values.mid(pos + 1, pos1 - pos - 1);
                xutil::CacheUrlData(typ, L"");
                if (pos1 == values.length())break;
                pos = pos1;
            }
        }
        return 1;
    }
    int Initenv_xml()
    {
        if (!toXml)
        {
            toXml = xml();
        }
        else
        {
            if (toEle)toEle.Release();
        }
        toXml.loadXML(L"<root/>");
        toEle = toXml.documentElement();
        return 1;
    }
    int appendto(xstring typ, xstring val)
    {
        KXMLDOMElement ele;
        KXMLDOMDocument doc = toEle.ownerDocument();
        KXMLDOMNode node = toEle.selectSingleNode(L"to[@name='" + typ + L"']");
        if (!node)
        {
            ele = doc.createElement(L"to");
            ele.setAttribute(L"name", typ);
            toEle.appendChild(ele);
        }
        else
        {
            ele = node;
            //node.Release();
        }
        KXMLDOMElement t = doc.createElement(L"item");
        t.settext(val);
        ele.appendChild(t);
        return 1;
    }
    int maketo_xml(xstring base)
    {
        toXml.save(base + L"/developer/working/index.xml");
        //return 1;
        KXMLDOMNodeList items = toEle.selectNodes(L"to");
        int lens = items.length();
        xstring typ;
        xstring val;
        KXMLDOMNode node;
        for (int i = 0; i < lens; i++)
        {
            node = items.item(i).selectSingleNode(L"@name");
            if (node)
            {
                typ = node.text();
            }
            val = items.item(i).text();
            val = val.replace(L"[ln]", L"\r\n");
            xutil::SaveToFile(base + L"/developer/working/" + typ + L".tu", val, L"", L"", (LPTSTR)L"");
        }
        return 1;
    }
    int maketo(xstring base)
    {
        xstring values = L"";
        xstring tvalue = L"";
        if (xutil::HasCacheData(L"object-types"))values = xutil::GetUrlData(L"object-types");
        values = values.replace(L",,L", L",L");
        trace(values);
        if (values != L"")
        {
            int len = values.length();
            int pos = values.find(L",L", 0);
            xstring typ = L"";
            while (pos >= 0)
            {
                int pos1 = values.find(L",L", pos + 1);
                if (pos1 < 0) break;
                typ = values.mid(pos + 1, pos1 - pos - 1);
                tvalue = L"";
                if (xutil::HasCacheData(typ))tvalue = xutil::GetUrlData(typ);
                xutil::SaveToFile(base + L"/developer/working/" + typ + L".tu", xutil::GetUrlData(typ), L"", L"", (LPTSTR)L"");
                if (pos1 == len)break;
                pos = pos1;
            }
        }
        return 1;
    }
    int OnExport()
    {
        Initenv_xml();
        int EM_EXLIMITTEXT = 0x400 + 53;
        xcontrol xc = GetControl(L"output");
        //xcontrol xc = GetControl(L"frame:output");
        trace(L"\r\nstart export:");
        SendMessage(xc.GetHWND(), EM_EXLIMITTEXT, 0x00100000, 0);
        int ret = processhxw(L"D:/jrjhome", L"/developer/projects/Projects.xhw");
        trace(L"\r\nstart make to");
        maketo_xml(L"D:/jrjhome");
        trace(L"\r\nfinish export");
        return ret;
    }
    //命令发布函数
    int OnCmdDispatch(xstring comdid)
    {
        xsedit xs;
        HCURSOR hCursor = xutil::SetCursorWait();
        xstring content = L"";
        int result = 1;
        if (comdid == L"xmCheckUrl")
        {
            xstring url1 = xcontrol(GetControl(L"frame:url")).GetText();
            return OnProcessUrl(L"info", url1);
        }
        else if (comdid == L"xmExport")
        {
            return OnExport();
        }
        else if (comdid == L"xmClearBuffer")
        {
            xstring url2 = xcontrol(GetControl(L"frame:url")).GetText();
            return OnProcessUrl(L"clearbuffer", url2);
        }
        else if (comdid == L"xmFetchSql")
        {
            return FetchSql();
        }
        else if (comdid == L"xmFetchVSql")
        {
            return FetchVSql();
        }
        else if (comdid == L"xmSqlExec" || comdid == L"xmXQueryExec")
        {
            xs = GetControl(L"sqlcontent");
            int start = xs.GetSelectionStart();
            int end = xs.GetSelectionEnd();
            xs.GetContent(content);
            if (start != end)
            {
                content = content.mid(start, end - start);
            }
            //alert(content);
            xml x;
            xaserverarg xarg ;
            xarg.AddArg(L"func", L"exec");
            if (comdid == L"xmXQueryExec")
            {
                xarg.AddArg(L"sql", L"");
                xarg.AddArg(L"xquery", content);
            }
            else
            {
                xarg.AddArg(L"sql", content);
                xarg.AddArg(L"xquery", L"");
            }
            xaserver::ExecXQuery(GetServerUrl(), L"[sqlExec.xq]", xarg.GetString(), x);
            trace(x.xml());
            KXMLDOMNodeList n = x.selectNodes(L"data/Item[1]/*");
            int len = n.length();
            xstring ls_labels = L"";
            xstring ls_datas = L"";
            for (int i = 0; i < len; i++)
            {
                KXMLDOMElement t = n.item(i);
                xstring name = t.tagName();
                ls_labels += L"\r\n<cell><text>" + name + L"</text></cell>";
                ls_datas += L"\r\n<cell group='.' column='" + name + L"'></cell>";
            }
            xstring ls_sheet = makeSheet(ls_labels, ls_datas);
            xml x1;
            x1.loadXML(ls_sheet);
            //trace(ls_sheet);
            xdwgrid dw_list = GetControl(L"dw_list");
            dw_list.SetDataObject(x1);
            dw_list.Retrieve(x);
            dw_list.Redraw();
        }
        else if (comdid == L"xmSaveAs")
        {
            xdwgrid dw_list1 = GetControl(L"dw_list");
            dw_list1.SaveAs(L"");
            return 1;
        }
        else if (comdid == L"xmEntitySel")
        {
            xaserverarg arg;
            OpenWindow(L"dev:xpage[sqlSelect.vx]", arg);
            xstring str = arg.GetArgString(L"select");
            {
                xs = GetControl(L"sqlcontent");
                xs.GetContent(content);
                int pos = xs.GetSelectionStart();
                xstring txt = content.left(pos);
                txt += str + L"\r\n";
                txt += content.right(content.length() - pos + 1);
                xs.SetContent(txt, L".sql");
            }
        }
        else if (comdid == L"xmEditFind")
        {
            xutil::RestoreCursor(hCursor);
            xs = GetControl(L"sqlcontent");
            xs.OnFindDlg();
        }
        else if (comdid == L"xmEditReplace")
        {
            xutil::RestoreCursor(hCursor);
            xs = GetControl(L"sqlcontent");
            xs.OnReplaceDlg();
        }
        else
            result = 0;
        xutil::RestoreCursor(hCursor);
        return result;
    }
    int CreateSubTree(HTREEITEM hitem, KXMLDOMNode e)
    {
        KXMLDOMNodeList listn = e.selectNodes(L"entity");
        int nlen = listn.length();
        int i = 0;
        for (i = 0; i < nlen; i++)
        {
            KXMLDOMElement n = listn.item(i);
            xstring cp = n.getAttribute(L"name");
            if (cp)
            {
                HTREEITEM pitem = m_exploer.InsertChildItem(hitem, cp, (LPARAM)n, 16);
            }
        }
        return 1;
    }
    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"))
        {
            grid.Redraw();
            return 0;
        }
        x.loadXML(e.selectSingleNode(L"datas").xml());
        grid.Retrieve(x);
        grid.Redraw();
        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 OnDel(HTREEITEM item)
    {
        return 1;
    }
    int OnRefresh(HTREEITEM item)
    {
        while (m_exploer.GetChildItem(item))
            m_exploer.DeleteItem(m_exploer.GetChildItem(item));
        OnTreeExpand(item);
        return 1;
    }
    KXMLDOMElement OnXQuery(xstring data)
    {
        HTREEITEM hItem = m_exploer.GetSelectedItem();
        xstring link = getLink(hItem);
        xml x;
        xaserverarg arg ;
        arg.AddArg(L"type", data);
        arg.AddArg(L"link", link);
        if (xaserver::ExecXQuery(GetServerUrl(), L"[sqlWatch.xq]", arg.GetString(), x) != 1) {
            trace(x.xml());
            return KXMLDOMElement();
        }
        return x.documentElement();
    }
    int OnOpen(xstring caption, xstring kind)
    {
        return 1;
    }
    int OnQuery(xstring caption)
    {
        if (OnOpen(caption, L"query") == 0) return 0;
        //KXMLDOMElement e = OnXQuery(L"column@"+caption);
        KXMLDOMElement e = OnXQuery(L"Entity/Table/Query@" + caption);
        if (!e) return 0;
        KXMLDOMNodeList nodes = e.selectNodes(L"columns/column");
        int i;
        int s = nodes.length();
        xstring str;
        str = L"SELECT TOP 500 \r\n";
        for (i = 0; i < s; i++)
        {
            KXMLDOMElement ele = nodes.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;
        str += L"FROM {qt:Entity('" + caption + L"')} ";
        xstring content;
        xsedit xs = GetControl(L"sqlcontent");
        xs.GetContent(content);
        content += L"\r\n" + str;
        xs.SetContent(content, L".sql");
        /*xsedit xs = GetControl(L"sql_"+caption);
        xs.LoadContent(str,L".sql");
        setGrid(e,L"grid_"+caption);
        */
        //trace(e.xml);
        setGrid(e, L"dw_list");
        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;
        OpenWindow(L"dev:xpage[SqlTypeFieldMaint.vx]", 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;
    }
    int OnTreeRClick(TEvent* evt,LPARAM param)
    {
        TVNNMHDR& nmtv = *(TVNNMHDR*)evt->notify.pnmh;
        HTREEITEM item = nmtv.FromItem;
        xstring data = m_exploer.GetItemData(item);
        xstring popup;
        xstring menu = L"<root>";
        xstring str = L"";
        if (data == L"table")
        {
            menu += L"<Item>新建表</Item>";
            menu += L"<Item>新建分组</Item>";
            menu += L"<Item>-</Item>";
            menu += L"<Item>刷新</Item>";
            menu += L"</root>";
            str = m_exploer.PopupMenu(menu);
            popup = str;
        }
        else if (data.left(13) == L"Entity/Table@" && data.find(L"@", 14) < 0)
        {
            menu += L"<Item>新建实体</Item>";
            menu += L"<Item>设计</Item>";
            menu += L"<Item>-</Item>";
            menu += L"<Item>打开前500行</Item>";
            menu += L"<Item>编辑前200行</Item>";
            menu += L"<Item>-</Item>";
            menu += L"<Item>重命名</Item>";
            menu += L"<Item>刷新</Item>";
            menu += L"<Item>删除</Item>";
            menu += L"</root>";
            str = m_exploer.PopupMenu(menu);
            popup = str;
        }
        else if (data.left(6) == L"table@" && data.find(L"@", 7) < 0)
        {
            menu += L"<Item>新建表</Item>";
            menu += L"<Item>设计</Item>";
            menu += L"<Item>-</Item>";
            menu += L"<Item>打开前500行</Item>";
            menu += L"<Item>编辑前200行</Item>";
            menu += L"<Item>-</Item>";
            menu += L"<Item>重命名</Item>";
            menu += L"<Item>刷新</Item>";
            menu += L"<Item>删除</Item>";
            menu += L"</root>";
            str = m_exploer.PopupMenu(menu);
            popup = str;
        }
        else if (data.left(6) == L"group@")
        {
            menu += L"<Item>重命名</Item>";
            menu += L"<Item>刷新</Item>";
            menu += L"<Item>删除</Item>";
            menu += L"</root>";
            str = m_exploer.PopupMenu(menu);
            popup = str;
        }
        else if (data.left(5) == L"view@" || data.left(10) == L"procedure@" || data.left(9) == L"function@")
        {
            menu += L"<Item>重命名</Item>";
            menu += L"<Item>修改</Item>";
            menu += L"<Item>删除</Item>";
            menu += L"</root>";
            str = m_exploer.PopupMenu(menu);
            popup = str;
        }
        xstring caption = getCaption(data);
        /*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 = GetGuid();
            xstring text = L"Table_" + guid.mid(1,8);
            OnDesign(text);
        }
        else if(popup == L"修改")
            OnOpen(caption,L"query");*/
        return 1;
    }
    int OnTreeAdd(HTREEITEM hItem, xstring typ, KXMLDOMElement e)
    {
        KXMLDOMNodeList nodes = e.selectNodes(L"*");
        int i;
        int s = nodes.length();
        for (i = 0; i < s; i++)
        {
            KXMLDOMElement ele = nodes.item(i);
            xstring name = ele.getAttribute(L"name");
            xstring image = ele.getAttribute(L"image");
            xstring d = ele.getAttribute(L"data");
            xstring c = ele.getAttribute(L"child");
            image = L"" + image;
            if (d == L"")
                d = typ + L"@" + name;
            HTREEITEM j = m_exploer.InsertChildItem(hItem, L"" + name, (LPARAM)d.c_str(true), image.toInt());
            if (c != L"")
            {
                if (c.toInt() > 0)m_exploer.SetItemChild1(j, 1);
            }
            else
            {
                if (image.toInt() > 9)m_exploer.SetItemChild1(j, 1);
            }
            OnTreeAdd(j, d, ele);
        }
        return 1;
    }
    int OnTreeExpand(HTREEITEM hItem)
    {
        xstring typ = m_exploer.GetItemData(hItem);
        xstring link = getLink(hItem);
        xml x;
        xaserverarg arg;
        arg.AddArg(L"type", typ);
        arg.AddArg(L"link", link);
        if (xaserver::ExecXQuery(GetServerUrl(), L"[sqlWatch.xq]", arg.GetString(), x) != 1)
        {
            trace(x.xml());
            return 0;
        }
        KXMLDOMElement e = x.documentElement();
        OnTreeAdd(hItem, typ, e);
        return 1;
    }
    int OnTreeExpanding(TEvent* evt, int p)
    {
        NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
        HTREEITEM hItem = nmtv.itemNew.hItem;
        if (m_exploer.GetChildItem(hItem)) return 0;
        OnTreeExpand(hItem);
        return 1;
    }
    int CreateRootTree(xml x)
    {
        KXMLDOMNodeList listx = x.selectNodes(L"//group");
        int nlen = listx.length();
        int i = 0;
        for (i = 0; i < nlen; i++)
        {
            KXMLDOMElement n = listx.item(i);
            xstring cp = n.getAttribute(L"caption");
            if (cp)
            {
                HTREEITEM hitem = m_exploer.InsertChildItem( 0, cp, n, 15);
                trace(xstring((_int64)hitem).c_str());
                CreateSubTree(hitem, n);
                m_exploer.ExpandItemAll(hitem);
            }
        }
        return 1;
    }
    int  ExpandChildFolder(HTREEITEM hItem, KXMLDOMElement pElement)
    {
        KXMLDOMNodeList nlist = pElement.selectNodes(L"Item");
        int len = nlist.length();
        for (int i = 0; i < len; i++)
        {
            KXMLDOMElement e = nlist.item(i);
            xstring name = e.getAttribute(L"name");
            xstring sImage = e.getAttribute(L"image");
            xstring data = e.getAttribute(L"data");
            int image = 15;
            if (sImage) image = sImage.toInt();
            HTREEITEM h = m_exploer.InsertChildItem(hItem, name, (LPARAM)data.c_str(true), image);
            m_exploer.SetItemChild(h, 1);
            ExpandChildFolder(h, e);
        }
        return 1;
    }
    int  InitialFolder()
    {
        KXMLDOMElement xframeElement = GetElement();
        KXMLDOMElement e = xframeElement.selectSingleNode(L"//xtree[@name='tv_exploer']/initial");
        ExpandChildFolder(0, e);
        return 1;
    }
    //命令处理事件
    int OnXCommand(TEvent* evt, LPARAM param)
    {
        return OnCmdDispatch(evt->xcommand.pStrID);
    }
    int OnAttachEvent()
    {
        //绑定工具条点击事件
        AttachEvent(L"WM_XCOMMAND", (FEvent) & SqlWatchWin::OnXCommand);
        //获取焦点事件,用于重置工具条
        AttachEvent(L"WM_SETFOCUS", (FEvent)&SqlWatchWin::OnSetFocus);
        AttachEvent(L"tv_exploer", L"TVN_ITEMEXPANDING", (FEvent)&SqlWatchWin::OnTreeExpanding);
        AttachEvent(L"tv_exploer", L"TVN_RCLICK", (FEvent)&SqlWatchWin::OnTreeRClick);
        return 1;
    }
    int onload()
    {
        OnAttachEvent();
        m_exploer = GetControl(L"tv_exploer");
        xml x;
        InitialFolder();
        //if(xaserver::FetchXml(L"",L"dev:xml[sale.entity.xml]",L"",x)==1)CreateRootTree(x);
        xsedit xs = GetControl(L"sqlcontent");
        xs.SetContent(L"--import 'qx.object.xq'", L".sql");
        return 1;
    }
    int onloaded()
    {
        SetAgent();
        return 1;
    }
};
jrj/xframe/kobject/kxsedit.hpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
#pragma once
#include "kcontrol.hpp"
namespace Hxsoft {    namespace XFrame {
class  IXSEdit : public IXFControl
{
public:
    // @access public macro members
    // @cmember return linenumber display flag
    BOOL GetDisplayLinenumbers();
    // @cmember return selection display flag
    BOOL GetDisplaySelection();
    // @cmember return folding margin display flag
    BOOL GetDisplayFolding();
    // @cmember set search flags
    void SetSearchflags(int nSearchflags);
    int GetSearchflags();
public:
    // @access public function members
    // @cmember register a window class to use scintilla in a dialog
    //static BOOL Register(CWinApp *app, UINT id);
    // @cmember try to load Lexer DLL
    static HMODULE LoadScintillaDll(LPCTSTR szLexerDll = NULL);
    // @cmember create window
    // BOOL Create (LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
    // @cmember Set Text to the Scintilla control
    void SetText(LPCTSTR szText);
    // @cmember Get Text from the Scintilla control
    void GetText(LPTSTR& strText);
    // @cmember Get Text from the Scintilla control
    LPTSTR GetText();
    // @cmember Load a file
    BOOL LoadFile(LPCTSTR szFile);
    // @cmember Save a file
    BOOL SaveFile(LPCTSTR szFile);
    // @cmember try to find lexer format from extension
    int GetFormatFromExtension(LPCTSTR szExtension);
    // @cmember calcluate number of chars needed for linenumberdisplay
    int GetLinenumberChars();
    // @cmember calcluate number of pixels for linenumber display
    int GetLinenumberWidth();
    // @cmember set display of linenumbers on/off
    void SetDisplayLinenumbers(BOOL bFlag =true);
    // @cmember set display of selection/bookmark margin on/off
    void SetDisplaySelection(BOOL bFlag = true);
    // @cmember set display of source folding margin on/off
    void SetDisplayFolding(BOOL bFlag = true);
    // @cmember cut selection to clipboard
    void Cut();
    // @cmember copy selection to clipboard
    void Copy();
    // @cmember paste from clipboard
    void Paste();
    // @cmember clear selection
    void Clear();
    // @cmember undo last change
    void Undo();
    // @cmember redo last change
    void Redo();
    // @cmember check if we can undo
    BOOL CanUndo();
    // @cmember check if we can redo
    BOOL CanRedo();
    // @cmember check if we have something to paste from clipboard
    BOOL CanPaste();
    // @cmember select complete text
    void SelectAll();
    // @cmember return the current line number
    long GetCurrentLine();
    // @cmember return the current column number
    long GetCurrentColumn();
    // @cmember return the current character position within the file
    long GetCurrentPosition();
    // @cmember return the current style number at the current character position
    int GetCurrentStyle();
    // @cmember return the current folding level at the current character position
    int GetCurrentFoldinglevel();
    // @cmember set the fontname for a style number
    void SetFontname(int nStyle, LPCTSTR szFontname);
    // @cmember set the fontname height in points for a style number
    void SetFontheight(int nStyle, int nHeight);
    // @cmember set the foregroundcolor for a style number
    void SetForeground(int nStyle, COLORREF crForeground);
    // @cmember set the backgroundcolor for a style number
    void SetBackground(int nStyle, COLORREF crBackground);
    // @cmember set given style to bold
    void SetBold(int nStyle, BOOL bFlag);
    // @cmember set given style to bold
    void SetItalic(int nStyle, BOOL bFlag);
    // @cmember set given style to bold
    void SetUnderline(int nStyle, BOOL bFlag);
    // @cmember get flag if we are in overstrike mode
    BOOL GetOverstrike();
    // @cmember set flag for overstrike mode
    void SetOverstrike(BOOL bOverstrike);
    // @cmember init the view with reasonable defaults
    void Init();
    // @cmember called whenever the text is changed - we can update any indicators and do brace matching
    void UpdateUI();
    // @cmember do default folding
    void DoDefaultFolding(int nMargin, long lPosition);
    // @cmember refresh lexer and display after new settings
    void Refresh();
    // @cmember add a bookmark = marker type 0
    void AddBookmark(long lLine);
    // @cmember delete a bookmark = marker type 0
    void DeleteBookmark(long lLine);
    // @cmember check for bookmark = marker type 0
    BOOL HasBookmark(long lLine);
    // @cmember Find next bookmark
    void FindNextBookmark();
    // @cmember Find previous bookmark
    void FindPreviousBookmark();
    // @cmember goto line
    void GotoLine(long lLine);
    // @cmember goto position
    void GotoPosition(long lPos);
    // @cmember search forward for a given text
    BOOL SearchForward(LPTSTR szText);
    // @cmember search backward for a given text
    BOOL SearchBackward(LPTSTR szText);
    // @cmember replace a text found by SearchForward or SearchBackward
    void ReplaceSearchedText(LPCTSTR szText);
    // @cmember Set your own lexer
    void SetLexer(int nLexer);
    // @cmember return start position of selection
    long GetSelectionStart();
    // @cmember return end position of selection
    long GetSelectionEnd();
    // @cmember get selected text
    LPTSTR GetSelectedText();
    // @cmember replace all in buffer or selection
    int ReplaceAll(LPTSTR szFind, LPTSTR szReplace, BOOL bSelection = true);
public:
    // @cmember load text
    int LoadContent(BSTR bstr, LPCTSTR ext = L".xml");
    // @cmember set text
    int SetContent(BSTR bstr, LPCTSTR ext = L".xml");
    // @cmember get text
    int GetContent(BSTR* bstr);
public:
    int OnFindDlg();
    int OnReplaceDlg();
};
}}
jrj/xframe/win32/win.hpp
@@ -99,7 +99,7 @@
    int WINAPI ShellExecuteW(HWND hWnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd) ;//native from "shell32.dll" alias "ShellExecuteW";    
    int WINAPI DeleteFile(string lpFileName) ;//native from "Shlwapi.dll" alias "DeleteFileW";    
    bool WINAPI PathFileExists(string lpFileName) ;//native from "shlwapi.dll" alias "PathFileExistsW";    
    int WINAPI CreateDirectory(string lpFileName, string lpFileAttributes) ;//native from "kernel32.dll" alias "CreateDirectoryW";
    int WINAPI CreateDirectoryW(string lpFileName, void* lpFileAttributes) ;//native from "kernel32.dll" alias "CreateDirectoryW";
    //bool WINAPI SystemParametersinfo(int uiAction,int uiParam,param pvParam,int fWinlni) ;//native from "user32.dll" alias "SystemParametersinfo";    
    int WINAPI GetSystemMetrics(int nIndex) ;//native from "user32.dll" alias "GetSystemMetrics";    
    HWND WINAPI FindWindowW(string lpClassName, string lpWindowName);//native from "user32.dll" alias "FindWindowW";    
@@ -122,6 +122,7 @@
#define GetWindowText GetWindowTextW
#define AppendMenu AppendMenuW
#define FindWindowEx  FindWindowExW 
#define CreateDirectory CreateDirectoryW
#endif
#if 0
jrj/xframe/xcontrol/xsedit.hpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,356 @@
#pragma once
#include "wobject/xcontrol.hpp"
#include "kobject/kxsedit.hpp"
using kxsedit = Hxsoft::XFrame::IXSEdit;
class xsedit : public xcontrol
{
    public:
        xsedit():xcontrol(nullptr){}
        xsedit(void * implptr):xcontrol(implptr){}
        kxsedit* getKXSEdit(){return (kxsedit*)this->GetNativePtr();}
    public:
        // @access public macro members
        // @cmember return linenumber display flag
        BOOL GetDisplayLinenumbers()
        {
            return getKXSEdit()->GetDisplayLinenumbers();
        }
        // @cmember return selection display flag
        BOOL GetDisplaySelection()
        {
            return getKXSEdit()->GetDisplaySelection();
        }
        // @cmember return folding margin display flag
        BOOL GetDisplayFolding()
        {
            return getKXSEdit()->GetDisplayFolding();
        }
        // @cmember set search flags
        void SetSearchflags(int nSearchflags)
        {
            return getKXSEdit()->SetSearchflags(nSearchflags);
        }
        int GetSearchflags()
        {
            return getKXSEdit()->GetSearchflags();
        }
public:
    // @access public function members
    // @cmember register a window class to use scintilla in a dialog
    //static BOOL Register(CWinApp *app, UINT id);
    // @cmember try to load Lexer DLL
    static HMODULE LoadScintillaDll(LPCTSTR szLexerDll = NULL)
    {
        return kxsedit::LoadScintillaDll(szLexerDll);
    }
    // @cmember create window
    // BOOL Create (LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
    // @cmember Set Text to the Scintilla control
    void SetText(LPCTSTR szText)
    {
        return getKXSEdit()->SetText(szText);
    }
    // @cmember Get Text from the Scintilla control
    void GetText(LPTSTR& strText)
    {
        return getKXSEdit()->GetText(strText);
    }
    // @cmember Get Text from the Scintilla control
    LPTSTR GetText()
    {
        return getKXSEdit()->GetText();
    }
    // @cmember Load a file
    BOOL LoadFile(LPCTSTR szFile)
    {
        return getKXSEdit()->LoadFile(szFile);
    }
    // @cmember Save a file
    BOOL SaveFile(LPCTSTR szFile)
    {
        return getKXSEdit()->SaveFile(szFile);
    }
    // @cmember try to find lexer format from extension
    int GetFormatFromExtension(LPCTSTR szExtension)
    {
        return getKXSEdit()->GetFormatFromExtension(szExtension);
    }
    // @cmember calcluate number of chars needed for linenumberdisplay
    int GetLinenumberChars()
    {
        return getKXSEdit()->GetLinenumberChars();
    }
    // @cmember calcluate number of pixels for linenumber display
    int GetLinenumberWidth()
    {
        return getKXSEdit()->GetLinenumberWidth();
    }
    // @cmember set display of linenumbers on/off
    void SetDisplayLinenumbers(BOOL bFlag = true)
    {
        return getKXSEdit()->SetDisplayLinenumbers(bFlag);
    }
    // @cmember set display of selection/bookmark margin on/off
    void SetDisplaySelection(BOOL bFlag = true)
    {
        return getKXSEdit()->SetDisplaySelection(bFlag);
    }
    // @cmember set display of source folding margin on/off
    void SetDisplayFolding(BOOL bFlag = true)
    {
        return getKXSEdit()->SetDisplayFolding(bFlag);
    }
    // @cmember cut selection to clipboard
    void Cut()
    {
        return getKXSEdit()->Cut();
    }
    // @cmember copy selection to clipboard
    void Copy()
    {
        return getKXSEdit()->Copy();
    }
    // @cmember paste from clipboard
    void Paste()
    {
        return getKXSEdit()->Paste();
    }
    // @cmember clear selection
    void Clear()
    {
        return getKXSEdit()->Clear();
    }
    // @cmember undo last change
    void Undo()
    {
        return getKXSEdit()->Undo();
    }
    // @cmember redo last change
    void Redo()
    {
        return getKXSEdit()->Redo();
    }
    // @cmember check if we can undo
    BOOL CanUndo()
    {
        return getKXSEdit()->CanUndo();
    }
    // @cmember check if we can redo
    BOOL CanRedo()
    {
        return getKXSEdit()->CanRedo();
    }
    // @cmember check if we have something to paste from clipboard
    BOOL CanPaste()
    {
        return getKXSEdit()->CanPaste();
    }
    // @cmember select complete text
    void SelectAll()
    {
        return getKXSEdit()->SelectAll();
    }
    // @cmember return the current line number
    long GetCurrentLine()
    {
        return getKXSEdit()->GetCurrentLine();
    }
    // @cmember return the current column number
    long GetCurrentColumn()
    {
        return getKXSEdit()->GetCurrentColumn();
    }
    // @cmember return the current character position within the file
    long GetCurrentPosition()
    {
        return getKXSEdit()->GetCurrentPosition();
    }
    // @cmember return the current style number at the current character position
    int GetCurrentStyle()
    {
        return getKXSEdit()->GetCurrentStyle();
    }
    // @cmember return the current folding level at the current character position
    int GetCurrentFoldinglevel()
    {
        return getKXSEdit()->GetCurrentFoldinglevel();
    }
    // @cmember set the fontname for a style number
    void SetFontname(int nStyle, LPCTSTR szFontname)
    {
        return getKXSEdit()->SetFontname(nStyle, szFontname);
    }
    // @cmember set the fontname height in points for a style number
    void SetFontheight(int nStyle, int nHeight)
    {
        return getKXSEdit()->SetFontheight(nStyle, nHeight);
    }
    // @cmember set the foregroundcolor for a style number
    void SetForeground(int nStyle, COLORREF crForeground)
    {
        return getKXSEdit()->SetForeground(nStyle, crForeground);
    }
    // @cmember set the backgroundcolor for a style number
    void SetBackground(int nStyle, COLORREF crBackground)
    {
        return getKXSEdit()->SetBackground(nStyle,crBackground);
    }
    // @cmember set given style to bold
    void SetBold(int nStyle, BOOL bFlag)
    {
        return getKXSEdit()->SetBold(nStyle,bFlag);
    }
    // @cmember set given style to bold
    void SetItalic(int nStyle, BOOL bFlag)
    {
        return getKXSEdit()->SetItalic(nStyle,bFlag);
    }
    // @cmember set given style to bold
    void SetUnderline(int nStyle, BOOL bFlag)
    {
        return getKXSEdit()->SetUnderline(nStyle,bFlag);
    }
    // @cmember get flag if we are in overstrike mode
    BOOL GetOverstrike()
    {
        return getKXSEdit()->GetOverstrike();
    }
    // @cmember set flag for overstrike mode
    void SetOverstrike(BOOL bOverstrike)
    {
        return getKXSEdit()->SetOverstrike(bOverstrike);
    }
    // @cmember init the view with reasonable defaults
    void Init()
    {
        return getKXSEdit()->Init();
    }
    // @cmember called whenever the text is changed - we can update any indicators and do brace matching
    void UpdateUI()
    {
        return getKXSEdit()->UpdateUI();
    }
    // @cmember do default folding
    void DoDefaultFolding(int nMargin, long lPosition)
    {
        return getKXSEdit()->DoDefaultFolding(nMargin,lPosition);
    }
    // @cmember refresh lexer and display after new settings
    void Refresh()
    {
        return getKXSEdit()-> Refresh();
    }
    // @cmember add a bookmark = marker type 0
    void AddBookmark(long lLine)
    {
        return getKXSEdit()->AddBookmark(lLine);;
    }
    // @cmember delete a bookmark = marker type 0
    void DeleteBookmark(long lLine)
    {
        return getKXSEdit()->DeleteBookmark(lLine);
    }
    // @cmember check for bookmark = marker type 0
    BOOL HasBookmark(long lLine)
    {
        return getKXSEdit()->HasBookmark(lLine);
    }
    // @cmember Find next bookmark
    void FindNextBookmark()
    {
        return getKXSEdit()->FindNextBookmark();
    }
    // @cmember Find previous bookmark
    void FindPreviousBookmark()
    {
        return getKXSEdit()->FindPreviousBookmark();
    }
    // @cmember goto line
    void GotoLine(long lLine)
    {
        return getKXSEdit()->GotoLine(lLine);
    }
    // @cmember goto position
    void GotoPosition(long lPos)
    {
        return getKXSEdit()->GotoPosition(lPos);
    }
    // @cmember search forward for a given text
    BOOL SearchForward(LPTSTR szText)
    {
        return getKXSEdit()->SearchForward(szText);
    }
    // @cmember search backward for a given text
    BOOL SearchBackward(LPTSTR szText)
    {
        return getKXSEdit()->SearchBackward(szText);
    }
    // @cmember replace a text found by SearchForward or SearchBackward
    void ReplaceSearchedText(LPCTSTR szText)
    {
        return getKXSEdit()->ReplaceSearchedText(szText);
    }
    // @cmember Set your own lexer
    void SetLexer(int nLexer)
    {
        return getKXSEdit()->SetLexer(nLexer);
    }
    // @cmember return start position of selection
    long GetSelectionStart()
    {
        //return getKXSEdit()->GetSelectionStart();
        return -1;
    }
    // @cmember return end position of selection
    long GetSelectionEnd()
    {
        //return getKXSEdit()->GetSelectionEnd();
        return -1;
    }
    // @cmember get selected text
    LPTSTR GetSelectedText()
    {
        return getKXSEdit()->GetSelectedText();
    }
    // @cmember replace all in buffer or selection
    int ReplaceAll(LPTSTR szFind, LPTSTR szReplace, BOOL bSelection = true)
    {
        return getKXSEdit()->ReplaceAll(szFind,szReplace,bSelection);
    }
public:
    // @cmember load text
    int LoadContent(xstring bstr, LPCTSTR ext = L".xml")
    {
        return getKXSEdit()->LoadContent((BSTR)bstr.c_str(), ext);
    }
    // @cmember set text
    int SetContent(xstring bstr, LPCTSTR ext = L".xml")
    {
        return getKXSEdit()->SetContent((BSTR)bstr.c_str(), ext);
    }
    // @cmember get text
    int GetContent(xstring&  xs)
    {
        BSTR bstr = nullptr;
        int ret = getKXSEdit()->GetContent(&bstr);
        xs= xstring(bstr, true);
        return 1;
    }
public:
    int OnFindDlg()
    {
        return getKXSEdit()->OnFindDlg();
    }
    int OnReplaceDlg()
    {
        return getKXSEdit()->OnReplaceDlg();
    }
};
jrj/xframe/xcontrol/xtreeview.hpp
@@ -513,17 +513,16 @@
        SendMessage(GetHWND(), TVM_GETITEMW, 0,(LPARAM)&xitem);
        return xitem.cChildren;
    }
#if 0
    string PopupMenu(string str)
    xstring PopupMenu(string str)
    {
       return (str)SendMessage(GetHWND(), 0x402, (WPARAM)str, 0);
       return (string)SendMessage(GetHWND(), 0x402, (WPARAM)str, 0);
    }
    string PopupMenu(KXMLDOMElement e)
    {
        return PopupMenu(e.xml);
        return PopupMenu(e.xml());
    }
#endif
    void SetLineAtRoot(bool value)
    {