From bd09edf1b441dcc6ab098f277bea86a72c009879 Mon Sep 17 00:00:00 2001
From: xj qian <qianxj15@sina.com>
Date: 星期四, 05 十二月 2024 17:30:21 +0800
Subject: [PATCH] update

---
 jrj/xframe/devloper/XDevEditXOffice.cpp |  613 +++++++++++--------------------------------------------
 1 files changed, 122 insertions(+), 491 deletions(-)

diff --git a/jrj/xframe/devloper/XDevEditXOffice.cpp b/jrj/xframe/devloper/XDevEditXOffice.cpp
index f26ab17..da7288b 100644
--- a/jrj/xframe/devloper/XDevEditXOffice.cpp
+++ b/jrj/xframe/devloper/XDevEditXOffice.cpp
@@ -4,544 +4,174 @@
 #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 <xcontrol/xoffice.hpp>
+#include "XDevEditPage.hpp"
 
 using xml = KXMLDOMDocument;
-class export XDeveloper : public xwin
+class export XDevEditXOffice : public XDevEditPage
 {
 	public:
-	XDeveloper(void* implPtr, HWND hWnd) :xwin(implPtr, hWnd),mle_output(nullptr) {}
+	XDevEditXOffice(void* implPtr, HWND hWnd) : XDevEditPage(implPtr, hWnd) {}
 public:
-	static XDeveloper* CreateInstance(void* implPtr, void* hWnd)
+	static XDevEditXOffice* CreateInstance(void* implPtr, void* hWnd)
 	{
-		XDeveloper* pWin = new XDeveloper(implPtr, (HWND)hWnd);
+		XDevEditXOffice* pWin = new XDevEditXOffice(implPtr, (HWND)hWnd);
 		return pWin;
 	}
 private:	//
-	xtreeview tv_folder;
-	xcontrol mle_output;
-	int sheet_Count;
-public:
-	int trace(xstring msg)
+	//xdwgrid	dw_list;
+	xoffice m_xdoc;
+	xnode	m_agentNode;	//Agent Condition
+	xstring	m_agentCond;	//Agent Node
+	int SetAgent()
 	{
-		xstring t = mle_output.GetText();
-		mle_output.SetText(t + msg);
+		xstring xfNodeAgentArea = L"agentarea";
+		xnode anode = GetAgentNode(xfNodeAgentArea);
+		auto xframeElement = GetElement();
+		auto agent = xframeElement.selectSingleNode(L"agent/" + xfNodeAgentArea + L"[1]/*");
+		if (agent)
+		{
+			xstring s = agent.xml();
+			m_agentNode = SetAgentNode(anode,s);
+		}
 		return 1;
 	}
 
-	int OnProcessUrl(xstring kind, xstring url)
+	//焦点激活处理函数
+	int OnSetFocus(TEvent* evt,LPARAM param)
 	{
-		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;
-	}
+		SetAgent();
 
-	xstring ProcessDevCmd(xstring cmd, xstring ext)
-	{
-		int nlen = 0;
-		BYTE* pdata=nullptr;
-		xaserver::ProcessCmd(GetServerUrl(),( L"uri.hxsoft.com/xaserver/developer " + cmd).c_str(), ext.c_str(), pdata, nlen);
-
-		xstring str = ((LPARAM)pdata) + L"";
-		return str;
-	}
-
-	int SetAgent(xstring node)
-	{
-		auto n = GetElement().selectSingleNode(L"agent/projects/node()[1]");
-		if (n)
-		{
-			xstring agent = n.xml();
-			xstring xfNodeAgentArea = L"agentarea";
-			xnode anode = GetAgentNode(xfNodeAgentArea);
-			SetAgentNode(anode, agent);
-		}
-
-		return 1;
-	}
-
-	HTREEITEM GetProjectItem(HTREEITEM hItem)
-	{
-		HTREEITEM pitem = hItem;
-		xstring typ;
-		while (true)
-		{
-			typ = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).tagName();
-			if (typ == L"project")break;
-			pitem = tv_folder.GetParentItem(pitem);
-			if (!pitem )break;
-		}
-		return pitem;
-	}
-
-	HTREEITEM GetP2Item(HTREEITEM hItem)
-	{
-		HTREEITEM hDomainItem;
-		HTREEITEM hP2Item = hItem;
-		while (true)
-		{
-			hDomainItem = tv_folder.GetParentItem(hP2Item);
-			if (!tv_folder.GetParentItem(hDomainItem))break;
-			hP2Item = hDomainItem;
-		}
-		return hP2Item;
-	}
-
-	//树展开事件
-	int OnTreeExpanding(TEvent* evt, HTREEITEM param)
-	{
-		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
-		HTREEITEM hItem = nmtv.itemNew.hItem;
-
-		return 1;
-	}
-
-	xstring GetData(HTREEITEM hItem)
-	{
-		KXMLDOMElement e = tv_folder.GetItemData(hItem);
-		xstring node = e.tagName();
-		if (node == L"File" || node == L"file")
-		{
-			HTREEITEM hP2Item = 0;
-			HTREEITEM hDomainItem = 0;
-			if (!tv_folder.GetParentItem(hItem))
-			{
-				hDomainItem = hItem;
-			}
-			else
-			{
-				hP2Item = GetP2Item(hItem);
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-			}
-
-			//find project folder
-			xstring prjguid = L"";
-			HTREEITEM pitem = GetProjectItem(hItem);
-			if (pitem)
-				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
-
-			xaserverarg arg;
-			arg.AddArg(L"project.guid", prjguid);
-			if (hP2Item)
-			{
-				if (hP2Item != hItem)
-				{
-					xstring guid = e.getAttribute(L"guid");
-					arg.AddArg(L"guid", guid);
-				}
-				KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
-				xstring guid = p.getAttribute(L"guid");
-				arg.AddArg(L"root.guid", guid);
-			}
-			else if (hDomainItem)
-			{
-				KXMLDOMElement d = tv_folder.GetItemData(hDomainItem);
-				xstring guid = d.getAttribute(L"guid");
-				arg.AddArg(L"domain.guid", guid);
-			}
-			xstring str = ProcessDevCmd(L"getobject", arg.GetString());
-			return str + L"";
-		}
-		else
-			return L"";
-	}
-
-	int OnTreeDblClick(TEvent* evt, int param)
-	{
-		HTREEITEM hItem = tv_folder.GetSelectedItem();
-		if (!hItem) return 0;
-
-		xlayersheet layer = GetControl(L"mdilayer");
-		int i = 0;
-		int nIndex = layer.GetSheetCount();
-		for (i = 0; i < nIndex; i++)
-		{
-			if (hItem == layer.GetParam(i))break;
-		}
-		if (i < nIndex)
-		{
-			layer.SelectSheet(i);
-			return 1;
-		}
-		KXMLDOMElement e = tv_folder.GetItemData(hItem);
-		xstring node = e.tagName();
-		if (node == L"File" || node == L"file")
-		{
-			//xstring str =  ProcessDevCmd(L"getobject",arg.GetString());
-			xstring typ = e.getAttribute(L"type");
-
-			xml x ;
-			xaserver::FetchXml(GetServerUrl(), L"dev:xpage[XDevEdit.xml]", L"", x);
-			auto n = x.selectSingleNode(L"//editor[@filetype='" + typ + L"']/@xpage");
-			if (n)
-			{
-				xstring xpage = n.text();
-				OpenWindow(L"dev:xpage[" + xpage + L"]", (LPARAM)hItem);
-				//layer. 
-				if (nIndex < layer.GetSheetCount())
-					layer.SetParam(nIndex, hItem);
-			}
-
-		}
+		//重置工具条
 		return 1;
 	}
 
 	//命令发布函数
 	int OnCmdDispatch(xstring comdid)
 	{
-		//
-		if (comdid == L"xmSqlWatch")
+		xml x ;
+		m_xdoc.GetData(x);
+		xstring content = x.xml();
+		if (comdid == L"xmFileSave")
 		{
-			OpenWindow(L"dev:xpage[sqlWatch.vx]");
+			//save xml content
+			SaveContent(content);
 			return 1;
 		}
-		if (comdid == L"xmCheckUrl")
+		else if (comdid == L"xmDevPreview")
 		{
-			xcontrol xc = GetControl(L"url");
-			xstring url = xc.GetText();
-			return OnProcessUrl(L"info", url);
-		}
-		else if (comdid == L"xmClearBuffer")
-		{
-			xcontrol xc = GetControl(L"url");
-			xstring url = xc.GetText();
-			return OnProcessUrl(L"clearbuffer", url);
-		}
-		if (comdid == L"xmNewFolder" || comdid == L"xmNewProject" || comdid == L"xmNewFile")
-		{
-			HTREEITEM hItem = tv_folder.GetSelectedItem();
-			if (!hItem) return 1;
-
-
-			//find project folder
-			xstring prjguid = L"";
-			HTREEITEM pitem = GetProjectItem(hItem);
-			if (pitem)
-				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
-
-			if (comdid == L"xmNewProject" && prjguid != L"") return 1;
-			if (comdid == L"xmNewFile" && !tv_folder.GetParentItem(hItem)) return 1;
-
+			xml x;
+			m_xdoc.GetData(x,m_xdoc.GetSelectedSheetIndex());
 			xaserverarg arg;
-			if (comdid == L"xmNewProject")
-				OpenWindow(L"dev:xpage[XDevProjectDlg.xpage]", arg);
-			else if (comdid == L"xmNewFolder")
-				OpenWindow(L"dev:xpage[XDevItemDlg.xpage]", arg);
-			else
-				OpenWindow(L"dev:xpage[XDevFileDlg.xpage]", arg);
-			if (arg.GetArgString(L"__process") != L"true") return 1;
-
-			arg.SetArg(L"project.guid", prjguid);
-
-			HTREEITEM hP2Item = 0;
-			HTREEITEM hDomainItem = 0;
-			KXMLDOMElement e;
-			if (!tv_folder.GetParentItem(hItem))
-			{
-				hDomainItem = hItem;
-			}
-			else
-			{
-				hP2Item = GetP2Item(hItem);
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-			}
-
-			e = tv_folder.GetItemData(hItem);
-			if (hP2Item)
-			{
-				if (hP2Item != hItem)
-				{
-					xstring guid = e.getAttribute(L"guid");
-					arg.AddArg(L"parent.guid", guid);
-				}
-				KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
-				xstring guid = p.getAttribute(L"guid");
-				arg.AddArg(L"root.guid", guid);
-			}
-			else if (hDomainItem)
-			{
-				KXMLDOMElement d = tv_folder.GetItemData(hDomainItem);
-				xstring guid = d.getAttribute(L"guid");
-				arg.AddArg(L"domain.guid", guid);
-			}
-
-
-			if (hP2Item)
-			{
-				if (comdid == L"xmNewFolder")
-				{
-					if (arg.GetArgString(L"image") == L"")
-						arg.AddArg(L"image", L"15");
-					arg.AddArg(L"folder", L"folder");
-					arg.AddArg(L"type", L"folder");
-				}
-			}
-			else
-			{
-				if (comdid == L"xmNewFolder")
-				{
-					if (arg.GetArgString(L"image") == L"")
-						arg.AddArg(L"image", L"17");
-					arg.AddArg(L"folder", L"folder");
-					arg.AddArg(L"type", L"folder");
-				}
-			}
-
-			xstring str = ProcessDevCmd(L"addfolder", arg.GetString());
-			if (str != L"")
-			{
-				xml x;
-				x.loadXML(str);
-				auto e1 = x.documentElement();
-				e.appendChild(e1);
-				int himage = xstring(e1.getAttribute(L"image")).toInt();
-				tv_folder.InsertChildItem(hItem, arg.GetArgString(L"name"), e1, himage);
-			}
-
+			arg.AddArg(L"xml", x.xml());
+			OpenWindow(L"dev:xpage[XDevOfficePreview.xpage]", arg);
 			return 1;
 		}
-		else if (comdid == L"xmDeleteObject")
+		else if (comdid == L"content")
 		{
-			HTREEITEM hItem = tv_folder.GetSelectedItem();
-			if (!hItem) return 1;
-
-			//find project folder
-			xstring prjguid = L"";
-			HTREEITEM pitem = GetProjectItem(hItem);
-			if (pitem)
-				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
-
-			HTREEITEM hP2Item = 0;
-			HTREEITEM hDomainItem = 0;
-			KXMLDOMElement e;
-			if (!tv_folder.GetParentItem(hItem) ) return 1;
-
-			hP2Item = hItem;
-			while (true)
-			{
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-				if (!tv_folder.GetParentItem(hDomainItem))break;
-				hP2Item = hDomainItem;
-			}
-
-			e = tv_folder.GetItemData(hItem);
-			xstring guid = e.getAttribute(L"guid");
-			xaserverarg arg;
-
-			arg.SetArg(L"project.guid", prjguid);
-			arg.AddArg(L"guid", guid);
-
-			KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
-			guid = p.getAttribute(L"guid");
-			arg.AddArg(L"root.guid", guid);
-
-			int MB_YESNO = 0x00000004;
-			int IDYES = 6;
-
-			if (MessageBox(GetHWND(), L"确认删除指定的项", L"提示", MB_YESNO) != IDYES) return 1;
-			ProcessDevCmd(L"deletefolder", arg.GetString());
-			tv_folder.DeleteItem(hItem);
-
+			return 1;
+			xsedit xs = GetControl(L"rptcontent");
+			xs.LoadContent(content,L".txt");
+			//xs.SetText(content);
 			return 1;
 		}
-		else if (comdid == L"xmUpdateProject")
+		else if (comdid == L"content1")
 		{
-			HTREEITEM hItem = tv_folder.GetSelectedItem();
-			if (!hItem) return 1;
-
-			//find project folder
-			xstring prjguid = L"";
-			HTREEITEM pitem = GetProjectItem(hItem);
-			if (pitem && pitem != hItem)
-				prjguid = ((KXMLDOMElement)tv_folder.GetItemData(pitem)).getAttribute(L"guid");
-
-			HTREEITEM hP2Item = 0;
-			HTREEITEM hDomainItem = 0;
-			KXMLDOMElement e;
-			if (!tv_folder.GetParentItem(hItem) ) return 1;
-
-			hP2Item = hItem;
-			while (true)
-			{
-				hDomainItem = tv_folder.GetParentItem(hP2Item);
-				if (!tv_folder.GetParentItem(hDomainItem))break;
-				hP2Item = hDomainItem;
-			}
-
-			e = tv_folder.GetItemData(hItem);
-			xstring guid = e.getAttribute(L"guid");
-			xaserverarg arg;
-
-			arg.SetArg(L"project.guid", prjguid);
-			arg.AddArg(L"guid", guid);
-
-			KXMLDOMElement p = tv_folder.GetItemData(hP2Item);
-			//trace(p.xml);
-			guid = p.getAttribute(L"guid");
-			arg.AddArg(L"root.guid", guid);
-
+			xcontrol xs = GetControl(L"rptcontent1");
+			SendMessage(xs.GetHWND(), 0x400 + 53,0,4096 * 4096);
+			xs.SetText(content);
+			return 1;
+		}
+		else if (comdid == L"design")
+		{
+			xsedit xs = GetControl(L"rptcontent");
 			xstring str;
-			str = e.getAttribute(L"caption");
-			arg.AddArg(L"name", str);
-
-			str = e.getAttribute(L"desc");
-			arg.AddArg(L"desc", str);
-
-			str = e.getAttribute(L"uri");
-			arg.AddArg(L"uri", str);
-
-			str = e.getAttribute(L"guid");
-			arg.AddArg(L"guid", str);
-
-			str = e.getAttribute(L"src");
-			arg.AddArg(L"src", str);
-
-			str = e.getAttribute(L"type");
-			arg.AddArg(L"type", str);
-
-			OpenWindow(L"dev:xpage[XDevItemDlg.xpage]", arg);
-			if (arg.GetArgString(L"__process") != L"true") return 1;
-
-			ProcessDevCmd(L"updatefolder", arg.GetString());
-			str = arg.GetArgString(L"name");
-			e.setAttribute(L"caption", str);
-
-			str = arg.GetArgString(L"desc");
-			e.setAttribute(L"desc", str);
-
-			str = arg.GetArgString(L"uri");
-			e.setAttribute(L"uri", str);
-
-			tv_folder.SetItemLabel(hItem, arg.GetArgString(L"name"));
-
+			xs.GetContent(str);
+			if (str != L"" && str != content)
+			{
+				m_xdoc.LoadTemplate(str,0);
+				xs.LoadContent(L"",L".txt");
+			}
+			/*
+			xcontrol xs = GetControl(L"rptcontent1");
+			xstring str ;
+			xstring str = xs.GetText();
+			if(str !=L"" && str != content)
+			{
+				m_xdoc.LoadTemplate(str,0);
+				//xs.LoadContent(L"",L".txt");
+			}*/
 			return 1;
-		}
-		else if (comdid == L"xmEditObject")
-		{
-			HTREEITEM hItem = tv_folder.GetSelectedItem();
-			if (!hItem) return 1;
-
-			xlayersheet layer = GetControl(L"mdilayer");
-			int i = 0;
-			int nIndex = layer.GetSheetCount();
-			for (i = 0; i < nIndex; i++)
-			{
-				if (hItem == layer.GetParam(i))break;
-			}
-			if (i < nIndex)
-			{
-				layer.SelectSheet(i);
-				return 1;
-			}
-			KXMLDOMElement e = tv_folder.GetItemData(hItem);
-			xstring node = e.tagName();
-			if (node == L"File" || node == L"file")
-			{
-				//xstring str =  ProcessDevCmd(L"getobject",arg.GetString());
-				xstring typ = e.getAttribute(L"type");
-
-				xml x ;
-				xaserver::FetchXml(GetServerUrl(), L"dev:xpage[XDevEdit.xml]", L"", x);
-				auto n = x.selectSingleNode((xstring)L"//editor[@filetype='" + L"xml" + L"']/@xpage");
-				if (n)
-				{
-					xstring xpage = n.text();
-					OpenWindow(L"dev:xpage[" + xpage + L"]", (LPARAM)hItem);
-					//layer. 
-					if (nIndex < layer.GetSheetCount())
-						layer.SetParam(nIndex, hItem);
-				}
-
-			}
-
 		}
 		return 0;
 	}
 
-	//树选择事件
-	int OnTreeSelChanged(TEvent* evt, LPARAM param)
-	{
-		NMTREEVIEW& nmtv = *(NMTREEVIEW*)evt->notify.pnmh;
-		HTREEITEM hItem = nmtv.itemNew.hItem;
-
-		//root node
-		KXMLDOMElement e = tv_folder.GetItemData(hItem);
-		SetAgent(L"projects");
-
-		return 1;
-	}
-
 	//命令处理事件
-	int OnXCommand(TEvent* evt, int param)
+	int OnXCommand(TEvent* evt,LPARAM param)
 	{
 		return OnCmdDispatch(evt->xcommand.pStrID);
 	}
 
-	int OnSelChanged(TEvent* evt, int param)
-	{
-		xlayersheet layer = GetControl(L"mdilayer");
-		LYSNMHDR& nmtv = *(LYSNMHDR*)evt->notify.pnmh;
-		int sheet = nmtv.nSheet;
-		int s = layer.GetSheetCount();
-
-		//状态栏显示完成路径
-		HTREEITEM hitem = tv_folder.GetSelectedItem();
-		xstring path = L"" + tv_folder.GetItemLabel(hitem);
-		while (tv_folder.GetParentItem(hitem))
-		{
-			hitem = tv_folder.GetParentItem(hitem);
-			xstring p = L"" + tv_folder.GetItemLabel(hitem);
-			path = p + L"\\" + path;
-		}
-		xcontrol xc = GetControl(L"statusbar");
-		xc.SetText(L"" + path);
-		/*
-				if(sheet<s)
-				{
-					param p=layer.GetParam(sheet);
-					int hitem = p;
-					onPrintPath(hitem);
-				}
-		*/
-
-		return 1;
-	}
-	int OnSelChangedEx(TEvent* evt, int param)
-	{
-		xlayersheet layer = GetControl(L"mdilayer");
-		LYSNMHDR& nmtv = *(LYSNMHDR*)evt->notify.pnmh;
-		int sheet = nmtv.nSheet;
-		int s = layer.GetSheetCount();
-		int k = sheet_Count;
-		if (k < s)
-		{
-			void* p = nullptr;
-			layer.SetParam(s - 1, p);
-		}
-		sheet_Count = s;
-		return 1;
-	}
 	int OnAttachEvent()
 	{
 		//绑定工具条点击事件
-		AttachEvent(L"WM_XCOMMAND", (FEvent)&XDeveloper::OnXCommand);
-		AttachEvent(L"DevExplorer", L"NM_DBLCLK", (FEvent)&XDeveloper::OnTreeDblClick);
-		//获得树的展开事件
-		//AttachEvent(L"DevExplorer", L"TVN_ITEMEXPANDING",(FEvent)&XDeveloper::OnTreeExpanding);
-		//获得树的选择事件
-		AttachEvent(L"DevExplorer", L"TVN_SELCHANGED", (FEvent)&XDeveloper::OnTreeSelChanged);
-		//改变页签
-		//AttachEvent(L"mdilayer", L"LYSN_SELECTEDSHEET",(FEvent)&XDeveloper::OnSelChanged);
-		AttachEvent(L"mdilayer", L"LYSN_SELECTEDSHEET", (FEvent)&XDeveloper::OnSelChangedEx);
+		AttachEvent(L"WM_XCOMMAND",(FEvent)&XDevEditXOffice::OnXCommand);
+		//获取焦点事件,用于重置工具条
+		AttachEvent(L"WM_SETFOCUS", (FEvent)&XDevEditXOffice::OnSetFocus);
+
+		return 1;
+	}
+
+	/*
+	int  OnRetrieve()
+	{
+		xstring query=L"[xxx]";
+		xml x = new xml;
+		xaserverarg arg = new xaserverarg;
+		arg.AddArg(L"xxx",L"xxx");
+		if (xaserver::ExecXQuery(GetServerUrl(),query,arg.GetString(),x)!=1)
+		{
+			trace(x.GetXmlDoc().text);
+			return -1;
+		}else
+		{
+			dw_list.Retrieve(x);
+			dw_list.Redraw();
+		}
+		return 1;
+	}
+	*/
+
+	int LoadData()
+	{
+		if (!GetWinParam()) return 1;
+
+		m_xdoc = GetControl(L"rpt");
+		xstring content = GetData();
+		if (content != L"")
+		{
+			m_xdoc.LoadTemplate(content,0);
+		}
+		else
+		{
+			KXMLDOMElement pElement;
+			xml x ;
+			auto xdoc = x;
+			xdoc.loadXML(L"<root/>");
+			m_xdoc.LoadTemplate(x,0);
+		}
 
 		return 1;
 	}
 
 	int OnInitial()
 	{
+		SetAgent();
+
 		OnAttachEvent();
 
 		return 1;
@@ -549,12 +179,13 @@
 
 	int onload()
 	{
-		sheet_Count = -1;
-		OnInitial();
+		//dw_list = GetControl(L"dw_list");
+		//dw_list.SetDataObject(GetServerUrl(),L"dev:sheet[xxx.tpl/List]");
 
-		tv_folder = GetControl(L"DevExplorer");
-		mle_output = GetControl(L"output");
-		SetAgent(L"projects");
+		OnInitial();
+		LoadData();
+
+		//OnRetrieve();
 
 		return 1;
 	}

--
Gitblit v1.9.3